@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 +10 -7
- package/index.ts +4 -1
- package/lib/index.d.ts +4 -1
- package/lib/index.js +4 -2
- package/lib/src/find.d.ts +8 -5
- package/lib/src/find.js +38 -12
- package/lib/src/git-ignore.d.ts +45 -0
- package/lib/src/git-ignore.js +161 -0
- package/lib/src/scan.d.ts +9 -3
- package/lib/src/scan.js +1 -1
- package/lib/src/watch.d.ts +2 -2
- package/lib/src/watch.js +75 -11
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -3
- package/src/find.ts +55 -11
- package/src/git-ignore.ts +200 -0
- package/src/scan.ts +9 -3
- package/src/watch.ts +93 -13
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
|
|
16
|
-
.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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()`
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
|
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,
|
|
5
|
-
* tooling must honor the same ignore catalogue and
|
|
6
|
-
* Direct `glob` calls should be reserved for
|
|
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):
|
|
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,
|
|
5
|
-
* tooling must honor the same ignore catalogue and
|
|
6
|
-
* Direct `glob` calls should be reserved for
|
|
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
|
-
|
|
23
|
+
export async function* findFiles(pattern, options) {
|
|
24
|
+
yield* globIterate(pattern, await toGlobOptions(options));
|
|
23
25
|
}
|
|
24
|
-
|
|
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
|
|
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
|
|
41
|
-
export
|
|
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,
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2FuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBS0gsdUZBQXVGO0FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hhcmVkIHNjYW4gb3B0aW9ucyB1c2VkIGJ5IGZpbGUgZGlzY292ZXJ5IGFuZCB3YXRjaGluZy5cbiAqXG4gKiBSZXVzZSB0aGVzZSB0eXBlcyBzbyBwYXRoLWJhc2VkIHV0aWxpdGllcyBhZ3JlZSBvbiByb290cywgaWdub3JlIHBvbGljeSxcbiAqIHN5bWxpbmsgYmVoYXZpb3IsIGFuZCBjYW5jZWxsYXRpb24gcmF0aGVyIHRoYW4gaW52ZW50aW5nIHBhcmFsbGVsIG9wdGlvblxuICogc2hhcGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IElnbm9yZVBhdHRlcm5PcHRpb25zIH0gZnJvbSBcIi4vaWdub3JlLnRzXCI7XG5pbXBvcnQgeyBQYXRoTWF0Y2hJbnB1dCB9IGZyb20gXCIuL21hdGNoLnRzXCI7XG5cbi8qKiBTaGFyZWQgZGVmYXVsdCB1c2VkIGJ5IGZpbGUgZGlzY292ZXJ5IGFuZCB3YXRjaGluZyB0byBhdm9pZCB0cmF2ZXJzaW5nIHN5bWxpbmtzLiAqL1xuZXhwb3J0IGNvbnN0IEZPTExPV19TWU1MSU5LU19ERUZBVUxUID0gZmFsc2U7XG5cbi8qKiBDb21tb24gcm9vdCwgaWdub3JlLCBzeW1saW5rLCBhbmQgY2FuY2VsbGF0aW9uIHNldHRpbmdzIGZvciBmaWxlc3lzdGVtIHNjYW5zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlU2Nhbk9wdGlvbnMge1xuICAvKipcbiAgICogQmFzZSBkaXJlY3RvcnkgdXNlZCB0byByZXNvbHZlIHJlbGF0aXZlIHBhdGhzLlxuICAgKi9cbiAgY3dkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZ25vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMgbWF0Y2hpbmcgdGhlc2UgcGF0dGVybnMgb3IgcHJlZGljYXRlcy5cbiAgICovXG4gIGlnbm9yZT86IFBhdGhNYXRjaElucHV0IHwgcmVhZG9ubHkgUGF0aE1hdGNoSW5wdXRbXTtcbiAgaWdub3JlT3B0aW9ucz86IEZpbGVTY2FuSWdub3JlT3B0aW9ucztcbiAgLyoqXG4gICAqIEZvbGxvdyBzeW1ib2xpYyBsaW5rcy5cbiAgICpcbiAgICogTWFwcyB0bzpcbiAgICogICBnbG9iOiBmb2xsb3dcbiAgICogICBjaG9raWRhcjogZm9sbG93U3ltbGlua3NcbiAgICovXG4gIGZvbGxvd1N5bWxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWJvcnQgYW4gaW4tcHJvZ3Jlc3Mgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBJZ25vcmVkIGJ5IGNob2tpZGFyIGFmdGVyIHRoZSB3YXRjaGVyIGhhcyBiZWVuIGNyZWF0ZWQuXG4gICAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIE9wdGlvbnMgY29udHJvbGxpbmcgYnVpbHQtaW4gYW5kIHJlcG9zaXRvcnkgYC5naXRpZ25vcmVgIG1hdGNoaW5nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlU2Nhbklnbm9yZU9wdGlvbnMgZXh0ZW5kcyBJZ25vcmVQYXR0ZXJuT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBMb2FkIHJvb3QgYW5kIG5lc3RlZCBgLmdpdGlnbm9yZWAgZmlsZXMgdXNpbmcgR2l0LWNvbXBhdGlibGUgc2VtYW50aWNzLlxuICAgKiBEZWZhdWx0cyB0byBmYWxzZS5cbiAgICovXG4gIGdpdD86IGJvb2xlYW47XG59XG4iXX0=
|
package/lib/src/watch.d.ts
CHANGED
|
@@ -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):
|
|
22
|
+
export declare function watchFiles(paths: string | string[], options?: FileWatchOptions): Promise<FSWatcher>;
|