mirror of
https://github.com/wassname/talk.git
synced 2026-06-28 01:46:57 +08:00
c9a0ab8848
* chore: upgrade fluent * chore: upgrade metascraper * chore: upgrade akismet-api * chore: upgrade apollo-server-express * chore: upgrade archiver * chore: upgrade bull * chore: upgrade express, cheerio, content-security-policy-builder * chore: upgrade convict * chore: upgrade cors, cron * chore: upgrade csv-stringify * chore: upgrade dompurify * chore: upgrade dotenv * chore: upgrade express-static-gzip * chore: upgrade fs-extra * chore: upgrade graphql-js * chore: upgrade graphql packages * chore: upgrade html-minifier * chore: upgrade html-to-text * chore: upgrade ioredis * chore: upgrade joi * chore: upgrade jsdom * chore: upgrade jsonwebtoken * chore: upgrade juice * chore: upgrade jwks-rsa ad linkifyjs * chore: upgrade lodash * chore: upgrade luxon * chore: upgrade metascraper * chore: upgrade mongodb * chore: upgrade ms * chore: upgrade node and node-fetch types * chore: upgrade nodemailer nunjucks and typescript-eslint * chore: Upgrade passport * upgrade: prom-client react-helmet source-map-support stack-utils * chore: upgrade uuid * chore: upgrade @babel packages * chore: upgrade types * chore: upgrade autoprefixer * chore: upgrade jest * chore: upgrade ts-jest * chore: remove linkify.d.ts * chore: upgrade bowser * chore: case-sensitive-paths-webpack-plugin * chore: upgrade classnames * chore: upgrade commander * chore: upgrade comment-json * chore: upgrade cross-spawn compression-webpack-plugin del * chore: upgrade build and watch related dependencies * chore: upgrade css-vars-ponyfill * chore: upgrade eslint and css-vars-ponyfill * chore: upgrade enzyme and eventemitter2 * fix: form bug * chore: upgrade farce * chore: upgrade final form * chore: upgrade react-popper * chore: upgrade flat and fork-ts-checker-webpack-plugin * chore: upgrade husky and gulp related, intersection observer * chore: upgrade lint-staged * chore: upgrade marked, loader-utils, mini-css-extract-plugin * chore: upgrade postcss-nested, proxy-polyfill, pstree.remy * chore: upgrade prettier * chore: fix prettier changes, upgrade react * chore: mute createFactory deprecated message * chore: upgrade react-copy-to-clipbard, react-axe, react-dom, react-test-renderer, react-timeago * chore: upgrade react-transistion-group, react-responsive * chore: upgrade types * chore: upgrade react-dev-utils, react-error-overlay regenerator-runtime * chore: upgrade types, sinon, sockjs-client, strip-ansi * chore: upgrade types, fonts * chore: upgrade nunjucks, ts-node, typescript-snapshot-plugin, wait-for-expect * chore: upgrade eslint packages * chore: upgrade fluent, types * chore: upgrade jsdom dep * chore: upgrade mongo * chore: upgrade deps * chore: upgrade typescript, recompose * chore: upgrade prettier * chore: remove obsolete prettier config * chore: upgrade jsdom types * chore: upgrade typescript-eslint * chore: upgrad deps * chore: upgrade deps * chore: upgrade relay related modules * chore: upgrade docz WIP * chore: upgrade docz * chore: add guard * chore: remove obsolete line * chore: comment * chore: refactors * fix: hook count change error
99 lines
2.6 KiB
TypeScript
99 lines
2.6 KiB
TypeScript
import chokidar from "chokidar";
|
|
import path from "path";
|
|
|
|
import { Watcher, WatchOptions } from "./types";
|
|
|
|
function prependRootDir(
|
|
prepend: string,
|
|
paths: ReadonlyArray<string>
|
|
): string[] {
|
|
const prependFunc = (p: string) => path.resolve(prepend, p);
|
|
return paths.map(prependFunc);
|
|
}
|
|
|
|
export default class ChokidarWatcher implements Watcher {
|
|
public watch(
|
|
rootDir: string,
|
|
paths: ReadonlyArray<string>,
|
|
options: WatchOptions = {}
|
|
): AsyncIterable<string> {
|
|
const resolvedPaths = prependRootDir(rootDir, paths);
|
|
|
|
// An array to hold all changes, that has not yet been yield.
|
|
const queue: string[] = [];
|
|
let firstError: Error | null = null;
|
|
|
|
// If this is set, a pending promise is waiting for the next result.
|
|
let pending: {
|
|
resolve: (result: string) => void;
|
|
reject: (error: Error) => void;
|
|
} | null = null;
|
|
|
|
// Only start client if we have something to watch.
|
|
if (paths.length) {
|
|
const client = chokidar.watch(resolvedPaths, {
|
|
ignored: options.ignore && prependRootDir(rootDir, options.ignore),
|
|
});
|
|
|
|
// Listen for errors
|
|
client.on("error", (error: Error) => {
|
|
// Resolve pending request.
|
|
if (pending) {
|
|
pending.reject(error);
|
|
pending = null;
|
|
return;
|
|
}
|
|
if (!firstError) {
|
|
firstError = error;
|
|
}
|
|
});
|
|
|
|
// Listen for changes
|
|
client.on("change", (pathFile: string) => {
|
|
// Resolve pending request.
|
|
if (pending) {
|
|
pending.resolve(pathFile);
|
|
pending = null;
|
|
return;
|
|
}
|
|
|
|
// There is no pending request, save it into the queue.
|
|
queue.unshift(pathFile);
|
|
});
|
|
}
|
|
return {
|
|
[Symbol.asyncIterator]() {
|
|
return {
|
|
next: () =>
|
|
new Promise<IteratorResult<string>>((resolve, reject) => {
|
|
const wrapped = {
|
|
resolve: (pathFile: string) =>
|
|
resolve({
|
|
done: false,
|
|
value: pathFile,
|
|
}),
|
|
reject: (error: Error) =>
|
|
reject({
|
|
done: true,
|
|
value: error,
|
|
}),
|
|
};
|
|
|
|
// We already have a change to return
|
|
if (firstError) {
|
|
wrapped.reject(firstError);
|
|
return;
|
|
}
|
|
if (queue.length) {
|
|
wrapped.resolve(queue.pop()!);
|
|
return;
|
|
}
|
|
// We need to wait for the next change event.
|
|
pending = wrapped;
|
|
}),
|
|
};
|
|
},
|
|
};
|
|
}
|
|
}
|