Update watching system to report more timing info to webpack

Add snapshotting feature to FileSystemInfo for better performance
This commit is contained in:
Tobias Koppers 2019-01-05 14:58:06 +01:00
parent e7922011d6
commit 4492c30ac4
8 changed files with 223 additions and 317 deletions

View File

@ -84,6 +84,136 @@ class FileSystemInfo {
this.contextTimestampQueue.add(path, callback); this.contextTimestampQueue.add(path, callback);
} }
createSnapshot(startTime, files, directories, missing, options, callback) {
const fileTimestamps = new Map();
const contextTimestamps = new Map();
const missingTimestamps = new Map();
let jobs = 1;
const jobDone = () => {
if (--jobs === 0) {
callback(null, {
startTime,
fileTimestamps,
contextTimestamps,
missingTimestamps
});
}
};
for (const path of files) {
const cache = this._fileTimestamps.get(path);
if (cache !== undefined) {
fileTimestamps.set(path, cache);
} else {
jobs++;
this.fileTimestampQueue.add(path, (err, entry) => {
if (err) {
fileTimestamps.set(path, "error");
} else {
fileTimestamps.set(path, entry);
}
jobDone();
});
}
}
for (const path of directories) {
contextTimestamps.set(path, "error");
// TODO: getContextTimestamp is not implemented yet
}
for (const path of missing) {
const cache = this._fileTimestamps.get(path);
if (cache !== undefined) {
missingTimestamps.set(path, cache);
} else {
jobs++;
this.fileTimestampQueue.add(path, (err, entry) => {
if (err) {
missingTimestamps.set(path, "error");
} else {
missingTimestamps.set(path, entry);
}
jobDone();
});
}
}
jobDone();
}
checkSnapshotValid(snapshot, callback) {
const {
startTime,
fileTimestamps,
contextTimestamps,
missingTimestamps
} = snapshot;
let jobs = 1;
const jobDone = () => {
if (--jobs === 0) {
callback(null, true);
}
};
const invalid = () => {
if (jobs > 0) {
jobs = NaN;
callback(null, false);
}
};
const checkExistance = (current, snap) => {
if (snap === "error") {
return current && current.safeTime <= startTime;
}
return !current === !snap;
};
const checkFile = (current, snap) => {
if (snap === "error") {
return current && current.safeTime <= startTime;
}
if (!current !== !snap) return false;
if (current && current.timestamp) {
return current.timestamp === snap.timestamp;
}
return !current;
};
for (const [path, ts] of fileTimestamps) {
const cache = this._fileTimestamps.get(path);
if (cache !== undefined) {
if (!checkFile(cache, ts)) {
invalid();
}
} else {
jobs++;
this.fileTimestampQueue.add(path, (err, entry) => {
if (!checkFile(entry, ts)) {
invalid();
} else {
jobDone();
}
});
}
}
if (contextTimestamps.size > 0) {
// TODO: getContextTimestamp is not implemented yet
invalid();
}
for (const [path, ts] of missingTimestamps) {
const cache = this._fileTimestamps.get(path);
if (cache !== undefined) {
if (!checkExistance(cache, ts)) {
invalid();
}
} else {
jobs++;
this.fileTimestampQueue.add(path, (err, entry) => {
if (!checkExistance(entry, ts)) {
invalid();
} else {
jobDone();
}
});
}
}
jobDone();
}
// TODO getFileHash(path, callback) // TODO getFileHash(path, callback)
_readFileTimestamp(path, callback) { _readFileTimestamp(path, callback) {
@ -101,7 +231,7 @@ class FileSystemInfo {
const mtime = +stat.mtime || Infinity; const mtime = +stat.mtime || Infinity;
const ts = { const ts = {
safeTime: mtime + FS_ACCURACY, safeTime: mtime + FS_ACCURACY,
timestamp: mtime timestamp: stat.isFile() ? mtime : undefined
}; };
this._fileTimestamps.set(path, ts); this._fileTimestamps.set(path, ts);

View File

@ -34,15 +34,7 @@ class IgnoringWatchFileSystem {
missing, missing,
startTime, startTime,
options, options,
( (err, fileTimestamps, dirTimestamps, removedFiles) => {
err,
filesModified,
dirsModified,
missingModified,
fileTimestamps,
dirTimestamps,
removedFiles
) => {
if (err) return callback(err); if (err) return callback(err);
for (const path of ignoredFiles) { for (const path of ignoredFiles) {
fileTimestamps.set(path, 1); fileTimestamps.set(path, 1);
@ -52,15 +44,7 @@ class IgnoringWatchFileSystem {
dirTimestamps.set(path, 1); dirTimestamps.set(path, 1);
} }
callback( callback(err, fileTimestamps, dirTimestamps, removedFiles);
err,
filesModified,
dirsModified,
missingModified,
fileTimestamps,
dirTimestamps,
removedFiles
);
}, },
callbackUndelayed callbackUndelayed
); );
@ -68,15 +52,15 @@ class IgnoringWatchFileSystem {
return { return {
close: () => watcher.close(), close: () => watcher.close(),
pause: () => watcher.pause(), pause: () => watcher.pause(),
getContextTimestamps: () => { getContextInfoEntries: () => {
const dirTimestamps = watcher.getContextTimestamps(); const dirTimestamps = watcher.getContextInfoEntries();
for (const path of ignoredDirs) { for (const path of ignoredDirs) {
dirTimestamps.set(path, 1); dirTimestamps.set(path, 1);
} }
return dirTimestamps; return dirTimestamps;
}, },
getFileTimestamps: () => { getFileTimeInfoEntries: () => {
const fileTimestamps = watcher.getFileTimestamps(); const fileTimestamps = watcher.getFileTimeInfoEntries();
for (const path of ignoredFiles) { for (const path of ignoredFiles) {
fileTimestamps.set(path, 1); fileTimestamps.set(path, 1);
} }

View File

@ -19,15 +19,6 @@ const Stats = require("./Stats");
* @param {T=} result * @param {T=} result
*/ */
// TODO refactor watchpack to report timestamps in the correct format
const toFileSystemInfoEntryMap = timestamps => {
const map = new Map();
for (const [key, ts] of timestamps) {
map.set(key, ts ? { safeTime: ts } : null);
}
return map;
};
class Watching { class Watching {
/** /**
* @param {Compiler} compiler the compiler * @param {Compiler} compiler the compiler
@ -164,24 +155,14 @@ class Watching {
missing, missing,
this.startTime, this.startTime,
this.watchOptions, this.watchOptions,
( (err, fileTimeInfoEntries, contextTimeInfoEntries, removedFiles) => {
err,
filesModified,
contextModified,
missingModified,
fileTimestamps,
contextTimestamps,
removedFiles
) => {
this.pausedWatcher = this.watcher; this.pausedWatcher = this.watcher;
this.watcher = null; this.watcher = null;
if (err) { if (err) {
return this.handler(err); return this.handler(err);
} }
this.compiler.fileTimestamps = toFileSystemInfoEntryMap(fileTimestamps); this.compiler.fileTimestamps = fileTimeInfoEntries;
this.compiler.contextTimestamps = toFileSystemInfoEntryMap( this.compiler.contextTimestamps = contextTimeInfoEntries;
contextTimestamps
);
this.compiler.removedFiles = removedFiles; this.compiler.removedFiles = removedFiles;
this._invalidate(); this._invalidate();
}, },
@ -200,12 +181,8 @@ class Watching {
this.callbacks.push(callback); this.callbacks.push(callback);
} }
if (this.watcher) { if (this.watcher) {
this.compiler.fileTimestamps = toFileSystemInfoEntryMap( this.compiler.fileTimestamps = this.watcher.getFileTimeInfoEntries();
this.watcher.getFileTimestamps() this.compiler.contextTimestamps = this.watcher.getContextTimeInfoEntries();
);
this.compiler.contextTimestamps = toFileSystemInfoEntryMap(
this.watcher.getContextTimestamps()
);
} }
this._invalidate(); this._invalidate();
} }

View File

@ -5,14 +5,10 @@
"use strict"; "use strict";
const asyncLib = require("neo-async");
/** @typedef {import("enhanced-resolve/lib/Resolver")} Resolver */ /** @typedef {import("enhanced-resolve/lib/Resolver")} Resolver */
/** @typedef {import("../Compiler")} Compiler */ /** @typedef {import("../Compiler")} Compiler */
/** @typedef {import("../FileSystemInfo")} FileSystemInfo */ /** @typedef {import("../FileSystemInfo")} FileSystemInfo */
const INVALID = {};
const requestToString = request => { const requestToString = request => {
let str = ""; let str = "";
for (const key in request) { for (const key in request) {
@ -76,69 +72,37 @@ class ResolverCachePlugin {
propagate("fileDependencies"); propagate("fileDependencies");
propagate("contextDependencies"); propagate("contextDependencies");
if (err) return callback(err); if (err) return callback(err);
const fileDependencies = new Set(newResolveContext.fileDependencies); const fileDependencies = newResolveContext.fileDependencies;
if (newResolveContext.missing) { const contextDependencies = newResolveContext.contextDependencies;
for (const missing of newResolveContext.missing) { const missingDependencies = newResolveContext.missing;
fileDependencies.add(missing);
}
}
const contextDependencies = new Set(
newResolveContext.contextDependencies
);
// TODO remove this when enhanced-resolve supports fileDependencies // TODO remove this when enhanced-resolve supports fileDependencies
if (result && result.path) { if (result && result.path) {
fileDependencies.add(result.path); fileDependencies.add(result.path);
} }
const fileTimestamps = new Map(); fileSystemInfo.createSnapshot(
const contextTimestamps = new Map(); resolveTime,
const store = () => { fileDependencies,
contextDependencies,
missingDependencies,
null,
(err, snapshot) => {
if (err) return callback(err);
cache.store( cache.store(
identifier, identifier,
null, null,
{ {
result, result,
resolveTime, missing: newResolveContext.missing,
fileTimestamps, fileDependencies: newResolveContext.fileDependencies,
contextTimestamps contextDependencies: newResolveContext.contextDependencies,
snapshot
}, },
restoreErr => { storeErr => {
if (restoreErr) return callback(restoreErr); if (storeErr) return callback(storeErr);
if (result) return callback(null, result); if (result) return callback(null, result);
callback(); callback();
} }
); );
};
asyncLib.parallel(
[
asyncLib.each.bind(
asyncLib,
fileDependencies,
(dep, callback) => {
fileSystemInfo.getFileTimestamp(dep, (err, entry) => {
if (err) {
fileTimestamps.set(dep, "error");
} else {
fileTimestamps.set(dep, entry && entry.timestamp);
}
callback();
});
}
),
asyncLib.each.bind(
asyncLib,
contextDependencies,
(dep, callback) => {
fileSystemInfo.getContextTimestamp(dep, (err, entry) => {
contextTimestamps.set(dep, "error");
// TODO: getContextTimestamp is not implemented yet
callback();
});
}
)
],
err => {
if (err) return callback(err);
store();
} }
); );
} }
@ -167,73 +131,14 @@ class ResolverCachePlugin {
const identifier = `/resolve/${type}${requestToString( const identifier = `/resolve/${type}${requestToString(
request request
)}`; )}`;
cache.get(identifier, null, (err, cacheEntry) => { const processCacheResult = (err, cacheEntry) => {
if (err) return callback(err); if (err) return callback(err);
if (cacheEntry) { if (cacheEntry) {
const { fileSystemInfo.checkSnapshotValid(
result, cacheEntry.snapshot,
resolveTime, (err, valid) => {
fileTimestamps, if (err || !valid) {
contextTimestamps
} = cacheEntry;
asyncLib.parallel(
[
asyncLib.each.bind(
asyncLib,
fileTimestamps,
([dep, ts], callback) => {
fileSystemInfo.getFileTimestamp(
dep,
(err, entry) => {
if (err) return callback(err);
if (ts === "error") {
return callback(
!entry || entry.safeTime > resolveTime
? INVALID
: null
);
}
if (!entry !== !ts) return callback(INVALID);
if (entry && entry.timestamp) {
return callback(
entry.timestamp !== ts ? INVALID : null
);
}
callback();
}
);
}
),
asyncLib.each.bind(
asyncLib,
contextTimestamps,
([dep, ts], callback) => {
fileSystemInfo.getContextTimestamp(
dep,
(err, entry) => {
if (err) return callback(err);
if (ts === "error") {
return callback(
!entry || entry.safeTime > resolveTime
? INVALID
: null
);
}
if (!entry !== !ts) return callback(INVALID);
if (entry && entry.timestamp) {
return callback(
entry.timestamp !== ts ? INVALID : null
);
}
callback();
}
);
}
)
],
err => {
if (err) {
return doRealResolve( return doRealResolve(
identifier, identifier,
type, type,
@ -243,7 +148,22 @@ class ResolverCachePlugin {
callback callback
); );
} }
callback(null, result); if (resolveContext.missing) {
for (const item of cacheEntry.missing) {
resolveContext.missing.add(item);
}
}
if (resolveContext.fileDependencies) {
for (const item of cacheEntry.fileDependencies) {
resolveContext.fileDependencies.add(item);
}
}
if (resolveContext.contextDependencies) {
for (const item of cacheEntry.contextDependencies) {
resolveContext.contextDependencies.add(item);
}
}
callback(null, cacheEntry.result);
} }
); );
} else { } else {
@ -256,7 +176,8 @@ class ResolverCachePlugin {
callback callback
); );
} }
}); };
cache.get(identifier, null, processCacheResult);
} }
); );
} }

View File

@ -6,7 +6,6 @@
"use strict"; "use strict";
const Watchpack = require("watchpack"); const Watchpack = require("watchpack");
const objectToMap = require("../util/objectToMap");
class NodeWatchFileSystem { class NodeWatchFileSystem {
constructor(inputFileSystem) { constructor(inputFileSystem) {
@ -48,24 +47,16 @@ class NodeWatchFileSystem {
const cachedFiles = files; const cachedFiles = files;
const cachedDirs = dirs; const cachedDirs = dirs;
this.watcher.once("aggregated", (changes, removals) => { this.watcher.once("aggregated", (changes, removals) => {
changes = changes.concat(removals);
if (this.inputFileSystem && this.inputFileSystem.purge) { if (this.inputFileSystem && this.inputFileSystem.purge) {
this.inputFileSystem.purge(changes); for (const item of changes) {
this.inputFileSystem.purge(item);
} }
const times = objectToMap(this.watcher.getTimes()); for (const item of removals) {
files = new Set(files); this.inputFileSystem.purge(item);
dirs = new Set(dirs); }
missing = new Set(missing); }
removals = new Set(removals.filter(file => files.has(file))); const times = this.watcher.getTimeInfoEntries();
callback( callback(null, times, times, removals);
null,
changes.filter(file => files.has(file)).sort(),
changes.filter(file => dirs.has(file)).sort(),
changes.filter(file => missing.has(file)).sort(),
times,
times,
removals
);
}); });
this.watcher.watch(cachedFiles.concat(missing), cachedDirs, startTime); this.watcher.watch(cachedFiles.concat(missing), cachedDirs, startTime);
@ -85,16 +76,16 @@ class NodeWatchFileSystem {
this.watcher.pause(); this.watcher.pause();
} }
}, },
getFileTimestamps: () => { getFileTimeInfoEntries: () => {
if (this.watcher) { if (this.watcher) {
return objectToMap(this.watcher.getTimes()); return this.watcher.getTimeInfoEntries();
} else { } else {
return new Map(); return new Map();
} }
}, },
getContextTimestamps: () => { getContextInfoEntries: () => {
if (this.watcher) { if (this.watcher) {
return objectToMap(this.watcher.getTimes()); return this.watcher.getTimeInfoEntries();
} else { } else {
return new Map(); return new Map();
} }

View File

@ -28,7 +28,7 @@
"schema-utils": "^0.4.4", "schema-utils": "^0.4.4",
"tapable": "^1.1.0", "tapable": "^1.1.0",
"terser-webpack-plugin": "^1.2.1", "terser-webpack-plugin": "^1.2.1",
"watchpack": "^1.5.0", "watchpack": "2.0.0-beta.2",
"webpack-sources": "^1.3.0" "webpack-sources": "^1.3.0"
}, },
"devDependencies": { "devDependencies": {

View File

@ -181,13 +181,17 @@ const describeCases = config => {
rimraf(cacheDirectory, done); rimraf(cacheDirectory, done);
}); });
if (config.cache) { if (config.cache) {
it(`${testName} should pre-compile to fill disk cache`, done => { it(`${testName} should pre-compile to fill disk cache (1st)`, done => {
const compiler = webpack(options, err => { webpack(options, err => {
if (err) return done(err); if (err) return done(err);
compiler.close(() => {
done(); done();
}); });
}); });
it(`${testName} should pre-compile to fill disk cache (2nd)`, done => {
webpack(options, err => {
if (err) return done(err);
done();
});
}); });
} }
it( it(

121
yarn.lock
View File

@ -550,11 +550,6 @@ astral-regex@^1.0.0:
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
async-each@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
integrity sha1-GdOGodntxufByF04iu28xW0zYC0=
async-limiter@~1.0.0: async-limiter@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
@ -839,11 +834,6 @@ big.js@^3.1.3:
resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==
binary-extensions@^1.0.0:
version "1.11.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
integrity sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=
bluebird@^3.5.0, bluebird@^3.5.x: bluebird@^3.5.0, bluebird@^3.5.x:
version "3.5.1" version "3.5.1"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
@ -878,7 +868,7 @@ braces@^1.8.2:
preserve "^0.2.0" preserve "^0.2.0"
repeat-element "^1.1.2" repeat-element "^1.1.2"
braces@^2.3.0, braces@^2.3.1: braces@^2.3.1:
version "2.3.2" version "2.3.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
@ -1081,25 +1071,6 @@ chardet@^0.7.0:
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
chokidar@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176"
integrity sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==
dependencies:
anymatch "^2.0.0"
async-each "^1.0.0"
braces "^2.3.0"
glob-parent "^3.1.0"
inherits "^2.0.1"
is-binary-path "^1.0.0"
is-glob "^4.0.0"
normalize-path "^2.1.1"
path-is-absolute "^1.0.0"
readdirp "^2.0.0"
upath "^1.0.0"
optionalDependencies:
fsevents "^1.1.2"
chownr@^1.0.1, chownr@^1.1.1: chownr@^1.0.1, chownr@^1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
@ -2555,14 +2526,6 @@ fs.realpath@^1.0.0:
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
fsevents@^1.1.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.2.tgz#4f598f0f69b273188ef4a62ca4e9e08ace314bbf"
integrity sha512-iownA+hC4uHFp+7gwP/y5SzaiUo7m2vpa0dhpzw8YuKtiZsz7cIXsFbXpLEeBM6WuCQyw1MH4RRe6XI8GFUctQ==
dependencies:
nan "^2.9.2"
node-pre-gyp "^0.9.0"
fsevents@^1.2.3: fsevents@^1.2.3:
version "1.2.4" version "1.2.4"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
@ -2658,14 +2621,6 @@ glob-parent@^2.0.0:
dependencies: dependencies:
is-glob "^2.0.0" is-glob "^2.0.0"
glob-parent@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
dependencies:
is-glob "^3.1.0"
path-dirname "^1.0.0"
glob@^5.0.15: glob@^5.0.15:
version "5.0.15" version "5.0.15"
resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
@ -3094,13 +3049,6 @@ is-arrayish@^0.2.1:
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
is-binary-path@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
dependencies:
binary-extensions "^1.0.0"
is-buffer@^1.1.5: is-buffer@^1.1.5:
version "1.1.6" version "1.1.6"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
@ -3211,7 +3159,7 @@ is-extglob@^1.0.0:
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=
is-extglob@^2.1.0, is-extglob@^2.1.1: is-extglob@^2.1.1:
version "2.1.1" version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
@ -3247,13 +3195,6 @@ is-glob@^2.0.0, is-glob@^2.0.1:
dependencies: dependencies:
is-extglob "^1.0.0" is-extglob "^1.0.0"
is-glob@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
dependencies:
is-extglob "^2.1.0"
is-glob@^4.0.0: is-glob@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
@ -4697,7 +4638,7 @@ mimic-fn@^1.0.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: "minimatch@2 || 3", minimatch@^3.0.3, minimatch@^3.0.4:
version "3.0.4" version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@ -4828,7 +4769,7 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
needle@^2.2.0, needle@^2.2.1: needle@^2.2.1:
version "2.2.1" version "2.2.1"
resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
integrity sha512-t/ZswCM9JTWjAdXS9VpvqhI2Ct2sL2MdY4fUXqGJaGBk13ge99ObqRksRTbBE56K+wxUXwwfZYOuZHifFW9q+Q== integrity sha512-t/ZswCM9JTWjAdXS9VpvqhI2Ct2sL2MdY4fUXqGJaGBk13ge99ObqRksRTbBE56K+wxUXwwfZYOuZHifFW9q+Q==
@ -4891,22 +4832,6 @@ node-pre-gyp@^0.10.0:
semver "^5.3.0" semver "^5.3.0"
tar "^4" tar "^4"
node-pre-gyp@^0.9.0:
version "0.9.1"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz#f11c07516dd92f87199dbc7e1838eab7cd56c9e0"
integrity sha1-8RwHUW3ZL4cZnbx+GDjqt81WyeA=
dependencies:
detect-libc "^1.0.2"
mkdirp "^0.5.1"
needle "^2.2.0"
nopt "^4.0.1"
npm-packlist "^1.1.6"
npmlog "^4.0.2"
rc "^1.1.7"
rimraf "^2.6.1"
semver "^5.3.0"
tar "^4"
nopt@3.x: nopt@3.x:
version "3.0.6" version "3.0.6"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
@ -5249,11 +5174,6 @@ pascalcase@^0.1.1:
resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
path-dirname@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
path-exists@^2.0.0: path-exists@^2.0.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
@ -5946,7 +5866,7 @@ raw-loader@~0.5.0, raw-loader@~0.5.1:
resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
integrity sha1-DD0L6u2KAclm2Xh793goElKpeao= integrity sha1-DD0L6u2KAclm2Xh793goElKpeao=
rc@^1.1.7, rc@^1.2.7: rc@^1.2.7:
version "1.2.8" version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
@ -6003,7 +5923,7 @@ read-pkg@^4.0.1:
parse-json "^4.0.0" parse-json "^4.0.0"
pify "^3.0.0" pify "^3.0.0"
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@~2.3.6: "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@~2.3.6:
version "2.3.6" version "2.3.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
@ -6016,16 +5936,6 @@ read-pkg@^4.0.1:
string_decoder "~1.1.1" string_decoder "~1.1.1"
util-deprecate "~1.0.1" util-deprecate "~1.0.1"
readdirp@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
integrity sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=
dependencies:
graceful-fs "^4.1.2"
minimatch "^3.0.2"
readable-stream "^2.0.2"
set-immediate-shim "^1.0.1"
realpath-native@^1.0.0: realpath-native@^1.0.0:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.1.tgz#07f40a0cce8f8261e2e8b7ebebf5c95965d7b633" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.1.tgz#07f40a0cce8f8261e2e8b7ebebf5c95965d7b633"
@ -6458,11 +6368,6 @@ set-blocking@^2.0.0, set-blocking@~2.0.0:
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
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"
integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=
set-value@^0.4.3: set-value@^0.4.3:
version "0.4.3" version "0.4.3"
resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
@ -7212,11 +7117,6 @@ unset-value@^1.0.0:
has-value "^0.3.1" has-value "^0.3.1"
isobject "^3.0.0" isobject "^3.0.0"
upath@^1.0.0:
version "1.0.5"
resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.5.tgz#02cab9ecebe95bbec6d5fc2566325725ab6d1a73"
integrity sha512-qbKn90aDQ0YEwvXoLqj0oiuUYroLX2lVHZ+b+xwjozFasAOC4GneDq5+OaIG5Zj+jFmbz/uO+f7a9qxjktJQww==
uri-js@^4.2.2: uri-js@^4.2.2:
version "4.2.2" version "4.2.2"
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
@ -7327,12 +7227,11 @@ watch@~0.18.0:
exec-sh "^0.2.0" exec-sh "^0.2.0"
minimist "^1.2.0" minimist "^1.2.0"
watchpack@^1.5.0: watchpack@2.0.0-beta.2:
version "1.6.0" version "2.0.0-beta.2"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.0-beta.2.tgz#357ed627767dd16ed80500f49c5d4029b49248cb"
integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== integrity sha512-dzFk3sOzcuIC9s+6Qek6Y0cQmk+N8VvUSY1BtB9wCEpfbcUFOQS7tlD1wRnwq2gv+orBYB/td4hO59Z4lg6ELQ==
dependencies: dependencies:
chokidar "^2.0.2"
graceful-fs "^4.1.2" graceful-fs "^4.1.2"
neo-async "^2.5.0" neo-async "^2.5.0"