@dbx-tools/path 0.9.129 → 0.9.131

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/path";
6
- export const PACKAGE_VERSION = "0.9.129";
6
+ export const PACKAGE_VERSION = "0.9.131";
7
7
  export * as find from "./src/find.ts";
8
8
  export * as gitIgnore from "./src/git-ignore.ts";
9
9
  export * as ignore from "./src/ignore.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/path";
2
- export declare const PACKAGE_VERSION = "0.9.129";
2
+ export declare const PACKAGE_VERSION = "0.9.131";
3
3
  export * as find from "./src/find.ts";
4
4
  export * as gitIgnore from "./src/git-ignore.ts";
5
5
  export * as ignore from "./src/ignore.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/path";
5
- export const PACKAGE_VERSION = "0.9.129";
5
+ export const PACKAGE_VERSION = "0.9.131";
6
6
  export * as find from "./src/find.js";
7
7
  export * as gitIgnore from "./src/git-ignore.js";
8
8
  export * as ignore from "./src/ignore.js";
@@ -12,4 +12,4 @@ export * as scan from "./src/scan.js";
12
12
  export * as watch from "./src/watch.js";
13
13
  export { GitIgnore } from "./src/git-ignore.js";
14
14
  export { FOLLOW_SYMLINKS_DEFAULT } from "./src/scan.js";
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFJaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9wYXRoXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTI5XCI7XG5leHBvcnQgKiBhcyBmaW5kIGZyb20gXCIuL3NyYy9maW5kLnRzXCI7XG5leHBvcnQgKiBhcyBnaXRJZ25vcmUgZnJvbSBcIi4vc3JjL2dpdC1pZ25vcmUudHNcIjtcbmV4cG9ydCAqIGFzIGlnbm9yZSBmcm9tIFwiLi9zcmMvaWdub3JlLnRzXCI7XG5leHBvcnQgKiBhcyBtYXRjaCBmcm9tIFwiLi9zcmMvbWF0Y2gudHNcIjtcbmV4cG9ydCAqIGFzIHBhdHRlcm4gZnJvbSBcIi4vc3JjL3BhdHRlcm4udHNcIjtcbmV4cG9ydCAqIGFzIHNjYW4gZnJvbSBcIi4vc3JjL3NjYW4udHNcIjtcbmV4cG9ydCAqIGFzIHdhdGNoIGZyb20gXCIuL3NyYy93YXRjaC50c1wiO1xuZXhwb3J0IHR5cGUgeyBGaWxlRmluZE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZmluZC50c1wiO1xuZXhwb3J0IHsgR2l0SWdub3JlIH0gZnJvbSBcIi4vc3JjL2dpdC1pZ25vcmUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2l0SWdub3JlTG9hZE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZ2l0LWlnbm9yZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBJZ25vcmVQYXR0ZXJuT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9pZ25vcmUudHNcIjtcbmV4cG9ydCB0eXBlIHsgUGF0aE1hdGNoUHJlZGljYXRlLCBQYXRoTWF0Y2hlciwgUGF0aE1hdGNoSW5wdXQgfSBmcm9tIFwiLi9zcmMvbWF0Y2gudHNcIjtcbmV4cG9ydCB7IEZPTExPV19TWU1MSU5LU19ERUZBVUxUIH0gZnJvbSBcIi4vc3JjL3NjYW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgRmlsZVNjYW5PcHRpb25zLCBGaWxlU2Nhbklnbm9yZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc2Nhbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBGaWxlV2F0Y2hPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3dhdGNoLnRzXCI7XG4iXX0=
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFJaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9wYXRoXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTMxXCI7XG5leHBvcnQgKiBhcyBmaW5kIGZyb20gXCIuL3NyYy9maW5kLnRzXCI7XG5leHBvcnQgKiBhcyBnaXRJZ25vcmUgZnJvbSBcIi4vc3JjL2dpdC1pZ25vcmUudHNcIjtcbmV4cG9ydCAqIGFzIGlnbm9yZSBmcm9tIFwiLi9zcmMvaWdub3JlLnRzXCI7XG5leHBvcnQgKiBhcyBtYXRjaCBmcm9tIFwiLi9zcmMvbWF0Y2gudHNcIjtcbmV4cG9ydCAqIGFzIHBhdHRlcm4gZnJvbSBcIi4vc3JjL3BhdHRlcm4udHNcIjtcbmV4cG9ydCAqIGFzIHNjYW4gZnJvbSBcIi4vc3JjL3NjYW4udHNcIjtcbmV4cG9ydCAqIGFzIHdhdGNoIGZyb20gXCIuL3NyYy93YXRjaC50c1wiO1xuZXhwb3J0IHR5cGUgeyBGaWxlRmluZE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZmluZC50c1wiO1xuZXhwb3J0IHsgR2l0SWdub3JlIH0gZnJvbSBcIi4vc3JjL2dpdC1pZ25vcmUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2l0SWdub3JlTG9hZE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZ2l0LWlnbm9yZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBJZ25vcmVQYXR0ZXJuT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9pZ25vcmUudHNcIjtcbmV4cG9ydCB0eXBlIHsgUGF0aE1hdGNoUHJlZGljYXRlLCBQYXRoTWF0Y2hlciwgUGF0aE1hdGNoSW5wdXQgfSBmcm9tIFwiLi9zcmMvbWF0Y2gudHNcIjtcbmV4cG9ydCB7IEZPTExPV19TWU1MSU5LU19ERUZBVUxUIH0gZnJvbSBcIi4vc3JjL3NjYW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgRmlsZVNjYW5PcHRpb25zLCBGaWxlU2Nhbklnbm9yZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc2Nhbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBGaWxlV2F0Y2hPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3dhdGNoLnRzXCI7XG4iXX0=
@@ -38,6 +38,14 @@ export declare class GitIgnore {
38
38
  clear(): void;
39
39
  /** Return the retained content for a registered `.gitignore`. */
40
40
  get(path: string): string | undefined;
41
+ /**
42
+ * Synchronize the root and ancestor control files that can affect `path`.
43
+ *
44
+ * File watchers call this before evaluating a new filesystem event so a
45
+ * control-file event delayed by the operating system cannot admit a file
46
+ * under stale rules.
47
+ */
48
+ refreshPathSync(path: string): void;
41
49
  /** Whether a path is ignored after applying parent then nested rule files. */
42
50
  ignores(path: string, directory?: boolean): boolean;
43
51
  private relativePath;
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * @module
9
9
  */
10
- import { readFileSync } from "node:fs";
10
+ import { existsSync, readFileSync } from "node:fs";
11
11
  import { readFile } from "node:fs/promises";
12
12
  import { basename, dirname, isAbsolute, relative, resolve, sep } from "node:path";
13
13
  import { fileURLToPath } from "node:url";
@@ -79,6 +79,35 @@ export class GitIgnore {
79
79
  const relativePath = this.relativePath(path);
80
80
  return relativePath ? this.files.get(relativePath)?.content : undefined;
81
81
  }
82
+ /**
83
+ * Synchronize the root and ancestor control files that can affect `path`.
84
+ *
85
+ * File watchers call this before evaluating a new filesystem event so a
86
+ * control-file event delayed by the operating system cannot admit a file
87
+ * under stale rules.
88
+ */
89
+ refreshPathSync(path) {
90
+ const relativePath = this.relativePath(path);
91
+ if (!relativePath)
92
+ return;
93
+ const directory = toPosix(dirname(relativePath));
94
+ const candidates = [".gitignore"];
95
+ let current = "";
96
+ for (const segment of directory === "." ? [] : directory.split("/")) {
97
+ current = current ? `${current}/${segment}` : segment;
98
+ candidates.push(`${current}/.gitignore`);
99
+ }
100
+ for (const candidate of candidates) {
101
+ const absolute = resolve(this.root, candidate);
102
+ if (!existsSync(absolute)) {
103
+ this.delete(candidate);
104
+ continue;
105
+ }
106
+ const content = readFileSync(absolute, "utf8");
107
+ if (this.get(candidate) !== content)
108
+ this.set(candidate, content);
109
+ }
110
+ }
82
111
  /** Whether a path is ignored after applying parent then nested rule files. */
83
112
  ignores(path, directory = false) {
84
113
  const relativePath = this.relativePath(path);
@@ -158,4 +187,4 @@ function trimSlash(path) {
158
187
  function toPosix(path) {
159
188
  return path.split(sep).join("/");
160
189
  }
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0LWlnbm9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9naXQtaWdub3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQW1CLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBb0IsTUFBTSxZQUFZLENBQUM7QUFpQjdELCtFQUErRTtBQUMvRSxNQUFNLE9BQU8sU0FBUztJQUNYLElBQUksQ0FBUztJQUN0QiwwR0FBMEc7SUFDakcsT0FBTyxHQUFnQixhQUFhLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUUzRCxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFDckQsS0FBSyxHQUF1QixFQUFFLENBQUM7SUFFdkMsWUFBWSxJQUFrQjtRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsTUFBTSxD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Q0FBQztJQUM1QixJQUFJLElBQUksS0FBSyxTQUFTO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDbEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDekYsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLElBQVk7SUFDN0IsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLElBQVk7SUFDN0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsSUFBWTtJQUMzQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE11dGFibGUsIEdpdC1jb21wYXRpYmxlIGAuZ2l0aWdub3JlYCBwYXRoIG1hdGNoaW5nLlxuICpcbiAqIFJ1bGUgc3ludGF4IGlzIG93bmVkIGJ5IHRoZSBgaWdub3JlYCBwYWNrYWdlLCB3aG9zZSBjb21wYXRpYmlsaXR5IHN1aXRlXG4gKiBjb21wYXJlcyBiZWhhdmlvciB3aXRoIGBnaXQgY2hlY2staWdub3JlYC4gVGhpcyBtb2R1bGUgYWRkcyByZXBvc2l0b3J5IGFuZFxuICogbmVzdGVkLWZpbGUgc2NvcGluZyBwbHVzIGluLW1lbW9yeSBhZGQsIHVwZGF0ZSwgYW5kIHJlbW92YWwuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgaXNBYnNvbHV0ZSwgcmVsYXRpdmUsIHJlc29sdmUsIHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwibm9kZTp1cmxcIjtcbmltcG9ydCB7IGdsb2IsIGdsb2JTeW5jLCB0eXBlIElnbm9yZUxpa2UgfSBmcm9tIFwiZ2xvYlwiO1xuaW1wb3J0IGlnbm9yZSBmcm9tIFwiaWdub3JlXCI7XG5pbXBvcnQgdHlwZSB7IElnbm9yZVBhdHRlcm5PcHRpb25zIH0gZnJvbSBcIi4vaWdub3JlLnRzXCI7XG5pbXBvcnQgeyBpZ25vcmVQYXRoTWF0Y2hlciB9IGZyb20gXCIuL2lnbm9yZS50c1wiO1xuaW1wb3J0IHsgdG9QYXRoTWF0Y2hlciwgdHlwZSBQYXRoTWF0Y2hlciB9IGZyb20gXCIuL21hdGNoLnRzXCI7XG5cbmludGVyZmFjZSBHaXRJZ25vcmVSdWxlU2V0IHtcbiAgY29udGVudDogc3RyaW5nO1xuICBkaXJlY3Rvcnk6IHN0cmluZztcbiAgbWF0Y2hlcjogUmV0dXJuVHlwZTx0eXBlb2YgaWdub3JlPjtcbiAgcGF0aDogc3RyaW5nO1xufVxuXG4vKiogT3B0aW9ucyB1c2VkIHdoaWxlIGRpc2NvdmVyaW5nIGAuZ2l0aWdub3JlYCBmaWxlcyBiZW5lYXRoIGEgcm9vdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2l0SWdub3JlTG9hZE9wdGlvbnMge1xuICAvKiogQnVpbHQtaW4gZGlyZWN0b3J5IGdyb3VwcyBwcnVuZWQgd2hpbGUgbG9va2luZyBmb3IgaWdub3JlIGZpbGVzLiAqL1xuICBpZ25vcmVPcHRpb25zPzogSWdub3JlUGF0dGVybk9wdGlvbnM7XG4gIC8qKiBGb2xsb3cgc3ltbGlua2VkIGRpcmVjdG9yaWVzIGR1cmluZyBkaXNjb3ZlcnkuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICBmb2xsb3dTeW1saW5rcz86IGJvb2xlYW47XG59XG5cbi8qKiBNdXRhYmxlIHBhdGggcHJlZGljYXRlIGNvbXBvc2VkIGZyb20gcm9vdCBhbmQgbmVzdGVkIGAuZ2l0aWdub3JlYCBmaWxlcy4gKi9cbmV4cG9ydCBjbGFzcyBHaXRJZ25vcmUge1xuICByZWFkb25seSByb290OiBzdHJpbmc7XG4gIC8qKiBTdGFibGUgY29tcG9zYWJsZSBtYXRjaGVyIHRoYXQgb2JzZXJ2ZXMgbGF0ZXIge0BsaW5rIHNldH0sIHtAbGluayBkZWxldGV9LCBhbmQge0BsaW5rIGNsZWFyfSBjYWxscy4gKi9cbiAgcmVhZG9ubHkgbWF0Y2hlcjogUGF0aE1hdGNoZXIgPSB0b1BhdGhNYXRjaGVyKChwYXRoKSA9PiB0aGlzLmlnbm9yZXMocGF0aCkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZXMgPSBuZXcgTWFwPHN0cmluZywgR2l0SWdub3JlUnVsZVNldD4oKTtcbiAgcHJpdmF0ZSBydWxlczogR2l0SWdub3JlUnVsZVNldFtdID0gW107XG5cbiAgY29uc3RydWN0b3Iocm9vdDogc3RyaW5nIHwgVVJMKSB7XG4gICAgdGhpcy5yb290ID0gcmVzb2x2ZShyb290IGluc3RhbmNlb2YgVVJMID8gZmlsZVVSTFRvUGF0aChyb290KSA6IHJvb3QpO1xuICB9XG5cbiAgLyoqIExvYWQgZXZlcnkgYXBwbGljYWJsZSBgLmdpdGlnbm9yZWAgYmVuZWF0aCB7QGxpbmsgcm9vdH0uICovXG4gIHN0YXRpYyBhc3luYyBsb2FkKHJvb3Q6IHN0cmluZyB8IFVSTCwgb3B0aW9uczogR2l0SWdub3JlTG9hZE9wdGlvbnMgPSB7fSk6IFByb21pc2U8R2l0SWdub3JlPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEdpdElnbm9yZShyb290KTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgYXdhaXQgZ2xvYihcIioqLy5naXRpZ25vcmVcIiwgZGlzY292ZXJ5T3B0aW9ucyhyZXN1bHQucm9vdCwgb3B0aW9ucykpKSB7XG4gICAgICByZXN1bHQuc2V0KHBhdGgsIGF3YWl0IHJlYWRGaWxlKHJlc29sdmUocmVzdWx0LnJvb3QsIHBhdGgpLCBcInV0ZjhcIikpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqIFN5bmNocm9ub3VzIGNvdW50ZXJwYXJ0IHRvIHtAbGluayBHaXRJZ25vcmUubG9hZH0uICovXG4gIHN0YXRpYyBsb2FkU3luYyhyb290OiBzdHJpbmcgfCBVUkwsIG9wdGlvbnM6IEdpdElnbm9yZUxvYWRPcHRpb25zID0ge30pOiBHaXRJZ25vcmUge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBHaXRJZ25vcmUocm9vdCk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGdsb2JTeW5jKFwiKiovLmdpdGlnbm9yZVwiLCBkaXNjb3ZlcnlPcHRpb25zKHJlc3VsdC5yb290LCBvcHRpb25zKSkpIHtcbiAgICAgIHJlc3VsdC5zZXQocGF0aCwgcmVhZEZpbGVTeW5jKHJlc29sdmUocmVzdWx0LnJvb3QsIHBhdGgpLCBcInV0ZjhcIikpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYHBhdGhgIG5hbWVzIGEgYC5naXRpZ25vcmVgIGNvbnRyb2wgZmlsZS4gKi9cbiAgc3RhdGljIGlzRmlsZShwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYmFzZW5hbWUocGF0aCkgPT09IFwiLmdpdGlnbm9yZVwiO1xuICB9XG5cbiAgLyoqIEFkZCBvciByZXBsYWNlIG9uZSBgLmdpdGlnbm9yZWAgZmlsZSBhbmQgaXRzIGluLW1lbW9yeSBjb250ZW50LiAqL1xuICBzZXQocGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSB0aGlzLnJlbGF0aXZlUGF0aChwYXRoKTtcbiAgICBpZiAoIXJlbGF0aXZlUGF0aCB8fCAhR2l0SWdub3JlLmlzRmlsZShyZWxhdGl2ZVBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBHaXQgaWdub3JlIHBhdGggbXVzdCBuYW1lIGEgLmdpdGlnbm9yZSB1bmRlciAke3RoaXMucm9vdH06ICR7cGF0aH1gKTtcbiAgICB9XG4gICAgdGhpcy5maWxlcy5zZXQocmVsYXRpdmVQYXRoLCB7XG4gICAgICBjb250ZW50LFxuICAgICAgZGlyZWN0b3J5OiB0b1Bvc2l4KGRpcm5hbWUocmVsYXRpdmVQYXRoKSkgPT09IFwiLlwiID8gXCJcIiA6IHRvUG9zaXgoZGlybmFtZShyZWxhdGl2ZVBhdGgpKSxcbiAgICAgIG1hdGNoZXI6IGlnbm9yZSgpLmFkZChjb250ZW50KSxcbiAgICAgIHBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICB9KTtcbiAgICB0aGlzLnJlZnJlc2hSdWxlcygpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBvbmUgYC5naXRpZ25vcmVgIGZpbGUuIFJldHVybnMgd2hldGhlciBpdCB3YXMgcmVnaXN0ZXJlZC4gKi9cbiAgZGVsZXRlKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHRoaXMucmVsYXRpdmVQYXRoKHBhdGgpO1xuICAgIGlmICghcmVsYXRpdmVQYXRoKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZGVsZXRlZCA9IHRoaXMuZmlsZXMuZGVsZXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgaWYgKGRlbGV0ZWQpIHRoaXMucmVmcmVzaFJ1bGVzKCk7XG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICAvKiogUmVtb3ZlIGV2ZXJ5IHJlZ2lzdGVyZWQgYC5naXRpZ25vcmVgLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmZpbGVzLmNsZWFyKCk7XG4gICAgdGhpcy5ydWxlcyA9IFtdO1xuICB9XG5cbiAgLyoqIFJldHVybiB0aGUgcmV0YWluZWQgY29udGVudCBmb3IgYSByZWdpc3RlcmVkIGAuZ2l0aWdub3JlYC4gKi9cbiAgZ2V0KHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gdGhpcy5yZWxhdGl2ZVBhdGgocGF0aCk7XG4gICAgcmV0dXJuIHJlbGF0aXZlUGF0aCA/IHRoaXMuZmlsZXMuZ2V0KHJlbGF0aXZlUGF0aCk/LmNvbnRlbnQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogV2hldGhlciBhIHBhdGggaXMgaWdub3JlZCBhZnRlciBhcHBseWluZyBwYXJlbnQgdGhlbiBuZXN0ZWQgcnVsZSBmaWxlcy4gKi9cbiAgaWdub3JlcyhwYXRoOiBzdHJpbmcsIGRpcmVjdG9yeTogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gdGhpcy5yZWxhdGl2ZVBhdGgocGF0aCk7XG4gICAgaWYgKCFyZWxhdGl2ZVBhdGggfHwgcmVsYXRpdmVQYXRoID09PSBcIi5cIikgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBpZ25vcmVkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBydWxlcyBvZiB0aGlzLnJ1bGVzKSB7XG4gICAgICBjb25zdCBzY29wZWRQYXRoID0gcGF0aFdpdGhpbihydWxlcy5kaXJlY3RvcnksIHJlbGF0aXZlUGF0aCk7XG4gICAgICBpZiAoc2NvcGVkUGF0aCA9PT0gdW5kZWZpbmVkIHx8IHNjb3BlZFBhdGggPT09IFwiXCIpIGNvbnRpbnVlO1xuICAgICAgaWYgKGlnbm9yZWRQYXJlbnQocnVsZXMubWF0Y2hlciwgc2NvcGVkUGF0aCkpIHJldHVybiB0cnVlO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcnVsZXMubWF0Y2hlci50ZXN0KGRpcmVjdG9yeSA/IGAke3RyaW1TbGFzaChzY29wZWRQYXRoKX0vYCA6IHNjb3BlZFBhdGgpO1xuICAgICAgaWYgKHJlc3VsdC5pZ25vcmVkKSBpZ25vcmVkID0gdHJ1ZTtcbiAgICAgIGlmIChyZXN1bHQudW5pZ25vcmVkKSBpZ25vcmVkID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBpZ25vcmVkO1xuICB9XG5cbiAgcHJpdmF0ZSByZWxhdGl2ZVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBhYnNvbHV0ZSA9IGlzQWJzb2x1dGUocGF0aCkgPyByZXNvbHZlKHBhdGgpIDogcmVzb2x2ZSh0aGlzLnJvb3QsIHBhdGgpO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKHRoaXMucm9vdCwgYWJzb2x1dGUpO1xuICAgIGlmIChyZWxhdGl2ZVBhdGggPT09IFwiXCIgfHwgcmVsYXRpdmVQYXRoID09PSBcIi5cIikgcmV0dXJuIFwiLlwiO1xuICAgIGlmIChyZWxhdGl2ZVBhdGggPT09IFwiLi5cIiB8fCByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChgLi4ke3NlcH1gKSB8fCBpc0Fic29sdXRlKHJlbGF0aXZlUGF0aCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0b1Bvc2l4KHJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hSdWxlcygpOiB2b2lkIHtcbiAgICB0aGlzLnJ1bGVzID0gWy4uLnRoaXMuZmlsZXMudmFsdWVzKCldLnNvcnQoXG4gICAgICAobGVmdCwgcmlnaHQpID0+XG4gICAgICAgIHBhdGhEZXB0aChsZWZ0LmRpcmVjdG9yeSkgLSBwYXRoRGVwdGgocmlnaHQuZGlyZWN0b3J5KSB8fFxuICAgICAgICBsZWZ0LnBhdGgubG9jYWxlQ29tcGFyZShyaWdodC5wYXRoKSxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc2NvdmVyeU9wdGlvbnMoXG4gIHJvb3Q6IHN0cmluZyxcbiAgb3B0aW9uczogR2l0SWdub3JlTG9hZE9wdGlvbnMsXG4pOiB7XG4gIGN3ZDogc3RyaW5nO1xuICBkb3Q6IHRydWU7XG4gIGZvbGxvdzogYm9vbGVhbjtcbiAgaWdub3JlOiBJZ25vcmVMaWtlO1xuICBub2RpcjogdHJ1ZTtcbn0ge1xuICBjb25zdCBtYXRjaGVyID0gaWdub3JlUGF0aE1hdGNoZXIob3B0aW9ucy5pZ25vcmVPcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICBjd2Q6IHJvb3QsXG4gICAgZG90OiB0cnVlLFxuICAgIGZvbGxvdzogb3B0aW9ucy5mb2xsb3dTeW1saW5rcyA/PyBmYWxzZSxcbiAgICBpZ25vcmU6IHtcbiAgICAgIGlnbm9yZWQocGF0aCkge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKCk7XG4gICAgICAgIHJldHVybiAhR2l0SWdub3JlLmlzRmlsZShyZWxhdGl2ZVBhdGgpICYmIG1hdGNoZXIocmVsYXRpdmVQYXRoKTtcbiAgICAgIH0sXG4gICAgICBjaGlsZHJlbklnbm9yZWQocGF0aCkge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKCk7XG4gICAgICAgIHJldHVybiBtYXRjaGVyKHJlbGF0aXZlUGF0aCkgfHwgbWF0Y2hlcihgJHtyZWxhdGl2ZVBhdGh9L2ApO1xuICAgICAgfSxcbiAgICB9LFxuICAgIG5vZGlyOiB0cnVlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBpZ25vcmVkUGFyZW50KG1hdGNoZXI6IFJldHVyblR5cGU8dHlwZW9mIGlnbm9yZT4sIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBzZWdtZW50cyA9IHRyaW1TbGFzaChwYXRoKS5zcGxpdChcIi9cIik7XG4gIGNvbnN0IHBhcmVudENvdW50ID0gc2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8PSBwYXJlbnRDb3VudDsgaW5kZXgrKykge1xuICAgIGlmIChtYXRjaGVyLnRlc3QoYCR7c2VnbWVudHMuc2xpY2UoMCwgaW5kZXgpLmpvaW4oXCIvXCIpfS9gKS5pZ25vcmVkKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBhdGhXaXRoaW4oZGlyZWN0b3J5OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZGlyZWN0b3J5KSByZXR1cm4gcGF0aDtcbiAgaWYgKHBhdGggPT09IGRpcmVjdG9yeSkgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBwYXRoLnN0YXJ0c1dpdGgoYCR7ZGlyZWN0b3J5fS9gKSA/IHBhdGguc2xpY2UoZGlyZWN0b3J5Lmxlbmd0aCArIDEpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwYXRoRGVwdGgocGF0aDogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBhdGggPyBwYXRoLnNwbGl0KFwiL1wiKS5sZW5ndGggOiAwO1xufVxuXG5mdW5jdGlvbiB0cmltU2xhc2gocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIik7XG59XG5cbmZ1bmN0aW9uIHRvUG9zaXgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoc2VwKS5qb2luKFwiL1wiKTtcbn1cbiJdfQ==
190
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0LWlnbm9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9naXQtaWdub3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNsRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFtQixNQUFNLE1BQU0sQ0FBQztBQUN2RCxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQW9CLE1BQU0sWUFBWSxDQUFDO0FBaUI3RCwrRUFBK0U7QUFDL0UsTUFBTSxPQUFPLFNBQVM7SUFDWCxJQUFJLENBQVM7SUFDdEIsMEdBQTBHO0lBQ2pHLE9BQU8sR0FBZ0IsYUFBYSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFM0QsS0FBSyxHQUFHLElBQUksR0FBRyxFQUE0QixDQUFDO0lBQ3JELEtBQUssR0FBdUIsRUFBRSxDQUFDO0lBRXZDLFlBQVksSUFBa0I7UUFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsK0RBQStEO0lB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QUMsU0FBUztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzVCLElBQUksSUFBSSxLQUFLLFNBQVM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNsQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN6RixDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsSUFBWTtJQUM3QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsSUFBWTtJQUM3QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxJQUFZO0lBQzNCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTXV0YWJsZSwgR2l0LWNvbXBhdGlibGUgYC5naXRpZ25vcmVgIHBhdGggbWF0Y2hpbmcuXG4gKlxuICogUnVsZSBzeW50YXggaXMgb3duZWQgYnkgdGhlIGBpZ25vcmVgIHBhY2thZ2UsIHdob3NlIGNvbXBhdGliaWxpdHkgc3VpdGVcbiAqIGNvbXBhcmVzIGJlaGF2aW9yIHdpdGggYGdpdCBjaGVjay1pZ25vcmVgLiBUaGlzIG1vZHVsZSBhZGRzIHJlcG9zaXRvcnkgYW5kXG4gKiBuZXN0ZWQtZmlsZSBzY29waW5nIHBsdXMgaW4tbWVtb3J5IGFkZCwgdXBkYXRlLCBhbmQgcmVtb3ZhbC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lLCBpc0Fic29sdXRlLCByZWxhdGl2ZSwgcmVzb2x2ZSwgc2VwIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJub2RlOnVybFwiO1xuaW1wb3J0IHsgZ2xvYiwgZ2xvYlN5bmMsIHR5cGUgSWdub3JlTGlrZSB9IGZyb20gXCJnbG9iXCI7XG5pbXBvcnQgaWdub3JlIGZyb20gXCJpZ25vcmVcIjtcbmltcG9ydCB0eXBlIHsgSWdub3JlUGF0dGVybk9wdGlvbnMgfSBmcm9tIFwiLi9pZ25vcmUudHNcIjtcbmltcG9ydCB7IGlnbm9yZVBhdGhNYXRjaGVyIH0gZnJvbSBcIi4vaWdub3JlLnRzXCI7XG5pbXBvcnQgeyB0b1BhdGhNYXRjaGVyLCB0eXBlIFBhdGhNYXRjaGVyIH0gZnJvbSBcIi4vbWF0Y2gudHNcIjtcblxuaW50ZXJmYWNlIEdpdElnbm9yZVJ1bGVTZXQge1xuICBjb250ZW50OiBzdHJpbmc7XG4gIGRpcmVjdG9yeTogc3RyaW5nO1xuICBtYXRjaGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBpZ25vcmU+O1xuICBwYXRoOiBzdHJpbmc7XG59XG5cbi8qKiBPcHRpb25zIHVzZWQgd2hpbGUgZGlzY292ZXJpbmcgYC5naXRpZ25vcmVgIGZpbGVzIGJlbmVhdGggYSByb290LiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRJZ25vcmVMb2FkT3B0aW9ucyB7XG4gIC8qKiBCdWlsdC1pbiBkaXJlY3RvcnkgZ3JvdXBzIHBydW5lZCB3aGlsZSBsb29raW5nIGZvciBpZ25vcmUgZmlsZXMuICovXG4gIGlnbm9yZU9wdGlvbnM/OiBJZ25vcmVQYXR0ZXJuT3B0aW9ucztcbiAgLyoqIEZvbGxvdyBzeW1saW5rZWQgZGlyZWN0b3JpZXMgZHVyaW5nIGRpc2NvdmVyeS4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIGZvbGxvd1N5bWxpbmtzPzogYm9vbGVhbjtcbn1cblxuLyoqIE11dGFibGUgcGF0aCBwcmVkaWNhdGUgY29tcG9zZWQgZnJvbSByb290IGFuZCBuZXN0ZWQgYC5naXRpZ25vcmVgIGZpbGVzLiAqL1xuZXhwb3J0IGNsYXNzIEdpdElnbm9yZSB7XG4gIHJlYWRvbmx5IHJvb3Q6IHN0cmluZztcbiAgLyoqIFN0YWJsZSBjb21wb3NhYmxlIG1hdGNoZXIgdGhhdCBvYnNlcnZlcyBsYXRlciB7QGxpbmsgc2V0fSwge0BsaW5rIGRlbGV0ZX0sIGFuZCB7QGxpbmsgY2xlYXJ9IGNhbGxzLiAqL1xuICByZWFkb25seSBtYXRjaGVyOiBQYXRoTWF0Y2hlciA9IHRvUGF0aE1hdGNoZXIoKHBhdGgpID0+IHRoaXMuaWdub3JlcyhwYXRoKSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBHaXRJZ25vcmVSdWxlU2V0PigpO1xuICBwcml2YXRlIHJ1bGVzOiBHaXRJZ25vcmVSdWxlU2V0W10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihyb290OiBzdHJpbmcgfCBVUkwpIHtcbiAgICB0aGlzLnJvb3QgPSByZXNvbHZlKHJvb3QgaW5zdGFuY2VvZiBVUkwgPyBmaWxlVVJMVG9QYXRoKHJvb3QpIDogcm9vdCk7XG4gIH1cblxuICAvKiogTG9hZCBldmVyeSBhcHBsaWNhYmxlIGAuZ2l0aWdub3JlYCBiZW5lYXRoIHtAbGluayByb290fS4gKi9cbiAgc3RhdGljIGFzeW5jIGxvYWQocm9vdDogc3RyaW5nIHwgVVJMLCBvcHRpb25zOiBHaXRJZ25vcmVMb2FkT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxHaXRJZ25vcmU+IHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgR2l0SWdub3JlKHJvb3QpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBhd2FpdCBnbG9iKFwiKiovLmdpdGlnbm9yZVwiLCBkaXNjb3ZlcnlPcHRpb25zKHJlc3VsdC5yb290LCBvcHRpb25zKSkpIHtcbiAgICAgIHJlc3VsdC5zZXQocGF0aCwgYXdhaXQgcmVhZEZpbGUocmVzb2x2ZShyZXN1bHQucm9vdCwgcGF0aCksIFwidXRmOFwiKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogU3luY2hyb25vdXMgY291bnRlcnBhcnQgdG8ge0BsaW5rIEdpdElnbm9yZS5sb2FkfS4gKi9cbiAgc3RhdGljIGxvYWRTeW5jKHJvb3Q6IHN0cmluZyB8IFVSTCwgb3B0aW9uczogR2l0SWdub3JlTG9hZE9wdGlvbnMgPSB7fSk6IEdpdElnbm9yZSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEdpdElnbm9yZShyb290KTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZ2xvYlN5bmMoXCIqKi8uZ2l0aWdub3JlXCIsIGRpc2NvdmVyeU9wdGlvbnMocmVzdWx0LnJvb3QsIG9wdGlvbnMpKSkge1xuICAgICAgcmVzdWx0LnNldChwYXRoLCByZWFkRmlsZVN5bmMocmVzb2x2ZShyZXN1bHQucm9vdCwgcGF0aCksIFwidXRmOFwiKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogV2hldGhlciBgcGF0aGAgbmFtZXMgYSBgLmdpdGlnbm9yZWAgY29udHJvbCBmaWxlLiAqL1xuICBzdGF0aWMgaXNGaWxlKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBiYXNlbmFtZShwYXRoKSA9PT0gXCIuZ2l0aWdub3JlXCI7XG4gIH1cblxuICAvKiogQWRkIG9yIHJlcGxhY2Ugb25lIGAuZ2l0aWdub3JlYCBmaWxlIGFuZCBpdHMgaW4tbWVtb3J5IGNvbnRlbnQuICovXG4gIHNldChwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHRoaXMucmVsYXRpdmVQYXRoKHBhdGgpO1xuICAgIGlmICghcmVsYXRpdmVQYXRoIHx8ICFHaXRJZ25vcmUuaXNGaWxlKHJlbGF0aXZlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEdpdCBpZ25vcmUgcGF0aCBtdXN0IG5hbWUgYSAuZ2l0aWdub3JlIHVuZGVyICR7dGhpcy5yb290fTogJHtwYXRofWApO1xuICAgIH1cbiAgICB0aGlzLmZpbGVzLnNldChyZWxhdGl2ZVBhdGgsIHtcbiAgICAgIGNvbnRlbnQsXG4gICAgICBkaXJlY3Rvcnk6IHRvUG9zaXgoZGlybmFtZShyZWxhdGl2ZVBhdGgpKSA9PT0gXCIuXCIgPyBcIlwiIDogdG9Qb3NpeChkaXJuYW1lKHJlbGF0aXZlUGF0aCkpLFxuICAgICAgbWF0Y2hlcjogaWdub3JlKCkuYWRkKGNvbnRlbnQpLFxuICAgICAgcGF0aDogcmVsYXRpdmVQYXRoLFxuICAgIH0pO1xuICAgIHRoaXMucmVmcmVzaFJ1bGVzKCk7XG4gIH1cblxuICAvKiogUmVtb3ZlIG9uZSBgLmdpdGlnbm9yZWAgZmlsZS4gUmV0dXJucyB3aGV0aGVyIGl0IHdhcyByZWdpc3RlcmVkLiAqL1xuICBkZWxldGUocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gdGhpcy5yZWxhdGl2ZVBhdGgocGF0aCk7XG4gICAgaWYgKCFyZWxhdGl2ZVBhdGgpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy5maWxlcy5kZWxldGUocmVsYXRpdmVQYXRoKTtcbiAgICBpZiAoZGVsZXRlZCkgdGhpcy5yZWZyZXNoUnVsZXMoKTtcbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgZXZlcnkgcmVnaXN0ZXJlZCBgLmdpdGlnbm9yZWAuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsZXMuY2xlYXIoKTtcbiAgICB0aGlzLnJ1bGVzID0gW107XG4gIH1cblxuICAvKiogUmV0dXJuIHRoZSByZXRhaW5lZCBjb250ZW50IGZvciBhIHJlZ2lzdGVyZWQgYC5naXRpZ25vcmVgLiAqL1xuICBnZXQocGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSB0aGlzLnJlbGF0aXZlUGF0aChwYXRoKTtcbiAgICByZXR1cm4gcmVsYXRpdmVQYXRoID8gdGhpcy5maWxlcy5nZXQocmVsYXRpdmVQYXRoKT8uY29udGVudCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbml6ZSB0aGUgcm9vdCBhbmQgYW5jZXN0b3IgY29udHJvbCBmaWxlcyB0aGF0IGNhbiBhZmZlY3QgYHBhdGhgLlxuICAgKlxuICAgKiBGaWxlIHdhdGNoZXJzIGNhbGwgdGhpcyBiZWZvcmUgZXZhbHVhdGluZyBhIG5ldyBmaWxlc3lzdGVtIGV2ZW50IHNvIGFcbiAgICogY29udHJvbC1maWxlIGV2ZW50IGRlbGF5ZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gY2Fubm90IGFkbWl0IGEgZmlsZVxuICAgKiB1bmRlciBzdGFsZSBydWxlcy5cbiAgICovXG4gIHJlZnJlc2hQYXRoU3luYyhwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSB0aGlzLnJlbGF0aXZlUGF0aChwYXRoKTtcbiAgICBpZiAoIXJlbGF0aXZlUGF0aCkgcmV0dXJuO1xuICAgIGNvbnN0IGRpcmVjdG9yeSA9IHRvUG9zaXgoZGlybmFtZShyZWxhdGl2ZVBhdGgpKTtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gW1wiLmdpdGlnbm9yZVwiXTtcbiAgICBsZXQgY3VycmVudCA9IFwiXCI7XG4gICAgZm9yIChjb25zdCBzZWdtZW50IG9mIGRpcmVjdG9yeSA9PT0gXCIuXCIgPyBbXSA6IGRpcmVjdG9yeS5zcGxpdChcIi9cIikpIHtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50ID8gYCR7Y3VycmVudH0vJHtzZWdtZW50fWAgOiBzZWdtZW50O1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKGAke2N1cnJlbnR9Ly5naXRpZ25vcmVgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgICAgY29uc3QgYWJzb2x1dGUgPSByZXNvbHZlKHRoaXMucm9vdCwgY2FuZGlkYXRlKTtcbiAgICAgIGlmICghZXhpc3RzU3luYyhhYnNvbHV0ZSkpIHtcbiAgICAgICAgdGhpcy5kZWxldGUoY2FuZGlkYXRlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKGFic29sdXRlLCBcInV0ZjhcIik7XG4gICAgICBpZiAodGhpcy5nZXQoY2FuZGlkYXRlKSAhPT0gY29udGVudCkgdGhpcy5zZXQoY2FuZGlkYXRlLCBjb250ZW50KTtcbiAgICB9XG4gIH1cblxuICAvKiogV2hldGhlciBhIHBhdGggaXMgaWdub3JlZCBhZnRlciBhcHBseWluZyBwYXJlbnQgdGhlbiBuZXN0ZWQgcnVsZSBmaWxlcy4gKi9cbiAgaWdub3JlcyhwYXRoOiBzdHJpbmcsIGRpcmVjdG9yeTogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gdGhpcy5yZWxhdGl2ZVBhdGgocGF0aCk7XG4gICAgaWYgKCFyZWxhdGl2ZVBhdGggfHwgcmVsYXRpdmVQYXRoID09PSBcIi5cIikgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBpZ25vcmVkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBydWxlcyBvZiB0aGlzLnJ1bGVzKSB7XG4gICAgICBjb25zdCBzY29wZWRQYXRoID0gcGF0aFdpdGhpbihydWxlcy5kaXJlY3RvcnksIHJlbGF0aXZlUGF0aCk7XG4gICAgICBpZiAoc2NvcGVkUGF0aCA9PT0gdW5kZWZpbmVkIHx8IHNjb3BlZFBhdGggPT09IFwiXCIpIGNvbnRpbnVlO1xuICAgICAgaWYgKGlnbm9yZWRQYXJlbnQocnVsZXMubWF0Y2hlciwgc2NvcGVkUGF0aCkpIHJldHVybiB0cnVlO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcnVsZXMubWF0Y2hlci50ZXN0KGRpcmVjdG9yeSA/IGAke3RyaW1TbGFzaChzY29wZWRQYXRoKX0vYCA6IHNjb3BlZFBhdGgpO1xuICAgICAgaWYgKHJlc3VsdC5pZ25vcmVkKSBpZ25vcmVkID0gdHJ1ZTtcbiAgICAgIGlmIChyZXN1bHQudW5pZ25vcmVkKSBpZ25vcmVkID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBpZ25vcmVkO1xuICB9XG5cbiAgcHJpdmF0ZSByZWxhdGl2ZVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBhYnNvbHV0ZSA9IGlzQWJzb2x1dGUocGF0aCkgPyByZXNvbHZlKHBhdGgpIDogcmVzb2x2ZSh0aGlzLnJvb3QsIHBhdGgpO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKHRoaXMucm9vdCwgYWJzb2x1dGUpO1xuICAgIGlmIChyZWxhdGl2ZVBhdGggPT09IFwiXCIgfHwgcmVsYXRpdmVQYXRoID09PSBcIi5cIikgcmV0dXJuIFwiLlwiO1xuICAgIGlmIChyZWxhdGl2ZVBhdGggPT09IFwiLi5cIiB8fCByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChgLi4ke3NlcH1gKSB8fCBpc0Fic29sdXRlKHJlbGF0aXZlUGF0aCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0b1Bvc2l4KHJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hSdWxlcygpOiB2b2lkIHtcbiAgICB0aGlzLnJ1bGVzID0gWy4uLnRoaXMuZmlsZXMudmFsdWVzKCldLnNvcnQoXG4gICAgICAobGVmdCwgcmlnaHQpID0+XG4gICAgICAgIHBhdGhEZXB0aChsZWZ0LmRpcmVjdG9yeSkgLSBwYXRoRGVwdGgocmlnaHQuZGlyZWN0b3J5KSB8fFxuICAgICAgICBsZWZ0LnBhdGgubG9jYWxlQ29tcGFyZShyaWdodC5wYXRoKSxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc2NvdmVyeU9wdGlvbnMoXG4gIHJvb3Q6IHN0cmluZyxcbiAgb3B0aW9uczogR2l0SWdub3JlTG9hZE9wdGlvbnMsXG4pOiB7XG4gIGN3ZDogc3RyaW5nO1xuICBkb3Q6IHRydWU7XG4gIGZvbGxvdzogYm9vbGVhbjtcbiAgaWdub3JlOiBJZ25vcmVMaWtlO1xuICBub2RpcjogdHJ1ZTtcbn0ge1xuICBjb25zdCBtYXRjaGVyID0gaWdub3JlUGF0aE1hdGNoZXIob3B0aW9ucy5pZ25vcmVPcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICBjd2Q6IHJvb3QsXG4gICAgZG90OiB0cnVlLFxuICAgIGZvbGxvdzogb3B0aW9ucy5mb2xsb3dTeW1saW5rcyA/PyBmYWxzZSxcbiAgICBpZ25vcmU6IHtcbiAgICAgIGlnbm9yZWQocGF0aCkge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKCk7XG4gICAgICAgIHJldHVybiAhR2l0SWdub3JlLmlzRmlsZShyZWxhdGl2ZVBhdGgpICYmIG1hdGNoZXIocmVsYXRpdmVQYXRoKTtcbiAgICAgIH0sXG4gICAgICBjaGlsZHJlbklnbm9yZWQocGF0aCkge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKCk7XG4gICAgICAgIHJldHVybiBtYXRjaGVyKHJlbGF0aXZlUGF0aCkgfHwgbWF0Y2hlcihgJHtyZWxhdGl2ZVBhdGh9L2ApO1xuICAgICAgfSxcbiAgICB9LFxuICAgIG5vZGlyOiB0cnVlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBpZ25vcmVkUGFyZW50KG1hdGNoZXI6IFJldHVyblR5cGU8dHlwZW9mIGlnbm9yZT4sIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBzZWdtZW50cyA9IHRyaW1TbGFzaChwYXRoKS5zcGxpdChcIi9cIik7XG4gIGNvbnN0IHBhcmVudENvdW50ID0gc2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8PSBwYXJlbnRDb3VudDsgaW5kZXgrKykge1xuICAgIGlmIChtYXRjaGVyLnRlc3QoYCR7c2VnbWVudHMuc2xpY2UoMCwgaW5kZXgpLmpvaW4oXCIvXCIpfS9gKS5pZ25vcmVkKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBhdGhXaXRoaW4oZGlyZWN0b3J5OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZGlyZWN0b3J5KSByZXR1cm4gcGF0aDtcbiAgaWYgKHBhdGggPT09IGRpcmVjdG9yeSkgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBwYXRoLnN0YXJ0c1dpdGgoYCR7ZGlyZWN0b3J5fS9gKSA/IHBhdGguc2xpY2UoZGlyZWN0b3J5Lmxlbmd0aCArIDEpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwYXRoRGVwdGgocGF0aDogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBhdGggPyBwYXRoLnNwbGl0KFwiL1wiKS5sZW5ndGggOiAwO1xufVxuXG5mdW5jdGlvbiB0cmltU2xhc2gocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIik7XG59XG5cbmZ1bmN0aW9uIHRvUG9zaXgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoc2VwKS5qb2luKFwiL1wiKTtcbn1cbiJdfQ==
package/lib/src/watch.js CHANGED
@@ -8,7 +8,8 @@
8
8
  *
9
9
  * @module
10
10
  */
11
- import { readFile } from "node:fs/promises";
11
+ import { once } from "node:events";
12
+ import { readFileSync } from "node:fs";
12
13
  import { isAbsolute, relative, resolve } from "path";
13
14
  import { errorUtils, log } from "@dbx-tools/shared-core";
14
15
  import { watch } from "chokidar";
@@ -39,20 +40,21 @@ export async function watchFiles(paths, options) {
39
40
  else {
40
41
  watchPaths = literals;
41
42
  }
43
+ const controls = gitIgnore
44
+ ? await createGitIgnoreControls(gitIgnore, {
45
+ cwd,
46
+ followSymlinks,
47
+ ignoreOptions: options?.ignoreOptions,
48
+ persistent: chokidarOptions.persistent,
49
+ })
50
+ : undefined;
42
51
  const watcher = watch(watchPaths, {
43
52
  ...chokidarOptions,
44
53
  cwd,
45
54
  followSymlinks,
46
55
  ignored,
47
56
  });
48
- if (gitIgnore) {
49
- attachGitIgnoreWatcher(watcher, gitIgnore, watchPaths, {
50
- cwd,
51
- followSymlinks,
52
- ignoreOptions: options?.ignoreOptions,
53
- persistent: chokidarOptions.persistent,
54
- });
55
- }
57
+ controls?.attach(watcher, watchPaths);
56
58
  return watcher;
57
59
  }
58
60
  function partitionPaths(paths) {
@@ -112,6 +114,7 @@ function toWatchMatchFunction(ignore, ignoreOptions, cwd, gitIgnore) {
112
114
  matcher = matcher.or(...pathMatchTests(...patterns));
113
115
  const matchPath = (path, stats) => {
114
116
  const rel = toCwdRelativePath(path, cwd);
117
+ gitIgnore?.refreshPathSync(rel);
115
118
  if (gitIgnore?.ignores(rel, stats?.isDirectory() ?? false))
116
119
  return true;
117
120
  if (matcher(rel))
@@ -133,13 +136,22 @@ function toWatchMatchFunction(ignore, ignoreOptions, cwd, gitIgnore) {
133
136
  };
134
137
  return matchPath;
135
138
  }
136
- function attachGitIgnoreWatcher(watcher, gitIgnore, watchPaths, options) {
139
+ /**
140
+ * Start the control-file watcher before the primary watcher.
141
+ *
142
+ * Waiting for its initial scan closes the event-loss window where a newly
143
+ * created `.gitignore` could be missed while the primary watcher was already
144
+ * accepting files under stale rules.
145
+ */
146
+ async function createGitIgnoreControls(gitIgnore, options) {
137
147
  const builtInIgnore = ignorePathMatcher(options.ignoreOptions);
138
148
  const controls = watch(".", {
139
149
  atomic: false,
140
150
  cwd: options.cwd,
141
151
  followSymlinks: options.followSymlinks,
142
- ignoreInitial: true,
152
+ // Include the initial scan so a control file created while this secondary
153
+ // watcher starts cannot fall between its scan and live event subscription.
154
+ ignoreInitial: false,
143
155
  persistent: options.persistent,
144
156
  ignored(path, stats) {
145
157
  const relativePath = toCwdRelativePath(path, options.cwd);
@@ -150,31 +162,50 @@ function attachGitIgnoreWatcher(watcher, gitIgnore, watchPaths, options) {
150
162
  return stats ? !stats.isDirectory() : false;
151
163
  },
152
164
  });
165
+ let target;
166
+ let pendingError;
167
+ const refreshTarget = () => {
168
+ target?.watcher.add([...target.watchPaths]);
169
+ };
153
170
  const reload = (path) => {
154
- void readFile(resolve(options.cwd, path), "utf8")
155
- .then((content) => {
156
- gitIgnore.set(path, content);
157
- watcher.add([...watchPaths]);
171
+ try {
172
+ gitIgnore.set(path, readFileSync(resolve(options.cwd, path), "utf8"));
173
+ refreshTarget();
158
174
  logger.debug(".gitignore updated", { path });
159
- })
160
- .catch((error) => {
175
+ }
176
+ catch (error) {
161
177
  logger.warn("failed to reload .gitignore", {
162
178
  path,
163
179
  error: errorUtils.toError(error),
164
180
  });
165
- });
181
+ }
166
182
  };
167
183
  controls.on("add", reload);
168
184
  controls.on("change", reload);
169
185
  controls.on("unlink", (path) => {
170
186
  gitIgnore.delete(path);
171
- watcher.add([...watchPaths]);
187
+ refreshTarget();
172
188
  logger.debug(".gitignore removed", { path });
173
189
  });
174
- controls.on("error", (error) => watcher.emit("error", error));
175
- const close = watcher.close.bind(watcher);
176
- watcher.close = async () => {
177
- await Promise.all([close(), controls.close()]);
190
+ controls.on("error", (error) => {
191
+ if (target)
192
+ target.watcher.emit("error", error);
193
+ else
194
+ pendingError = error;
195
+ });
196
+ await once(controls, "ready");
197
+ return {
198
+ attach(watcher, watchPaths) {
199
+ target = { watcher, watchPaths };
200
+ if (pendingError) {
201
+ queueMicrotask(() => watcher.emit("error", pendingError));
202
+ pendingError = undefined;
203
+ }
204
+ const close = watcher.close.bind(watcher);
205
+ watcher.close = async () => {
206
+ await Promise.all([close(), controls.close()]);
207
+ };
208
+ },
178
209
  };
179
210
  }
180
211
  /** Aligns chokidar paths with the cwd-relative form {@link findFiles} uses. */
@@ -206,4 +237,4 @@ if (import.meta.main) {
206
237
  });
207
238
  console.log("Watcher started");
208
239
  }
209
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBR0gsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBa0MsS0FBSyxFQUFrQixNQUFNLFVBQVUsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxTQUFTLEVBQXdCLE1BQU0sV0FBVyxDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQTBDLHVCQUF1QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTVGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFheEM7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsVUFBVSxDQUM5QixLQUF3QixFQUN4QixPQUEwQjtJQUUxQixNQUFNLFVBQVUsR0FBRyxNQUFNLDRCQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsR0FBRyxlQUFlLEVBQUUsR0FBRyxVQUFVLENBQUM7SUFDbkYsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsY0FBYyxDQUFDLEtB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LElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzRSxPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUV6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQyxXQUFXLEVBQUU7UUFDNUMsR0FBRztRQUNILGFBQWEsRUFBRSxLQUFLO1FBQ3BCLE1BQU0sRUFBRSxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUM7UUFDckMsYUFBYSxFQUFFO1lBQ2IsSUFBSSxFQUFFLEtBQUs7U0FDWjtLQUNGLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBYSxFQUFFLElBQVksRUFBRSxFQUFFO1FBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDNUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXBvc2l0b3J5LWNvbnNpc3RlbnQgZmlsZSB3YXRjaGluZyBvdmVyIENob2tpZGFyLlxuICpcbiAqIFJldXNlIGB3YXRjaEZpbGVzKClgIHdoZW4gbGl2ZSB3b3JrZmxvd3MgbXVzdCBtYXRjaCBgZmluZEZpbGVzKClgXG4gKiBkaXNjb3ZlcnkgYW5kIHRoZSBjZW50cmFsIGlnbm9yZSBjYXRhbG9ndWUuIFRoZSB3cmFwcGVyIGV4cGFuZHMgZ2xvYnMgb25jZSxcbiAqIHBydW5lcyBpZ25vcmVkIGRpcmVjdG9yaWVzIGNvbnNpc3RlbnRseSwgYW5kIHByZXNlcnZlcyBDaG9raWRhcidzIG5hdGl2ZVxuICogd2F0Y2hlciByZXN1bHQgZm9yIGNhbGxlcnMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFN0YXRzIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBpc0Fic29sdXRlLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgQ2hva2lkYXJPcHRpb25zLCBNYXRjaEZ1bmN0aW9uLCB3YXRjaCwgdHlwZSBGU1dhdGNoZXIgfSBmcm9tIFwiY2hva2lkYXJcIjtcbmltcG9ydCB7IGhhc01hZ2ljIH0gZnJvbSBcImdsb2JcIjtcbmltcG9ydCB7IGZpbmRGaWxlcywgdHlwZSBGaWxlRmluZE9wdGlvbnMgfSBmcm9tIFwiLi9maW5kLnRzXCI7XG5pbXBvcnQgeyBHaXRJZ25vcmUgfSBmcm9tIFwiLi9naXQtaWdub3JlLnRzXCI7XG5pbXBvcnQgeyBpZ25vcmVQYXRoTWF0Y2hlciB9IGZyb20gXCIuL2lnbm9yZS50c1wiO1xuaW1wb3J0IHsgcGF0aE1hdGNoVGVzdHMgfSBmcm9tIFwiLi9tYXRjaC50c1wiO1xuaW1wb3J0IHsgRmlsZVNjYW5JZ25vcmVPcHRpb25zLCBGaWxlU2Nhbk9wdGlvbnMsIEZPTExPV19TWU1MSU5LU19ERUZBVUxUIH0gZnJvbSBcIi4vc2Nhbi50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwicGF0aC93YXRjaFwiKTtcblxuLyoqIENob2tpZGFyIG9wdGlvbnMgZXh0ZW5kZWQgd2l0aCB0aGUgc2hhcmVkIGRieC10b29scyBpZ25vcmUgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVdhdGNoT3B0aW9uc1xuICBleHRlbmRzIE9taXQ8Q2hva2lkYXJPcHRpb25zLCBcImlnbm9yZWRcIj4sIE9taXQ8RmlsZVNjYW5PcHRpb25zLCBcImlnbm9yZVwiPiB7XG4gIGlnbm9yZT86IHN0cmluZyB8IHN0cmluZ1tdIHwgTWF0Y2hGdW5jdGlvbiB8IE1hdGNoRnVuY3Rpb25bXTtcbn1cblxuaW50ZXJmYWNlIE5vcm1hbGl6ZWRGaWxlV2F0Y2hPcHRpb25zIGV4dGVuZHMgT21pdDxGaWxlV2F0Y2hPcHRpb25zLCBcImlnbm9yZVwiIHwgXCJpZ25vcmVPcHRpb25zXCI+IHtcbiAgZ2l0SWdub3JlPzogR2l0SWdub3JlO1xuICBpZ25vcmVkOiBNYXRjaEZ1bmN0aW9uO1xufVxuXG4vKipcbiAqIFdhdGNoZXMgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGZvciByZWFsLXRpbWUgY2hhbmdlcywgYXBwbHlpbmcgdGhlIHNoYXJlZFxuICogaWdub3JlIGdyb3VwcyBzbyBpdCBwcnVuZXMgdGhlIHNhbWUgcGF0aHMge0BsaW5rIGZpbmRGaWxlc30gc2tpcHMgZm9yIHRoZVxuICogc2FtZSBwYXR0ZXJucy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhdGNoRmlsZXMoXG4gIHBhdGhzOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IEZpbGVXYXRjaE9wdGlvbnMsXG4pOiBQcm9taXNlPEZTV2F0Y2hlcj4ge1xuICBjb25zdCBub3JtYWxpemVkID0gYXdhaXQgdG9Ob3JtYWxpemVkRmlsZVdhdGNoT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgeyBnaXRJZ25vcmUsIGlnbm9yZWQsIGN3ZCwgZm9sbG93U3ltbGlua3MsIC4uLmNob2tpZGFyT3B0aW9ucyB9ID0gbm9ybWFsaXplZDtcbiAgY29uc3QgeyBwYXRoczogbGl0ZXJhbHMsIGdsb2JzIH0gPSBwYXJ0aXRpb25QYXRocyhwYXRocyk7XG5cbiAgbGV0IHdhdGNoUGF0aHM6IHN0cmluZ1tdO1xuICBpZiAoZ2xvYnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGRpc3RpbmN0V2F0Y2hQYXRocyA9IG5ldyBTZXQobGl0ZXJhbHMpO1xuICAgIGZvciBhd2FpdCAoY29uc3QgcGF0aCBvZiBmaW5kRmlsZXMoZ2xvYnMsIHRvRmluZEZpbGVzT3B0aW9ucyhub3JtYWxpemVkKSkpIHtcbiAgICAgIGRpc3RpbmN0V2F0Y2hQYXRocy5hZGQocGF0aCk7XG4gICAgfVxuICAgIHdhdGNoUGF0aHMgPSBbLi4uZGlzdGluY3RXYXRjaFBhdGhzXTtcbiAgfSBlbHNlIHtcbiAgICB3YXRjaFBhdGhzID0gbGl0ZXJhbHM7XG4gIH1cblxuICBjb25zdCB3YXRjaGVyID0gd2F0Y2god2F0Y2hQYXRocywge1xuICAgIC4uLmNob2tpZGFyT3B0aW9ucyxcbiAgICBjd2QsXG4gICAgZm9sbG93U3ltbGlua3MsXG4gICAgaWdub3JlZCxcbiAgfSk7XG4gIGlmIChnaXRJZ25vcmUpIHtcbiAgICBhdHRhY2hHaXRJZ25vcmVXYXRjaGVyKHdhdGNoZXIsIGdpdElnbm9yZSwgd2F0Y2hQYXRocywge1xuICAgICAgY3dkLFxuICAgICAgZm9sbG93U3ltbGlua3MsXG4gICAgICBpZ25vcmVPcHRpb25zOiBvcHRpb25zPy5pZ25vcmVPcHRpb25zLFxuICAgICAgcGVyc2lzdGVudDogY2hva2lkYXJPcHRpb25zLnBlcnNpc3RlbnQsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHdhdGNoZXI7XG59XG5cbmZ1bmN0aW9uIHBhcnRpdGlvblBhdGhzKHBhdGhzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHsgcGF0aHM6IHN0cmluZ1tdOyBnbG9iczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IGdsb2JzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBsaXRlcmFsczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXRoIG9mIEFycmF5LmlzQXJyYXkocGF0aHMpID8gcGF0aHMgOiBbcGF0aHNdKSB7XG4gICAgKGhhc01hZ2ljKHBhdGgpID8gZ2xvYnMgOiBsaXRlcmFscykucHVzaChwYXRoKTtcbiAgfVxuICByZXR1cm4geyBwYXRoczogbGl0ZXJhbHMsIGdsb2JzIH07XG59XG5cbi8qKlxuICogQnVpbGRzIHtAbGluayBOb3JtYWxpemVkRmlsZVdhdGNoT3B0aW9uc30gZmlyc3Q6IGFsbCBjYWxsZXIgaWdub3JlIGlucHV0cyBhbmRcbiAqIGJ1aWx0LWluIGdyb3VwcyBhcmUgY29uc29saWRhdGVkIGludG8gb25lIGNob2tpZGFyIHtAbGluayBNYXRjaEZ1bmN0aW9ufS4gV2hlblxuICogYHN0YXRzYCBtYXJrcyBhIGRpcmVjdG9yeSwgdGhlIG1hdGNoZXIgYWxzbyB0ZXN0cyBgcGF0aCArIFwiL1wiYCBmb3IgcHJ1bmluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdG9Ob3JtYWxpemVkRmlsZVdhdGNoT3B0aW9ucyhvcHRpb25zPzogRmlsZVdhdGNoT3B0aW9ucyk6IFByb21pc2U8XG4gIE5vcm1hbGl6ZWRGaWxlV2F0Y2hPcHRpb25zICYge1xuICAgIGN3ZDogc3RyaW5nO1xuICAgIGZvbGxvd1N5bWxpbmtzOiBib29sZWFuO1xuICB9XG4+IHtcbiAgY29uc3QgeyBjd2QsIGlnbm9yZSwgZm9sbG93U3ltbGlua3MsIGlnbm9yZU9wdGlvbnMsIC4uLmNob2tpZGFyT3B0aW9ucyB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgY29uc3Qgcm9vdCA9IGN3ZCA/PyBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCBnaXRJZ25vcmUgPSBpZ25vcmVPcHRpb25zPy5naXRcbiAgICA/IGF3YWl0IEdpdElnbm9yZS5sb2FkKHJvb3QsIHsgaWdub3JlT3B0aW9ucywgZm9sbG93U3ltbGlua3MgfSlcbiAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICAuLi5jaG9raWRhck9wdGlvbnMsXG4gICAgY3dkOiByb290LFxuICAgIGZvbGxvd1N5bWxpbmtzOiBmb2xsb3dTeW1saW5rcyA/PyBGT0xMT1dfU1lNTElOS1NfREVGQVVMVCxcbiAgICAuLi4oZ2l0SWdub3JlID8geyBnaXRJZ25vcmUgfSA6IHt9KSxcbiAgICBpZ25vcmVkOiB0b1dhdGNoTWF0Y2hGdW5jdGlvbihpZ25vcmUsIGlnbm9yZU9wdGlvbnMsIHJvb3QsIGdpdElnbm9yZSksXG4gIH07XG59XG5cbi8qKiBHbG9iIGV4cGFuc2lvbiByZXVzZXMgdGhlIG5vcm1hbGl6ZWQgaWdub3JlIG1hdGNoZXIgYXMgYSBjd2QtcmVsYXRpdmUgcGF0aCBwcmVkaWNhdGUuICovXG5mdW5jdGlvbiB0b0ZpbmRGaWxlc09wdGlvbnMoXG4gIG5vcm1hbGl6ZWQ6IE5vcm1hbGl6ZWRGaWxlV2F0Y2hPcHRpb25zICYgeyBjd2Q6IHN0cmluZzsgZm9sbG93U3ltbGlua3M6IGJvb2xlYW4gfSxcbik6IEZpbGVGaW5kT3B0aW9ucyB7XG4gIGNvbnN0IHsgaWdub3JlZCwgY3dkLCBmb2xsb3dTeW1saW5rcyB9ID0gbm9ybWFsaXplZDtcbiAgcmV0dXJuIHtcbiAgICBjd2QsXG4gICAgZm9sbG93U3ltbGlua3MsXG4gICAgaWdub3JlOiAocGF0aCkgPT4gaWdub3JlZChwYXRoLCB1bmRlZmluZWQpLFxuICB9O1xufVxuXG4vKipcbiAqIENvbnNvbGlkYXRlcyBidWlsdC1pbiBpZ25vcmUgZ3JvdXBzLCBjYWxsZXIgZ2xvYiBwYXR0ZXJucywgYW5kIGNhbGxlclxuICoge0BsaW5rIE1hdGNoRnVuY3Rpb259cyBpbnRvIG9uZSBpZ25vcmUgdGVzdC4gRGlyZWN0b3J5IHBydW5pbmcgdXNlcyBgc3RhdHNgXG4gKiB3aGVuIGNob2tpZGFyIHN1cHBsaWVzIGl0OyBnbG9iIGV4cGFuc2lvbiBwYXNzZXMgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIHRvV2F0Y2hNYXRjaEZ1bmN0aW9uKFxuICBpZ25vcmU6IEZpbGVXYXRjaE9wdGlvbnNbXCJpZ25vcmVcIl0gfCB1bmRlZmluZWQsXG4gIGlnbm9yZU9wdGlvbnM6IEZpbGVTY2FuSWdub3JlT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgY3dkOiBzdHJpbmcsXG4gIGdpdElnbm9yZT86IEdpdElnbm9yZSxcbik6IE1hdGNoRnVuY3Rpb24ge1xuICBjb25zdCBwYXR0ZXJuczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZnVuY3Rpb25zOiBNYXRjaEZ1bmN0aW9uW10gPSBbXTtcblxuICBpZiAoaWdub3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgQXJyYXkuaXNBcnJheShpZ25vcmUpID8gaWdub3JlIDogW2lnbm9yZV0pIHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIikgcGF0dGVybnMucHVzaChpdGVtKTtcbiAgICAgIGVsc2UgZnVuY3Rpb25zLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgbGV0IG1hdGNoZXIgPSBpZ25vcmVQYXRoTWF0Y2hlcihpZ25vcmVPcHRpb25zKTtcbiAgaWYgKHBhdHRlcm5zLmxlbmd0aCA+IDApIG1hdGNoZXIgPSBtYXRjaGVyLm9yKC4uLnBhdGhNYXRjaFRlc3RzKC4uLnBhdHRlcm5zKSk7XG5cbiAgY29uc3QgbWF0Y2hQYXRoID0gKHBhdGg6IHN0cmluZywgc3RhdHM/OiBTdGF0cyk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IHJlbCA9IHRvQ3dkUmVsYXRpdmVQYXRoKHBhdGgsIGN3ZCk7XG4gICAgaWYgKGdpdElnbm9yZT8uaWdub3JlcyhyZWwsIHN0YXRzPy5pc0RpcmVjdG9yeSgpID8/IGZhbHNlKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKG1hdGNoZXIocmVsKSkgcmV0dXJuIHRydWU7XG4gICAgZm9yIChjb25zdCBmbiBvZiBmdW5jdGlvbnMpIHtcbiAgICAgIGlmIChmbihyZWwsIHN0YXRzKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzdGF0cz8uaXNEaXJlY3RvcnkoKSkge1xuICAgICAgY29uc3QgZGlyZWN0b3J5UGF0aCA9IHJlbCArIFwiL1wiO1xuICAgICAgaWYgKG1hdGNoZXIoZGlyZWN0b3J5UGF0aCkpIHJldHVybiB0cnVlO1xuICAgICAgZm9yIChjb25zdCBmbiBvZiBmdW5jdGlvbnMpIHtcbiAgICAgICAgaWYgKGZuKGRpcmVjdG9yeVBhdGgsIHN0YXRzKSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICByZXR1cm4gbWF0Y2hQYXRoO1xufVxuXG5mdW5jdGlvbiBhdHRhY2hHaXRJZ25vcmVXYXRjaGVyKFxuICB3YXRjaGVyOiBGU1dhdGNoZXIsXG4gIGdpdElnbm9yZTogR2l0SWdub3JlLFxuICB3YXRjaFBhdGhzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9uczoge1xuICAgIGN3ZDogc3RyaW5nO1xuICAgIGZvbGxvd1N5bWxpbmtzOiBib29sZWFuO1xuICAgIGlnbm9yZU9wdGlvbnM/OiBGaWxlU2Nhbklnbm9yZU9wdGlvbnM7XG4gICAgcGVyc2lzdGVudD86IGJvb2xlYW47XG4gIH0sXG4pOiB2b2lkIHtcbiAgY29uc3QgYnVpbHRJbklnbm9yZSA9IGlnbm9yZVBhdGhNYXRjaGVyKG9wdGlvbnMuaWdub3JlT3B0aW9ucyk7XG4gIGNvbnN0IGNvbnRyb2xzID0gd2F0Y2goXCIuXCIsIHtcbiAgICBhdG9taWM6IGZhbHNlLFxuICAgIGN3ZDogb3B0aW9ucy5jd2QsXG4gICAgZm9sbG93U3ltbGlua3M6IG9wdGlvbnMuZm9sbG93U3ltbGlua3MsXG4gICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICBwZXJzaXN0ZW50OiBvcHRpb25zLnBlcnNpc3RlbnQsXG4gICAgaWdub3JlZChwYXRoLCBzdGF0cykge1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gdG9Dd2RSZWxhdGl2ZVBhdGgocGF0aCwgb3B0aW9ucy5jd2QpO1xuICAgICAgaWYgKEdpdElnbm9yZS5pc0ZpbGUocmVsYXRpdmVQYXRoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGJ1aWx0SW5JZ25vcmUocmVsYXRpdmVQYXRoKSB8fCBidWlsdEluSWdub3JlKGAke3JlbGF0aXZlUGF0aH0vYCkpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIHN0YXRzID8gIXN0YXRzLmlzRGlyZWN0b3J5KCkgOiBmYWxzZTtcbiAgICB9LFxuICB9KTtcbiAgY29uc3QgcmVsb2FkID0gKHBhdGg6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIHZvaWQgcmVhZEZpbGUocmVzb2x2ZShvcHRpb25zLmN3ZCwgcGF0aCksIFwidXRmOFwiKVxuICAgICAgLnRoZW4oKGNvbnRlbnQpID0+IHtcbiAgICAgICAgZ2l0SWdub3JlLnNldChwYXRoLCBjb250ZW50KTtcbiAgICAgICAgd2F0Y2hlci5hZGQoWy4uLndhdGNoUGF0aHNdKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiLmdpdGlnbm9yZSB1cGRhdGVkXCIsIHsgcGF0aCB9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiZmFpbGVkIHRvIHJlbG9hZCAuZ2l0aWdub3JlXCIsIHtcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9O1xuICBjb250cm9scy5vbihcImFkZFwiLCByZWxvYWQpO1xuICBjb250cm9scy5vbihcImNoYW5nZVwiLCByZWxvYWQpO1xuICBjb250cm9scy5vbihcInVubGlua1wiLCAocGF0aCkgPT4ge1xuICAgIGdpdElnbm9yZS5kZWxldGUocGF0aCk7XG4gICAgd2F0Y2hlci5hZGQoWy4uLndhdGNoUGF0aHNdKTtcbiAgICBsb2dnZXIuZGVidWcoXCIuZ2l0aWdub3JlIHJlbW92ZWRcIiwgeyBwYXRoIH0pO1xuICB9KTtcbiAgY29udHJvbHMub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHdhdGNoZXIuZW1pdChcImVycm9yXCIsIGVycm9yKSk7XG4gIGNvbnN0IGNsb3NlID0gd2F0Y2hlci5jbG9zZS5iaW5kKHdhdGNoZXIpO1xuICB3YXRjaGVyLmNsb3NlID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtjbG9zZSgpLCBjb250cm9scy5jbG9zZSgpXSk7XG4gIH07XG59XG5cbi8qKiBBbGlnbnMgY2hva2lkYXIgcGF0aHMgd2l0aCB0aGUgY3dkLXJlbGF0aXZlIGZvcm0ge0BsaW5rIGZpbmRGaWxlc30gdXNlcy4gKi9cbmZ1bmN0aW9uIHRvQ3dkUmVsYXRpdmVQYXRoKHBhdGg6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWlzQWJzb2x1dGUocGF0aCkpIHJldHVybiBwYXRoO1xuICBjb25zdCByZWwgPSByZWxhdGl2ZShjd2QsIHBhdGgpO1xuICByZXR1cm4gcmVsID09PSBcIlwiID8gXCIuXCIgOiByZWw7XG59XG5cbi8vIE1hbnVhbCBkZW1vOiBydW4gdGhpcyBmaWxlIGRpcmVjdGx5IChgYnVuIHNyYy93YXRjaC50cyBbZGlyXWApIHRvIHdhdGNoIGEgdHJlZVxuLy8gYW5kIGxvZyBldmVyeSBmaWxlIGV2ZW50IGFzIGl0IGhhcHBlbnMuIERlZmF1bHRzIHRvIHRoaXMgcGFja2FnZS5cbmlmIChpbXBvcnQubWV0YS5tYWluKSB7XG4gIGNvbnN0IGN3ZCA9IHJlc29sdmUocHJvY2Vzcy5hcmd2WzJdID8/IHJlc29sdmUoaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiKSk7XG4gIGNvbnNvbGUubG9nKFwiLS0tIFN0YXJ0aW5nIEZpbGUgV2F0Y2hlciAtLS1cIik7XG4gIGNvbnNvbGUubG9nKGBXb3JraW5nIERpcmVjdG9yeTogJHtjd2R9YCk7XG5cbiAgY29uc3Qgd2F0Y2hlciA9IGF3YWl0IHdhdGNoRmlsZXMoXCIqKi9zcmMvKipcIiwge1xuICAgIGN3ZCxcbiAgICBpZ25vcmVJbml0aWFsOiBmYWxzZSxcbiAgICBpZ25vcmU6IFtcIioqL2luZGV4LnRzXCIsIFwiKiovY29yZS8qKlwiXSxcbiAgICBpZ25vcmVPcHRpb25zOiB7XG4gICAgICB0ZW1wOiBmYWxzZSxcbiAgICB9LFxuICB9KTtcbiAgd2F0Y2hlci5vbihcImFsbFwiLCAoZXZlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc29sZS5sb2coYFske2V2ZW50LnRvVXBwZXJDYXNlKCl9XSAke3BhdGh9YCk7XG4gIH0pO1xuICB3YXRjaGVyLm9uKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcIldhdGNoZXIgZXJyb3I6XCIsIGVycm9yKTtcbiAgfSk7XG4gIGNvbnNvbGUubG9nKFwiV2F0Y2hlciBzdGFydGVkXCIpO1xufVxuIl19
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBRUgsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNuQyxPQUFPLEVBQUUsWUFBWSxFQUFjLE1BQU0sU0FBUyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBa0MsS0FBSyxFQUFrQixNQUFNLFVBQVUsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxTQUFTLEVBQXdCLE1BQU0sV0FBVyxDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQTBDLHVCQUF1QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTVGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFpQnhDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFVBQVUsQ0FDOUIsS0FBd0IsRUFDeEIsT0FBMEI7SUFFMUIsTUFBTSxVQUFVLEdBQUcsTUFBTSw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvRCxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLEdBQUcsZUFBZSxFQUFFLEdBQUcsVUFBVSxDQUFDO0lBQ25GLE1BQU0sRUFBRSxLQUFLLEVB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SyxFQUFFLENBQUMsS0FBYSxFQUFFLElBQVksRUFBRSxFQUFFO1FBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDNUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXBvc2l0b3J5LWNvbnNpc3RlbnQgZmlsZSB3YXRjaGluZyBvdmVyIENob2tpZGFyLlxuICpcbiAqIFJldXNlIGB3YXRjaEZpbGVzKClgIHdoZW4gbGl2ZSB3b3JrZmxvd3MgbXVzdCBtYXRjaCBgZmluZEZpbGVzKClgXG4gKiBkaXNjb3ZlcnkgYW5kIHRoZSBjZW50cmFsIGlnbm9yZSBjYXRhbG9ndWUuIFRoZSB3cmFwcGVyIGV4cGFuZHMgZ2xvYnMgb25jZSxcbiAqIHBydW5lcyBpZ25vcmVkIGRpcmVjdG9yaWVzIGNvbnNpc3RlbnRseSwgYW5kIHByZXNlcnZlcyBDaG9raWRhcidzIG5hdGl2ZVxuICogd2F0Y2hlciByZXN1bHQgZm9yIGNhbGxlcnMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG9uY2UgfSBmcm9tIFwibm9kZTpldmVudHNcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgdHlwZSBTdGF0cyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBpc0Fic29sdXRlLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgQ2hva2lkYXJPcHRpb25zLCBNYXRjaEZ1bmN0aW9uLCB3YXRjaCwgdHlwZSBGU1dhdGNoZXIgfSBmcm9tIFwiY2hva2lkYXJcIjtcbmltcG9ydCB7IGhhc01hZ2ljIH0gZnJvbSBcImdsb2JcIjtcbmltcG9ydCB7IGZpbmRGaWxlcywgdHlwZSBGaWxlRmluZE9wdGlvbnMgfSBmcm9tIFwiLi9maW5kLnRzXCI7XG5pbXBvcnQgeyBHaXRJZ25vcmUgfSBmcm9tIFwiLi9naXQtaWdub3JlLnRzXCI7XG5pbXBvcnQgeyBpZ25vcmVQYXRoTWF0Y2hlciB9IGZyb20gXCIuL2lnbm9yZS50c1wiO1xuaW1wb3J0IHsgcGF0aE1hdGNoVGVzdHMgfSBmcm9tIFwiLi9tYXRjaC50c1wiO1xuaW1wb3J0IHsgRmlsZVNjYW5JZ25vcmVPcHRpb25zLCBGaWxlU2Nhbk9wdGlvbnMsIEZPTExPV19TWU1MSU5LU19ERUZBVUxUIH0gZnJvbSBcIi4vc2Nhbi50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwicGF0aC93YXRjaFwiKTtcblxuLyoqIENob2tpZGFyIG9wdGlvbnMgZXh0ZW5kZWQgd2l0aCB0aGUgc2hhcmVkIGRieC10b29scyBpZ25vcmUgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVdhdGNoT3B0aW9uc1xuICBleHRlbmRzIE9taXQ8Q2hva2lkYXJPcHRpb25zLCBcImlnbm9yZWRcIj4sIE9taXQ8RmlsZVNjYW5PcHRpb25zLCBcImlnbm9yZVwiPiB7XG4gIGlnbm9yZT86IHN0cmluZyB8IHN0cmluZ1tdIHwgTWF0Y2hGdW5jdGlvbiB8IE1hdGNoRnVuY3Rpb25bXTtcbn1cblxuaW50ZXJmYWNlIE5vcm1hbGl6ZWRGaWxlV2F0Y2hPcHRpb25zIGV4dGVuZHMgT21pdDxGaWxlV2F0Y2hPcHRpb25zLCBcImlnbm9yZVwiIHwgXCJpZ25vcmVPcHRpb25zXCI+IHtcbiAgZ2l0SWdub3JlPzogR2l0SWdub3JlO1xuICBpZ25vcmVkOiBNYXRjaEZ1bmN0aW9uO1xufVxuXG5pbnRlcmZhY2UgR2l0SWdub3JlQ29udHJvbHMge1xuICBhdHRhY2god2F0Y2hlcjogRlNXYXRjaGVyLCB3YXRjaFBhdGhzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQ7XG59XG5cbi8qKlxuICogV2F0Y2hlcyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgZm9yIHJlYWwtdGltZSBjaGFuZ2VzLCBhcHBseWluZyB0aGUgc2hhcmVkXG4gKiBpZ25vcmUgZ3JvdXBzIHNvIGl0IHBydW5lcyB0aGUgc2FtZSBwYXRocyB7QGxpbmsgZmluZEZpbGVzfSBza2lwcyBmb3IgdGhlXG4gKiBzYW1lIHBhdHRlcm5zLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2F0Y2hGaWxlcyhcbiAgcGF0aHM6IHN0cmluZyB8IHN0cmluZ1tdLFxuICBvcHRpb25zPzogRmlsZVdhdGNoT3B0aW9ucyxcbik6IFByb21pc2U8RlNXYXRjaGVyPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBhd2FpdCB0b05vcm1hbGl6ZWRGaWxlV2F0Y2hPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7IGdpdElnbm9yZSwgaWdub3JlZCwgY3dkLCBmb2xsb3dTeW1saW5rcywgLi4uY2hva2lkYXJPcHRpb25zIH0gPSBub3JtYWxpemVkO1xuICBjb25zdCB7IHBhdGhzOiBsaXRlcmFscywgZ2xvYnMgfSA9IHBhcnRpdGlvblBhdGhzKHBhdGhzKTtcblxuICBsZXQgd2F0Y2hQYXRoczogc3RyaW5nW107XG4gIGlmIChnbG9icy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZGlzdGluY3RXYXRjaFBhdGhzID0gbmV3IFNldChsaXRlcmFscyk7XG4gICAgZm9yIGF3YWl0IChjb25zdCBwYXRoIG9mIGZpbmRGaWxlcyhnbG9icywgdG9GaW5kRmlsZXNPcHRpb25zKG5vcm1hbGl6ZWQpKSkge1xuICAgICAgZGlzdGluY3RXYXRjaFBhdGhzLmFkZChwYXRoKTtcbiAgICB9XG4gICAgd2F0Y2hQYXRocyA9IFsuLi5kaXN0aW5jdFdhdGNoUGF0aHNdO1xuICB9IGVsc2Uge1xuICAgIHdhdGNoUGF0aHMgPSBsaXRlcmFscztcbiAgfVxuXG4gIGNvbnN0IGNvbnRyb2xzID0gZ2l0SWdub3JlXG4gICAgPyBhd2FpdCBjcmVhdGVHaXRJZ25vcmVDb250cm9scyhnaXRJZ25vcmUsIHtcbiAgICAgICAgY3dkLFxuICAgICAgICBmb2xsb3dTeW1saW5rcyxcbiAgICAgICAgaWdub3JlT3B0aW9uczogb3B0aW9ucz8uaWdub3JlT3B0aW9ucyxcbiAgICAgICAgcGVyc2lzdGVudDogY2hva2lkYXJPcHRpb25zLnBlcnNpc3RlbnQsXG4gICAgICB9KVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCB3YXRjaGVyID0gd2F0Y2god2F0Y2hQYXRocywge1xuICAgIC4uLmNob2tpZGFyT3B0aW9ucyxcbiAgICBjd2QsXG4gICAgZm9sbG93U3ltbGlua3MsXG4gICAgaWdub3JlZCxcbiAgfSk7XG4gIGNvbnRyb2xzPy5hdHRhY2god2F0Y2hlciwgd2F0Y2hQYXRocyk7XG4gIHJldHVybiB3YXRjaGVyO1xufVxuXG5mdW5jdGlvbiBwYXJ0aXRpb25QYXRocyhwYXRoczogc3RyaW5nIHwgc3RyaW5nW10pOiB7IHBhdGhzOiBzdHJpbmdbXTsgZ2xvYnM6IHN0cmluZ1tdIH0ge1xuICBjb25zdCBnbG9iczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgbGl0ZXJhbHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcGF0aCBvZiBBcnJheS5pc0FycmF5KHBhdGhzKSA/IHBhdGhzIDogW3BhdGhzXSkge1xuICAgIChoYXNNYWdpYyhwYXRoKSA/IGdsb2JzIDogbGl0ZXJhbHMpLnB1c2gocGF0aCk7XG4gIH1cbiAgcmV0dXJuIHsgcGF0aHM6IGxpdGVyYWxzLCBnbG9icyB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB7QGxpbmsgTm9ybWFsaXplZEZpbGVXYXRjaE9wdGlvbnN9IGZpcnN0OiBhbGwgY2FsbGVyIGlnbm9yZSBpbnB1dHMgYW5kXG4gKiBidWlsdC1pbiBncm91cHMgYXJlIGNvbnNvbGlkYXRlZCBpbnRvIG9uZSBjaG9raWRhciB7QGxpbmsgTWF0Y2hGdW5jdGlvbn0uIFdoZW5cbiAqIGBzdGF0c2AgbWFya3MgYSBkaXJlY3RvcnksIHRoZSBtYXRjaGVyIGFsc28gdGVzdHMgYHBhdGggKyBcIi9cImAgZm9yIHBydW5pbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRvTm9ybWFsaXplZEZpbGVXYXRjaE9wdGlvbnMob3B0aW9ucz86IEZpbGVXYXRjaE9wdGlvbnMpOiBQcm9taXNlPFxuICBOb3JtYWxpemVkRmlsZVdhdGNoT3B0aW9ucyAmIHtcbiAgICBjd2Q6IHN0cmluZztcbiAgICBmb2xsb3dTeW1saW5rczogYm9vbGVhbjtcbiAgfVxuPiB7XG4gIGNvbnN0IHsgY3dkLCBpZ25vcmUsIGZvbGxvd1N5bWxpbmtzLCBpZ25vcmVPcHRpb25zLCAuLi5jaG9raWRhck9wdGlvbnMgfSA9IG9wdGlvbnMgPz8ge307XG4gIGNvbnN0IHJvb3QgPSBjd2QgPz8gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgZ2l0SWdub3JlID0gaWdub3JlT3B0aW9ucz8uZ2l0XG4gICAgPyBhd2FpdCBHaXRJZ25vcmUubG9hZChyb290LCB7IGlnbm9yZU9wdGlvbnMsIGZvbGxvd1N5bWxpbmtzIH0pXG4gICAgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgLi4uY2hva2lkYXJPcHRpb25zLFxuICAgIGN3ZDogcm9vdCxcbiAgICBmb2xsb3dTeW1saW5rczogZm9sbG93U3ltbGlua3MgPz8gRk9MTE9XX1NZTUxJTktTX0RFRkFVTFQsXG4gICAgLi4uKGdpdElnbm9yZSA/IHsgZ2l0SWdub3JlIH0gOiB7fSksXG4gICAgaWdub3JlZDogdG9XYXRjaE1hdGNoRnVuY3Rpb24oaWdub3JlLCBpZ25vcmVPcHRpb25zLCByb290LCBnaXRJZ25vcmUpLFxuICB9O1xufVxuXG4vKiogR2xvYiBleHBhbnNpb24gcmV1c2VzIHRoZSBub3JtYWxpemVkIGlnbm9yZSBtYXRjaGVyIGFzIGEgY3dkLXJlbGF0aXZlIHBhdGggcHJlZGljYXRlLiAqL1xuZnVuY3Rpb24gdG9GaW5kRmlsZXNPcHRpb25zKFxuICBub3JtYWxpemVkOiBOb3JtYWxpemVkRmlsZVdhdGNoT3B0aW9ucyAmIHsgY3dkOiBzdHJpbmc7IGZvbGxvd1N5bWxpbmtzOiBib29sZWFuIH0sXG4pOiBGaWxlRmluZE9wdGlvbnMge1xuICBjb25zdCB7IGlnbm9yZWQsIGN3ZCwgZm9sbG93U3ltbGlua3MgfSA9IG5vcm1hbGl6ZWQ7XG4gIHJldHVybiB7XG4gICAgY3dkLFxuICAgIGZvbGxvd1N5bWxpbmtzLFxuICAgIGlnbm9yZTogKHBhdGgpID0+IGlnbm9yZWQocGF0aCwgdW5kZWZpbmVkKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb25zb2xpZGF0ZXMgYnVpbHQtaW4gaWdub3JlIGdyb3VwcywgY2FsbGVyIGdsb2IgcGF0dGVybnMsIGFuZCBjYWxsZXJcbiAqIHtAbGluayBNYXRjaEZ1bmN0aW9ufXMgaW50byBvbmUgaWdub3JlIHRlc3QuIERpcmVjdG9yeSBwcnVuaW5nIHVzZXMgYHN0YXRzYFxuICogd2hlbiBjaG9raWRhciBzdXBwbGllcyBpdDsgZ2xvYiBleHBhbnNpb24gcGFzc2VzIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiB0b1dhdGNoTWF0Y2hGdW5jdGlvbihcbiAgaWdub3JlOiBGaWxlV2F0Y2hPcHRpb25zW1wiaWdub3JlXCJdIHwgdW5kZWZpbmVkLFxuICBpZ25vcmVPcHRpb25zOiBGaWxlU2Nhbklnbm9yZU9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIGN3ZDogc3RyaW5nLFxuICBnaXRJZ25vcmU/OiBHaXRJZ25vcmUsXG4pOiBNYXRjaEZ1bmN0aW9uIHtcbiAgY29uc3QgcGF0dGVybnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGZ1bmN0aW9uczogTWF0Y2hGdW5jdGlvbltdID0gW107XG5cbiAgaWYgKGlnbm9yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIEFycmF5LmlzQXJyYXkoaWdub3JlKSA/IGlnbm9yZSA6IFtpZ25vcmVdKSB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHBhdHRlcm5zLnB1c2goaXRlbSk7XG4gICAgICBlbHNlIGZ1bmN0aW9ucy5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIGxldCBtYXRjaGVyID0gaWdub3JlUGF0aE1hdGNoZXIoaWdub3JlT3B0aW9ucyk7XG4gIGlmIChwYXR0ZXJucy5sZW5ndGggPiAwKSBtYXRjaGVyID0gbWF0Y2hlci5vciguLi5wYXRoTWF0Y2hUZXN0cyguLi5wYXR0ZXJucykpO1xuXG4gIGNvbnN0IG1hdGNoUGF0aCA9IChwYXRoOiBzdHJpbmcsIHN0YXRzPzogU3RhdHMpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCByZWwgPSB0b0N3ZFJlbGF0aXZlUGF0aChwYXRoLCBjd2QpO1xuICAgIGdpdElnbm9yZT8ucmVmcmVzaFBhdGhTeW5jKHJlbCk7XG4gICAgaWYgKGdpdElnbm9yZT8uaWdub3JlcyhyZWwsIHN0YXRzPy5pc0RpcmVjdG9yeSgpID8/IGZhbHNlKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKG1hdGNoZXIocmVsKSkgcmV0dXJuIHRydWU7XG4gICAgZm9yIChjb25zdCBmbiBvZiBmdW5jdGlvbnMpIHtcbiAgICAgIGlmIChmbihyZWwsIHN0YXRzKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzdGF0cz8uaXNEaXJlY3RvcnkoKSkge1xuICAgICAgY29uc3QgZGlyZWN0b3J5UGF0aCA9IHJlbCArIFwiL1wiO1xuICAgICAgaWYgKG1hdGNoZXIoZGlyZWN0b3J5UGF0aCkpIHJldHVybiB0cnVlO1xuICAgICAgZm9yIChjb25zdCBmbiBvZiBmdW5jdGlvbnMpIHtcbiAgICAgICAgaWYgKGZuKGRpcmVjdG9yeVBhdGgsIHN0YXRzKSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICByZXR1cm4gbWF0Y2hQYXRoO1xufVxuXG4vKipcbiAqIFN0YXJ0IHRoZSBjb250cm9sLWZpbGUgd2F0Y2hlciBiZWZvcmUgdGhlIHByaW1hcnkgd2F0Y2hlci5cbiAqXG4gKiBXYWl0aW5nIGZvciBpdHMgaW5pdGlhbCBzY2FuIGNsb3NlcyB0aGUgZXZlbnQtbG9zcyB3aW5kb3cgd2hlcmUgYSBuZXdseVxuICogY3JlYXRlZCBgLmdpdGlnbm9yZWAgY291bGQgYmUgbWlzc2VkIHdoaWxlIHRoZSBwcmltYXJ5IHdhdGNoZXIgd2FzIGFscmVhZHlcbiAqIGFjY2VwdGluZyBmaWxlcyB1bmRlciBzdGFsZSBydWxlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlR2l0SWdub3JlQ29udHJvbHMoXG4gIGdpdElnbm9yZTogR2l0SWdub3JlLFxuICBvcHRpb25zOiB7XG4gICAgY3dkOiBzdHJpbmc7XG4gICAgZm9sbG93U3ltbGlua3M6IGJvb2xlYW47XG4gICAgaWdub3JlT3B0aW9ucz86IEZpbGVTY2FuSWdub3JlT3B0aW9ucztcbiAgICBwZXJzaXN0ZW50PzogYm9vbGVhbjtcbiAgfSxcbik6IFByb21pc2U8R2l0SWdub3JlQ29udHJvbHM+IHtcbiAgY29uc3QgYnVpbHRJbklnbm9yZSA9IGlnbm9yZVBhdGhNYXRjaGVyKG9wdGlvbnMuaWdub3JlT3B0aW9ucyk7XG4gIGNvbnN0IGNvbnRyb2xzID0gd2F0Y2goXCIuXCIsIHtcbiAgICBhdG9taWM6IGZhbHNlLFxuICAgIGN3ZDogb3B0aW9ucy5jd2QsXG4gICAgZm9sbG93U3ltbGlua3M6IG9wdGlvbnMuZm9sbG93U3ltbGlua3MsXG4gICAgLy8gSW5jbHVkZSB0aGUgaW5pdGlhbCBzY2FuIHNvIGEgY29udHJvbCBmaWxlIGNyZWF0ZWQgd2hpbGUgdGhpcyBzZWNvbmRhcnlcbiAgICAvLyB3YXRjaGVyIHN0YXJ0cyBjYW5ub3QgZmFsbCBiZXR3ZWVuIGl0cyBzY2FuIGFuZCBsaXZlIGV2ZW50IHN1YnNjcmlwdGlvbi5cbiAgICBpZ25vcmVJbml0aWFsOiBmYWxzZSxcbiAgICBwZXJzaXN0ZW50OiBvcHRpb25zLnBlcnNpc3RlbnQsXG4gICAgaWdub3JlZChwYXRoLCBzdGF0cykge1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gdG9Dd2RSZWxhdGl2ZVBhdGgocGF0aCwgb3B0aW9ucy5jd2QpO1xuICAgICAgaWYgKEdpdElnbm9yZS5pc0ZpbGUocmVsYXRpdmVQYXRoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGJ1aWx0SW5JZ25vcmUocmVsYXRpdmVQYXRoKSB8fCBidWlsdEluSWdub3JlKGAke3JlbGF0aXZlUGF0aH0vYCkpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIHN0YXRzID8gIXN0YXRzLmlzRGlyZWN0b3J5KCkgOiBmYWxzZTtcbiAgICB9LFxuICB9KTtcbiAgbGV0IHRhcmdldDogeyB3YXRjaGVyOiBGU1dhdGNoZXI7IHdhdGNoUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ7XG4gIGxldCBwZW5kaW5nRXJyb3I6IHVua25vd247XG4gIGNvbnN0IHJlZnJlc2hUYXJnZXQgPSAoKTogdm9pZCA9PiB7XG4gICAgdGFyZ2V0Py53YXRjaGVyLmFkZChbLi4udGFyZ2V0LndhdGNoUGF0aHNdKTtcbiAgfTtcbiAgY29uc3QgcmVsb2FkID0gKHBhdGg6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIHRyeSB7XG4gICAgICBnaXRJZ25vcmUuc2V0KHBhdGgsIHJlYWRGaWxlU3luYyhyZXNvbHZlKG9wdGlvbnMuY3dkLCBwYXRoKSwgXCJ1dGY4XCIpKTtcbiAgICAgIHJlZnJlc2hUYXJnZXQoKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIi5naXRpZ25vcmUgdXBkYXRlZFwiLCB7IHBhdGggfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiZmFpbGVkIHRvIHJlbG9hZCAuZ2l0aWdub3JlXCIsIHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnJvciksXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIGNvbnRyb2xzLm9uKFwiYWRkXCIsIHJlbG9hZCk7XG4gIGNvbnRyb2xzLm9uKFwiY2hhbmdlXCIsIHJlbG9hZCk7XG4gIGNvbnRyb2xzLm9uKFwidW5saW5rXCIsIChwYXRoKSA9PiB7XG4gICAgZ2l0SWdub3JlLmRlbGV0ZShwYXRoKTtcbiAgICByZWZyZXNoVGFyZ2V0KCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiLmdpdGlnbm9yZSByZW1vdmVkXCIsIHsgcGF0aCB9KTtcbiAgfSk7XG4gIGNvbnRyb2xzLm9uKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB7XG4gICAgaWYgKHRhcmdldCkgdGFyZ2V0LndhdGNoZXIuZW1pdChcImVycm9yXCIsIGVycm9yKTtcbiAgICBlbHNlIHBlbmRpbmdFcnJvciA9IGVycm9yO1xuICB9KTtcbiAgYXdhaXQgb25jZShjb250cm9scywgXCJyZWFkeVwiKTtcbiAgcmV0dXJuIHtcbiAgICBhdHRhY2god2F0Y2hlciwgd2F0Y2hQYXRocykge1xuICAgICAgdGFyZ2V0ID0geyB3YXRjaGVyLCB3YXRjaFBhdGhzIH07XG4gICAgICBpZiAocGVuZGluZ0Vycm9yKSB7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHdhdGNoZXIuZW1pdChcImVycm9yXCIsIHBlbmRpbmdFcnJvcikpO1xuICAgICAgICBwZW5kaW5nRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjb25zdCBjbG9zZSA9IHdhdGNoZXIuY2xvc2UuYmluZCh3YXRjaGVyKTtcbiAgICAgIHdhdGNoZXIuY2xvc2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtjbG9zZSgpLCBjb250cm9scy5jbG9zZSgpXSk7XG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG5cbi8qKiBBbGlnbnMgY2hva2lkYXIgcGF0aHMgd2l0aCB0aGUgY3dkLXJlbGF0aXZlIGZvcm0ge0BsaW5rIGZpbmRGaWxlc30gdXNlcy4gKi9cbmZ1bmN0aW9uIHRvQ3dkUmVsYXRpdmVQYXRoKHBhdGg6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWlzQWJzb2x1dGUocGF0aCkpIHJldHVybiBwYXRoO1xuICBjb25zdCByZWwgPSByZWxhdGl2ZShjd2QsIHBhdGgpO1xuICByZXR1cm4gcmVsID09PSBcIlwiID8gXCIuXCIgOiByZWw7XG59XG5cbi8vIE1hbnVhbCBkZW1vOiBydW4gdGhpcyBmaWxlIGRpcmVjdGx5IChgYnVuIHNyYy93YXRjaC50cyBbZGlyXWApIHRvIHdhdGNoIGEgdHJlZVxuLy8gYW5kIGxvZyBldmVyeSBmaWxlIGV2ZW50IGFzIGl0IGhhcHBlbnMuIERlZmF1bHRzIHRvIHRoaXMgcGFja2FnZS5cbmlmIChpbXBvcnQubWV0YS5tYWluKSB7XG4gIGNvbnN0IGN3ZCA9IHJlc29sdmUocHJvY2Vzcy5hcmd2WzJdID8/IHJlc29sdmUoaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiKSk7XG4gIGNvbnNvbGUubG9nKFwiLS0tIFN0YXJ0aW5nIEZpbGUgV2F0Y2hlciAtLS1cIik7XG4gIGNvbnNvbGUubG9nKGBXb3JraW5nIERpcmVjdG9yeTogJHtjd2R9YCk7XG5cbiAgY29uc3Qgd2F0Y2hlciA9IGF3YWl0IHdhdGNoRmlsZXMoXCIqKi9zcmMvKipcIiwge1xuICAgIGN3ZCxcbiAgICBpZ25vcmVJbml0aWFsOiBmYWxzZSxcbiAgICBpZ25vcmU6IFtcIioqL2luZGV4LnRzXCIsIFwiKiovY29yZS8qKlwiXSxcbiAgICBpZ25vcmVPcHRpb25zOiB7XG4gICAgICB0ZW1wOiBmYWxzZSxcbiAgICB9LFxuICB9KTtcbiAgd2F0Y2hlci5vbihcImFsbFwiLCAoZXZlbnQ6IHN0cmluZywgcGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc29sZS5sb2coYFske2V2ZW50LnRvVXBwZXJDYXNlKCl9XSAke3BhdGh9YCk7XG4gIH0pO1xuICB3YXRjaGVyLm9uKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcIldhdGNoZXIgZXJyb3I6XCIsIGVycm9yKTtcbiAgfSk7XG4gIGNvbnNvbGUubG9nKFwiV2F0Y2hlciBzdGFydGVkXCIpO1xufVxuIl19
package/package.json CHANGED
@@ -23,8 +23,8 @@
23
23
  "typescript": "^5.9.3"
24
24
  },
25
25
  "dependencies": {
26
- "@dbx-tools/core": "^0.9.129",
27
- "@dbx-tools/shared-core": "^0.9.129",
26
+ "@dbx-tools/core": "^0.9.131",
27
+ "@dbx-tools/shared-core": "^0.9.131",
28
28
  "chokidar": "^4.0.3",
29
29
  "glob": "^13.0.6",
30
30
  "ignore": "^7.0.12",
@@ -76,7 +76,7 @@
76
76
  "./package.json": "./package.json"
77
77
  }
78
78
  },
79
- "version": "0.9.129",
79
+ "version": "0.9.131",
80
80
  "types": "./lib/index.d.ts",
81
81
  "dbxToolsConfig": {
82
82
  "tags": [
package/src/git-ignore.ts CHANGED
@@ -8,7 +8,7 @@
8
8
  * @module
9
9
  */
10
10
 
11
- import { readFileSync } from "node:fs";
11
+ import { existsSync, readFileSync } from "node:fs";
12
12
  import { readFile } from "node:fs/promises";
13
13
  import { basename, dirname, isAbsolute, relative, resolve, sep } from "node:path";
14
14
  import { fileURLToPath } from "node:url";
@@ -105,6 +105,34 @@ export class GitIgnore {
105
105
  return relativePath ? this.files.get(relativePath)?.content : undefined;
106
106
  }
107
107
 
108
+ /**
109
+ * Synchronize the root and ancestor control files that can affect `path`.
110
+ *
111
+ * File watchers call this before evaluating a new filesystem event so a
112
+ * control-file event delayed by the operating system cannot admit a file
113
+ * under stale rules.
114
+ */
115
+ refreshPathSync(path: string): void {
116
+ const relativePath = this.relativePath(path);
117
+ if (!relativePath) return;
118
+ const directory = toPosix(dirname(relativePath));
119
+ const candidates = [".gitignore"];
120
+ let current = "";
121
+ for (const segment of directory === "." ? [] : directory.split("/")) {
122
+ current = current ? `${current}/${segment}` : segment;
123
+ candidates.push(`${current}/.gitignore`);
124
+ }
125
+ for (const candidate of candidates) {
126
+ const absolute = resolve(this.root, candidate);
127
+ if (!existsSync(absolute)) {
128
+ this.delete(candidate);
129
+ continue;
130
+ }
131
+ const content = readFileSync(absolute, "utf8");
132
+ if (this.get(candidate) !== content) this.set(candidate, content);
133
+ }
134
+ }
135
+
108
136
  /** Whether a path is ignored after applying parent then nested rule files. */
109
137
  ignores(path: string, directory: boolean = false): boolean {
110
138
  const relativePath = this.relativePath(path);
package/src/watch.ts CHANGED
@@ -9,8 +9,8 @@
9
9
  * @module
10
10
  */
11
11
 
12
- import { Stats } from "fs";
13
- import { readFile } from "node:fs/promises";
12
+ import { once } from "node:events";
13
+ import { readFileSync, type Stats } from "node:fs";
14
14
  import { isAbsolute, relative, resolve } from "path";
15
15
  import { errorUtils, log } from "@dbx-tools/shared-core";
16
16
  import { ChokidarOptions, MatchFunction, watch, type FSWatcher } from "chokidar";
@@ -34,6 +34,10 @@ interface NormalizedFileWatchOptions extends Omit<FileWatchOptions, "ignore" | "
34
34
  ignored: MatchFunction;
35
35
  }
36
36
 
37
+ interface GitIgnoreControls {
38
+ attach(watcher: FSWatcher, watchPaths: readonly string[]): void;
39
+ }
40
+
37
41
  /**
38
42
  * Watches files and directories for real-time changes, applying the shared
39
43
  * ignore groups so it prunes the same paths {@link findFiles} skips for the
@@ -58,20 +62,21 @@ export async function watchFiles(
58
62
  watchPaths = literals;
59
63
  }
60
64
 
65
+ const controls = gitIgnore
66
+ ? await createGitIgnoreControls(gitIgnore, {
67
+ cwd,
68
+ followSymlinks,
69
+ ignoreOptions: options?.ignoreOptions,
70
+ persistent: chokidarOptions.persistent,
71
+ })
72
+ : undefined;
61
73
  const watcher = watch(watchPaths, {
62
74
  ...chokidarOptions,
63
75
  cwd,
64
76
  followSymlinks,
65
77
  ignored,
66
78
  });
67
- if (gitIgnore) {
68
- attachGitIgnoreWatcher(watcher, gitIgnore, watchPaths, {
69
- cwd,
70
- followSymlinks,
71
- ignoreOptions: options?.ignoreOptions,
72
- persistent: chokidarOptions.persistent,
73
- });
74
- }
79
+ controls?.attach(watcher, watchPaths);
75
80
  return watcher;
76
81
  }
77
82
 
@@ -147,6 +152,7 @@ function toWatchMatchFunction(
147
152
 
148
153
  const matchPath = (path: string, stats?: Stats): boolean => {
149
154
  const rel = toCwdRelativePath(path, cwd);
155
+ gitIgnore?.refreshPathSync(rel);
150
156
  if (gitIgnore?.ignores(rel, stats?.isDirectory() ?? false)) return true;
151
157
  if (matcher(rel)) return true;
152
158
  for (const fn of functions) {
@@ -165,23 +171,30 @@ function toWatchMatchFunction(
165
171
  return matchPath;
166
172
  }
167
173
 
168
- function attachGitIgnoreWatcher(
169
- watcher: FSWatcher,
174
+ /**
175
+ * Start the control-file watcher before the primary watcher.
176
+ *
177
+ * Waiting for its initial scan closes the event-loss window where a newly
178
+ * created `.gitignore` could be missed while the primary watcher was already
179
+ * accepting files under stale rules.
180
+ */
181
+ async function createGitIgnoreControls(
170
182
  gitIgnore: GitIgnore,
171
- watchPaths: readonly string[],
172
183
  options: {
173
184
  cwd: string;
174
185
  followSymlinks: boolean;
175
186
  ignoreOptions?: FileScanIgnoreOptions;
176
187
  persistent?: boolean;
177
188
  },
178
- ): void {
189
+ ): Promise<GitIgnoreControls> {
179
190
  const builtInIgnore = ignorePathMatcher(options.ignoreOptions);
180
191
  const controls = watch(".", {
181
192
  atomic: false,
182
193
  cwd: options.cwd,
183
194
  followSymlinks: options.followSymlinks,
184
- ignoreInitial: true,
195
+ // Include the initial scan so a control file created while this secondary
196
+ // watcher starts cannot fall between its scan and live event subscription.
197
+ ignoreInitial: false,
185
198
  persistent: options.persistent,
186
199
  ignored(path, stats) {
187
200
  const relativePath = toCwdRelativePath(path, options.cwd);
@@ -190,31 +203,47 @@ function attachGitIgnoreWatcher(
190
203
  return stats ? !stats.isDirectory() : false;
191
204
  },
192
205
  });
206
+ let target: { watcher: FSWatcher; watchPaths: readonly string[] } | undefined;
207
+ let pendingError: unknown;
208
+ const refreshTarget = (): void => {
209
+ target?.watcher.add([...target.watchPaths]);
210
+ };
193
211
  const reload = (path: string): void => {
194
- void readFile(resolve(options.cwd, path), "utf8")
195
- .then((content) => {
196
- gitIgnore.set(path, content);
197
- watcher.add([...watchPaths]);
198
- logger.debug(".gitignore updated", { path });
199
- })
200
- .catch((error) => {
201
- logger.warn("failed to reload .gitignore", {
202
- path,
203
- error: errorUtils.toError(error),
204
- });
212
+ try {
213
+ gitIgnore.set(path, readFileSync(resolve(options.cwd, path), "utf8"));
214
+ refreshTarget();
215
+ logger.debug(".gitignore updated", { path });
216
+ } catch (error) {
217
+ logger.warn("failed to reload .gitignore", {
218
+ path,
219
+ error: errorUtils.toError(error),
205
220
  });
221
+ }
206
222
  };
207
223
  controls.on("add", reload);
208
224
  controls.on("change", reload);
209
225
  controls.on("unlink", (path) => {
210
226
  gitIgnore.delete(path);
211
- watcher.add([...watchPaths]);
227
+ refreshTarget();
212
228
  logger.debug(".gitignore removed", { path });
213
229
  });
214
- controls.on("error", (error) => watcher.emit("error", error));
215
- const close = watcher.close.bind(watcher);
216
- watcher.close = async () => {
217
- await Promise.all([close(), controls.close()]);
230
+ controls.on("error", (error) => {
231
+ if (target) target.watcher.emit("error", error);
232
+ else pendingError = error;
233
+ });
234
+ await once(controls, "ready");
235
+ return {
236
+ attach(watcher, watchPaths) {
237
+ target = { watcher, watchPaths };
238
+ if (pendingError) {
239
+ queueMicrotask(() => watcher.emit("error", pendingError));
240
+ pendingError = undefined;
241
+ }
242
+ const close = watcher.close.bind(watcher);
243
+ watcher.close = async () => {
244
+ await Promise.all([close(), controls.close()]);
245
+ };
246
+ },
218
247
  };
219
248
  }
220
249