From c243e35413218a960f43c8ca67cf2bd44f5d4e50 Mon Sep 17 00:00:00 2001 From: eight Date: Mon, 21 May 2018 12:17:39 +0800 Subject: [PATCH 01/38] WIP: pull out core --- .eslintrc.json | 1 + index.js | 121 +++++------------- lib/conf.js | 26 +--- lib/core/index.js | 87 +++++++++++++ lib/{ => core}/parser.js | 0 lib/core/resource.js | 43 +++++++ lib/core/shortcut.js | 51 ++++++++ lib/core/transformer.js | 26 ++++ lib/{resource.js => default-resources.js} | 50 ++------ lib/{transformer.js => default-transforms.js} | 26 +--- lib/logger.js | 26 ---- lib/shortcut.js | 59 --------- package.json | 2 +- 13 files changed, 253 insertions(+), 265 deletions(-) create mode 100644 lib/core/index.js rename lib/{ => core}/parser.js (100%) create mode 100644 lib/core/resource.js create mode 100644 lib/core/shortcut.js create mode 100644 lib/core/transformer.js rename lib/{resource.js => default-resources.js} (65%) rename lib/{transformer.js => default-transforms.js} (77%) delete mode 100644 lib/logger.js delete mode 100644 lib/shortcut.js diff --git a/.eslintrc.json b/.eslintrc.json index a752f37..1582cc5 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -4,6 +4,7 @@ "node": true }, "rules": { + "no-console": 0, "no-use-before-define": ["error", "nofunc"], "semi": ["error", "always"] }, diff --git a/index.js b/index.js index c3e17d9..511e660 100644 --- a/index.js +++ b/index.js @@ -1,108 +1,45 @@ -const asyncro = require("asyncro"); const fse = require("fs-extra"); const treeify = require("treeify"); -const resource = require("./lib/resource"); -const transformer = require("./lib/transformer"); -const shortcut = require("./lib/shortcut"); -const {parseText, parsePipes} = require("./lib/parser"); -const conf = require("./lib/conf"); -const logger = require("./lib/logger"); +const {DEFAULT_RESOURCES} = require("./lib/default-resources"); +const {DEFAULT_TRANSFORMS} = require("./lib/default-transforms"); +const {findConfig} = require("./lib/conf"); +const {createInliner} = require("./lib/core"); -// async -function inline({source, target, depth = 0, maxDepth = 10, transforms = [], dependency = {}}) { - if (depth > maxDepth) { - throw new Error(`Max recursion depth ${maxDepth} exceeded. If you are not making an infinite loop, try to increase --max-depth limit.`); - } +function init({out, dryRun, maxDepth, file}) { + const inliner = createInliner({maxDepth}); - resource.resolve(source, target); - dependency = dependency[target.args[0]] = {}; + DEFAULT_RESOURCES.forEach(inliner.resource.add); + DEFAULT_TRANSFORMS.forEach(inliner.transformer.add); - return resource.read(source, target) - .then(content => { - if (typeof content !== 'string') { - return content; - } - return doParseText(content); - }) - .then(content => transformer.transform(target, content, transforms)); - - function doParseText(content) { - return asyncro - .map(parseText(content), result => { - if (result.type === "text") { - return result.value; - } - if (result.type == "$inline.shortcut") { - shortcut.add(target, ...result.params); - return ""; - } - let pipes = parsePipes(result.params[0]); - if (shortcut.has(target, pipes[0].name)) { - pipes = parsePipes(shortcut.expand(target, pipes)); - } - const inlineTarget = { - name: pipes[0].args.length ? pipes[0].name : "file", - args: pipes[0].args.length ? pipes[0].args : [pipes[0].name] - }; - return inline({ - source: target, - target: inlineTarget, - depth: depth + 1, - maxDepth, - dependency, - transforms: pipes.slice(1) - }); - }) - .then(text => { - if (text.some(Buffer.isBuffer)) { - return Buffer.concat(text.map(b => { - if (!Buffer.isBuffer(b)) { - b = Buffer.from(b, "binary"); - } - return b; - })); - } - return text.join(""); - }); + const config = findConfig(file); + if (config) { + console.error(`Use config file: ${config.confPath}`); + if (config.resources) { + config.resources.forEach(inliner.resource.add); + } + if (config.transforms) { + config.transforms.forEach(inliner.transformer.add); + } + if (config.shortcuts) { + config.shorcuts.forEach(inliner.globalShortcuts.add); + } } -} - -function init({ - args: { - "--out": out, - "--dry-run": dry, - "--max-depth": maxDepth, - "": file, - } -}) { - if (!dry && !out) { - logger.startDebug(); - } - - logger.log("inline-js started\n"); - - conf.findAndLoad(file); - - const target = { - name: "text", - args: [file] - }; - const dependency = {}; - return inline({target, maxDepth, dependency}).then(content => { - logger.log(`Result inline tree:`); - logger.log(Object.keys(dependency)[0]); - logger.log(treeify.asTree(Object.values(dependency)[0])); + console.error("inline-js started\n"); + return inliner.inline({name: "text", args: [file]}).then(({content, dependency}) => { + console.error(`Result inline tree:`); + console.error(file); + console.error(treeify.asTree(dependency)); - if (dry) { - logger.log(`[dry] Output to ${out || "stdout"}`); + if (dryRun) { + console.error(`[dry] Output to ${out || "stdout"}`); } else if (out) { fse.outputFileSync(out, content); } else { - logger.write(content); + process.stdout.write(content); } }); } -module.exports = {init, inline}; +module.exports = {init}; diff --git a/lib/conf.js b/lib/conf.js index 3291a29..0a88b64 100644 --- a/lib/conf.js +++ b/lib/conf.js @@ -1,24 +1,7 @@ const path = require("path"); const fs = require("fs"); -const resource = require("./resource"); -const transformer = require("./transformer"); -const shortcut = require("./shortcut"); -const logger = require("./logger"); - -function load({resources, transforms, shortcuts}) { - if (resources) { - resources.forEach(resource.add); - } - if (transforms) { - transforms.forEach(transformer.add); - } - if (shortcuts) { - shortcuts.forEach(shortcut.addGlobal); - } -} - -function findAndLoad(file) { +function findConfig(file) { let dir = path.dirname(path.resolve(file)); let confPath; let conf; @@ -42,9 +25,8 @@ function findAndLoad(file) { } while (path.parse(dir).base); if (conf) { - load(conf); - logger.log(`Use config: ${confPath}`); - } + return {conf, confPath}; + } } -module.exports = {findAndLoad, load}; +module.exports = {findConfig}; diff --git a/lib/core/index.js b/lib/core/index.js new file mode 100644 index 0000000..8cc9459 --- /dev/null +++ b/lib/core/index.js @@ -0,0 +1,87 @@ +const {createShortcutExpander} = require("./shortcut"); +const {createResourceLoader} = require("./resource"); +const {createTransformer} = require("./transformer"); + +const {parsePipes, parseText} = require("./parser"); + +function createInliner({maxDepth}) { + const resource = createResourceLoader(); + const transformer = createTransformer(); + const globalShortcuts = createShortcutExpander(); + return { + inline: target => inline({target, depth: 0}), + resource, + transformer, + globalShortcuts + }; + + // async + function inline({source, target, depth}) { + if (depth > maxDepth) { + throw new Error(`Max recursion depth ${maxDepth} exceeded. If you are not making an infinite loop, try to increase --max-depth limit.`); + } + + resource.resolve(source, target); + const dependency = {}; + const shortcuts = globalShortcuts.clone(); + + return resource.read(source, target) + .then(content => { + if (typeof content !== 'string') { + return content; + } + return doParseText(content); + }) + .then(content => ({content, dependency})); + + function inlineDirective(directive) { + let pipes = parsePipes(directive.params[0]); + if (shortcuts.has(pipes[0].name)) { + pipes = parsePipes(shortcuts.expand(pipes)); + } + const inlineTarget = { + name: pipes[0].args.length ? pipes[0].name : "file", + args: pipes[0].args.length ? pipes[0].args : [pipes[0].name] + }; + const transforms = pipes.slice(1); + return inline({ + source: target, + target: inlineTarget, + depth: depth + 1 + }) + .then(({content, subDependency}) => { + dependency[inlineTarget.args[0]] = subDependency; + return transformer.transform(inlineTarget, content, transforms); + }); + } + + function doParseText(content) { + return Promise.all( + parseText(content).map(result => { + if (result.type === "text") { + return result.value; + } + if (result.type == "$inline.shortcut") { + shortcuts.add(...result.params); + return ""; + } + return inlineDirective(result); + }) + ) + .then(contentArr => { + if (contentArr.some(Buffer.isBuffer)) { + return Buffer.concat(contentArr.map(b => { + if (!Buffer.isBuffer(b)) { + b = Buffer.from(b, "binary"); + } + return b; + })); + } + return contentArr.join(""); + }); + } + } + +} + +module.exports = {createInliner}; diff --git a/lib/parser.js b/lib/core/parser.js similarity index 100% rename from lib/parser.js rename to lib/core/parser.js diff --git a/lib/core/resource.js b/lib/core/resource.js new file mode 100644 index 0000000..cbe55c5 --- /dev/null +++ b/lib/core/resource.js @@ -0,0 +1,43 @@ +function createResourceLoader() { + const resources = new Map; + const cache = new Map; + + return { + add, + remove, + read, + resolve + }; + + function add(reader) { + resources.set(reader.name, reader); + } + + function remove(name) { + resources.delete(name); + } + + function read(source, target) { + const reader = resources.get(target.name); + const hash = reader.hash && reader.hash(source, target); + let result; + if (hash && cache.has(hash)) { + result = cache.get(hash); + } else { + result = reader.read(source, target); + if (hash) { + cache.set(hash, result); + } + } + return Promise.resolve(result); + } + + function resolve(source, target) { + const reader = resources.get(target.name); + if (reader.resolve) { + reader.resolve(source, target); + } + } +} + +module.exports = {createResourceLoader}; diff --git a/lib/core/shortcut.js b/lib/core/shortcut.js new file mode 100644 index 0000000..5f1d8af --- /dev/null +++ b/lib/core/shortcut.js @@ -0,0 +1,51 @@ +const {escapePipeValue, pipesToString} = require("./parser"); + +function createShortcutExpander(parent) { + const shortcuts = new Map; + const self = {add, remove, clone, has, expand, lookup}; + return self; + + function add(shortcut) { + shortcuts.set(shortcut.name, shortcut); + } + + function remove(name) { + shortcuts.delete(name); + } + + function clone() { + return createShortcutExpander(self); + } + + function has(name) { + return shortcuts.has(name) || parent && parent.has(name); + } + + function lookup(name) { + return shortcuts.get(name) || parent && parent.lookup(name); + } + + function expand(target, pipes) { + const [shortcut, ...transforms] = pipes; + const expander = lookup(shortcut.name); + let expanded; + if (typeof expander.expand == "function") { + expanded = expander.expand(target, ...shortcut.args); + } else if (typeof expander.expand == "string") { + expanded = expander.expand.replace(/\$(\d+|&)/g, (match, n) => { + if (n == "&") { + return shortcut.args.map(escapePipeValue).join(","); + } + return shortcut.args[n - 1]; + }); + } else { + throw new Error("shortcut.expand must be a string or a function"); + } + if (!transforms.length) { + return expanded; + } + return `${expanded}|${pipesToString(transforms)}`; + } +} + +module.exports = {createShortcutExpander}; diff --git a/lib/core/transformer.js b/lib/core/transformer.js new file mode 100644 index 0000000..39a5191 --- /dev/null +++ b/lib/core/transformer.js @@ -0,0 +1,26 @@ +function createTransformer() { + const transformer = new Map; + return {add, remove, transform}; + + function add(transform) { + transformer.set(transform.name, transform); + } + + function remove(name) { + transformer.delete(name); + } + + function transform(target, content, transforms) { + return transforms.reduce((pending, transform) => { + return pending.then(content => { + return transformer.get(transform.name).transform( + target, + content, + ...transform.args + ); + }); + }, Promise.resolve(content)); + } +} + +module.exports = {createTransformer}; diff --git a/lib/resource.js b/lib/default-resources.js similarity index 65% rename from lib/resource.js rename to lib/default-resources.js index 80f25c9..c95d137 100644 --- a/lib/resource.js +++ b/lib/default-resources.js @@ -6,31 +6,29 @@ const fse = require("fs-extra"); const logger = require("./logger"); -const resources = new Map; -const cache = new Map; - const PATH_LIKE = new Set(["file", "text", "raw"]); -const DEFAULT_READERS = [{ +const DEFAULT_RESOURCES = [{ name: "file", read: readFile, - getSign: getFileSign + hash: getFileSign, + resolve }, { name: "text", read: (...args) => readFile(...args, false), - getSign: getFileSign + hash: getFileSign, + resolve }, { name: "raw", read: (...args) => readFile(...args, true), - getSign: getFileSign + hash: getFileSign, + resolve }, { name: "cmd", read: readCmd, - getSign: getCmdSign + hash: getCmdSign }]; -DEFAULT_READERS.forEach(add); - function getFileSign(source, target) { return JSON.stringify(target); } @@ -76,40 +74,12 @@ function getDir(source) { return path.resolve(isPath(source) ? path.dirname(source.args[0]) : "."); } -function add(reader) { - resources.set(reader.name, reader); -} - -function read(source, target) { - const reader = resources.get(target.name); - const sign = reader.getSign && reader.getSign(source, target); - let pending; - if (sign && cache.has(sign)) { - pending = cache.get(sign); - } else { - pending = reader.read(source, target); - if (sign) { - cache.set(sign, pending); - } - } - if (!pending.then) { - pending = Promise.resolve(pending); - } - return pending; -} - function resolve(source, target) { - if (isPath(target)) { - target.args[0] = path.resolve(getDir(source), target.args[0]); - } + target.args[0] = path.resolve(getDir(source), target.args[0]); } function isPath(source) { return source && PATH_LIKE.has(source.name); } -function has(name) { - return resources.has(name); -} - -module.exports = {add, read, resolve, PATH_LIKE, has}; +module.exports = {DEFAULT_RESOURCES, PATH_LIKE}; diff --git a/lib/transformer.js b/lib/default-transforms.js similarity index 77% rename from lib/transformer.js rename to lib/default-transforms.js index 38f7efb..18c902d 100644 --- a/lib/transformer.js +++ b/lib/default-transforms.js @@ -1,11 +1,9 @@ const vm = require("vm"); -const asyncro = require("asyncro"); const mime = require("mime"); const CleanCSS = require("clean-css"); const resource = require("./resource"); -const transformers = new Map; const cleanCss = new CleanCSS; const DEFAULT_TRANSFORMS = [{ @@ -79,32 +77,10 @@ const DEFAULT_TRANSFORMS = [{ } }]; -DEFAULT_TRANSFORMS.forEach(add); - function getMimeType(source) { return source && resource.PATH_LIKE.has(source.name) && mime.getType(source.args[0]) || "text/plain"; } -function add(transformer) { - transformers.set(transformer.name, transformer); -} - -// async -function transform(source, content, transforms) { - return asyncro.reduce( - transforms, - (content, transform) => { - const transformer = transformers.get(transform.name); - return transformer.transform(source, content, ...transform.args); - }, - content - ); -} - -function has(name) { - return transformers.has(name); -} - -module.exports = {add, transform, has}; +module.exports = {DEFAULT_TRANSFORMS}; diff --git a/lib/logger.js b/lib/logger.js deleted file mode 100644 index c3b3ad5..0000000 --- a/lib/logger.js +++ /dev/null @@ -1,26 +0,0 @@ -const readline = require("readline"); - -let logStream = process.stdout; - -function write(data) { - process.stdout.write(data); -} - -function log(data = "", end = "\n") { - logStream.write(data + end); -} - -function clear() { - readline.clearLine(process.stdout, -1); - readline.cursorTo(process.stdout, 0, null); -} - -function startDebug() { - logStream = process.stderr; -} - -function getLogStream() { - return logStream; -} - -module.exports = {write, log, clear, startDebug, getLogStream}; diff --git a/lib/shortcut.js b/lib/shortcut.js deleted file mode 100644 index 1dd052c..0000000 --- a/lib/shortcut.js +++ /dev/null @@ -1,59 +0,0 @@ -const globalShortcuts = new Map; -const localShortcuts = new Map; - -const {escapePipeValue, pipesToString} = require("./parser"); - -function add(source, name, expand) { - let localMap = localShortcuts.get(source); - if (!localMap) { - localMap = new Map; - localShortcuts.set(source, localMap); - } - localMap.set(name, {name, expand}); -} - -function addGlobal(shortcut) { - globalShortcuts.set(shortcut.name, shortcut); -} - -function expand(source, pipes) { - const shortcut = getShortcut(source, pipes[0].name); - let expanded; - if (typeof shortcut.expand == "function") { - expanded = shortcut.expand(source, ...pipes[0].args); - } else if (typeof shortcut.expand == "string") { - expanded = shortcut.expand.replace(/\$(\d+|&)/g, (match, n) => { - if (n == "&") { - return pipes[0].args.map(escapePipeValue).join(","); - } - return pipes[0].args[n - 1]; - }); - } else { - throw new Error("shortcut.expand must be a string or a function"); - } - if (pipes.length === 1) { - return expanded; - } - return `${expanded}|${pipesToString(pipes.slice(1))}`; -} - -function has(source, name) { - return localShortcuts.has(source) && localShortcuts.get(source).has(name) || - globalShortcuts.has(name); -} - -function remove(source) { - localShortcuts.delete(source); -} - -function getShortcut(file, name) { - if (localShortcuts.has(file) && localShortcuts.get(file).has(name)) { - return localShortcuts.get(file).get(name); - } - if (globalShortcuts.has(name)) { - return globalShortcuts.get(name); - } - return null; -} - -module.exports = {add, addGlobal, expand, remove, has}; diff --git a/package.json b/package.json index 61cfcf3..708a52a 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "author": "eight04 ", "license": "MIT", "scripts": { - "lint": "eslint **/*.js --ignore-pattern !.inline.js --ignore-pattern coverage --cache", + "lint": "eslint **/*.js --ignore-pattern coverage --cache", "mocha": "mocha --require intelli-espower-loader", "mocha-debug": "mocha --require intelli-espower-loader --reporter spec --inspect-brk", "nyc": "nyc --reporter=html npm run mocha", From bea1b3c0e4e440238b420b3310aa592b50b69df0 Mon Sep 17 00:00:00 2001 From: eight Date: Mon, 21 May 2018 12:27:12 +0800 Subject: [PATCH 02/38] WIP: update dependencies --- package-lock.json | 3519 ++++++++++++++++++++++++++------------------- package.json | 17 +- 2 files changed, 2021 insertions(+), 1515 deletions(-) diff --git a/package-lock.json b/package-lock.json index bf0864c..3be3dc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,15 +5,9 @@ "requires": true, "dependencies": { "acorn": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", - "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", - "dev": true - }, - "acorn-es7-plugin": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz", - "integrity": "sha1-8u4fMiipDurRJF+asZIusucdM2s=", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", "dev": true }, "acorn-jsx": { @@ -22,7 +16,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "3.3.0" + "acorn": "^3.0.4" }, "dependencies": { "acorn": { @@ -39,10 +33,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { @@ -51,16 +45,10 @@ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", "dev": true }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, "ansi-regex": { @@ -75,33 +63,21 @@ "dev": true }, "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, - "array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", - "dev": true - }, - "array-find": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz", - "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=", - "dev": true - }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -134,11 +110,6 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "asyncro": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/asyncro/-/asyncro-2.0.1.tgz", - "integrity": "sha1-RBeDwTTQ4TWIr4lL1PjRyDRjDV0=" - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -146,9 +117,9 @@ "dev": true }, "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", "dev": true }, "babel-code-frame": { @@ -157,9 +128,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { "chalk": { @@ -168,11 +139,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "strip-ansi": { @@ -181,21 +152,15 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true } } }, "balanced-match": { - "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "bcrypt-pbkdf": { "version": "1.0.1", @@ -204,7 +169,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "binary-extensions": { @@ -218,16 +183,16 @@ "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "dev": true, "requires": { - "hoek": "4.2.0" + "hoek": "4.x.x" } }, "brace-expansion": { - "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", - "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", - "dev": true, + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "browser-stdout": { @@ -236,22 +201,10 @@ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, - "call-matcher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-1.0.1.tgz", - "integrity": "sha1-UTTQd5hPcSpU2tPL9i3ijc5BbKg=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "deep-equal": "1.0.1", - "espurify": "1.7.0", - "estraverse": "4.2.0" - } - }, - "call-signature": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz", - "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY=", + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", "dev": true }, "caller-path": { @@ -260,7 +213,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsites": { @@ -276,23 +229,32 @@ "dev": true }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "color-convert": "1.9.1" + "has-flag": "^3.0.0" } } } @@ -310,11 +272,11 @@ "dev": true }, "clean-css": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", - "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", "requires": { - "source-map": "0.5.7" + "source-map": "0.5.x" } }, "cli-cursor": { @@ -323,7 +285,7 @@ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" } }, "cli-width": { @@ -344,7 +306,7 @@ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { @@ -354,12 +316,12 @@ "dev": true }, "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -369,33 +331,22 @@ "dev": true }, "concat-map": { - "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -403,24 +354,16 @@ "dev": true }, "coveralls": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.0.tgz", - "integrity": "sha512-ZppXR9y5PraUOrf/DzHJY6gzNUhXYE3b9D43xEXs4QYZ7/Oe0Gy0CS+IPKWFfvQFXB3RG9QduaQUFehzSpGAFw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.1.tgz", + "integrity": "sha512-FAzXwiDOYLGDWH+zgoIA+8GbWv50hlx+kpEJyvzLKOdnIBv9uWoVl4DhqGgyUHpiRjAlF8KYZSipWXYtllWH6Q==", "dev": true, "requires": { - "js-yaml": "3.10.0", - "lcov-parse": "0.0.10", - "log-driver": "1.2.5", - "minimist": "1.2.0", - "request": "2.83.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } + "js-yaml": "^3.6.1", + "lcov-parse": "^0.0.10", + "log-driver": "^1.2.5", + "minimist": "^1.2.0", + "request": "^2.79.0" } }, "crlf": { @@ -429,8 +372,8 @@ "integrity": "sha1-JBcoQbTINSmmqkSJ337tlYsu0W8=", "dev": true, "requires": { - "glub": "1.0.3", - "transform-file": "1.0.1" + "glub": "^1.0.0", + "transform-file": "^1.0.1" } }, "cross-spawn": { @@ -439,9 +382,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "cryptiles": { @@ -450,7 +393,7 @@ "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "dev": true, "requires": { - "boom": "5.2.0" + "boom": "5.x.x" }, "dependencies": { "boom": { @@ -459,27 +402,18 @@ "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "dev": true, "requires": { - "hoek": "4.2.0" + "hoek": "4.x.x" } } } }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.37" - } - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "debug": { @@ -491,41 +425,25 @@ "ms": "2.0.0" } }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" - } - }, "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" } }, "delayed-stream": { @@ -540,27 +458,15 @@ "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", "dev": true }, - "diff-match-patch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.0.tgz", - "integrity": "sha1-HMPIOkkNZ/ldkeOfatHy4Ia2MEg=", - "dev": true - }, "doctrine": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.2.tgz", - "integrity": "sha512-y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "2.0.2" + "esutils": "^2.0.2" } }, - "eastasianwidth": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.1.1.tgz", - "integrity": "sha1-RNZW3p2kFWlEZzNTZfsxR7hXK3w=", - "dev": true - }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", @@ -568,124 +474,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" - } - }, - "empower": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/empower/-/empower-1.2.3.tgz", - "integrity": "sha1-bw2nNEf07dg4/sXGAxOoi6XLhSs=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "empower-core": "0.6.2" - } - }, - "empower-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/empower-assert/-/empower-assert-1.0.1.tgz", - "integrity": "sha1-MeMQq8BluqfDoEh+a+W7zGXzwd4=", - "dev": true, - "requires": { - "estraverse": "4.2.0" - } - }, - "empower-core": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-0.6.2.tgz", - "integrity": "sha1-Wt71ZgiOMfuoC6CjbfR9cJQWkUQ=", - "dev": true, - "requires": { - "call-signature": "0.0.2", - "core-js": "2.5.3" - } - }, - "es5-ext": { - "version": "0.10.37", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", - "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", - "dev": true, - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "escallmatch": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/escallmatch/-/escallmatch-1.5.0.tgz", - "integrity": "sha1-UAmdhugJGwkt+N37w/mm+wWgJNA=", - "dev": true, - "requires": { - "call-matcher": "1.0.1", - "esprima": "2.7.3" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - } + "jsbn": "~0.1.0" } }, "escape-string-regexp": { @@ -694,74 +483,50 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "escodegen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz", - "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==", - "dev": true, - "requires": { - "esprima": "3.1.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.5.7" - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, "eslint": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.14.0.tgz", - "integrity": "sha512-Ul6CSGRjKscEyg0X/EeNs7o2XdnbTEOD1OM8cTjmx85RPcBJQrEhZLevhuJZNAE/vS2iVl5Uhgiqf3h5uLMCJQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", "dev": true, "requires": { - "ajv": "5.5.2", - "babel-code-frame": "6.26.0", - "chalk": "2.3.0", - "concat-stream": "1.6.0", - "cross-spawn": "5.1.0", - "debug": "3.1.0", - "doctrine": "2.0.2", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "1.0.0", - "espree": "3.5.2", - "esquery": "1.0.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "11.1.0", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.0.1", - "js-yaml": "3.10.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "require-uncached": "1.0.3", - "semver": "5.4.1", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", "table": "4.0.2", - "text-table": "0.2.0" + "text-table": "~0.2.0" } }, "eslint-scope": { @@ -770,8 +535,8 @@ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "dev": true, "requires": { - "esrecurse": "4.2.0", - "estraverse": "4.2.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint-visitor-keys": { @@ -780,110 +545,38 @@ "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", "dev": true }, - "espower": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/espower/-/espower-2.1.0.tgz", - "integrity": "sha1-zh7bPZhwKEH99ZbRy46FvcSujkg=", - "dev": true, - "requires": { - "array-find": "1.0.0", - "escallmatch": "1.5.0", - "escodegen": "1.9.0", - "escope": "3.6.0", - "espower-location-detector": "1.0.0", - "espurify": "1.7.0", - "estraverse": "4.2.0", - "source-map": "0.5.7", - "type-name": "2.0.2", - "xtend": "4.0.1" - } - }, - "espower-loader": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/espower-loader/-/espower-loader-1.2.2.tgz", - "integrity": "sha1-7bRsPFmga6yOpzppXIblxaC8gto=", - "dev": true, - "requires": { - "convert-source-map": "1.5.1", - "espower-source": "2.2.0", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "source-map-support": "0.4.18", - "xtend": "4.0.1" - } - }, - "espower-location-detector": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/espower-location-detector/-/espower-location-detector-1.0.0.tgz", - "integrity": "sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU=", - "dev": true, - "requires": { - "is-url": "1.2.2", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "source-map": "0.5.7", - "xtend": "4.0.1" - } - }, - "espower-source": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/espower-source/-/espower-source-2.2.0.tgz", - "integrity": "sha1-fgBSVa5HtcE2RIZEs/PYAtUD91I=", - "dev": true, - "requires": { - "acorn": "5.2.1", - "acorn-es7-plugin": "1.1.7", - "convert-source-map": "1.5.1", - "empower-assert": "1.0.1", - "escodegen": "1.9.0", - "espower": "2.1.0", - "estraverse": "4.2.0", - "merge-estraverse-visitors": "1.0.0", - "multi-stage-sourcemap": "0.2.1", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "xtend": "4.0.1" - } - }, "espree": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", - "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { - "acorn": "5.2.1", - "acorn-jsx": "3.0.1" + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" } }, "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true }, - "espurify": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz", - "integrity": "sha1-HFz2y8zDLm9jk4C9T5kfq5up0iY=", - "dev": true, - "requires": { - "core-js": "2.5.3" - } - }, "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -898,16 +591,6 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37" - } - }, "extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", @@ -915,14 +598,14 @@ "dev": true }, "external-editor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", - "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extsprintf": { @@ -932,9 +615,9 @@ "dev": true }, "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", "dev": true }, "fast-json-stable-stringify": { @@ -955,7 +638,7 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -964,8 +647,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "flat-cache": { @@ -974,18 +657,12 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -993,14 +670,14 @@ "dev": true }, "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" } }, "fs-extra": { @@ -1008,9 +685,9 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "fs.realpath": { @@ -1031,7 +708,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -1040,12 +717,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "3.0.4", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "dependencies": { "balanced-match": { @@ -1055,13 +732,13 @@ "dev": true }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "1.0.0", - "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "minimatch": { @@ -1070,15 +747,15 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } } } }, "globals": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.1.0.tgz", - "integrity": "sha512-uEuWt9mqTlPDwSqi+sHjD4nWU/1N+q0fiWI9T1mZpD2UENqX20CFD5T/ziLZvztPaBKl7ZylUi1q6Qfm7E2CiQ==", + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", + "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", "dev": true }, "globby": { @@ -1087,12 +764,12 @@ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "glub": { @@ -1101,8 +778,8 @@ "integrity": "sha1-VsFkMpiuJQZcYxUAMze7pp0vuGY=", "dev": true, "requires": { - "glob": "5.0.15", - "minimist": "1.2.0" + "glob": "^5.0.5", + "minimist": "^1.1.1" }, "dependencies": { "glob": { @@ -1111,11 +788,11 @@ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, "requires": { - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "minimist": { @@ -1149,8 +826,8 @@ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "has-ansi": { @@ -1159,13 +836,13 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "hawk": { @@ -1174,10 +851,10 @@ "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "dev": true, "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.1.0" + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" } }, "he": { @@ -1187,9 +864,9 @@ "dev": true }, "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", "dev": true }, "http-signature": { @@ -1198,21 +875,24 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } }, "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", "dev": true }, "imurmurhash": { @@ -1221,23 +901,19 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, "inflight": { - "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, @@ -1247,29 +923,20 @@ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.3.0", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.1.0", - "figures": "2.0.0", - "lodash": "4.17.4", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - } - }, - "intelli-espower-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/intelli-espower-loader/-/intelli-espower-loader-1.0.1.tgz", - "integrity": "sha1-LHsDFGvB1GvyENCgOXxckatMorA=", - "dev": true, - "requires": { - "espower-loader": "1.2.2" + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" } }, "is-binary-path": { @@ -1277,7 +944,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.0.0.tgz", "integrity": "sha1-DmHOppdLJN2ovMg2bOWKaSZdGjY=", "requires": { - "binary-extensions": "1.10.0" + "binary-extensions": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -1293,12 +960,12 @@ "dev": true }, "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { - "is-path-inside": "1.0.1" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -1307,7 +974,7 @@ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-promise": { @@ -1317,9 +984,9 @@ "dev": true }, "is-resolvable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.1.tgz", - "integrity": "sha512-y5CXYbzvB3jTnWAZH1Nl7ykUWb6T3BcTs56HUruwBf8MhF56n1HWqhDWnVFo8GHrUPDgvUUNVhrc2U8W7iqz5g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, "is-typedarray": { @@ -1328,12 +995,6 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-url": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.2.tgz", - "integrity": "sha1-SYkFpZO/R8wtnn9zg3K792lsfyY=", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -1358,21 +1019,13 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - } + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "jsbn": { @@ -1411,7 +1064,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsprim": { @@ -1438,79 +1091,71 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, "log-driver": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", - "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "merge-estraverse-visitors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/merge-estraverse-visitors/-/merge-estraverse-visitors-1.0.0.tgz", - "integrity": "sha1-65aDOLXe1c7tgs7AMH3sui2OqZQ=", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "dev": true, "requires": { - "estraverse": "4.2.0" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "mime": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.1.0.tgz", - "integrity": "sha512-jPEuocEVyg24I7hWcF6EL5qH0OQ3Ficy95tXA9eNBN6qXsIopYi/CJl3ldTUR+Sljt2rP2SkWpeTcAMon/pjKA==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==" }, "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", "dev": true }, "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { - "mime-db": "1.30.0" + "mime-db": "~1.33.0" } }, "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "minimatch": { - "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "dev": true, "requires": { - "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz" + "brace-expansion": "^1.0.0" } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, "mkdirp": { @@ -1520,12 +1165,20 @@ "dev": true, "requires": { "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } } }, "mocha": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.0.1.tgz", - "integrity": "sha512-evDmhkoA+cBNiQQQdSKZa2b9+W2mpLoj50367lhy+Klnx9OV8XlCIhigUnn1gaTFLQCa0kdNhEGDr0hCXOQFDw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", "dev": true, "requires": { "browser-stdout": "1.3.0", @@ -1538,34 +1191,31 @@ "he": "1.1.1", "mkdirp": "0.5.1", "supports-color": "4.4.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multi-stage-sourcemap": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/multi-stage-sourcemap/-/multi-stage-sourcemap-0.2.1.tgz", - "integrity": "sha1-sJ/IWG6qF/gdV1xK0C4Pej9rEQU=", - "dev": true, - "requires": { - "source-map": "0.1.43" }, "dependencies": { - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "dev": true, "requires": { - "amdefine": "1.0.1" + "has-flag": "^2.0.0" } } } }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -1583,42 +1233,42 @@ "resolved": "https://registry.npmjs.org/neodoc/-/neodoc-1.4.0.tgz", "integrity": "sha1-Uwyph33gcp/9XWQg+1KxBPCIjQU=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "nyc": { - "version": "11.4.1", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.4.1.tgz", - "integrity": "sha512-5eCZpvaksFVjP2rt1r60cfXmt3MUtsQDw8bAzNqNEr4WLvUMLgiVENMf/B9bE9YAX0mGVvaGA3v9IS9ekNqB1Q==", - "dev": true, - "requires": { - "archy": "1.0.0", - "arrify": "1.0.1", - "caching-transform": "1.0.1", - "convert-source-map": "1.5.1", - "debug-log": "1.0.1", - "default-require-extensions": "1.0.0", - "find-cache-dir": "0.1.1", - "find-up": "2.1.0", - "foreground-child": "1.5.6", - "glob": "7.1.2", - "istanbul-lib-coverage": "1.1.1", - "istanbul-lib-hook": "1.1.0", - "istanbul-lib-instrument": "1.9.1", - "istanbul-lib-report": "1.1.2", - "istanbul-lib-source-maps": "1.2.2", - "istanbul-reports": "1.1.3", - "md5-hex": "1.3.0", - "merge-source-map": "1.0.4", - "micromatch": "2.3.11", - "mkdirp": "0.5.1", - "resolve-from": "2.0.0", - "rimraf": "2.6.2", - "signal-exit": "3.0.2", - "spawn-wrap": "1.4.2", - "test-exclude": "4.1.1", - "yargs": "10.0.3", - "yargs-parser": "8.0.0" + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.8.0.tgz", + "integrity": "sha512-PUFq1PSsx5OinSk5g5aaZygcDdI3QQT5XUlbR9QRMihtMS6w0Gm8xj4BxmKeeAlpQXC5M2DIhH16Y+KejceivQ==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "arrify": "^1.0.1", + "caching-transform": "^1.0.0", + "convert-source-map": "^1.5.1", + "debug-log": "^1.0.1", + "default-require-extensions": "^1.0.0", + "find-cache-dir": "^0.1.1", + "find-up": "^2.1.0", + "foreground-child": "^1.5.3", + "glob": "^7.0.6", + "istanbul-lib-coverage": "^1.1.2", + "istanbul-lib-hook": "^1.1.0", + "istanbul-lib-instrument": "^1.10.0", + "istanbul-lib-report": "^1.1.3", + "istanbul-lib-source-maps": "^1.2.3", + "istanbul-reports": "^1.4.0", + "md5-hex": "^1.2.0", + "merge-source-map": "^1.1.0", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.0", + "resolve-from": "^2.0.0", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.1", + "spawn-wrap": "^1.4.2", + "test-exclude": "^4.2.0", + "yargs": "11.1.0", + "yargs-parser": "^8.0.0" }, "dependencies": { "align-text": { @@ -1626,9 +1276,9 @@ "bundled": true, "dev": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "amdefine": { @@ -1651,7 +1301,7 @@ "bundled": true, "dev": true, "requires": { - "default-require-extensions": "1.0.0" + "default-require-extensions": "^1.0.0" } }, "archy": { @@ -1660,20 +1310,22 @@ "dev": true }, "arr-diff": { - "version": "2.0.0", + "version": "4.0.0", "bundled": true, - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } + "dev": true }, "arr-flatten": { "version": "1.1.0", "bundled": true, "dev": true }, - "array-unique": { - "version": "0.2.1", + "arr-union": { + "version": "3.1.0", + "bundled": true, + "dev": true + }, + "array-unique": { + "version": "0.3.2", "bundled": true, "dev": true }, @@ -1682,34 +1334,44 @@ "bundled": true, "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, "async": { "version": "1.5.2", "bundled": true, "dev": true }, + "atob": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, "babel-code-frame": { "version": "6.26.0", "bundled": true, "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-generator": { - "version": "6.26.0", + "version": "6.26.1", "bundled": true, "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" } }, "babel-messages": { @@ -1717,7 +1379,7 @@ "bundled": true, "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-runtime": { @@ -1725,8 +1387,8 @@ "bundled": true, "dev": true, "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -1734,11 +1396,11 @@ "bundled": true, "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -1746,15 +1408,15 @@ "bundled": true, "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" } }, "babel-types": { @@ -1762,10 +1424,10 @@ "bundled": true, "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -1778,23 +1440,100 @@ "bundled": true, "dev": true }, + "base": { + "version": "0.11.2", + "bundled": true, + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } + } + }, "brace-expansion": { - "version": "1.1.8", + "version": "1.1.11", "bundled": true, "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "braces": { - "version": "1.8.5", + "version": "2.3.2", "bundled": true, "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "builtin-modules": { @@ -1802,14 +1541,37 @@ "bundled": true, "dev": true }, + "cache-base": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, "caching-transform": { "version": "1.0.1", "bundled": true, "dev": true, "requires": { - "md5-hex": "1.3.0", - "mkdirp": "0.5.1", - "write-file-atomic": "1.3.4" + "md5-hex": "^1.2.0", + "mkdirp": "^0.5.1", + "write-file-atomic": "^1.1.4" } }, "camelcase": { @@ -1824,8 +1586,8 @@ "dev": true, "optional": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chalk": { @@ -1833,11 +1595,37 @@ "bundled": true, "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "class-utils": { + "version": "0.3.6", + "bundled": true, + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } } }, "cliui": { @@ -1846,8 +1634,8 @@ "dev": true, "optional": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" }, "dependencies": { @@ -1864,11 +1652,25 @@ "bundled": true, "dev": true }, + "collection-visit": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, "commondir": { "version": "1.0.1", "bundled": true, "dev": true }, + "component-emitter": { + "version": "1.2.1", + "bundled": true, + "dev": true + }, "concat-map": { "version": "0.0.1", "bundled": true, @@ -1879,8 +1681,13 @@ "bundled": true, "dev": true }, + "copy-descriptor": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, "core-js": { - "version": "2.5.3", + "version": "2.5.6", "bundled": true, "dev": true }, @@ -1889,8 +1696,8 @@ "bundled": true, "dev": true, "requires": { - "lru-cache": "4.1.1", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "which": "^1.2.9" } }, "debug": { @@ -1911,12 +1718,64 @@ "bundled": true, "dev": true }, + "decode-uri-component": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, "default-require-extensions": { "version": "1.0.0", "bundled": true, "dev": true, "requires": { - "strip-bom": "2.0.0" + "strip-bom": "^2.0.0" + } + }, + "define-property": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } } }, "detect-indent": { @@ -1924,7 +1783,7 @@ "bundled": true, "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "error-ex": { @@ -1932,7 +1791,7 @@ "bundled": true, "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "escape-string-regexp": { @@ -1950,13 +1809,13 @@ "bundled": true, "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, "dependencies": { "cross-spawn": { @@ -1964,52 +1823,147 @@ "bundled": true, "dev": true, "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } } } }, "expand-brackets": { - "version": "0.1.5", + "version": "2.1.4", "bundled": true, "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "expand-range": { - "version": "1.8.2", + "extend-shallow": { + "version": "3.0.2", "bundled": true, "dev": true, "requires": { - "fill-range": "2.2.3" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "extglob": { - "version": "0.3.2", + "version": "2.0.4", "bundled": true, "dev": true, "requires": { - "is-extglob": "1.0.0" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } } }, - "filename-regex": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, "fill-range": { - "version": "2.2.3", + "version": "4.0.0", "bundled": true, "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "find-cache-dir": { @@ -2017,9 +1971,9 @@ "bundled": true, "dev": true, "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" } }, "find-up": { @@ -2027,7 +1981,7 @@ "bundled": true, "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "for-in": { @@ -2035,21 +1989,21 @@ "bundled": true, "dev": true }, - "for-own": { - "version": "0.1.5", + "foreground-child": { + "version": "1.5.6", "bundled": true, "dev": true, "requires": { - "for-in": "1.0.2" + "cross-spawn": "^4", + "signal-exit": "^3.0.0" } }, - "foreground-child": { - "version": "1.5.6", + "fragment-cache": { + "version": "0.2.1", "bundled": true, "dev": true, "requires": { - "cross-spawn": "4.0.2", - "signal-exit": "3.0.2" + "map-cache": "^0.2.2" } }, "fs.realpath": { @@ -2067,34 +2021,22 @@ "bundled": true, "dev": true }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", + "get-value": { + "version": "2.0.6", "bundled": true, - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } + "dev": true }, - "glob-parent": { - "version": "2.0.0", + "glob": { + "version": "7.1.2", "bundled": true, "dev": true, "requires": { - "is-glob": "2.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "globals": { @@ -2112,10 +2054,10 @@ "bundled": true, "dev": true, "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" }, "dependencies": { "source-map": { @@ -2123,7 +2065,7 @@ "bundled": true, "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -2133,7 +2075,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -2141,126 +2083,204 @@ "bundled": true, "dev": true }, - "hosted-git-info": { - "version": "2.5.0", - "bundled": true, - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", + "has-value": { + "version": "1.0.0", "bundled": true, "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } } }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "invariant": { - "version": "2.2.2", + "has-values": { + "version": "1.0.0", "bundled": true, "dev": true, "requires": { - "loose-envify": "1.3.1" - } - }, - "invert-kv": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "bundled": true, + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hosted-git-info": { + "version": "2.6.0", + "bundled": true, "dev": true }, - "is-builtin-module": { - "version": "1.0.0", + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", "bundled": true, "dev": true, "requires": { - "builtin-modules": "1.1.1" + "once": "^1.3.0", + "wrappy": "1" } }, - "is-dotfile": { - "version": "1.0.3", + "inherits": { + "version": "2.0.3", "bundled": true, "dev": true }, - "is-equal-shallow": { - "version": "0.1.3", + "invariant": { + "version": "2.2.4", "bundled": true, "dev": true, "requires": { - "is-primitive": "2.0.0" + "loose-envify": "^1.0.0" } }, - "is-extendable": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "is-extglob": { + "invert-kv": { "version": "1.0.0", "bundled": true, "dev": true }, - "is-finite": { - "version": "1.0.2", + "is-accessor-descriptor": { + "version": "0.1.6", "bundled": true, "dev": true, "requires": { - "number-is-nan": "1.0.1" + "kind-of": "^3.0.2" } }, - "is-fullwidth-code-point": { + "is-arrayish": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "is-builtin-module": { "version": "1.0.0", "bundled": true, "dev": true, "requires": { - "number-is-nan": "1.0.1" + "builtin-modules": "^1.0.0" } }, - "is-glob": { - "version": "2.0.1", + "is-data-descriptor": { + "version": "0.1.4", "bundled": true, "dev": true, "requires": { - "is-extglob": "1.0.0" + "kind-of": "^3.0.2" } }, - "is-number": { - "version": "2.1.0", + "is-descriptor": { + "version": "0.1.6", "bundled": true, "dev": true, "requires": { - "kind-of": "3.2.2" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "bundled": true, + "dev": true + } } }, - "is-posix-bracket": { + "is-extendable": { "version": "0.1.1", "bundled": true, "dev": true }, - "is-primitive": { + "is-finite": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { "version": "2.0.0", "bundled": true, "dev": true }, + "is-number": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-odd": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "bundled": true, + "dev": true + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, "is-stream": { "version": "1.1.0", "bundled": true, @@ -2271,6 +2291,11 @@ "bundled": true, "dev": true }, + "is-windows": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, "isarray": { "version": "1.0.0", "bundled": true, @@ -2282,15 +2307,12 @@ "dev": true }, "isobject": { - "version": "2.1.0", + "version": "3.0.1", "bundled": true, - "dev": true, - "requires": { - "isarray": "1.0.0" - } + "dev": true }, "istanbul-lib-coverage": { - "version": "1.1.1", + "version": "1.2.0", "bundled": true, "dev": true }, @@ -2299,32 +2321,32 @@ "bundled": true, "dev": true, "requires": { - "append-transform": "0.4.0" + "append-transform": "^0.4.0" } }, "istanbul-lib-instrument": { - "version": "1.9.1", + "version": "1.10.1", "bundled": true, "dev": true, "requires": { - "babel-generator": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.1.1", - "semver": "5.4.1" + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.0", + "semver": "^5.3.0" } }, "istanbul-lib-report": { - "version": "1.1.2", + "version": "1.1.3", "bundled": true, "dev": true, "requires": { - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" + "istanbul-lib-coverage": "^1.1.2", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" }, "dependencies": { "supports-color": { @@ -2332,21 +2354,21 @@ "bundled": true, "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "istanbul-lib-source-maps": { - "version": "1.2.2", + "version": "1.2.3", "bundled": true, "dev": true, "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.1.2", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" }, "dependencies": { "debug": { @@ -2360,11 +2382,11 @@ } }, "istanbul-reports": { - "version": "1.1.3", + "version": "1.4.0", "bundled": true, "dev": true, "requires": { - "handlebars": "4.0.11" + "handlebars": "^4.0.3" } }, "js-tokens": { @@ -2382,7 +2404,7 @@ "bundled": true, "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "lazy-cache": { @@ -2396,7 +2418,7 @@ "bundled": true, "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "load-json-file": { @@ -2404,11 +2426,11 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "locate-path": { @@ -2416,8 +2438,8 @@ "bundled": true, "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "dependencies": { "path-exists": { @@ -2428,7 +2450,7 @@ } }, "lodash": { - "version": "4.17.4", + "version": "4.17.10", "bundled": true, "dev": true }, @@ -2442,16 +2464,29 @@ "bundled": true, "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "lru-cache": { - "version": "4.1.1", + "version": "4.1.3", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "map-cache": { + "version": "0.2.2", + "bundled": true, + "dev": true + }, + "map-visit": { + "version": "1.0.0", "bundled": true, "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "object-visit": "^1.0.0" } }, "md5-hex": { @@ -2459,7 +2494,7 @@ "bundled": true, "dev": true, "requires": { - "md5-o-matic": "0.1.1" + "md5-o-matic": "^0.1.1" } }, "md5-o-matic": { @@ -2472,39 +2507,53 @@ "bundled": true, "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "^1.0.0" } }, "merge-source-map": { - "version": "1.0.4", + "version": "1.1.0", "bundled": true, "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + } } }, "micromatch": { - "version": "2.3.11", + "version": "3.1.10", "bundled": true, "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } } }, "mimic-fn": { - "version": "1.1.0", + "version": "1.2.0", "bundled": true, "dev": true }, @@ -2513,7 +2562,7 @@ "bundled": true, "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -2521,6 +2570,25 @@ "bundled": true, "dev": true }, + "mixin-deep": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "mkdirp": { "version": "0.5.1", "bundled": true, @@ -2534,23 +2602,51 @@ "bundled": true, "dev": true }, - "normalize-package-data": { - "version": "2.4.0", + "nanomatch": { + "version": "1.2.9", "bundled": true, "dev": true, "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } } }, - "normalize-path": { - "version": "2.1.1", + "normalize-package-data": { + "version": "2.4.0", "bundled": true, "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "npm-run-path": { @@ -2558,7 +2654,7 @@ "bundled": true, "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "number-is-nan": { @@ -2571,13 +2667,54 @@ "bundled": true, "dev": true }, - "object.omit": { - "version": "2.0.1", + "object-copy": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "object.pick": { + "version": "1.3.0", "bundled": true, "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } } }, "once": { @@ -2585,7 +2722,7 @@ "bundled": true, "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "optimist": { @@ -2593,8 +2730,8 @@ "bundled": true, "dev": true, "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" } }, "os-homedir": { @@ -2607,9 +2744,9 @@ "bundled": true, "dev": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "p-finally": { @@ -2618,43 +2755,45 @@ "dev": true }, "p-limit": { - "version": "1.1.0", + "version": "1.2.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "p-try": "^1.0.0" + } }, "p-locate": { "version": "2.0.0", "bundled": true, "dev": true, "requires": { - "p-limit": "1.1.0" + "p-limit": "^1.1.0" } }, - "parse-glob": { - "version": "3.0.4", + "p-try": { + "version": "1.0.0", "bundled": true, - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } + "dev": true }, "parse-json": { "version": "2.2.0", "bundled": true, "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, + "pascalcase": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, "path-exists": { "version": "2.1.0", "bundled": true, "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -2677,9 +2816,9 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pify": { @@ -2697,7 +2836,7 @@ "bundled": true, "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -2705,7 +2844,7 @@ "bundled": true, "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" }, "dependencies": { "find-up": { @@ -2713,14 +2852,14 @@ "bundled": true, "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } } } }, - "preserve": { - "version": "0.2.0", + "posix-character-classes": { + "version": "0.1.1", "bundled": true, "dev": true }, @@ -2729,69 +2868,32 @@ "bundled": true, "dev": true }, - "randomatic": { - "version": "1.1.7", + "read-pkg": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", "bundled": true, "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" }, "dependencies": { - "is-number": { - "version": "3.0.0", + "find-up": { + "version": "1.1.2", "bundled": true, "dev": true, "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "read-pkg": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } } } @@ -2801,19 +2903,15 @@ "bundled": true, "dev": true }, - "regex-cache": { - "version": "0.4.4", + "regex-not": { + "version": "1.0.2", "bundled": true, "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, - "remove-trailing-separator": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, "repeat-element": { "version": "1.1.2", "bundled": true, @@ -2829,7 +2927,7 @@ "bundled": true, "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "require-directory": { @@ -2847,13 +2945,23 @@ "bundled": true, "dev": true }, + "resolve-url": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "ret": { + "version": "0.1.15", + "bundled": true, + "dev": true + }, "right-align": { "version": "0.1.3", "bundled": true, "dev": true, "optional": true, "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { @@ -2861,11 +2969,19 @@ "bundled": true, "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" + } + }, + "safe-regex": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "ret": "~0.1.10" } }, "semver": { - "version": "5.4.1", + "version": "5.5.0", "bundled": true, "dev": true }, @@ -2874,12 +2990,33 @@ "bundled": true, "dev": true }, + "set-value": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "shebang-command": { "version": "1.2.0", "bundled": true, "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -2897,49 +3034,200 @@ "bundled": true, "dev": true }, + "snapdragon": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, "source-map": { "version": "0.5.7", "bundled": true, "dev": true }, + "source-map-resolve": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "atob": "^2.0.0", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, "spawn-wrap": { "version": "1.4.2", "bundled": true, "dev": true, "requires": { - "foreground-child": "1.5.6", - "mkdirp": "0.5.1", - "os-homedir": "1.0.2", - "rimraf": "2.6.2", - "signal-exit": "3.0.2", - "which": "1.3.0" + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" } }, "spdx-correct": { - "version": "1.0.2", + "version": "3.0.0", "bundled": true, "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "spdx-expression-parse": { - "version": "1.0.4", + "spdx-exceptions": { + "version": "2.1.0", "bundled": true, "dev": true }, + "spdx-expression-parse": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "spdx-license-ids": { - "version": "1.2.2", + "version": "3.0.0", "bundled": true, "dev": true }, + "split-string": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "static-extend": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "string-width": { "version": "2.1.1", "bundled": true, "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { @@ -2947,64 +3235,347 @@ "bundled": true, "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "test-exclude": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^3.1.8", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "braces": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "bundled": true, + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "6.0.2", "bundled": true, "dev": true }, - "strip-ansi": { - "version": "4.0.0", + "micromatch": { + "version": "3.1.10", "bundled": true, "dev": true, "requires": { - "ansi-regex": "3.0.0" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } } } }, - "strip-ansi": { - "version": "3.0.1", + "to-fast-properties": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "to-object-path": { + "version": "0.3.0", "bundled": true, "dev": true, "requires": { - "ansi-regex": "2.1.1" + "kind-of": "^3.0.2" } }, - "strip-bom": { - "version": "2.0.0", + "to-regex": { + "version": "3.0.2", "bundled": true, "dev": true, "requires": { - "is-utf8": "0.2.1" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, - "strip-eof": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "test-exclude": { - "version": "4.1.1", + "to-regex-range": { + "version": "2.1.1", "bundled": true, "dev": true, "requires": { - "arrify": "1.0.1", - "micromatch": "2.3.11", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } } }, - "to-fast-properties": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, "trim-right": { "version": "1.0.1", "bundled": true, @@ -3016,9 +3587,9 @@ "dev": true, "optional": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "yargs": { @@ -3027,9 +3598,9 @@ "dev": true, "optional": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -3041,13 +3612,106 @@ "dev": true, "optional": true }, + "union-value": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "bundled": true, + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unset-value": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "bundled": true, + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "isobject": { + "version": "3.0.1", + "bundled": true, + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "bundled": true, + "dev": true + }, + "use": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "bundled": true, + "dev": true + } + } + }, "validate-npm-package-license": { - "version": "3.0.1", + "version": "3.0.3", "bundled": true, "dev": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "which": { @@ -3055,7 +3719,7 @@ "bundled": true, "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -3079,18 +3743,26 @@ "bundled": true, "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, "string-width": { "version": "1.0.2", "bundled": true, "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -3105,9 +3777,9 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" } }, "y18n": { @@ -3121,54 +3793,68 @@ "dev": true }, "yargs": { - "version": "10.0.3", - "bundled": true, - "dev": true, - "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "8.0.0" + "version": "11.1.0", + "bundled": true, + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, "cliui": { - "version": "3.2.0", + "version": "4.1.0", "bundled": true, "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "yargs-parser": { + "version": "9.0.2", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "^4.1.0" } } } }, "yargs-parser": { - "version": "8.0.0", + "version": "8.1.0", "bundled": true, "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { @@ -3192,18 +3878,13 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true - }, "once": { - "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "wrappy": "1" } }, "onetime": { @@ -3212,7 +3893,7 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "^1.0.0" } }, "optionator": { @@ -3221,12 +3902,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, "os-tmpdir": { @@ -3236,7 +3917,8 @@ "dev": true }, "path-is-absolute": { - "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, @@ -3270,7 +3952,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pluralize": { @@ -3279,134 +3961,6 @@ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, - "power-assert": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/power-assert/-/power-assert-1.4.4.tgz", - "integrity": "sha1-kpXqdDcZb1pgH95CDwQmMRhtdRc=", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "empower": "1.2.3", - "power-assert-formatter": "1.4.1", - "universal-deep-strict-equal": "1.2.2", - "xtend": "4.0.1" - } - }, - "power-assert-context-formatter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-context-formatter/-/power-assert-context-formatter-1.1.1.tgz", - "integrity": "sha1-7bo1LT7YpgMRTWZyZazOYNaJzN8=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "power-assert-context-traversal": "1.1.1" - } - }, - "power-assert-context-reducer-ast": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/power-assert-context-reducer-ast/-/power-assert-context-reducer-ast-1.1.2.tgz", - "integrity": "sha1-SEqZ4m9Jc/+IMuXFzHVnAuYJQXQ=", - "dev": true, - "requires": { - "acorn": "4.0.13", - "acorn-es7-plugin": "1.1.7", - "core-js": "2.5.3", - "espurify": "1.7.0", - "estraverse": "4.2.0" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "power-assert-context-traversal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-context-traversal/-/power-assert-context-traversal-1.1.1.tgz", - "integrity": "sha1-iMq8oNE7Y1nwfT0+ivppkmRXftk=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "estraverse": "4.2.0" - } - }, - "power-assert-formatter": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/power-assert-formatter/-/power-assert-formatter-1.4.1.tgz", - "integrity": "sha1-XcEl7VCj37HdomwZNH879Y7CiEo=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "power-assert-context-formatter": "1.1.1", - "power-assert-context-reducer-ast": "1.1.2", - "power-assert-renderer-assertion": "1.1.1", - "power-assert-renderer-comparison": "1.1.1", - "power-assert-renderer-diagram": "1.1.2", - "power-assert-renderer-file": "1.1.1" - } - }, - "power-assert-renderer-assertion": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-renderer-assertion/-/power-assert-renderer-assertion-1.1.1.tgz", - "integrity": "sha1-y/wOd+AIao+Wrz8djme57n4ozpg=", - "dev": true, - "requires": { - "power-assert-renderer-base": "1.1.1", - "power-assert-util-string-width": "1.1.1" - } - }, - "power-assert-renderer-base": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-renderer-base/-/power-assert-renderer-base-1.1.1.tgz", - "integrity": "sha1-lqZQxv0F7hvB9mtUrWFELIs/Y+s=", - "dev": true - }, - "power-assert-renderer-comparison": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-renderer-comparison/-/power-assert-renderer-comparison-1.1.1.tgz", - "integrity": "sha1-10Odl9hRVr5OMKAPL7WnJRTOPAg=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "diff-match-patch": "1.0.0", - "power-assert-renderer-base": "1.1.1", - "stringifier": "1.3.0", - "type-name": "2.0.2" - } - }, - "power-assert-renderer-diagram": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/power-assert-renderer-diagram/-/power-assert-renderer-diagram-1.1.2.tgz", - "integrity": "sha1-ZV+PcRk1qbbVQbhjJ2VHF8Y3qYY=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "power-assert-renderer-base": "1.1.1", - "power-assert-util-string-width": "1.1.1", - "stringifier": "1.3.0" - } - }, - "power-assert-renderer-file": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-renderer-file/-/power-assert-renderer-file-1.1.1.tgz", - "integrity": "sha1-o34rvReMys0E5427eckv40kzxec=", - "dev": true, - "requires": { - "power-assert-renderer-base": "1.1.1" - } - }, - "power-assert-util-string-width": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/power-assert-util-string-width/-/power-assert-util-string-width-1.1.1.tgz", - "integrity": "sha1-vmWet5N/3S5smncmjar2S9W3xZI=", - "dev": true, - "requires": { - "eastasianwidth": "0.1.1" - } - }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -3414,9 +3968,9 @@ "dev": true }, "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "progress": { @@ -3438,54 +3992,59 @@ "dev": true }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", - "dev": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" + "version": "2.86.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.86.0.tgz", + "integrity": "sha512-BQZih67o9r+Ys94tcIW4S7Uu8pthjrQVxhsZ/weOwHbDfACxvIyvnAbzFQxjy1jMtvFSzv5zf4my6cZsJBbVzw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" } }, "require-uncached": { @@ -3494,8 +4053,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" } }, "resolve-from": { @@ -3510,8 +4069,8 @@ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "rimraf": { @@ -3520,7 +4079,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "run-async": { @@ -3529,7 +4088,7 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "rx-lite": { @@ -3544,19 +4103,25 @@ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "dev": true, "requires": { - "rx-lite": "4.0.8" + "rx-lite": "*" } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, "shebang-command": { @@ -3565,7 +4130,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -3586,7 +4151,7 @@ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0" + "is-fullwidth-code-point": "^2.0.0" } }, "sntp": { @@ -3595,7 +4160,7 @@ "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "dev": true, "requires": { - "hoek": "4.2.0" + "hoek": "4.x.x" } }, "source-map": { @@ -3603,15 +4168,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -3619,28 +4175,19 @@ "dev": true }, "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" } }, "string-width": { @@ -3649,34 +4196,26 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, - "stringifier": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/stringifier/-/stringifier-1.3.0.tgz", - "integrity": "sha1-3vGDQvaTPbDy2/yaoCF1tEjBeVk=", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "core-js": "2.5.3", - "traverse": "0.6.6", - "type-name": "2.0.2" + "safe-buffer": "~5.1.0" } }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" }, "dependencies": { "ansi-regex": { @@ -3694,13 +4233,10 @@ "dev": true }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true }, "table": { "version": "4.0.2", @@ -3708,12 +4244,12 @@ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "chalk": "2.3.0", - "lodash": "4.17.4", + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", "slice-ansi": "1.0.0", - "string-width": "2.1.1" + "string-width": "^2.1.1" } }, "text-table": { @@ -3734,16 +4270,16 @@ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "transform-file": { @@ -3752,18 +4288,13 @@ "integrity": "sha1-f5WYSs0j1Ov4q7R+6dg74WbRJoc=", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "^1.0.0" } }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", - "dev": true - }, "treeify": { - "version": "https://registry.npmjs.org/treeify/-/treeify-1.0.1.tgz", - "integrity": "sha1-abPNAiAioWhCTnz6HO1EyTnT6y8=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", + "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==" }, "tunnel-agent": { "version": "0.6.0", @@ -3771,7 +4302,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -3787,32 +4318,15 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, - "type-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz", - "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=", - "dev": true - }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "universal-deep-strict-equal": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/universal-deep-strict-equal/-/universal-deep-strict-equal-1.2.2.tgz", - "integrity": "sha1-DaSsL3PP95JMgfpN4BjKViyisKc=", - "dev": true, - "requires": { - "array-filter": "1.0.0", - "indexof": "0.0.1", - "object-keys": "1.0.11" - } - }, "universalify": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", @@ -3825,9 +4339,9 @@ "dev": true }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", "dev": true }, "verror": { @@ -3836,9 +4350,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "which": { @@ -3847,7 +4361,7 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "wordwrap": { @@ -3857,7 +4371,8 @@ "dev": true }, "wrappy": { - "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, @@ -3867,15 +4382,9 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", diff --git a/package.json b/package.json index 708a52a..6f493ae 100644 --- a/package.json +++ b/package.json @@ -22,23 +22,20 @@ }, "main": "index.js", "dependencies": { - "asyncro": "^2.0.1", - "clean-css": "^4.1.9", + "clean-css": "^4.1.11", "fs-extra": "^5.0.0", "is-binary-path": "^2.0.0", "js-tokens": "^3.0.1", - "mime": "^2.1.0", + "mime": "^2.3.1", "neodoc": "^1.4.0", - "treeify": "^1.0.1" + "treeify": "^1.1.0" }, "devDependencies": { - "coveralls": "^3.0.0", + "coveralls": "^3.0.1", "crlf": "^1.1.1", - "eslint": "^4.14.0", - "intelli-espower-loader": "^1.0.1", - "mocha": "^4.0.1", - "nyc": "^11.4.1", - "power-assert": "^1.4.4" + "eslint": "^4.19.1", + "mocha": "^4.1.0", + "nyc": "^11.8.0" }, "repository": "eight04/inline-js" } From 4b93eaa3c56568c2e436b2a096fe6b166c45f777 Mon Sep 17 00:00:00 2001 From: eight Date: Mon, 21 May 2018 18:41:19 +0800 Subject: [PATCH 03/38] WIP: pull out inline-js-core --- index.js | 2 +- lib/core/index.js | 87 ------------- lib/core/parser.js | 265 ---------------------------------------- lib/core/resource.js | 43 ------- lib/core/shortcut.js | 51 -------- lib/core/transformer.js | 26 ---- test/test.js | 148 ---------------------- 7 files changed, 1 insertion(+), 621 deletions(-) delete mode 100644 lib/core/index.js delete mode 100644 lib/core/parser.js delete mode 100644 lib/core/resource.js delete mode 100644 lib/core/shortcut.js delete mode 100644 lib/core/transformer.js diff --git a/index.js b/index.js index 511e660..f32399d 100644 --- a/index.js +++ b/index.js @@ -1,10 +1,10 @@ const fse = require("fs-extra"); const treeify = require("treeify"); +const {createInliner} = require("inline-js-core"); const {DEFAULT_RESOURCES} = require("./lib/default-resources"); const {DEFAULT_TRANSFORMS} = require("./lib/default-transforms"); const {findConfig} = require("./lib/conf"); -const {createInliner} = require("./lib/core"); function init({out, dryRun, maxDepth, file}) { const inliner = createInliner({maxDepth}); diff --git a/lib/core/index.js b/lib/core/index.js deleted file mode 100644 index 8cc9459..0000000 --- a/lib/core/index.js +++ /dev/null @@ -1,87 +0,0 @@ -const {createShortcutExpander} = require("./shortcut"); -const {createResourceLoader} = require("./resource"); -const {createTransformer} = require("./transformer"); - -const {parsePipes, parseText} = require("./parser"); - -function createInliner({maxDepth}) { - const resource = createResourceLoader(); - const transformer = createTransformer(); - const globalShortcuts = createShortcutExpander(); - return { - inline: target => inline({target, depth: 0}), - resource, - transformer, - globalShortcuts - }; - - // async - function inline({source, target, depth}) { - if (depth > maxDepth) { - throw new Error(`Max recursion depth ${maxDepth} exceeded. If you are not making an infinite loop, try to increase --max-depth limit.`); - } - - resource.resolve(source, target); - const dependency = {}; - const shortcuts = globalShortcuts.clone(); - - return resource.read(source, target) - .then(content => { - if (typeof content !== 'string') { - return content; - } - return doParseText(content); - }) - .then(content => ({content, dependency})); - - function inlineDirective(directive) { - let pipes = parsePipes(directive.params[0]); - if (shortcuts.has(pipes[0].name)) { - pipes = parsePipes(shortcuts.expand(pipes)); - } - const inlineTarget = { - name: pipes[0].args.length ? pipes[0].name : "file", - args: pipes[0].args.length ? pipes[0].args : [pipes[0].name] - }; - const transforms = pipes.slice(1); - return inline({ - source: target, - target: inlineTarget, - depth: depth + 1 - }) - .then(({content, subDependency}) => { - dependency[inlineTarget.args[0]] = subDependency; - return transformer.transform(inlineTarget, content, transforms); - }); - } - - function doParseText(content) { - return Promise.all( - parseText(content).map(result => { - if (result.type === "text") { - return result.value; - } - if (result.type == "$inline.shortcut") { - shortcuts.add(...result.params); - return ""; - } - return inlineDirective(result); - }) - ) - .then(contentArr => { - if (contentArr.some(Buffer.isBuffer)) { - return Buffer.concat(contentArr.map(b => { - if (!Buffer.isBuffer(b)) { - b = Buffer.from(b, "binary"); - } - return b; - })); - } - return contentArr.join(""); - }); - } - } - -} - -module.exports = {createInliner}; diff --git a/lib/core/parser.js b/lib/core/parser.js deleted file mode 100644 index b08c80f..0000000 --- a/lib/core/parser.js +++ /dev/null @@ -1,265 +0,0 @@ -const {default: jsTokens, matchToToken} = require("js-tokens"); - -function getLineRange(text, pos) { - // FIXME: should we handle \r? - let start, end; - start = text.lastIndexOf("\n", pos - 1) + 1; - if (start < 0) { - start = 0; - } - end = text.indexOf("\n", pos); - if (end < 0) { - end = text.length; - } - return {start, end}; -} - -function parseRegex(text) { - var flags = text.match(/[a-z]*$/)[0]; - return new RegExp(text.slice(1, -(flags.length + 1)), flags); -} - -function parseString(text) { - if (text[0] == "'" || text[0] == "`") { - text = '"' + text.slice(1, -1).replace(/([^\\]|$)"/g, '$1\\"') + '"'; - } - return JSON.parse(text); -} - -function parseDirective(text, pos = 0, flags = {}) { - var match, token, info = { - type: "$inline", - start: null, - end: null, - params: [] - }; - - jsTokens.lastIndex = pos; - jsTokens.exec(text); // skip $inline - match = jsTokens.exec(text); - if (match[0] == ".") { - token = matchToToken(jsTokens.exec(text)); - if (token.type != "name") { - throw new Error(`Expecting $inline method but got "${token.value}"`); - } else { - info.type += "." + token.value; - } - match = jsTokens.exec(text); - if (!match) { - info.end = text.length; - return info; - } - } - if (match[0] != "(") { - info.end = jsTokens.lastIndex; - return info; - } - flags.needValue = true; - while ((match = jsTokens.exec(text))) { - token = matchToToken(match); - if (token.type == "whitespace" || token.type == "comment") { - continue; - } - if (token.value == ")") { - info.end = jsTokens.lastIndex; - break; - } - if (flags.needValue == (token.type == "punctuator")) { - throw new Error(`Failed to parse $inline statement at ${match.index}`); - } else { - flags.needValue = !flags.needValue; - if (token.type == "punctuator") continue; - } - if (token.type == "regex") { - token.value = parseRegex(token.value); - } else if (token.type == "number") { - token.value = +token.value; - } else if (token.type == "string") { - if (!token.closed) token.value += token.value[0]; - token.value = parseString(token.value); - } - info.params.push(token.value); - } - if (!info.end) { - throw new Error("Missing right parenthesis"); - } - return info; -} - -function parseText(content) { - const output = []; - let lastIndex = 0; - var re = /\$inline[.(]/gi, - match, type, params, - flags = {}; - - function addDirective(directive) { - if (lastIndex !== directive.start) { - output.push({ - type: "text", - value: content.slice(lastIndex, directive.start) - }); - } - output.push(directive); - lastIndex = directive.end; - } - - while ((match = re.exec(content))) { - ({type, params, end: re.lastIndex} = parseDirective(content, match.index, flags)); - - if (flags.skip) { - if (type == "$inline.skipEnd" && (flags.skip === params[0] || flags.skip === true)) { - flags.skip = false; - } - continue; - } - - if (flags.start) { - if (type != "$inline.end") { - continue; - } - flags.start.end = getLineRange(content, match.index).start - 1; - if (flags.start.start > flags.start.end) { - throw new Error(`There must be at leat one line between $inline.start and $inline.end`); - } - addDirective(flags.start); - flags.start = null; - continue; - } - - if (flags.open) { - if (type != "$inline.close") { - continue; - } - var offset = params && params[0] || 0; - flags.open.end = match.index - offset; - addDirective(flags.open); - flags.open = null; - continue; - } - - if (type == "$inline.skipStart") { - flags.skip = params[0] || true; - continue; - } - - if (type == "$inline.start") { - flags.start = { - type, params, - start: getLineRange(content, match.index).end + 1 - }; - continue; - } - - if (type == "$inline.open") { - flags.open = { - type, params, - start: re.lastIndex + (params[1] || 0) - }; - continue; - } - - if (type == "$inline") { - addDirective({ - type, params, - start: match.index, - end: re.lastIndex - }); - continue; - } - - if (type == "$inline.line") { - var {start, end} = getLineRange(content, match.index); - addDirective({ - type, params, - start, end - }); - continue; - } - - if (type == "$inline.shortcut") { - output.push({ - type, params - }); - continue; - } - - throw new Error(`${type} is not a valid $inline statement (position ${match.index})`); - } - - if (lastIndex !== content.length) { - output.push({ - type: "text", - value: content.slice(lastIndex) - }); - } - - if (flags.start) { - throw new Error(`Failed to match $inline.start at ${flags.start.start}, missing $inline.end`); - } - - if (flags.open) { - throw new Error(`Failed to match $inline.open at ${flags.open.start}, missing $inline.close`); - } - - return output; -} - -function parsePipes(text) { - const nameRe = /\s*((?:\\:|\\\||[^:|])+?)\s*([:|]|$)/y; - const valueRe = /\s*((?:\\\||\\,|[^|,])+?)\s*([,|]|$)/y; - const output = []; - while (nameRe.lastIndex < text.length) { - const match = text.match(nameRe); - const pipe = { - name: unescapePipeName(match[1]), - args: [] - }; - output.push(pipe); - if (match[2] === "|") { - continue; - } - valueRe.lastIndex = nameRe.lastIndex; - while (valueRe.lastIndex < text.length) { - const match = text.match(valueRe); - pipe.args.push(unescapePipeValue(match[1])); - if (match[2] === "|") { - break; - } - } - nameRe.lastIndex = valueRe.lastIndex; - } - return output; -} - -function unescapePipeName(text) { - return text.replace(/\\([:|])/g, "$1"); -} - -function unescapePipeValue(text) { - return text.replace(/\\([,|])/g, "$1"); -} - -function escapePipeName(text) { - return text.replace(/[:|]/g, "\\$1"); -} - -function escapePipeValue(text) { - return text.replace(/[,|]/g, "\\$1"); -} - -function pipesToString(pipes) { - return pipes.map(pipe => { - const name = escapePipeName(pipe.name); - if (!pipe.args.length) { - return name; - } - const args = pipe.args.map(escapePipeValue); - return `${name}:${args.join(",")}`; - }).join("|"); -} - -module.exports = { - parseText, parsePipes, parseDirective, - escapePipeName, escapePipeValue, pipesToString -}; diff --git a/lib/core/resource.js b/lib/core/resource.js deleted file mode 100644 index cbe55c5..0000000 --- a/lib/core/resource.js +++ /dev/null @@ -1,43 +0,0 @@ -function createResourceLoader() { - const resources = new Map; - const cache = new Map; - - return { - add, - remove, - read, - resolve - }; - - function add(reader) { - resources.set(reader.name, reader); - } - - function remove(name) { - resources.delete(name); - } - - function read(source, target) { - const reader = resources.get(target.name); - const hash = reader.hash && reader.hash(source, target); - let result; - if (hash && cache.has(hash)) { - result = cache.get(hash); - } else { - result = reader.read(source, target); - if (hash) { - cache.set(hash, result); - } - } - return Promise.resolve(result); - } - - function resolve(source, target) { - const reader = resources.get(target.name); - if (reader.resolve) { - reader.resolve(source, target); - } - } -} - -module.exports = {createResourceLoader}; diff --git a/lib/core/shortcut.js b/lib/core/shortcut.js deleted file mode 100644 index 5f1d8af..0000000 --- a/lib/core/shortcut.js +++ /dev/null @@ -1,51 +0,0 @@ -const {escapePipeValue, pipesToString} = require("./parser"); - -function createShortcutExpander(parent) { - const shortcuts = new Map; - const self = {add, remove, clone, has, expand, lookup}; - return self; - - function add(shortcut) { - shortcuts.set(shortcut.name, shortcut); - } - - function remove(name) { - shortcuts.delete(name); - } - - function clone() { - return createShortcutExpander(self); - } - - function has(name) { - return shortcuts.has(name) || parent && parent.has(name); - } - - function lookup(name) { - return shortcuts.get(name) || parent && parent.lookup(name); - } - - function expand(target, pipes) { - const [shortcut, ...transforms] = pipes; - const expander = lookup(shortcut.name); - let expanded; - if (typeof expander.expand == "function") { - expanded = expander.expand(target, ...shortcut.args); - } else if (typeof expander.expand == "string") { - expanded = expander.expand.replace(/\$(\d+|&)/g, (match, n) => { - if (n == "&") { - return shortcut.args.map(escapePipeValue).join(","); - } - return shortcut.args[n - 1]; - }); - } else { - throw new Error("shortcut.expand must be a string or a function"); - } - if (!transforms.length) { - return expanded; - } - return `${expanded}|${pipesToString(transforms)}`; - } -} - -module.exports = {createShortcutExpander}; diff --git a/lib/core/transformer.js b/lib/core/transformer.js deleted file mode 100644 index 39a5191..0000000 --- a/lib/core/transformer.js +++ /dev/null @@ -1,26 +0,0 @@ -function createTransformer() { - const transformer = new Map; - return {add, remove, transform}; - - function add(transform) { - transformer.set(transform.name, transform); - } - - function remove(name) { - transformer.delete(name); - } - - function transform(target, content, transforms) { - return transforms.reduce((pending, transform) => { - return pending.then(content => { - return transformer.get(transform.name).transform( - target, - content, - ...transform.args - ); - }); - }, Promise.resolve(content)); - } -} - -module.exports = {createTransformer}; diff --git a/test/test.js b/test/test.js index dc94432..25544b9 100644 --- a/test/test.js +++ b/test/test.js @@ -1,154 +1,6 @@ /* eslint-env mocha */ const assert = require("power-assert"); -describe("parsePipes", () => { - const {parsePipes} = require("../lib/parser"); - - it("basic", () => { - const result = parsePipes("test:123"); - assert.deepEqual(result, [{name: "test", args: ["123"]}]); - }); - - it("no value", () => { - const result = parsePipes("a"); - assert.deepEqual(result, [{name: "a", args: []}]); - }); - - it("multiple values", () => { - const result = parsePipes("a:b,c"); - assert.deepEqual(result, [{name: "a", args: ["b", "c"]}]); - }); - - it("escape characters", () => { - const result = parsePipes("a\\:b:a\\,b"); - assert.deepEqual(result, [{name: "a:b", args: ["a,b"]}]); - }); -}); - -describe("parseDirective", () => { - const {parseDirective} = require("../lib/parser"); - - it("shortcut", () => { - const result = parseDirective("$inline.shortcut('a', 'b')"); - assert(result.type === "$inline.shortcut"); - assert.deepEqual(result.params, ["a", "b"]); - }); -}); - -describe("shortcut", () => { - const {parsePipes} = require("../lib/parser"); - - function prepare(name, expand) { - delete require.cache[require.resolve("../lib/shortcut")]; - const shortcut = require("../lib/shortcut"); - shortcut.addGlobal({name, expand}); - return exp => { - const pipes = parsePipes(exp); - return shortcut.expand(null, pipes); - }; - } - - it("basic", () => { - const expand = prepare("test", "a.txt|tr:$1"); - assert(expand("test:abc") === "a.txt|tr:abc"); - }); - - it("multiple arguments", () => { - const expand = prepare("test", "a.txt|tr:$1|tr2:$2"); - assert(expand("test:abc,123") === "a.txt|tr:abc|tr2:123"); - }); - - it("$&", () => { - const expand = prepare("test", "a.txt|tr:$&"); - assert(expand("test:abc,123") === "a.txt|tr:abc,123"); - }); - - it("additional pipes", () => { - const expand = prepare("test", "a.txt|tr"); - assert(expand("test|tr2|tr3") === "a.txt|tr|tr2|tr3"); - }); - - it("use function", () => { - const expand = prepare("test", (source, a, b) => `a.txt|${a}|${b}`); - assert(expand("test:123,456") === "a.txt|123|456"); - }); -}); - -describe("parseText", () => { - const {parseText} = require("../lib/parser"); - - it("$inline", () => { - const [result] = parseText("$inline('path/to/file')"); - assert(result.type === "$inline"); - assert.deepEqual(result.params, ["path/to/file"]); - }); - - it("start and end", () => { - const [left, result, right] = parseText("$inline.start('./a.txt')\ntest\n$inline.end"); - assert(left.type === "text"); - assert(left.value === "$inline.start('./a.txt')\n"); - - assert(result.type === "$inline.start"); - assert.deepEqual(result.params, ["./a.txt"]); - - assert(right.type === "text"); - assert(right.value === "\n$inline.end"); - }); - - it("line", () => { - const [left, result, right] = parseText("test\ntest$inline.line('path/to/file')test\ntest"); - assert(left.type === "text"); - assert(left.value === "test\n"); - - assert(result.type === "$inline.line"); - assert.deepEqual(result.params, ["path/to/file"]); - - assert(right.type === "text"); - assert(right.value === "\ntest"); - }); - - it("shortcut", () => { - const content = "$inline.shortcut('test', 'file|t1:$2,$1')"; - const [result, text] = parseText(content); - assert(result.type === "$inline.shortcut"); - assert.deepEqual(result.params, ["test", "file|t1:$2,$1"]); - - assert(text.type === "text"); - assert(text.value === content); - }); -}); - -describe("inline", () => { - const {inline} = require(".."); - - function mustFailed() { - throw new Error("Must failed"); - } - - it("maxDepth", () => { - const target = { - name: "text", - args: [`${__dirname}/recursive/test`] - }; - return inline({target, maxDepth: 10}) - .then(mustFailed) - .catch(err => { - assert(err.message.includes("Max recursion depth 10")); - }); - }); - - it("shortcut", () => { - const target = { - name: "text", - args: [`${__dirname}/shortcut/test`] - }; - return inline({target}) - .then(content => { - assert(/\nOK$/.test(content)); - }); - }); -}); - describe("transforms", () => { const transformer = require("../lib/transformer"); From 88068fa74d4242fbaeaf011e3bcaf2a869afcc87 Mon Sep 17 00:00:00 2001 From: eight Date: Mon, 21 May 2018 19:01:39 +0800 Subject: [PATCH 04/38] WIP: test --- README.md | 1 + lib/default-resources.js | 4 +-- lib/default-transforms.js | 6 ++-- package-lock.json | 22 +++++++++++++-- package.json | 5 ++-- test/recursive/test | 1 - test/shortcut/package.json | 1 - test/shortcut/test | 2 -- test/test.js | 56 ++++++++++++++------------------------ 9 files changed, 47 insertions(+), 51 deletions(-) delete mode 100644 test/recursive/test delete mode 100644 test/shortcut/package.json delete mode 100644 test/shortcut/test diff --git a/README.md b/README.md index 6d8d5a7..71b0d1f 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ inline-js [![Build Status](https://travis-ci.org/eight04/inline-js.svg?branch=dev-async)](https://travis-ci.org/eight04/inline-js) [![Coverage Status](https://coveralls.io/repos/github/eight04/inline-js/badge.svg?branch=dev-async)](https://coveralls.io/github/eight04/inline-js?branch=dev-async) +[![install size](https://packagephobia.now.sh/badge?p=inline-js)](https://packagephobia.now.sh/result?p=inline-js) A static assets inliner, like PHP's `include`, with transformer! diff --git a/lib/default-resources.js b/lib/default-resources.js index c95d137..e5157ec 100644 --- a/lib/default-resources.js +++ b/lib/default-resources.js @@ -4,8 +4,6 @@ const childProcess = require("child_process"); const isBinaryPath = require("is-binary-path"); const fse = require("fs-extra"); -const logger = require("./logger"); - const PATH_LIKE = new Set(["file", "text", "raw"]); const DEFAULT_RESOURCES = [{ @@ -54,7 +52,7 @@ function readCmd(source, target) { const output = []; const cp = childProcess.spawn(target.args[0], options); cp.on("error", reject); - cp.stdout.pipe(logger.getLogStream()); + cp.stdout.pipe(process.stderr); cp.stdout.on("data", chunk => output.push(chunk)); cp.on("close", exitCode => { if (exitCode) { diff --git a/lib/default-transforms.js b/lib/default-transforms.js index 18c902d..e67ed68 100644 --- a/lib/default-transforms.js +++ b/lib/default-transforms.js @@ -2,10 +2,10 @@ const vm = require("vm"); const mime = require("mime"); const CleanCSS = require("clean-css"); -const resource = require("./resource"); - const cleanCss = new CleanCSS; +const {PATH_LIKE} = require("./default-resources"); + const DEFAULT_TRANSFORMS = [{ name: "string", transform(source, content, encoding = "utf8") { @@ -78,7 +78,7 @@ const DEFAULT_TRANSFORMS = [{ }]; function getMimeType(source) { - return source && resource.PATH_LIKE.has(source.name) && + return source && PATH_LIKE.has(source.name) && mime.getType(source.args[0]) || "text/plain"; } diff --git a/package-lock.json b/package-lock.json index 3be3dc9..f490912 100644 --- a/package-lock.json +++ b/package-lock.json @@ -160,7 +160,8 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "bcrypt-pbkdf": { "version": "1.0.1", @@ -190,6 +191,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -333,7 +335,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { "version": "1.6.2", @@ -917,6 +920,21 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "inline-js-core": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/inline-js-core/-/inline-js-core-0.1.0.tgz", + "integrity": "sha512-xPsh/uCfdqR7TMnbcNDyJg83SdOL1WMaBZSK4Eq36vSp4CxvQZPX6eH0HV7x+x6V5m00CxMk8Wt11Hp9LYOTjA==", + "requires": { + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + } + } + }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", diff --git a/package.json b/package.json index 6f493ae..741d403 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,7 @@ "license": "MIT", "scripts": { "lint": "eslint **/*.js --ignore-pattern coverage --cache", - "mocha": "mocha --require intelli-espower-loader", - "mocha-debug": "mocha --require intelli-espower-loader --reporter spec --inspect-brk", - "nyc": "nyc --reporter=html npm run mocha", + "nyc": "nyc --reporter=html mocha", "coverage": "nyc report --reporter=text-lcov | coveralls", "test": "npm run lint && npm run nyc", "preversion": "npm test", @@ -24,6 +22,7 @@ "dependencies": { "clean-css": "^4.1.11", "fs-extra": "^5.0.0", + "inline-js-core": "^0.1.0", "is-binary-path": "^2.0.0", "js-tokens": "^3.0.1", "mime": "^2.3.1", diff --git a/test/recursive/test b/test/recursive/test deleted file mode 100644 index bfaac00..0000000 --- a/test/recursive/test +++ /dev/null @@ -1 +0,0 @@ -$inline("test") diff --git a/test/shortcut/package.json b/test/shortcut/package.json deleted file mode 100644 index 7772c18..0000000 --- a/test/shortcut/package.json +++ /dev/null @@ -1 +0,0 @@ -{"test": "OK"} \ No newline at end of file diff --git a/test/shortcut/test b/test/shortcut/test deleted file mode 100644 index 5f36eda..0000000 --- a/test/shortcut/test +++ /dev/null @@ -1,2 +0,0 @@ -$inline.shortcut('pkg', './package.json|parse:$1') -$inline('pkg:test') \ No newline at end of file diff --git a/test/test.js b/test/test.js index 25544b9..f7a39b1 100644 --- a/test/test.js +++ b/test/test.js @@ -1,8 +1,11 @@ /* eslint-env mocha */ -const assert = require("power-assert"); +const assert = require("assert"); describe("transforms", () => { - const transformer = require("../lib/transformer"); + const {DEFAULT_TRANSFORMS} = require("../lib/default-transforms"); + const {createTransformer} = require("inline-js-core/lib/transformer"); + const transformer = createTransformer(); + DEFAULT_TRANSFORMS.forEach(transformer.add); function prepare(baseOptions) { return options => { @@ -93,7 +96,10 @@ describe("transforms", () => { }); describe("resource", () => { - const resource = require("../lib/resource"); + const {DEFAULT_RESOURCES} = require("../lib/default-resources"); + const {createResourceLoader} = require("inline-js-core/lib/resource"); + const resource = createResourceLoader(); + DEFAULT_RESOURCES.forEach(resource.add); function prepare(baseOptions) { return options => { @@ -174,49 +180,27 @@ describe("resource", () => { }); describe("conf", () => { - const MODS = ["shortcut", "resource", "transformer", "conf"]; + const path = require("path"); + const {findConfig} = require("../lib/conf"); - function test(file, expectConfigured) { - MODS.forEach(name => { - delete require.cache[require.resolve(`../lib/${name}`)]; - }); - const [shortcut, resource, transformer, conf] = MODS.map(name => { - return require(`../lib/${name}`); - }); - - conf.findAndLoad(file); - - assert(shortcut.has(null, "shortcutConfigured") === expectConfigured); - assert(resource.has("resourceConfigured") === expectConfigured); - assert(transformer.has("transformConfigured") === expectConfigured); - - if (expectConfigured) { - return Promise.all([ - Promise.resolve(shortcut.expand(null, [{name: "shortcutConfigured", args: []}])) - .then(result => { - assert(result === "shortcutOK"); - }), - resource.read(null, {name: "resourceConfigured", args: []}) - .then(content => { - assert(content === "resourceOK"); - }), - transformer.transform(null, "", [{name: "transformConfigured", args: []}]) - .then(content => { - assert(content === "transformOK"); - }) - ]); + function test(file, expectedConfPath) { + const result = findConfig(file); + if (expectedConfPath) { + assert.equal(result.confPath, path.resolve(expectedConfPath)); + } else { + assert(!result); } } it("find in current path", () => { - return test(`${__dirname}/conf/test`, true); + return test(`${__dirname}/conf/test`, `${__dirname}/conf/.inline.js`); }); it("find in ancestor", () => { - return test(`${__dirname}/conf/b/test`, true); + return test(`${__dirname}/conf/b/test`, `${__dirname}/conf/.inline.js`); }); it("don't go up through package root", () => { - return test(`${__dirname}/conf/a/test`, false); + return test(`${__dirname}/conf/a/test`, null); }); }); From 658aebdcea8b281923bd1b31b8a2d1770af55563 Mon Sep 17 00:00:00 2001 From: eight Date: Mon, 21 May 2018 22:44:33 +0800 Subject: [PATCH 05/38] Fix: cli API --- cli.js | 2 +- index.js | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cli.js b/cli.js index ad2e6db..e9a9ce6 100644 --- a/cli.js +++ b/cli.js @@ -15,7 +15,7 @@ Options: laxPlacement: true }); -require("./index").init({args}) +require("./index").init(args) .catch(err => { console.error(err); // eslint-disable-line no-console process.exit(1); diff --git a/index.js b/index.js index f32399d..2abc834 100644 --- a/index.js +++ b/index.js @@ -6,7 +6,12 @@ const {DEFAULT_RESOURCES} = require("./lib/default-resources"); const {DEFAULT_TRANSFORMS} = require("./lib/default-transforms"); const {findConfig} = require("./lib/conf"); -function init({out, dryRun, maxDepth, file}) { +function init({ + "--out": out, + "--dry-run": dryRun, + "--max-depth": maxDepth, + "": file +}) { const inliner = createInliner({maxDepth}); DEFAULT_RESOURCES.forEach(inliner.resource.add); From 52fc1f1a081e093b46ee77a73f0ba8da771d91f8 Mon Sep 17 00:00:00 2001 From: eight Date: Mon, 21 May 2018 22:53:21 +0800 Subject: [PATCH 06/38] Update dependencies --- package-lock.json | 99 ++++++++++++++++++++++++----------------------- package.json | 9 ++--- 2 files changed, 55 insertions(+), 53 deletions(-) diff --git a/package-lock.json b/package-lock.json index f490912..6004868 100644 --- a/package-lock.json +++ b/package-lock.json @@ -146,6 +146,12 @@ "supports-color": "^2.0.0" } }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -198,9 +204,9 @@ } }, "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, "buffer-from": { @@ -327,9 +333,9 @@ } }, "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, "concat-map": { @@ -456,9 +462,9 @@ "dev": true }, "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "doctrine": { @@ -684,9 +690,9 @@ } }, "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -812,9 +818,9 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "har-schema": { @@ -921,18 +927,11 @@ "dev": true }, "inline-js-core": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/inline-js-core/-/inline-js-core-0.1.0.tgz", - "integrity": "sha512-xPsh/uCfdqR7TMnbcNDyJg83SdOL1WMaBZSK4Eq36vSp4CxvQZPX6eH0HV7x+x6V5m00CxMk8Wt11Hp9LYOTjA==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-js-core/-/inline-js-core-0.1.1.tgz", + "integrity": "sha512-FA9w1g2PC494Gw3Y/b/qFbRxnr9FsvWtq8ct6TGcAN+WwUXHwpFY/bLRNXpQNPDyJM60ZflMmeU7uNpdyJ6FTg==", "requires": { "js-tokens": "^4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - } } }, "inquirer": { @@ -1032,9 +1031,9 @@ "dev": true }, "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "3.11.0", @@ -1194,36 +1193,40 @@ } }, "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", "dev": true, "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", + "browser-stdout": "1.3.1", + "commander": "2.15.1", "debug": "3.1.0", - "diff": "3.3.1", + "diff": "3.5.0", "escape-string-regexp": "1.0.5", "glob": "7.1.2", - "growl": "1.10.3", + "growl": "1.10.5", "he": "1.1.1", + "minimatch": "3.0.4", "mkdirp": "0.5.1", - "supports-color": "4.4.0" + "supports-color": "5.4.0" }, "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "^2.0.0" + "has-flag": "^3.0.0" } } } @@ -1247,9 +1250,9 @@ "dev": true }, "neodoc": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/neodoc/-/neodoc-1.4.0.tgz", - "integrity": "sha1-Uwyph33gcp/9XWQg+1KxBPCIjQU=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/neodoc/-/neodoc-2.0.0.tgz", + "integrity": "sha512-jnFsE8vHuE7rTrGT+uJMTr3pXLzLQXXillfvPWWlY8ucCCnncsrI4p9rE2+j/b6CDiIF+YEnxf1wwIdksK8cWA==", "requires": { "ansi-regex": "^2.0.0" } diff --git a/package.json b/package.json index 741d403..614ccb9 100644 --- a/package.json +++ b/package.json @@ -21,19 +21,18 @@ "main": "index.js", "dependencies": { "clean-css": "^4.1.11", - "fs-extra": "^5.0.0", - "inline-js-core": "^0.1.0", + "fs-extra": "^6.0.1", + "inline-js-core": "^0.1.1", "is-binary-path": "^2.0.0", - "js-tokens": "^3.0.1", "mime": "^2.3.1", - "neodoc": "^1.4.0", + "neodoc": "^2.0.0", "treeify": "^1.1.0" }, "devDependencies": { "coveralls": "^3.0.1", "crlf": "^1.1.1", "eslint": "^4.19.1", - "mocha": "^4.1.0", + "mocha": "^5.2.0", "nyc": "^11.8.0" }, "repository": "eight04/inline-js" From 259cabdad11c02966253ea61ddcb7f87c4d73f69 Mon Sep 17 00:00:00 2001 From: eight Date: Tue, 22 May 2018 10:52:04 +0800 Subject: [PATCH 07/38] Fix: cmd resource is slow --- test/test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/test.js b/test/test.js index f7a39b1..d3fbfd7 100644 --- a/test/test.js +++ b/test/test.js @@ -154,7 +154,8 @@ describe("resource", () => { ]); }); - it("cmd", () => { + it("cmd", function() { + this.slow(5000); const command = 'node -e "console.log(1 + 1)"'; const test = prepare({name: "cmd"}); return Promise.all([ From 3cadd7516e88421676653e952929265cc9e683f7 Mon Sep 17 00:00:00 2001 From: eight Date: Tue, 22 May 2018 14:32:12 +0800 Subject: [PATCH 08/38] Add: async config locater --- index.js | 58 +++++++++++++++++++----------------- lib/conf.js | 76 +++++++++++++++++++++++++++++++---------------- package-lock.json | 5 ++++ package.json | 1 + test/test.js | 14 +++++---- 5 files changed, 94 insertions(+), 60 deletions(-) diff --git a/index.js b/index.js index 2abc834..40b02bb 100644 --- a/index.js +++ b/index.js @@ -17,34 +17,36 @@ function init({ DEFAULT_RESOURCES.forEach(inliner.resource.add); DEFAULT_TRANSFORMS.forEach(inliner.transformer.add); - const config = findConfig(file); - if (config) { - console.error(`Use config file: ${config.confPath}`); - if (config.resources) { - config.resources.forEach(inliner.resource.add); - } - if (config.transforms) { - config.transforms.forEach(inliner.transformer.add); - } - if (config.shortcuts) { - config.shorcuts.forEach(inliner.globalShortcuts.add); - } - } - - console.error("inline-js started\n"); - return inliner.inline({name: "text", args: [file]}).then(({content, dependency}) => { - console.error(`Result inline tree:`); - console.error(file); - console.error(treeify.asTree(dependency)); - - if (dryRun) { - console.error(`[dry] Output to ${out || "stdout"}`); - } else if (out) { - fse.outputFileSync(out, content); - } else { - process.stdout.write(content); - } - }); + return findConfig(file) + .then(config => { + if (config) { + console.error(`Use config file: ${config.confPath}`); + if (config.resources) { + config.resources.forEach(inliner.resource.add); + } + if (config.transforms) { + config.transforms.forEach(inliner.transformer.add); + } + if (config.shortcuts) { + config.shorcuts.forEach(inliner.globalShortcuts.add); + } + } + console.error("inline-js started\n"); + return inliner.inline({name: "text", args: [file]}); + }) + .then(({content, dependency}) => { + console.error(`Result inline tree:`); + console.error(file); + console.error(treeify.asTree(dependency)); + + if (dryRun) { + console.error(`[dry] Output to ${out || "stdout"}`); + } else if (out) { + fse.outputFileSync(out, content); + } else { + process.stdout.write(content); + } + }); } module.exports = {init}; diff --git a/lib/conf.js b/lib/conf.js index 0a88b64..59800f3 100644 --- a/lib/conf.js +++ b/lib/conf.js @@ -1,32 +1,56 @@ const path = require("path"); -const fs = require("fs"); +const fse = require("fs-extra"); +const requireAsync = require("node-require-async")(module); -function findConfig(file) { - let dir = path.dirname(path.resolve(file)); - let confPath; - let conf; - do { - confPath = path.join(dir, ".inline.js"); - try { - conf = require(confPath); - // found - break; - } catch (err) { - // pass - } - try { - fs.accessSync(path.join(dir, "package.json")); - // don't go upper than package root - break; - } catch (err) { - // pass +function tryAccess(file) { + return fse.access(file) + .then(() => true) + .catch(() => false); +} + +function tryRequire(file) { + return requireAsync(file) + .catch(() => false); +} + +function createConfigLocator() { + const cache = new Map; + return {findConfig}; + + function findConfig(file) { + let dir = path.dirname(path.resolve(file)); + return searchDir(dir); + } + + function searchDir(dir) { + const cachedResult = cache.get(dir); + if (cachedResult) { + return cachedResult; } - dir = path.join(dir, ".."); - } while (path.parse(dir).base); - - if (conf) { - return {conf, confPath}; + const confPath = path.join(dir, ".inline.js"); + const pkgPath = path.join(dir, "package.json"); + const pendingPkg = tryAccess(pkgPath); + const pending = tryRequire(confPath) + .then(conf => { + if (conf) { + return {conf, confPath}; + } + return pendingPkg.then(pkg => { + if (!pkg) { + const parentDir = path.dirname(dir); + if (parentDir !== dir) { + return searchDir(parentDir); + } + } + return null; + }); + }); + cache.set(dir, pending); + return pending; } } -module.exports = {findConfig}; +module.exports = { + findConfig: file => createConfigLocator().findConfig(file), + createConfigLocator +}; diff --git a/package-lock.json b/package-lock.json index 6004868..636c1c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1257,6 +1257,11 @@ "ansi-regex": "^2.0.0" } }, + "node-require-async": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/node-require-async/-/node-require-async-0.1.1.tgz", + "integrity": "sha512-4Hme47xFzejtUdB+6QQHet1vh1gBUCsc1NX0srZURJfbNFitWCvRy88FQPfN2E+ed9hXeWgGhOswBCaAVhbtOg==" + }, "nyc": { "version": "11.8.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.8.0.tgz", diff --git a/package.json b/package.json index 614ccb9..b8d9198 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "is-binary-path": "^2.0.0", "mime": "^2.3.1", "neodoc": "^2.0.0", + "node-require-async": "^0.1.1", "treeify": "^1.1.0" }, "devDependencies": { diff --git a/test/test.js b/test/test.js index d3fbfd7..27deb5f 100644 --- a/test/test.js +++ b/test/test.js @@ -185,12 +185,14 @@ describe("conf", () => { const {findConfig} = require("../lib/conf"); function test(file, expectedConfPath) { - const result = findConfig(file); - if (expectedConfPath) { - assert.equal(result.confPath, path.resolve(expectedConfPath)); - } else { - assert(!result); - } + return findConfig(file) + .then(result => { + if (expectedConfPath) { + assert.equal(result.confPath, path.resolve(expectedConfPath)); + } else { + assert(!result); + } + }); } it("find in current path", () => { From 3f36a1540062407a02966b1500db2725af169619 Mon Sep 17 00:00:00 2001 From: eight Date: Tue, 22 May 2018 14:37:26 +0800 Subject: [PATCH 09/38] Test: config cache --- test/test.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/test/test.js b/test/test.js index 27deb5f..c3a341a 100644 --- a/test/test.js +++ b/test/test.js @@ -182,7 +182,7 @@ describe("resource", () => { describe("conf", () => { const path = require("path"); - const {findConfig} = require("../lib/conf"); + const {findConfig, createConfigLocator} = require("../lib/conf"); function test(file, expectedConfPath) { return findConfig(file) @@ -206,4 +206,19 @@ describe("conf", () => { it("don't go up through package root", () => { return test(`${__dirname}/conf/a/test`, null); }); + + it("stop at root", () => { + return test("/", null); + }); + + it("cache", () => { + const conf = createConfigLocator(); + return Promise.all([ + conf.findConfig(`${__dirname}/conf/test`), + conf.findConfig(`${__dirname}/conf/b/test`) + ]) + .then(([conf1, conf2]) => { + assert.equal(conf1, conf2); + }); + }); }); From 0af0a5adb0234ba42f1ddc2ecad4bec8598c9993 Mon Sep 17 00:00:00 2001 From: eight Date: Tue, 22 May 2018 14:51:49 +0800 Subject: [PATCH 10/38] Test: cached findConfig result --- lib/conf.js | 10 +++-- package-lock.json | 95 +++++++++++++++++++++++++++++++++++++++++++++-- package.json | 1 + test/test.js | 8 +++- 4 files changed, 105 insertions(+), 9 deletions(-) diff --git a/lib/conf.js b/lib/conf.js index 59800f3..9113cc9 100644 --- a/lib/conf.js +++ b/lib/conf.js @@ -13,7 +13,7 @@ function tryRequire(file) { .catch(() => false); } -function createConfigLocator() { +function createConfigLocator({_tryRequire = tryRequire, _tryAccess = tryAccess} = {}) { const cache = new Map; return {findConfig}; @@ -29,8 +29,8 @@ function createConfigLocator() { } const confPath = path.join(dir, ".inline.js"); const pkgPath = path.join(dir, "package.json"); - const pendingPkg = tryAccess(pkgPath); - const pending = tryRequire(confPath) + const pendingPkg = _tryAccess(pkgPath); + const pending = _tryRequire(confPath) .then(conf => { if (conf) { return {conf, confPath}; @@ -52,5 +52,7 @@ function createConfigLocator() { module.exports = { findConfig: file => createConfigLocator().findConfig(file), - createConfigLocator + createConfigLocator, + tryRequire, + tryAccess }; diff --git a/package-lock.json b/package-lock.json index 636c1c8..5997e13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,14 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@sinonjs/formatio": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", + "requires": { + "samsam": "1.3.0" + } + }, "acorn": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", @@ -464,8 +472,7 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, "doctrine": { "version": "2.1.0", @@ -851,8 +858,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "hawk": { "version": "6.0.2", @@ -1096,6 +1102,11 @@ "verror": "1.10.0" } }, + "just-extend": { + "version": "1.1.27", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz", + "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==" + }, "lcov-parse": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", @@ -1118,12 +1129,22 @@ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, "log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, + "lolex": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.6.0.tgz", + "integrity": "sha512-e1UtIo1pbrIqEXib/yMjHciyqkng5lc0rrIbytgjmRgDR9+2ceNIAcwOWSgylRjoEP9VdVguCSRwnNmlbnOUwA==" + }, "lru-cache": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", @@ -1257,6 +1278,18 @@ "ansi-regex": "^2.0.0" } }, + "nise": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.3.3.tgz", + "integrity": "sha512-v1J/FLUB9PfGqZLGDBhQqODkbLotP0WtLo9R4EJY2PPu5f5Xg4o0rA8FDlmrjFSv9vBBKcfnOSpfYYuu5RTHqg==", + "requires": { + "@sinonjs/formatio": "^2.0.0", + "just-extend": "^1.1.27", + "lolex": "^2.3.2", + "path-to-regexp": "^1.7.0", + "text-encoding": "^0.6.4" + } + }, "node-require-async": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/node-require-async/-/node-require-async-0.1.1.tgz", @@ -3954,6 +3987,21 @@ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -4144,6 +4192,11 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==" + }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", @@ -4171,6 +4224,30 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "sinon": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-5.0.7.tgz", + "integrity": "sha512-GvNLrwpvLZ8jIMZBUhHGUZDq5wlUdceJWyHvZDmqBxnjazpxY1L0FNbGBX6VpcOEoQ8Q4XMWFzm2myJMvx+VjA==", + "requires": { + "@sinonjs/formatio": "^2.0.0", + "diff": "^3.1.0", + "lodash.get": "^4.4.2", + "lolex": "^2.2.0", + "nise": "^1.2.0", + "supports-color": "^5.1.0", + "type-detect": "^4.0.5" + }, + "dependencies": { + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "slice-ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", @@ -4278,6 +4355,11 @@ "string-width": "^2.1.1" } }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=" + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -4347,6 +4429,11 @@ "prelude-ls": "~1.1.2" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", diff --git a/package.json b/package.json index b8d9198..a36efae 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "mime": "^2.3.1", "neodoc": "^2.0.0", "node-require-async": "^0.1.1", + "sinon": "^5.0.7", "treeify": "^1.1.0" }, "devDependencies": { diff --git a/test/test.js b/test/test.js index c3a341a..41aaaee 100644 --- a/test/test.js +++ b/test/test.js @@ -1,5 +1,6 @@ /* eslint-env mocha */ const assert = require("assert"); +const sinon = require("sinon"); describe("transforms", () => { const {DEFAULT_TRANSFORMS} = require("../lib/default-transforms"); @@ -212,13 +213,18 @@ describe("conf", () => { }); it("cache", () => { - const conf = createConfigLocator(); + const {tryRequire, tryAccess} = require("../lib/conf"); + const _tryRequire = sinon.spy(tryRequire); + const _tryAccess = sinon.spy(tryAccess); + const conf = createConfigLocator({_tryRequire, _tryAccess}); return Promise.all([ conf.findConfig(`${__dirname}/conf/test`), conf.findConfig(`${__dirname}/conf/b/test`) ]) .then(([conf1, conf2]) => { assert.equal(conf1, conf2); + assert(_tryRequire.calledTwice); + assert(_tryAccess.calledTwice); }); }); }); From 594826c4d682bd916d29248d09bc2cc8598ac1cb Mon Sep 17 00:00:00 2001 From: eight Date: Tue, 22 May 2018 14:56:20 +0800 Subject: [PATCH 11/38] Test: resolve --- test/test.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/test.js b/test/test.js index 41aaaee..21e8bf6 100644 --- a/test/test.js +++ b/test/test.js @@ -97,6 +97,7 @@ describe("transforms", () => { }); describe("resource", () => { + const path = require("path"); const {DEFAULT_RESOURCES} = require("../lib/default-resources"); const {createResourceLoader} = require("inline-js-core/lib/resource"); const resource = createResourceLoader(); @@ -179,6 +180,13 @@ describe("resource", () => { .catch(err => assert(err.message.includes("Non-zero exit code"))) ]); }); + + it("resolve two paths", () => { + const source = {name: "text", args: ["foo/bar.txt"]}; + const target = {name: "file", args: ["baz/bak.txt"]}; + resource.resolve(source, target); + assert.equal(target.args[0], path.resolve("foo/baz/bak.txt")); + }); }); describe("conf", () => { From 7e92814711bb42625fe4b0f36a43ddfc70ed93d4 Mon Sep 17 00:00:00 2001 From: eight Date: Tue, 22 May 2018 15:02:55 +0800 Subject: [PATCH 12/38] Test: unknown markdown --- lib/default-transforms.js | 1 + test/test.js | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/default-transforms.js b/lib/default-transforms.js index e67ed68..d755e1c 100644 --- a/lib/default-transforms.js +++ b/lib/default-transforms.js @@ -60,6 +60,7 @@ const DEFAULT_TRANSFORMS = [{ if (type == "quote") { return content.split("\n").map(l => "> " + l).join("\n"); } + throw new Error(`Unknown markdown type: ${type}`); } }, { name: "parse", diff --git a/test/test.js b/test/test.js index 21e8bf6..dc9d4fc 100644 --- a/test/test.js +++ b/test/test.js @@ -10,10 +10,17 @@ describe("transforms", () => { function prepare(baseOptions) { return options => { - const {name, content, args = [], expect, source} = Object.assign( + const {name, content, args = [], expect, source, error} = Object.assign( {}, baseOptions, options); return transformer.transform(source, content, [{name, args}]) - .then(result => assert(result === expect)); + .then( + result => assert(result === expect), + err => { + if (!error) { + throw err; + } + } + ); }; } @@ -60,7 +67,8 @@ describe("transforms", () => { args: ["quote"], content: "some text\nsome text", expect: "> some text\n> some text" - }) + }), + test({args: ["unknown"], error: true}) ]); }); From f5fd7c0e3e2ca9aa0d2f4a70adf705360a147792 Mon Sep 17 00:00:00 2001 From: eight Date: Tue, 22 May 2018 15:07:44 +0800 Subject: [PATCH 13/38] Test: dataurl no extension --- test/base64/test-base64.txt | 1 + test/test.js | 5 +++++ 2 files changed, 6 insertions(+) create mode 100644 test/base64/test-base64.txt diff --git a/test/base64/test-base64.txt b/test/base64/test-base64.txt new file mode 100644 index 0000000..18da31f --- /dev/null +++ b/test/base64/test-base64.txt @@ -0,0 +1 @@ +data:text/plain;charset=utf8;base64,ZHVtbXkgZmlsZQ== \ No newline at end of file diff --git a/test/test.js b/test/test.js index dc9d4fc..8c9b799 100644 --- a/test/test.js +++ b/test/test.js @@ -76,6 +76,11 @@ describe("transforms", () => { const fs = require("fs"); const test = prepare({name: "dataurl"}); return Promise.all([ + test({ + source: {name: "file", args: ["test"]}, + content: fs.readFileSync(`${__dirname}/base64/test`), + expect: fs.readFileSync(`${__dirname}/base64/test-base64.txt`, "utf8") + }), test({ source: {name: "file", args: ["test.css"]}, content: fs.readFileSync(`${__dirname}/base64/test.css`), From 919d5d79e6ddf484bbeda0644626f371ffcaafc1 Mon Sep 17 00:00:00 2001 From: eight Date: Tue, 22 May 2018 17:19:36 +0800 Subject: [PATCH 14/38] Test: trim --- test/test.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/test/test.js b/test/test.js index 8c9b799..89ff85b 100644 --- a/test/test.js +++ b/test/test.js @@ -14,7 +14,7 @@ describe("transforms", () => { {}, baseOptions, options); return transformer.transform(source, content, [{name, args}]) .then( - result => assert(result === expect), + result => assert.equal(result, expect), err => { if (!error) { throw err; @@ -53,6 +53,15 @@ describe("transforms", () => { test({args: ["nested", "prop"], expect: 123}) ]); }); + + it("trim", () => { + const test = prepare({ + name: "trim", + content: " foo ", + expect: "foo" + }); + return test(); + }); it("markdown", () => { const test = prepare({ @@ -169,8 +178,7 @@ describe("resource", () => { ]); }); - it("cmd", function() { - this.slow(5000); + it("cmd", () => { const command = 'node -e "console.log(1 + 1)"'; const test = prepare({name: "cmd"}); return Promise.all([ @@ -192,7 +200,8 @@ describe("resource", () => { }) .catch(err => assert(err.message.includes("Non-zero exit code"))) ]); - }); + }) + .timeout(5000); it("resolve two paths", () => { const source = {name: "text", args: ["foo/bar.txt"]}; From 11f73c017863ca1fdb9072eeb59d86eb25f09d35 Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 01:36:53 +0800 Subject: [PATCH 15/38] Add: mocha-context --- package-lock.json | 6 ++++++ package.json | 1 + test/mocha.opts | 1 + test/test.js | 6 +++--- 4 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 test/mocha.opts diff --git a/package-lock.json b/package-lock.json index 5997e13..9b6dc49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1252,6 +1252,12 @@ } } }, + "mocha-context": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/mocha-context/-/mocha-context-0.1.1.tgz", + "integrity": "sha512-uMOc7WEo2dfxb2bsNM05E7kHPFbRG2DvtN8lo4OxxIrcAzr1tyq5QyC3C7PNVGr03pZLIqzausSw/2AfcNYxQg==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", diff --git a/package.json b/package.json index a36efae..bee858e 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "crlf": "^1.1.1", "eslint": "^4.19.1", "mocha": "^5.2.0", + "mocha-context": "^0.1.1", "nyc": "^11.8.0" }, "repository": "eight04/inline-js" diff --git a/test/mocha.opts b/test/mocha.opts new file mode 100644 index 0000000..1fff52d --- /dev/null +++ b/test/mocha.opts @@ -0,0 +1 @@ +--require mocha-context/register diff --git a/test/test.js b/test/test.js index 89ff85b..dbdfa2e 100644 --- a/test/test.js +++ b/test/test.js @@ -178,7 +178,8 @@ describe("resource", () => { ]); }); - it("cmd", () => { + it("cmd", t => { + t.timeout(5000); const command = 'node -e "console.log(1 + 1)"'; const test = prepare({name: "cmd"}); return Promise.all([ @@ -200,8 +201,7 @@ describe("resource", () => { }) .catch(err => assert(err.message.includes("Non-zero exit code"))) ]); - }) - .timeout(5000); + }); it("resolve two paths", () => { const source = {name: "text", args: ["foo/bar.txt"]}; From e25882f036ba61b8e80826529032dfc33e3e3d66 Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 13:11:51 +0800 Subject: [PATCH 16/38] Fix: unescape backtick in docstring transform --- lib/default-transforms.js | 15 ++++++++++++++- test/test.js | 9 +++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/default-transforms.js b/lib/default-transforms.js index d755e1c..04119fb 100644 --- a/lib/default-transforms.js +++ b/lib/default-transforms.js @@ -22,7 +22,7 @@ const DEFAULT_TRANSFORMS = [{ }, { name: "docstring", transform(source, content) { - return content.match(/`((\\`|[^`])+)`/)[1]; + return unescapeBackTick(content.match(/`((\\`|[^`])+)`/)[1]); } }, { name: "stringify", @@ -84,4 +84,17 @@ function getMimeType(source) { "text/plain"; } +function unescapeBackTick(s) { + s = s.replace(/\\`|\\"|"/g, m => { + if (m == "\\`") { + return "`"; + } + if (m == '"') { + return '\\"'; + } + return m; + }); + return JSON.parse(`"${s}"`); +} + module.exports = {DEFAULT_TRANSFORMS}; diff --git a/test/test.js b/test/test.js index dbdfa2e..f5ac0d0 100644 --- a/test/test.js +++ b/test/test.js @@ -32,6 +32,15 @@ describe("transforms", () => { }); return test(); }); + + it("docstring", () => { + const test = prepare({ + name: "docstring", + content: "`test escaped?\\`\"\\\" new line? \\n`", + expect: "test escaped?`\"\" new line? \n" + }); + return test(); + }); it("eval", () => { const test = prepare({ From e948dbae6aaa1375482a569b143e2b184f46b759 Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 13:14:59 +0800 Subject: [PATCH 17/38] Test: stringify --- test/test.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/test.js b/test/test.js index f5ac0d0..b7e0035 100644 --- a/test/test.js +++ b/test/test.js @@ -63,6 +63,15 @@ describe("transforms", () => { ]); }); + it("stringify", () => { + const test = prepare({ + name: "stringify", + content: "some text", + expect: '"some text"' + }); + return test(); + }); + it("trim", () => { const test = prepare({ name: "trim", From 5cae59922db0398d446e7caa6a462db53f8d678e Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 13:38:07 +0800 Subject: [PATCH 18/38] Test: string transform --- test/test.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/test.js b/test/test.js index b7e0035..8f5e7fe 100644 --- a/test/test.js +++ b/test/test.js @@ -63,6 +63,18 @@ describe("transforms", () => { ]); }); + it("string", () => { + const test = prepare({ + name: "string", + content: Buffer.from("我") + }); + return Promise.all([ + test({expect: "我"}), + test({args: ["binary"], expect: '我'}), + test({content: "test", expect: "test"}) + ]); + }); + it("stringify", () => { const test = prepare({ name: "stringify", From 1f693221653c64a0ea247a97b1d23bdc415e3666 Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 14:07:08 +0800 Subject: [PATCH 19/38] Fix: charset shouldn't be used as the buffer encoding --- lib/default-transforms.js | 20 ++++++++++++-------- test/base64/test-big5 | 1 + test/base64/test-big5-base64.txt | 1 + test/test.js | 8 +++++++- 4 files changed, 21 insertions(+), 9 deletions(-) create mode 100644 test/base64/test-big5 create mode 100644 test/base64/test-big5-base64.txt diff --git a/lib/default-transforms.js b/lib/default-transforms.js index 04119fb..59c88d6 100644 --- a/lib/default-transforms.js +++ b/lib/default-transforms.js @@ -32,16 +32,20 @@ const DEFAULT_TRANSFORMS = [{ }, { name: "dataurl", transform(source, content, type = getMimeType(source), charset = "") { - if (!Buffer.isBuffer(content) || type.startsWith("text")) { - if (!charset) charset = "utf8"; - if (!Buffer.isBuffer(content)) { - content = Buffer.from(content, charset); - } - } + if (!Buffer.isBuffer(content)) { + // if content is text, we must convert it into buffer with utf8 encoding + // (node.js only supports utf8) + content = Buffer.from(content, "utf8"); + charset = "utf8"; + } else if (type.startsWith("text") && !charset) { + // if content is already a buffer but the type is text/* and charset is + // missing, default to utf-8 + charset = "utf8"; + } if (charset) { - charset = `;charset=${charset}`; + type += `;charset=${charset}`; } - return `data:${type}${charset};base64,${content.toString("base64")}`; + return `data:${type};base64,${content.toString("base64")}`; } }, { name: "eval", diff --git a/test/base64/test-big5 b/test/base64/test-big5 new file mode 100644 index 0000000..67003fc --- /dev/null +++ b/test/base64/test-big5 @@ -0,0 +1 @@ +´ú¸Õ \ No newline at end of file diff --git a/test/base64/test-big5-base64.txt b/test/base64/test-big5-base64.txt new file mode 100644 index 0000000..f4cf0eb --- /dev/null +++ b/test/base64/test-big5-base64.txt @@ -0,0 +1 @@ +data:text/plain;charset=big5;base64,tPq41Q== \ No newline at end of file diff --git a/test/test.js b/test/test.js index 8f5e7fe..630265f 100644 --- a/test/test.js +++ b/test/test.js @@ -120,9 +120,15 @@ describe("transforms", () => { content: fs.readFileSync(`${__dirname}/base64/test`), expect: fs.readFileSync(`${__dirname}/base64/test-base64.txt`, "utf8") }), + test({ + source: {name: "raw", args: ["test"]}, + args: ["text/plain", "big5"], + content: fs.readFileSync(`${__dirname}/base64/test-big5`), + expect: fs.readFileSync(`${__dirname}/base64/test-big5-base64.txt`, "utf8") + }), test({ source: {name: "file", args: ["test.css"]}, - content: fs.readFileSync(`${__dirname}/base64/test.css`), + content: fs.readFileSync(`${__dirname}/base64/test.css`, "utf8"), expect: fs.readFileSync(`${__dirname}/base64/test.css-base64.txt`, "utf8") }), test({ From 3d8f9b2bfcc83a18ebe73152ac2ed970ce997054 Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 14:49:28 +0800 Subject: [PATCH 20/38] Update dependency --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9b6dc49..d8079c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1253,9 +1253,9 @@ } }, "mocha-context": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/mocha-context/-/mocha-context-0.1.1.tgz", - "integrity": "sha512-uMOc7WEo2dfxb2bsNM05E7kHPFbRG2DvtN8lo4OxxIrcAzr1tyq5QyC3C7PNVGr03pZLIqzausSw/2AfcNYxQg==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/mocha-context/-/mocha-context-0.1.2.tgz", + "integrity": "sha512-3Os1slEKcAAKGPOJ5q0TIikNF3579HVAkv1+fSaviej8WRydElznxw/APUi+Hh1qo4X/KyJziinml82Cqp3pEw==", "dev": true }, "ms": { diff --git a/package.json b/package.json index bee858e..3b6c21e 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "crlf": "^1.1.1", "eslint": "^4.19.1", "mocha": "^5.2.0", - "mocha-context": "^0.1.1", + "mocha-context": "^0.1.2", "nyc": "^11.8.0" }, "repository": "eight04/inline-js" From 437000f05336559d7abf5c7f88adda5367c21b6e Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 14:54:45 +0800 Subject: [PATCH 21/38] Update inline-js-core --- lib/default-transforms.js | 24 ++++++++++++------------ package-lock.json | 6 +++--- package.json | 2 +- test/test.js | 2 +- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/default-transforms.js b/lib/default-transforms.js index 59c88d6..f841769 100644 --- a/lib/default-transforms.js +++ b/lib/default-transforms.js @@ -8,7 +8,7 @@ const {PATH_LIKE} = require("./default-resources"); const DEFAULT_TRANSFORMS = [{ name: "string", - transform(source, content, encoding = "utf8") { + transform(ctx, content, encoding = "utf8") { if (Buffer.isBuffer(content)) { content = content.toString(encoding); } @@ -16,22 +16,22 @@ const DEFAULT_TRANSFORMS = [{ } }, { name: "cssmin", - transform(source, content) { + transform(ctx, content) { return cleanCss.minify(content).styles; } }, { name: "docstring", - transform(source, content) { + transform(ctx, content) { return unescapeBackTick(content.match(/`((\\`|[^`])+)`/)[1]); } }, { name: "stringify", - transform(source, content) { + transform(ctx, content) { return JSON.stringify(content); } }, { name: "dataurl", - transform(source, content, type = getMimeType(source), charset = "") { + transform(ctx, content, type = getMimeType(ctx.inlineTarget), charset = "") { if (!Buffer.isBuffer(content)) { // if content is text, we must convert it into buffer with utf8 encoding // (node.js only supports utf8) @@ -49,12 +49,12 @@ const DEFAULT_TRANSFORMS = [{ } }, { name: "eval", - transform(source, content, code) { + transform(ctx, content, code) { return vm.runInNewContext(code, {$0: content}); } }, { name: "markdown", - transform(source, content, type) { + transform(ctx, content, type) { if (type == "codeblock") { return "```\n" + content + "\n```"; } @@ -68,7 +68,7 @@ const DEFAULT_TRANSFORMS = [{ } }, { name: "parse", - transform(source, content, ...props) { + transform(ctx, content, ...props) { var json = JSON.parse(content); while (props.length) { json = json[props.shift()]; @@ -77,14 +77,14 @@ const DEFAULT_TRANSFORMS = [{ } }, { name: "trim", - transform(source, content) { + transform(ctx, content) { return content.trim(); } }]; -function getMimeType(source) { - return source && PATH_LIKE.has(source.name) && - mime.getType(source.args[0]) || +function getMimeType(target) { + return target && PATH_LIKE.has(target.name) && + mime.getType(target.args[0]) || "text/plain"; } diff --git a/package-lock.json b/package-lock.json index d8079c3..93aa72b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -933,9 +933,9 @@ "dev": true }, "inline-js-core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-js-core/-/inline-js-core-0.1.1.tgz", - "integrity": "sha512-FA9w1g2PC494Gw3Y/b/qFbRxnr9FsvWtq8ct6TGcAN+WwUXHwpFY/bLRNXpQNPDyJM60ZflMmeU7uNpdyJ6FTg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/inline-js-core/-/inline-js-core-0.2.0.tgz", + "integrity": "sha512-gKRKQBVQaIKxin3k+3v95WKTah5RnQum/pNcCK7lrwrbkqDrXniadBMZblCKchOu4a8/wa6Zvto4y/2ygSAIOA==", "requires": { "js-tokens": "^4.0.0" } diff --git a/package.json b/package.json index 3b6c21e..b88f8ee 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "dependencies": { "clean-css": "^4.1.11", "fs-extra": "^6.0.1", - "inline-js-core": "^0.1.1", + "inline-js-core": "^0.2.0", "is-binary-path": "^2.0.0", "mime": "^2.3.1", "neodoc": "^2.0.0", diff --git a/test/test.js b/test/test.js index 630265f..3066b87 100644 --- a/test/test.js +++ b/test/test.js @@ -12,7 +12,7 @@ describe("transforms", () => { return options => { const {name, content, args = [], expect, source, error} = Object.assign( {}, baseOptions, options); - return transformer.transform(source, content, [{name, args}]) + return transformer.transform({inlineTarget: source}, content, [{name, args}]) .then( result => assert.equal(result, expect), err => { From cd42a48790ba4c4d40d21e6449f27e1353dc2c5f Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 15:06:20 +0800 Subject: [PATCH 22/38] Add: indent transform --- lib/default-transforms.js | 13 +++++++++++++ test/test.js | 29 ++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/lib/default-transforms.js b/lib/default-transforms.js index f841769..0acc119 100644 --- a/lib/default-transforms.js +++ b/lib/default-transforms.js @@ -24,6 +24,19 @@ const DEFAULT_TRANSFORMS = [{ transform(ctx, content) { return unescapeBackTick(content.match(/`((\\`|[^`])+)`/)[1]); } +}, { + name: "indent", + transform(ctx, content) { + const lineStart = ctx.sourceContent.lastIndexOf("\n", ctx.inlineDirective.start - 1) + 1; + const rx = /\s*/y; + rx.lastIndex = lineStart; + const indent = rx.exec(ctx.sourceContent); + if (!indent) { + return content; + } + const [firstLine, ...lines] = content.split("\n"); + return [firstLine, ...lines.map(l => indent + l)].join("\n"); + } }, { name: "stringify", transform(ctx, content) { diff --git a/test/test.js b/test/test.js index 3066b87..154439e 100644 --- a/test/test.js +++ b/test/test.js @@ -10,9 +10,16 @@ describe("transforms", () => { function prepare(baseOptions) { return options => { - const {name, content, args = [], expect, source, error} = Object.assign( - {}, baseOptions, options); - return transformer.transform({inlineTarget: source}, content, [{name, args}]) + const { + name, + content, + args = [], + expect, + source, + error, + ctx = {inlineTarget: source} + } = Object.assign({}, baseOptions, options); + return transformer.transform(ctx, content, [{name, args}]) .then( result => assert.equal(result, expect), err => { @@ -51,6 +58,22 @@ describe("transforms", () => { }); return test(); }); + + it("indent", () => { + const test = prepare({ + name: "indent", + content: "foo\nbar", + ctx: { + sourceContent: " $inline('foo|indent')", + inlineDirective: { + start: 2, + end: 23 + } + }, + expect: "foo\n bar" + }); + return test(); + }); it("parse", () => { const test = prepare({ From 0ba4b89a98fd146de71d48d8793658e1b8172968 Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 15:12:03 +0800 Subject: [PATCH 23/38] fixup! Add: indent transform --- lib/default-transforms.js | 2 +- test/test.js | 25 ++++++++++++++++--------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/lib/default-transforms.js b/lib/default-transforms.js index 0acc119..6cb777c 100644 --- a/lib/default-transforms.js +++ b/lib/default-transforms.js @@ -30,7 +30,7 @@ const DEFAULT_TRANSFORMS = [{ const lineStart = ctx.sourceContent.lastIndexOf("\n", ctx.inlineDirective.start - 1) + 1; const rx = /\s*/y; rx.lastIndex = lineStart; - const indent = rx.exec(ctx.sourceContent); + const indent = rx.exec(ctx.sourceContent)[0]; if (!indent) { return content; } diff --git a/test/test.js b/test/test.js index 154439e..9b11c22 100644 --- a/test/test.js +++ b/test/test.js @@ -59,20 +59,27 @@ describe("transforms", () => { return test(); }); - it("indent", () => { + describe("indent", () => { + const ctx = { + sourceContent: " $inline('foo|indent')", + inlineDirective: { + start: 2, + end: 23 + } + }; const test = prepare({ name: "indent", content: "foo\nbar", - ctx: { - sourceContent: " $inline('foo|indent')", - inlineDirective: { - start: 2, - end: 23 - } - }, + ctx, expect: "foo\n bar" }); - return test(); + + it("basic", () => test()); + + it("no indent", () => test({ + ctx: Object.assign({}, ctx, {sourceContent: "__$inline('foo|indent')"}), + expect: "foo\nbar" + })); }); it("parse", () => { From ee0572764fde7652c0f85d6df2cac648978b93f2 Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 16:10:51 +0800 Subject: [PATCH 24/38] Update inline-js-core --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 93aa72b..a868d28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -933,9 +933,9 @@ "dev": true }, "inline-js-core": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/inline-js-core/-/inline-js-core-0.2.0.tgz", - "integrity": "sha512-gKRKQBVQaIKxin3k+3v95WKTah5RnQum/pNcCK7lrwrbkqDrXniadBMZblCKchOu4a8/wa6Zvto4y/2ygSAIOA==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/inline-js-core/-/inline-js-core-0.3.0.tgz", + "integrity": "sha512-OO7ttC7C0kV9WTExCPKfM0qnl6j3G3ibxmr18DFe1SFjxJPkbj4uN1zhKCV2oZQUwuac3vIph4mudvQMkiwVSA==", "requires": { "js-tokens": "^4.0.0" } diff --git a/package.json b/package.json index b88f8ee..ca1e177 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "dependencies": { "clean-css": "^4.1.11", "fs-extra": "^6.0.1", - "inline-js-core": "^0.2.0", + "inline-js-core": "^0.3.0", "is-binary-path": "^2.0.0", "mime": "^2.3.1", "neodoc": "^2.0.0", From 2972f44d4277d8b6db3a452a1014c1d9252729ac Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 16:39:47 +0800 Subject: [PATCH 25/38] Add: functional test --- package-lock.json | 9 +++++++++ package.json | 3 ++- test/functional/.inline.js | 23 +++++++++++++++++++++++ test/functional/entry.txt | 1 + test/functional/foo.txt | 1 + test/test.js | 18 ++++++++++++++++++ 6 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 test/functional/.inline.js create mode 100644 test/functional/entry.txt create mode 100644 test/functional/foo.txt diff --git a/package-lock.json b/package-lock.json index a868d28..5e0e8c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4299,6 +4299,15 @@ "tweetnacl": "~0.14.0" } }, + "std-mocks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/std-mocks/-/std-mocks-1.0.1.tgz", + "integrity": "sha1-0ziIdte+66PHD72OK8r0brB9ef4=", + "dev": true, + "requires": { + "lodash": "^4.11.1" + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", diff --git a/package.json b/package.json index ca1e177..95facd0 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,8 @@ "eslint": "^4.19.1", "mocha": "^5.2.0", "mocha-context": "^0.1.2", - "nyc": "^11.8.0" + "nyc": "^11.8.0", + "std-mocks": "^1.0.1" }, "repository": "eight04/inline-js" } diff --git a/test/functional/.inline.js b/test/functional/.inline.js new file mode 100644 index 0000000..72a337f --- /dev/null +++ b/test/functional/.inline.js @@ -0,0 +1,23 @@ +const fs = require("fs"); + +module.exports = { + shortcuts: [{ + name: "my-shortcut", + expand: "my-resource:foo.txt|my-transform" + }], + transforms: [{ + name: "my-transform", + transform(ctx, content) { + return `Hello ${content}`; + } + }], + resources: [{ + name: "my-resource", + read(source, target) { + if (target.args[0] === "foo.txt") { + return fs.readFileSync(`${__dirname}/foo.txt`, "utf8"); + } + throw new Error("Unknown file"); + } + }] +}; diff --git a/test/functional/entry.txt b/test/functional/entry.txt new file mode 100644 index 0000000..6741637 --- /dev/null +++ b/test/functional/entry.txt @@ -0,0 +1 @@ + $inline.line("my-shortcut"); \ No newline at end of file diff --git a/test/functional/foo.txt b/test/functional/foo.txt new file mode 100644 index 0000000..ed69e5d --- /dev/null +++ b/test/functional/foo.txt @@ -0,0 +1 @@ +I am foo \ No newline at end of file diff --git a/test/test.js b/test/test.js index 9b11c22..0b6c7a7 100644 --- a/test/test.js +++ b/test/test.js @@ -1,6 +1,7 @@ /* eslint-env mocha */ const assert = require("assert"); const sinon = require("sinon"); +const stdMocks = require("std-mocks"); describe("transforms", () => { const {DEFAULT_TRANSFORMS} = require("../lib/default-transforms"); @@ -324,3 +325,20 @@ describe("conf", () => { }); }); }); + +describe("functional", () => { + const {init} = require(".."); + + it("small example", () => { + stdMocks.use(); + return init({ + "": `${__dirname}/functional/entry.txt` + }) + .catch(() => {}) + .then(() => { + stdMocks.restore(); + const output = stdMocks.flush().stdout.join(""); + assert.equal(output, " Hello I am foo"); + }); + }); +}); From 43f25a1c3b8c85872b1cf442f502f6f19068e0c7 Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 16:43:12 +0800 Subject: [PATCH 26/38] Fix: config is not loaded --- index.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/index.js b/index.js index 40b02bb..c27b3a4 100644 --- a/index.js +++ b/index.js @@ -18,17 +18,18 @@ function init({ DEFAULT_TRANSFORMS.forEach(inliner.transformer.add); return findConfig(file) - .then(config => { - if (config) { - console.error(`Use config file: ${config.confPath}`); - if (config.resources) { - config.resources.forEach(inliner.resource.add); + .then(result => { + if (result) { + const {conf, confPath} = result; + console.error(`Use config file: ${confPath}`); + if (conf.resources) { + conf.resources.forEach(inliner.resource.add); } - if (config.transforms) { - config.transforms.forEach(inliner.transformer.add); + if (conf.transforms) { + conf.transforms.forEach(inliner.transformer.add); } - if (config.shortcuts) { - config.shorcuts.forEach(inliner.globalShortcuts.add); + if (conf.shortcuts) { + conf.shortcuts.forEach(inliner.globalShortcuts.add); } } console.error("inline-js started\n"); From bec6341ad562863da6de3aa8418c36c8c6bea1a9 Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 17:40:51 +0800 Subject: [PATCH 27/38] Test: make funtional test nest deeper --- index.js | 3 ++- test/functional/.inline.js | 6 +++--- test/functional/bar.txt | 1 + test/functional/foo.txt | 2 +- test/test.js | 4 ++-- 5 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 test/functional/bar.txt diff --git a/index.js b/index.js index c27b3a4..28a5850 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,4 @@ +const path = require("path"); const fse = require("fs-extra"); const treeify = require("treeify"); const {createInliner} = require("inline-js-core"); @@ -37,7 +38,7 @@ function init({ }) .then(({content, dependency}) => { console.error(`Result inline tree:`); - console.error(file); + console.error(path.resolve(file)); console.error(treeify.asTree(dependency)); if (dryRun) { diff --git a/test/functional/.inline.js b/test/functional/.inline.js index 72a337f..5ae68d8 100644 --- a/test/functional/.inline.js +++ b/test/functional/.inline.js @@ -3,7 +3,7 @@ const fs = require("fs"); module.exports = { shortcuts: [{ name: "my-shortcut", - expand: "my-resource:foo.txt|my-transform" + expand: "foo.txt|my-transform" }], transforms: [{ name: "my-transform", @@ -14,8 +14,8 @@ module.exports = { resources: [{ name: "my-resource", read(source, target) { - if (target.args[0] === "foo.txt") { - return fs.readFileSync(`${__dirname}/foo.txt`, "utf8"); + if (target.args[0] === "bar.txt") { + return fs.readFileSync(`${__dirname}/bar.txt`, "utf8"); } throw new Error("Unknown file"); } diff --git a/test/functional/bar.txt b/test/functional/bar.txt new file mode 100644 index 0000000..4e50788 --- /dev/null +++ b/test/functional/bar.txt @@ -0,0 +1 @@ +I am bar \ No newline at end of file diff --git a/test/functional/foo.txt b/test/functional/foo.txt index ed69e5d..3c8bb14 100644 --- a/test/functional/foo.txt +++ b/test/functional/foo.txt @@ -1 +1 @@ -I am foo \ No newline at end of file +$inline("my-resource:bar.txt") \ No newline at end of file diff --git a/test/test.js b/test/test.js index 0b6c7a7..e72c5c2 100644 --- a/test/test.js +++ b/test/test.js @@ -337,8 +337,8 @@ describe("functional", () => { .catch(() => {}) .then(() => { stdMocks.restore(); - const output = stdMocks.flush().stdout.join(""); - assert.equal(output, " Hello I am foo"); + const output = stdMocks.flush(); + assert.equal(output.stdout.join(""), " Hello I am bar"); }); }); }); From eaca18e8da916744e0afc807a6b6ca7ab4ce4d2d Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 17:45:59 +0800 Subject: [PATCH 28/38] Fix: use getLineRange and getWhitespace --- lib/default-transforms.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/default-transforms.js b/lib/default-transforms.js index 6cb777c..606a23e 100644 --- a/lib/default-transforms.js +++ b/lib/default-transforms.js @@ -1,11 +1,11 @@ const vm = require("vm"); const mime = require("mime"); const CleanCSS = require("clean-css"); +const {getLineRange, getWhitespace} = require("inline-js-core/lib/parser"); +const {PATH_LIKE} = require("./default-resources"); const cleanCss = new CleanCSS; -const {PATH_LIKE} = require("./default-resources"); - const DEFAULT_TRANSFORMS = [{ name: "string", transform(ctx, content, encoding = "utf8") { @@ -27,10 +27,8 @@ const DEFAULT_TRANSFORMS = [{ }, { name: "indent", transform(ctx, content) { - const lineStart = ctx.sourceContent.lastIndexOf("\n", ctx.inlineDirective.start - 1) + 1; - const rx = /\s*/y; - rx.lastIndex = lineStart; - const indent = rx.exec(ctx.sourceContent)[0]; + const lineStart = getLineRange(ctx.sourceContent, ctx.inlineDirective.start).start; + const indent = getWhitespace(ctx.sourceContent, lineStart); if (!indent) { return content; } From 36fa347431980ecd2f0f9abbbb8a1bb166756bee Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 17:46:09 +0800 Subject: [PATCH 29/38] Update core --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5e0e8c7..acaf2f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -933,9 +933,9 @@ "dev": true }, "inline-js-core": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/inline-js-core/-/inline-js-core-0.3.0.tgz", - "integrity": "sha512-OO7ttC7C0kV9WTExCPKfM0qnl6j3G3ibxmr18DFe1SFjxJPkbj4uN1zhKCV2oZQUwuac3vIph4mudvQMkiwVSA==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/inline-js-core/-/inline-js-core-0.3.1.tgz", + "integrity": "sha512-6JaHtN79NMcFTqK3Plim9shuEawQi1DHaCJfKK5+QRMeJzHmgPWGdUbOTCGT6A90gj73cbwUGhbZ8YiwgLFWvw==", "requires": { "js-tokens": "^4.0.0" } diff --git a/package.json b/package.json index 95facd0..8484bee 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "dependencies": { "clean-css": "^4.1.11", "fs-extra": "^6.0.1", - "inline-js-core": "^0.3.0", + "inline-js-core": "^0.3.1", "is-binary-path": "^2.0.0", "mime": "^2.3.1", "neodoc": "^2.0.0", From a059702d8475af5f1c2a9b1084939913e2913be4 Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 19:11:08 +0800 Subject: [PATCH 30/38] Test: output --- index.js | 7 ++++--- test/test.js | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 28a5850..bbc5dde 100644 --- a/index.js +++ b/index.js @@ -11,8 +11,9 @@ function init({ "--out": out, "--dry-run": dryRun, "--max-depth": maxDepth, - "": file -}) { + "": file, + _outputFileSync = fse.outputFileSync +} = {}) { const inliner = createInliner({maxDepth}); DEFAULT_RESOURCES.forEach(inliner.resource.add); @@ -44,7 +45,7 @@ function init({ if (dryRun) { console.error(`[dry] Output to ${out || "stdout"}`); } else if (out) { - fse.outputFileSync(out, content); + _outputFileSync(out, content); } else { process.stdout.write(content); } diff --git a/test/test.js b/test/test.js index e72c5c2..65b948d 100644 --- a/test/test.js +++ b/test/test.js @@ -341,4 +341,20 @@ describe("functional", () => { assert.equal(output.stdout.join(""), " Hello I am bar"); }); }); + + it("output", () => { + let filename, content; + return init({ + "": `${__dirname}/functional/entry.txt`, + "--out": "foo.txt", + _outputFileSync: (_filename, _content) => { + filename = _filename; + content = _content; + } + }) + .then(() => { + assert.equal(filename, "foo.txt"); + assert.equal(content, " Hello I am bar"); + }); + }); }); From d0686a1fddf300a4b982fbf8253556f734166965 Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 19:24:37 +0800 Subject: [PATCH 31/38] Test: empty config/no config --- index.js | 2 +- test/empty-config/.inline.js | 1 + test/empty-config/bar.txt | 1 + test/empty-config/entry.txt | 1 + test/empty-config/foo.txt | 1 + test/no-config/bar.txt | 1 + test/no-config/entry.txt | 1 + test/no-config/foo.txt | 1 + test/test.js | 62 ++++++++++++++++++++++++++++++++++++ 9 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 test/empty-config/.inline.js create mode 100644 test/empty-config/bar.txt create mode 100644 test/empty-config/entry.txt create mode 100644 test/empty-config/foo.txt create mode 100644 test/no-config/bar.txt create mode 100644 test/no-config/entry.txt create mode 100644 test/no-config/foo.txt diff --git a/index.js b/index.js index bbc5dde..0d84737 100644 --- a/index.js +++ b/index.js @@ -13,7 +13,7 @@ function init({ "--max-depth": maxDepth, "": file, _outputFileSync = fse.outputFileSync -} = {}) { +}) { const inliner = createInliner({maxDepth}); DEFAULT_RESOURCES.forEach(inliner.resource.add); diff --git a/test/empty-config/.inline.js b/test/empty-config/.inline.js new file mode 100644 index 0000000..c6035e5 --- /dev/null +++ b/test/empty-config/.inline.js @@ -0,0 +1 @@ +// do nothing diff --git a/test/empty-config/bar.txt b/test/empty-config/bar.txt new file mode 100644 index 0000000..4e50788 --- /dev/null +++ b/test/empty-config/bar.txt @@ -0,0 +1 @@ +I am bar \ No newline at end of file diff --git a/test/empty-config/entry.txt b/test/empty-config/entry.txt new file mode 100644 index 0000000..f7f87df --- /dev/null +++ b/test/empty-config/entry.txt @@ -0,0 +1 @@ +$inline("foo.txt") \ No newline at end of file diff --git a/test/empty-config/foo.txt b/test/empty-config/foo.txt new file mode 100644 index 0000000..77ffdcd --- /dev/null +++ b/test/empty-config/foo.txt @@ -0,0 +1 @@ +$inline("bar.txt") \ No newline at end of file diff --git a/test/no-config/bar.txt b/test/no-config/bar.txt new file mode 100644 index 0000000..4e50788 --- /dev/null +++ b/test/no-config/bar.txt @@ -0,0 +1 @@ +I am bar \ No newline at end of file diff --git a/test/no-config/entry.txt b/test/no-config/entry.txt new file mode 100644 index 0000000..f7f87df --- /dev/null +++ b/test/no-config/entry.txt @@ -0,0 +1 @@ +$inline("foo.txt") \ No newline at end of file diff --git a/test/no-config/foo.txt b/test/no-config/foo.txt new file mode 100644 index 0000000..77ffdcd --- /dev/null +++ b/test/no-config/foo.txt @@ -0,0 +1 @@ +$inline("bar.txt") \ No newline at end of file diff --git a/test/test.js b/test/test.js index 65b948d..293a60a 100644 --- a/test/test.js +++ b/test/test.js @@ -357,4 +357,66 @@ describe("functional", () => { assert.equal(content, " Hello I am bar"); }); }); + + it("dry + out", () => { + const _outputFileSync = sinon.spy(); + return init({ + "": `${__dirname}/functional/entry.txt`, + "--out": "foo.txt", + "--dry-run": true, + _outputFileSync + }) + .then(() => { + assert(!_outputFileSync.called); + }); + }); + + it("dry + stdout", () => { + stdMocks.use(); + return init({ + "": `${__dirname}/functional/entry.txt`, + "--dry-run": true + }) + .catch(err => { + stdMocks.restore(); + throw err; + }) + .then(() => { + stdMocks.restore(); + const output = stdMocks.flush().stdout.join(""); + assert.equal(output, ""); + }); + }); + + it("no config", () => { + let filename, content; + return init({ + "": `${__dirname}/no-config/entry.txt`, + "--out": "foo.txt", + _outputFileSync: (_filename, _content) => { + filename = _filename; + content = _content; + } + }) + .then(() => { + assert.equal(filename, "foo.txt"); + assert.equal(content, "I am bar"); + }); + }); + + it("empty config", () => { + let filename, content; + return init({ + "": `${__dirname}/no-config/entry.txt`, + "--out": "foo.txt", + _outputFileSync: (_filename, _content) => { + filename = _filename; + content = _content; + } + }) + .then(() => { + assert.equal(filename, "foo.txt"); + assert.equal(content, "I am bar"); + }); + }); }); From 3c2218ab3448eff82209482e28a12e9b85b63128 Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 19:34:27 +0800 Subject: [PATCH 32/38] Fix: print welcome message at start --- index.js | 2 +- test/{ => functional}/empty-config/.inline.js | 0 test/{ => functional}/empty-config/bar.txt | 0 test/{ => functional}/empty-config/entry.txt | 0 .../{bar.txt => empty-config/expect.txt} | 0 test/{ => functional}/empty-config/foo.txt | 0 test/functional/{ => full-config}/.inline.js | 0 .../full-config}/bar.txt | 0 test/functional/{ => full-config}/entry.txt | 0 test/functional/full-config/expect.txt | 1 + test/functional/{ => full-config}/foo.txt | 0 test/functional/no-config/bar.txt | 1 + test/{ => functional}/no-config/entry.txt | 0 test/functional/no-config/expect.txt | 1 + test/{ => functional}/no-config/foo.txt | 0 test/test.js | 68 ++++++------------- 16 files changed, 25 insertions(+), 48 deletions(-) rename test/{ => functional}/empty-config/.inline.js (100%) rename test/{ => functional}/empty-config/bar.txt (100%) rename test/{ => functional}/empty-config/entry.txt (100%) rename test/functional/{bar.txt => empty-config/expect.txt} (100%) rename test/{ => functional}/empty-config/foo.txt (100%) rename test/functional/{ => full-config}/.inline.js (100%) rename test/{no-config => functional/full-config}/bar.txt (100%) rename test/functional/{ => full-config}/entry.txt (100%) create mode 100644 test/functional/full-config/expect.txt rename test/functional/{ => full-config}/foo.txt (100%) create mode 100644 test/functional/no-config/bar.txt rename test/{ => functional}/no-config/entry.txt (100%) create mode 100644 test/functional/no-config/expect.txt rename test/{ => functional}/no-config/foo.txt (100%) diff --git a/index.js b/index.js index 0d84737..57f194e 100644 --- a/index.js +++ b/index.js @@ -19,6 +19,7 @@ function init({ DEFAULT_RESOURCES.forEach(inliner.resource.add); DEFAULT_TRANSFORMS.forEach(inliner.transformer.add); + console.error("inline-js started\n"); return findConfig(file) .then(result => { if (result) { @@ -34,7 +35,6 @@ function init({ conf.shortcuts.forEach(inliner.globalShortcuts.add); } } - console.error("inline-js started\n"); return inliner.inline({name: "text", args: [file]}); }) .then(({content, dependency}) => { diff --git a/test/empty-config/.inline.js b/test/functional/empty-config/.inline.js similarity index 100% rename from test/empty-config/.inline.js rename to test/functional/empty-config/.inline.js diff --git a/test/empty-config/bar.txt b/test/functional/empty-config/bar.txt similarity index 100% rename from test/empty-config/bar.txt rename to test/functional/empty-config/bar.txt diff --git a/test/empty-config/entry.txt b/test/functional/empty-config/entry.txt similarity index 100% rename from test/empty-config/entry.txt rename to test/functional/empty-config/entry.txt diff --git a/test/functional/bar.txt b/test/functional/empty-config/expect.txt similarity index 100% rename from test/functional/bar.txt rename to test/functional/empty-config/expect.txt diff --git a/test/empty-config/foo.txt b/test/functional/empty-config/foo.txt similarity index 100% rename from test/empty-config/foo.txt rename to test/functional/empty-config/foo.txt diff --git a/test/functional/.inline.js b/test/functional/full-config/.inline.js similarity index 100% rename from test/functional/.inline.js rename to test/functional/full-config/.inline.js diff --git a/test/no-config/bar.txt b/test/functional/full-config/bar.txt similarity index 100% rename from test/no-config/bar.txt rename to test/functional/full-config/bar.txt diff --git a/test/functional/entry.txt b/test/functional/full-config/entry.txt similarity index 100% rename from test/functional/entry.txt rename to test/functional/full-config/entry.txt diff --git a/test/functional/full-config/expect.txt b/test/functional/full-config/expect.txt new file mode 100644 index 0000000..7d9c5a6 --- /dev/null +++ b/test/functional/full-config/expect.txt @@ -0,0 +1 @@ + Hello I am bar \ No newline at end of file diff --git a/test/functional/foo.txt b/test/functional/full-config/foo.txt similarity index 100% rename from test/functional/foo.txt rename to test/functional/full-config/foo.txt diff --git a/test/functional/no-config/bar.txt b/test/functional/no-config/bar.txt new file mode 100644 index 0000000..4e50788 --- /dev/null +++ b/test/functional/no-config/bar.txt @@ -0,0 +1 @@ +I am bar \ No newline at end of file diff --git a/test/no-config/entry.txt b/test/functional/no-config/entry.txt similarity index 100% rename from test/no-config/entry.txt rename to test/functional/no-config/entry.txt diff --git a/test/functional/no-config/expect.txt b/test/functional/no-config/expect.txt new file mode 100644 index 0000000..4e50788 --- /dev/null +++ b/test/functional/no-config/expect.txt @@ -0,0 +1 @@ +I am bar \ No newline at end of file diff --git a/test/no-config/foo.txt b/test/functional/no-config/foo.txt similarity index 100% rename from test/no-config/foo.txt rename to test/functional/no-config/foo.txt diff --git a/test/test.js b/test/test.js index 293a60a..623a396 100644 --- a/test/test.js +++ b/test/test.js @@ -1,4 +1,5 @@ /* eslint-env mocha */ +const fs = require("fs"); const assert = require("assert"); const sinon = require("sinon"); const stdMocks = require("std-mocks"); @@ -329,23 +330,28 @@ describe("conf", () => { describe("functional", () => { const {init} = require(".."); - it("small example", () => { - stdMocks.use(); - return init({ - "": `${__dirname}/functional/entry.txt` - }) - .catch(() => {}) - .then(() => { - stdMocks.restore(); - const output = stdMocks.flush(); - assert.equal(output.stdout.join(""), " Hello I am bar"); - }); - }); + for (const dir of fs.readdirSync(`${__dirname}/functional`)) { + it(dir, () => { + stdMocks.use(); + return init({ + "": `${__dirname}/functional/${dir}/entry.txt` + }) + .catch(err => { + stdMocks.restore(); + throw err; + }) + .then(() => { + stdMocks.restore(); + const output = stdMocks.flush().stdout.join(""); + assert.equal(output, fs.readFileSync(`${__dirname}/functional/${dir}/expect.txt`)); + }); + }); + } it("output", () => { let filename, content; return init({ - "": `${__dirname}/functional/entry.txt`, + "": `${__dirname}/functional/full-config/entry.txt`, "--out": "foo.txt", _outputFileSync: (_filename, _content) => { filename = _filename; @@ -361,7 +367,7 @@ describe("functional", () => { it("dry + out", () => { const _outputFileSync = sinon.spy(); return init({ - "": `${__dirname}/functional/entry.txt`, + "": `${__dirname}/functional/full-config/entry.txt`, "--out": "foo.txt", "--dry-run": true, _outputFileSync @@ -374,7 +380,7 @@ describe("functional", () => { it("dry + stdout", () => { stdMocks.use(); return init({ - "": `${__dirname}/functional/entry.txt`, + "": `${__dirname}/functional/full-config/entry.txt`, "--dry-run": true }) .catch(err => { @@ -387,36 +393,4 @@ describe("functional", () => { assert.equal(output, ""); }); }); - - it("no config", () => { - let filename, content; - return init({ - "": `${__dirname}/no-config/entry.txt`, - "--out": "foo.txt", - _outputFileSync: (_filename, _content) => { - filename = _filename; - content = _content; - } - }) - .then(() => { - assert.equal(filename, "foo.txt"); - assert.equal(content, "I am bar"); - }); - }); - - it("empty config", () => { - let filename, content; - return init({ - "": `${__dirname}/no-config/entry.txt`, - "--out": "foo.txt", - _outputFileSync: (_filename, _content) => { - filename = _filename; - content = _content; - } - }) - .then(() => { - assert.equal(filename, "foo.txt"); - assert.equal(content, "I am bar"); - }); - }); }); From 763a595850b76ec298c13fd576c827badac0c9b0 Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 19:57:11 +0800 Subject: [PATCH 33/38] Test: use DI to test io --- .eslintrc.json | 5 ++--- index.js | 18 ++++++++++-------- package-lock.json | 9 --------- package.json | 3 +-- test/test.js | 31 +++++++++++-------------------- 5 files changed, 24 insertions(+), 42 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 1582cc5..1910bb4 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -4,9 +4,8 @@ "node": true }, "rules": { - "no-console": 0, - "no-use-before-define": ["error", "nofunc"], - "semi": ["error", "always"] + "max-statements-per-line": 2, + "semi": [2, "always"] }, "extends": [ "eslint:recommended" diff --git a/index.js b/index.js index 57f194e..9fd5a52 100644 --- a/index.js +++ b/index.js @@ -12,19 +12,21 @@ function init({ "--dry-run": dryRun, "--max-depth": maxDepth, "": file, - _outputFileSync = fse.outputFileSync + _outputFileSync = fse.outputFileSync, + _log = console.error, // eslint-disable-line no-console + _write = process.stdout.write.bind(process.stdout) }) { const inliner = createInliner({maxDepth}); DEFAULT_RESOURCES.forEach(inliner.resource.add); DEFAULT_TRANSFORMS.forEach(inliner.transformer.add); - console.error("inline-js started\n"); + _log("inline-js started\n"); return findConfig(file) .then(result => { if (result) { const {conf, confPath} = result; - console.error(`Use config file: ${confPath}`); + _log(`Use config file: ${confPath}`); if (conf.resources) { conf.resources.forEach(inliner.resource.add); } @@ -38,16 +40,16 @@ function init({ return inliner.inline({name: "text", args: [file]}); }) .then(({content, dependency}) => { - console.error(`Result inline tree:`); - console.error(path.resolve(file)); - console.error(treeify.asTree(dependency)); + _log(`Result inline tree:`); + _log(path.resolve(file)); + _log(treeify.asTree(dependency)); if (dryRun) { - console.error(`[dry] Output to ${out || "stdout"}`); + _log(`[dry] Output to ${out || "stdout"}`); } else if (out) { _outputFileSync(out, content); } else { - process.stdout.write(content); + _write(content); } }); } diff --git a/package-lock.json b/package-lock.json index acaf2f5..8cd7b8d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4299,15 +4299,6 @@ "tweetnacl": "~0.14.0" } }, - "std-mocks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/std-mocks/-/std-mocks-1.0.1.tgz", - "integrity": "sha1-0ziIdte+66PHD72OK8r0brB9ef4=", - "dev": true, - "requires": { - "lodash": "^4.11.1" - } - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", diff --git a/package.json b/package.json index 8484bee..40e3983 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,7 @@ "eslint": "^4.19.1", "mocha": "^5.2.0", "mocha-context": "^0.1.2", - "nyc": "^11.8.0", - "std-mocks": "^1.0.1" + "nyc": "^11.8.0" }, "repository": "eight04/inline-js" } diff --git a/test/test.js b/test/test.js index 623a396..5511862 100644 --- a/test/test.js +++ b/test/test.js @@ -2,7 +2,6 @@ const fs = require("fs"); const assert = require("assert"); const sinon = require("sinon"); -const stdMocks = require("std-mocks"); describe("transforms", () => { const {DEFAULT_TRANSFORMS} = require("../lib/default-transforms"); @@ -332,23 +331,20 @@ describe("functional", () => { for (const dir of fs.readdirSync(`${__dirname}/functional`)) { it(dir, () => { - stdMocks.use(); + let content; return init({ - "": `${__dirname}/functional/${dir}/entry.txt` + "": `${__dirname}/functional/${dir}/entry.txt`, + _write: _content => { + content = _content; + } }) - .catch(err => { - stdMocks.restore(); - throw err; - }) .then(() => { - stdMocks.restore(); - const output = stdMocks.flush().stdout.join(""); - assert.equal(output, fs.readFileSync(`${__dirname}/functional/${dir}/expect.txt`)); + assert.equal(content, fs.readFileSync(`${__dirname}/functional/${dir}/expect.txt`, "utf8")); }); }); } - it("output", () => { + it("output file", () => { let filename, content; return init({ "": `${__dirname}/functional/full-config/entry.txt`, @@ -378,19 +374,14 @@ describe("functional", () => { }); it("dry + stdout", () => { - stdMocks.use(); + const _write = sinon.spy(); return init({ "": `${__dirname}/functional/full-config/entry.txt`, - "--dry-run": true + "--dry-run": true, + _write }) - .catch(err => { - stdMocks.restore(); - throw err; - }) .then(() => { - stdMocks.restore(); - const output = stdMocks.flush().stdout.join(""); - assert.equal(output, ""); + assert(!_write.called); }); }); }); From 4c71033cdc428b9031814d7d891c4af5fe8b44c1 Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 20:10:41 +0800 Subject: [PATCH 34/38] Fix: outputFileSync -> outputFile --- index.js | 4 ++-- test/test.js | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/index.js b/index.js index 9fd5a52..067ad7b 100644 --- a/index.js +++ b/index.js @@ -12,7 +12,7 @@ function init({ "--dry-run": dryRun, "--max-depth": maxDepth, "": file, - _outputFileSync = fse.outputFileSync, + _outputFile = fse.outputFile, _log = console.error, // eslint-disable-line no-console _write = process.stdout.write.bind(process.stdout) }) { @@ -47,7 +47,7 @@ function init({ if (dryRun) { _log(`[dry] Output to ${out || "stdout"}`); } else if (out) { - _outputFileSync(out, content); + return _outputFile(out, content); } else { _write(content); } diff --git a/test/test.js b/test/test.js index 5511862..8638c8d 100644 --- a/test/test.js +++ b/test/test.js @@ -349,7 +349,7 @@ describe("functional", () => { return init({ "": `${__dirname}/functional/full-config/entry.txt`, "--out": "foo.txt", - _outputFileSync: (_filename, _content) => { + _outputFile: (_filename, _content) => { filename = _filename; content = _content; } @@ -361,15 +361,15 @@ describe("functional", () => { }); it("dry + out", () => { - const _outputFileSync = sinon.spy(); + const _outputFile = sinon.spy(); return init({ "": `${__dirname}/functional/full-config/entry.txt`, "--out": "foo.txt", "--dry-run": true, - _outputFileSync + _outputFile }) .then(() => { - assert(!_outputFileSync.called); + assert(!_outputFile.called); }); }); From 0a1c0b754f570343f0ee10062b30c7ca9915d46e Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 20:15:29 +0800 Subject: [PATCH 35/38] Fix: sinon is dev-dependency --- package-lock.json | 32 +++++++++++++++++++++++--------- package.json | 4 ++-- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8cd7b8d..ca18e1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", + "dev": true, "requires": { "samsam": "1.3.0" } @@ -472,7 +473,8 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true }, "doctrine": { "version": "2.1.0", @@ -858,7 +860,8 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "hawk": { "version": "6.0.2", @@ -1105,7 +1108,8 @@ "just-extend": { "version": "1.1.27", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz", - "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==" + "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==", + "dev": true }, "lcov-parse": { "version": "0.0.10", @@ -1132,7 +1136,8 @@ "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true }, "log-driver": { "version": "1.2.7", @@ -1143,7 +1148,8 @@ "lolex": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.6.0.tgz", - "integrity": "sha512-e1UtIo1pbrIqEXib/yMjHciyqkng5lc0rrIbytgjmRgDR9+2ceNIAcwOWSgylRjoEP9VdVguCSRwnNmlbnOUwA==" + "integrity": "sha512-e1UtIo1pbrIqEXib/yMjHciyqkng5lc0rrIbytgjmRgDR9+2ceNIAcwOWSgylRjoEP9VdVguCSRwnNmlbnOUwA==", + "dev": true }, "lru-cache": { "version": "4.1.3", @@ -1288,6 +1294,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/nise/-/nise-1.3.3.tgz", "integrity": "sha512-v1J/FLUB9PfGqZLGDBhQqODkbLotP0WtLo9R4EJY2PPu5f5Xg4o0rA8FDlmrjFSv9vBBKcfnOSpfYYuu5RTHqg==", + "dev": true, "requires": { "@sinonjs/formatio": "^2.0.0", "just-extend": "^1.1.27", @@ -3997,6 +4004,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, "requires": { "isarray": "0.0.1" }, @@ -4004,7 +4012,8 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true } } }, @@ -4201,7 +4210,8 @@ "samsam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", - "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==" + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "dev": true }, "semver": { "version": "5.5.0", @@ -4234,6 +4244,7 @@ "version": "5.0.7", "resolved": "https://registry.npmjs.org/sinon/-/sinon-5.0.7.tgz", "integrity": "sha512-GvNLrwpvLZ8jIMZBUhHGUZDq5wlUdceJWyHvZDmqBxnjazpxY1L0FNbGBX6VpcOEoQ8Q4XMWFzm2myJMvx+VjA==", + "dev": true, "requires": { "@sinonjs/formatio": "^2.0.0", "diff": "^3.1.0", @@ -4248,6 +4259,7 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -4364,7 +4376,8 @@ "text-encoding": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", - "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=" + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "dev": true }, "text-table": { "version": "0.2.0", @@ -4438,7 +4451,8 @@ "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true }, "typedarray": { "version": "0.0.6", diff --git a/package.json b/package.json index 40e3983..2b3bf60 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,6 @@ "mime": "^2.3.1", "neodoc": "^2.0.0", "node-require-async": "^0.1.1", - "sinon": "^5.0.7", "treeify": "^1.1.0" }, "devDependencies": { @@ -36,7 +35,8 @@ "eslint": "^4.19.1", "mocha": "^5.2.0", "mocha-context": "^0.1.2", - "nyc": "^11.8.0" + "nyc": "^11.8.0", + "sinon": "^5.0.7" }, "repository": "eight04/inline-js" } From d92a5d11210a36483cbe655512cac52fb63797ba Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 20:23:24 +0800 Subject: [PATCH 36/38] Fix: badge branch --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 71b0d1f..c942140 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ inline-js ========= -[![Build Status](https://travis-ci.org/eight04/inline-js.svg?branch=dev-async)](https://travis-ci.org/eight04/inline-js) -[![Coverage Status](https://coveralls.io/repos/github/eight04/inline-js/badge.svg?branch=dev-async)](https://coveralls.io/github/eight04/inline-js?branch=dev-async) +[![Build Status](https://travis-ci.org/eight04/inline-js.svg?branch=master)](https://travis-ci.org/eight04/inline-js) +[![Coverage Status](https://coveralls.io/repos/github/eight04/inline-js/badge.svg?branch=master)](https://coveralls.io/github/eight04/inline-js?branch=master) [![install size](https://packagephobia.now.sh/badge?p=inline-js)](https://packagephobia.now.sh/result?p=inline-js) A static assets inliner, like PHP's `include`, with transformer! From c769048a7c2121ff27fb330c573ef2caa11d4702 Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 20:40:45 +0800 Subject: [PATCH 37/38] Update changelog --- README.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/README.md b/README.md index c942140..e0101dd 100644 --- a/README.md +++ b/README.md @@ -254,6 +254,28 @@ Eval JavaScript expression. You can access the content with `$0`. var version = $inline("./package.json|eval:JSON.parse($0).version|stringify"); ``` +### indent +Indent the string according the the indent of the current line. + +*foo.js* +```js +function foo() { + $inline("bar.js|indent"); +} +``` +*bar.js* +```js +console.log("foo"); +console.log("bar"); +``` +`inlinejs foo.js` result: +```js +function foo() { + console.log("foo"); + console.log("bar"); +} +``` + ### markdown Wrap content with markdown codeblock, code, or quote. ````js @@ -331,6 +353,23 @@ module.exports = { Changelog --------- +* 0.7.0 (May 23, 2018) + + - The core inliner logic had been splitted out as [inline-js-core](https://github.com/eight04/inline-js-core). This repository now only contains: + + - Config locator. + - Builtin resource loader. + - Builtin transformers. + + - More tests. + - Add: `indent` transformer. It would indent inlined file according to the indent of the current line. + - Add: config locator has a cache now. + - Add: `$inline()` now accepts up to 3 arguments. + - Fix: Escaped characters are correctly handled in `docstring` transformer. + - **Change: In `dataurl` transformer, `charset` is set to `utf8` if the content is a string. It makes sense since we actually always use `utf8` encoding to convert string to Buffer.** + - **Change: The first argument of `transform()` function is changed to a `transformContext` object. To access the resource, visit `transformContext.inlineTarget`.** + - **Change: `$inline.line()` now preserves indent. It doesn't replace the entire line anymore.** + * 0.6.1 (Mar 16, 2018) - Fix: throw when cmd resource return non-zero exit code. From 087e7e1a5c0ac1fd2b86c216b3ad260ebe5166fb Mon Sep 17 00:00:00 2001 From: eight Date: Wed, 23 May 2018 21:28:50 +0800 Subject: [PATCH 38/38] Update readme --- README.md | 100 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 62 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index e0101dd..4f15d83 100644 --- a/README.md +++ b/README.md @@ -17,11 +17,13 @@ Quick start ----------- You have two files, `a.txt` and `b.txt`. +*a.txt* ```js -// a.txt $inline("./b.txt"); +``` -// b.txt +*b.txt* +``` Hello world! ``` Run inline-js: @@ -55,15 +57,29 @@ An $inline directive is composed by: ```js const a = "the content of the resource"; ``` + + If you want to expand the replace range, pass offsets to the function: + + ```js + const a = /* $inline(resource, 3, 3) */; + ``` + Which would be converted to: + ```js + const a = the content of the resource; + ``` -* `$inline.line(resource)`: Entire line will be replaced. +* `$inline.line(resource)`: The entire line, excluding indent, will be replaced. ```js - /* $inline.line(resource) */ + function test() { + /* $inline.line(resource) */ + } ``` Which would be converted to: ```js - the content of the resource + function test() { + the content of the resource + } ``` ### Replace the text wrapped by a pair of directives @@ -95,18 +111,20 @@ An $inline directive is composed by: ### Define shortcuts -Shortcut is composed by a name and a expanding pattern. You can use `$1`, `$2`, ...`$9`, or `$&` to referece the parameters. +A shortcut is composed by a name and an expand pattern. You can use `$1`, `$2`, ...`$9`, or `$&` to referece the parameters. ```js -// $inline.shortcut("pkg", "../package.json|parse:$1") -var version = $inline("pkg:version"), - author = $inline("pkg:author"); +// $inline.shortcut("pkg", "../package.json|parse:$&") +const version = $inline("pkg:version"); +const author = $inline("pkg:author"); +const other = $inline("pkg:other,property"); ``` Which would be processed as: ```js -// $inline.shortcut("pkg", "../package.json|parse:$1") -var version = $inline("../package.json|parse:version"), - author = $inline("../package.json|parse:author"); +// $inline.shortcut("pkg", "../package.json|parse:$&") +const version = $inline("../package.json|parse:version"); +const author = $inline("../package.json|parse:author"); +const other = $inline("../package.json|parse:other,property"); ``` ### Ignore `$inline` directives @@ -130,10 +148,12 @@ $inline('path/to/file') // won't be processed $inline.skipEnd("skipThisSection") ``` +If `$inline.skipEnd` isn't presented, it would ignore the entire file. + Resource -------- -Resource is a JavaScript string so some characters (`'`, `"`) needs to be escaped. It uses [pipe expression](https://www.npmjs.com/package/haye#pipe-expression). If written in regular expression: +Resource is a JavaScript string so some characters (`'`, `"`) needs to be escaped. It uses pipe expression. If written in regular expression: ``` (resourceType:)? resourceParam (| transform (: param (,param)* )? )* @@ -153,11 +173,11 @@ $inline("path/to/file|transform1:param1,param2|transform2") Different resource type ----------------------- -inline-js can read content from different resources, which result in different type of the content (`string` or `Buffer`). The type of the content may also affect how transformers work (e.g. `dataurl` transformer). +inline-js can read content from different resources, which results in different types of the content (`string` or `Buffer`). The type of the content may also affect how transformers work (e.g. `dataurl` transformer). * `file`: Default type. It reads the content from a file path, which may be relative to the file which requires the resource. - The result could be a utf8 string or a `Buffer`, depending on the extension of the file. (See [is-binary-path](https://www.npmjs.com/package/is-binary-path)) + The result could be a utf8 string or a `Buffer`, depending on the extension of the file (see [is-binary-path](https://www.npmjs.com/package/is-binary-path)). * `text`: Like `file`, but the result is always a utf8 string. * `raw`: Like `file`, but the result is always a `Buffer`. @@ -171,31 +191,35 @@ File-like resources would be cached after loaded, so inlining the same file with Command resources are also cached, but it depends on cwd. For example: -* The command `cat myfile` is executed once, with `cwd = "."`. +* In this example, the command `cat myfile` is executed once, with `cwd = "."`. + *entry.txt* ```js - // entry.txt $inline("a.txt") $inline("b.txt") - - // a.txt + ``` + *a.txt* + ```js $inline("cmd:cat myfile") - - // b.txt + ``` + *b.txt* + ```js $inline("cmd:cat myfile") ``` -* The command is executed twice. The first with `cwd = "."` and the second with `cwd = "./dir"`. +* In this example, the command is executed twice. The first with `cwd = "."` and the second with `cwd = "./dir"`. + *entry.txt* ```js - // entry.txt $inline("a.txt") $inline("dir/b.txt") - - // a.txt + ``` + *a.txt* + ```js $inline("cmd:cat myfile") - - // dir/b.txt + ``` + *dir/b.txt* + ```js $inline("cmd:cat myfile") ``` @@ -240,37 +264,37 @@ Or you can pass the mimetype manually: ```js $inline("somefile.txt|dataurl:text/css") ``` -Specify charset (default to `utf8` for text file): +Specify charset (default to `utf8` for text files): ```js $inline("somefile.txt|dataurl:text/css,utf8") ``` ### docstring -Extract docstring (i.e. the first template literal) from the content. +Extract docstring (i.e. the top-most template literal) from the content. ### eval -Eval JavaScript expression. You can access the content with `$0`. +Evaluate JavaScript expression. You can access the content with `$0`. ```js var version = $inline("./package.json|eval:JSON.parse($0).version|stringify"); ``` ### indent -Indent the string according the the indent of the current line. +Indent the string according to the indent of the current line. -*foo.js* +*entry.js* ```js -function foo() { - $inline("bar.js|indent"); +function test() { + $inline("foo.js|indent"); } ``` -*bar.js* +*foo.js* ```js console.log("foo"); console.log("bar"); ``` -`inlinejs foo.js` result: +`inlinejs entry.js` result: ```js -function foo() { +function test() { console.log("foo"); console.log("bar"); } @@ -295,7 +319,7 @@ some text ```` ### parse -`JSON.parse` the content. You can access property by specify property name. +`JSON.parse` the content. You can access properties by specifying key name. ```js var version = $inline("./package.json|parse:version"), nestedProp = $inline("./package.json|parse:nested,prop");