diff --git a/.babelrc b/.babelrc deleted file mode 100644 index f8dfde2..0000000 --- a/.babelrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "presets": [ - ["env", { - "targets": { - "node": "4.0" - } - }] - ] -} diff --git a/.gitignore b/.gitignore index e8cf86f..580e70a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ temp/ coverage node_modules -examples *.log *.exe .idea diff --git a/.vscode/extensions.json b/.vscode/extensions.json index c9286e5..13026a1 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,5 +1,5 @@ { "recommendations": [ - "chenxsan.vscode-standardjs" + "esbenp.prettier-vscode" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 86a91a6..97bef4c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,3 @@ { - "standard.enable": true + "typescript.tsdk": "./node_modules/typescript/lib" } diff --git a/README.md b/README.md index cd382f1..337907c 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,8 @@ nexe.compile({ ### `options` + - `build: boolean` + - Build node from source (required in beta) - `input: string` - Input bundle file path - default: stdin or the current directory's main file (package.json) @@ -124,12 +126,6 @@ nexe.compile({ - Array of globs with files to include in the build - Example: `['./public/**/*']` - default: `[]` - - `bundle: boolean | string | object` - - `boolean`: indicating whether integrated bundling should be tried - - `string`: filepath to user-written webpack configuration - - `object`: user provided webpack configuration - - Example: `'./webpack.config.js'` - - default: `false` - `temp: string` - Path to use for storing nexe's build files - Override in the env with `NEXE_TEMP` @@ -162,10 +158,10 @@ nexe.compile({ A patch is just a middleware function that takes two arguments, the `compiler`, and `next`. The compiler is described below, and `next` ensures that the pipeline continues. Its invocation should always be awaited or returned to ensure correct behavior. -### `NexeCompiler` - For examples, see the built in patches: [src/patches](src/patches) +### `NexeCompiler` + - `setFileContentsAsync(filename: string, contents: string): Promise` - Quickly set a file's contents within the downloaded Node.js source. - `replaceInFileAsync(filename: string, ...replaceArgs): Promise` @@ -181,6 +177,15 @@ For examples, see the built in patches: [src/patches](src/patches) Any modifications made to `SourceFile#contents` will be maintained in the cache _without_ the need to explicitly write them back out, e.g. using `NexeCompiler#setFileContentsAsync`. +## Bundling + +Bundling in nexe has been decoupled from the compiler pipeline. While in beta it is completely seperate. Any bundler will always work with nexe as long a node-compatible bundle is created. + +### Native Modules + +Nexe has a plugin built for use with [fuse-box](http://fuse-box.org). This plugin currently supports modules that require `.node` files and those that use the `bindings` module. +Future plans are in place to support `node-pre-gyp#find`. Take a look at the [example](examples/native-build/build.js) + ## Security A common use case for Nexe is production deployment. When distributing executables it is important to [sign](https://en.wikipedia.org/wiki/Code_signing) them before distributing. Nexe was designed specifically to not mangle the binary it produces, this allows the checksum and signature of the size and location offsets to be maintained through the code signing process. diff --git a/examples/native-build/build.js b/examples/native-build/build.js new file mode 100644 index 0000000..3294adb --- /dev/null +++ b/examples/native-build/build.js @@ -0,0 +1,23 @@ +const { FuseBox } = require('fuse-box') +const nexe = '../..' +const { NativeModulePlugin } = require(nexe + '/lib/bundling/fuse') +const fuse = FuseBox.init({ + homeDir: './', + cache: false, + log: true, + debug: true, + output: '$name.js', + plugins: [ + new NativeModulePlugin({ + zmq: { + additionalFiles: [ + '../../windows/lib/x64/libzmq-v100-mt-4_0_4.dll' + ] + } + }) + ] +}) +fuse.bundle('app') + .target('electron') + .instructions(`> index.js`) +fuse.run() diff --git a/examples/native-build/index.js b/examples/native-build/index.js new file mode 100644 index 0000000..f9a4b53 --- /dev/null +++ b/examples/native-build/index.js @@ -0,0 +1,19 @@ +var zmq = require('zmq') +var pub = zmq.socket('pub') + +pub.bindSync('tcp://127.0.0.1:3000') +console.log('Publisher bound to port 3000') + +setInterval(function(){ + console.log('sending a multipart message envelope') + pub.send(['kitty cats', 'meow!']) +}, 2500) +console.log('global', global.require.main) +var sub = zmq.socket('sub') +sub.connect('tcp://127.0.0.1:3000') +sub.subscribe('kitty cats') +console.log('Subscriber connected to port 3000') + +sub.on('message', function(topic, message) { + console.log('received a message related to:', topic.toString(), 'containing message:', message.toString()) +}) diff --git a/examples/native-build/package.json b/examples/native-build/package.json new file mode 100644 index 0000000..23b53e6 --- /dev/null +++ b/examples/native-build/package.json @@ -0,0 +1,16 @@ +{ + "name": "native-build", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "bundle": "node build", + "build": "nexe -i app.js -o app.exe" + }, + "author": "", + "license": "ISC", + "dependencies": { + "fuse-box": "^2.2.0", + "zmq": "^2.15.3" + } +} diff --git a/index.js b/index.js index db704a7..7435c6a 100755 --- a/index.js +++ b/index.js @@ -5,6 +5,6 @@ module.exports = nexe if (require.main === module) { nexe.compile(nexe.argv).catch((e) => { - process.stderr.write(e.stack, () => process.exit(1)) + process.stderr.write(e.message, () => process.exit(1)) }) } diff --git a/package.json b/package.json index 49e5a30..a192eef 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,7 @@ "scripts": { "prebuild": "npm run clean", "clean": "rimraf lib", - "build": "babel src -d lib --copy-files", - "lint": "standard index.js ./src/**/* --fix", - "test": "npm run build && mocha" + "build": "prettier --parser typescript --no-semi --print-width 100 --single-quote --write \"src/**/*.ts\" && tsc --declaration" }, "repository": { "type": "git", @@ -44,10 +42,14 @@ "tar": "^3.1.3" }, "devDependencies": { - "babel-cli": "^6.24.1", - "babel-core": "^6.24.1", - "babel-preset-env": "^1.3.3", + "@types/bluebird": "^3.5.8", + "@types/chalk": "^0.4.31", + "@types/mkdirp": "^0.3.29", + "@types/ora": "^0.3.31", + "@types/rimraf": "0.0.28", "mocha": "^3.2.0", - "standard": "^10.0.1" + "prettier": "^1.4.4", + "standard": "^10.0.1", + "typescript": "^2.4.1" } } diff --git a/src/artifacts.js b/src/artifacts.ts similarity index 59% rename from src/artifacts.js rename to src/artifacts.ts index 918ba53..83f9120 100644 --- a/src/artifacts.js +++ b/src/artifacts.ts @@ -1,29 +1,30 @@ import { join, dirname } from 'path' import { readdir, unlink } from 'fs' import { readFileAsync, writeFileAsync, isDirectoryAsync } from './util' -import Bluebird from 'bluebird' -import mkdirp from 'mkdirp' +import { promisify, map } from 'bluebird' +import * as mkdirp from 'mkdirp' +import { NexeCompiler } from './compiler' -const { promisify, map } = Bluebird const mkdirpAsync = promisify(mkdirp) -const unlinkAsync = promisify(unlink) +const unlinkAsync = (promisify(unlink) as any) as (path: string) => PromiseLike const readdirAsync = promisify(readdir) -function readDirAsync (dir) { - return readdirAsync(dir).map((file) => { - const path = join(dir, file) - return isDirectoryAsync(path).then(x => x ? readDirAsync(path) : path) - }).reduce((a, b) => a.concat(b), []) +function readDirAsync(dir: string): PromiseLike { + return readdirAsync(dir) + .map((file: string) => { + const path = join(dir, file) + return isDirectoryAsync(path).then((x: boolean) => (x ? readDirAsync(path) : path as any)) + }) + .reduce((a: string[], b: string[] | string) => a.concat(b), []) } -function maybeReadFileContentsAsync (file) { - return readFileAsync(file, 'utf-8') - .catch(e => { - if (e.code === 'ENOENT') { - return '' - } - throw e - }) +function maybeReadFileContentsAsync(file: string) { + return readFileAsync(file, 'utf-8').catch(e => { + if (e.code === 'ENOENT') { + return '' + } + throw e + }) } /** @@ -36,20 +37,20 @@ function maybeReadFileContentsAsync (file) { * - Finally, The patched files are written into source. * */ -export default async function artifacts (compiler, next) { +export default async function artifacts(compiler: NexeCompiler, next: () => Promise) { const { src } = compiler const temp = join(src, 'nexe') await mkdirpAsync(temp) const tmpFiles = await readDirAsync(temp) - await map(tmpFiles, async (path) => { - return compiler.writeFileAsync(path.replace(temp, ''), await readFileAsync(path)) + await map(tmpFiles, async path => { + return compiler.writeFileAsync(path.replace(temp, ''), await readFileAsync(path, 'utf-8')) }) await next() await map(tmpFiles, x => unlinkAsync(x)) - return map(compiler.files, async (file) => { + return map(compiler.files, async file => { const sourceFile = join(src, file.filename) const tempFile = join(temp, file.filename) const fileContents = await maybeReadFileContentsAsync(sourceFile) diff --git a/src/bundle.js b/src/bundle.js deleted file mode 100644 index 7658b8f..0000000 --- a/src/bundle.js +++ /dev/null @@ -1,15 +0,0 @@ -import { - FuseBox, - CSSPlugin, - JSONPlugin, - HTMLPlugin } from 'fuse-box' -import { fromCallback } from 'bluebird' -import * as path from 'path' - -export default async function bundle (compiler, next) { - let options = compiler.options.bundle - if (!options) { - return next() - } - -} diff --git a/src/bundling/bindings-rewrite.js b/src/bundling/bindings-rewrite.ts similarity index 88% rename from src/bundling/bindings-rewrite.js rename to src/bundling/bindings-rewrite.ts index 1ae998f..ce821d3 100644 --- a/src/bundling/bindings-rewrite.js +++ b/src/bundling/bindings-rewrite.ts @@ -2,11 +2,13 @@ import * as fs from 'fs' import * as path from 'path' import * as child from 'child_process' -function findNativeModulePath (filePath, bindingsArg) { +function findNativeModulePath(filePath: string, bindingsArg: string) { const dirname = path.dirname(filePath) const tempFile = Math.random() * 100 + '.js' const tempFilePath = path.join(dirname, tempFile) - fs.writeFileSync(tempFilePath, ` + fs.writeFileSync( + tempFilePath, + ` var bindings = require('bindings'); var Module = require('module'); var originalRequire = Module.prototype.require; @@ -16,8 +18,9 @@ function findNativeModulePath (filePath, bindingsArg) { return mod }; bindings('${bindingsArg}') - `) - //using exec because it can be done syncronously + ` + ) + //using exec because it can be done sync const nativeFileName = child.execSync('node ' + tempFile, { cwd: dirname }).toString() fs.unlinkSync(tempFilePath) const relativePath = './' + path.relative(dirname, nativeFileName).replace(/\\/g, '/') @@ -25,20 +28,18 @@ function findNativeModulePath (filePath, bindingsArg) { } /** * Traverse all nodes in a file and evaluate usages of the bindings module + * handles two common cases */ export class BindingsRewrite { + private bindingsIdNodes: any[] = [] + public nativeModulePaths: string[] = [] + public rewrite = false - constructor () { - this.bindingsIdNodes = [] - this.nativeModulePaths = [] - this.rewrite = false - } - - isRequireBindings (node) { + isRequireBindings(node: any) { return node.callee.name === 'require' && node.arguments[0].value === 'bindings' } - onNode (absolutePath, node, parent) { + onNode(absolutePath: string, node: any, parent: any) { if (node.type === 'CallExpression') { if (this.isRequireBindings(node) && parent.type === 'VariableDeclarator') { /** diff --git a/src/bundling/fuse.ts b/src/bundling/fuse.ts new file mode 100644 index 0000000..c305d30 --- /dev/null +++ b/src/bundling/fuse.ts @@ -0,0 +1,132 @@ +import { BindingsRewrite } from './bindings-rewrite' +import { createHash } from 'crypto' +import { readFileSync } from 'fs' +import { dirname, join, basename } from 'path' + +function hashName(name: string | Buffer) { + return createHash('md5').update(name).digest('hex').toString().slice(0, 8) +} + +export interface FuseBoxFile { + info: { absPath: string } + contents: string + analysis: { + dependencies: string[] + requiresRegeneration: boolean + } + loadContents(): void + makeAnalysis( + parsingOptions?: any, + traversalPlugin?: { + plugins: Array<{ + onNode(file: FuseBoxFile, node: any, parent: any): void + onEnd(file: FuseBoxFile): void + }> + } + ): void +} + +export interface NativeModulePluginOptions { + [key: string]: + | { + additionalFiles: string[] + } + | true +} + +export class NativeModulePlugin { + public test: RegExp + public limit2Project = false + private modules: (keyof NativeModulePluginOptions)[] + + constructor(public options: NativeModulePluginOptions) { + this.modules = Object.keys(options) + this.test = new RegExp(`node_modules\/(${Object.keys(options).join('|')}).*\.js|\.node$`) + } + + init(context: any) { + context.allowExtension('.node') + } + + transform(file: FuseBoxFile) { + file.loadContents() + + if (file.info.absPath.endsWith('.node')) { + const contents = readFileSync(file.info.absPath) + const module = this.modules.find(x => + Boolean(~file.info.absPath.indexOf(join('node_modules', x))) + )! + const bindingName = basename(file.info.absPath) + const settings = this.options[module] + const moduleDir = hashName(contents) + file.contents = ` + var fs=require('fs');var path=require('path');var binding='${contents.toString( + 'base64' + )}';function mkdirp(r,t){t=t||null,r=path.resolve(r);try{fs.mkdirSync(r),t=t||r}catch(c){if("ENOENT"===c.code)t=mkdirp(path.dirname(r),t),mkdirp(r,t);else{var i;try{i=fs.statSync(r)}catch(r){throw c}if(!i.isDirectory())throw c}}return t};` + + if (settings === true) { + file.contents += ` + mkdirp('${moduleDir}'); + var bindingPath = path.join(process.cwd(), '${moduleDir}', '${bindingName}') + require('fs').writeFileSync(bindingPath, Buffer.from(binding, 'base64')) + process.dlopen(module, bindingPath) + `.trim() + return + } + + let depth = 0 + settings.additionalFiles.forEach(file => { + let ownDepth = 0 + file.split('/').forEach(x => x === '..' && ownDepth++) + depth = ownDepth > depth ? ownDepth : depth + }) + let segments = [moduleDir] + while (depth--) { + segments.push(hashName(moduleDir + depth)) + } + segments.push(bindingName) + + file.contents += ` + var cwd = process.cwd() + var bindingFileParts = ${JSON.stringify(segments)}; + var bindingFile = path.join.apply(path, [cwd].concat(bindingFileParts)); + mkdirp(path.dirname(bindingFile)); + fs.writeFileSync(bindingFile, Buffer.from(binding, 'base64')); + ${settings.additionalFiles.reduce((code, filename, i) => { + const contents = readFileSync(join(dirname(file.info.absPath), filename)) + return (code += ` + var file${i} = '${contents.toString('base64')}'; + var filePath${i} = path.join(cwd, bindingFileParts[0], '${filename + .split('../') + .join('')}'); + mkdirp(path.dirname(filePath${i})); + fs.writeFileSync(filePath${i}, Buffer.from(file${i}, 'base64')); + `) + }, '')}; + process.dlopen(module, bindingFile) + ` + return + } + + const bindingsRewrite = new BindingsRewrite() + file.makeAnalysis(null, { + plugins: [ + { + onNode(file, node, parent) { + bindingsRewrite.onNode(file.info.absPath, node, parent) + }, + onEnd(file) { + if (bindingsRewrite.rewrite) { + const index = file.analysis.dependencies.indexOf('bindings') + if (~index) { + file.analysis.dependencies.splice(index, 1) + } + file.analysis.dependencies.push(...bindingsRewrite.nativeModulePaths) + file.analysis.requiresRegeneration = true + } + } + } + ] + }) + } +} diff --git a/src/bundling/native-module-fuse-plugin.js b/src/bundling/native-module-fuse-plugin.js deleted file mode 100644 index ad96a89..0000000 --- a/src/bundling/native-module-fuse-plugin.js +++ /dev/null @@ -1,30 +0,0 @@ -import { BindingsRewrite } from './bindings-rewrite' - -export class NativeModulePlugin { - constructor (...moduleNames) { - this.test = new RegExp(`node_modules\/(${moduleNames.join('|')}).*\.js`) - this.limit2project = false - } - - transform (file) { - const bindingsRewrite = new BindingsRewrite() - file.loadContents() - file.makeAnalysis(null, { - plugins: [{ - onNode(file, node, parent) { - bindingsRewrite.onNode(file.info.absPath, node, parent) - }, - onEnd(file) { - if (bindingsRewrite.rewrite) { - const index = file.analysis.dependencies.indexOf('bindings') - if (~index) { - file.analysis.dependencies.splice(index, 1) - } - file.analysis.dependencies.push(...bindingsRewrite.nativeModulePaths) - file.analysis.requiresRegeneration = true - } - } - }] - }) - } -} diff --git a/src/cli.js b/src/cli.ts similarity index 70% rename from src/cli.js rename to src/cli.ts index 17392a5..43dca5f 100644 --- a/src/cli.js +++ b/src/cli.ts @@ -1,13 +1,17 @@ import { normalize } from 'path' -import Bluebird from 'bluebird' +import * as Bluebird from 'bluebird' +import { Readable } from 'stream' import { createWriteStream, chmodSync } from 'fs' import { readFileAsync, dequote, isWindows } from './util' +import { NexeCompiler } from './compiler' -function readStreamAsync (stream) { - return new Bluebird((resolve) => { +function readStreamAsync(stream: NodeJS.ReadStream): PromiseLike { + return new Bluebird(resolve => { let input = '' stream.setEncoding('utf-8') - stream.on('data', x => { input += x }) + stream.on('data', (x: string) => { + input += x + }) stream.once('end', () => resolve(dequote(input))) stream.resume && stream.resume() }) @@ -27,35 +31,28 @@ function readStreamAsync (stream) { * @param {*} compiler * @param {*} next */ -export default async function cli (compiler, next) { +export default async function cli(compiler: NexeCompiler, next: () => Promise) { const { input, output } = compiler.options const { log } = compiler - const bundled = Boolean(compiler.input) - if (bundled) { - log.step('Using bundled input as the main module') - await next() - } else if (!input && !process.stdin.isTTY) { + if (!input && !process.stdin.isTTY) { log.step('Using stdin as input') compiler.input = await readStreamAsync(process.stdin) } else if (input) { log.step(`Using input file as the main module: ${input}`) - compiler.input = await readFileAsync(normalize(input)) + compiler.input = await readFileAsync(normalize(input), 'utf-8') } else if (!compiler.options.empty) { const bundle = require.resolve(process.cwd()) - log.step('Using the cwd\'s main file as the main module') - compiler.input = await readFileAsync(bundle) + log.step("Using the cwd's main file as the main module") + compiler.input = await readFileAsync(bundle, 'utf-8') } else { log.step('Using empty input as the main module') compiler.input = '' } - if (!bundled) { - await next() - } + await next() const shouldPipeOutput = Boolean(!output && !process.stdout.isTTY) - const outputName = output || - `${compiler.options.name}${isWindows ? '.exe' : ''}` + const outputName = output || `${compiler.options.name}${isWindows ? '.exe' : ''}` compiler.output = shouldPipeOutput ? null : outputName const deliverable = await compiler.compileAsync() @@ -67,14 +64,15 @@ export default async function cli (compiler, next) { log.step('Writing binary to stdout') deliverable.pipe(process.stdout).once('error', reject) resolve() - } else { + } else if (compiler.output) { const step = log.step('Writing result to file') - deliverable.pipe(createWriteStream(normalize(compiler.output))) + deliverable + .pipe(createWriteStream(normalize(compiler.output))) .on('error', reject) - .once('close', e => { + .once('close', (e: Error) => { if (e) { reject(e) - } else { + } else if (compiler.output) { chmodSync(compiler.output, '755') step.log(`Executable written to: ${compiler.output}`) resolve(compiler.quit()) diff --git a/src/compiler.js b/src/compiler.ts similarity index 61% rename from src/compiler.js rename to src/compiler.ts index 9f3070f..86b939b 100644 --- a/src/compiler.js +++ b/src/compiler.ts @@ -1,5 +1,5 @@ import { normalize, join } from 'path' -import Bluebird from 'bluebird' +import * as Bluebird from 'bluebird' import { Buffer } from 'buffer' import { createHash } from 'crypto' import { createReadStream } from 'fs' @@ -7,13 +7,8 @@ import { Readable } from 'stream' import { spawn } from 'child_process' import { Stream as Needle } from 'nigel' import { Logger } from './logger' -import { - readFileAsync, - writeFileAsync, - pathExistsAsync, - dequote, - isWindows -} from './util' +import { readFileAsync, writeFileAsync, pathExistsAsync, dequote, isWindows } from './util' +import { NexeOptions } from './options' const isBsd = Boolean(~process.platform.indexOf('bsd')) const make = isWindows ? 'vcbuild.bat' : isBsd ? 'gmake' : 'make' @@ -22,25 +17,56 @@ const marker = Buffer.from('').toString('hex') const tail = `\n//${marker}` const needle = Buffer.from(marker) const fixedIntegerLength = 10 -const padLeft = (x, l = fixedIntegerLength, c = '0') => (c.repeat(l) + x).slice(-l) -const inflate = (value, size) => { +const padLeft = (x: string | number, l = fixedIntegerLength, c = '0') => (c.repeat(l) + x).slice(-l) +const inflate = (value: string, size: number) => { if (!size || value.length >= size) { return value } return value + ' '.repeat(size - value.length) } +export interface NexeFile { + filename: string + contents: string +} + +interface NexeHeader { + /** + * Zero padded number indicating the extra size available in the binary + */ + paddingSize: string + /** + * + */ + binaryOffset: string + version: string +} + export class NexeCompiler { - constructor (options) { - this.start = Date.now() - const { python } = this.options = options - this.log = new Logger(options.loglevel) - this.src = join(options.temp, options.version) - this.env = Object.assign({}, process.env) - this.files = [] - this.nodeSrcBinPath = isWindows - ? join(this.src, 'Release', 'node.exe') - : join(this.src, 'out', 'Release', 'node') + private start = Date.now() + private env = { ...process.env } + private compileStep: { modify: Function; log: Function } + public log = new Logger(this.options.loglevel) + public src = join(this.options.temp, this.options.version) + public files: NexeFile[] = [] + public input: string + public output: string | null + + public resources: { bundle: string; index: { [key: string]: number[] } } = { + index: {}, + bundle: '' + } + public readFileAsync: (file: string) => Promise + public writeFileAsync: (file: string, contents: Buffer | string) => Promise + public replaceInFileAsync: (file: string, replacer: any, replaceValue: string) => Promise + public setFileContentsAsync: (file: string, contents: string | Buffer) => Promise + + private nodeSrcBinPath = isWindows + ? join(this.src, 'Release', 'node.exe') + : join(this.src, 'out', 'Release', 'node') + + constructor(public options: NexeOptions) { + const { python } = (this.options = options) if (python) { if (isWindows) { @@ -50,74 +76,80 @@ export class NexeCompiler { } } - this.readFileAsync = async (file) => { + this.readFileAsync = async (file: string) => { let cachedFile = this.files.find(x => normalize(x.filename) === normalize(file)) if (!cachedFile) { cachedFile = { filename: file, - contents: await readFileAsync(join(this.src, file), 'utf-8') - .catch({ code: 'ENOENT' }, () => '') + contents: await readFileAsync(join(this.src, file), 'utf-8').catch( + { code: 'ENOENT' }, + () => '' + ) } this.files.push(cachedFile) } return cachedFile } this.writeFileAsync = (file, contents) => writeFileAsync(join(this.src, file), contents) - this.replaceInFileAsync = async (file, ...replacements) => { + this.replaceInFileAsync = async (file, replace: string | RegExp, value: string) => { const entry = await this.readFileAsync(file) - entry.contents = entry.contents.replace(...replacements) + entry.contents = entry.contents.replace(replace, value) } - this.setFileContentsAsync = async (file, contents) => { + this.setFileContentsAsync = async (file: string, contents: string) => { const entry = await this.readFileAsync(file) entry.contents = contents } } - quit (code = 0) { + quit(code = 0) { const time = Date.now() - this.start this.log.write(`Finsihed in ${time / 1000}s`) return this.log.flush().then(x => process.exit(code)) } - _findPaddingSize (size, override = this.options.padding) { + private _findPaddingSize(size: number, override = this.options.padding) { if (override === 0) { return 0 } size = override > size ? override : size const padding = [3, 6, 9, 16, 25, 40].map(x => x * 1e6).find(p => size <= p) if (!padding) { - throw new Error(`No prebuilt target large enough (${(size / 1024).toFixed(2)}Mb).\nUse the --build flag and build for the current platform`) + throw new Error( + `No prebuilt target large enough (${(size / 1024).toFixed( + 2 + )}Mb).\nUse the --build flag and build for the current platform` + ) } return padding } - _getNodeExecutableLocation (target) { + private _getNodeExecutableLocation(target?: string | null) { if (target) { return join(this.options.temp, target) } return this.nodeSrcBinPath } - _runBuildCommandAsync (command, args) { + private _runBuildCommandAsync(command: string, args: string[]) { return new Bluebird((resolve, reject) => { spawn(command, args, { cwd: this.src, env: this.env, stdio: 'ignore' }) - .once('error', reject) - .once('close', resolve) + .once('error', reject) + .once('close', resolve) }) } - _configureAsync () { - return this._runBuildCommandAsync( - this.env.PYTHON || 'python', - [configure, ...this.options.configure] - ) + private _configureAsync() { + return this._runBuildCommandAsync(this.env.PYTHON || 'python', [ + configure, + ...this.options.configure + ]) } - async _buildAsync () { + private async _buildAsync() { this.compileStep.log(`Configuring node build: ${this.options.configure}`) await this._configureAsync() const buildOptions = isWindows ? this.options.vcBuild : this.options.make @@ -126,19 +158,20 @@ export class NexeCompiler { return createReadStream(this._getNodeExecutableLocation()) } - _fetchPrebuiltBinaryAsync () { + private _fetchPrebuiltBinaryAsync() { return this._buildAsync() } - _getPayload (header) { + private _getPayload(header: NexeHeader) { return this._serializeHeader(header) + this.input + '/**' + this.resources.bundle + `**/` } - _generateHeader () { + private _generateHeader() { const zeros = padLeft(0) - const version = ['configure', 'vcBuild', 'make'].reduce((a, c) => { - return (a += this.options[c].slice().sort().join()) - }, '') + this.options.enableNodeCli + const version = + ['configure', 'vcBuild', 'make'].reduce((a, c) => { + return (a += (this.options as any)[c].slice().sort().join()) + }, '') + this.options.enableNodeCli const header = { version: padLeft(0, 32), resources: this.resources.index, @@ -155,7 +188,7 @@ export class NexeCompiler { return header } - async _getExistingBinaryHeaderAsync (target) { + private async _getExistingBinaryHeaderAsync(target: string | undefined | null) { const filename = this._getNodeExecutableLocation(target) const existingBinary = await pathExistsAsync(filename) if (existingBinary) { @@ -164,16 +197,18 @@ export class NexeCompiler { return null } - _extractHeaderAsync (path) { + private _extractHeaderAsync(path: string): Promise { const binary = createReadStream(path) const haystack = new Needle(needle) let needles = 0 - let stackCache = [] + let stackCache: Buffer[] = [] return new Promise((resolve, reject) => { - binary.on('error', reject).pipe(haystack) + binary + .on('error', reject) + .pipe(haystack) .on('error', reject) .on('close', () => reject(new Error(`Binary: ${path} is not compatible with nexe`))) - .on('haystack', x => needles && stackCache.push(x)) + .on('haystack', (x: Buffer) => needles && stackCache.push(x)) .on('needle', () => { if (++needles === 2) { resolve(JSON.parse(Buffer.concat(stackCache).toString())) @@ -184,19 +219,21 @@ export class NexeCompiler { }) } - _serializeHeader (header) { - return `/**${marker}${JSON.stringify(header)}${marker}**/process.__nexe=${JSON.stringify(header)};` + private _serializeHeader(header: NexeHeader) { + return `/**${marker}${JSON.stringify(header)}${marker}**/process.__nexe=${JSON.stringify( + header + )};` } - async setMainModule (compiler, next) { + async setMainModule(compiler: NexeCompiler, next: () => Promise) { await next() const header = compiler._generateHeader() const contents = inflate(this._getPayload(header), +header.paddingSize) + tail return compiler.setFileContentsAsync(`lib/${compiler.options.name}.js`, contents) } - async compileAsync () { - const step = this.compileStep = this.log.step('Compiling result') + async compileAsync() { + const step = (this.compileStep = this.log.step('Compiling result')) let target = this.options.targets.slice().shift() let prebuiltBinary = null const header = this._generateHeader() @@ -209,29 +246,26 @@ export class NexeCompiler { prebuiltBinary = createReadStream(location) } if (target) { - throw new Error('\nNot Implemented, use --build during beta') + throw new Error('\nNot Implemented, use --build during beta\n') // prebuiltBinary = await this._fetchPrebuiltBinaryAsync(target) } if (!prebuiltBinary) { prebuiltBinary = await this._buildAsync() step.log('Node binary compiled') } - return this._assembleDeliverable( - header, - prebuiltBinary - ) + return this._assembleDeliverable(header, prebuiltBinary) } - _assembleDeliverable (header, binary) { + private _assembleDeliverable(header: NexeHeader, binary: NodeJS.ReadableStream) { const haystack = new Needle(Buffer.concat([Buffer.from('/**'), needle])) - const artifact = new Readable({ read () {} }) + const artifact = new Readable({ read() {} }) let needles = 0 let currentStackSize = 0 binary.pipe(haystack) haystack .on('close', () => artifact.push(null)) .on('needle', () => ++needles && haystack.needle(needle)) - .on('haystack', x => { + .on('haystack', (x: Buffer) => { if (!needles) { currentStackSize += x.length artifact.push(x) diff --git a/src/download.js b/src/download.ts similarity index 61% rename from src/download.js rename to src/download.ts index 9b37b37..c2f99d9 100644 --- a/src/download.js +++ b/src/download.ts @@ -1,23 +1,24 @@ -import download from 'download' +import download = require('download') import { isDirectoryAsync } from './util' +import { LogStep } from './logger' +import { IncomingMessage } from 'http' +import { NexeCompiler } from './compiler' -function fetchNodeSourceAsync (cwd, url, step, options = {}) { - const setText = (p) => step.modify(`Downloading Node: ${p.toFixed()}%...`) +function fetchNodeSourceAsync(cwd: string, url: string, step: LogStep, options = {}) { + const setText = (p: number) => step.modify(`Downloading Node: ${p.toFixed()}%...`) return download(url, cwd, Object.assign(options, { extract: true, strip: 1 })) - .on('response', res => { + .on('response', (res: IncomingMessage) => { const total = +res.headers['content-length'] let current = 0 res.on('data', data => { current += data.length - setText((current / total) * 100) + setText(current / total * 100) if (current === total) { step.log('Extracting Node...') } }) }) - .then( - () => step.log(`Node source extracted to: ${cwd}`) - ) + .then(() => step.log(`Node source extracted to: ${cwd}`)) } /** @@ -25,7 +26,7 @@ function fetchNodeSourceAsync (cwd, url, step, options = {}) { * @param {*} compiler * @param {*} next */ -export default async function downloadNode (compiler, next) { +export default async function downloadNode(compiler: NexeCompiler, next: () => Promise) { const { src, log } = compiler const { version, sourceUrl, downloadOptions } = compiler.options const url = sourceUrl || `https://nodejs.org/dist/v${version}/node-v${version}.tar.gz` diff --git a/src/logger.js b/src/logger.ts similarity index 50% rename from src/logger.js rename to src/logger.ts index 300f7b0..532237a 100644 --- a/src/logger.js +++ b/src/logger.ts @@ -1,42 +1,54 @@ -import colors from 'chalk' -import ora from 'ora' +import colors = require('chalk') +import ora = require('ora') const frameLength = 120 +export interface LogStep { + modify(text: string, color?: string): void + log(text: string, color?: string): void +} + export class Logger { - constructor (level) { + private verbose: boolean + private silent: boolean + private ora: any + private modify: Function + public write: (text: string, color?: string) => void + + constructor(level: 'verbose' | 'silent' | 'info') { this.verbose = level === 'verbose' this.silent = level === 'silent' if (!this.silent) { - this.ora = ora('Starting...', { + this.ora = ora({ + text: 'Starting...', color: 'blue', spinner: 'dots' }) this.ora.stop() } const noop = () => {} - this.modify = this.slient ? noop : this._modify.bind(this) + this.modify = this.silent ? noop : this._modify.bind(this) this.write = this.silent ? noop : this._write.bind(this) } - flush () { + flush() { !this.silent && this.ora.succeed() return new Promise(resolve => setTimeout(resolve, frameLength)) } - _write (update, color = 'green') { - this.ora.succeed().text = colors[color](update) + _write(update: string, color = 'green') { + this.ora.succeed().text = (colors as any)[color](update) this.ora.start() } - _modify (update, color = this.ora.color) { + _modify(update: string, color = this.ora.color) { this.ora.text = update this.ora.color = color } - step (text) { + step(text: string): LogStep { if (this.silent) { - return { modify () {}, log () {} } + return { modify() {}, log() {} } } if (!this.ora.id) { this.ora.start().text = text @@ -48,6 +60,6 @@ export class Logger { return { modify: this.modify, log: this.verbose ? this.write : this.modify - } + } as LogStep } } diff --git a/src/nexe.js b/src/nexe.ts similarity index 64% rename from src/nexe.js rename to src/nexe.ts index a524514..78d446b 100644 --- a/src/nexe.js +++ b/src/nexe.ts @@ -1,18 +1,17 @@ -import { compose, PromiseConfig } from 'app-builder' -import bundle from './bundle' +import { compose, PromiseConfig, Middleware } from 'app-builder' import resource from './resource' import { NexeCompiler } from './compiler' -import { argv, normalizeOptionsAsync } from './options' +import { argv, normalizeOptionsAsync, NexeOptions } from './options' import cli from './cli' import download from './download' import artifacts from './artifacts' import patches from './patches' import { rimrafAsync } from './util' -import Bluebird from 'bluebird' +import * as Bluebird from 'bluebird' PromiseConfig.constructor = Bluebird -async function compile (compilerOptions, callback) { +async function compile(compilerOptions: NexeOptions, callback?: (err: Error | null) => void) { const options = await normalizeOptionsAsync(compilerOptions) const compiler = new NexeCompiler(options) const build = compiler.options.build @@ -25,19 +24,9 @@ async function compile (compilerOptions, callback) { return compiler.quit() } - const nexe = compose(...[ - resource, - bundle, - cli, - build && download, - build && artifacts, - build && patches, - build && options.patches - ].filter(x => x)) + const buildSteps = build ? [download, artifacts, ...patches, ...options.patches] : [] + const nexe = compose(resource, cli, buildSteps) return nexe(compiler).asCallback(callback) } -export { - argv, - compile -} +export { argv, compile } diff --git a/src/options.js b/src/options.ts similarity index 59% rename from src/options.js rename to src/options.ts index 95e42f4..318b47b 100644 --- a/src/options.js +++ b/src/options.ts @@ -1,9 +1,74 @@ -import parseArgv from 'minimist' +import * as parseArgv from 'minimist' +import { NexeCompiler } from './compiler' import { basename, extname, join } from 'path' -import Bluebird from 'bluebird' +import * as Bluebird from 'bluebird' import { EOL } from 'os' -function padRight (str, l) { +export interface NexePatch { + (compiler: NexeCompiler, next: () => Promise): Promise +} + +export interface NexeOptions { + build: boolean + /** + * Entrypoint filepath + */ + input: string + output: string + targets: string[] + /** + * Build name, Used for executable, and stacktraces + */ + name: string + /** + * The node version to be built + */ + version: string + python?: string + /** + * Node flags e.g. "--expose-gc" baked into the executable + */ + flags: string[] + /** + * Pass configuration options to node build configure script + */ + configure: string[] + /** + * Pass make options to node make script + */ + make: string[] + vcBuild: string[] + snapshot?: string + /** + * Array of glob strings describing resources to pull into the bundle + */ + resources: string[] + /** + * Temporary directory where nexe artifacts will be cached + * TODO dot folder in home dir + */ + temp: string + ico?: string + rc: { [key: string]: string } + /** + * Causes nexe to remove all temporary files for current configuration + */ + clean: boolean + enableNodeCli: boolean + sourceUrl?: string + loglevel: 'info' | 'silent' | 'verbose' + silent?: boolean + verbose?: boolean + info?: boolean + padding: number + patches: NexePatch[] + + empty: boolean + warmup?: string + downloadOptions?: any +} + +function padRight(str: string, l: number) { return (str + ' '.repeat(l)).substr(0, l) } const defaults = { @@ -14,8 +79,6 @@ const defaults = { make: [], targets: [], vcBuild: ['nosign', 'release'], - bundle: false, - build: false, enableNodeCli: false, patches: [] } @@ -33,7 +96,6 @@ const alias = { m: 'make', vc: 'vcBuild', s: 'snapshot', - b: 'bundle', cli: 'enableNodeCli', h: 'help', l: 'loglevel' @@ -54,7 +116,6 @@ nexe --help CLI OPTIONS -vc --vcBuild =x64 -- *pass arguments to vcbuild.bat -s --snapshot =/path/to/snapshot -- build with warmup snapshot -r --resource =./paths/**/* -- *embed file bytes within the binary - -b --bundle =webpack-config.js -- use default configuration or provide custom webpack config --temp =./path/to/temp -- nexe temp files (for downloads and source builds) --ico -- file name for alternate icon file (windows) --rc-* -- populate rc file options (windows) @@ -66,8 +127,8 @@ nexe --help CLI OPTIONS -* variable key name * option can be used more than once`.trim() -function flattenFilter (...args) { - return [].concat(...args).filter(x => x) +function flattenFilter(...args: any[]): string[] { + return ([] as string[]).concat(...args).filter(x => x) } /** @@ -76,9 +137,10 @@ function flattenFilter (...args) { * @param {*} match * @param {*} options */ -function extractCliMap (match, options) { - return Object.keys(options).filter(x => match.test(x)) - .reduce((map, option) => { +function extractCliMap(match: RegExp, options: any) { + return Object.keys(options) + .filter(x => match.test(x)) + .reduce((map: { [key: string]: string }, option: keyof NexeOptions) => { const key = option.split('-')[1] map[key] = options[option] delete options[option] @@ -86,24 +148,24 @@ function extractCliMap (match, options) { }, {}) } -function tryResolveMainFileName () { +function tryResolveMainFileName() { let filename try { const file = require.resolve(process.cwd()) filename = basename(file).replace(extname(file), '') } catch (_) {} - return !filename || filename === 'index' ? ('nexe_' + Date.now()) : filename + return !filename || filename === 'index' ? 'nexe_' + Date.now() : filename } -function extractLogLevel (options) { +function extractLogLevel(options: NexeOptions) { if (options.loglevel) return options.loglevel if (options.silent) return 'silent' if (options.verbose) return 'verbose' return 'info' } -function extractName (options) { +function extractName(options: NexeOptions) { let name = options.name if (typeof options.input === 'string' && !name) { name = basename(options.input).replace(extname(options.input), '') @@ -112,25 +174,23 @@ function extractName (options) { return name.replace(/\.exe$/, '') } -function normalizeOptionsAsync (input) { +function normalizeOptionsAsync(input: Partial) { if (argv.help || argv._.some(x => x === 'version')) { - return Bluebird.fromCallback(cb => process.stderr.write( - argv.help ? help : '2.0.0-beta.1' + EOL, - () => cb(null, process.exit(0)) - )) + process.stderr.write(argv.help ? help : '2.0.0-beta.1' + EOL, () => process.exit(0)) } - const options = Object.assign({}, defaults, input) - delete options._ + const options = Object.assign({}, defaults, input) as NexeOptions + const opts = options as any + delete opts._ options.loglevel = extractLogLevel(options) options.name = extractName(options) - options.flags = flattenFilter(options.flag, options.flags) - options.targets = flattenFilter(options.target, options.targets) + options.flags = flattenFilter(opts.flag, options.flags) + options.targets = flattenFilter(opts.target, options.targets) options.make = flattenFilter(options.make) options.vcBuild = flattenFilter(options.vcBuild) - options.resources = flattenFilter(options.resource, options.resources) + options.resources = flattenFilter(opts.resource, options.resources) options.rc = options.rc || extractCliMap(/^rc-.*/, options) - + options.build = true // FIXME if (options.build || options.padding === 0) { options.targets = [] options.build = true @@ -139,14 +199,9 @@ function normalizeOptionsAsync (input) { options.targets = [defaultTarget] } - Object.keys(alias) - .filter(k => k !== 'rc') - .forEach(x => delete options[x]) + Object.keys(alias).filter(k => k !== 'rc').forEach(x => delete opts[x]) return Promise.resolve(options) } -export { - argv, - normalizeOptionsAsync -} +export { argv, normalizeOptionsAsync } diff --git a/src/patches/disable-node-cli.js b/src/patches/disable-node-cli.js deleted file mode 100644 index 5a3c1a9..0000000 --- a/src/patches/disable-node-cli.js +++ /dev/null @@ -1,14 +0,0 @@ -export default async function disableNodeCli (compiler, next) { - if (compiler.options.enableNodeCli) { - return next() - } - - const nodeccMarker = "argv[index][0] == '-'" - - await compiler.replaceInFileAsync( - 'src/node.cc', - nodeccMarker, - nodeccMarker.replace('-', ']') - ) - return next() -} diff --git a/src/patches/disable-node-cli.ts b/src/patches/disable-node-cli.ts new file mode 100644 index 0000000..7964d02 --- /dev/null +++ b/src/patches/disable-node-cli.ts @@ -0,0 +1,12 @@ +import { NexeCompiler } from '../compiler' + +export default async function disableNodeCli(compiler: NexeCompiler, next: () => Promise) { + if (compiler.options.enableNodeCli) { + return next() + } + + const nodeccMarker = "argv[index][0] == '-'" + + await compiler.replaceInFileAsync('src/node.cc', nodeccMarker, nodeccMarker.replace('-', ']')) + return next() +} diff --git a/src/patches/flags.js b/src/patches/flags.ts similarity index 65% rename from src/patches/flags.js rename to src/patches/flags.ts index d6b7356..931a4a1 100644 --- a/src/patches/flags.js +++ b/src/patches/flags.ts @@ -1,4 +1,6 @@ -export default async function flags (compiler, next) { +import { NexeCompiler } from '../compiler' + +export default async function flags(compiler: NexeCompiler, next: () => Promise) { const nodeflags = compiler.options.flags if (!nodeflags.length) { return next() diff --git a/src/patches/gyp.js b/src/patches/gyp.js deleted file mode 100644 index bed6349..0000000 --- a/src/patches/gyp.js +++ /dev/null @@ -1,12 +0,0 @@ -export default async function nodeGyp ({ files, replaceInFileAsync }, next) { - await next() - - const nodeGypMarker = "'lib/fs.js'," - await replaceInFileAsync('node.gyp', nodeGypMarker, ` - ${nodeGypMarker} - ${files - .filter(x => x.filename.startsWith('lib')) - .map(x => `'${x.filename}'`) - .toString()}, - `.trim()) -} diff --git a/src/patches/gyp.ts b/src/patches/gyp.ts new file mode 100644 index 0000000..431c86b --- /dev/null +++ b/src/patches/gyp.ts @@ -0,0 +1,18 @@ +import { NexeCompiler } from '../compiler' + +export default async function nodeGyp( + { files, replaceInFileAsync }: NexeCompiler, + next: () => Promise +) { + await next() + + const nodeGypMarker = "'lib/fs.js'," + await replaceInFileAsync( + 'node.gyp', + nodeGypMarker, + ` + ${nodeGypMarker} + ${files.filter(x => x.filename.startsWith('lib')).map(x => `'${x.filename}'`).toString()}, + `.trim() + ) +} diff --git a/src/patches/ico.js b/src/patches/ico.js deleted file mode 100644 index c16ed90..0000000 --- a/src/patches/ico.js +++ /dev/null @@ -1,14 +0,0 @@ -import { normalize } from 'path' -import { readFileAsync } from '../util' - -export default async function ico (compiler, next) { - const iconFile = compiler.options.ico - if (!iconFile) { - return next() - } - await compiler.setFileContentsAsync( - 'src/res/node.ico', - await readFileAsync(normalize(iconFile)) - ) - return next() -} diff --git a/src/patches/ico.ts b/src/patches/ico.ts new file mode 100644 index 0000000..df4fb43 --- /dev/null +++ b/src/patches/ico.ts @@ -0,0 +1,12 @@ +import { normalize } from 'path' +import { readFileAsync } from '../util' +import { NexeCompiler } from '../compiler' + +export default async function ico(compiler: NexeCompiler, next: () => Promise) { + const iconFile = compiler.options.ico + if (!iconFile) { + return next() + } + await compiler.setFileContentsAsync('src/res/node.ico', await readFileAsync(normalize(iconFile))) + return next() +} diff --git a/src/patches/index.js b/src/patches/index.ts similarity index 66% rename from src/patches/index.js rename to src/patches/index.ts index 9749fc6..aee6a78 100644 --- a/src/patches/index.js +++ b/src/patches/index.ts @@ -4,10 +4,11 @@ import cli from './disable-node-cli' import flags from './flags' import ico from './ico' import rc from './node-rc' +import { NexeCompiler } from '../compiler' const patches = [ gyp, - (compiler, next) => compiler.setMainModule(compiler, next), + (compiler: NexeCompiler, next: () => Promise) => compiler.setMainModule(compiler, next), nexePatches, cli, flags, diff --git a/src/patches/node-rc.js b/src/patches/node-rc.ts similarity index 67% rename from src/patches/node-rc.js rename to src/patches/node-rc.ts index 867a6cb..9bb3d15 100644 --- a/src/patches/node-rc.js +++ b/src/patches/node-rc.ts @@ -1,4 +1,6 @@ -export default async function nodeRc (compiler, next) { +import { NexeCompiler } from '../compiler' + +export default async function nodeRc(compiler: NexeCompiler, next: () => Promise) { const options = compiler.options.rc if (!options) { return next() @@ -6,7 +8,7 @@ export default async function nodeRc (compiler, next) { const file = await compiler.readFileAsync('src/res/node.rc') - Object.keys(options).forEach((key) => { + Object.keys(options).forEach(key => { let value = options[key] const isVar = /^[A-Z_]+$/.test(value) value = isVar ? value : `"${value}"` diff --git a/src/patches/snapshot.js b/src/patches/snapshot.js deleted file mode 100644 index f426b4f..0000000 --- a/src/patches/snapshot.js +++ /dev/null @@ -1,14 +0,0 @@ -export default async function snapshot (compiler, next) { - const snapshotFile = compiler.options.snapshot - - if (!snapshotFile) { - return next() - } - - await compiler.replaceInFileAsync( - 'configure', - 'def configure_v8(o):', - `def configure_v8(o):\n o['variables']['embed_script'] = '${snapshotFile}'\n o['variables']['warmup_script'] = '${snapshotFile}'` - ) - return next() -} diff --git a/src/patches/snapshot.ts b/src/patches/snapshot.ts new file mode 100644 index 0000000..fabe1b6 --- /dev/null +++ b/src/patches/snapshot.ts @@ -0,0 +1,19 @@ +import { NexeCompiler } from '../compiler' + +export default async function snapshot(compiler: NexeCompiler, next: () => Promise) { + const snapshotFile = compiler.options.snapshot + const warmupScript = compiler.options.warmup + + if (!snapshotFile) { + return next() + } + + await compiler.replaceInFileAsync( + 'configure', + 'def configure_v8(o):', + `def configure_v8(o):\n o['variables']['embed_script'] = '${snapshotFile}'\n o['variables']['warmup_script'] = '${warmupScript || + snapshotFile}'` + ) + + return next() +} diff --git a/src/patches/third-party-main.js b/src/patches/third-party-main.ts similarity index 92% rename from src/patches/third-party-main.js rename to src/patches/third-party-main.ts index 57fb4fb..b77ceb8 100644 --- a/src/patches/third-party-main.js +++ b/src/patches/third-party-main.ts @@ -1,5 +1,9 @@ -export default async function main (compiler, next) { - await compiler.setFileContentsAsync('lib/_third_party_main.js', ` +import { NexeCompiler } from '../compiler' + +export default async function main(compiler: NexeCompiler, next: () => Promise) { + await compiler.setFileContentsAsync( + 'lib/_third_party_main.js', + ` const fs = require('fs') const Buffer = require('buffer').Buffer const isString = x => typeof x === 'string' || x instanceof String diff --git a/src/resource.js b/src/resource.ts similarity index 63% rename from src/resource.js rename to src/resource.ts index b7cc0da..7367294 100644 --- a/src/resource.js +++ b/src/resource.ts @@ -1,20 +1,18 @@ import { each } from 'bluebird' import { readFileAsync, isDirectoryAsync } from './util' import { Buffer } from 'buffer' -import globs from 'globby' +import * as globs from 'globby' +import { NexeCompiler } from './compiler' -export default async function resource (compiler, next) { - const resources = compiler.resources = { - index: {}, - bundle: '' - } +export default async function resource(compiler: NexeCompiler, next: () => Promise) { + const resources = compiler.resources if (!compiler.options.resources.length) { return next() } const step = compiler.log.step('Bundling Resources...') let count = 0 - await each(globs(compiler.options.resources), async (file) => { + await each(globs(compiler.options.resources), async file => { if (await isDirectoryAsync(file)) { return } @@ -28,6 +26,8 @@ export default async function resource (compiler, next) { ] resources.bundle += commentSafeContents }) - step.log(`Included ${count} file(s). ${(Buffer.byteLength(resources.bundle) / 1e6).toFixed(3)} MB`) + step.log( + `Included ${count} file(s). ${(Buffer.byteLength(resources.bundle) / 1e6).toFixed(3)} MB` + ) return next() } diff --git a/src/types.d.ts b/src/types.d.ts new file mode 100644 index 0000000..574c27a --- /dev/null +++ b/src/types.d.ts @@ -0,0 +1,35 @@ +declare module 'nigel' { + import { Writable } from 'stream' + interface Needle { + value: Buffer + lastPos: number + last: number + length: number + badCharShift: Buffer + } + + export function compile(needle: Buffer): Needle + export function horspool(haystack: Buffer, needle: Needle, start: number): number + export function all(haystack: Buffer, needle: Needle, pos: number): number[] + export class Stream extends Writable { + constructor(needle: Buffer) + needle(needle: Buffer): void + flush(): void + } +} + +declare module 'download' { + import { Duplex } from 'stream' + interface DownloadOptions { + extract?: boolean + strip?: number + filename?: string + proxy?: string + } + function download( + url: string, + destination?: string | DownloadOptions, + options?: DownloadOptions + ): PromiseLike & Duplex + export = download +} diff --git a/src/util.js b/src/util.js deleted file mode 100644 index 4a1e91b..0000000 --- a/src/util.js +++ /dev/null @@ -1,45 +0,0 @@ -import { readFile, writeFile, stat } from 'fs' -import Bluebird from 'bluebird' -import rimraf from 'rimraf' - -const rimrafAsync = Bluebird.promisify(rimraf) - -function dequote (input) { - input = input.trim() - const singleQuote = input.startsWith('\'') && input.endsWith('\'') - const doubleQuote = input.startsWith('"') && input.endsWith('"') - if (singleQuote || doubleQuote) { - return input.slice(1).slice(0, -1) - } - return input -} - -const readFileAsync = Bluebird.promisify(readFile) -const writeFileAsync = Bluebird.promisify(writeFile) -const statAsync = Bluebird.promisify(stat) -const isWindows = process.platform === 'win32' - -function pathExistsAsync (path) { - return statAsync(path).then(x => true, err => { - if (err.code !== 'ENOENT') { - throw err - } - return false - }) -} - -function isDirectoryAsync (path) { - return statAsync(path) - .then(x => x.isDirectory()) - .catch({ code: 'ENOENT' }, () => false) -} - -export { - dequote, - isWindows, - rimrafAsync, - readFileAsync, - pathExistsAsync, - isDirectoryAsync, - writeFileAsync -} diff --git a/src/util.ts b/src/util.ts new file mode 100644 index 0000000..525571a --- /dev/null +++ b/src/util.ts @@ -0,0 +1,47 @@ +import { readFile, writeFile, stat } from 'fs' +import * as Bluebird from 'bluebird' +import rimraf = require('rimraf') + +const { promisify } = Bluebird +const rimrafAsync = (promisify(rimraf) as any) as (path: string) => Bluebird + +function dequote(input: string) { + input = input.trim() + const singleQuote = input.startsWith("'") && input.endsWith("'") + const doubleQuote = input.startsWith('"') && input.endsWith('"') + if (singleQuote || doubleQuote) { + return input.slice(1).slice(0, -1) + } + return input +} + +export interface ReadFileAsync { + (path: string): Bluebird + (path: string, encoding: string): Bluebird +} + +const readFileAsync = (promisify(readFile) as any) as ReadFileAsync +const writeFileAsync = (promisify(writeFile) as any) as ( + path: string, + contents: string | Buffer +) => Promise +const statAsync = promisify(stat) +const isWindows = process.platform === 'win32' + +function pathExistsAsync(path: string) { + return statAsync(path).then(x => true).catch({ code: 'ENOENT' }, () => false) +} + +function isDirectoryAsync(path: string) { + return statAsync(path).then(x => x.isDirectory()).catch({ code: 'ENOENT' }, () => false) +} + +export { + dequote, + isWindows, + rimrafAsync, + readFileAsync, + pathExistsAsync, + isDirectoryAsync, + writeFileAsync +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..57c70f2 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target":"es5", + "lib": ["es2017"], + "module": "commonjs", + "outDir": "./lib", + "strict": true + }, + "include":[ + "src/**/*.ts" + ] +} diff --git a/yarn.lock b/yarn.lock index aa75f6c..41d8631 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,16 +2,14 @@ # yarn lockfile v1 +"@types/bluebird@^3.5.8": + version "3.5.8" + resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.8.tgz#242a83379f06c90f96acf6d1aeab3af6faebdb98" + abbrev@1: version "1.1.0" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" -acorn-dynamic-import@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" - dependencies: - acorn "^4.0.3" - acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" @@ -22,15 +20,11 @@ acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^4.0.3: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - -acorn@^5.0.0, acorn@^5.0.1: +acorn@^5.0.1: version "5.0.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" -ajv-keywords@^1.0.0, ajv-keywords@^1.1.1: +ajv-keywords@^1.0.0: version "1.5.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" @@ -41,14 +35,6 @@ ajv@^4.7.0, ajv@^4.9.1: co "^4.6.0" json-stable-stringify "^1.0.1" -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -124,14 +110,6 @@ arrify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" -asn1.js@^4.0.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -144,26 +122,10 @@ assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - dependencies: - util "0.10.3" - -ast-types@0.9.6: - version "0.9.6" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" - async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -async@^2.1.2: - version "2.4.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7" - dependencies: - lodash "^4.14.0" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -671,20 +633,12 @@ base64-js@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" -base64-js@^1.0.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" - bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" dependencies: tweetnacl "^0.14.3" -big.js@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" - binary-extensions@^1.0.0: version "1.8.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" @@ -705,10 +659,6 @@ bluebird@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - boom@2.x.x: version "2.10.1" resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" @@ -730,65 +680,10 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a" - dependencies: - buffer-xor "^1.0.2" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - inherits "^2.0.1" - -browserify-cipher@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" - -browserify-zlib@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" - dependencies: - pako "~0.2.0" - browserslist@^2.1.2: version "2.1.4" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.1.4.tgz#cc526af4a1312b7d2e05653e56d0c8ab70c0e053" @@ -804,10 +699,6 @@ buffer-shims@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" -buffer-xor@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - buffer@^3.0.1: version "3.6.0" resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb" @@ -816,22 +707,10 @@ buffer@^3.0.1: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-modules@^1.0.0, builtin-modules@^1.1.1: +builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" @@ -842,21 +721,6 @@ callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" -camel-case@3.0.x: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" - dependencies: - no-case "^2.2.0" - upper-case "^1.1.1" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - caniuse-lite@^1.0.30000670: version "1.0.30000672" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000672.tgz#3f89b9907db78653f88bc4d056ed626e8ec74357" @@ -876,13 +740,6 @@ caw@^2.0.0: get-proxy "^1.0.1" tunnel-agent "^0.4.0" -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -893,7 +750,7 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chokidar@^1.4.3, chokidar@^1.6.1: +chokidar@^1.6.1: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" dependencies: @@ -908,22 +765,10 @@ chokidar@^1.4.3, chokidar@^1.6.1: optionalDependencies: fsevents "^1.0.0" -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07" - dependencies: - inherits "^2.0.1" - circular-json@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" -clean-css@4.1.x: - version "4.1.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.3.tgz#07cfe8980edb20d455ddc23aadcf1e04c6e509ce" - dependencies: - source-map "0.5.x" - cli-cursor@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" @@ -944,22 +789,6 @@ cli-width@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -974,7 +803,7 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@2.9.0, commander@2.9.x, commander@^2.8.1, commander@~2.9.0: +commander@2.9.0, commander@^2.8.1: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: @@ -998,20 +827,10 @@ concat-stream@^1.5.2: readable-stream "^2.2.2" typedarray "^0.0.6" -console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - dependencies: - date-now "^0.1.4" - console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" @@ -1032,60 +851,18 @@ core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" -create-ecdh@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - create-error-class@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" dependencies: capture-stack-trace "^1.0.0" -create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - ripemd160 "^2.0.0" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.6" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" dependencies: boom "2.x.x" -crypto-browserify@^3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.0.tgz#3652a0906ab9b2a7e0c3ce66a408e957a2485522" - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - d@1: version "1.0.0" resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" @@ -1098,10 +875,6 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - debug-log@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" @@ -1124,10 +897,6 @@ debug@^2.1.1, debug@^2.2.0: dependencies: ms "2.0.0" -decamelize@^1.0.0, decamelize@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - decompress-tar@^4.0.0, decompress-tar@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.0.tgz#1f092ab698440558c72fc78e77d246d3ecb453b0" @@ -1223,13 +992,6 @@ delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" -des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" @@ -1240,14 +1002,6 @@ diff@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" -diffie-hellman@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - doctrine@1.5.0, doctrine@^1.2.2: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" @@ -1262,10 +1016,6 @@ doctrine@^2.0.0: esutils "^2.0.2" isarray "^1.0.0" -domain-browser@^1.1.1: - version "1.1.7" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" - download@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/download/-/download-6.2.0.tgz#eb72c6340d44478d5e426d52266be5e5b5ece4e6" @@ -1294,37 +1044,12 @@ electron-to-chromium@^1.3.11: version "1.3.11" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.11.tgz#744761df1d67b492b322ce9aa0aba5393260eb61" -elliptic@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - end-of-stream@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" dependencies: once "^1.4.0" -enhanced-resolve@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz#9f4b626f577245edcf4b2ad83d86e17f4f421dec" - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - object-assign "^4.0.1" - tapable "^0.2.5" - errno@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" @@ -1397,13 +1122,6 @@ es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbo d "1" es5-ext "~0.10.14" -es6-templates@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/es6-templates/-/es6-templates-0.2.3.tgz#5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4" - dependencies: - recast "~0.11.12" - through "~2.3.6" - es6-weak-map@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" @@ -1539,7 +1257,7 @@ espree@^3.4.0: acorn "^5.0.1" acorn-jsx "^3.0.0" -esprima@^3.1.1, esprima@~3.1.0: +esprima@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -1575,16 +1293,6 @@ event-emitter@~0.3.5: d "1" es5-ext "~0.10.14" -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - -evp_bytestokey@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53" - dependencies: - create-hash "^1.1.1" - exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" @@ -1619,10 +1327,6 @@ fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" -fastparse@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" - fd-slicer@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" @@ -1788,10 +1492,6 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" -get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" - get-proxy@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-1.1.0.tgz#894854491bc591b0f147d7ae570f5c678b7256eb" @@ -1938,18 +1638,6 @@ has@^1.0.1: dependencies: function-bind "^1.0.2" -hash-base@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" - dependencies: - inherits "^2.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573" - dependencies: - inherits "^2.0.1" - hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" @@ -1959,18 +1647,6 @@ hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" -he@1.1.x: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" @@ -1986,33 +1662,6 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -hosted-git-info@^2.1.4: - version "2.4.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" - -html-loader@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-0.4.5.tgz#5fbcd87cd63a5c49a7fce2fe56f425e05729c68c" - dependencies: - es6-templates "^0.2.2" - fastparse "^1.1.1" - html-minifier "^3.0.1" - loader-utils "^1.0.2" - object-assign "^4.1.0" - -html-minifier@^3.0.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.2.tgz#d73bc3ff448942408818ce609bf3fb0ea7ef4eb7" - dependencies: - camel-case "3.0.x" - clean-css "4.1.x" - commander "2.9.x" - he "1.1.x" - ncname "1.0.x" - param-case "2.1.x" - relateurl "0.2.x" - uglify-js "3.0.x" - http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" @@ -2021,10 +1670,6 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" -https-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" - ieee754@^1.1.4: version "1.1.8" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" @@ -2037,10 +1682,6 @@ imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -2052,10 +1693,6 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" @@ -2088,10 +1725,6 @@ invariant@^2.2.0, invariant@^2.2.2: dependencies: loose-envify "^1.0.0" -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -2106,12 +1739,6 @@ is-buffer@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - is-callable@^1.1.1, is-callable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" @@ -2239,10 +1866,6 @@ is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -2286,10 +1909,6 @@ jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" -json-loader@^0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de" - json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -2308,7 +1927,7 @@ json3@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" -json5@^0.5.0, json5@^0.5.1: +json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -2339,16 +1958,6 @@ kind-of@^3.0.2: dependencies: is-buffer "^1.1.5" -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -2356,16 +1965,6 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" @@ -2375,27 +1974,6 @@ load-json-file@^2.0.0: pify "^2.0.0" strip-bom "^3.0.0" -loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" - -loader-utils@^0.2.16: - version "0.2.17" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - object-assign "^4.0.1" - -loader-utils@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -2454,7 +2032,7 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" -lodash@^4.0.0, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.3.0: +lodash@^4.0.0, lodash@^4.2.0, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -2464,20 +2042,12 @@ log-symbols@^1.0.2: dependencies: chalk "^1.0.0" -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - loose-envify@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: js-tokens "^3.0.0" -lower-case@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" - lowercase-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" @@ -2488,7 +2058,7 @@ make-dir@^1.0.0: dependencies: pify "^2.3.0" -memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: +memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" dependencies: @@ -2513,13 +2083,6 @@ micromatch@^2.1.5: parse-glob "^3.0.4" regex-cache "^0.4.2" -miller-rabin@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - mime-db@~1.27.0: version "1.27.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" @@ -2534,14 +2097,6 @@ mimic-fn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" -minimalistic-assert@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -2568,7 +2123,7 @@ minizlib@^1.0.3: dependencies: minipass "^2.0.0" -mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -2614,12 +2169,6 @@ natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" -ncname@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ncname/-/ncname-1.0.0.tgz#5b57ad18b1ca092864ef62b0b1ed8194f383b71c" - dependencies: - xml-char-classes "^1.0.0" - nigel@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/nigel/-/nigel-2.0.2.tgz#93a1866fb0c52d87390aa75e2b161f4b5c75e5b1" @@ -2627,40 +2176,6 @@ nigel@^2.0.2: hoek "4.x.x" vise "2.x.x" -no-case@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.1.tgz#7aeba1c73a52184265554b7dc03baf720df80081" - dependencies: - lower-case "^1.1.1" - -node-libs-browser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" - dependencies: - assert "^1.1.1" - browserify-zlib "^0.1.4" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "0.0.1" - os-browserify "^0.2.0" - path-browserify "0.0.0" - process "^0.11.0" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.0.5" - stream-browserify "^2.0.1" - stream-http "^2.3.1" - string_decoder "^0.10.25" - timers-browserify "^2.0.2" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" - node-pre-gyp@^0.6.29: version "0.6.34" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" @@ -2682,15 +2197,6 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.3.2: - version "2.3.8" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - normalize-path@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -2773,20 +2279,10 @@ ora@^1.2.0: cli-spinners "^1.0.0" log-symbols "^1.0.2" -os-browserify@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" - os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - dependencies: - lcid "^1.0.0" - os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -2826,26 +2322,6 @@ p-timeout@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.1.1.tgz#d28e9fdf96e328886fbff078f886ad158c53bf6d" -pako@~0.2.0: - version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" - -param-case@2.1.x: - version "2.1.1" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" - dependencies: - no-case "^2.2.0" - -parse-asn1@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -2861,10 +2337,6 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -2887,24 +2359,6 @@ path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -pbkdf2@^3.0.3: - version "3.0.12" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.12.tgz#be36785c5067ea48d806ff923288c5f750b6b8a2" - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -2970,7 +2424,7 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -private@^0.1.6, private@~0.1.5: +private@^0.1.6: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" @@ -2978,10 +2432,6 @@ process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" -process@^0.11.0: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - progress@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" @@ -2990,21 +2440,7 @@ prr@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" -public-encrypt@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - -punycode@^1.2.4, punycode@^1.4.1: +punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -3012,14 +2448,6 @@ qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - randomatic@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" @@ -3027,14 +2455,6 @@ randomatic@^1.1.3: is-number "^2.0.2" kind-of "^3.0.2" -randombytes@^2.0.0, randombytes@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec" - -raw-loader@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" - rc@^1.1.2, rc@^1.1.7: version "1.2.1" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" @@ -3044,22 +2464,7 @@ rc@^1.1.2, rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.2.6: +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: version "2.2.9" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" dependencies: @@ -3088,15 +2493,6 @@ readline2@^1.0.1: is-fullwidth-code-point "^1.0.0" mute-stream "0.0.5" -recast@~0.11.12: - version "0.11.23" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" - dependencies: - ast-types "0.9.6" - esprima "~3.1.0" - private "~0.1.5" - source-map "~0.5.0" - rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -3144,10 +2540,6 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" -relateurl@0.2.x: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - remove-trailing-separator@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" @@ -3193,14 +2585,6 @@ request@^2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - require-uncached@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -3232,25 +2616,12 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: glob "^7.0.5" -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" - dependencies: - hash-base "^2.0.0" - inherits "^2.0.1" - run-async@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" @@ -3275,11 +2646,11 @@ seek-bzip@^1.0.5: dependencies: commander "~2.8.1" -"semver@2 || 3 || 4 || 5", semver@5.3.0, semver@^5.3.0: +semver@5.3.0, semver@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -3287,16 +2658,6 @@ set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.8" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f" - dependencies: - inherits "^2.0.1" - shelljs@^0.7.5: version "0.7.7" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" @@ -3323,34 +2684,16 @@ sntp@1.x.x: dependencies: hoek "2.x.x" -source-list-map@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-1.1.2.tgz#9889019d1024cce55cdc069498337ef6186a11a1" - source-map-support@^0.4.2: version "0.4.15" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" dependencies: source-map "^0.5.6" -source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.3: +source-map@^0.5.0, source-map@^0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - dependencies: - spdx-license-ids "^1.0.2" - -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -3393,23 +2736,6 @@ standard@^10.0.1: eslint-plugin-standard "~3.0.1" standard-engine "~7.0.0" -stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-http@^2.3.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.1.tgz#546a51741ad5a6b07e9e31b0b10441a917df528a" - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.2.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -3425,10 +2751,6 @@ string-width@^2.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^3.0.0" -string_decoder@^0.10.25: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - string_decoder@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.1.tgz#62e200f039955a6810d8df0a33ffc0f013662d98" @@ -3445,12 +2767,6 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -3471,7 +2787,7 @@ strip-outer@^1.0.0: dependencies: escape-string-regexp "^1.0.2" -supports-color@3.1.2, supports-color@^3.1.0: +supports-color@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" dependencies: @@ -3492,10 +2808,6 @@ table@^3.7.8: slice-ansi "0.0.4" string-width "^2.0.0" -tapable@^0.2.5, tapable@~0.2.5: - version "0.2.6" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d" - tar-pack@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" @@ -3539,7 +2851,7 @@ text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" -through@^2.3.6, through@~2.3.6: +through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -3547,16 +2859,6 @@ timed-out@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" -timers-browserify@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86" - dependencies: - setimmediate "^1.0.4" - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - to-fast-properties@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" @@ -3581,10 +2883,6 @@ tryit@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - tunnel-agent@^0.4.0: version "0.4.3" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" @@ -3609,26 +2907,6 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -uglify-js@3.0.x: - version "3.0.11" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.11.tgz#81f594b9a24dad76e39da92f8f06e5b3bc8c2e11" - dependencies: - commander "~2.9.0" - source-map "~0.5.1" - -uglify-js@^2.8.27: - version "2.8.27" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.27.tgz#47787f912b0f242e5b984343be8e35e95f694c9c" - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" @@ -3648,23 +2926,12 @@ unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" -upper-case@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" - url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" dependencies: prepend-http "^1.0.1" -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - dependencies: - punycode "1.3.2" - querystring "0.2.0" - user-home@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" @@ -3679,12 +2946,6 @@ util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -util@0.10.3, util@^0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - uuid@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" @@ -3695,13 +2956,6 @@ v8flags@^2.0.10: dependencies: user-home "^1.1.1" -validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" - verror@1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" @@ -3714,82 +2968,16 @@ vise@2.x.x: dependencies: hoek "4.x.x" -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - dependencies: - indexof "0.0.1" - -watchpack@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.3.1.tgz#7d8693907b28ce6013e7f3610aa2a1acf07dad87" - dependencies: - async "^2.1.2" - chokidar "^1.4.3" - graceful-fs "^4.1.2" - -webpack-sources@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb" - dependencies: - source-list-map "^1.1.1" - source-map "~0.5.3" - -webpack@^2.3.3: - version "2.6.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.6.1.tgz#2e0457f0abb1ac5df3ab106c69c672f236785f07" - dependencies: - acorn "^5.0.0" - acorn-dynamic-import "^2.0.0" - ajv "^4.7.0" - ajv-keywords "^1.1.1" - async "^2.1.2" - enhanced-resolve "^3.0.0" - interpret "^1.0.0" - json-loader "^0.5.4" - json5 "^0.5.1" - loader-runner "^2.3.0" - loader-utils "^0.2.16" - memory-fs "~0.4.1" - mkdirp "~0.5.0" - node-libs-browser "^2.0.0" - source-map "^0.5.3" - supports-color "^3.1.0" - tapable "~0.2.5" - uglify-js "^2.8.27" - watchpack "^1.3.1" - webpack-sources "^0.2.3" - yargs "^6.0.0" - -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" dependencies: string-width "^1.0.2" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -3800,59 +2988,14 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" -xbin-loader@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/xbin-loader/-/xbin-loader-1.0.1.tgz#07cb7472dd2bba458a16c452a4ba20109a9969f4" - -xml-char-classes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d" - xtend@^4.0.0, xtend@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - yallist@^3.0.0, yallist@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" -yargs-parser@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" - dependencies: - camelcase "^3.0.0" - -yargs@^6.0.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^4.2.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - yauzl@^2.4.2: version "2.8.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.8.0.tgz#79450aff22b2a9c5a41ef54e02db907ccfbf9ee2"