@dbx-tools/path 0.9.118 → 0.9.120

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/README.md CHANGED
@@ -12,14 +12,17 @@ and documentation tooling.
12
12
  ```ts
13
13
  import { find, ignore } from "@dbx-tools/path";
14
14
 
15
- const files = find
16
- .findFiles(["packages/**/src/**/*.ts"], {
17
- ignore: ignore.ignorePatterns(),
18
- })
19
- .toArray();
15
+ for await (const file of find.findFiles(["packages/**/src/**/*.ts"], {
16
+ ignore: ignore.ignorePatterns(),
17
+ })) {
18
+ await processFile(file);
19
+ }
20
+
21
+ const files = find.findFilesSync(["packages/**/src/**/*.ts"]).toArray();
20
22
  ```
21
23
 
22
- `find.findFiles()` returns a lazy `Sequence<string>` from
24
+ `find.findFiles()` streams matches asynchronously. `find.findFilesSync()`
25
+ returns a lazy `Sequence<string>` from
23
26
  [`@dbx-tools/shared-core`](../../shared/core), so callers can map/filter without
24
27
  materializing immediately.
25
28
 
@@ -81,7 +84,7 @@ like synthesis does.
81
84
  ```ts
82
85
  import { watch } from "@dbx-tools/path";
83
86
 
84
- const watcher = watch.watchFiles(["packages/**/src/**/*.ts"], {
87
+ const watcher = await watch.watchFiles(["packages/**/src/**/*.ts"], {
85
88
  ignoreInitial: true,
86
89
  });
87
90
 
package/index.ts CHANGED
@@ -3,14 +3,17 @@
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.118";
6
+ export const PACKAGE_VERSION = "0.9.120";
7
7
  export * as find from "./src/find.ts";
8
+ export * as gitIgnore from "./src/git-ignore.ts";
8
9
  export * as ignore from "./src/ignore.ts";
9
10
  export * as match from "./src/match.ts";
10
11
  export * as pattern from "./src/pattern.ts";
11
12
  export * as scan from "./src/scan.ts";
12
13
  export * as watch from "./src/watch.ts";
13
14
  export type { FileFindOptions } from "./src/find.ts";
15
+ export { GitIgnore } from "./src/git-ignore.ts";
16
+ export type { GitIgnoreLoadOptions } from "./src/git-ignore.ts";
14
17
  export type { IgnorePatternOptions } from "./src/ignore.ts";
15
18
  export type { PathMatchPredicate, PathMatcher, PathMatchInput } from "./src/match.ts";
16
19
  export { FOLLOW_SYMLINKS_DEFAULT } from "./src/scan.ts";
package/lib/index.d.ts CHANGED
@@ -1,12 +1,15 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/path";
2
- export declare const PACKAGE_VERSION = "0.9.118";
2
+ export declare const PACKAGE_VERSION = "0.9.120";
3
3
  export * as find from "./src/find.ts";
4
+ export * as gitIgnore from "./src/git-ignore.ts";
4
5
  export * as ignore from "./src/ignore.ts";
5
6
  export * as match from "./src/match.ts";
6
7
  export * as pattern from "./src/pattern.ts";
7
8
  export * as scan from "./src/scan.ts";
8
9
  export * as watch from "./src/watch.ts";
9
10
  export type { FileFindOptions } from "./src/find.ts";
11
+ export { GitIgnore } from "./src/git-ignore.ts";
12
+ export type { GitIgnoreLoadOptions } from "./src/git-ignore.ts";
10
13
  export type { IgnorePatternOptions } from "./src/ignore.ts";
11
14
  export type { PathMatchPredicate, PathMatcher, PathMatchInput } from "./src/match.ts";
12
15
  export { FOLLOW_SYMLINKS_DEFAULT } from "./src/scan.ts";
package/lib/index.js CHANGED
@@ -2,12 +2,14 @@
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.118";
5
+ export const PACKAGE_VERSION = "0.9.120";
6
6
  export * as find from "./src/find.js";
7
+ export * as gitIgnore from "./src/git-ignore.js";
7
8
  export * as ignore from "./src/ignore.js";
8
9
  export * as match from "./src/match.js";
9
10
  export * as pattern from "./src/pattern.js";
10
11
  export * as scan from "./src/scan.js";
11
12
  export * as watch from "./src/watch.js";
13
+ export { GitIgnore } from "./src/git-ignore.js";
12
14
  export { FOLLOW_SYMLINKS_DEFAULT } from "./src/scan.js";
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFJeEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9wYXRoXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTE4XCI7XG5leHBvcnQgKiBhcyBmaW5kIGZyb20gXCIuL3NyYy9maW5kLnRzXCI7XG5leHBvcnQgKiBhcyBpZ25vcmUgZnJvbSBcIi4vc3JjL2lnbm9yZS50c1wiO1xuZXhwb3J0ICogYXMgbWF0Y2ggZnJvbSBcIi4vc3JjL21hdGNoLnRzXCI7XG5leHBvcnQgKiBhcyBwYXR0ZXJuIGZyb20gXCIuL3NyYy9wYXR0ZXJuLnRzXCI7XG5leHBvcnQgKiBhcyBzY2FuIGZyb20gXCIuL3NyYy9zY2FuLnRzXCI7XG5leHBvcnQgKiBhcyB3YXRjaCBmcm9tIFwiLi9zcmMvd2F0Y2gudHNcIjtcbmV4cG9ydCB0eXBlIHsgRmlsZUZpbmRPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2ZpbmQudHNcIjtcbmV4cG9ydCB0eXBlIHsgSWdub3JlUGF0dGVybk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvaWdub3JlLnRzXCI7XG5leHBvcnQgdHlwZSB7IFBhdGhNYXRjaFByZWRpY2F0ZSwgUGF0aE1hdGNoZXIsIFBhdGhNYXRjaElucHV0IH0gZnJvbSBcIi4vc3JjL21hdGNoLnRzXCI7XG5leHBvcnQgeyBGT0xMT1dfU1lNTElOS1NfREVGQVVMVCB9IGZyb20gXCIuL3NyYy9zY2FuLnRzXCI7XG5leHBvcnQgdHlwZSB7IEZpbGVTY2FuT3B0aW9ucywgRmlsZVNjYW5JZ25vcmVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3NjYW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgRmlsZVdhdGNoT3B0aW9ucyB9IGZyb20gXCIuL3NyYy93YXRjaC50c1wiO1xuIl19
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFJaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9wYXRoXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTIwXCI7XG5leHBvcnQgKiBhcyBmaW5kIGZyb20gXCIuL3NyYy9maW5kLnRzXCI7XG5leHBvcnQgKiBhcyBnaXRJZ25vcmUgZnJvbSBcIi4vc3JjL2dpdC1pZ25vcmUudHNcIjtcbmV4cG9ydCAqIGFzIGlnbm9yZSBmcm9tIFwiLi9zcmMvaWdub3JlLnRzXCI7XG5leHBvcnQgKiBhcyBtYXRjaCBmcm9tIFwiLi9zcmMvbWF0Y2gudHNcIjtcbmV4cG9ydCAqIGFzIHBhdHRlcm4gZnJvbSBcIi4vc3JjL3BhdHRlcm4udHNcIjtcbmV4cG9ydCAqIGFzIHNjYW4gZnJvbSBcIi4vc3JjL3NjYW4udHNcIjtcbmV4cG9ydCAqIGFzIHdhdGNoIGZyb20gXCIuL3NyYy93YXRjaC50c1wiO1xuZXhwb3J0IHR5cGUgeyBGaWxlRmluZE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZmluZC50c1wiO1xuZXhwb3J0IHsgR2l0SWdub3JlIH0gZnJvbSBcIi4vc3JjL2dpdC1pZ25vcmUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2l0SWdub3JlTG9hZE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZ2l0LWlnbm9yZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBJZ25vcmVQYXR0ZXJuT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9pZ25vcmUudHNcIjtcbmV4cG9ydCB0eXBlIHsgUGF0aE1hdGNoUHJlZGljYXRlLCBQYXRoTWF0Y2hlciwgUGF0aE1hdGNoSW5wdXQgfSBmcm9tIFwiLi9zcmMvbWF0Y2gudHNcIjtcbmV4cG9ydCB7IEZPTExPV19TWU1MSU5LU19ERUZBVUxUIH0gZnJvbSBcIi4vc3JjL3NjYW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgRmlsZVNjYW5PcHRpb25zLCBGaWxlU2Nhbklnbm9yZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc2Nhbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBGaWxlV2F0Y2hPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3dhdGNoLnRzXCI7XG4iXX0=
package/lib/src/find.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * Repository-consistent file discovery over `glob`.
3
3
  *
4
- * Reuse {@link findFiles} when package discovery, generation, cleanup, or docs
5
- * tooling must honor the same ignore catalogue and symlink defaults as watchers.
6
- * Direct `glob` calls should be reserved for behavior that intentionally differs.
4
+ * Reuse {@link findFiles} or {@link findFilesSync} when package discovery,
5
+ * generation, cleanup, or docs tooling must honor the same ignore catalogue and
6
+ * symlink defaults as watchers. Direct `glob` calls should be reserved for
7
+ * behavior that intentionally differs.
7
8
  *
8
9
  * @module
9
10
  */
@@ -12,7 +13,7 @@ import { IgnoreLike, type GlobOptionsWithFileTypesUnset } from "glob";
12
13
  import { PathMatchInput } from "./match.ts";
13
14
  import { FileScanOptions } from "./scan.ts";
14
15
  type FileFindIgnore = PathMatchInput | readonly PathMatchInput[] | IgnoreLike;
15
- /** Glob, root, ignore, and symlink options for {@link findFiles}. */
16
+ /** Glob, root, ignore, and symlink options for {@link findFiles} and {@link findFilesSync}. */
16
17
  export interface FileFindOptions extends Omit<GlobOptionsWithFileTypesUnset, "ignore" | "follow" | "dot" | "cwd" | "includeChildMatches">, Omit<FileScanOptions, "ignore" | "cwd"> {
17
18
  cwd?: string | URL;
18
19
  ignore?: FileFindIgnore;
@@ -23,5 +24,7 @@ export interface FileFindOptions extends Omit<GlobOptionsWithFileTypesUnset, "ig
23
24
  * in which case only that predicate applies). The ignore list mirrors what
24
25
  * {@link watchFiles} feeds through its matchers.
25
26
  */
26
- export declare function findFiles(pattern: string | string[], options?: FileFindOptions): Sequence<string>;
27
+ export declare function findFiles(pattern: string | string[], options?: FileFindOptions): AsyncGenerator<string>;
28
+ /** Synchronous counterpart to {@link findFiles}. */
29
+ export declare function findFilesSync(pattern: string | string[], options?: FileFindOptions): Sequence<string>;
27
30
  export {};
package/lib/src/find.js CHANGED
@@ -1,14 +1,16 @@
1
1
  /**
2
2
  * Repository-consistent file discovery over `glob`.
3
3
  *
4
- * Reuse {@link findFiles} when package discovery, generation, cleanup, or docs
5
- * tooling must honor the same ignore catalogue and symlink defaults as watchers.
6
- * Direct `glob` calls should be reserved for behavior that intentionally differs.
4
+ * Reuse {@link findFiles} or {@link findFilesSync} when package discovery,
5
+ * generation, cleanup, or docs tooling must honor the same ignore catalogue and
6
+ * symlink defaults as watchers. Direct `glob` calls should be reserved for
7
+ * behavior that intentionally differs.
7
8
  *
8
9
  * @module
9
10
  */
10
11
  import { object } from "@dbx-tools/shared-core";
11
- import { globIterateSync } from "glob";
12
+ import { globIterate, globIterateSync, } from "glob";
13
+ import { GitIgnore } from "./git-ignore.js";
12
14
  import { ignorePathMatcher } from "./ignore.js";
13
15
  import { pathMatchTests, toPathMatcher } from "./match.js";
14
16
  import { FOLLOW_SYMLINKS_DEFAULT } from "./scan.js";
@@ -18,16 +20,36 @@ import { FOLLOW_SYMLINKS_DEFAULT } from "./scan.js";
18
20
  * in which case only that predicate applies). The ignore list mirrors what
19
21
  * {@link watchFiles} feeds through its matchers.
20
22
  */
21
- export function findFiles(pattern, options) {
22
- return object.sequence(globIterateSync(pattern, toGlobOptions(options)));
23
+ export async function* findFiles(pattern, options) {
24
+ yield* globIterate(pattern, await toGlobOptions(options));
23
25
  }
24
- function toGlobOptions(options) {
26
+ /** Synchronous counterpart to {@link findFiles}. */
27
+ export function findFilesSync(pattern, options) {
28
+ return object.sequence(globIterateSync(pattern, toGlobOptionsSync(options)));
29
+ }
30
+ async function toGlobOptions(options) {
31
+ const { cwd, ignoreOptions, followSymlinks } = options ?? {};
32
+ const root = cwd ?? process.cwd();
33
+ const gitIgnore = ignoreOptions?.git
34
+ ? await GitIgnore.load(root, { ignoreOptions, followSymlinks })
35
+ : undefined;
36
+ return buildGlobOptions(options, gitIgnore);
37
+ }
38
+ function toGlobOptionsSync(options) {
39
+ const { cwd, ignoreOptions, followSymlinks } = options ?? {};
40
+ const root = cwd ?? process.cwd();
41
+ const gitIgnore = ignoreOptions?.git
42
+ ? GitIgnore.loadSync(root, { ignoreOptions, followSymlinks })
43
+ : undefined;
44
+ return buildGlobOptions(options, gitIgnore);
45
+ }
46
+ function buildGlobOptions(options, gitIgnore) {
25
47
  const { cwd, ignore, ignoreOptions, followSymlinks, ...restOptions } = options ?? {};
26
48
  return {
27
49
  ...restOptions,
28
50
  cwd: cwd ?? process.cwd(),
29
51
  follow: followSymlinks ?? FOLLOW_SYMLINKS_DEFAULT,
30
- ignore: normalizeIgnore(ignore, ignoreOptions),
52
+ ignore: normalizeIgnore(ignore, ignoreOptions, gitIgnore),
31
53
  };
32
54
  }
33
55
  const IGNORE_LIKE_FIELDS = [
@@ -49,7 +71,7 @@ function isIgnoreLike(value) {
49
71
  return false;
50
72
  }
51
73
  /**
52
- * Builds the {@link IgnoreLike} object {@link findFiles} hands to `glob`.
74
+ * Builds the {@link IgnoreLike} object file discovery hands to `glob`.
53
75
  *
54
76
  * A caller-supplied `IgnoreLike` (an object, not string/array) is consulted
55
77
  * first - its `ignored`/`childrenIgnored` win - after which the shared
@@ -58,7 +80,7 @@ function isIgnoreLike(value) {
58
80
  * many paths per directory. Caller string/array patterns are merged into the
59
81
  * matcher, and `add` forwards to both the caller object and the matcher.
60
82
  */
61
- function normalizeIgnore(ignore, ignoreOptions) {
83
+ function normalizeIgnore(ignore, ignoreOptions, gitIgnore) {
62
84
  const ignoreLike = isIgnoreLike(ignore) ? ignore : undefined;
63
85
  const ignorePathMatcherInputs = ignore === undefined || ignoreLike ? undefined : Array.isArray(ignore) ? [...ignore] : [ignore];
64
86
  const predicateOnly = ignorePathMatcherInputs?.length === 1 && typeof ignorePathMatcherInputs[0] === "function";
@@ -73,6 +95,8 @@ function normalizeIgnore(ignore, ignoreOptions) {
73
95
  if (ignoreLike?.ignored?.(path))
74
96
  return true;
75
97
  const patheRelative = path.relative();
98
+ if (gitIgnore?.ignores(patheRelative, path.isDirectory()))
99
+ return true;
76
100
  const ignore = ignoreMatcher(patheRelative);
77
101
  return ignore;
78
102
  },
@@ -81,6 +105,8 @@ function normalizeIgnore(ignore, ignoreOptions) {
81
105
  return true;
82
106
  const patheRelative = path.relative();
83
107
  if (patheRelative) {
108
+ if (gitIgnore?.ignores(patheRelative, true))
109
+ return true;
84
110
  if (ignoreMatcher(patheRelative)) {
85
111
  return true;
86
112
  }
@@ -108,10 +134,10 @@ if (import.meta.main) {
108
134
  test: true,
109
135
  },
110
136
  });
111
- for (const file of files) {
137
+ for await (const file of files) {
112
138
  console.log(file);
113
139
  }
114
140
  const elapsed = performance.now() - startTime;
115
141
  console.log(`Elapsed: ${elapsed}ms`);
116
142
  }
117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBaUIsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFrRCxNQUFNLE1BQU0sQ0FBQztBQUN2RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUErQixjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3hGLE9BQU8sRUFBMEMsdUJBQXVCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFlNUY7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLE9BQTBCLEVBQUUsT0FBeUI7SUFDN0UsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsT0FBb0M7SUFDekQsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxHQUFHLFdBQVcsRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDckYsT0FBTztRQUNMLEdBQUcsV0FBVztRQUNkLEdBQUcsRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtRQUN6QixNQUFNLEVBQUUsY0FBYyxJQUFJLHVCQUF1QjtRQUNqRCxNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUM7S0FDL0MsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLGtCQUFrQixHQUFHO0lBQ3pCLFNBQVM7SUFDVCxpQkFBaUI7SUFDakIsS0FBSztDQUMyQyxDQUFDO0FBRW5ELFNBQVMsWUFBWSxDQUFDLEtBQWM7SUFDbEMsSUFBSSxLQUFLLENB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Q0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDcEMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRWhDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUU7UUFDaEMsTUFBTSxFQUFFLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUM7UUFDbkQsYUFBYSxFQUFFO1lBQ2IsSUFBSSxFQUFFLElBQUk7U0FDWDtLQUNGLENBQUMsQ0FBQztJQUNILEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztJQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksT0FBTyxJQUFJLENBQUMsQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXBvc2l0b3J5LWNvbnNpc3RlbnQgZmlsZSBkaXNjb3Zlcnkgb3ZlciBgZ2xvYmAuXG4gKlxuICogUmV1c2Uge0BsaW5rIGZpbmRGaWxlc30gd2hlbiBwYWNrYWdlIGRpc2NvdmVyeSwgZ2VuZXJhdGlvbiwgY2xlYW51cCwgb3IgZG9jc1xuICogdG9vbGluZyBtdXN0IGhvbm9yIHRoZSBzYW1lIGlnbm9yZSBjYXRhbG9ndWUgYW5kIHN5bWxpbmsgZGVmYXVsdHMgYXMgd2F0Y2hlcnMuXG4gKiBEaXJlY3QgYGdsb2JgIGNhbGxzIHNob3VsZCBiZSByZXNlcnZlZCBmb3IgYmVoYXZpb3IgdGhhdCBpbnRlbnRpb25hbGx5IGRpZmZlcnMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG9iamVjdCwgdHlwZSBTZXF1ZW5jZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBnbG9iSXRlcmF0ZVN5bmMsIElnbm9yZUxpa2UsIHR5cGUgR2xvYk9wdGlvbnNXaXRoRmlsZVR5cGVzVW5zZXQgfSBmcm9tIFwiZ2xvYlwiO1xuaW1wb3J0IHsgaWdub3JlUGF0aE1hdGNoZXIgfSBmcm9tIFwiLi9pZ25vcmUudHNcIjtcbmltcG9ydCB7IFBhdGhNYXRjaGVyLCBQYXRoTWF0Y2hJbnB1dCwgcGF0aE1hdGNoVGVzdHMsIHRvUGF0aE1hdGNoZXIgfSBmcm9tIFwiLi9tYXRjaC50c1wiO1xuaW1wb3J0IHsgRmlsZVNjYW5JZ25vcmVPcHRpb25zLCBGaWxlU2Nhbk9wdGlvbnMsIEZPTExPV19TWU1MSU5LU19ERUZBVUxUIH0gZnJvbSBcIi4vc2Nhbi50c1wiO1xuXG50eXBlIEZpbGVGaW5kSWdub3JlID0gUGF0aE1hdGNoSW5wdXQgfCByZWFkb25seSBQYXRoTWF0Y2hJbnB1dFtdIHwgSWdub3JlTGlrZTtcblxuLyoqIEdsb2IsIHJvb3QsIGlnbm9yZSwgYW5kIHN5bWxpbmsgb3B0aW9ucyBmb3Ige0BsaW5rIGZpbmRGaWxlc30uICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVGaW5kT3B0aW9uc1xuICBleHRlbmRzXG4gICAgT21pdDxcbiAgICAgIEdsb2JPcHRpb25zV2l0aEZpbGVUeXBlc1Vuc2V0LFxuICAgICAgXCJpZ25vcmVcIiB8IFwiZm9sbG93XCIgfCBcImRvdFwiIHwgXCJjd2RcIiB8IFwiaW5jbHVkZUNoaWxkTWF0Y2hlc1wiXG4gICAgPixcbiAgICBPbWl0PEZpbGVTY2FuT3B0aW9ucywgXCJpZ25vcmVcIiB8IFwiY3dkXCI+IHtcbiAgY3dkPzogc3RyaW5nIHwgVVJMO1xuICBpZ25vcmU/OiBGaWxlRmluZElnbm9yZTtcbn1cbi8qKlxuICogUmVjdXJzaXZlbHkgbGlzdHMgZmlsZXMgbWF0Y2hpbmcgYHBhdHRlcm5gLCBpZ25vcmluZyB0aGUgc2hhcmVkIGRlZmF1bHQgZ3JvdXBzXG4gKiBwbHVzIGFueSBjYWxsZXIgYGlnbm9yZWAgcGF0dGVybnMgKHVubGVzcyBgaWdub3JlYCBpcyBhIGxvbmUgcHJlZGljYXRlIGZ1bmN0aW9uLFxuICogaW4gd2hpY2ggY2FzZSBvbmx5IHRoYXQgcHJlZGljYXRlIGFwcGxpZXMpLiBUaGUgaWdub3JlIGxpc3QgbWlycm9ycyB3aGF0XG4gKiB7QGxpbmsgd2F0Y2hGaWxlc30gZmVlZHMgdGhyb3VnaCBpdHMgbWF0Y2hlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRmlsZXMocGF0dGVybjogc3RyaW5nIHwgc3RyaW5nW10sIG9wdGlvbnM/OiBGaWxlRmluZE9wdGlvbnMpOiBTZXF1ZW5jZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG9iamVjdC5zZXF1ZW5jZShnbG9iSXRlcmF0ZVN5bmMocGF0dGVybiwgdG9HbG9iT3B0aW9ucyhvcHRpb25zKSkpO1xufVxuXG5mdW5jdGlvbiB0b0dsb2JPcHRpb25zKG9wdGlvbnM6IEZpbGVGaW5kT3B0aW9ucyB8IHVuZGVmaW5lZCk6IEdsb2JPcHRpb25zV2l0aEZpbGVUeXBlc1Vuc2V0IHtcbiAgY29uc3QgeyBjd2QsIGlnbm9yZSwgaWdub3JlT3B0aW9ucywgZm9sbG93U3ltbGlua3MsIC4uLnJlc3RPcHRpb25zIH0gPSBvcHRpb25zID8/IHt9O1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3RPcHRpb25zLFxuICAgIGN3ZDogY3dkID8/IHByb2Nlc3MuY3dkKCksXG4gICAgZm9sbG93OiBmb2xsb3dTeW1saW5rcyA/PyBGT0xMT1dfU1lNTElOS1NfREVGQVVMVCxcbiAgICBpZ25vcmU6IG5vcm1hbGl6ZUlnbm9yZShpZ25vcmUsIGlnbm9yZU9wdGlvbnMpLFxuICB9O1xufVxuXG5jb25zdCBJR05PUkVfTElLRV9GSUVMRFMgPSBbXG4gIFwiaWdub3JlZFwiLFxuICBcImNoaWxkcmVuSWdub3JlZFwiLFxuICBcImFkZFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIElnbm9yZUxpa2UpW107XG5cbmZ1bmN0aW9uIGlzSWdub3JlTGlrZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIElnbm9yZUxpa2Uge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgSUdOT1JFX0xJS0VfRklFTERTKSB7XG4gICAgICBpZiAoZmllbGQgaW4gdmFsdWUgJiYgdHlwZW9mICh2YWx1ZSBhcyBhbnkpW2ZpZWxkXSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBCdWlsZHMgdGhlIHtAbGluayBJZ25vcmVMaWtlfSBvYmplY3Qge0BsaW5rIGZpbmRGaWxlc30gaGFuZHMgdG8gYGdsb2JgLlxuICpcbiAqIEEgY2FsbGVyLXN1cHBsaWVkIGBJZ25vcmVMaWtlYCAoYW4gb2JqZWN0LCBub3Qgc3RyaW5nL2FycmF5KSBpcyBjb25zdWx0ZWRcbiAqIGZpcnN0IC0gaXRzIGBpZ25vcmVkYC9gY2hpbGRyZW5JZ25vcmVkYCB3aW4gLSBhZnRlciB3aGljaCB0aGUgc2hhcmVkXG4gKiB7QGxpbmsgaWdub3JlUGF0aE1hdGNoZXJ9ICh0aGUgc2FtZSBtYXRjaGVyIHtAbGluayB3YXRjaEZpbGVzfSB1c2VzKSBkZWNpZGVzIGJhc2VkIG9uIHRoZVxuICogcGFja2FnZS1yZWxhdGl2ZSBwYXRoLiBgY2FjaGVEaXJlY3RvcnlTdGF0c2AgaXMgZW5hYmxlZCBiZWNhdXNlIGdsb2IgcHJvYmVzXG4gKiBtYW55IHBhdGhzIHBlciBkaXJlY3RvcnkuIENhbGxlciBzdHJpbmcvYXJyYXkgcGF0dGVybnMgYXJlIG1lcmdlZCBpbnRvIHRoZVxuICogbWF0Y2hlciwgYW5kIGBhZGRgIGZvcndhcmRzIHRvIGJvdGggdGhlIGNhbGxlciBvYmplY3QgYW5kIHRoZSBtYXRjaGVyLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVJZ25vcmUoXG4gIGlnbm9yZTogRmlsZUZpbmRJZ25vcmUgfCB1bmRlZmluZWQsXG4gIGlnbm9yZU9wdGlvbnM6IEZpbGVTY2FuSWdub3JlT3B0aW9ucyB8IHVuZGVmaW5lZCxcbik6IElnbm9yZUxpa2Uge1xuICBjb25zdCBpZ25vcmVMaWtlOiBJZ25vcmVMaWtlIHwgdW5kZWZpbmVkID0gaXNJZ25vcmVMaWtlKGlnbm9yZSkgPyBpZ25vcmUgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGlnbm9yZVBhdGhNYXRjaGVySW5wdXRzOiBQYXRoTWF0Y2hJbnB1dFtdIHwgdW5kZWZpbmVkID1cbiAgICBpZ25vcmUgPT09IHVuZGVmaW5lZCB8fCBpZ25vcmVMaWtlID8gdW5kZWZpbmVkIDogQXJyYXkuaXNBcnJheShpZ25vcmUpID8gWy4uLmlnbm9yZV0gOiBbaWdub3JlXTtcblxuICBjb25zdCBwcmVkaWNhdGVPbmx5ID1cbiAgICBpZ25vcmVQYXRoTWF0Y2hlcklucHV0cz8ubGVuZ3RoID09PSAxICYmIHR5cGVvZiBpZ25vcmVQYXRoTWF0Y2hlcklucHV0c1swXSA9PT0gXCJmdW5jdGlvblwiO1xuXG4gIGxldCBpZ25vcmVNYXRjaGVyOiBQYXRoTWF0Y2hlciA9IHByZWRpY2F0ZU9ubHlcbiAgICA/IHRvUGF0aE1hdGNoZXIoaWdub3JlUGF0aE1hdGNoZXJJbnB1dHNbMF0pXG4gICAgOiBpZ25vcmVQYXRoTWF0Y2hlcihpZ25vcmVPcHRpb25zKTtcbiAgaWYgKGlnbm9yZVBhdGhNYXRjaGVySW5wdXRzICYmICFwcmVkaWNhdGVPbmx5KSB7XG4gICAgaWdub3JlTWF0Y2hlciA9IGlnbm9yZU1hdGNoZXIub3IoLi4ucGF0aE1hdGNoVGVzdHMoLi4uaWdub3JlUGF0aE1hdGNoZXJJbnB1dHMpKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGlnbm9yZWQocGF0aCkge1xuICAgICAgaWYgKGlnbm9yZUxpa2U/Lmlnbm9yZWQ/LihwYXRoKSkgcmV0dXJuIHRydWU7XG4gICAgICBjb25zdCBwYXRoZVJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZSgpO1xuICAgICAgY29uc3QgaWdub3JlID0gaWdub3JlTWF0Y2hlcihwYXRoZVJlbGF0aXZlKTtcbiAgICAgIHJldHVybiBpZ25vcmU7XG4gICAgfSxcbiAgICBjaGlsZHJlbklnbm9yZWQocGF0aCkge1xuICAgICAgaWYgKGlnbm9yZUxpa2U/LmNoaWxkcmVuSWdub3JlZD8uKHBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGNvbnN0IHBhdGhlUmVsYXRpdmUgPSBwYXRoLnJlbGF0aXZlKCk7XG4gICAgICBpZiAocGF0aGVSZWxhdGl2ZSkge1xuICAgICAgICBpZiAoaWdub3JlTWF0Y2hlcihwYXRoZVJlbGF0aXZlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGlnbm9yZU1hdGNoZXIocGF0aGVSZWxhdGl2ZSArIFwiL1wiKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBhZGQoaWdub3JlKSB7XG4gICAgICBpZ25vcmVMaWtlPy5hZGQ/LihpZ25vcmUpO1xuICAgICAgaWdub3JlTWF0Y2hlciA9IGlnbm9yZU1hdGNoZXIub3IoLi4ucGF0aE1hdGNoVGVzdHMoaWdub3JlKSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gTWFudWFsIGRlbW86IHJ1biB0aGlzIGZpbGUgZGlyZWN0bHkgKGBidW4gc3JjL2ZpbmQudHNgKSB0byBwcmludCB0aGVcbi8vIGZpbGVzIGZpbmRGaWxlcyBrZWVwcyBmb3IgdGhpcyBwYWNrYWdlIHVuZGVyIHRoZSBnaXZlbiBpZ25vcmUgb3B0aW9ucy5cbmlmIChpbXBvcnQubWV0YS5tYWluKSB7XG4gIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zb2xlLmxvZyhgU2Nhbm5pbmc6ICR7Y3dkfWApO1xuXG4gIGNvbnN0IGZpbGVzID0gZmluZEZpbGVzKFwiKiovKi4qXCIsIHtcbiAgICBpZ25vcmU6IFtcIioqL2luZGV4LnRzXCIsIFwiKiovZXhhbXBsZS8qKlwiLCBcIioqLyoubWRcIl0sXG4gICAgaWdub3JlT3B0aW9uczoge1xuICAgICAgdGVzdDogdHJ1ZSxcbiAgICB9LFxuICB9KTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc29sZS5sb2coZmlsZSk7XG4gIH1cbiAgY29uc3QgZWxhcHNlZCA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuICBjb25zb2xlLmxvZyhgRWxhcHNlZDogJHtlbGFwc2VkfW1zYCk7XG59XG4iXX0=
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQWlCLE1BQU0sd0JBQXdCLENBQUM7QUFDL0QsT0FBTyxFQUNMLFdBQVcsRUFDWCxlQUFlLEdBR2hCLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRCxPQUFPLEVBQStCLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDeEYsT0FBTyxFQUEwQyx1QkFBdUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQWU1Rjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FDOUIsT0FBMEIsRUFDMUIsT0FBeUI7SUFFekIsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxvREFBb0Q7QUFDcEQsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsT0FBMEIsRUFDMUIsT0FBeUI7SUFFekIsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFFRCxLQUFLLFVBQVUsYUFBYSxDQUMxQixPQUFvQztJQUVwQyxNQUFNLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0lBQzdELE1BQU0sSUFBSSxHQUFHLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbEMsTUFBTSxTQUFTLEdBQUcsYUFB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O1FBQ2YsQ0FBQztRQUNELEdBQUcsQ0FBQyxNQUFNO1lBQ1IsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFCLGFBQWEsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsdUVBQXVFO0FBQ3ZFLHlFQUF5RTtBQUN6RSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckIsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUVoQyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQ2hDLE1BQU0sRUFBRSxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsU0FBUyxDQUFDO1FBQ25ELGFBQWEsRUFBRTtZQUNiLElBQUksRUFBRSxJQUFJO1NBQ1g7S0FDRixDQUFDLENBQUM7SUFDSCxJQUFJLEtBQUssRUFBRSxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBQzlDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxPQUFPLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlcG9zaXRvcnktY29uc2lzdGVudCBmaWxlIGRpc2NvdmVyeSBvdmVyIGBnbG9iYC5cbiAqXG4gKiBSZXVzZSB7QGxpbmsgZmluZEZpbGVzfSBvciB7QGxpbmsgZmluZEZpbGVzU3luY30gd2hlbiBwYWNrYWdlIGRpc2NvdmVyeSxcbiAqIGdlbmVyYXRpb24sIGNsZWFudXAsIG9yIGRvY3MgdG9vbGluZyBtdXN0IGhvbm9yIHRoZSBzYW1lIGlnbm9yZSBjYXRhbG9ndWUgYW5kXG4gKiBzeW1saW5rIGRlZmF1bHRzIGFzIHdhdGNoZXJzLiBEaXJlY3QgYGdsb2JgIGNhbGxzIHNob3VsZCBiZSByZXNlcnZlZCBmb3JcbiAqIGJlaGF2aW9yIHRoYXQgaW50ZW50aW9uYWxseSBkaWZmZXJzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBvYmplY3QsIHR5cGUgU2VxdWVuY2UgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgZ2xvYkl0ZXJhdGUsXG4gIGdsb2JJdGVyYXRlU3luYyxcbiAgSWdub3JlTGlrZSxcbiAgdHlwZSBHbG9iT3B0aW9uc1dpdGhGaWxlVHlwZXNVbnNldCxcbn0gZnJvbSBcImdsb2JcIjtcbmltcG9ydCB7IEdpdElnbm9yZSB9IGZyb20gXCIuL2dpdC1pZ25vcmUudHNcIjtcbmltcG9ydCB7IGlnbm9yZVBhdGhNYXRjaGVyIH0gZnJvbSBcIi4vaWdub3JlLnRzXCI7XG5pbXBvcnQgeyBQYXRoTWF0Y2hlciwgUGF0aE1hdGNoSW5wdXQsIHBhdGhNYXRjaFRlc3RzLCB0b1BhdGhNYXRjaGVyIH0gZnJvbSBcIi4vbWF0Y2gudHNcIjtcbmltcG9ydCB7IEZpbGVTY2FuSWdub3JlT3B0aW9ucywgRmlsZVNjYW5PcHRpb25zLCBGT0xMT1dfU1lNTElOS1NfREVGQVVMVCB9IGZyb20gXCIuL3NjYW4udHNcIjtcblxudHlwZSBGaWxlRmluZElnbm9yZSA9IFBhdGhNYXRjaElucHV0IHwgcmVhZG9ubHkgUGF0aE1hdGNoSW5wdXRbXSB8IElnbm9yZUxpa2U7XG5cbi8qKiBHbG9iLCByb290LCBpZ25vcmUsIGFuZCBzeW1saW5rIG9wdGlvbnMgZm9yIHtAbGluayBmaW5kRmlsZXN9IGFuZCB7QGxpbmsgZmluZEZpbGVzU3luY30uICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVGaW5kT3B0aW9uc1xuICBleHRlbmRzXG4gICAgT21pdDxcbiAgICAgIEdsb2JPcHRpb25zV2l0aEZpbGVUeXBlc1Vuc2V0LFxuICAgICAgXCJpZ25vcmVcIiB8IFwiZm9sbG93XCIgfCBcImRvdFwiIHwgXCJjd2RcIiB8IFwiaW5jbHVkZUNoaWxkTWF0Y2hlc1wiXG4gICAgPixcbiAgICBPbWl0PEZpbGVTY2FuT3B0aW9ucywgXCJpZ25vcmVcIiB8IFwiY3dkXCI+IHtcbiAgY3dkPzogc3RyaW5nIHwgVVJMO1xuICBpZ25vcmU/OiBGaWxlRmluZElnbm9yZTtcbn1cbi8qKlxuICogUmVjdXJzaXZlbHkgbGlzdHMgZmlsZXMgbWF0Y2hpbmcgYHBhdHRlcm5gLCBpZ25vcmluZyB0aGUgc2hhcmVkIGRlZmF1bHQgZ3JvdXBzXG4gKiBwbHVzIGFueSBjYWxsZXIgYGlnbm9yZWAgcGF0dGVybnMgKHVubGVzcyBgaWdub3JlYCBpcyBhIGxvbmUgcHJlZGljYXRlIGZ1bmN0aW9uLFxuICogaW4gd2hpY2ggY2FzZSBvbmx5IHRoYXQgcHJlZGljYXRlIGFwcGxpZXMpLiBUaGUgaWdub3JlIGxpc3QgbWlycm9ycyB3aGF0XG4gKiB7QGxpbmsgd2F0Y2hGaWxlc30gZmVlZHMgdGhyb3VnaCBpdHMgbWF0Y2hlcnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiogZmluZEZpbGVzKFxuICBwYXR0ZXJuOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IEZpbGVGaW5kT3B0aW9ucyxcbik6IEFzeW5jR2VuZXJhdG9yPHN0cmluZz4ge1xuICB5aWVsZCogZ2xvYkl0ZXJhdGUocGF0dGVybiwgYXdhaXQgdG9HbG9iT3B0aW9ucyhvcHRpb25zKSk7XG59XG5cbi8qKiBTeW5jaHJvbm91cyBjb3VudGVycGFydCB0byB7QGxpbmsgZmluZEZpbGVzfS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRmlsZXNTeW5jKFxuICBwYXR0ZXJuOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IEZpbGVGaW5kT3B0aW9ucyxcbik6IFNlcXVlbmNlPHN0cmluZz4ge1xuICByZXR1cm4gb2JqZWN0LnNlcXVlbmNlKGdsb2JJdGVyYXRlU3luYyhwYXR0ZXJuLCB0b0dsb2JPcHRpb25zU3luYyhvcHRpb25zKSkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0b0dsb2JPcHRpb25zKFxuICBvcHRpb25zOiBGaWxlRmluZE9wdGlvbnMgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPEdsb2JPcHRpb25zV2l0aEZpbGVUeXBlc1Vuc2V0PiB7XG4gIGNvbnN0IHsgY3dkLCBpZ25vcmVPcHRpb25zLCBmb2xsb3dTeW1saW5rcyB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgY29uc3Qgcm9vdCA9IGN3ZCA/PyBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCBnaXRJZ25vcmUgPSBpZ25vcmVPcHRpb25zPy5naXRcbiAgICA/IGF3YWl0IEdpdElnbm9yZS5sb2FkKHJvb3QsIHsgaWdub3JlT3B0aW9ucywgZm9sbG93U3ltbGlua3MgfSlcbiAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGJ1aWxkR2xvYk9wdGlvbnMob3B0aW9ucywgZ2l0SWdub3JlKTtcbn1cblxuZnVuY3Rpb24gdG9HbG9iT3B0aW9uc1N5bmMob3B0aW9uczogRmlsZUZpbmRPcHRpb25zIHwgdW5kZWZpbmVkKTogR2xvYk9wdGlvbnNXaXRoRmlsZVR5cGVzVW5zZXQge1xuICBjb25zdCB7IGN3ZCwgaWdub3JlT3B0aW9ucywgZm9sbG93U3ltbGlua3MgfSA9IG9wdGlvbnMgPz8ge307XG4gIGNvbnN0IHJvb3QgPSBjd2QgPz8gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgZ2l0SWdub3JlID0gaWdub3JlT3B0aW9ucz8uZ2l0XG4gICAgPyBHaXRJZ25vcmUubG9hZFN5bmMocm9vdCwgeyBpZ25vcmVPcHRpb25zLCBmb2xsb3dTeW1saW5rcyB9KVxuICAgIDogdW5kZWZpbmVkO1xuICByZXR1cm4gYnVpbGRHbG9iT3B0aW9ucyhvcHRpb25zLCBnaXRJZ25vcmUpO1xufVxuXG5mdW5jdGlvbiBidWlsZEdsb2JPcHRpb25zKFxuICBvcHRpb25zOiBGaWxlRmluZE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIGdpdElnbm9yZTogR2l0SWdub3JlIHwgdW5kZWZpbmVkLFxuKTogR2xvYk9wdGlvbnNXaXRoRmlsZVR5cGVzVW5zZXQge1xuICBjb25zdCB7IGN3ZCwgaWdub3JlLCBpZ25vcmVPcHRpb25zLCBmb2xsb3dTeW1saW5rcywgLi4ucmVzdE9wdGlvbnMgfSA9IG9wdGlvbnMgPz8ge307XG4gIHJldHVybiB7XG4gICAgLi4ucmVzdE9wdGlvbnMsXG4gICAgY3dkOiBjd2QgPz8gcHJvY2Vzcy5jd2QoKSxcbiAgICBmb2xsb3c6IGZvbGxvd1N5bWxpbmtzID8/IEZPTExPV19TWU1MSU5LU19ERUZBVUxULFxuICAgIGlnbm9yZTogbm9ybWFsaXplSWdub3JlKGlnbm9yZSwgaWdub3JlT3B0aW9ucywgZ2l0SWdub3JlKSxcbiAgfTtcbn1cblxuY29uc3QgSUdOT1JFX0xJS0VfRklFTERTID0gW1xuICBcImlnbm9yZWRcIixcbiAgXCJjaGlsZHJlbklnbm9yZWRcIixcbiAgXCJhZGRcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBJZ25vcmVMaWtlKVtdO1xuXG5mdW5jdGlvbiBpc0lnbm9yZUxpa2UodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBJZ25vcmVMaWtlIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIElHTk9SRV9MSUtFX0ZJRUxEUykge1xuICAgICAgaWYgKGZpZWxkIGluIHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KVtmaWVsZF0gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogQnVpbGRzIHRoZSB7QGxpbmsgSWdub3JlTGlrZX0gb2JqZWN0IGZpbGUgZGlzY292ZXJ5IGhhbmRzIHRvIGBnbG9iYC5cbiAqXG4gKiBBIGNhbGxlci1zdXBwbGllZCBgSWdub3JlTGlrZWAgKGFuIG9iamVjdCwgbm90IHN0cmluZy9hcnJheSkgaXMgY29uc3VsdGVkXG4gKiBmaXJzdCAtIGl0cyBgaWdub3JlZGAvYGNoaWxkcmVuSWdub3JlZGAgd2luIC0gYWZ0ZXIgd2hpY2ggdGhlIHNoYXJlZFxuICoge0BsaW5rIGlnbm9yZVBhdGhNYXRjaGVyfSAodGhlIHNhbWUgbWF0Y2hlciB7QGxpbmsgd2F0Y2hGaWxlc30gdXNlcykgZGVjaWRlcyBiYXNlZCBvbiB0aGVcbiAqIHBhY2thZ2UtcmVsYXRpdmUgcGF0aC4gYGNhY2hlRGlyZWN0b3J5U3RhdHNgIGlzIGVuYWJsZWQgYmVjYXVzZSBnbG9iIHByb2Jlc1xuICogbWFueSBwYXRocyBwZXIgZGlyZWN0b3J5LiBDYWxsZXIgc3RyaW5nL2FycmF5IHBhdHRlcm5zIGFyZSBtZXJnZWQgaW50byB0aGVcbiAqIG1hdGNoZXIsIGFuZCBgYWRkYCBmb3J3YXJkcyB0byBib3RoIHRoZSBjYWxsZXIgb2JqZWN0IGFuZCB0aGUgbWF0Y2hlci5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplSWdub3JlKFxuICBpZ25vcmU6IEZpbGVGaW5kSWdub3JlIHwgdW5kZWZpbmVkLFxuICBpZ25vcmVPcHRpb25zOiBGaWxlU2Nhbklnbm9yZU9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIGdpdElnbm9yZTogR2l0SWdub3JlIHwgdW5kZWZpbmVkLFxuKTogSWdub3JlTGlrZSB7XG4gIGNvbnN0IGlnbm9yZUxpa2U6IElnbm9yZUxpa2UgfCB1bmRlZmluZWQgPSBpc0lnbm9yZUxpa2UoaWdub3JlKSA/IGlnbm9yZSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgaWdub3JlUGF0aE1hdGNoZXJJbnB1dHM6IFBhdGhNYXRjaElucHV0W10gfCB1bmRlZmluZWQgPVxuICAgIGlnbm9yZSA9PT0gdW5kZWZpbmVkIHx8IGlnbm9yZUxpa2UgPyB1bmRlZmluZWQgOiBBcnJheS5pc0FycmF5KGlnbm9yZSkgPyBbLi4uaWdub3JlXSA6IFtpZ25vcmVdO1xuXG4gIGNvbnN0IHByZWRpY2F0ZU9ubHkgPVxuICAgIGlnbm9yZVBhdGhNYXRjaGVySW5wdXRzPy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGlnbm9yZVBhdGhNYXRjaGVySW5wdXRzWzBdID09PSBcImZ1bmN0aW9uXCI7XG5cbiAgbGV0IGlnbm9yZU1hdGNoZXI6IFBhdGhNYXRjaGVyID0gcHJlZGljYXRlT25seVxuICAgID8gdG9QYXRoTWF0Y2hlcihpZ25vcmVQYXRoTWF0Y2hlcklucHV0c1swXSlcbiAgICA6IGlnbm9yZVBhdGhNYXRjaGVyKGlnbm9yZU9wdGlvbnMpO1xuICBpZiAoaWdub3JlUGF0aE1hdGNoZXJJbnB1dHMgJiYgIXByZWRpY2F0ZU9ubHkpIHtcbiAgICBpZ25vcmVNYXRjaGVyID0gaWdub3JlTWF0Y2hlci5vciguLi5wYXRoTWF0Y2hUZXN0cyguLi5pZ25vcmVQYXRoTWF0Y2hlcklucHV0cykpO1xuICB9XG4gIHJldHVybiB7XG4gICAgaWdub3JlZChwYXRoKSB7XG4gICAgICBpZiAoaWdub3JlTGlrZT8uaWdub3JlZD8uKHBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGNvbnN0IHBhdGhlUmVsYXRpdmUgPSBwYXRoLnJlbGF0aXZlKCk7XG4gICAgICBpZiAoZ2l0SWdub3JlPy5pZ25vcmVzKHBhdGhlUmVsYXRpdmUsIHBhdGguaXNEaXJlY3RvcnkoKSkpIHJldHVybiB0cnVlO1xuICAgICAgY29uc3QgaWdub3JlID0gaWdub3JlTWF0Y2hlcihwYXRoZVJlbGF0aXZlKTtcbiAgICAgIHJldHVybiBpZ25vcmU7XG4gICAgfSxcbiAgICBjaGlsZHJlbklnbm9yZWQocGF0aCkge1xuICAgICAgaWYgKGlnbm9yZUxpa2U/LmNoaWxkcmVuSWdub3JlZD8uKHBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGNvbnN0IHBhdGhlUmVsYXRpdmUgPSBwYXRoLnJlbGF0aXZlKCk7XG4gICAgICBpZiAocGF0aGVSZWxhdGl2ZSkge1xuICAgICAgICBpZiAoZ2l0SWdub3JlPy5pZ25vcmVzKHBhdGhlUmVsYXRpdmUsIHRydWUpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGlnbm9yZU1hdGNoZXIocGF0aGVSZWxhdGl2ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChpZ25vcmVNYXRjaGVyKHBhdGhlUmVsYXRpdmUgKyBcIi9cIikpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgYWRkKGlnbm9yZSkge1xuICAgICAgaWdub3JlTGlrZT8uYWRkPy4oaWdub3JlKTtcbiAgICAgIGlnbm9yZU1hdGNoZXIgPSBpZ25vcmVNYXRjaGVyLm9yKC4uLnBhdGhNYXRjaFRlc3RzKGlnbm9yZSkpO1xuICAgIH0sXG4gIH07XG59XG5cbi8vIE1hbnVhbCBkZW1vOiBydW4gdGhpcyBmaWxlIGRpcmVjdGx5IChgYnVuIHNyYy9maW5kLnRzYCkgdG8gcHJpbnQgdGhlXG4vLyBmaWxlcyBmaW5kRmlsZXMga2VlcHMgZm9yIHRoaXMgcGFja2FnZSB1bmRlciB0aGUgZ2l2ZW4gaWdub3JlIG9wdGlvbnMuXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc29sZS5sb2coYFNjYW5uaW5nOiAke2N3ZH1gKTtcblxuICBjb25zdCBmaWxlcyA9IGZpbmRGaWxlcyhcIioqLyouKlwiLCB7XG4gICAgaWdub3JlOiBbXCIqKi9pbmRleC50c1wiLCBcIioqL2V4YW1wbGUvKipcIiwgXCIqKi8qLm1kXCJdLFxuICAgIGlnbm9yZU9wdGlvbnM6IHtcbiAgICAgIHRlc3Q6IHRydWUsXG4gICAgfSxcbiAgfSk7XG4gIGZvciBhd2FpdCAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnNvbGUubG9nKGZpbGUpO1xuICB9XG4gIGNvbnN0IGVsYXBzZWQgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgY29uc29sZS5sb2coYEVsYXBzZWQ6ICR7ZWxhcHNlZH1tc2ApO1xufVxuIl19
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Mutable, Git-compatible `.gitignore` path matching.
3
+ *
4
+ * Rule syntax is owned by the `ignore` package, whose compatibility suite
5
+ * compares behavior with `git check-ignore`. This module adds repository and
6
+ * nested-file scoping plus in-memory add, update, and removal.
7
+ *
8
+ * @module
9
+ */
10
+ import type { IgnorePatternOptions } from "./ignore.ts";
11
+ import { type PathMatcher } from "./match.ts";
12
+ /** Options used while discovering `.gitignore` files beneath a root. */
13
+ export interface GitIgnoreLoadOptions {
14
+ /** Built-in directory groups pruned while looking for ignore files. */
15
+ ignoreOptions?: IgnorePatternOptions;
16
+ /** Follow symlinked directories during discovery. Defaults to false. */
17
+ followSymlinks?: boolean;
18
+ }
19
+ /** Mutable path predicate composed from root and nested `.gitignore` files. */
20
+ export declare class GitIgnore {
21
+ readonly root: string;
22
+ /** Stable composable matcher that observes later {@link set}, {@link delete}, and {@link clear} calls. */
23
+ readonly matcher: PathMatcher;
24
+ private readonly files;
25
+ private rules;
26
+ constructor(root: string | URL);
27
+ /** Load every applicable `.gitignore` beneath {@link root}. */
28
+ static load(root: string | URL, options?: GitIgnoreLoadOptions): Promise<GitIgnore>;
29
+ /** Synchronous counterpart to {@link GitIgnore.load}. */
30
+ static loadSync(root: string | URL, options?: GitIgnoreLoadOptions): GitIgnore;
31
+ /** Whether `path` names a `.gitignore` control file. */
32
+ static isFile(path: string): boolean;
33
+ /** Add or replace one `.gitignore` file and its in-memory content. */
34
+ set(path: string, content: string): void;
35
+ /** Remove one `.gitignore` file. Returns whether it was registered. */
36
+ delete(path: string): boolean;
37
+ /** Remove every registered `.gitignore`. */
38
+ clear(): void;
39
+ /** Return the retained content for a registered `.gitignore`. */
40
+ get(path: string): string | undefined;
41
+ /** Whether a path is ignored after applying parent then nested rule files. */
42
+ ignores(path: string, directory?: boolean): boolean;
43
+ private relativePath;
44
+ private refreshRules;
45
+ }
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Mutable, Git-compatible `.gitignore` path matching.
3
+ *
4
+ * Rule syntax is owned by the `ignore` package, whose compatibility suite
5
+ * compares behavior with `git check-ignore`. This module adds repository and
6
+ * nested-file scoping plus in-memory add, update, and removal.
7
+ *
8
+ * @module
9
+ */
10
+ import { readFileSync } from "node:fs";
11
+ import { readFile } from "node:fs/promises";
12
+ import { basename, dirname, isAbsolute, relative, resolve, sep } from "node:path";
13
+ import { fileURLToPath } from "node:url";
14
+ import { glob, globSync } from "glob";
15
+ import ignore from "ignore";
16
+ import { ignorePathMatcher } from "./ignore.js";
17
+ import { toPathMatcher } from "./match.js";
18
+ /** Mutable path predicate composed from root and nested `.gitignore` files. */
19
+ export class GitIgnore {
20
+ root;
21
+ /** Stable composable matcher that observes later {@link set}, {@link delete}, and {@link clear} calls. */
22
+ matcher = toPathMatcher((path) => this.ignores(path));
23
+ files = new Map();
24
+ rules = [];
25
+ constructor(root) {
26
+ this.root = resolve(root instanceof URL ? fileURLToPath(root) : root);
27
+ }
28
+ /** Load every applicable `.gitignore` beneath {@link root}. */
29
+ static async load(root, options = {}) {
30
+ const result = new GitIgnore(root);
31
+ for (const path of await glob("**/.gitignore", discoveryOptions(result.root, options))) {
32
+ result.set(path, await readFile(resolve(result.root, path), "utf8"));
33
+ }
34
+ return result;
35
+ }
36
+ /** Synchronous counterpart to {@link GitIgnore.load}. */
37
+ static loadSync(root, options = {}) {
38
+ const result = new GitIgnore(root);
39
+ for (const path of globSync("**/.gitignore", discoveryOptions(result.root, options))) {
40
+ result.set(path, readFileSync(resolve(result.root, path), "utf8"));
41
+ }
42
+ return result;
43
+ }
44
+ /** Whether `path` names a `.gitignore` control file. */
45
+ static isFile(path) {
46
+ return basename(path) === ".gitignore";
47
+ }
48
+ /** Add or replace one `.gitignore` file and its in-memory content. */
49
+ set(path, content) {
50
+ const relativePath = this.relativePath(path);
51
+ if (!relativePath || !GitIgnore.isFile(relativePath)) {
52
+ throw new TypeError(`Git ignore path must name a .gitignore under ${this.root}: ${path}`);
53
+ }
54
+ this.files.set(relativePath, {
55
+ content,
56
+ directory: toPosix(dirname(relativePath)) === "." ? "" : toPosix(dirname(relativePath)),
57
+ matcher: ignore().add(content),
58
+ path: relativePath,
59
+ });
60
+ this.refreshRules();
61
+ }
62
+ /** Remove one `.gitignore` file. Returns whether it was registered. */
63
+ delete(path) {
64
+ const relativePath = this.relativePath(path);
65
+ if (!relativePath)
66
+ return false;
67
+ const deleted = this.files.delete(relativePath);
68
+ if (deleted)
69
+ this.refreshRules();
70
+ return deleted;
71
+ }
72
+ /** Remove every registered `.gitignore`. */
73
+ clear() {
74
+ this.files.clear();
75
+ this.rules = [];
76
+ }
77
+ /** Return the retained content for a registered `.gitignore`. */
78
+ get(path) {
79
+ const relativePath = this.relativePath(path);
80
+ return relativePath ? this.files.get(relativePath)?.content : undefined;
81
+ }
82
+ /** Whether a path is ignored after applying parent then nested rule files. */
83
+ ignores(path, directory = false) {
84
+ const relativePath = this.relativePath(path);
85
+ if (!relativePath || relativePath === ".")
86
+ return false;
87
+ let ignored = false;
88
+ for (const rules of this.rules) {
89
+ const scopedPath = pathWithin(rules.directory, relativePath);
90
+ if (scopedPath === undefined || scopedPath === "")
91
+ continue;
92
+ if (ignoredParent(rules.matcher, scopedPath))
93
+ return true;
94
+ const result = rules.matcher.test(directory ? `${trimSlash(scopedPath)}/` : scopedPath);
95
+ if (result.ignored)
96
+ ignored = true;
97
+ if (result.unignored)
98
+ ignored = false;
99
+ }
100
+ return ignored;
101
+ }
102
+ relativePath(path) {
103
+ const absolute = isAbsolute(path) ? resolve(path) : resolve(this.root, path);
104
+ const relativePath = relative(this.root, absolute);
105
+ if (relativePath === "" || relativePath === ".")
106
+ return ".";
107
+ if (relativePath === ".." || relativePath.startsWith(`..${sep}`) || isAbsolute(relativePath)) {
108
+ return undefined;
109
+ }
110
+ return toPosix(relativePath);
111
+ }
112
+ refreshRules() {
113
+ this.rules = [...this.files.values()].sort((left, right) => pathDepth(left.directory) - pathDepth(right.directory) ||
114
+ left.path.localeCompare(right.path));
115
+ }
116
+ }
117
+ function discoveryOptions(root, options) {
118
+ const matcher = ignorePathMatcher(options.ignoreOptions);
119
+ return {
120
+ cwd: root,
121
+ dot: true,
122
+ follow: options.followSymlinks ?? false,
123
+ ignore: {
124
+ ignored(path) {
125
+ const relativePath = path.relative();
126
+ return !GitIgnore.isFile(relativePath) && matcher(relativePath);
127
+ },
128
+ childrenIgnored(path) {
129
+ const relativePath = path.relative();
130
+ return matcher(relativePath) || matcher(`${relativePath}/`);
131
+ },
132
+ },
133
+ nodir: true,
134
+ };
135
+ }
136
+ function ignoredParent(matcher, path) {
137
+ const segments = trimSlash(path).split("/");
138
+ const parentCount = segments.length - 1;
139
+ for (let index = 1; index <= parentCount; index++) {
140
+ if (matcher.test(`${segments.slice(0, index).join("/")}/`).ignored)
141
+ return true;
142
+ }
143
+ return false;
144
+ }
145
+ function pathWithin(directory, path) {
146
+ if (!directory)
147
+ return path;
148
+ if (path === directory)
149
+ return "";
150
+ return path.startsWith(`${directory}/`) ? path.slice(directory.length + 1) : undefined;
151
+ }
152
+ function pathDepth(path) {
153
+ return path ? path.split("/").length : 0;
154
+ }
155
+ function trimSlash(path) {
156
+ return path.replace(/^\/+|\/+$/g, "");
157
+ }
158
+ function toPosix(path) {
159
+ return path.split(sep).join("/");
160
+ }
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0LWlnbm9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9naXQtaWdub3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQW1CLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBb0IsTUFBTSxZQUFZLENBQUM7QUFpQjdELCtFQUErRTtBQUMvRSxNQUFNLE9BQU8sU0FBUztJQUNYLElBQUksQ0FBUztJQUN0QiwwR0FBMEc7SUFDakcsT0FBTyxHQUFnQixhQUFhLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUUzRCxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFDckQsS0FBSyxHQUF1QixFQUFFLENBQUM7SUFFdkMsWUFBWSxJQUFrQjtRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsTUFBTSxD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LENBQUM7SUFDNUIsSUFBSSxJQUFJLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ2xDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3pGLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxJQUFZO0lBQzdCLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxJQUFZO0lBQzdCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFDLElBQVk7SUFDM0IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNdXRhYmxlLCBHaXQtY29tcGF0aWJsZSBgLmdpdGlnbm9yZWAgcGF0aCBtYXRjaGluZy5cbiAqXG4gKiBSdWxlIHN5bnRheCBpcyBvd25lZCBieSB0aGUgYGlnbm9yZWAgcGFja2FnZSwgd2hvc2UgY29tcGF0aWJpbGl0eSBzdWl0ZVxuICogY29tcGFyZXMgYmVoYXZpb3Igd2l0aCBgZ2l0IGNoZWNrLWlnbm9yZWAuIFRoaXMgbW9kdWxlIGFkZHMgcmVwb3NpdG9yeSBhbmRcbiAqIG5lc3RlZC1maWxlIHNjb3BpbmcgcGx1cyBpbi1tZW1vcnkgYWRkLCB1cGRhdGUsIGFuZCByZW1vdmFsLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGlzQWJzb2x1dGUsIHJlbGF0aXZlLCByZXNvbHZlLCBzZXAgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgeyBnbG9iLCBnbG9iU3luYywgdHlwZSBJZ25vcmVMaWtlIH0gZnJvbSBcImdsb2JcIjtcbmltcG9ydCBpZ25vcmUgZnJvbSBcImlnbm9yZVwiO1xuaW1wb3J0IHR5cGUgeyBJZ25vcmVQYXR0ZXJuT3B0aW9ucyB9IGZyb20gXCIuL2lnbm9yZS50c1wiO1xuaW1wb3J0IHsgaWdub3JlUGF0aE1hdGNoZXIgfSBmcm9tIFwiLi9pZ25vcmUudHNcIjtcbmltcG9ydCB7IHRvUGF0aE1hdGNoZXIsIHR5cGUgUGF0aE1hdGNoZXIgfSBmcm9tIFwiLi9tYXRjaC50c1wiO1xuXG5pbnRlcmZhY2UgR2l0SWdub3JlUnVsZVNldCB7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIG1hdGNoZXI6IFJldHVyblR5cGU8dHlwZW9mIGlnbm9yZT47XG4gIHBhdGg6IHN0cmluZztcbn1cblxuLyoqIE9wdGlvbnMgdXNlZCB3aGlsZSBkaXNjb3ZlcmluZyBgLmdpdGlnbm9yZWAgZmlsZXMgYmVuZWF0aCBhIHJvb3QuICovXG5leHBvcnQgaW50ZXJmYWNlIEdpdElnbm9yZUxvYWRPcHRpb25zIHtcbiAgLyoqIEJ1aWx0LWluIGRpcmVjdG9yeSBncm91cHMgcHJ1bmVkIHdoaWxlIGxvb2tpbmcgZm9yIGlnbm9yZSBmaWxlcy4gKi9cbiAgaWdub3JlT3B0aW9ucz86IElnbm9yZVBhdHRlcm5PcHRpb25zO1xuICAvKiogRm9sbG93IHN5bWxpbmtlZCBkaXJlY3RvcmllcyBkdXJpbmcgZGlzY292ZXJ5LiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgZm9sbG93U3ltbGlua3M/OiBib29sZWFuO1xufVxuXG4vKiogTXV0YWJsZSBwYXRoIHByZWRpY2F0ZSBjb21wb3NlZCBmcm9tIHJvb3QgYW5kIG5lc3RlZCBgLmdpdGlnbm9yZWAgZmlsZXMuICovXG5leHBvcnQgY2xhc3MgR2l0SWdub3JlIHtcbiAgcmVhZG9ubHkgcm9vdDogc3RyaW5nO1xuICAvKiogU3RhYmxlIGNvbXBvc2FibGUgbWF0Y2hlciB0aGF0IG9ic2VydmVzIGxhdGVyIHtAbGluayBzZXR9LCB7QGxpbmsgZGVsZXRlfSwgYW5kIHtAbGluayBjbGVhcn0gY2FsbHMuICovXG4gIHJlYWRvbmx5IG1hdGNoZXI6IFBhdGhNYXRjaGVyID0gdG9QYXRoTWF0Y2hlcigocGF0aCkgPT4gdGhpcy5pZ25vcmVzKHBhdGgpKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIEdpdElnbm9yZVJ1bGVTZXQ+KCk7XG4gIHByaXZhdGUgcnVsZXM6IEdpdElnbm9yZVJ1bGVTZXRbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHJvb3Q6IHN0cmluZyB8IFVSTCkge1xuICAgIHRoaXMucm9vdCA9IHJlc29sdmUocm9vdCBpbnN0YW5jZW9mIFVSTCA/IGZpbGVVUkxUb1BhdGgocm9vdCkgOiByb290KTtcbiAgfVxuXG4gIC8qKiBMb2FkIGV2ZXJ5IGFwcGxpY2FibGUgYC5naXRpZ25vcmVgIGJlbmVhdGgge0BsaW5rIHJvb3R9LiAqL1xuICBzdGF0aWMgYXN5bmMgbG9hZChcbiAgICByb290OiBzdHJpbmcgfCBVUkwsXG4gICAgb3B0aW9uczogR2l0SWdub3JlTG9hZE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxHaXRJZ25vcmU+IHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgR2l0SWdub3JlKHJvb3QpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBhd2FpdCBnbG9iKFwiKiovLmdpdGlnbm9yZVwiLCBkaXNjb3ZlcnlPcHRpb25zKHJlc3VsdC5yb290LCBvcHRpb25zKSkpIHtcbiAgICAgIHJlc3VsdC5zZXQocGF0aCwgYXdhaXQgcmVhZEZpbGUocmVzb2x2ZShyZXN1bHQucm9vdCwgcGF0aCksIFwidXRmOFwiKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogU3luY2hyb25vdXMgY291bnRlcnBhcnQgdG8ge0BsaW5rIEdpdElnbm9yZS5sb2FkfS4gKi9cbiAgc3RhdGljIGxvYWRTeW5jKHJvb3Q6IHN0cmluZyB8IFVSTCwgb3B0aW9uczogR2l0SWdub3JlTG9hZE9wdGlvbnMgPSB7fSk6IEdpdElnbm9yZSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEdpdElnbm9yZShyb290KTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZ2xvYlN5bmMoXCIqKi8uZ2l0aWdub3JlXCIsIGRpc2NvdmVyeU9wdGlvbnMocmVzdWx0LnJvb3QsIG9wdGlvbnMpKSkge1xuICAgICAgcmVzdWx0LnNldChwYXRoLCByZWFkRmlsZVN5bmMocmVzb2x2ZShyZXN1bHQucm9vdCwgcGF0aCksIFwidXRmOFwiKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogV2hldGhlciBgcGF0aGAgbmFtZXMgYSBgLmdpdGlnbm9yZWAgY29udHJvbCBmaWxlLiAqL1xuICBzdGF0aWMgaXNGaWxlKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBiYXNlbmFtZShwYXRoKSA9PT0gXCIuZ2l0aWdub3JlXCI7XG4gIH1cblxuICAvKiogQWRkIG9yIHJlcGxhY2Ugb25lIGAuZ2l0aWdub3JlYCBmaWxlIGFuZCBpdHMgaW4tbWVtb3J5IGNvbnRlbnQuICovXG4gIHNldChwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHRoaXMucmVsYXRpdmVQYXRoKHBhdGgpO1xuICAgIGlmICghcmVsYXRpdmVQYXRoIHx8ICFHaXRJZ25vcmUuaXNGaWxlKHJlbGF0aXZlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEdpdCBpZ25vcmUgcGF0aCBtdXN0IG5hbWUgYSAuZ2l0aWdub3JlIHVuZGVyICR7dGhpcy5yb290fTogJHtwYXRofWApO1xuICAgIH1cbiAgICB0aGlzLmZpbGVzLnNldChyZWxhdGl2ZVBhdGgsIHtcbiAgICAgIGNvbnRlbnQsXG4gICAgICBkaXJlY3Rvcnk6IHRvUG9zaXgoZGlybmFtZShyZWxhdGl2ZVBhdGgpKSA9PT0gXCIuXCIgPyBcIlwiIDogdG9Qb3NpeChkaXJuYW1lKHJlbGF0aXZlUGF0aCkpLFxuICAgICAgbWF0Y2hlcjogaWdub3JlKCkuYWRkKGNvbnRlbnQpLFxuICAgICAgcGF0aDogcmVsYXRpdmVQYXRoLFxuICAgIH0pO1xuICAgIHRoaXMucmVmcmVzaFJ1bGVzKCk7XG4gIH1cblxuICAvKiogUmVtb3ZlIG9uZSBgLmdpdGlnbm9yZWAgZmlsZS4gUmV0dXJucyB3aGV0aGVyIGl0IHdhcyByZWdpc3RlcmVkLiAqL1xuICBkZWxldGUocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gdGhpcy5yZWxhdGl2ZVBhdGgocGF0aCk7XG4gICAgaWYgKCFyZWxhdGl2ZVBhdGgpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy5maWxlcy5kZWxldGUocmVsYXRpdmVQYXRoKTtcbiAgICBpZiAoZGVsZXRlZCkgdGhpcy5yZWZyZXNoUnVsZXMoKTtcbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgZXZlcnkgcmVnaXN0ZXJlZCBgLmdpdGlnbm9yZWAuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsZXMuY2xlYXIoKTtcbiAgICB0aGlzLnJ1bGVzID0gW107XG4gIH1cblxuICAvKiogUmV0dXJuIHRoZSByZXRhaW5lZCBjb250ZW50IGZvciBhIHJlZ2lzdGVyZWQgYC5naXRpZ25vcmVgLiAqL1xuICBnZXQocGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSB0aGlzLnJlbGF0aXZlUGF0aChwYXRoKTtcbiAgICByZXR1cm4gcmVsYXRpdmVQYXRoID8gdGhpcy5maWxlcy5nZXQocmVsYXRpdmVQYXRoKT8uY29udGVudCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGEgcGF0aCBpcyBpZ25vcmVkIGFmdGVyIGFwcGx5aW5nIHBhcmVudCB0aGVuIG5lc3RlZCBydWxlIGZpbGVzLiAqL1xuICBpZ25vcmVzKHBhdGg6IHN0cmluZywgZGlyZWN0b3J5OiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSB0aGlzLnJlbGF0aXZlUGF0aChwYXRoKTtcbiAgICBpZiAoIXJlbGF0aXZlUGF0aCB8fCByZWxhdGl2ZVBhdGggPT09IFwiLlwiKSByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGlnbm9yZWQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHJ1bGVzIG9mIHRoaXMucnVsZXMpIHtcbiAgICAgIGNvbnN0IHNjb3BlZFBhdGggPSBwYXRoV2l0aGluKHJ1bGVzLmRpcmVjdG9yeSwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIGlmIChzY29wZWRQYXRoID09PSB1bmRlZmluZWQgfHwgc2NvcGVkUGF0aCA9PT0gXCJcIikgY29udGludWU7XG4gICAgICBpZiAoaWdub3JlZFBhcmVudChydWxlcy5tYXRjaGVyLCBzY29wZWRQYXRoKSkgcmV0dXJuIHRydWU7XG4gICAgICBjb25zdCByZXN1bHQgPSBydWxlcy5tYXRjaGVyLnRlc3QoZGlyZWN0b3J5ID8gYCR7dHJpbVNsYXNoKHNjb3BlZFBhdGgpfS9gIDogc2NvcGVkUGF0aCk7XG4gICAgICBpZiAocmVzdWx0Lmlnbm9yZWQpIGlnbm9yZWQgPSB0cnVlO1xuICAgICAgaWYgKHJlc3VsdC51bmlnbm9yZWQpIGlnbm9yZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGlnbm9yZWQ7XG4gIH1cblxuICBwcml2YXRlIHJlbGF0aXZlUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGFic29sdXRlID0gaXNBYnNvbHV0ZShwYXRoKSA/IHJlc29sdmUocGF0aCkgOiByZXNvbHZlKHRoaXMucm9vdCwgcGF0aCk7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUodGhpcy5yb290LCBhYnNvbHV0ZSk7XG4gICAgaWYgKHJlbGF0aXZlUGF0aCA9PT0gXCJcIiB8fCByZWxhdGl2ZVBhdGggPT09IFwiLlwiKSByZXR1cm4gXCIuXCI7XG4gICAgaWYgKHJlbGF0aXZlUGF0aCA9PT0gXCIuLlwiIHx8IHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKGAuLiR7c2VwfWApIHx8IGlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRvUG9zaXgocmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaFJ1bGVzKCk6IHZvaWQge1xuICAgIHRoaXMucnVsZXMgPSBbLi4udGhpcy5maWxlcy52YWx1ZXMoKV0uc29ydChcbiAgICAgIChsZWZ0LCByaWdodCkgPT5cbiAgICAgICAgcGF0aERlcHRoKGxlZnQuZGlyZWN0b3J5KSAtIHBhdGhEZXB0aChyaWdodC5kaXJlY3RvcnkpIHx8XG4gICAgICAgIGxlZnQucGF0aC5sb2NhbGVDb21wYXJlKHJpZ2h0LnBhdGgpLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzY292ZXJ5T3B0aW9ucyhcbiAgcm9vdDogc3RyaW5nLFxuICBvcHRpb25zOiBHaXRJZ25vcmVMb2FkT3B0aW9ucyxcbik6IHtcbiAgY3dkOiBzdHJpbmc7XG4gIGRvdDogdHJ1ZTtcbiAgZm9sbG93OiBib29sZWFuO1xuICBpZ25vcmU6IElnbm9yZUxpa2U7XG4gIG5vZGlyOiB0cnVlO1xufSB7XG4gIGNvbnN0IG1hdGNoZXIgPSBpZ25vcmVQYXRoTWF0Y2hlcihvcHRpb25zLmlnbm9yZU9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIGN3ZDogcm9vdCxcbiAgICBkb3Q6IHRydWUsXG4gICAgZm9sbG93OiBvcHRpb25zLmZvbGxvd1N5bWxpbmtzID8/IGZhbHNlLFxuICAgIGlnbm9yZToge1xuICAgICAgaWdub3JlZChwYXRoKSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoKTtcbiAgICAgICAgcmV0dXJuICFHaXRJZ25vcmUuaXNGaWxlKHJlbGF0aXZlUGF0aCkgJiYgbWF0Y2hlcihyZWxhdGl2ZVBhdGgpO1xuICAgICAgfSxcbiAgICAgIGNoaWxkcmVuSWdub3JlZChwYXRoKSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXIocmVsYXRpdmVQYXRoKSB8fCBtYXRjaGVyKGAke3JlbGF0aXZlUGF0aH0vYCk7XG4gICAgICB9LFxuICAgIH0sXG4gICAgbm9kaXI6IHRydWUsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGlnbm9yZWRQYXJlbnQobWF0Y2hlcjogUmV0dXJuVHlwZTx0eXBlb2YgaWdub3JlPiwgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNlZ21lbnRzID0gdHJpbVNsYXNoKHBhdGgpLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgcGFyZW50Q291bnQgPSBzZWdtZW50cy5sZW5ndGggLSAxO1xuICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDw9IHBhcmVudENvdW50OyBpbmRleCsrKSB7XG4gICAgaWYgKG1hdGNoZXIudGVzdChgJHtzZWdtZW50cy5zbGljZSgwLCBpbmRleCkuam9pbihcIi9cIil9L2ApLmlnbm9yZWQpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGF0aFdpdGhpbihkaXJlY3Rvcnk6IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFkaXJlY3RvcnkpIHJldHVybiBwYXRoO1xuICBpZiAocGF0aCA9PT0gZGlyZWN0b3J5KSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIHBhdGguc3RhcnRzV2l0aChgJHtkaXJlY3Rvcnl9L2ApID8gcGF0aC5zbGljZShkaXJlY3RvcnkubGVuZ3RoICsgMSkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBhdGhEZXB0aChwYXRoOiBzdHJpbmcpOiBudW1iZXIge1xuICByZXR1cm4gcGF0aCA/IHBhdGguc3BsaXQoXCIvXCIpLmxlbmd0aCA6IDA7XG59XG5cbmZ1bmN0aW9uIHRyaW1TbGFzaChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gdG9Qb3NpeChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5zcGxpdChzZXApLmpvaW4oXCIvXCIpO1xufVxuIl19
package/lib/src/scan.d.ts CHANGED
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * @module
9
9
  */
10
- import { IgnorePatternOptions } from "./ignore.ts";
10
+ import type { IgnorePatternOptions } from "./ignore.ts";
11
11
  import { PathMatchInput } from "./match.ts";
12
12
  /** Shared default used by file discovery and watching to avoid traversing symlinks. */
13
13
  export declare const FOLLOW_SYMLINKS_DEFAULT = false;
@@ -37,5 +37,11 @@ export interface FileScanOptions {
37
37
  */
38
38
  signal?: AbortSignal;
39
39
  }
40
- /** Options controlling the generated ignore pattern list. */
41
- export type FileScanIgnoreOptions = IgnorePatternOptions;
40
+ /** Options controlling built-in and repository `.gitignore` matching. */
41
+ export interface FileScanIgnoreOptions extends IgnorePatternOptions {
42
+ /**
43
+ * Load root and nested `.gitignore` files using Git-compatible semantics.
44
+ * Defaults to false.
45
+ */
46
+ git?: boolean;
47
+ }
package/lib/src/scan.js CHANGED
@@ -9,4 +9,4 @@
9
9
  */
10
10
  /** Shared default used by file discovery and watching to avoid traversing symlinks. */
11
11
  export const FOLLOW_SYMLINKS_DEFAULT = false;
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2FuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBS0gsdUZBQXVGO0FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hhcmVkIHNjYW4gb3B0aW9ucyB1c2VkIGJ5IGZpbGUgZGlzY292ZXJ5IGFuZCB3YXRjaGluZy5cbiAqXG4gKiBSZXVzZSB0aGVzZSB0eXBlcyBzbyBwYXRoLWJhc2VkIHV0aWxpdGllcyBhZ3JlZSBvbiByb290cywgaWdub3JlIHBvbGljeSxcbiAqIHN5bWxpbmsgYmVoYXZpb3IsIGFuZCBjYW5jZWxsYXRpb24gcmF0aGVyIHRoYW4gaW52ZW50aW5nIHBhcmFsbGVsIG9wdGlvblxuICogc2hhcGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBJZ25vcmVQYXR0ZXJuT3B0aW9ucyB9IGZyb20gXCIuL2lnbm9yZS50c1wiO1xuaW1wb3J0IHsgUGF0aE1hdGNoSW5wdXQgfSBmcm9tIFwiLi9tYXRjaC50c1wiO1xuXG4vKiogU2hhcmVkIGRlZmF1bHQgdXNlZCBieSBmaWxlIGRpc2NvdmVyeSBhbmQgd2F0Y2hpbmcgdG8gYXZvaWQgdHJhdmVyc2luZyBzeW1saW5rcy4gKi9cbmV4cG9ydCBjb25zdCBGT0xMT1dfU1lNTElOS1NfREVGQVVMVCA9IGZhbHNlO1xuXG4vKiogQ29tbW9uIHJvb3QsIGlnbm9yZSwgc3ltbGluaywgYW5kIGNhbmNlbGxhdGlvbiBzZXR0aW5ncyBmb3IgZmlsZXN5c3RlbSBzY2Fucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVNjYW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIEJhc2UgZGlyZWN0b3J5IHVzZWQgdG8gcmVzb2x2ZSByZWxhdGl2ZSBwYXRocy5cbiAgICovXG4gIGN3ZD86IHN0cmluZztcblxuICAvKipcbiAgICogSWdub3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzIG1hdGNoaW5nIHRoZXNlIHBhdHRlcm5zIG9yIHByZWRpY2F0ZXMuXG4gICAqL1xuICBpZ25vcmU/OiBQYXRoTWF0Y2hJbnB1dCB8IHJlYWRvbmx5IFBhdGhNYXRjaElucHV0W107XG4gIGlnbm9yZU9wdGlvbnM/OiBGaWxlU2Nhbklnbm9yZU9wdGlvbnM7XG4gIC8qKlxuICAgKiBGb2xsb3cgc3ltYm9saWMgbGlua3MuXG4gICAqXG4gICAqIE1hcHMgdG86XG4gICAqICAgZ2xvYjogZm9sbG93XG4gICAqICAgY2hva2lkYXI6IGZvbGxvd1N5bWxpbmtzXG4gICAqL1xuICBmb2xsb3dTeW1saW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFib3J0IGFuIGluLXByb2dyZXNzIG9wZXJhdGlvbi5cbiAgICpcbiAgICogSWdub3JlZCBieSBjaG9raWRhciBhZnRlciB0aGUgd2F0Y2hlciBoYXMgYmVlbiBjcmVhdGVkLlxuICAgKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKiBPcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBnZW5lcmF0ZWQgaWdub3JlIHBhdHRlcm4gbGlzdC4gKi9cbmV4cG9ydCB0eXBlIEZpbGVTY2FuSWdub3JlT3B0aW9ucyA9IElnbm9yZVBhdHRlcm5PcHRpb25zO1xuIl19
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2FuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBS0gsdUZBQXVGO0FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hhcmVkIHNjYW4gb3B0aW9ucyB1c2VkIGJ5IGZpbGUgZGlzY292ZXJ5IGFuZCB3YXRjaGluZy5cbiAqXG4gKiBSZXVzZSB0aGVzZSB0eXBlcyBzbyBwYXRoLWJhc2VkIHV0aWxpdGllcyBhZ3JlZSBvbiByb290cywgaWdub3JlIHBvbGljeSxcbiAqIHN5bWxpbmsgYmVoYXZpb3IsIGFuZCBjYW5jZWxsYXRpb24gcmF0aGVyIHRoYW4gaW52ZW50aW5nIHBhcmFsbGVsIG9wdGlvblxuICogc2hhcGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IElnbm9yZVBhdHRlcm5PcHRpb25zIH0gZnJvbSBcIi4vaWdub3JlLnRzXCI7XG5pbXBvcnQgeyBQYXRoTWF0Y2hJbnB1dCB9IGZyb20gXCIuL21hdGNoLnRzXCI7XG5cbi8qKiBTaGFyZWQgZGVmYXVsdCB1c2VkIGJ5IGZpbGUgZGlzY292ZXJ5IGFuZCB3YXRjaGluZyB0byBhdm9pZCB0cmF2ZXJzaW5nIHN5bWxpbmtzLiAqL1xuZXhwb3J0IGNvbnN0IEZPTExPV19TWU1MSU5LU19ERUZBVUxUID0gZmFsc2U7XG5cbi8qKiBDb21tb24gcm9vdCwgaWdub3JlLCBzeW1saW5rLCBhbmQgY2FuY2VsbGF0aW9uIHNldHRpbmdzIGZvciBmaWxlc3lzdGVtIHNjYW5zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlU2Nhbk9wdGlvbnMge1xuICAvKipcbiAgICogQmFzZSBkaXJlY3RvcnkgdXNlZCB0byByZXNvbHZlIHJlbGF0aXZlIHBhdGhzLlxuICAgKi9cbiAgY3dkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZ25vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMgbWF0Y2hpbmcgdGhlc2UgcGF0dGVybnMgb3IgcHJlZGljYXRlcy5cbiAgICovXG4gIGlnbm9yZT86IFBhdGhNYXRjaElucHV0IHwgcmVhZG9ubHkgUGF0aE1hdGNoSW5wdXRbXTtcbiAgaWdub3JlT3B0aW9ucz86IEZpbGVTY2FuSWdub3JlT3B0aW9ucztcbiAgLyoqXG4gICAqIEZvbGxvdyBzeW1ib2xpYyBsaW5rcy5cbiAgICpcbiAgICogTWFwcyB0bzpcbiAgICogICBnbG9iOiBmb2xsb3dcbiAgICogICBjaG9raWRhcjogZm9sbG93U3ltbGlua3NcbiAgICovXG4gIGZvbGxvd1N5bWxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWJvcnQgYW4gaW4tcHJvZ3Jlc3Mgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBJZ25vcmVkIGJ5IGNob2tpZGFyIGFmdGVyIHRoZSB3YXRjaGVyIGhhcyBiZWVuIGNyZWF0ZWQuXG4gICAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIE9wdGlvbnMgY29udHJvbGxpbmcgYnVpbHQtaW4gYW5kIHJlcG9zaXRvcnkgYC5naXRpZ25vcmVgIG1hdGNoaW5nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlU2Nhbklnbm9yZU9wdGlvbnMgZXh0ZW5kcyBJZ25vcmVQYXR0ZXJuT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBMb2FkIHJvb3QgYW5kIG5lc3RlZCBgLmdpdGlnbm9yZWAgZmlsZXMgdXNpbmcgR2l0LWNvbXBhdGlibGUgc2VtYW50aWNzLlxuICAgKiBEZWZhdWx0cyB0byBmYWxzZS5cbiAgICovXG4gIGdpdD86IGJvb2xlYW47XG59XG4iXX0=
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * @module
10
10
  */
11
- import { ChokidarOptions, MatchFunction } from "chokidar";
11
+ import { ChokidarOptions, MatchFunction, type FSWatcher } from "chokidar";
12
12
  import { FileScanOptions } from "./scan.ts";
13
13
  /** Chokidar options extended with the shared dbx-tools ignore configuration. */
14
14
  export interface FileWatchOptions extends Omit<ChokidarOptions, "ignored">, Omit<FileScanOptions, "ignore"> {
@@ -19,4 +19,4 @@ export interface FileWatchOptions extends Omit<ChokidarOptions, "ignored">, Omit
19
19
  * ignore groups so it prunes the same paths {@link findFiles} skips for the
20
20
  * same patterns.
21
21
  */
22
- export declare function watchFiles(paths: string | string[], options?: FileWatchOptions): import("chokidar").FSWatcher;
22
+ export declare function watchFiles(paths: string | string[], options?: FileWatchOptions): Promise<FSWatcher>;