@dbx-tools/path 0.3.44 → 0.4.0

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 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 {};
@@ -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;
@@ -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;
@@ -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;
@@ -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.3.44",
18
- "@dbx-tools/shared-core": "0.3.44"
17
+ "@dbx-tools/core": "0.4.0",
18
+ "@dbx-tools/shared-core": "0.4.0"
19
19
  },
20
- "main": "index.ts",
20
+ "main": "./lib/index.js",
21
21
  "license": "UNLICENSED",
22
22
  "publishConfig": {
23
23
  "access": "public"
24
24
  },
25
- "version": "0.3.44",
26
- "types": "index.ts",
25
+ "version": "0.4.0",
26
+ "types": "./lib/index.d.ts",
27
27
  "type": "module",
28
28
  "exports": {
29
- ".": "./index.ts",
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": [