@dbx-tools/path 0.3.44 → 0.4.1
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/lib/index.d.ts +17 -0
- package/lib/index.js +16 -0
- package/lib/src/find.d.ts +17 -0
- package/lib/src/find.js +108 -0
- package/lib/src/ignore.d.ts +65 -0
- package/lib/src/ignore.js +147 -0
- package/lib/src/match.d.ts +29 -0
- package/lib/src/match.js +48 -0
- package/lib/src/pattern.d.ts +23 -0
- package/lib/src/pattern.js +31 -0
- package/lib/src/scan.d.ts +30 -0
- package/lib/src/scan.js +2 -0
- package/lib/src/watch.d.ts +11 -0
- package/lib/src/watch.js +137 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +11 -7
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * as find from "./src/find.js";
|
|
2
|
+
export * as ignore from "./src/ignore.js";
|
|
3
|
+
export * as match from "./src/match.js";
|
|
4
|
+
export * as pattern from "./src/pattern.js";
|
|
5
|
+
export * as scan from "./src/scan.js";
|
|
6
|
+
export * as watch from "./src/watch.js";
|
|
7
|
+
export { findFiles } from "./src/find.js";
|
|
8
|
+
export type { FileFindOptions } from "./src/find.js";
|
|
9
|
+
export { ignorePatterns, ignorePathMatcher } from "./src/ignore.js";
|
|
10
|
+
export type { IgnorePatternOptions } from "./src/ignore.js";
|
|
11
|
+
export { pathMatchTests, toPathMatcher } from "./src/match.js";
|
|
12
|
+
export type { PathMatchPredicate, PathMatcher, PathMatchInput } from "./src/match.js";
|
|
13
|
+
export { directoryNamePattern, fileExtensionPattern } from "./src/pattern.js";
|
|
14
|
+
export { FOLLOW_SYMLINKS_DEFAULT } from "./src/scan.js";
|
|
15
|
+
export type { FileScanOptions, FileScanIgnoreOptions } from "./src/scan.js";
|
|
16
|
+
export { watchFiles } from "./src/watch.js";
|
|
17
|
+
export type { FileWatchOptions } from "./src/watch.js";
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// GENERATED by projen watch - DO NOT EDIT.
|
|
2
|
+
// Regenerated from the exporting modules in ./src.
|
|
3
|
+
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
|
+
export * as find from "./src/find.js";
|
|
5
|
+
export * as ignore from "./src/ignore.js";
|
|
6
|
+
export * as match from "./src/match.js";
|
|
7
|
+
export * as pattern from "./src/pattern.js";
|
|
8
|
+
export * as scan from "./src/scan.js";
|
|
9
|
+
export * as watch from "./src/watch.js";
|
|
10
|
+
export { findFiles } from "./src/find.js";
|
|
11
|
+
export { ignorePatterns, ignorePathMatcher } from "./src/ignore.js";
|
|
12
|
+
export { pathMatchTests, toPathMatcher } from "./src/match.js";
|
|
13
|
+
export { directoryNamePattern, fileExtensionPattern } from "./src/pattern.js";
|
|
14
|
+
export { FOLLOW_SYMLINKS_DEFAULT } from "./src/scan.js";
|
|
15
|
+
export { watchFiles } from "./src/watch.js";
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssSUFBSSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEtBQUssTUFBTSxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEtBQUssS0FBSyxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssSUFBSSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEtBQUssS0FBSyxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFNUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0ICogYXMgZmluZCBmcm9tIFwiLi9zcmMvZmluZFwiO1xuZXhwb3J0ICogYXMgaWdub3JlIGZyb20gXCIuL3NyYy9pZ25vcmVcIjtcbmV4cG9ydCAqIGFzIG1hdGNoIGZyb20gXCIuL3NyYy9tYXRjaFwiO1xuZXhwb3J0ICogYXMgcGF0dGVybiBmcm9tIFwiLi9zcmMvcGF0dGVyblwiO1xuZXhwb3J0ICogYXMgc2NhbiBmcm9tIFwiLi9zcmMvc2NhblwiO1xuZXhwb3J0ICogYXMgd2F0Y2ggZnJvbSBcIi4vc3JjL3dhdGNoXCI7XG5leHBvcnQgeyBmaW5kRmlsZXMgfSBmcm9tIFwiLi9zcmMvZmluZFwiO1xuZXhwb3J0IHR5cGUgeyBGaWxlRmluZE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZmluZFwiO1xuZXhwb3J0IHsgaWdub3JlUGF0dGVybnMsIGlnbm9yZVBhdGhNYXRjaGVyIH0gZnJvbSBcIi4vc3JjL2lnbm9yZVwiO1xuZXhwb3J0IHR5cGUgeyBJZ25vcmVQYXR0ZXJuT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9pZ25vcmVcIjtcbmV4cG9ydCB7IHBhdGhNYXRjaFRlc3RzLCB0b1BhdGhNYXRjaGVyIH0gZnJvbSBcIi4vc3JjL21hdGNoXCI7XG5leHBvcnQgdHlwZSB7IFBhdGhNYXRjaFByZWRpY2F0ZSwgUGF0aE1hdGNoZXIsIFBhdGhNYXRjaElucHV0IH0gZnJvbSBcIi4vc3JjL21hdGNoXCI7XG5leHBvcnQgeyBkaXJlY3RvcnlOYW1lUGF0dGVybiwgZmlsZUV4dGVuc2lvblBhdHRlcm4gfSBmcm9tIFwiLi9zcmMvcGF0dGVyblwiO1xuZXhwb3J0IHsgRk9MTE9XX1NZTUxJTktTX0RFRkFVTFQgfSBmcm9tIFwiLi9zcmMvc2NhblwiO1xuZXhwb3J0IHR5cGUgeyBGaWxlU2Nhbk9wdGlvbnMsIEZpbGVTY2FuSWdub3JlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zY2FuXCI7XG5leHBvcnQgeyB3YXRjaEZpbGVzIH0gZnJvbSBcIi4vc3JjL3dhdGNoXCI7XG5leHBvcnQgdHlwZSB7IEZpbGVXYXRjaE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvd2F0Y2hcIjtcbiJdfQ==
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Sequence } from "@dbx-tools/shared-core";
|
|
2
|
+
import { IgnoreLike, type GlobOptionsWithFileTypesUnset } from "glob";
|
|
3
|
+
import { PathMatchInput } from "./match.js";
|
|
4
|
+
import { FileScanOptions } from "./scan.js";
|
|
5
|
+
type FileFindIgnore = PathMatchInput | readonly PathMatchInput[] | IgnoreLike;
|
|
6
|
+
export interface FileFindOptions extends Omit<GlobOptionsWithFileTypesUnset, "ignore" | "follow" | "dot" | "cwd" | "includeChildMatches">, Omit<FileScanOptions, "ignore" | "cwd"> {
|
|
7
|
+
cwd?: string | URL;
|
|
8
|
+
ignore?: FileFindIgnore;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Recursively lists files matching `pattern`, ignoring the shared default groups
|
|
12
|
+
* plus any caller `ignore` patterns (unless `ignore` is a lone predicate function,
|
|
13
|
+
* in which case only that predicate applies). The ignore list mirrors what
|
|
14
|
+
* {@link watchFiles} feeds through its matchers.
|
|
15
|
+
*/
|
|
16
|
+
export declare function findFiles(pattern: string | string[], options?: FileFindOptions): Sequence<string>;
|
|
17
|
+
export {};
|
package/lib/src/find.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { object } from "@dbx-tools/shared-core";
|
|
2
|
+
import { globIterateSync } from "glob";
|
|
3
|
+
import { ignorePathMatcher } from "./ignore.js";
|
|
4
|
+
import { pathMatchTests, toPathMatcher } from "./match.js";
|
|
5
|
+
import { FOLLOW_SYMLINKS_DEFAULT } from "./scan.js";
|
|
6
|
+
/**
|
|
7
|
+
* Recursively lists files matching `pattern`, ignoring the shared default groups
|
|
8
|
+
* plus any caller `ignore` patterns (unless `ignore` is a lone predicate function,
|
|
9
|
+
* in which case only that predicate applies). The ignore list mirrors what
|
|
10
|
+
* {@link watchFiles} feeds through its matchers.
|
|
11
|
+
*/
|
|
12
|
+
export function findFiles(pattern, options) {
|
|
13
|
+
return object.sequence(globIterateSync(pattern, toGlobOptions(options)));
|
|
14
|
+
}
|
|
15
|
+
function toGlobOptions(options) {
|
|
16
|
+
const { cwd, ignore, ignoreOptions, followSymlinks, ...restOptions } = options ?? {};
|
|
17
|
+
return {
|
|
18
|
+
...restOptions,
|
|
19
|
+
cwd: cwd ?? process.cwd(),
|
|
20
|
+
follow: followSymlinks ?? FOLLOW_SYMLINKS_DEFAULT,
|
|
21
|
+
ignore: normalizeIgnore(ignore, ignoreOptions),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const IGNORE_LIKE_FIELDS = [
|
|
25
|
+
"ignored",
|
|
26
|
+
"childrenIgnored",
|
|
27
|
+
"add",
|
|
28
|
+
];
|
|
29
|
+
function isIgnoreLike(value) {
|
|
30
|
+
if (Array.isArray(value))
|
|
31
|
+
return false;
|
|
32
|
+
if (typeof value === "object" && value !== null) {
|
|
33
|
+
for (const field of IGNORE_LIKE_FIELDS) {
|
|
34
|
+
if (field in value && typeof value[field] !== "function") {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Builds the {@link IgnoreLike} object {@link findFiles} hands to `glob`.
|
|
44
|
+
*
|
|
45
|
+
* A caller-supplied `IgnoreLike` (an object, not string/array) is consulted
|
|
46
|
+
* first - its `ignored`/`childrenIgnored` win - after which the shared
|
|
47
|
+
* {@link ignorePathMatcher} (the same matcher {@link watchFiles} uses) decides based on the
|
|
48
|
+
* package-relative path. `cacheDirectoryStats` is enabled because glob probes
|
|
49
|
+
* many paths per directory. Caller string/array patterns are merged into the
|
|
50
|
+
* matcher, and `add` forwards to both the caller object and the matcher.
|
|
51
|
+
*/
|
|
52
|
+
function normalizeIgnore(ignore, ignoreOptions) {
|
|
53
|
+
const ignoreLike = isIgnoreLike(ignore) ? ignore : undefined;
|
|
54
|
+
const ignorePathMatcherInputs = ignore === undefined || ignoreLike ? undefined : Array.isArray(ignore) ? [...ignore] : [ignore];
|
|
55
|
+
const predicateOnly = ignorePathMatcherInputs?.length === 1 && typeof ignorePathMatcherInputs[0] === "function";
|
|
56
|
+
let ignoreMatcher = predicateOnly
|
|
57
|
+
? toPathMatcher(ignorePathMatcherInputs[0])
|
|
58
|
+
: ignorePathMatcher(ignoreOptions);
|
|
59
|
+
if (ignorePathMatcherInputs && !predicateOnly) {
|
|
60
|
+
ignoreMatcher = ignoreMatcher.or(...pathMatchTests(...ignorePathMatcherInputs));
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
ignored(path) {
|
|
64
|
+
if (ignoreLike?.ignored?.(path))
|
|
65
|
+
return true;
|
|
66
|
+
const patheRelative = path.relative();
|
|
67
|
+
const ignore = ignoreMatcher(patheRelative);
|
|
68
|
+
return ignore;
|
|
69
|
+
},
|
|
70
|
+
childrenIgnored(path) {
|
|
71
|
+
if (ignoreLike?.childrenIgnored?.(path))
|
|
72
|
+
return true;
|
|
73
|
+
const patheRelative = path.relative();
|
|
74
|
+
if (patheRelative) {
|
|
75
|
+
if (ignoreMatcher(patheRelative)) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
else if (ignoreMatcher(patheRelative + "/")) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return false;
|
|
83
|
+
},
|
|
84
|
+
add(ignore) {
|
|
85
|
+
ignoreLike?.add?.(ignore);
|
|
86
|
+
ignoreMatcher = ignoreMatcher.and(...pathMatchTests(ignore));
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// Manual demo: run this file directly (e.g. `tsx src/find.ts`) to print the
|
|
91
|
+
// files findFiles keeps for this package under the given ignore options.
|
|
92
|
+
if (import.meta.main) {
|
|
93
|
+
const startTime = performance.now();
|
|
94
|
+
const cwd = process.cwd();
|
|
95
|
+
console.log(`Scanning: ${cwd}`);
|
|
96
|
+
const files = findFiles("**/*.*", {
|
|
97
|
+
ignore: ["**/index.ts", "**/example/**", "**/*.md"],
|
|
98
|
+
ignoreOptions: {
|
|
99
|
+
test: true,
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
for (const file of files) {
|
|
103
|
+
console.log(file);
|
|
104
|
+
}
|
|
105
|
+
const elapsed = performance.now() - startTime;
|
|
106
|
+
console.log(`Elapsed: ${elapsed}ms`);
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQWlCLE1BQU0sd0JBQXdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBa0QsTUFBTSxNQUFNLENBQUM7QUFDdkYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzdDLE9BQU8sRUFBK0IsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyRixPQUFPLEVBQTBDLHVCQUF1QixFQUFFLE1BQU0sUUFBUSxDQUFDO0FBY3pGOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxPQUEwQixFQUFFLE9BQXlCO0lBQzdFLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0UsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLE9BQW9DO0lBQ3pELE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsR0FBRyxXQUFXLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ3JGLE9BQU87UUFDTCxHQUFHLFdBQVc7UUFDZCxHQUFHLEVBQUUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUU7UUFDekIsTUFBTSxFQUFFLGNBQWMsSUFBSSx1QkFBdUI7UUFDakQsTUFBTSxFQUFFLGVBQWUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDO0tBQy9DLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxrQkFBa0IsR0FBRztJQUN6QixTQUFTO0lBQ1QsaUJBQWlCO0lBQ2pCLEtBQUs7Q0FDMkMsQ0FBQztBQUVuRCxTQUFTLFlBQVksQ0FBQyxLQUFjO0lBQ2xDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFL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QUM7SUFDckIsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUVoQyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQ2hDLE1BQU0sRUFBRSxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsU0FBUyxDQUFDO1FBQ25ELGFBQWEsRUFBRTtZQUNiLElBQUksRUFBRSxJQUFJO1NBQ1g7S0FDRixDQUFDLENBQUM7SUFDSCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUM7SUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLE9BQU8sSUFBSSxDQUFDLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG9iamVjdCwgdHlwZSBTZXF1ZW5jZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBnbG9iSXRlcmF0ZVN5bmMsIElnbm9yZUxpa2UsIHR5cGUgR2xvYk9wdGlvbnNXaXRoRmlsZVR5cGVzVW5zZXQgfSBmcm9tIFwiZ2xvYlwiO1xuaW1wb3J0IHsgaWdub3JlUGF0aE1hdGNoZXIgfSBmcm9tIFwiLi9pZ25vcmVcIjtcbmltcG9ydCB7IFBhdGhNYXRjaGVyLCBQYXRoTWF0Y2hJbnB1dCwgcGF0aE1hdGNoVGVzdHMsIHRvUGF0aE1hdGNoZXIgfSBmcm9tIFwiLi9tYXRjaFwiO1xuaW1wb3J0IHsgRmlsZVNjYW5JZ25vcmVPcHRpb25zLCBGaWxlU2Nhbk9wdGlvbnMsIEZPTExPV19TWU1MSU5LU19ERUZBVUxUIH0gZnJvbSBcIi4vc2NhblwiO1xuXG50eXBlIEZpbGVGaW5kSWdub3JlID0gUGF0aE1hdGNoSW5wdXQgfCByZWFkb25seSBQYXRoTWF0Y2hJbnB1dFtdIHwgSWdub3JlTGlrZTtcblxuZXhwb3J0IGludGVyZmFjZSBGaWxlRmluZE9wdGlvbnNcbiAgZXh0ZW5kc1xuICAgIE9taXQ8XG4gICAgICBHbG9iT3B0aW9uc1dpdGhGaWxlVHlwZXNVbnNldCxcbiAgICAgIFwiaWdub3JlXCIgfCBcImZvbGxvd1wiIHwgXCJkb3RcIiB8IFwiY3dkXCIgfCBcImluY2x1ZGVDaGlsZE1hdGNoZXNcIlxuICAgID4sXG4gICAgT21pdDxGaWxlU2Nhbk9wdGlvbnMsIFwiaWdub3JlXCIgfCBcImN3ZFwiPiB7XG4gIGN3ZD86IHN0cmluZyB8IFVSTDtcbiAgaWdub3JlPzogRmlsZUZpbmRJZ25vcmU7XG59XG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGxpc3RzIGZpbGVzIG1hdGNoaW5nIGBwYXR0ZXJuYCwgaWdub3JpbmcgdGhlIHNoYXJlZCBkZWZhdWx0IGdyb3Vwc1xuICogcGx1cyBhbnkgY2FsbGVyIGBpZ25vcmVgIHBhdHRlcm5zICh1bmxlc3MgYGlnbm9yZWAgaXMgYSBsb25lIHByZWRpY2F0ZSBmdW5jdGlvbixcbiAqIGluIHdoaWNoIGNhc2Ugb25seSB0aGF0IHByZWRpY2F0ZSBhcHBsaWVzKS4gVGhlIGlnbm9yZSBsaXN0IG1pcnJvcnMgd2hhdFxuICoge0BsaW5rIHdhdGNoRmlsZXN9IGZlZWRzIHRocm91Z2ggaXRzIG1hdGNoZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEZpbGVzKHBhdHRlcm46IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRpb25zPzogRmlsZUZpbmRPcHRpb25zKTogU2VxdWVuY2U8c3RyaW5nPiB7XG4gIHJldHVybiBvYmplY3Quc2VxdWVuY2UoZ2xvYkl0ZXJhdGVTeW5jKHBhdHRlcm4sIHRvR2xvYk9wdGlvbnMob3B0aW9ucykpKTtcbn1cblxuZnVuY3Rpb24gdG9HbG9iT3B0aW9ucyhvcHRpb25zOiBGaWxlRmluZE9wdGlvbnMgfCB1bmRlZmluZWQpOiBHbG9iT3B0aW9uc1dpdGhGaWxlVHlwZXNVbnNldCB7XG4gIGNvbnN0IHsgY3dkLCBpZ25vcmUsIGlnbm9yZU9wdGlvbnMsIGZvbGxvd1N5bWxpbmtzLCAuLi5yZXN0T3B0aW9ucyB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN0T3B0aW9ucyxcbiAgICBjd2Q6IGN3ZCA/PyBwcm9jZXNzLmN3ZCgpLFxuICAgIGZvbGxvdzogZm9sbG93U3ltbGlua3MgPz8gRk9MTE9XX1NZTUxJTktTX0RFRkFVTFQsXG4gICAgaWdub3JlOiBub3JtYWxpemVJZ25vcmUoaWdub3JlLCBpZ25vcmVPcHRpb25zKSxcbiAgfTtcbn1cblxuY29uc3QgSUdOT1JFX0xJS0VfRklFTERTID0gW1xuICBcImlnbm9yZWRcIixcbiAgXCJjaGlsZHJlbklnbm9yZWRcIixcbiAgXCJhZGRcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBJZ25vcmVMaWtlKVtdO1xuXG5mdW5jdGlvbiBpc0lnbm9yZUxpa2UodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBJZ25vcmVMaWtlIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIElHTk9SRV9MSUtFX0ZJRUxEUykge1xuICAgICAgaWYgKGZpZWxkIGluIHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KVtmaWVsZF0gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogQnVpbGRzIHRoZSB7QGxpbmsgSWdub3JlTGlrZX0gb2JqZWN0IHtAbGluayBmaW5kRmlsZXN9IGhhbmRzIHRvIGBnbG9iYC5cbiAqXG4gKiBBIGNhbGxlci1zdXBwbGllZCBgSWdub3JlTGlrZWAgKGFuIG9iamVjdCwgbm90IHN0cmluZy9hcnJheSkgaXMgY29uc3VsdGVkXG4gKiBmaXJzdCAtIGl0cyBgaWdub3JlZGAvYGNoaWxkcmVuSWdub3JlZGAgd2luIC0gYWZ0ZXIgd2hpY2ggdGhlIHNoYXJlZFxuICoge0BsaW5rIGlnbm9yZVBhdGhNYXRjaGVyfSAodGhlIHNhbWUgbWF0Y2hlciB7QGxpbmsgd2F0Y2hGaWxlc30gdXNlcykgZGVjaWRlcyBiYXNlZCBvbiB0aGVcbiAqIHBhY2thZ2UtcmVsYXRpdmUgcGF0aC4gYGNhY2hlRGlyZWN0b3J5U3RhdHNgIGlzIGVuYWJsZWQgYmVjYXVzZSBnbG9iIHByb2Jlc1xuICogbWFueSBwYXRocyBwZXIgZGlyZWN0b3J5LiBDYWxsZXIgc3RyaW5nL2FycmF5IHBhdHRlcm5zIGFyZSBtZXJnZWQgaW50byB0aGVcbiAqIG1hdGNoZXIsIGFuZCBgYWRkYCBmb3J3YXJkcyB0byBib3RoIHRoZSBjYWxsZXIgb2JqZWN0IGFuZCB0aGUgbWF0Y2hlci5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplSWdub3JlKFxuICBpZ25vcmU6IEZpbGVGaW5kSWdub3JlIHwgdW5kZWZpbmVkLFxuICBpZ25vcmVPcHRpb25zOiBGaWxlU2Nhbklnbm9yZU9wdGlvbnMgfCB1bmRlZmluZWQsXG4pOiBJZ25vcmVMaWtlIHtcbiAgY29uc3QgaWdub3JlTGlrZTogSWdub3JlTGlrZSB8IHVuZGVmaW5lZCA9IGlzSWdub3JlTGlrZShpZ25vcmUpID8gaWdub3JlIDogdW5kZWZpbmVkO1xuICBjb25zdCBpZ25vcmVQYXRoTWF0Y2hlcklucHV0czogUGF0aE1hdGNoSW5wdXRbXSB8IHVuZGVmaW5lZCA9XG4gICAgaWdub3JlID09PSB1bmRlZmluZWQgfHwgaWdub3JlTGlrZSA/IHVuZGVmaW5lZCA6IEFycmF5LmlzQXJyYXkoaWdub3JlKSA/IFsuLi5pZ25vcmVdIDogW2lnbm9yZV07XG5cbiAgY29uc3QgcHJlZGljYXRlT25seSA9XG4gICAgaWdub3JlUGF0aE1hdGNoZXJJbnB1dHM/Lmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgaWdub3JlUGF0aE1hdGNoZXJJbnB1dHNbMF0gPT09IFwiZnVuY3Rpb25cIjtcblxuICBsZXQgaWdub3JlTWF0Y2hlcjogUGF0aE1hdGNoZXIgPSBwcmVkaWNhdGVPbmx5XG4gICAgPyB0b1BhdGhNYXRjaGVyKGlnbm9yZVBhdGhNYXRjaGVySW5wdXRzWzBdKVxuICAgIDogaWdub3JlUGF0aE1hdGNoZXIoaWdub3JlT3B0aW9ucyk7XG4gIGlmIChpZ25vcmVQYXRoTWF0Y2hlcklucHV0cyAmJiAhcHJlZGljYXRlT25seSkge1xuICAgIGlnbm9yZU1hdGNoZXIgPSBpZ25vcmVNYXRjaGVyLm9yKC4uLnBhdGhNYXRjaFRlc3RzKC4uLmlnbm9yZVBhdGhNYXRjaGVySW5wdXRzKSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBpZ25vcmVkKHBhdGgpIHtcbiAgICAgIGlmIChpZ25vcmVMaWtlPy5pZ25vcmVkPy4ocGF0aCkpIHJldHVybiB0cnVlO1xuICAgICAgY29uc3QgcGF0aGVSZWxhdGl2ZSA9IHBhdGgucmVsYXRpdmUoKTtcbiAgICAgIGNvbnN0IGlnbm9yZSA9IGlnbm9yZU1hdGNoZXIocGF0aGVSZWxhdGl2ZSk7XG4gICAgICByZXR1cm4gaWdub3JlO1xuICAgIH0sXG4gICAgY2hpbGRyZW5JZ25vcmVkKHBhdGgpIHtcbiAgICAgIGlmIChpZ25vcmVMaWtlPy5jaGlsZHJlbklnbm9yZWQ/LihwYXRoKSkgcmV0dXJuIHRydWU7XG4gICAgICBjb25zdCBwYXRoZVJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZSgpO1xuICAgICAgaWYgKHBhdGhlUmVsYXRpdmUpIHtcbiAgICAgICAgaWYgKGlnbm9yZU1hdGNoZXIocGF0aGVSZWxhdGl2ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChpZ25vcmVNYXRjaGVyKHBhdGhlUmVsYXRpdmUgKyBcIi9cIikpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgYWRkKGlnbm9yZSkge1xuICAgICAgaWdub3JlTGlrZT8uYWRkPy4oaWdub3JlKTtcbiAgICAgIGlnbm9yZU1hdGNoZXIgPSBpZ25vcmVNYXRjaGVyLmFuZCguLi5wYXRoTWF0Y2hUZXN0cyhpZ25vcmUpKTtcbiAgICB9LFxuICB9O1xufVxuXG4vLyBNYW51YWwgZGVtbzogcnVuIHRoaXMgZmlsZSBkaXJlY3RseSAoZS5nLiBgdHN4IHNyYy9maW5kLnRzYCkgdG8gcHJpbnQgdGhlXG4vLyBmaWxlcyBmaW5kRmlsZXMga2VlcHMgZm9yIHRoaXMgcGFja2FnZSB1bmRlciB0aGUgZ2l2ZW4gaWdub3JlIG9wdGlvbnMuXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc29sZS5sb2coYFNjYW5uaW5nOiAke2N3ZH1gKTtcblxuICBjb25zdCBmaWxlcyA9IGZpbmRGaWxlcyhcIioqLyouKlwiLCB7XG4gICAgaWdub3JlOiBbXCIqKi9pbmRleC50c1wiLCBcIioqL2V4YW1wbGUvKipcIiwgXCIqKi8qLm1kXCJdLFxuICAgIGlnbm9yZU9wdGlvbnM6IHtcbiAgICAgIHRlc3Q6IHRydWUsXG4gICAgfSxcbiAgfSk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnNvbGUubG9nKGZpbGUpO1xuICB9XG4gIGNvbnN0IGVsYXBzZWQgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgY29uc29sZS5sb2coYEVsYXBzZWQ6ICR7ZWxhcHNlZH1tc2ApO1xufVxuIl19
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in ignore glob patterns for file scanning and watching.
|
|
3
|
+
*
|
|
4
|
+
* This module owns the pattern catalog and option toggles only. Each group is
|
|
5
|
+
* compiled into {@link PathMatchPredicate} instances via {@link toPathMatcher};
|
|
6
|
+
* composition (`and`/`or`/`negate`) lives in {@link ./match}.
|
|
7
|
+
*
|
|
8
|
+
* Consumers:
|
|
9
|
+
* - {@link ignorePatterns} - yields the enabled glob strings (for projen
|
|
10
|
+
* prettier/gitignore). Pass `{ test: false }` there: the `test` group is for
|
|
11
|
+
* filesystem scanning only (skip test dirs when discovering packages /
|
|
12
|
+
* watching), not for VCS or formatter ignore files.
|
|
13
|
+
* - {@link ignorePathMatcher} - returns a single {@link PathMatcher} for
|
|
14
|
+
* {@link findFiles} and {@link watchFiles} (keeps `test: true` by default).
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
import { type Sequence } from "@dbx-tools/shared-core";
|
|
19
|
+
import { PathMatcher } from "./match.js";
|
|
20
|
+
/** Toggles for each built-in ignore group; omitted flags default to `true`. */
|
|
21
|
+
export type IgnorePatternOptions = {
|
|
22
|
+
/** Build artifacts, dependency dirs, caches, logs, and OS junk files. */
|
|
23
|
+
defaults?: boolean;
|
|
24
|
+
/** Hidden dot-files and dot-directories (`.git`, `.vscode`, `.gitignore`, etc.). */
|
|
25
|
+
dot?: boolean;
|
|
26
|
+
/** Temporary directories (`tmp`, `.tmp`, `scratch`, etc.). */
|
|
27
|
+
temp?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Test directories and `*.test.*` / `*.spec.*` naming conventions.
|
|
30
|
+
* Scanning/watch default on; omit (`false`) when emitting `.gitignore` /
|
|
31
|
+
* `.prettierignore` so tests stay tracked and formatable.
|
|
32
|
+
*/
|
|
33
|
+
test?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Lockfile ignore group (`package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`,
|
|
36
|
+
* `bun.lockb`, etc.).
|
|
37
|
+
*
|
|
38
|
+
* - `true` - always ignore lockfiles.
|
|
39
|
+
* - `false` - never ignore lockfiles.
|
|
40
|
+
* - `"auto"` (default) - ignore when the active npm registry is not the public
|
|
41
|
+
* npm registry (`registry.npmjs.org`), e.g. a company-internal registry.
|
|
42
|
+
*/
|
|
43
|
+
lock?: boolean | "auto";
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Yields the glob strings for each enabled built-in ignore group.
|
|
47
|
+
*
|
|
48
|
+
* Useful when a consumer needs literal patterns (e.g. projen `.gitignore` /
|
|
49
|
+
* `.prettierignore`) rather than a compiled {@link PathMatcher}. For those
|
|
50
|
+
* file emitters pass `{ test: false }` - the test group belongs to scanning
|
|
51
|
+
* only ({@link ignorePathMatcher}), not VCS/formatter ignores.
|
|
52
|
+
*
|
|
53
|
+
* @param options - Group toggles; omitted flags default to enabled.
|
|
54
|
+
*/
|
|
55
|
+
export declare function ignorePatterns(options?: IgnorePatternOptions): Sequence<string>;
|
|
56
|
+
/**
|
|
57
|
+
* Returns a {@link PathMatcher} for paths ignored by the enabled built-in groups.
|
|
58
|
+
*
|
|
59
|
+
* Matchers for each group are compiled once at module load; `options` only
|
|
60
|
+
* selects which groups participate. The lock group is included when
|
|
61
|
+
* {@link lockIgnoreMatchersEnabled} returns `true`.
|
|
62
|
+
*
|
|
63
|
+
* @param options - Group toggles; omitted flags default to enabled.
|
|
64
|
+
*/
|
|
65
|
+
export declare function ignorePathMatcher(options?: IgnorePatternOptions): PathMatcher;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in ignore glob patterns for file scanning and watching.
|
|
3
|
+
*
|
|
4
|
+
* This module owns the pattern catalog and option toggles only. Each group is
|
|
5
|
+
* compiled into {@link PathMatchPredicate} instances via {@link toPathMatcher};
|
|
6
|
+
* composition (`and`/`or`/`negate`) lives in {@link ./match}.
|
|
7
|
+
*
|
|
8
|
+
* Consumers:
|
|
9
|
+
* - {@link ignorePatterns} - yields the enabled glob strings (for projen
|
|
10
|
+
* prettier/gitignore). Pass `{ test: false }` there: the `test` group is for
|
|
11
|
+
* filesystem scanning only (skip test dirs when discovering packages /
|
|
12
|
+
* watching), not for VCS or formatter ignore files.
|
|
13
|
+
* - {@link ignorePathMatcher} - returns a single {@link PathMatcher} for
|
|
14
|
+
* {@link findFiles} and {@link watchFiles} (keeps `test: true` by default).
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
import { project } from "@dbx-tools/core";
|
|
19
|
+
import { functionModule, object } from "@dbx-tools/shared-core";
|
|
20
|
+
import { toPathMatcher } from "./match.js";
|
|
21
|
+
import { directoryNamePattern, fileExtensionPattern } from "./pattern.js";
|
|
22
|
+
/** Host of the public npm registry; anything else is treated as private. */
|
|
23
|
+
const PUBLIC_NPM_REGISTRY_HOST = "registry.npmjs.org";
|
|
24
|
+
/**
|
|
25
|
+
* Memoized probe for {@link IgnorePatternOptions.lock} `"auto"`.
|
|
26
|
+
*
|
|
27
|
+
* Resolves the active registry through `@dbx-tools/core`'s
|
|
28
|
+
* {@link project.npmRegistry} and returns `true` when it is not the public npm
|
|
29
|
+
* registry - a lockfile produced against a private mirror pins URLs that other
|
|
30
|
+
* machines cannot reach, so it should not be committed.
|
|
31
|
+
*/
|
|
32
|
+
const lockIgnoreMatchersAutoEnabled = functionModule.memoize(() => {
|
|
33
|
+
const registry = project.npmRegistry();
|
|
34
|
+
return registry !== undefined && registry.hostname !== PUBLIC_NPM_REGISTRY_HOST;
|
|
35
|
+
});
|
|
36
|
+
/** Resolves whether the lockfile ignore group is enabled for the given options. */
|
|
37
|
+
function lockIgnoreMatchersEnabled(options) {
|
|
38
|
+
const value = options?.lock ?? "auto";
|
|
39
|
+
if (value === "auto") {
|
|
40
|
+
return lockIgnoreMatchersAutoEnabled();
|
|
41
|
+
}
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Compiles glob strings into a `{ [glob]: PathMatchPredicate }` map.
|
|
46
|
+
*
|
|
47
|
+
* Keying by the source glob de-dupes and keeps each matcher beside its pattern.
|
|
48
|
+
*/
|
|
49
|
+
function compileMatchers(patterns) {
|
|
50
|
+
return Object.fromEntries(patterns.map((glob) => [glob, toPathMatcher(glob)]));
|
|
51
|
+
}
|
|
52
|
+
/** Build artifacts, dependency directories, caches, logs, and OS files. */
|
|
53
|
+
const defaultIgnoreMatchers = compileMatchers([
|
|
54
|
+
"**/.DS_Store",
|
|
55
|
+
"**/Thumbs.db",
|
|
56
|
+
"**/Desktop.ini",
|
|
57
|
+
...["log", "tsbuildinfo"].map((ext) => fileExtensionPattern(ext)),
|
|
58
|
+
"**/*-debug.log*",
|
|
59
|
+
"**/yarn-error.log*",
|
|
60
|
+
...[
|
|
61
|
+
"node_modules",
|
|
62
|
+
"bower_components",
|
|
63
|
+
"jspm_packages",
|
|
64
|
+
"dist",
|
|
65
|
+
"lib",
|
|
66
|
+
"build",
|
|
67
|
+
"out",
|
|
68
|
+
"coverage",
|
|
69
|
+
".cache",
|
|
70
|
+
".parcel-cache",
|
|
71
|
+
".turbo",
|
|
72
|
+
".next",
|
|
73
|
+
".nuxt",
|
|
74
|
+
".svelte-kit",
|
|
75
|
+
".pnpm-store",
|
|
76
|
+
".nyc_output",
|
|
77
|
+
].map((name) => directoryNamePattern(name)),
|
|
78
|
+
]);
|
|
79
|
+
/** Hidden dot-files and dot-directories such as `.git`, `.vscode`, `.idea`, etc. */
|
|
80
|
+
const dotIgnoreMatchers = compileMatchers([".*"].flatMap((glob) => [`**/${glob}`, directoryNamePattern(glob, false)]));
|
|
81
|
+
/** Temporary directories, including hidden variants (`.tmp`, etc.). */
|
|
82
|
+
const tempIgnoreMatchers = compileMatchers(["temp", "tmp", "temps", "scratch"]
|
|
83
|
+
.flatMap((name) => [name, `.${name}`])
|
|
84
|
+
.map((name) => directoryNamePattern(name)));
|
|
85
|
+
/** Test directories and common test-file naming conventions. */
|
|
86
|
+
const testIgnoreMatchers = compileMatchers([
|
|
87
|
+
...["test", "tests", "__tests__", "__snapshots__"]
|
|
88
|
+
.flatMap((name) => [name, `.${name}`])
|
|
89
|
+
.map((name) => directoryNamePattern(name)),
|
|
90
|
+
"**/*.test.*",
|
|
91
|
+
"**/*.spec.*",
|
|
92
|
+
"**/test.*",
|
|
93
|
+
"**/spec.*",
|
|
94
|
+
]);
|
|
95
|
+
/** Lockfiles (`package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`, `bun.lockb`, …). */
|
|
96
|
+
const lockIgnoreMatchers = compileMatchers([
|
|
97
|
+
"**/bun.lockb",
|
|
98
|
+
...["json", "yaml", "yml"].map((ext) => `**/*-lock.${ext}`),
|
|
99
|
+
...["lock"].map((ext) => fileExtensionPattern(ext)),
|
|
100
|
+
]);
|
|
101
|
+
/**
|
|
102
|
+
* Collects the pre-compiled matcher maps for each enabled built-in group.
|
|
103
|
+
*
|
|
104
|
+
* Group toggles come from `options`; the lock group also respects
|
|
105
|
+
* {@link lockIgnoreMatchersEnabled} (`lock: "auto"` probes the npm registry).
|
|
106
|
+
*/
|
|
107
|
+
function ignoreMatchPredicates(options) {
|
|
108
|
+
const ignoreMatchRecords = [];
|
|
109
|
+
if (options?.defaults ?? true)
|
|
110
|
+
ignoreMatchRecords.push(defaultIgnoreMatchers);
|
|
111
|
+
if (options?.temp ?? true)
|
|
112
|
+
ignoreMatchRecords.push(tempIgnoreMatchers);
|
|
113
|
+
if (options?.test ?? true)
|
|
114
|
+
ignoreMatchRecords.push(testIgnoreMatchers);
|
|
115
|
+
if (options?.dot ?? true)
|
|
116
|
+
ignoreMatchRecords.push(dotIgnoreMatchers);
|
|
117
|
+
if (lockIgnoreMatchersEnabled(options))
|
|
118
|
+
ignoreMatchRecords.push(lockIgnoreMatchers);
|
|
119
|
+
return ignoreMatchRecords;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Yields the glob strings for each enabled built-in ignore group.
|
|
123
|
+
*
|
|
124
|
+
* Useful when a consumer needs literal patterns (e.g. projen `.gitignore` /
|
|
125
|
+
* `.prettierignore`) rather than a compiled {@link PathMatcher}. For those
|
|
126
|
+
* file emitters pass `{ test: false }` - the test group belongs to scanning
|
|
127
|
+
* only ({@link ignorePathMatcher}), not VCS/formatter ignores.
|
|
128
|
+
*
|
|
129
|
+
* @param options - Group toggles; omitted flags default to enabled.
|
|
130
|
+
*/
|
|
131
|
+
export function ignorePatterns(options) {
|
|
132
|
+
return object.sequence(ignoreMatchPredicates(options)).flatMap(Object.keys).distinct();
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Returns a {@link PathMatcher} for paths ignored by the enabled built-in groups.
|
|
136
|
+
*
|
|
137
|
+
* Matchers for each group are compiled once at module load; `options` only
|
|
138
|
+
* selects which groups participate. The lock group is included when
|
|
139
|
+
* {@link lockIgnoreMatchersEnabled} returns `true`.
|
|
140
|
+
*
|
|
141
|
+
* @param options - Group toggles; omitted flags default to enabled.
|
|
142
|
+
*/
|
|
143
|
+
export function ignorePathMatcher(options) {
|
|
144
|
+
const predicates = ignoreMatchPredicates(options).flatMap(Object.values);
|
|
145
|
+
return toPathMatcher(...predicates);
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWdub3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2lnbm9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBaUIsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRSxPQUFPLEVBQW1DLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxXQUFXLENBQUM7QUE0QnZFLDRFQUE0RTtBQUM1RSxNQUFNLHdCQUF3QixHQUFHLG9CQUFvQixDQUFDO0FBRXREOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLDZCQUE2QixHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO0lBQ2hFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QyxPQUFPLFFBQVEsS0FBSyxTQUFTLElBQUksUUFBUSxDQUFDLFFBQVEsS0FBSyx3QkFBd0IsQ0FBQztBQUNsRixDQUFDLENBQUMsQ0FBQztBQUVILG1GQUFtRjtBQUNuRixTQUFTLHlCQUF5QixDQUFDLE9BQThCO0lBQy9ELE1BQU0sS0FBSyxHQUFHLE9BQU8sRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDO0lBQ3RDLElBQUksS0FBSyxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ3JCLE9BQU8sNkJBQTZCLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLFFBQTJCO0lBQ2xELE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxh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QUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdkUsSUFBSSxPQUFPLEVBQUUsR0FBRyxJQUFJLElBQUk7UUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNyRSxJQUFJLHlCQUF5QixDQUFDLE9BQU8sQ0FBQztRQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3BGLE9BQU8sa0JBQWtCLENBQUM7QUFDNUIsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsT0FBOEI7SUFDM0QsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN6RixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsT0FBOEI7SUFDOUQsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RSxPQUFPLGFBQWEsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJ1aWx0LWluIGlnbm9yZSBnbG9iIHBhdHRlcm5zIGZvciBmaWxlIHNjYW5uaW5nIGFuZCB3YXRjaGluZy5cbiAqXG4gKiBUaGlzIG1vZHVsZSBvd25zIHRoZSBwYXR0ZXJuIGNhdGFsb2cgYW5kIG9wdGlvbiB0b2dnbGVzIG9ubHkuIEVhY2ggZ3JvdXAgaXNcbiAqIGNvbXBpbGVkIGludG8ge0BsaW5rIFBhdGhNYXRjaFByZWRpY2F0ZX0gaW5zdGFuY2VzIHZpYSB7QGxpbmsgdG9QYXRoTWF0Y2hlcn07XG4gKiBjb21wb3NpdGlvbiAoYGFuZGAvYG9yYC9gbmVnYXRlYCkgbGl2ZXMgaW4ge0BsaW5rIC4vbWF0Y2h9LlxuICpcbiAqIENvbnN1bWVyczpcbiAqIC0ge0BsaW5rIGlnbm9yZVBhdHRlcm5zfSAtIHlpZWxkcyB0aGUgZW5hYmxlZCBnbG9iIHN0cmluZ3MgKGZvciBwcm9qZW5cbiAqICAgcHJldHRpZXIvZ2l0aWdub3JlKS4gUGFzcyBgeyB0ZXN0OiBmYWxzZSB9YCB0aGVyZTogdGhlIGB0ZXN0YCBncm91cCBpcyBmb3JcbiAqICAgZmlsZXN5c3RlbSBzY2FubmluZyBvbmx5IChza2lwIHRlc3QgZGlycyB3aGVuIGRpc2NvdmVyaW5nIHBhY2thZ2VzIC9cbiAqICAgd2F0Y2hpbmcpLCBub3QgZm9yIFZDUyBvciBmb3JtYXR0ZXIgaWdub3JlIGZpbGVzLlxuICogLSB7QGxpbmsgaWdub3JlUGF0aE1hdGNoZXJ9IC0gcmV0dXJucyBhIHNpbmdsZSB7QGxpbmsgUGF0aE1hdGNoZXJ9IGZvclxuICogICB7QGxpbmsgZmluZEZpbGVzfSBhbmQge0BsaW5rIHdhdGNoRmlsZXN9IChrZWVwcyBgdGVzdDogdHJ1ZWAgYnkgZGVmYXVsdCkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHByb2plY3QgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBmdW5jdGlvbk1vZHVsZSwgb2JqZWN0LCB0eXBlIFNlcXVlbmNlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IFBhdGhNYXRjaGVyLCBQYXRoTWF0Y2hQcmVkaWNhdGUsIHRvUGF0aE1hdGNoZXIgfSBmcm9tIFwiLi9tYXRjaFwiO1xuaW1wb3J0IHsgZGlyZWN0b3J5TmFtZVBhdHRlcm4sIGZpbGVFeHRlbnNpb25QYXR0ZXJuIH0gZnJvbSBcIi4vcGF0dGVyblwiO1xuXG4vKiogVG9nZ2xlcyBmb3IgZWFjaCBidWlsdC1pbiBpZ25vcmUgZ3JvdXA7IG9taXR0ZWQgZmxhZ3MgZGVmYXVsdCB0byBgdHJ1ZWAuICovXG5leHBvcnQgdHlwZSBJZ25vcmVQYXR0ZXJuT3B0aW9ucyA9IHtcbiAgLyoqIEJ1aWxkIGFydGlmYWN0cywgZGVwZW5kZW5jeSBkaXJzLCBjYWNoZXMsIGxvZ3MsIGFuZCBPUyBqdW5rIGZpbGVzLiAqL1xuICBkZWZhdWx0cz86IGJvb2xlYW47XG4gIC8qKiBIaWRkZW4gZG90LWZpbGVzIGFuZCBkb3QtZGlyZWN0b3JpZXMgKGAuZ2l0YCwgYC52c2NvZGVgLCBgLmdpdGlnbm9yZWAsIGV0Yy4pLiAqL1xuICBkb3Q/OiBib29sZWFuO1xuICAvKiogVGVtcG9yYXJ5IGRpcmVjdG9yaWVzIChgdG1wYCwgYC50bXBgLCBgc2NyYXRjaGAsIGV0Yy4pLiAqL1xuICB0ZW1wPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRlc3QgZGlyZWN0b3JpZXMgYW5kIGAqLnRlc3QuKmAgLyBgKi5zcGVjLipgIG5hbWluZyBjb252ZW50aW9ucy5cbiAgICogU2Nhbm5pbmcvd2F0Y2ggZGVmYXVsdCBvbjsgb21pdCAoYGZhbHNlYCkgd2hlbiBlbWl0dGluZyBgLmdpdGlnbm9yZWAgL1xuICAgKiBgLnByZXR0aWVyaWdub3JlYCBzbyB0ZXN0cyBzdGF5IHRyYWNrZWQgYW5kIGZvcm1hdGFibGUuXG4gICAqL1xuICB0ZXN0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIExvY2tmaWxlIGlnbm9yZSBncm91cCAoYHBhY2thZ2UtbG9jay5qc29uYCwgYHBucG0tbG9jay55YW1sYCwgYHlhcm4ubG9ja2AsXG4gICAqIGBidW4ubG9ja2JgLCBldGMuKS5cbiAgICpcbiAgICogLSBgdHJ1ZWAgLSBhbHdheXMgaWdub3JlIGxvY2tmaWxlcy5cbiAgICogLSBgZmFsc2VgIC0gbmV2ZXIgaWdub3JlIGxvY2tmaWxlcy5cbiAgICogLSBgXCJhdXRvXCJgIChkZWZhdWx0KSAtIGlnbm9yZSB3aGVuIHRoZSBhY3RpdmUgbnBtIHJlZ2lzdHJ5IGlzIG5vdCB0aGUgcHVibGljXG4gICAqICAgbnBtIHJlZ2lzdHJ5IChgcmVnaXN0cnkubnBtanMub3JnYCksIGUuZy4gYSBjb21wYW55LWludGVybmFsIHJlZ2lzdHJ5LlxuICAgKi9cbiAgbG9jaz86IGJvb2xlYW4gfCBcImF1dG9cIjtcbn07XG5cbi8qKiBIb3N0IG9mIHRoZSBwdWJsaWMgbnBtIHJlZ2lzdHJ5OyBhbnl0aGluZyBlbHNlIGlzIHRyZWF0ZWQgYXMgcHJpdmF0ZS4gKi9cbmNvbnN0IFBVQkxJQ19OUE1fUkVHSVNUUllfSE9TVCA9IFwicmVnaXN0cnkubnBtanMub3JnXCI7XG5cbi8qKlxuICogTWVtb2l6ZWQgcHJvYmUgZm9yIHtAbGluayBJZ25vcmVQYXR0ZXJuT3B0aW9ucy5sb2NrfSBgXCJhdXRvXCJgLlxuICpcbiAqIFJlc29sdmVzIHRoZSBhY3RpdmUgcmVnaXN0cnkgdGhyb3VnaCBgQGRieC10b29scy9jb3JlYCdzXG4gKiB7QGxpbmsgcHJvamVjdC5ucG1SZWdpc3RyeX0gYW5kIHJldHVybnMgYHRydWVgIHdoZW4gaXQgaXMgbm90IHRoZSBwdWJsaWMgbnBtXG4gKiByZWdpc3RyeSAtIGEgbG9ja2ZpbGUgcHJvZHVjZWQgYWdhaW5zdCBhIHByaXZhdGUgbWlycm9yIHBpbnMgVVJMcyB0aGF0IG90aGVyXG4gKiBtYWNoaW5lcyBjYW5ub3QgcmVhY2gsIHNvIGl0IHNob3VsZCBub3QgYmUgY29tbWl0dGVkLlxuICovXG5jb25zdCBsb2NrSWdub3JlTWF0Y2hlcnNBdXRvRW5hYmxlZCA9IGZ1bmN0aW9uTW9kdWxlLm1lbW9pemUoKCkgPT4ge1xuICBjb25zdCByZWdpc3RyeSA9IHByb2plY3QubnBtUmVnaXN0cnkoKTtcbiAgcmV0dXJuIHJlZ2lzdHJ5ICE9PSB1bmRlZmluZWQgJiYgcmVnaXN0cnkuaG9zdG5hbWUgIT09IFBVQkxJQ19OUE1fUkVHSVNUUllfSE9TVDtcbn0pO1xuXG4vKiogUmVzb2x2ZXMgd2hldGhlciB0aGUgbG9ja2ZpbGUgaWdub3JlIGdyb3VwIGlzIGVuYWJsZWQgZm9yIHRoZSBnaXZlbiBvcHRpb25zLiAqL1xuZnVuY3Rpb24gbG9ja0lnbm9yZU1hdGNoZXJzRW5hYmxlZChvcHRpb25zPzogSWdub3JlUGF0dGVybk9wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3QgdmFsdWUgPSBvcHRpb25zPy5sb2NrID8/IFwiYXV0b1wiO1xuICBpZiAodmFsdWUgPT09IFwiYXV0b1wiKSB7XG4gICAgcmV0dXJuIGxvY2tJZ25vcmVNYXRjaGVyc0F1dG9FbmFibGVkKCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIENvbXBpbGVzIGdsb2Igc3RyaW5ncyBpbnRvIGEgYHsgW2dsb2JdOiBQYXRoTWF0Y2hQcmVkaWNhdGUgfWAgbWFwLlxuICpcbiAqIEtleWluZyBieSB0aGUgc291cmNlIGdsb2IgZGUtZHVwZXMgYW5kIGtlZXBzIGVhY2ggbWF0Y2hlciBiZXNpZGUgaXRzIHBhdHRlcm4uXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVNYXRjaGVycyhwYXR0ZXJuczogcmVhZG9ubHkgc3RyaW5nW10pOiBSZWNvcmQ8c3RyaW5nLCBQYXRoTWF0Y2hQcmVkaWNhdGU+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhwYXR0ZXJucy5tYXAoKGdsb2IpID0+IFtnbG9iLCB0b1BhdGhNYXRjaGVyKGdsb2IpXSkpO1xufVxuXG4vKiogQnVpbGQgYXJ0aWZhY3RzLCBkZXBlbmRlbmN5IGRpcmVjdG9yaWVzLCBjYWNoZXMsIGxvZ3MsIGFuZCBPUyBmaWxlcy4gKi9cbmNvbnN0IGRlZmF1bHRJZ25vcmVNYXRjaGVycyA9IGNvbXBpbGVNYXRjaGVycyhbXG4gIFwiKiovLkRTX1N0b3JlXCIsXG4gIFwiKiovVGh1bWJzLmRiXCIsXG4gIFwiKiovRGVza3RvcC5pbmlcIixcbiAgLi4uW1wibG9nXCIsIFwidHNidWlsZGluZm9cIl0ubWFwKChleHQpID0+IGZpbGVFeHRlbnNpb25QYXR0ZXJuKGV4dCkpLFxuICBcIioqLyotZGVidWcubG9nKlwiLFxuICBcIioqL3lhcm4tZXJyb3IubG9nKlwiLFxuICAuLi5bXG4gICAgXCJub2RlX21vZHVsZXNcIixcbiAgICBcImJvd2VyX2NvbXBvbmVudHNcIixcbiAgICBcImpzcG1fcGFja2FnZXNcIixcbiAgICBcImRpc3RcIixcbiAgICBcImxpYlwiLFxuICAgIFwiYnVpbGRcIixcbiAgICBcIm91dFwiLFxuICAgIFwiY292ZXJhZ2VcIixcbiAgICBcIi5jYWNoZVwiLFxuICAgIFwiLnBhcmNlbC1jYWNoZVwiLFxuICAgIFwiLnR1cmJvXCIsXG4gICAgXCIubmV4dFwiLFxuICAgIFwiLm51eHRcIixcbiAgICBcIi5zdmVsdGUta2l0XCIsXG4gICAgXCIucG5wbS1zdG9yZVwiLFxuICAgIFwiLm55Y19vdXRwdXRcIixcbiAgXS5tYXAoKG5hbWUpID0+IGRpcmVjdG9yeU5hbWVQYXR0ZXJuKG5hbWUpKSxcbl0pO1xuXG4vKiogSGlkZGVuIGRvdC1maWxlcyBhbmQgZG90LWRpcmVjdG9yaWVzIHN1Y2ggYXMgYC5naXRgLCBgLnZzY29kZWAsIGAuaWRlYWAsIGV0Yy4gKi9cbmNvbnN0IGRvdElnbm9yZU1hdGNoZXJzID0gY29tcGlsZU1hdGNoZXJzKFxuICBbXCIuKlwiXS5mbGF0TWFwKChnbG9iKSA9PiBbYCoqLyR7Z2xvYn1gLCBkaXJlY3RvcnlOYW1lUGF0dGVybihnbG9iLCBmYWxzZSldKSxcbik7XG5cbi8qKiBUZW1wb3JhcnkgZGlyZWN0b3JpZXMsIGluY2x1ZGluZyBoaWRkZW4gdmFyaWFudHMgKGAudG1wYCwgZXRjLikuICovXG5jb25zdCB0ZW1wSWdub3JlTWF0Y2hlcnMgPSBjb21waWxlTWF0Y2hlcnMoXG4gIFtcInRlbXBcIiwgXCJ0bXBcIiwgXCJ0ZW1wc1wiLCBcInNjcmF0Y2hcIl1cbiAgICAuZmxhdE1hcCgobmFtZSkgPT4gW25hbWUsIGAuJHtuYW1lfWBdKVxuICAgIC5tYXAoKG5hbWUpID0+IGRpcmVjdG9yeU5hbWVQYXR0ZXJuKG5hbWUpKSxcbik7XG5cbi8qKiBUZXN0IGRpcmVjdG9yaWVzIGFuZCBjb21tb24gdGVzdC1maWxlIG5hbWluZyBjb252ZW50aW9ucy4gKi9cbmNvbnN0IHRlc3RJZ25vcmVNYXRjaGVycyA9IGNvbXBpbGVNYXRjaGVycyhbXG4gIC4uLltcInRlc3RcIiwgXCJ0ZXN0c1wiLCBcIl9fdGVzdHNfX1wiLCBcIl9fc25hcHNob3RzX19cIl1cbiAgICAuZmxhdE1hcCgobmFtZSkgPT4gW25hbWUsIGAuJHtuYW1lfWBdKVxuICAgIC5tYXAoKG5hbWUpID0+IGRpcmVjdG9yeU5hbWVQYXR0ZXJuKG5hbWUpKSxcbiAgXCIqKi8qLnRlc3QuKlwiLFxuICBcIioqLyouc3BlYy4qXCIsXG4gIFwiKiovdGVzdC4qXCIsXG4gIFwiKiovc3BlYy4qXCIsXG5dKTtcblxuLyoqIExvY2tmaWxlcyAoYHBhY2thZ2UtbG9jay5qc29uYCwgYHBucG0tbG9jay55YW1sYCwgYHlhcm4ubG9ja2AsIGBidW4ubG9ja2JgLCDigKYpLiAqL1xuY29uc3QgbG9ja0lnbm9yZU1hdGNoZXJzID0gY29tcGlsZU1hdGNoZXJzKFtcbiAgXCIqKi9idW4ubG9ja2JcIixcbiAgLi4uW1wianNvblwiLCBcInlhbWxcIiwgXCJ5bWxcIl0ubWFwKChleHQpID0+IGAqKi8qLWxvY2suJHtleHR9YCksXG4gIC4uLltcImxvY2tcIl0ubWFwKChleHQpID0+IGZpbGVFeHRlbnNpb25QYXR0ZXJuKGV4dCkpLFxuXSk7XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIHByZS1jb21waWxlZCBtYXRjaGVyIG1hcHMgZm9yIGVhY2ggZW5hYmxlZCBidWlsdC1pbiBncm91cC5cbiAqXG4gKiBHcm91cCB0b2dnbGVzIGNvbWUgZnJvbSBgb3B0aW9uc2A7IHRoZSBsb2NrIGdyb3VwIGFsc28gcmVzcGVjdHNcbiAqIHtAbGluayBsb2NrSWdub3JlTWF0Y2hlcnNFbmFibGVkfSAoYGxvY2s6IFwiYXV0b1wiYCBwcm9iZXMgdGhlIG5wbSByZWdpc3RyeSkuXG4gKi9cbmZ1bmN0aW9uIGlnbm9yZU1hdGNoUHJlZGljYXRlcyhcbiAgb3B0aW9ucz86IElnbm9yZVBhdHRlcm5PcHRpb25zLFxuKTogUmVjb3JkPHN0cmluZywgUGF0aE1hdGNoUHJlZGljYXRlPltdIHtcbiAgY29uc3QgaWdub3JlTWF0Y2hSZWNvcmRzOiBSZWNvcmQ8c3RyaW5nLCBQYXRoTWF0Y2hQcmVkaWNhdGU+W10gPSBbXTtcbiAgaWYgKG9wdGlvbnM/LmRlZmF1bHRzID8/IHRydWUpIGlnbm9yZU1hdGNoUmVjb3Jkcy5wdXNoKGRlZmF1bHRJZ25vcmVNYXRjaGVycyk7XG4gIGlmIChvcHRpb25zPy50ZW1wID8/IHRydWUpIGlnbm9yZU1hdGNoUmVjb3Jkcy5wdXNoKHRlbXBJZ25vcmVNYXRjaGVycyk7XG4gIGlmIChvcHRpb25zPy50ZXN0ID8/IHRydWUpIGlnbm9yZU1hdGNoUmVjb3Jkcy5wdXNoKHRlc3RJZ25vcmVNYXRjaGVycyk7XG4gIGlmIChvcHRpb25zPy5kb3QgPz8gdHJ1ZSkgaWdub3JlTWF0Y2hSZWNvcmRzLnB1c2goZG90SWdub3JlTWF0Y2hlcnMpO1xuICBpZiAobG9ja0lnbm9yZU1hdGNoZXJzRW5hYmxlZChvcHRpb25zKSkgaWdub3JlTWF0Y2hSZWNvcmRzLnB1c2gobG9ja0lnbm9yZU1hdGNoZXJzKTtcbiAgcmV0dXJuIGlnbm9yZU1hdGNoUmVjb3Jkcztcbn1cblxuLyoqXG4gKiBZaWVsZHMgdGhlIGdsb2Igc3RyaW5ncyBmb3IgZWFjaCBlbmFibGVkIGJ1aWx0LWluIGlnbm9yZSBncm91cC5cbiAqXG4gKiBVc2VmdWwgd2hlbiBhIGNvbnN1bWVyIG5lZWRzIGxpdGVyYWwgcGF0dGVybnMgKGUuZy4gcHJvamVuIGAuZ2l0aWdub3JlYCAvXG4gKiBgLnByZXR0aWVyaWdub3JlYCkgcmF0aGVyIHRoYW4gYSBjb21waWxlZCB7QGxpbmsgUGF0aE1hdGNoZXJ9LiBGb3IgdGhvc2VcbiAqIGZpbGUgZW1pdHRlcnMgcGFzcyBgeyB0ZXN0OiBmYWxzZSB9YCAtIHRoZSB0ZXN0IGdyb3VwIGJlbG9uZ3MgdG8gc2Nhbm5pbmdcbiAqIG9ubHkgKHtAbGluayBpZ25vcmVQYXRoTWF0Y2hlcn0pLCBub3QgVkNTL2Zvcm1hdHRlciBpZ25vcmVzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gR3JvdXAgdG9nZ2xlczsgb21pdHRlZCBmbGFncyBkZWZhdWx0IHRvIGVuYWJsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVQYXR0ZXJucyhvcHRpb25zPzogSWdub3JlUGF0dGVybk9wdGlvbnMpOiBTZXF1ZW5jZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG9iamVjdC5zZXF1ZW5jZShpZ25vcmVNYXRjaFByZWRpY2F0ZXMob3B0aW9ucykpLmZsYXRNYXAoT2JqZWN0LmtleXMpLmRpc3RpbmN0KCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHtAbGluayBQYXRoTWF0Y2hlcn0gZm9yIHBhdGhzIGlnbm9yZWQgYnkgdGhlIGVuYWJsZWQgYnVpbHQtaW4gZ3JvdXBzLlxuICpcbiAqIE1hdGNoZXJzIGZvciBlYWNoIGdyb3VwIGFyZSBjb21waWxlZCBvbmNlIGF0IG1vZHVsZSBsb2FkOyBgb3B0aW9uc2Agb25seVxuICogc2VsZWN0cyB3aGljaCBncm91cHMgcGFydGljaXBhdGUuIFRoZSBsb2NrIGdyb3VwIGlzIGluY2x1ZGVkIHdoZW5cbiAqIHtAbGluayBsb2NrSWdub3JlTWF0Y2hlcnNFbmFibGVkfSByZXR1cm5zIGB0cnVlYC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEdyb3VwIHRvZ2dsZXM7IG9taXR0ZWQgZmxhZ3MgZGVmYXVsdCB0byBlbmFibGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlUGF0aE1hdGNoZXIob3B0aW9ucz86IElnbm9yZVBhdHRlcm5PcHRpb25zKTogUGF0aE1hdGNoZXIge1xuICBjb25zdCBwcmVkaWNhdGVzID0gaWdub3JlTWF0Y2hQcmVkaWNhdGVzKG9wdGlvbnMpLmZsYXRNYXAoT2JqZWN0LnZhbHVlcyk7XG4gIHJldHVybiB0b1BhdGhNYXRjaGVyKC4uLnByZWRpY2F0ZXMpO1xufVxuIl19
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path matching and predicate composition for file scanning and watching.
|
|
3
|
+
*
|
|
4
|
+
* {@link toPathMatcher} compiles globs into {@link Predicate} values from
|
|
5
|
+
* shared-core (`and` / `or` / `negate`) for use by {@link findFiles} and
|
|
6
|
+
* {@link watchFiles}.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import { type Predicate, type PredicateFunction } from "@dbx-tools/shared-core";
|
|
11
|
+
export type PathMatchPredicate = PredicateFunction<string>;
|
|
12
|
+
/** A composable path test (`true` == match). */
|
|
13
|
+
export type PathMatcher = Predicate<string>;
|
|
14
|
+
/**
|
|
15
|
+
* Anything {@link toPathMatcher} accepts: a glob string (compiled with
|
|
16
|
+
* `dot: true`), or a custom `(path) => boolean`.
|
|
17
|
+
*/
|
|
18
|
+
export type PathMatchInput = PathMatchPredicate | string;
|
|
19
|
+
/** Compiles path match inputs to predicate functions for `.and()` / `.or()`. */
|
|
20
|
+
export declare function pathMatchTests(...inputs: readonly (PathMatchInput | null | undefined)[]): readonly PathMatchPredicate[];
|
|
21
|
+
/**
|
|
22
|
+
* Combines one or more patterns into a single {@link PathMatcher} (OR'd).
|
|
23
|
+
* Strings are compiled with `dot: true`; predicates are used as-is;
|
|
24
|
+
* `null`/`undefined` entries are skipped. With no matching patterns the result
|
|
25
|
+
* always returns `false`.
|
|
26
|
+
*
|
|
27
|
+
* @param patterns - Globs and/or predicates to OR together.
|
|
28
|
+
*/
|
|
29
|
+
export declare function toPathMatcher(...inputs: readonly (PathMatchInput | null | undefined)[]): PathMatcher;
|
package/lib/src/match.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path matching and predicate composition for file scanning and watching.
|
|
3
|
+
*
|
|
4
|
+
* {@link toPathMatcher} compiles globs into {@link Predicate} values from
|
|
5
|
+
* shared-core (`and` / `or` / `negate`) for use by {@link findFiles} and
|
|
6
|
+
* {@link watchFiles}.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import { object, predicate } from "@dbx-tools/shared-core";
|
|
11
|
+
import { Minimatch } from "minimatch";
|
|
12
|
+
import { ignorePathMatcher } from "./ignore.js";
|
|
13
|
+
/** Normalizes a {@link PathMatchInput} to a plain path test. */
|
|
14
|
+
function toTest(pattern) {
|
|
15
|
+
if (typeof pattern === "string") {
|
|
16
|
+
const matcher = new Minimatch(pattern, { dot: true });
|
|
17
|
+
return (path) => matcher.match(path);
|
|
18
|
+
}
|
|
19
|
+
return pattern;
|
|
20
|
+
}
|
|
21
|
+
/** Compiles path match inputs to predicate functions for `.and()` / `.or()`. */
|
|
22
|
+
export function pathMatchTests(...inputs) {
|
|
23
|
+
return object.sequence(inputs).nonNull().map(toTest).toArray();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Combines one or more patterns into a single {@link PathMatcher} (OR'd).
|
|
27
|
+
* Strings are compiled with `dot: true`; predicates are used as-is;
|
|
28
|
+
* `null`/`undefined` entries are skipped. With no matching patterns the result
|
|
29
|
+
* always returns `false`.
|
|
30
|
+
*
|
|
31
|
+
* @param patterns - Globs and/or predicates to OR together.
|
|
32
|
+
*/
|
|
33
|
+
export function toPathMatcher(...inputs) {
|
|
34
|
+
const tests = pathMatchTests(...inputs);
|
|
35
|
+
if (tests.length === 0)
|
|
36
|
+
return predicate.create(() => false);
|
|
37
|
+
return tests
|
|
38
|
+
.slice(1)
|
|
39
|
+
.reduce((acc, test) => acc.or(test), predicate.create(tests[0]));
|
|
40
|
+
}
|
|
41
|
+
if (import.meta.main) {
|
|
42
|
+
const matcher = ignorePathMatcher({ test: true })
|
|
43
|
+
.negate()
|
|
44
|
+
.and(...pathMatchTests("**/cool.ts", "**/wow.ts"));
|
|
45
|
+
console.log(matcher("packages/node/file-scan/src/cool.ts"));
|
|
46
|
+
console.log(matcher("packages/node/file-scan/.src/cool.ts"));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBMEMsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQWE3QyxnRUFBZ0U7QUFDaEUsU0FBUyxNQUFNLENBQUMsT0FBdUI7SUFDckMsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNoQyxNQUFNLE9BQU8sR0FBRyxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0RCxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLE1BQU0sVUFBVSxjQUFjLENBQzVCLEdBQUcsTUFBc0Q7SUFFekQsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNqRSxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQzNCLEdBQUcsTUFBc0Q7SUFFekQsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDeEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0QsT0FBTyxLQUFLO1NBQ1QsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNSLE1BQU0sQ0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25GLENBQUM7QUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckIsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDOUMsTUFBTSxFQUFFO1NBQ1IsR0FBRyxDQUFDLEdBQUcsY0FBYyxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ3JELE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLHFDQUFxQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGF0aCBtYXRjaGluZyBhbmQgcHJlZGljYXRlIGNvbXBvc2l0aW9uIGZvciBmaWxlIHNjYW5uaW5nIGFuZCB3YXRjaGluZy5cbiAqXG4gKiB7QGxpbmsgdG9QYXRoTWF0Y2hlcn0gY29tcGlsZXMgZ2xvYnMgaW50byB7QGxpbmsgUHJlZGljYXRlfSB2YWx1ZXMgZnJvbVxuICogc2hhcmVkLWNvcmUgKGBhbmRgIC8gYG9yYCAvIGBuZWdhdGVgKSBmb3IgdXNlIGJ5IHtAbGluayBmaW5kRmlsZXN9IGFuZFxuICoge0BsaW5rIHdhdGNoRmlsZXN9LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBvYmplY3QsIHByZWRpY2F0ZSwgdHlwZSBQcmVkaWNhdGUsIHR5cGUgUHJlZGljYXRlRnVuY3Rpb24gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgTWluaW1hdGNoIH0gZnJvbSBcIm1pbmltYXRjaFwiO1xuaW1wb3J0IHsgaWdub3JlUGF0aE1hdGNoZXIgfSBmcm9tIFwiLi9pZ25vcmVcIjtcblxuZXhwb3J0IHR5cGUgUGF0aE1hdGNoUHJlZGljYXRlID0gUHJlZGljYXRlRnVuY3Rpb248c3RyaW5nPjtcblxuLyoqIEEgY29tcG9zYWJsZSBwYXRoIHRlc3QgKGB0cnVlYCA9PSBtYXRjaCkuICovXG5leHBvcnQgdHlwZSBQYXRoTWF0Y2hlciA9IFByZWRpY2F0ZTxzdHJpbmc+O1xuXG4vKipcbiAqIEFueXRoaW5nIHtAbGluayB0b1BhdGhNYXRjaGVyfSBhY2NlcHRzOiBhIGdsb2Igc3RyaW5nIChjb21waWxlZCB3aXRoXG4gKiBgZG90OiB0cnVlYCksIG9yIGEgY3VzdG9tIGAocGF0aCkgPT4gYm9vbGVhbmAuXG4gKi9cbmV4cG9ydCB0eXBlIFBhdGhNYXRjaElucHV0ID0gUGF0aE1hdGNoUHJlZGljYXRlIHwgc3RyaW5nO1xuXG4vKiogTm9ybWFsaXplcyBhIHtAbGluayBQYXRoTWF0Y2hJbnB1dH0gdG8gYSBwbGFpbiBwYXRoIHRlc3QuICovXG5mdW5jdGlvbiB0b1Rlc3QocGF0dGVybjogUGF0aE1hdGNoSW5wdXQpOiBQYXRoTWF0Y2hQcmVkaWNhdGUge1xuICBpZiAodHlwZW9mIHBhdHRlcm4gPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBtYXRjaGVyID0gbmV3IE1pbmltYXRjaChwYXR0ZXJuLCB7IGRvdDogdHJ1ZSB9KTtcbiAgICByZXR1cm4gKHBhdGgpID0+IG1hdGNoZXIubWF0Y2gocGF0aCk7XG4gIH1cbiAgcmV0dXJuIHBhdHRlcm47XG59XG5cbi8qKiBDb21waWxlcyBwYXRoIG1hdGNoIGlucHV0cyB0byBwcmVkaWNhdGUgZnVuY3Rpb25zIGZvciBgLmFuZCgpYCAvIGAub3IoKWAuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0aE1hdGNoVGVzdHMoXG4gIC4uLmlucHV0czogcmVhZG9ubHkgKFBhdGhNYXRjaElucHV0IHwgbnVsbCB8IHVuZGVmaW5lZClbXVxuKTogcmVhZG9ubHkgUGF0aE1hdGNoUHJlZGljYXRlW10ge1xuICByZXR1cm4gb2JqZWN0LnNlcXVlbmNlKGlucHV0cykubm9uTnVsbCgpLm1hcCh0b1Rlc3QpLnRvQXJyYXkoKTtcbn1cblxuLyoqXG4gKiBDb21iaW5lcyBvbmUgb3IgbW9yZSBwYXR0ZXJucyBpbnRvIGEgc2luZ2xlIHtAbGluayBQYXRoTWF0Y2hlcn0gKE9SJ2QpLlxuICogU3RyaW5ncyBhcmUgY29tcGlsZWQgd2l0aCBgZG90OiB0cnVlYDsgcHJlZGljYXRlcyBhcmUgdXNlZCBhcy1pcztcbiAqIGBudWxsYC9gdW5kZWZpbmVkYCBlbnRyaWVzIGFyZSBza2lwcGVkLiBXaXRoIG5vIG1hdGNoaW5nIHBhdHRlcm5zIHRoZSByZXN1bHRcbiAqIGFsd2F5cyByZXR1cm5zIGBmYWxzZWAuXG4gKlxuICogQHBhcmFtIHBhdHRlcm5zIC0gR2xvYnMgYW5kL29yIHByZWRpY2F0ZXMgdG8gT1IgdG9nZXRoZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1BhdGhNYXRjaGVyKFxuICAuLi5pbnB1dHM6IHJlYWRvbmx5IChQYXRoTWF0Y2hJbnB1dCB8IG51bGwgfCB1bmRlZmluZWQpW11cbik6IFBhdGhNYXRjaGVyIHtcbiAgY29uc3QgdGVzdHMgPSBwYXRoTWF0Y2hUZXN0cyguLi5pbnB1dHMpO1xuICBpZiAodGVzdHMubGVuZ3RoID09PSAwKSByZXR1cm4gcHJlZGljYXRlLmNyZWF0ZSgoKSA9PiBmYWxzZSk7XG4gIHJldHVybiB0ZXN0c1xuICAgIC5zbGljZSgxKVxuICAgIC5yZWR1Y2U8UGF0aE1hdGNoZXI+KChhY2MsIHRlc3QpID0+IGFjYy5vcih0ZXN0KSwgcHJlZGljYXRlLmNyZWF0ZSh0ZXN0c1swXSEpKTtcbn1cblxuaWYgKGltcG9ydC5tZXRhLm1haW4pIHtcbiAgY29uc3QgbWF0Y2hlciA9IGlnbm9yZVBhdGhNYXRjaGVyKHsgdGVzdDogdHJ1ZSB9KVxuICAgIC5uZWdhdGUoKVxuICAgIC5hbmQoLi4ucGF0aE1hdGNoVGVzdHMoXCIqKi9jb29sLnRzXCIsIFwiKiovd293LnRzXCIpKTtcbiAgY29uc29sZS5sb2cobWF0Y2hlcihcInBhY2thZ2VzL25vZGUvZmlsZS1zY2FuL3NyYy9jb29sLnRzXCIpKTtcbiAgY29uc29sZS5sb2cobWF0Y2hlcihcInBhY2thZ2VzL25vZGUvZmlsZS1zY2FuLy5zcmMvY29vbC50c1wiKSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Glob pattern builders shared by ignore groups and matchers.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Returns a glob matching all descendants of directories named `name`.
|
|
8
|
+
*
|
|
9
|
+
* By default, glob metacharacters in `name` are escaped so it is treated
|
|
10
|
+
* literally. Pass `false` for `escape` when `name` intentionally contains glob
|
|
11
|
+
* syntax.
|
|
12
|
+
*
|
|
13
|
+
* @param name - Directory base name (e.g. `node_modules`).
|
|
14
|
+
* @param escape - When `true` (default), escape glob metacharacters in `name`.
|
|
15
|
+
*/
|
|
16
|
+
export declare function directoryNamePattern(name: string, escape?: boolean): string;
|
|
17
|
+
/**
|
|
18
|
+
* Returns a glob matching files with extension `extension` at any depth.
|
|
19
|
+
*
|
|
20
|
+
* @param extension - Extension with or without a leading dot (e.g. `log` or `.log`).
|
|
21
|
+
* @param escape - When `true` (default), escape glob metacharacters in `extension`.
|
|
22
|
+
*/
|
|
23
|
+
export declare function fileExtensionPattern(extension: string, escape?: boolean): string;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Glob pattern builders shared by ignore groups and matchers.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
/** Glob metacharacters; escaped so a directory or file name is matched literally. */
|
|
7
|
+
const ESCAPE_GLOB_REGEXP = /([*?[\]{}()!+@\\])/g;
|
|
8
|
+
/**
|
|
9
|
+
* Returns a glob matching all descendants of directories named `name`.
|
|
10
|
+
*
|
|
11
|
+
* By default, glob metacharacters in `name` are escaped so it is treated
|
|
12
|
+
* literally. Pass `false` for `escape` when `name` intentionally contains glob
|
|
13
|
+
* syntax.
|
|
14
|
+
*
|
|
15
|
+
* @param name - Directory base name (e.g. `node_modules`).
|
|
16
|
+
* @param escape - When `true` (default), escape glob metacharacters in `name`.
|
|
17
|
+
*/
|
|
18
|
+
export function directoryNamePattern(name, escape = true) {
|
|
19
|
+
return `**/${escape ? name.replace(ESCAPE_GLOB_REGEXP, "\\$1") : name}/**`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Returns a glob matching files with extension `extension` at any depth.
|
|
23
|
+
*
|
|
24
|
+
* @param extension - Extension with or without a leading dot (e.g. `log` or `.log`).
|
|
25
|
+
* @param escape - When `true` (default), escape glob metacharacters in `extension`.
|
|
26
|
+
*/
|
|
27
|
+
export function fileExtensionPattern(extension, escape = true) {
|
|
28
|
+
const bare = extension.startsWith(".") ? extension.slice(1) : extension;
|
|
29
|
+
return `**/*.${escape ? bare.replace(ESCAPE_GLOB_REGEXP, "\\$1") : bare}`;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0dGVybi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXR0ZXJuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxxRkFBcUY7QUFDckYsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztBQUVqRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsSUFBWSxFQUFFLE1BQU0sR0FBRyxJQUFJO0lBQzlELE9BQU8sTUFBTSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQzdFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxTQUFpQixFQUFFLE1BQU0sR0FBRyxJQUFJO0lBQ25FLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RSxPQUFPLFFBQVEsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHbG9iIHBhdHRlcm4gYnVpbGRlcnMgc2hhcmVkIGJ5IGlnbm9yZSBncm91cHMgYW5kIG1hdGNoZXJzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG4vKiogR2xvYiBtZXRhY2hhcmFjdGVyczsgZXNjYXBlZCBzbyBhIGRpcmVjdG9yeSBvciBmaWxlIG5hbWUgaXMgbWF0Y2hlZCBsaXRlcmFsbHkuICovXG5jb25zdCBFU0NBUEVfR0xPQl9SRUdFWFAgPSAvKFsqP1tcXF17fSgpIStAXFxcXF0pL2c7XG5cbi8qKlxuICogUmV0dXJucyBhIGdsb2IgbWF0Y2hpbmcgYWxsIGRlc2NlbmRhbnRzIG9mIGRpcmVjdG9yaWVzIG5hbWVkIGBuYW1lYC5cbiAqXG4gKiBCeSBkZWZhdWx0LCBnbG9iIG1ldGFjaGFyYWN0ZXJzIGluIGBuYW1lYCBhcmUgZXNjYXBlZCBzbyBpdCBpcyB0cmVhdGVkXG4gKiBsaXRlcmFsbHkuIFBhc3MgYGZhbHNlYCBmb3IgYGVzY2FwZWAgd2hlbiBgbmFtZWAgaW50ZW50aW9uYWxseSBjb250YWlucyBnbG9iXG4gKiBzeW50YXguXG4gKlxuICogQHBhcmFtIG5hbWUgLSBEaXJlY3RvcnkgYmFzZSBuYW1lIChlLmcuIGBub2RlX21vZHVsZXNgKS5cbiAqIEBwYXJhbSBlc2NhcGUgLSBXaGVuIGB0cnVlYCAoZGVmYXVsdCksIGVzY2FwZSBnbG9iIG1ldGFjaGFyYWN0ZXJzIGluIGBuYW1lYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdG9yeU5hbWVQYXR0ZXJuKG5hbWU6IHN0cmluZywgZXNjYXBlID0gdHJ1ZSk6IHN0cmluZyB7XG4gIHJldHVybiBgKiovJHtlc2NhcGUgPyBuYW1lLnJlcGxhY2UoRVNDQVBFX0dMT0JfUkVHRVhQLCBcIlxcXFwkMVwiKSA6IG5hbWV9LyoqYDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZ2xvYiBtYXRjaGluZyBmaWxlcyB3aXRoIGV4dGVuc2lvbiBgZXh0ZW5zaW9uYCBhdCBhbnkgZGVwdGguXG4gKlxuICogQHBhcmFtIGV4dGVuc2lvbiAtIEV4dGVuc2lvbiB3aXRoIG9yIHdpdGhvdXQgYSBsZWFkaW5nIGRvdCAoZS5nLiBgbG9nYCBvciBgLmxvZ2ApLlxuICogQHBhcmFtIGVzY2FwZSAtIFdoZW4gYHRydWVgIChkZWZhdWx0KSwgZXNjYXBlIGdsb2IgbWV0YWNoYXJhY3RlcnMgaW4gYGV4dGVuc2lvbmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxlRXh0ZW5zaW9uUGF0dGVybihleHRlbnNpb246IHN0cmluZywgZXNjYXBlID0gdHJ1ZSk6IHN0cmluZyB7XG4gIGNvbnN0IGJhcmUgPSBleHRlbnNpb24uc3RhcnRzV2l0aChcIi5cIikgPyBleHRlbnNpb24uc2xpY2UoMSkgOiBleHRlbnNpb247XG4gIHJldHVybiBgKiovKi4ke2VzY2FwZSA/IGJhcmUucmVwbGFjZShFU0NBUEVfR0xPQl9SRUdFWFAsIFwiXFxcXCQxXCIpIDogYmFyZX1gO1xufVxuIl19
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { IgnorePatternOptions } from "./ignore.js";
|
|
2
|
+
import { PathMatchInput } from "./match.js";
|
|
3
|
+
export declare const FOLLOW_SYMLINKS_DEFAULT = false;
|
|
4
|
+
export interface FileScanOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Base directory used to resolve relative paths.
|
|
7
|
+
*/
|
|
8
|
+
cwd?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Ignore files or directories matching these patterns or predicates.
|
|
11
|
+
*/
|
|
12
|
+
ignore?: PathMatchInput | readonly PathMatchInput[];
|
|
13
|
+
ignoreOptions?: FileScanIgnoreOptions;
|
|
14
|
+
/**
|
|
15
|
+
* Follow symbolic links.
|
|
16
|
+
*
|
|
17
|
+
* Maps to:
|
|
18
|
+
* glob: follow
|
|
19
|
+
* chokidar: followSymlinks
|
|
20
|
+
*/
|
|
21
|
+
followSymlinks?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Abort an in-progress operation.
|
|
24
|
+
*
|
|
25
|
+
* Ignored by chokidar after the watcher has been created.
|
|
26
|
+
*/
|
|
27
|
+
signal?: AbortSignal;
|
|
28
|
+
}
|
|
29
|
+
/** Options controlling the generated ignore pattern list. */
|
|
30
|
+
export type FileScanIgnoreOptions = IgnorePatternOptions;
|
package/lib/src/scan.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export const FOLLOW_SYMLINKS_DEFAULT = false;
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2FuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElnbm9yZVBhdHRlcm5PcHRpb25zIH0gZnJvbSBcIi4vaWdub3JlXCI7XG5pbXBvcnQgeyBQYXRoTWF0Y2hJbnB1dCB9IGZyb20gXCIuL21hdGNoXCI7XG5cbmV4cG9ydCBjb25zdCBGT0xMT1dfU1lNTElOS1NfREVGQVVMVCA9IGZhbHNlO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVTY2FuT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBCYXNlIGRpcmVjdG9yeSB1c2VkIHRvIHJlc29sdmUgcmVsYXRpdmUgcGF0aHMuXG4gICAqL1xuICBjd2Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElnbm9yZSBmaWxlcyBvciBkaXJlY3RvcmllcyBtYXRjaGluZyB0aGVzZSBwYXR0ZXJucyBvciBwcmVkaWNhdGVzLlxuICAgKi9cbiAgaWdub3JlPzogUGF0aE1hdGNoSW5wdXQgfCByZWFkb25seSBQYXRoTWF0Y2hJbnB1dFtdO1xuICBpZ25vcmVPcHRpb25zPzogRmlsZVNjYW5JZ25vcmVPcHRpb25zO1xuICAvKipcbiAgICogRm9sbG93IHN5bWJvbGljIGxpbmtzLlxuICAgKlxuICAgKiBNYXBzIHRvOlxuICAgKiAgIGdsb2I6IGZvbGxvd1xuICAgKiAgIGNob2tpZGFyOiBmb2xsb3dTeW1saW5rc1xuICAgKi9cbiAgZm9sbG93U3ltbGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBYm9ydCBhbiBpbi1wcm9ncmVzcyBvcGVyYXRpb24uXG4gICAqXG4gICAqIElnbm9yZWQgYnkgY2hva2lkYXIgYWZ0ZXIgdGhlIHdhdGNoZXIgaGFzIGJlZW4gY3JlYXRlZC5cbiAgICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKiogT3B0aW9ucyBjb250cm9sbGluZyB0aGUgZ2VuZXJhdGVkIGlnbm9yZSBwYXR0ZXJuIGxpc3QuICovXG5leHBvcnQgdHlwZSBGaWxlU2Nhbklnbm9yZU9wdGlvbnMgPSBJZ25vcmVQYXR0ZXJuT3B0aW9ucztcbiJdfQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ChokidarOptions, MatchFunction } from "chokidar";
|
|
2
|
+
import { FileScanOptions } from "./scan.js";
|
|
3
|
+
export interface FileWatchOptions extends Omit<ChokidarOptions, "ignored">, Omit<FileScanOptions, "ignore"> {
|
|
4
|
+
ignore?: string | string[] | MatchFunction | MatchFunction[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Watches files and directories for real-time changes, applying the shared
|
|
8
|
+
* ignore groups so it prunes the same paths {@link findFiles} skips for the
|
|
9
|
+
* same patterns.
|
|
10
|
+
*/
|
|
11
|
+
export declare function watchFiles(paths: string | string[], options?: FileWatchOptions): import("chokidar").FSWatcher;
|
package/lib/src/watch.js
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { isAbsolute, relative, resolve } from "path";
|
|
2
|
+
import { watch } from "chokidar";
|
|
3
|
+
import { hasMagic } from "glob";
|
|
4
|
+
import { findFiles } from "./find.js";
|
|
5
|
+
import { ignorePathMatcher } from "./ignore.js";
|
|
6
|
+
import { pathMatchTests } from "./match.js";
|
|
7
|
+
import { FOLLOW_SYMLINKS_DEFAULT } from "./scan.js";
|
|
8
|
+
/**
|
|
9
|
+
* Watches files and directories for real-time changes, applying the shared
|
|
10
|
+
* ignore groups so it prunes the same paths {@link findFiles} skips for the
|
|
11
|
+
* same patterns.
|
|
12
|
+
*/
|
|
13
|
+
export function watchFiles(paths, options) {
|
|
14
|
+
const normalized = toNormalizedFileWatchOptions(options);
|
|
15
|
+
const { ignored, cwd, followSymlinks, ...chokidarOptions } = normalized;
|
|
16
|
+
const { paths: literals, globs } = partitionPaths(paths);
|
|
17
|
+
let watchPaths;
|
|
18
|
+
if (globs.length > 0) {
|
|
19
|
+
const distinctWatchPaths = new Set(literals);
|
|
20
|
+
for (const path of findFiles(globs, toFindFilesOptions(normalized))) {
|
|
21
|
+
distinctWatchPaths.add(path);
|
|
22
|
+
}
|
|
23
|
+
watchPaths = [...distinctWatchPaths];
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
watchPaths = literals;
|
|
27
|
+
}
|
|
28
|
+
return watch(watchPaths, {
|
|
29
|
+
...chokidarOptions,
|
|
30
|
+
cwd,
|
|
31
|
+
followSymlinks,
|
|
32
|
+
ignored,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function partitionPaths(paths) {
|
|
36
|
+
const globs = [];
|
|
37
|
+
const literals = [];
|
|
38
|
+
for (const path of Array.isArray(paths) ? paths : [paths]) {
|
|
39
|
+
(hasMagic(path) ? globs : literals).push(path);
|
|
40
|
+
}
|
|
41
|
+
return { paths: literals, globs };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Builds {@link NormalizedFileWatchOptions} first: all caller ignore inputs and
|
|
45
|
+
* built-in groups are consolidated into one chokidar {@link MatchFunction}. When
|
|
46
|
+
* `stats` marks a directory, the matcher also tests `path + "/"` for pruning.
|
|
47
|
+
*/
|
|
48
|
+
function toNormalizedFileWatchOptions(options) {
|
|
49
|
+
const { cwd, ignore, followSymlinks, ignoreOptions, ...chokidarOptions } = options ?? {};
|
|
50
|
+
return {
|
|
51
|
+
...chokidarOptions,
|
|
52
|
+
cwd: cwd ?? process.cwd(),
|
|
53
|
+
followSymlinks: followSymlinks ?? FOLLOW_SYMLINKS_DEFAULT,
|
|
54
|
+
ignored: toWatchMatchFunction(ignore, ignoreOptions, cwd ?? process.cwd()),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/** Glob expansion reuses the normalized ignore matcher as a cwd-relative path predicate. */
|
|
58
|
+
function toFindFilesOptions(normalized) {
|
|
59
|
+
const { ignored, cwd, followSymlinks } = normalized;
|
|
60
|
+
return {
|
|
61
|
+
cwd,
|
|
62
|
+
followSymlinks,
|
|
63
|
+
ignore: (path) => ignored(path, undefined),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Consolidates built-in ignore groups, caller glob patterns, and caller
|
|
68
|
+
* {@link MatchFunction}s into one ignore test. Directory pruning uses `stats`
|
|
69
|
+
* when chokidar supplies it; glob expansion passes `undefined`.
|
|
70
|
+
*/
|
|
71
|
+
function toWatchMatchFunction(ignore, ignoreOptions, cwd) {
|
|
72
|
+
const patterns = [];
|
|
73
|
+
const functions = [];
|
|
74
|
+
if (ignore !== undefined) {
|
|
75
|
+
for (const item of Array.isArray(ignore) ? ignore : [ignore]) {
|
|
76
|
+
if (typeof item === "string")
|
|
77
|
+
patterns.push(item);
|
|
78
|
+
else
|
|
79
|
+
functions.push(item);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
let matcher = ignorePathMatcher(ignoreOptions);
|
|
83
|
+
if (patterns.length > 0)
|
|
84
|
+
matcher = matcher.or(...pathMatchTests(...patterns));
|
|
85
|
+
const matchPath = (path, stats) => {
|
|
86
|
+
const rel = toCwdRelativePath(path, cwd);
|
|
87
|
+
if (matcher(rel))
|
|
88
|
+
return true;
|
|
89
|
+
for (const fn of functions) {
|
|
90
|
+
if (fn(rel, stats))
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
if (stats?.isDirectory()) {
|
|
94
|
+
const directoryPath = rel + "/";
|
|
95
|
+
if (matcher(directoryPath))
|
|
96
|
+
return true;
|
|
97
|
+
for (const fn of functions) {
|
|
98
|
+
if (fn(directoryPath, stats))
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
};
|
|
104
|
+
return matchPath;
|
|
105
|
+
}
|
|
106
|
+
/** Aligns chokidar paths with the cwd-relative form {@link findFiles} uses. */
|
|
107
|
+
function toCwdRelativePath(path, cwd) {
|
|
108
|
+
if (!isAbsolute(path))
|
|
109
|
+
return path;
|
|
110
|
+
const rel = relative(cwd, path);
|
|
111
|
+
return rel === "" ? "." : rel;
|
|
112
|
+
}
|
|
113
|
+
// Manual demo: run this file directly (e.g. `tsx src/watch.ts`) to watch this
|
|
114
|
+
// package and log every file event as it happens.
|
|
115
|
+
if (import.meta.main) {
|
|
116
|
+
const dir = import.meta.dirname;
|
|
117
|
+
console.log("--- Starting File Watcher ---");
|
|
118
|
+
let cwd = resolve(dir, "..");
|
|
119
|
+
cwd = "/Users/reggie.pierce/Projects/github-reggie-db/dbx-tools";
|
|
120
|
+
console.log(`Working Directory: ${cwd}`);
|
|
121
|
+
const watcher = watchFiles("**/src/**", {
|
|
122
|
+
cwd,
|
|
123
|
+
ignoreInitial: false,
|
|
124
|
+
ignore: ["**/index.ts", "**/core/**"],
|
|
125
|
+
ignoreOptions: {
|
|
126
|
+
temp: false,
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
watcher.on("all", (event, path) => {
|
|
130
|
+
console.log(`[${event.toUpperCase()}] ${path}`);
|
|
131
|
+
});
|
|
132
|
+
watcher.on("error", (error) => {
|
|
133
|
+
console.error("Watcher error:", error);
|
|
134
|
+
});
|
|
135
|
+
console.log("Watcher started");
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JELE9BQU8sRUFBa0MsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEMsT0FBTyxFQUFFLFNBQVMsRUFBd0IsTUFBTSxRQUFRLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxFQUEwQyx1QkFBdUIsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQVd6Rjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUF3QixFQUFFLE9BQTBCO0lBQzdFLE1BQU0sVUFBVSxHQUFHLDRCQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxHQUFHLGVBQWUsRUFBRSxHQUFHLFVBQVUsQ0FBQztJQUN4RSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFekQsSUFBSSxVQUFvQixDQUFDO0lBQ3pCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyQixNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLEtBQUssTUFBTSxJQUFJLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDcEUsa0JBQWtCLENBQUMsR0FBRyxD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LElBQUksQ0FBQyxPQUFPLENBQUM7SUFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQzdDLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0IsR0FBRyxHQUFHLDBEQUEwRCxDQUFDO0lBQ2pFLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFFekMsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLFdBQVcsRUFBRTtRQUN0QyxHQUFHO1FBQ0gsYUFBYSxFQUFFLEtBQUs7UUFDcEIsTUFBTSxFQUFFLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQztRQUNyQyxhQUFhLEVBQUU7WUFDYixJQUFJLEVBQUUsS0FBSztTQUNaO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFhLEVBQUUsSUFBWSxFQUFFLEVBQUU7UUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGF0cyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgaXNBYnNvbHV0ZSwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgQ2hva2lkYXJPcHRpb25zLCBNYXRjaEZ1bmN0aW9uLCB3YXRjaCB9IGZyb20gXCJjaG9raWRhclwiO1xuaW1wb3J0IHsgaGFzTWFnaWMgfSBmcm9tIFwiZ2xvYlwiO1xuaW1wb3J0IHsgZmluZEZpbGVzLCB0eXBlIEZpbGVGaW5kT3B0aW9ucyB9IGZyb20gXCIuL2ZpbmRcIjtcbmltcG9ydCB7IGlnbm9yZVBhdGhNYXRjaGVyIH0gZnJvbSBcIi4vaWdub3JlXCI7XG5pbXBvcnQgeyBwYXRoTWF0Y2hUZXN0cyB9IGZyb20gXCIuL21hdGNoXCI7XG5pbXBvcnQgeyBGaWxlU2Nhbklnbm9yZU9wdGlvbnMsIEZpbGVTY2FuT3B0aW9ucywgRk9MTE9XX1NZTUxJTktTX0RFRkFVTFQgfSBmcm9tIFwiLi9zY2FuXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVdhdGNoT3B0aW9uc1xuICBleHRlbmRzIE9taXQ8Q2hva2lkYXJPcHRpb25zLCBcImlnbm9yZWRcIj4sIE9taXQ8RmlsZVNjYW5PcHRpb25zLCBcImlnbm9yZVwiPiB7XG4gIGlnbm9yZT86IHN0cmluZyB8IHN0cmluZ1tdIHwgTWF0Y2hGdW5jdGlvbiB8IE1hdGNoRnVuY3Rpb25bXTtcbn1cblxuaW50ZXJmYWNlIE5vcm1hbGl6ZWRGaWxlV2F0Y2hPcHRpb25zIGV4dGVuZHMgT21pdDxGaWxlV2F0Y2hPcHRpb25zLCBcImlnbm9yZVwiIHwgXCJpZ25vcmVPcHRpb25zXCI+IHtcbiAgaWdub3JlZDogTWF0Y2hGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBXYXRjaGVzIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBmb3IgcmVhbC10aW1lIGNoYW5nZXMsIGFwcGx5aW5nIHRoZSBzaGFyZWRcbiAqIGlnbm9yZSBncm91cHMgc28gaXQgcHJ1bmVzIHRoZSBzYW1lIHBhdGhzIHtAbGluayBmaW5kRmlsZXN9IHNraXBzIGZvciB0aGVcbiAqIHNhbWUgcGF0dGVybnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXRjaEZpbGVzKHBhdGhzOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3B0aW9ucz86IEZpbGVXYXRjaE9wdGlvbnMpIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHRvTm9ybWFsaXplZEZpbGVXYXRjaE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHsgaWdub3JlZCwgY3dkLCBmb2xsb3dTeW1saW5rcywgLi4uY2hva2lkYXJPcHRpb25zIH0gPSBub3JtYWxpemVkO1xuICBjb25zdCB7IHBhdGhzOiBsaXRlcmFscywgZ2xvYnMgfSA9IHBhcnRpdGlvblBhdGhzKHBhdGhzKTtcblxuICBsZXQgd2F0Y2hQYXRoczogc3RyaW5nW107XG4gIGlmIChnbG9icy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZGlzdGluY3RXYXRjaFBhdGhzID0gbmV3IFNldChsaXRlcmFscyk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGZpbmRGaWxlcyhnbG9icywgdG9GaW5kRmlsZXNPcHRpb25zKG5vcm1hbGl6ZWQpKSkge1xuICAgICAgZGlzdGluY3RXYXRjaFBhdGhzLmFkZChwYXRoKTtcbiAgICB9XG4gICAgd2F0Y2hQYXRocyA9IFsuLi5kaXN0aW5jdFdhdGNoUGF0aHNdO1xuICB9IGVsc2Uge1xuICAgIHdhdGNoUGF0aHMgPSBsaXRlcmFscztcbiAgfVxuXG4gIHJldHVybiB3YXRjaCh3YXRjaFBhdGhzLCB7XG4gICAgLi4uY2hva2lkYXJPcHRpb25zLFxuICAgIGN3ZCxcbiAgICBmb2xsb3dTeW1saW5rcyxcbiAgICBpZ25vcmVkLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFydGl0aW9uUGF0aHMocGF0aHM6IHN0cmluZyB8IHN0cmluZ1tdKTogeyBwYXRoczogc3RyaW5nW107IGdsb2JzOiBzdHJpbmdbXSB9IHtcbiAgY29uc3QgZ2xvYnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGxpdGVyYWxzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhdGggb2YgQXJyYXkuaXNBcnJheShwYXRocykgPyBwYXRocyA6IFtwYXRoc10pIHtcbiAgICAoaGFzTWFnaWMocGF0aCkgPyBnbG9icyA6IGxpdGVyYWxzKS5wdXNoKHBhdGgpO1xuICB9XG4gIHJldHVybiB7IHBhdGhzOiBsaXRlcmFscywgZ2xvYnMgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMge0BsaW5rIE5vcm1hbGl6ZWRGaWxlV2F0Y2hPcHRpb25zfSBmaXJzdDogYWxsIGNhbGxlciBpZ25vcmUgaW5wdXRzIGFuZFxuICogYnVpbHQtaW4gZ3JvdXBzIGFyZSBjb25zb2xpZGF0ZWQgaW50byBvbmUgY2hva2lkYXIge0BsaW5rIE1hdGNoRnVuY3Rpb259LiBXaGVuXG4gKiBgc3RhdHNgIG1hcmtzIGEgZGlyZWN0b3J5LCB0aGUgbWF0Y2hlciBhbHNvIHRlc3RzIGBwYXRoICsgXCIvXCJgIGZvciBwcnVuaW5nLlxuICovXG5mdW5jdGlvbiB0b05vcm1hbGl6ZWRGaWxlV2F0Y2hPcHRpb25zKG9wdGlvbnM/OiBGaWxlV2F0Y2hPcHRpb25zKTogTm9ybWFsaXplZEZpbGVXYXRjaE9wdGlvbnMgJiB7XG4gIGN3ZDogc3RyaW5nO1xuICBmb2xsb3dTeW1saW5rczogYm9vbGVhbjtcbn0ge1xuICBjb25zdCB7IGN3ZCwgaWdub3JlLCBmb2xsb3dTeW1saW5rcywgaWdub3JlT3B0aW9ucywgLi4uY2hva2lkYXJPcHRpb25zIH0gPSBvcHRpb25zID8/IHt9O1xuICByZXR1cm4ge1xuICAgIC4uLmNob2tpZGFyT3B0aW9ucyxcbiAgICBjd2Q6IGN3ZCA/PyBwcm9jZXNzLmN3ZCgpLFxuICAgIGZvbGxvd1N5bWxpbmtzOiBmb2xsb3dTeW1saW5rcyA/PyBGT0xMT1dfU1lNTElOS1NfREVGQVVMVCxcbiAgICBpZ25vcmVkOiB0b1dhdGNoTWF0Y2hGdW5jdGlvbihpZ25vcmUsIGlnbm9yZU9wdGlvbnMsIGN3ZCA/PyBwcm9jZXNzLmN3ZCgpKSxcbiAgfTtcbn1cblxuLyoqIEdsb2IgZXhwYW5zaW9uIHJldXNlcyB0aGUgbm9ybWFsaXplZCBpZ25vcmUgbWF0Y2hlciBhcyBhIGN3ZC1yZWxhdGl2ZSBwYXRoIHByZWRpY2F0ZS4gKi9cbmZ1bmN0aW9uIHRvRmluZEZpbGVzT3B0aW9ucyhcbiAgbm9ybWFsaXplZDogTm9ybWFsaXplZEZpbGVXYXRjaE9wdGlvbnMgJiB7IGN3ZDogc3RyaW5nOyBmb2xsb3dTeW1saW5rczogYm9vbGVhbiB9LFxuKTogRmlsZUZpbmRPcHRpb25zIHtcbiAgY29uc3QgeyBpZ25vcmVkLCBjd2QsIGZvbGxvd1N5bWxpbmtzIH0gPSBub3JtYWxpemVkO1xuICByZXR1cm4ge1xuICAgIGN3ZCxcbiAgICBmb2xsb3dTeW1saW5rcyxcbiAgICBpZ25vcmU6IChwYXRoKSA9PiBpZ25vcmVkKHBhdGgsIHVuZGVmaW5lZCksXG4gIH07XG59XG5cbi8qKlxuICogQ29uc29saWRhdGVzIGJ1aWx0LWluIGlnbm9yZSBncm91cHMsIGNhbGxlciBnbG9iIHBhdHRlcm5zLCBhbmQgY2FsbGVyXG4gKiB7QGxpbmsgTWF0Y2hGdW5jdGlvbn1zIGludG8gb25lIGlnbm9yZSB0ZXN0LiBEaXJlY3RvcnkgcHJ1bmluZyB1c2VzIGBzdGF0c2BcbiAqIHdoZW4gY2hva2lkYXIgc3VwcGxpZXMgaXQ7IGdsb2IgZXhwYW5zaW9uIHBhc3NlcyBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gdG9XYXRjaE1hdGNoRnVuY3Rpb24oXG4gIGlnbm9yZTogRmlsZVdhdGNoT3B0aW9uc1tcImlnbm9yZVwiXSB8IHVuZGVmaW5lZCxcbiAgaWdub3JlT3B0aW9uczogRmlsZVNjYW5JZ25vcmVPcHRpb25zIHwgdW5kZWZpbmVkLFxuICBjd2Q6IHN0cmluZyxcbik6IE1hdGNoRnVuY3Rpb24ge1xuICBjb25zdCBwYXR0ZXJuczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZnVuY3Rpb25zOiBNYXRjaEZ1bmN0aW9uW10gPSBbXTtcblxuICBpZiAoaWdub3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgQXJyYXkuaXNBcnJheShpZ25vcmUpID8gaWdub3JlIDogW2lnbm9yZV0pIHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIikgcGF0dGVybnMucHVzaChpdGVtKTtcbiAgICAgIGVsc2UgZnVuY3Rpb25zLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgbGV0IG1hdGNoZXIgPSBpZ25vcmVQYXRoTWF0Y2hlcihpZ25vcmVPcHRpb25zKTtcbiAgaWYgKHBhdHRlcm5zLmxlbmd0aCA+IDApIG1hdGNoZXIgPSBtYXRjaGVyLm9yKC4uLnBhdGhNYXRjaFRlc3RzKC4uLnBhdHRlcm5zKSk7XG5cbiAgY29uc3QgbWF0Y2hQYXRoID0gKHBhdGg6IHN0cmluZywgc3RhdHM/OiBTdGF0cyk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IHJlbCA9IHRvQ3dkUmVsYXRpdmVQYXRoKHBhdGgsIGN3ZCk7XG4gICAgaWYgKG1hdGNoZXIocmVsKSkgcmV0dXJuIHRydWU7XG4gICAgZm9yIChjb25zdCBmbiBvZiBmdW5jdGlvbnMpIHtcbiAgICAgIGlmIChmbihyZWwsIHN0YXRzKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzdGF0cz8uaXNEaXJlY3RvcnkoKSkge1xuICAgICAgY29uc3QgZGlyZWN0b3J5UGF0aCA9IHJlbCArIFwiL1wiO1xuICAgICAgaWYgKG1hdGNoZXIoZGlyZWN0b3J5UGF0aCkpIHJldHVybiB0cnVlO1xuICAgICAgZm9yIChjb25zdCBmbiBvZiBmdW5jdGlvbnMpIHtcbiAgICAgICAgaWYgKGZuKGRpcmVjdG9yeVBhdGgsIHN0YXRzKSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICByZXR1cm4gbWF0Y2hQYXRoO1xufVxuXG4vKiogQWxpZ25zIGNob2tpZGFyIHBhdGhzIHdpdGggdGhlIGN3ZC1yZWxhdGl2ZSBmb3JtIHtAbGluayBmaW5kRmlsZXN9IHVzZXMuICovXG5mdW5jdGlvbiB0b0N3ZFJlbGF0aXZlUGF0aChwYXRoOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFpc0Fic29sdXRlKHBhdGgpKSByZXR1cm4gcGF0aDtcbiAgY29uc3QgcmVsID0gcmVsYXRpdmUoY3dkLCBwYXRoKTtcbiAgcmV0dXJuIHJlbCA9PT0gXCJcIiA/IFwiLlwiIDogcmVsO1xufVxuXG4vLyBNYW51YWwgZGVtbzogcnVuIHRoaXMgZmlsZSBkaXJlY3RseSAoZS5nLiBgdHN4IHNyYy93YXRjaC50c2ApIHRvIHdhdGNoIHRoaXNcbi8vIHBhY2thZ2UgYW5kIGxvZyBldmVyeSBmaWxlIGV2ZW50IGFzIGl0IGhhcHBlbnMuXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBjb25zdCBkaXIgPSBpbXBvcnQubWV0YS5kaXJuYW1lO1xuICBjb25zb2xlLmxvZyhcIi0tLSBTdGFydGluZyBGaWxlIFdhdGNoZXIgLS0tXCIpO1xuICBsZXQgY3dkID0gcmVzb2x2ZShkaXIsIFwiLi5cIik7XG4gIGN3ZCA9IFwiL1VzZXJzL3JlZ2dpZS5waWVyY2UvUHJvamVjdHMvZ2l0aHViLXJlZ2dpZS1kYi9kYngtdG9vbHNcIjtcbiAgY29uc29sZS5sb2coYFdvcmtpbmcgRGlyZWN0b3J5OiAke2N3ZH1gKTtcblxuICBjb25zdCB3YXRjaGVyID0gd2F0Y2hGaWxlcyhcIioqL3NyYy8qKlwiLCB7XG4gICAgY3dkLFxuICAgIGlnbm9yZUluaXRpYWw6IGZhbHNlLFxuICAgIGlnbm9yZTogW1wiKiovaW5kZXgudHNcIiwgXCIqKi9jb3JlLyoqXCJdLFxuICAgIGlnbm9yZU9wdGlvbnM6IHtcbiAgICAgIHRlbXA6IGZhbHNlLFxuICAgIH0sXG4gIH0pO1xuICB3YXRjaGVyLm9uKFwiYWxsXCIsIChldmVudDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zb2xlLmxvZyhgWyR7ZXZlbnQudG9VcHBlckNhc2UoKX1dICR7cGF0aH1gKTtcbiAgfSk7XG4gIHdhdGNoZXIub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiV2F0Y2hlciBlcnJvcjpcIiwgZXJyb3IpO1xuICB9KTtcbiAgY29uc29sZS5sb2coXCJXYXRjaGVyIHN0YXJ0ZWRcIik7XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["../src/find.ts","../src/ignore.ts","../src/match.ts","../src/pattern.ts","../src/scan.ts","../src/watch.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -14,24 +14,28 @@
|
|
|
14
14
|
"chokidar": "^4.0.3",
|
|
15
15
|
"glob": "^13.0.6",
|
|
16
16
|
"minimatch": "^10.2.5",
|
|
17
|
-
"@dbx-tools/core": "0.
|
|
18
|
-
"@dbx-tools/shared-core": "0.
|
|
17
|
+
"@dbx-tools/core": "0.4.1",
|
|
18
|
+
"@dbx-tools/shared-core": "0.4.1"
|
|
19
19
|
},
|
|
20
|
-
"main": "index.
|
|
20
|
+
"main": "./lib/index.js",
|
|
21
21
|
"license": "UNLICENSED",
|
|
22
22
|
"publishConfig": {
|
|
23
23
|
"access": "public"
|
|
24
24
|
},
|
|
25
|
-
"version": "0.
|
|
26
|
-
"types": "index.ts",
|
|
25
|
+
"version": "0.4.1",
|
|
26
|
+
"types": "./lib/index.d.ts",
|
|
27
27
|
"type": "module",
|
|
28
28
|
"exports": {
|
|
29
|
-
".":
|
|
29
|
+
".": {
|
|
30
|
+
"types": "./lib/index.d.ts",
|
|
31
|
+
"default": "./lib/index.js"
|
|
32
|
+
},
|
|
30
33
|
"./package.json": "./package.json"
|
|
31
34
|
},
|
|
32
35
|
"files": [
|
|
33
36
|
"index.ts",
|
|
34
|
-
"src"
|
|
37
|
+
"src",
|
|
38
|
+
"lib"
|
|
35
39
|
],
|
|
36
40
|
"dbxToolsConfig": {
|
|
37
41
|
"tags": [
|