Merge pull request #26591 from vector-im/johannes/one-watcher-to-rule-them-all
This commit is contained in:
commit
897bca6ca2
1 changed files with 44 additions and 36 deletions
|
@ -19,13 +19,7 @@ const INCLUDE_LANGS = [...new Set([...fs.readdirSync(I18N_BASE_PATH), ...fs.read
|
||||||
// cpx includes globbed parts of the filename in the destination, but excludes
|
// cpx includes globbed parts of the filename in the destination, but excludes
|
||||||
// common parents. Hence, "res/{a,b}/**": the output will be "dest/a/..." and
|
// common parents. Hence, "res/{a,b}/**": the output will be "dest/a/..." and
|
||||||
// "dest/b/...".
|
// "dest/b/...".
|
||||||
const COPY_LIST: [
|
const COPY_LIST: [sourceGlob: string, outputPath: string][] = [
|
||||||
sourceGlob: string,
|
|
||||||
outputPath: string,
|
|
||||||
opts?: {
|
|
||||||
directwatch?: 1;
|
|
||||||
},
|
|
||||||
][] = [
|
|
||||||
["res/apple-app-site-association", "webapp"],
|
["res/apple-app-site-association", "webapp"],
|
||||||
["res/manifest.json", "webapp"],
|
["res/manifest.json", "webapp"],
|
||||||
["res/sw.js", "webapp"],
|
["res/sw.js", "webapp"],
|
||||||
|
@ -35,8 +29,8 @@ const COPY_LIST: [
|
||||||
["res/vector-icons/**", "webapp/vector-icons"],
|
["res/vector-icons/**", "webapp/vector-icons"],
|
||||||
["res/decoder-ring/**", "webapp/decoder-ring"],
|
["res/decoder-ring/**", "webapp/decoder-ring"],
|
||||||
["node_modules/matrix-react-sdk/res/media/**", "webapp/media"],
|
["node_modules/matrix-react-sdk/res/media/**", "webapp/media"],
|
||||||
["node_modules/@matrix-org/olm/olm_legacy.js", "webapp", { directwatch: 1 }],
|
["node_modules/@matrix-org/olm/olm_legacy.js", "webapp"],
|
||||||
["./config.json", "webapp", { directwatch: 1 }],
|
["./config.json", "webapp"],
|
||||||
["contribute.json", "webapp"],
|
["contribute.json", "webapp"],
|
||||||
];
|
];
|
||||||
const argv = parseArgs(process.argv.slice(2), {});
|
const argv = parseArgs(process.argv.slice(2), {});
|
||||||
|
@ -60,6 +54,22 @@ if (!fs.existsSync("webapp/i18n/")) {
|
||||||
fs.mkdirSync("webapp/i18n/");
|
fs.mkdirSync("webapp/i18n/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function createCpx(source: string, dest: string): Cpx {
|
||||||
|
const cpx = new Cpx(source, dest);
|
||||||
|
if (verbose) {
|
||||||
|
cpx.on("copy", (event) => {
|
||||||
|
console.log(`Copied: ${event.srcPath} --> ${event.dstPath}`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return cpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
const logWatch = (path: string) => {
|
||||||
|
if (verbose) {
|
||||||
|
console.log(`Watching: ${path}`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
function next(i: number, err?: Error): void {
|
function next(i: number, err?: Error): void {
|
||||||
errCheck(err);
|
errCheck(err);
|
||||||
|
|
||||||
|
@ -70,39 +80,30 @@ function next(i: number, err?: Error): void {
|
||||||
const ent = COPY_LIST[i];
|
const ent = COPY_LIST[i];
|
||||||
const source = ent[0];
|
const source = ent[0];
|
||||||
const dest = ent[1];
|
const dest = ent[1];
|
||||||
const opts = ent[2] || {};
|
|
||||||
const cpx = new Cpx(source, dest);
|
|
||||||
|
|
||||||
if (verbose) {
|
|
||||||
cpx.on("copy", (event) => {
|
|
||||||
console.log(`Copied: ${event.srcPath} --> ${event.dstPath}`);
|
|
||||||
});
|
|
||||||
cpx.on("remove", (event) => {
|
|
||||||
console.log(`Removed: ${event.path}`);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const cb = (err?: Error): void => {
|
const cb = (err?: Error): void => {
|
||||||
next(i + 1, err);
|
next(i + 1, err);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (watch) {
|
if (watch) {
|
||||||
if (opts.directwatch) {
|
// cpx -w creates a watcher for the parent of any files specified,
|
||||||
// cpx -w creates a watcher for the parent of any files specified,
|
// which in the case of e.g. config.json is '.', which inevitably takes
|
||||||
// which in the case of config.json is '.', which inevitably takes
|
// ages to crawl. To prevent this, we only use cpx for copying and resort
|
||||||
// ages to crawl. So we create our own watcher on the files
|
// to chokidar for watching.
|
||||||
// instead.
|
const copy = (path: string): void => {
|
||||||
const copy = (): void => {
|
createCpx(path, dest).copy(errCheck);
|
||||||
cpx.copy(errCheck);
|
};
|
||||||
};
|
chokidar
|
||||||
chokidar.watch(source).on("add", copy).on("change", copy).on("ready", cb).on("error", errCheck);
|
.watch(source)
|
||||||
} else {
|
.on("ready", () => {
|
||||||
cpx.on("watch-ready", cb);
|
logWatch(source);
|
||||||
cpx.on("watch-error", cb);
|
cb();
|
||||||
cpx.watch();
|
})
|
||||||
}
|
.on("add", copy)
|
||||||
|
.on("change", copy)
|
||||||
|
.on("error", errCheck);
|
||||||
} else {
|
} else {
|
||||||
cpx.copy(cb);
|
createCpx(source, dest).copy(cb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,7 +183,14 @@ function watchLanguage(lang: string, dest: string, langFileMap: Record<string, s
|
||||||
};
|
};
|
||||||
|
|
||||||
[reactSdkFile, riotWebFile].forEach(function (f) {
|
[reactSdkFile, riotWebFile].forEach(function (f) {
|
||||||
chokidar.watch(f).on("add", makeLang).on("change", makeLang).on("error", errCheck);
|
chokidar
|
||||||
|
.watch(f)
|
||||||
|
.on("ready", () => {
|
||||||
|
logWatch(f);
|
||||||
|
})
|
||||||
|
.on("add", makeLang)
|
||||||
|
.on("change", makeLang)
|
||||||
|
.on("error", errCheck);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue