From defb2f177664f2cc015a34cd33859410f37c14b8 Mon Sep 17 00:00:00 2001 From: Nathan Rajlich Date: Tue, 16 Apr 2019 11:13:15 -0700 Subject: [PATCH] Added file watcher to `now dev` (#2153) * [now dev] Add `nsfw` file watcher WIP for triggering background rebuilds. So far the `files` mapping is now kept in sync via the events produced by `nsfw`. * Add `now.json` caching and invalidation from nsfw events * Add initial rebuilding logic from filesystem watching * Remove previously built assets when a rebuild occurs * Make `@now/static` not require a hard refresh * Shut down the `nsfw` instance when stopping the DevServer * Prettier and some minor tweaks * Ship module * Support private deps * Fixed tests * Fixed integration tests * Revert "Support private deps" This reverts commit 0b4991b87641d693fa61f81223e0efc2b7006f83. * Support multiple platforms * Typed * Consider Alpine * Bumped @zeit/nsfw to latest version * Update src/commands/dev/lib/nsfw-module.ts Co-Authored-By: leo * Pass module path differently * Bumped package * Make binary executable * Wait until piping is complete * Added debug statements --- @types/promisepipe/index.d.ts | 8 + package.json | 11 +- src/commands/dev/lib/builder-cache.ts | 5 +- src/commands/dev/lib/dev-builder.ts | 28 ++- src/commands/dev/lib/dev-router.ts | 7 +- src/commands/dev/lib/dev-server.ts | 276 +++++++++++++++++++------ src/commands/dev/lib/nsfw-module.ts | 101 +++++++++ src/commands/dev/lib/static-builder.ts | 3 +- src/commands/dev/lib/types.ts | 6 +- yarn.lock | 191 ++++++++--------- 10 files changed, 460 insertions(+), 176 deletions(-) create mode 100644 @types/promisepipe/index.d.ts create mode 100644 src/commands/dev/lib/nsfw-module.ts diff --git a/@types/promisepipe/index.d.ts b/@types/promisepipe/index.d.ts new file mode 100644 index 00000000000..f3a2696a024 --- /dev/null +++ b/@types/promisepipe/index.d.ts @@ -0,0 +1,8 @@ +declare module 'promisepipe' { + import { ReadableStream, WritableStream } from 'stream' + + export default function ( + stream: ReadableStream, + anotherStream: WritableStream, + ): Promise +} diff --git a/package.json b/package.json index 5a3ab031a81..ee3d06c42cc 100644 --- a/package.json +++ b/package.json @@ -62,10 +62,10 @@ "dist/runtimes" ], "targets": [ - "node10-alpine-x64", - "node10-linux-x64", - "node10-macos-x64", - "node10-win-x64" + "node10.4.1-alpine-x64", + "node10.4.1-linux-x64", + "node10.4.1-macos-x64", + "node10.4.1-win-x64" ] }, "ava": { @@ -115,6 +115,7 @@ "@zeit/fun": "0.6.0", "@zeit/git-hooks": "0.1.4", "@zeit/ncc": "0.17.4", + "@zeit/nsfw": "2.0.1", "@zeit/source-map-support": "0.6.2", "alpha-sort": "2.0.1", "ansi-escapes": "3.0.0", @@ -178,10 +179,12 @@ "prettier": "1.16.2", "printf": "0.2.5", "progress": "2.0.3", + "promisepipe": "3.0.0", "psl": "1.1.31", "qr-image": "3.2.0", "raw-body": "2.3.3", "read-pkg": "2.0.0", + "rx-lite-aggregates": "4.0.8", "semver": "5.5.0", "serve-handler": "5.0.7", "sinon": "4.4.2", diff --git a/src/commands/dev/lib/builder-cache.ts b/src/commands/dev/lib/builder-cache.ts index 0feb3763e36..e6b04980a68 100644 --- a/src/commands/dev/lib/builder-cache.ts +++ b/src/commands/dev/lib/builder-cache.ts @@ -85,7 +85,10 @@ export async function installBuilders( packages: string[], update: boolean = false ): Promise { - if (packages.length === 1 && Object.hasOwnProperty.call(localBuilders, packages[0])) { + if ( + packages.length === 1 && + Object.hasOwnProperty.call(localBuilders, packages[0]) + ) { // Static deployment, no builders to install return; } diff --git a/src/commands/dev/lib/dev-builder.ts b/src/commands/dev/lib/dev-builder.ts index 1b853b869ca..781f17affd6 100644 --- a/src/commands/dev/lib/dev-builder.ts +++ b/src/commands/dev/lib/dev-builder.ts @@ -11,7 +11,6 @@ import { FileFsRef, download } from '@now/build-utils'; import { globBuilderInputs } from './glob'; import DevServer from './dev-server'; -import wait from '../../../util/output/wait'; import IGNORED from '../../../util/ignored'; import { LambdaSizeExceededError } from '../../../util/errors-ts'; import { installBuilders, getBuilder } from './builder-cache'; @@ -74,9 +73,6 @@ export async function executeBuild( match: BuildMatch, requestPath: string | null = null ): Promise { - if (!match.buildOutput) { - match.buildOutput = {}; - } const { builderWithPkg: { builder, package: pkg } } = match; @@ -106,18 +102,20 @@ export async function executeBuild( let result: BuildResult; try { devServer.applyBuildEnv(nowJson); - let result = await builder.build({ + const r = await builder.build({ files, entrypoint, workPath, config, meta: { isDev: true, requestPath } }); - if (!result.output) { - // `BuilderOutputs` map was returned - result = { output: result as BuilderOutputs }; + if (r.output) { + result = r as BuildResult; + } else { + // `BuilderOutputs` map was returned (Now Builder v1 behavior) + result = { output: r as BuilderOutputs }; } - outputs = result.output as BuilderOutputs; + outputs = result.output; if (typeof builder.prepareCache === 'function') { const cachePath = getWorkPath(); @@ -185,6 +183,7 @@ export async function executeBuild( }) ); + match.buildResults.set(requestPath, result); Object.assign(match.buildOutput, outputs); } @@ -202,12 +201,21 @@ export async function getBuildMatches( // of Now deployments. src = src.substring(1); } + + // TODO: use the `files` map from DevServer instead of hitting the filesystem const entries = Object.values(await collectProjectFiles(src, cwd)); for (const fileRef of entries) { src = relative(cwd, fileRef.fsPath); const builderWithPkg = await getBuilder(use); - matches.push({ ...buildConfig, src, builderWithPkg }); + matches.push({ + ...buildConfig, + src, + builderWithPkg, + buildOutput: {}, + buildResults: new Map(), + buildTimestamp: 0 + }); } } return matches; diff --git a/src/commands/dev/lib/dev-router.ts b/src/commands/dev/lib/dev-router.ts index 6487559b88f..c25d3b49b4e 100644 --- a/src/commands/dev/lib/dev-router.ts +++ b/src/commands/dev/lib/dev-router.ts @@ -28,8 +28,7 @@ export function resolveRouteParameters( export default async function( reqPath = '', routes?: RouteConfig[], - devServer?: DevServer, - files?: BuilderInputs + devServer?: DevServer ): Promise { let found: RouteResult | undefined; const { pathname: reqPathname = '/', query } = url.parse(reqPath, true); @@ -41,8 +40,8 @@ export default async function( idx++; let { src, headers, handle } = routeConfig; if (handle) { - if (handle === 'filesystem' && devServer && files) { - if (await devServer.hasFilesystem(files, reqPathname)) { + if (handle === 'filesystem' && devServer) { + if (await devServer.hasFilesystem(reqPathname)) { break; } } diff --git a/src/commands/dev/lib/dev-server.ts b/src/commands/dev/lib/dev-server.ts index c21d9f5144f..3a75e3297bf 100644 --- a/src/commands/dev/lib/dev-server.ts +++ b/src/commands/dev/lib/dev-server.ts @@ -1,6 +1,7 @@ import ms from 'ms'; import url from 'url'; import http from 'http'; +import nsfw from '@zeit/nsfw'; import fs from 'fs-extra'; import chalk from 'chalk'; import rawBody from 'raw-body'; @@ -10,6 +11,7 @@ import minimatch from 'minimatch'; import httpProxy from 'http-proxy'; import { randomBytes } from 'crypto'; import serveHandler from 'serve-handler'; +import { FileFsRef } from '@now/build-utils'; import { parse as parseDotenv } from 'dotenv'; import { lookup as lookupMimeType } from 'mime-types'; import { basename, dirname, extname, join, relative } from 'path'; @@ -19,6 +21,7 @@ import getNowJsonPath from '../../../util/config/local-path'; import isURL from './is-url'; import devRouter from './dev-router'; import { installBuilders } from './builder-cache'; +import getModuleForNSFW from './nsfw-module'; import { executeBuild, collectProjectFiles, @@ -34,6 +37,7 @@ import { DevServerOptions, BuildConfig, BuildMatch, + BuildResult, BuilderInputs, BuilderOutput, BuilderOutputs, @@ -47,19 +51,24 @@ export default class DevServer { public output: Output; public env: EnvConfig; public buildEnv: EnvConfig; + public files: BuilderInputs; + private cachedNowJson: NowConfig | null; private server: http.Server; private stopping: boolean; private buildMatches: Map; private inProgressBuilds: Map>; private originalEnv: EnvConfig; + private nsfw?: nsfw.Watcher; constructor(cwd: string, options: DevServerOptions) { this.cwd = cwd; this.output = options.output; this.env = {}; this.buildEnv = {}; + this.files = {}; + this.cachedNowJson = null; this.server = http.createServer(this.devServerHandler); this.stopping = false; this.buildMatches = new Map(); @@ -67,11 +76,115 @@ export default class DevServer { this.originalEnv = { ...process.env }; } - async getProjectFiles(): Promise { - // TODO: use the file watcher to keep the files list up-to-date - // incrementally, instead of re-globbing the filesystem every time - const files = await collectProjectFiles('**', this.cwd); - return files; + async handleFilesystemEvents(events: nsfw.Event[]): Promise { + const filesChanged: Set = new Set(); + + // First, update the `files` mapping of source files + for (const event of events) { + // TODO: for some reason the type inference isn't working, hence the casting + if (event.action === nsfw.actions.CREATED) { + await this.handleFileCreated(event as nsfw.CreatedEvent, filesChanged); + } else if (event.action === nsfw.actions.DELETED) { + this.handleFileDeleted(event as nsfw.DeletedEvent, filesChanged); + } else if (event.action === nsfw.actions.MODIFIED) { + await this.handleFileModified( + event as nsfw.ModifiedEvent, + filesChanged + ); + } else if (event.action === nsfw.actions.RENAMED) { + await this.handleFileRenamed(event as nsfw.RenamedEvent, filesChanged); + } + } + + if (filesChanged.has('now.json')) { + // The `now.json` file was changed, so invalidate the in-memory copy + this.output.debug('Invalidating cached `now.json`'); + this.cachedNowJson = null; + } + + // Update the build matches in case an entrypoint was created or deleted + const nowJson = await this.getNowJson(); + if (nowJson) { + await this.updateBuildMatches(nowJson); + } + + // Trigger rebuilds of any existing builds that are dependent + // on one of the files that has changed + const needsRebuild: Map< + BuildResult, + [string | null, BuildMatch] + > = new Map(); + for (const match of this.buildMatches.values()) { + for (const [requestPath, result] of match.buildResults) { + // If the `BuildResult` is already queued for a re-build, + // then we can skip subsequent lookups + if (needsRebuild.has(result)) continue; + + if (Array.isArray(result.watch)) { + for (const fileName of result.watch) { + if (filesChanged.has(fileName)) { + needsRebuild.set(result, [requestPath, match]); + break; + } + } + } + } + } + + if (needsRebuild.size > 0) { + this.output.debug(`Triggering ${needsRebuild.size} rebuilds`); + for (const [result, [requestPath, match]] of needsRebuild) { + this.triggerBuild(match, requestPath, null, result).catch(err => { + this.output.warn(`An error occured while rebuilding ${match.src}:`); + console.error(err.stack); + }); + } + } + } + + async handleFileCreated( + event: nsfw.CreatedEvent, + changed: Set + ): Promise { + const fsPath = join(event.directory, event.file); + const name = relative(this.cwd, fsPath); + this.output.debug(`File created: ${name}`); + this.files[name] = await FileFsRef.fromFsPath({ fsPath }); + changed.add(name); + } + + handleFileDeleted(event: nsfw.DeletedEvent, changed: Set): void { + const name = relative(this.cwd, join(event.directory, event.file)); + this.output.debug(`File deleted: ${name}`); + delete this.files[name]; + changed.add(name); + } + + async handleFileModified( + event: nsfw.ModifiedEvent, + changed: Set + ): Promise { + const fsPath = join(event.directory, event.file); + const name = relative(this.cwd, fsPath); + this.output.debug(`File modified: ${name}`); + this.files[name] = await FileFsRef.fromFsPath({ fsPath }); + changed.add(name); + } + + async handleFileRenamed( + event: nsfw.RenamedEvent, + changed: Set + ): Promise { + const oldName = relative(this.cwd, join(event.directory, event.oldFile)); + changed.add(oldName); + + const fsPath = join(event.newDirectory, event.newFile); + const name = relative(this.cwd, fsPath); + changed.add(name); + + this.output.debug(`File renamed: ${oldName} -> ${name}`); + delete this.files[oldName]; + this.files[name] = await FileFsRef.fromFsPath({ fsPath }); } async updateBuildMatches(nowJson: NowConfig): Promise { @@ -115,8 +228,11 @@ export default class DevServer { } async getNowJson(): Promise { - // TODO: use the file watcher to only invalidate this `nowJson` - // config once a change to the `now.json` file occurs + if (this.cachedNowJson) { + return this.cachedNowJson; + } + + this.output.debug('Reading `now.json` file'); const nowJsonPath = getNowJsonPath(this.cwd); try { @@ -124,6 +240,7 @@ export default class DevServer { await fs.readFile(nowJsonPath, 'utf8') ); this.validateNowConfig(config); + this.cachedNowJson = config; return config; } catch (err) { if (err.code !== 'ENOENT') { @@ -190,7 +307,17 @@ export default class DevServer { * Launches the `now dev` server. */ async start(port: number = 3000): Promise { - let address: string | null = null; + // Retrieve the path of the native module + const modulePath = await getModuleForNSFW(this.output); + + // Collect files to watch + this.files = await collectProjectFiles('**', this.cwd); + + // Start the filesystem watcher + this.nsfw = await nsfw(this.cwd, this.handleFilesystemEvents.bind(this), { modulePath }); + + await this.nsfw.start(); + const [env, buildEnv] = await Promise.all([ this.getLocalEnv('.env'), this.getLocalEnv('.env.build') @@ -215,14 +342,14 @@ export default class DevServer { ); if (needsInitialBuild.length > 0) { this.output.log('Running initial builds'); - const files = await this.getProjectFiles(); for (const match of needsInitialBuild) { - await executeBuild(nowJson, this, files, match); + await executeBuild(nowJson, this, this.files, match); } this.output.success('Initial builds complete'); } } + let address: string | null = null; while (typeof address !== 'string') { try { address = await listen(this.server, port); @@ -262,6 +389,9 @@ export default class DevServer { } } ops.push(close(this.server)); + if (this.nsfw) { + ops.push(this.nsfw.stop()); + } await Promise.all(ops); } @@ -278,8 +408,6 @@ export default class DevServer { nowRequestId: string ): Promise { return this.sendError( - // TODO: use the file watcher to keep the files list up-to-date - // incrementally req, res, nowRequestId, @@ -351,6 +479,68 @@ export default class DevServer { }; } + async triggerBuild( + match: BuildMatch, + requestPath: string | null, + req: http.IncomingMessage | null, + previousBuildResult?: BuildResult + ) { + // If the requested asset wasn't found in the match's outputs, or + // a hard-refresh was detected, then trigger a build + const buildKey = `${match.src}-${requestPath}`; + let buildPromise = this.inProgressBuilds.get(buildKey); + if (buildPromise) { + // A build for `buildKey` is already in progress, so don't trigger + // another rebuild for this request - just wait on the existing one. + let msg = `De-duping build "${buildKey}"`; + if (req) msg += ` for "${req.method} ${req.url}"`; + this.output.debug(msg); + } else if (Date.now() - match.buildTimestamp < ms('2s')) { + // If the built asset was created less than 2s ago, then don't trigger + // a rebuild. The purpose of this threshold is because once an HTML page + // is rebuilt, then the CSS/JS/etc. assets on the page are also refreshed + // with a `no-cache` header, so this avoids *two* rebuilds for that case. + let msg = `Skipping build for "${buildKey}" (not older than 2s)`; + if (req) msg += ` for "${req.method} ${req.url}"`; + this.output.debug(msg); + } else { + const nowJson = await this.getNowJson(); + if (nowJson) { + if (previousBuildResult) { + // Tear down any `output` assets from a previous build, so that they + // are not available to be served while the rebuild is in progress. + for (const [name, asset] of Object.entries( + previousBuildResult.output + )) { + this.output.debug(`Removing asset "${name}"`); + delete match.buildOutput[name]; + // TODO: shut down Lambda instance + } + } + let msg = `Building asset "${buildKey}"`; + if (req) msg += ` for "${req.method} ${req.url}"`; + this.output.debug(msg); + buildPromise = executeBuild( + nowJson, + this, + this.files, + match, + requestPath + ); + this.inProgressBuilds.set(buildKey, buildPromise); + } else { + this.output.warn( + 'Skipping build because `now.json` could not be loaded' + ); + } + } + try { + await buildPromise; + } finally { + this.inProgressBuilds.delete(buildKey); + } + } + /** * DevServer HTTP handler */ @@ -420,7 +610,6 @@ export default class DevServer { nowRequestId: string, nowJson: NowConfig ) => { - const files = await this.getProjectFiles(); await this.updateBuildMatches(nowJson); const { @@ -429,7 +618,7 @@ export default class DevServer { headers = {}, uri_args, matched_route - } = await devRouter(req.url, nowJson.routes, this, files); + } = await devRouter(req.url, nowJson.routes, this); // Set any headers defined in the matched `route` config Object.entries(headers).forEach(([name, value]) => { @@ -448,7 +637,11 @@ export default class DevServer { } const requestPath = dest.replace(/^\//, ''); - const match = await findBuildMatch(this.buildMatches, files, requestPath); + const match = await findBuildMatch( + this.buildMatches, + this.files, + requestPath + ); if (!match) { await this.send404(req, res, nowRequestId); return; @@ -456,42 +649,7 @@ export default class DevServer { let foundAsset = findAsset(match, requestPath); if (!foundAsset || this.shouldRebuild(req)) { - // If the requested asset wasn't found in the match's outputs, or - // a hard-refresh was detected, then trigger a build - const entrypoint = match.src; - const buildTimestamp: number = match.buildTimestamp || 0; - const buildKey = `${entrypoint}-${requestPath}`; - let buildPromise = this.inProgressBuilds.get(buildKey); - if (buildPromise) { - // A build for `entrypoint` is already in progress, so don't trigger - // another rebuild for this request - just wait on the existing one. - this.output.debug( - `De-duping build "${entrypoint}" for "${req.method} ${req.url}"` - ); - } else if (Date.now() - buildTimestamp < ms('2s')) { - // If the built asset was created less than 2s ago, then don't trigger - // a rebuild. The purpose of this threshold is because once an HTML page - // is rebuilt, then the CSS/JS/etc. assets on the page are also refreshed - // with a `no-cache` header, so this avoids *two* rebuilds for that case. - this.output.debug( - `Skipping build for "${entrypoint}" (not older than 2s) for "${ - req.method - } ${req.url}"` - ); - } else { - this.output.debug( - `Building asset "${entrypoint}" for "${req.method} ${ - req.url - }" (${requestPath})` - ); - buildPromise = executeBuild(nowJson, this, files, match, requestPath); - this.inProgressBuilds.set(buildKey, buildPromise); - } - try { - await buildPromise; - } finally { - this.inProgressBuilds.delete(buildKey); - } + await this.triggerBuild(match, requestPath, req); // Since the `asset` was re-built, resolve it again to get the new asset foundAsset = findAsset(match, requestPath); @@ -594,13 +752,12 @@ export default class DevServer { 'UNKNOWN_ASSET_TYPE', `Don't know how to handle asset type: ${(asset as any).type}` ); - } }; - async hasFilesystem(files: BuilderInputs, dest: string): Promise { + async hasFilesystem(dest: string): Promise { const requestPath = dest.replace(/^\//, ''); - if (await findBuildMatch(this.buildMatches, files, requestPath)) { + if (await findBuildMatch(this.buildMatches, this.files, requestPath)) { return true; } return false; @@ -674,12 +831,15 @@ async function findBuildMatch( ): Promise { for (const match of matches.values()) { const { - builderWithPkg: { builder } + builderWithPkg: { builder, package: pkg } } = match; if (typeof builder.shouldServe === 'function') { - if ( - await builder.shouldServe({ entrypoint: match.src, files, requestPath }) - ) { + const shouldServe = await builder.shouldServe({ + entrypoint: match.src, + files, + requestPath + }); + if (shouldServe) { return match; } } else if (findAsset(match, requestPath)) { diff --git a/src/commands/dev/lib/nsfw-module.ts b/src/commands/dev/lib/nsfw-module.ts new file mode 100644 index 00000000000..75ce6690d3a --- /dev/null +++ b/src/commands/dev/lib/nsfw-module.ts @@ -0,0 +1,101 @@ +import { tmpdir } from 'os'; +import { pathExists, mkdirp, createWriteStream, statSync, chmodSync } from 'fs-extra'; +import pipe from 'promisepipe'; +import { join } from 'path'; +import fetch from 'node-fetch'; +import { spawnSync } from 'child_process'; +import { devDependencies } from '../../../../package.json'; +import { Output } from '../../../util/output/create-output'; + +const platformToName: { [name: string]: string } = { + alpine: 'nsfw-alpine', + darwin: 'nsfw-macos', + linux: 'nsfw-linux' +}; + +// @ts-ignore +let { platform } = process; + +const detectAlpine = () => { + if (platform !== 'linux') { + return false; + } + + // https://github.com/sass/node-sass/issues/1589#issuecomment-265292579 + const ldd = spawnSync('ldd', [process.execPath]).stdout.toString(); + + return /\bmusl\b/.test(ldd); +}; + +if (detectAlpine()) { + // @ts-ignore + platform = 'alpine'; +} + +const name = platformToName[platform]; + +const plusxSync = (file: string): void => { + const s = statSync(file); + const newMode = s.mode | 64 | 8 | 1; + + if (s.mode === newMode) { + return; + } + + const base8 = newMode.toString(8).slice(-3); + chmodSync(file, base8); +}; + +const prepareModule = async (output: Output): Promise => { + const version = devDependencies['@zeit/nsfw']; + const fileName = `nsfw-${version}.node`; + const dirName = join(tmpdir(), 'co.zeit.now', 'dev'); + const full = join(dirName, fileName); + + if (await pathExists(full)) { + output.debug('The nsfw module is already cached, not re-downloading'); + return full; + } + + output.debug(`Creating ${dirName} for the nsfw module`); + await mkdirp(dirName); + output.debug(`Finished creating ${dirName} for the nsfw module`); + + const url = `https://github.com/zeit/nsfw/releases/download/${version}/${name}.node`; + + output.debug(`Downloading ${url}`); + const response = await fetch(url, { compress: false }); + + if (response.status !== 200) { + throw new Error(`Received invalid response: ${await response.text()}`); + } + + const target = createWriteStream(full); + + // Fill the body into the file + await pipe(response.body, target); + output.debug(`Finished downloading ${url}`); + + output.debug(`Making the nsfw binary executable`); + plusxSync(full); + output.debug(`Finished making the nsfw binary executable`); + + return full; +}; + +export default async (output: Output): Promise => { + let modulePath = null; + + try { + modulePath = await prepareModule(output); + } catch (err) { + output.error('Failed to prepare file watcher. Please try again.'); + output.debug(err); + + process.exit(1); + + return; + } + + return modulePath; +}; diff --git a/src/commands/dev/lib/static-builder.ts b/src/commands/dev/lib/static-builder.ts index e98b1c4a51d..5f55ba0ff54 100644 --- a/src/commands/dev/lib/static-builder.ts +++ b/src/commands/dev/lib/static-builder.ts @@ -5,7 +5,8 @@ export function build({ files, entrypoint }: BuilderParams): BuildResult { const output = { [entrypoint]: files[entrypoint] }; - return { output }; + const watch = [entrypoint]; + return { output, watch }; } export function shouldServe({ diff --git a/src/commands/dev/lib/types.ts b/src/commands/dev/lib/types.ts index d7fceebfb5d..c3f21cd0a6e 100644 --- a/src/commands/dev/lib/types.ts +++ b/src/commands/dev/lib/types.ts @@ -19,10 +19,10 @@ export interface BuildConfig { export interface BuildMatch extends BuildConfig { builderWithPkg: BuilderWithPackage; - buildOutput?: BuilderOutputs; - buildResult?: BuildResult; + buildOutput: BuilderOutputs; + buildResults: Map; builderCachePromise?: Promise; - buildTimestamp?: number; + buildTimestamp: number; } export interface RouteConfig { diff --git a/yarn.lock b/yarn.lock index fccd2ee8db6..bdeb1cc29e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -583,9 +583,9 @@ "@types/node" "*" "@types/node@*": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.2.tgz#dc85dde46aa8740bb4aed54b8104250f8f849503" - integrity sha512-HOtU5KqROKT7qX/itKHuTtt5fV0iXbheQvrgbLNXFJQBY/eh+VS5vmmTAVlo3qIGMsypm0G4N1t2AXjy1ZicaQ== + version "11.13.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.4.tgz#f83ec3c3e05b174b7241fadeb6688267fe5b22ca" + integrity sha512-+rabAZZ3Yn7tF/XPGHupKIL5EcAbrLxnTr/hgQICxbeuAfWtT0UZSfULE+ndusckBItcv4o6ZeOJplQikVcLvQ== "@types/node@11.11.0": version "11.11.0" @@ -745,6 +745,16 @@ resolved "https://registry.yarnpkg.com/@zeit/ncc/-/ncc-0.17.4.tgz#19688f844efd9bbe49d0d361a6f518c6f1c32a6c" integrity sha512-d931CjCTzfSC4VYDYgvvBTzhTGv7ExjumFTe8RVbXKAKoTjqOA8ZWDndqjSEbTeQTggyxCcCHm7HpZ28lScKnQ== +"@zeit/nsfw@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@zeit/nsfw/-/nsfw-2.0.1.tgz#38c716dab9679db14816ae50996ba87e2df4cd12" + integrity sha512-rQskMpNg+PZOrMJzEG5Pr50PpXq8nOgqafHhhduIXCncp0+y32s3mB1OqVfRPWNRbaEcynDL8gORkOW2X58THA== + dependencies: + fs-extra "^7.0.0" + lodash.isinteger "^4.0.4" + lodash.isundefined "^3.0.1" + nan "^2.0.0" + "@zeit/source-map-support@0.6.2": version "0.6.2" resolved "https://registry.yarnpkg.com/@zeit/source-map-support/-/source-map-support-0.6.2.tgz#0efd478f24a606726948165e53a8efe89e24036f" @@ -813,7 +823,7 @@ ansi-escapes@3.0.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" integrity sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ== -ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: +ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== @@ -1472,11 +1482,6 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2, chalk@~2.4. escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= - chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -1683,9 +1688,9 @@ commondir@^1.0.1: integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== concat-map@0.0.1: version "0.0.1" @@ -2370,9 +2375,9 @@ eslint-import-resolver-typescript@1.1.1: tsconfig-paths "^3.6.0" eslint-module-utils@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz#546178dab5e046c8b562bbb50705e2456d7bda49" - integrity sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w== + version "2.4.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz#8b93499e9b00eab80ccb6614e69f03678e84e09a" + integrity sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw== dependencies: debug "^2.6.8" pkg-dir "^2.0.0" @@ -2683,15 +2688,6 @@ extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^2.0.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" - integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - external-editor@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" @@ -2946,7 +2942,7 @@ fs-extra@7.0.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@7.0.1: +fs-extra@7.0.1, fs-extra@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -2977,12 +2973,12 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" - integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== + version "1.2.8" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.8.tgz#57ea5320f762cd4696e5e8e87120eccc8b11cacf" + integrity sha512-tPvHgPGB7m40CZ68xqFGkKuzN+RnpGmSV+hgeKxhRpbxdqKXUFJGC3yonBOLzQBcJyGpdZFDfCsdOC2KFsXzeA== dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" + nan "^2.12.1" + node-pre-gyp "^0.12.0" function-bind@^1.1.1: version "1.1.1" @@ -3200,9 +3196,9 @@ graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1. integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= handlebars@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.1.tgz#6e4e41c18ebe7719ae4d38e5aca3d32fa3dd23d3" - integrity sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA== + version "4.1.2" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" + integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== dependencies: neo-async "^2.6.0" optimist "^0.6.1" @@ -3378,7 +3374,7 @@ iconv-lite@0.4.23: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -3480,26 +3476,11 @@ inquirer@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" inquirer@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" - integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== + version "6.3.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7" + integrity sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA== dependencies: ansi-escapes "^3.2.0" chalk "^2.4.2" @@ -3512,7 +3493,7 @@ inquirer@^6.2.2: run-async "^2.2.0" rxjs "^6.4.0" string-width "^2.1.0" - strip-ansi "^5.0.0" + strip-ansi "^5.1.0" through "^2.3.6" into-stream@4.0.0: @@ -3634,9 +3615,9 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: kind-of "^6.0.2" is-error@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.1.tgz#684a96d84076577c98f4cdb40c6d26a5123bf19c" - integrity sha1-aEqW2EB2V3yY9M20DG0mpRI78Zw= + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.2.tgz#c10ade187b3c93510c5470a5567833ee25649843" + integrity sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" @@ -3852,55 +3833,55 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-lib-coverage@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#0b891e5ad42312c2b9488554f603795f9a2211ba" - integrity sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw== +istanbul-lib-coverage@^2.0.3, istanbul-lib-coverage@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#927a354005d99dd43a24607bb8b33fd4e9aca1ad" + integrity sha512-LXTBICkMARVgo579kWDm8SqfB6nvSDKNqIOBEjmJRnL04JvoMHCYGWaMddQnseJYtkEuEvO/sIcOxPLk9gERug== istanbul-lib-hook@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.3.tgz#e0e581e461c611be5d0e5ef31c5f0109759916fb" - integrity sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA== + version "2.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.6.tgz#5baa6067860a38290aef038b389068b225b01b7d" + integrity sha512-829DKONApZ7UCiPXcOYWSgkFXa4+vNYoNOt3F+4uDJLKL1OotAoVwvThoEj1i8jmOj7odbYcR3rnaHu+QroaXg== dependencies: append-transform "^1.0.0" istanbul-lib-instrument@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz#a2b5484a7d445f1f311e93190813fa56dfb62971" - integrity sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.2.0.tgz#c549208da8a793f6622257a2da83e0ea96ae6a93" + integrity sha512-06IM3xShbNW4NgZv5AP4QH0oHqf1/ivFo8eFys0ZjPXHGldHJQWb3riYOKXqmOqfxXBfxu4B+g/iuhOPZH0RJg== dependencies: "@babel/generator" "^7.0.0" "@babel/parser" "^7.0.0" "@babel/template" "^7.0.0" "@babel/traverse" "^7.0.0" "@babel/types" "^7.0.0" - istanbul-lib-coverage "^2.0.3" - semver "^5.5.0" + istanbul-lib-coverage "^2.0.4" + semver "^6.0.0" istanbul-lib-report@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz#bfd324ee0c04f59119cb4f07dab157d09f24d7e4" - integrity sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA== + version "2.0.7" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.7.tgz#370d80d433c4dbc7f58de63618f49599c74bd954" + integrity sha512-wLH6beJBFbRBLiTlMOBxmb85cnVM1Vyl36N48e4e/aTKSM3WbOx7zbVIH1SQ537fhhsPbX0/C5JB4qsmyRXXyA== dependencies: - istanbul-lib-coverage "^2.0.3" - make-dir "^1.3.0" + istanbul-lib-coverage "^2.0.4" + make-dir "^2.1.0" supports-color "^6.0.0" istanbul-lib-source-maps@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz#f1e817229a9146e8424a28e5d69ba220fda34156" - integrity sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ== + version "3.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.5.tgz#1d9ee9d94d2633f15611ee7aae28f9cac6d1aeb9" + integrity sha512-eDhZ7r6r1d1zQPVZehLc3D0K14vRba/eBYkz3rw16DLOrrTzve9RmnkcwrrkWVgO1FL3EK5knujVe5S8QHE9xw== dependencies: debug "^4.1.1" - istanbul-lib-coverage "^2.0.3" - make-dir "^1.3.0" + istanbul-lib-coverage "^2.0.4" + make-dir "^2.1.0" rimraf "^2.6.2" source-map "^0.6.1" istanbul-reports@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.1.1.tgz#72ef16b4ecb9a4a7bd0e2001e00f95d1eec8afa9" - integrity sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw== + version "2.2.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.2.tgz#b84303c46fc0541c3c3b69abae687c42a6907d44" + integrity sha512-ZFuTdBQ3PSaPnm02aEA4R6mzQ2AF9w03CYiXADzWbbE48v/EFOWF4MaX4FT0NRdqIk48I7o0RPi+S8TMswaCbQ== dependencies: handlebars "^4.1.0" @@ -4173,6 +4154,11 @@ lodash.get@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + lodash.islength@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.islength/-/lodash.islength-4.0.1.tgz#4e9868d452575d750affd358c979543dc20ed577" @@ -4183,6 +4169,11 @@ lodash.isplainobject@^4.0.6: resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= +lodash.isundefined@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz#23ef3d9535565203a66cefd5b830f848911afb48" + integrity sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g= + lodash.merge@4.6.x, lodash.merge@^4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" @@ -4193,7 +4184,7 @@ lodash.unescape@4.0.1: resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= -lodash@^4.17.11, lodash@^4.3.0: +lodash@^4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -4556,7 +4547,7 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -nan@^2.9.2: +nan@^2.0.0, nan@^2.12.1: version "2.13.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== @@ -4631,10 +4622,10 @@ node-fetch@2.3.0: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -5650,6 +5641,11 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + require-precompiled@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/require-precompiled/-/require-precompiled-0.1.0.tgz#5a1b52eb70ebed43eb982e974c85ab59571e56fa" @@ -5738,14 +5734,14 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" -rx-lite-aggregates@^4.0.8: +rx-lite-aggregates@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= dependencies: rx-lite "*" -rx-lite@*, rx-lite@^4.0.8: +rx-lite@*: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= @@ -5808,6 +5804,11 @@ semver@5.5.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== +semver@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" + integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== + semver@~5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" @@ -6184,7 +6185,7 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -6343,14 +6344,14 @@ term-size@^1.2.0: execa "^0.7.0" test-exclude@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.1.0.tgz#6ba6b25179d2d38724824661323b73e03c0c1de1" - integrity sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA== + version "5.2.2" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.2.tgz#7322f8ab037b0b93ad2aab35fe9068baf997a4c4" + integrity sha512-N2pvaLpT8guUpb5Fe1GJlmvmzH3x+DAKmmyEQmFP792QcLYoGE1syxztSvPD1V8yPe6VrcCt6YGQVjSRjCASsA== dependencies: - arrify "^1.0.1" + glob "^7.1.3" minimatch "^3.0.4" read-pkg-up "^4.0.0" - require-main-filename "^1.0.1" + require-main-filename "^2.0.0" test-listen@1.1.0: version "1.1.0"