mirror of https://github.com/webpack/webpack.git
Update watching system to report more timing info to webpack
Add snapshotting feature to FileSystemInfo for better performance
This commit is contained in:
parent
e7922011d6
commit
4492c30ac4
|
@ -84,6 +84,136 @@ class FileSystemInfo {
|
|||
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)
|
||||
|
||||
_readFileTimestamp(path, callback) {
|
||||
|
@ -101,7 +231,7 @@ class FileSystemInfo {
|
|||
const mtime = +stat.mtime || Infinity;
|
||||
const ts = {
|
||||
safeTime: mtime + FS_ACCURACY,
|
||||
timestamp: mtime
|
||||
timestamp: stat.isFile() ? mtime : undefined
|
||||
};
|
||||
|
||||
this._fileTimestamps.set(path, ts);
|
||||
|
|
|
@ -34,15 +34,7 @@ class IgnoringWatchFileSystem {
|
|||
missing,
|
||||
startTime,
|
||||
options,
|
||||
(
|
||||
err,
|
||||
filesModified,
|
||||
dirsModified,
|
||||
missingModified,
|
||||
fileTimestamps,
|
||||
dirTimestamps,
|
||||
removedFiles
|
||||
) => {
|
||||
(err, fileTimestamps, dirTimestamps, removedFiles) => {
|
||||
if (err) return callback(err);
|
||||
for (const path of ignoredFiles) {
|
||||
fileTimestamps.set(path, 1);
|
||||
|
@ -52,15 +44,7 @@ class IgnoringWatchFileSystem {
|
|||
dirTimestamps.set(path, 1);
|
||||
}
|
||||
|
||||
callback(
|
||||
err,
|
||||
filesModified,
|
||||
dirsModified,
|
||||
missingModified,
|
||||
fileTimestamps,
|
||||
dirTimestamps,
|
||||
removedFiles
|
||||
);
|
||||
callback(err, fileTimestamps, dirTimestamps, removedFiles);
|
||||
},
|
||||
callbackUndelayed
|
||||
);
|
||||
|
@ -68,15 +52,15 @@ class IgnoringWatchFileSystem {
|
|||
return {
|
||||
close: () => watcher.close(),
|
||||
pause: () => watcher.pause(),
|
||||
getContextTimestamps: () => {
|
||||
const dirTimestamps = watcher.getContextTimestamps();
|
||||
getContextInfoEntries: () => {
|
||||
const dirTimestamps = watcher.getContextInfoEntries();
|
||||
for (const path of ignoredDirs) {
|
||||
dirTimestamps.set(path, 1);
|
||||
}
|
||||
return dirTimestamps;
|
||||
},
|
||||
getFileTimestamps: () => {
|
||||
const fileTimestamps = watcher.getFileTimestamps();
|
||||
getFileTimeInfoEntries: () => {
|
||||
const fileTimestamps = watcher.getFileTimeInfoEntries();
|
||||
for (const path of ignoredFiles) {
|
||||
fileTimestamps.set(path, 1);
|
||||
}
|
||||
|
|
|
@ -19,15 +19,6 @@ const Stats = require("./Stats");
|
|||
* @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 {
|
||||
/**
|
||||
* @param {Compiler} compiler the compiler
|
||||
|
@ -164,24 +155,14 @@ class Watching {
|
|||
missing,
|
||||
this.startTime,
|
||||
this.watchOptions,
|
||||
(
|
||||
err,
|
||||
filesModified,
|
||||
contextModified,
|
||||
missingModified,
|
||||
fileTimestamps,
|
||||
contextTimestamps,
|
||||
removedFiles
|
||||
) => {
|
||||
(err, fileTimeInfoEntries, contextTimeInfoEntries, removedFiles) => {
|
||||
this.pausedWatcher = this.watcher;
|
||||
this.watcher = null;
|
||||
if (err) {
|
||||
return this.handler(err);
|
||||
}
|
||||
this.compiler.fileTimestamps = toFileSystemInfoEntryMap(fileTimestamps);
|
||||
this.compiler.contextTimestamps = toFileSystemInfoEntryMap(
|
||||
contextTimestamps
|
||||
);
|
||||
this.compiler.fileTimestamps = fileTimeInfoEntries;
|
||||
this.compiler.contextTimestamps = contextTimeInfoEntries;
|
||||
this.compiler.removedFiles = removedFiles;
|
||||
this._invalidate();
|
||||
},
|
||||
|
@ -200,12 +181,8 @@ class Watching {
|
|||
this.callbacks.push(callback);
|
||||
}
|
||||
if (this.watcher) {
|
||||
this.compiler.fileTimestamps = toFileSystemInfoEntryMap(
|
||||
this.watcher.getFileTimestamps()
|
||||
);
|
||||
this.compiler.contextTimestamps = toFileSystemInfoEntryMap(
|
||||
this.watcher.getContextTimestamps()
|
||||
);
|
||||
this.compiler.fileTimestamps = this.watcher.getFileTimeInfoEntries();
|
||||
this.compiler.contextTimestamps = this.watcher.getContextTimeInfoEntries();
|
||||
}
|
||||
this._invalidate();
|
||||
}
|
||||
|
|
|
@ -5,14 +5,10 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const asyncLib = require("neo-async");
|
||||
|
||||
/** @typedef {import("enhanced-resolve/lib/Resolver")} Resolver */
|
||||
/** @typedef {import("../Compiler")} Compiler */
|
||||
/** @typedef {import("../FileSystemInfo")} FileSystemInfo */
|
||||
|
||||
const INVALID = {};
|
||||
|
||||
const requestToString = request => {
|
||||
let str = "";
|
||||
for (const key in request) {
|
||||
|
@ -76,69 +72,37 @@ class ResolverCachePlugin {
|
|||
propagate("fileDependencies");
|
||||
propagate("contextDependencies");
|
||||
if (err) return callback(err);
|
||||
const fileDependencies = new Set(newResolveContext.fileDependencies);
|
||||
if (newResolveContext.missing) {
|
||||
for (const missing of newResolveContext.missing) {
|
||||
fileDependencies.add(missing);
|
||||
}
|
||||
}
|
||||
const contextDependencies = new Set(
|
||||
newResolveContext.contextDependencies
|
||||
);
|
||||
const fileDependencies = newResolveContext.fileDependencies;
|
||||
const contextDependencies = newResolveContext.contextDependencies;
|
||||
const missingDependencies = newResolveContext.missing;
|
||||
// TODO remove this when enhanced-resolve supports fileDependencies
|
||||
if (result && result.path) {
|
||||
fileDependencies.add(result.path);
|
||||
}
|
||||
const fileTimestamps = new Map();
|
||||
const contextTimestamps = new Map();
|
||||
const store = () => {
|
||||
fileSystemInfo.createSnapshot(
|
||||
resolveTime,
|
||||
fileDependencies,
|
||||
contextDependencies,
|
||||
missingDependencies,
|
||||
null,
|
||||
(err, snapshot) => {
|
||||
if (err) return callback(err);
|
||||
cache.store(
|
||||
identifier,
|
||||
null,
|
||||
{
|
||||
result,
|
||||
resolveTime,
|
||||
fileTimestamps,
|
||||
contextTimestamps
|
||||
missing: newResolveContext.missing,
|
||||
fileDependencies: newResolveContext.fileDependencies,
|
||||
contextDependencies: newResolveContext.contextDependencies,
|
||||
snapshot
|
||||
},
|
||||
restoreErr => {
|
||||
if (restoreErr) return callback(restoreErr);
|
||||
storeErr => {
|
||||
if (storeErr) return callback(storeErr);
|
||||
if (result) return callback(null, result);
|
||||
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(
|
||||
request
|
||||
)}`;
|
||||
cache.get(identifier, null, (err, cacheEntry) => {
|
||||
const processCacheResult = (err, cacheEntry) => {
|
||||
if (err) return callback(err);
|
||||
|
||||
if (cacheEntry) {
|
||||
const {
|
||||
result,
|
||||
resolveTime,
|
||||
fileTimestamps,
|
||||
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) {
|
||||
fileSystemInfo.checkSnapshotValid(
|
||||
cacheEntry.snapshot,
|
||||
(err, valid) => {
|
||||
if (err || !valid) {
|
||||
return doRealResolve(
|
||||
identifier,
|
||||
type,
|
||||
|
@ -243,7 +148,22 @@ class ResolverCachePlugin {
|
|||
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 {
|
||||
|
@ -256,7 +176,8 @@ class ResolverCachePlugin {
|
|||
callback
|
||||
);
|
||||
}
|
||||
});
|
||||
};
|
||||
cache.get(identifier, null, processCacheResult);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
"use strict";
|
||||
|
||||
const Watchpack = require("watchpack");
|
||||
const objectToMap = require("../util/objectToMap");
|
||||
|
||||
class NodeWatchFileSystem {
|
||||
constructor(inputFileSystem) {
|
||||
|
@ -48,24 +47,16 @@ class NodeWatchFileSystem {
|
|||
const cachedFiles = files;
|
||||
const cachedDirs = dirs;
|
||||
this.watcher.once("aggregated", (changes, removals) => {
|
||||
changes = changes.concat(removals);
|
||||
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());
|
||||
files = new Set(files);
|
||||
dirs = new Set(dirs);
|
||||
missing = new Set(missing);
|
||||
removals = new Set(removals.filter(file => files.has(file)));
|
||||
callback(
|
||||
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
|
||||
);
|
||||
for (const item of removals) {
|
||||
this.inputFileSystem.purge(item);
|
||||
}
|
||||
}
|
||||
const times = this.watcher.getTimeInfoEntries();
|
||||
callback(null, times, times, removals);
|
||||
});
|
||||
|
||||
this.watcher.watch(cachedFiles.concat(missing), cachedDirs, startTime);
|
||||
|
@ -85,16 +76,16 @@ class NodeWatchFileSystem {
|
|||
this.watcher.pause();
|
||||
}
|
||||
},
|
||||
getFileTimestamps: () => {
|
||||
getFileTimeInfoEntries: () => {
|
||||
if (this.watcher) {
|
||||
return objectToMap(this.watcher.getTimes());
|
||||
return this.watcher.getTimeInfoEntries();
|
||||
} else {
|
||||
return new Map();
|
||||
}
|
||||
},
|
||||
getContextTimestamps: () => {
|
||||
getContextInfoEntries: () => {
|
||||
if (this.watcher) {
|
||||
return objectToMap(this.watcher.getTimes());
|
||||
return this.watcher.getTimeInfoEntries();
|
||||
} else {
|
||||
return new Map();
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
"schema-utils": "^0.4.4",
|
||||
"tapable": "^1.1.0",
|
||||
"terser-webpack-plugin": "^1.2.1",
|
||||
"watchpack": "^1.5.0",
|
||||
"watchpack": "2.0.0-beta.2",
|
||||
"webpack-sources": "^1.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
|
@ -181,13 +181,17 @@ const describeCases = config => {
|
|||
rimraf(cacheDirectory, done);
|
||||
});
|
||||
if (config.cache) {
|
||||
it(`${testName} should pre-compile to fill disk cache`, done => {
|
||||
const compiler = webpack(options, err => {
|
||||
it(`${testName} should pre-compile to fill disk cache (1st)`, done => {
|
||||
webpack(options, err => {
|
||||
if (err) return done(err);
|
||||
compiler.close(() => {
|
||||
done();
|
||||
});
|
||||
});
|
||||
it(`${testName} should pre-compile to fill disk cache (2nd)`, done => {
|
||||
webpack(options, err => {
|
||||
if (err) return done(err);
|
||||
done();
|
||||
});
|
||||
});
|
||||
}
|
||||
it(
|
||||
|
|
121
yarn.lock
121
yarn.lock
|
@ -550,11 +550,6 @@ astral-regex@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
|
||||
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:
|
||||
version "1.0.0"
|
||||
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"
|
||||
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:
|
||||
version "3.5.1"
|
||||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
|
||||
|
@ -878,7 +868,7 @@ braces@^1.8.2:
|
|||
preserve "^0.2.0"
|
||||
repeat-element "^1.1.2"
|
||||
|
||||
braces@^2.3.0, braces@^2.3.1:
|
||||
braces@^2.3.1:
|
||||
version "2.3.2"
|
||||
resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
|
||||
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"
|
||||
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:
|
||||
version "1.1.1"
|
||||
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"
|
||||
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:
|
||||
version "1.2.4"
|
||||
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
|
||||
|
@ -2658,14 +2621,6 @@ glob-parent@^2.0.0:
|
|||
dependencies:
|
||||
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:
|
||||
version "5.0.15"
|
||||
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"
|
||||
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:
|
||||
version "1.1.6"
|
||||
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"
|
||||
integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=
|
||||
|
||||
is-extglob@^2.1.0, is-extglob@^2.1.1:
|
||||
is-extglob@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
|
||||
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
|
||||
|
@ -3247,13 +3195,6 @@ is-glob@^2.0.0, is-glob@^2.0.1:
|
|||
dependencies:
|
||||
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:
|
||||
version "4.0.0"
|
||||
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"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
|
||||
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"
|
||||
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
|
||||
|
||||
needle@^2.2.0, needle@^2.2.1:
|
||||
needle@^2.2.1:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
|
||||
integrity sha512-t/ZswCM9JTWjAdXS9VpvqhI2Ct2sL2MdY4fUXqGJaGBk13ge99ObqRksRTbBE56K+wxUXwwfZYOuZHifFW9q+Q==
|
||||
|
@ -4891,22 +4832,6 @@ node-pre-gyp@^0.10.0:
|
|||
semver "^5.3.0"
|
||||
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:
|
||||
version "3.0.6"
|
||||
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"
|
||||
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:
|
||||
version "2.1.0"
|
||||
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"
|
||||
integrity sha1-DD0L6u2KAclm2Xh793goElKpeao=
|
||||
|
||||
rc@^1.1.7, rc@^1.2.7:
|
||||
rc@^1.2.7:
|
||||
version "1.2.8"
|
||||
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
|
||||
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
|
||||
|
@ -6003,7 +5923,7 @@ read-pkg@^4.0.1:
|
|||
parse-json "^4.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"
|
||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
|
||||
integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
|
||||
|
@ -6016,16 +5936,6 @@ read-pkg@^4.0.1:
|
|||
string_decoder "~1.1.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:
|
||||
version "1.0.1"
|
||||
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"
|
||||
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:
|
||||
version "0.4.3"
|
||||
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"
|
||||
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:
|
||||
version "4.2.2"
|
||||
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"
|
||||
minimist "^1.2.0"
|
||||
|
||||
watchpack@^1.5.0:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
|
||||
integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==
|
||||
watchpack@2.0.0-beta.2:
|
||||
version "2.0.0-beta.2"
|
||||
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.0-beta.2.tgz#357ed627767dd16ed80500f49c5d4029b49248cb"
|
||||
integrity sha512-dzFk3sOzcuIC9s+6Qek6Y0cQmk+N8VvUSY1BtB9wCEpfbcUFOQS7tlD1wRnwq2gv+orBYB/td4hO59Z4lg6ELQ==
|
||||
dependencies:
|
||||
chokidar "^2.0.2"
|
||||
graceful-fs "^4.1.2"
|
||||
neo-async "^2.5.0"
|
||||
|
||||
|
|
Loading…
Reference in New Issue