pathprobe 0.8.11 → 0.9.14
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/dist/index.mjs +112 -113
- package/dist/index.mjs.map +1 -1
- package/dist/native/windows-bridge.cjs +36 -37
- package/dist/types/src/search/traversal.d.ts +13 -12
- package/dist/types/src/types.d.ts +1 -1
- package/package.json +5 -3
package/dist/index.mjs
CHANGED
|
@@ -13,7 +13,7 @@ import { AhoCorasick } from "@monyone/aho-corasick";
|
|
|
13
13
|
const settings = {
|
|
14
14
|
batchValidationThreshold: 48,
|
|
15
15
|
directoryScanThreshold: 2,
|
|
16
|
-
|
|
16
|
+
ignoreFileNames: [".ignore", ".rgignore"],
|
|
17
17
|
locationSuffixPattern: /:(?<line>\d+)(?::(?<column>\d+))?$/u,
|
|
18
18
|
respectIgnoreByDefault: true,
|
|
19
19
|
searchHiddenByDefault: false,
|
|
@@ -75,8 +75,7 @@ function add(result, seen, value, start, end, kind) {
|
|
|
75
75
|
}
|
|
76
76
|
function addMatches(result, seen, text, pattern, kind) {
|
|
77
77
|
for (const match of text.matchAll(pattern)) {
|
|
78
|
-
const value = match[0];
|
|
79
|
-
const start = match.index ?? 0;
|
|
78
|
+
const value = match[0], start = match.index ?? 0;
|
|
80
79
|
add(result, seen, value, start, start + value.length, kind);
|
|
81
80
|
}
|
|
82
81
|
}
|
|
@@ -90,22 +89,17 @@ function addQuotedMatches(result, seen, text) {
|
|
|
90
89
|
}
|
|
91
90
|
function addSpanMatches(result, seen, text, maximumWords) {
|
|
92
91
|
for (const clause of text.matchAll(clausePattern)) {
|
|
93
|
-
const clauseStart = clause.index ?? 0
|
|
94
|
-
const tokens = [...clause[0].matchAll(tokenPattern)].map((token) => ({
|
|
92
|
+
const clauseStart = clause.index ?? 0, tokens = [...clause[0].matchAll(tokenPattern)].map((token) => ({
|
|
95
93
|
end: clauseStart + (token.index ?? 0) + token[0].length,
|
|
96
94
|
hint: Number(pathHintPattern.test(token[0]) || variableHintPattern.test(token[0])),
|
|
97
95
|
start: clauseStart + (token.index ?? 0),
|
|
98
96
|
value: token[0]
|
|
99
|
-
}));
|
|
100
|
-
const hintCounts = [0];
|
|
97
|
+
})), hintCounts = [0];
|
|
101
98
|
for (const token of tokens) hintCounts.push((hintCounts.at(-1) ?? 0) + token.hint);
|
|
102
99
|
for (let start = 0; start < tokens.length; start += 1) {
|
|
103
100
|
const last = Math.min(tokens.length, start + maximumWords);
|
|
104
101
|
for (let end = start + 1; end <= last; end += 1) {
|
|
105
|
-
const firstToken = tokens[start];
|
|
106
|
-
const lastToken = tokens[end - 1];
|
|
107
|
-
const hintsBefore = hintCounts[start];
|
|
108
|
-
const hintsAfter = hintCounts[end];
|
|
102
|
+
const firstToken = tokens[start], lastToken = tokens[end - 1], hintsBefore = hintCounts[start], hintsAfter = hintCounts[end];
|
|
109
103
|
if (firstToken === void 0 || lastToken === void 0 || hintsBefore === void 0 || hintsAfter === void 0 || hintsBefore === hintsAfter) continue;
|
|
110
104
|
const value = text.slice(firstToken.start, lastToken.end);
|
|
111
105
|
if (pathHintPattern.test(value)) add(result, seen, value, firstToken.start, lastToken.end, "span");
|
|
@@ -114,8 +108,7 @@ function addSpanMatches(result, seen, text, maximumWords) {
|
|
|
114
108
|
}
|
|
115
109
|
}
|
|
116
110
|
function extractCandidates(text, level) {
|
|
117
|
-
const result = [];
|
|
118
|
-
const seen = /* @__PURE__ */ new Set();
|
|
111
|
+
const result = [], seen = /* @__PURE__ */ new Set();
|
|
119
112
|
addQuotedMatches(result, seen, text);
|
|
120
113
|
addMatches(result, seen, text, explicitPattern, "explicit");
|
|
121
114
|
if (level >= 2) {
|
|
@@ -149,14 +142,11 @@ function addLocalServerName(names, value) {
|
|
|
149
142
|
if (value !== void 0 && uncServerSegmentPattern.test(value)) names.add(normalizeServerName(value));
|
|
150
143
|
}
|
|
151
144
|
function addIpv6LiteralName(names, value) {
|
|
152
|
-
const zoneIndex = value.indexOf("%")
|
|
153
|
-
const address = zoneIndex === -1 ? value : value.slice(0, zoneIndex);
|
|
154
|
-
const zone = zoneIndex === -1 ? "" : `s${value.slice(zoneIndex + 1)}`;
|
|
145
|
+
const zoneIndex = value.indexOf("%"), address = zoneIndex === -1 ? value : value.slice(0, zoneIndex), zone = zoneIndex === -1 ? "" : `s${value.slice(zoneIndex + 1)}`;
|
|
155
146
|
addLocalServerName(names, `${address.replaceAll(":", "-")}${zone}.ipv6-literal.net`);
|
|
156
147
|
}
|
|
157
148
|
function collectLocalServerNames() {
|
|
158
|
-
const names = /* @__PURE__ */ new Set(["localhost"]);
|
|
159
|
-
const computerName = process.env.COMPUTERNAME;
|
|
149
|
+
const names = /* @__PURE__ */ new Set(["localhost"]), computerName = process.env.COMPUTERNAME;
|
|
160
150
|
addLocalServerName(names, hostname());
|
|
161
151
|
addLocalServerName(names, computerName);
|
|
162
152
|
if (computerName !== void 0 && process.env.USERDNSDOMAIN !== void 0) addLocalServerName(names, `${computerName}.${process.env.USERDNSDOMAIN}`);
|
|
@@ -168,24 +158,18 @@ function collectLocalServerNames() {
|
|
|
168
158
|
const localServerNames = process.platform === "win32" ? collectLocalServerNames() : /* @__PURE__ */ new Set();
|
|
169
159
|
let driveMappings;
|
|
170
160
|
function containsControlCharacter(value) {
|
|
171
|
-
|
|
161
|
+
for (const character of value) if (character.charCodeAt(0) < 32) return true;
|
|
162
|
+
return false;
|
|
172
163
|
}
|
|
173
164
|
function normalizeUncRoot(value) {
|
|
174
165
|
return value.replaceAll("/", "\\").replace(/\\+$/u, "").toLowerCase();
|
|
175
166
|
}
|
|
176
167
|
function parseUncPath(value) {
|
|
177
|
-
const normalized = value.replaceAll("/", "\\");
|
|
178
|
-
const extended = normalized.slice(0, 8).toLowerCase() === "\\\\?\\unc\\";
|
|
168
|
+
const normalized = value.replaceAll("/", "\\"), extended = normalized.slice(0, 8).toLowerCase() === "\\\\?\\unc\\";
|
|
179
169
|
if (normalized.startsWith("\\\\.\\") || normalized.startsWith("\\\\?\\") && !extended) return;
|
|
180
|
-
const serverStart = extended ? 8 : 2;
|
|
181
|
-
const serverSeparator = normalized.slice(serverStart).indexOf("\\");
|
|
170
|
+
const serverStart = extended ? 8 : 2, serverSeparator = normalized.slice(serverStart).indexOf("\\");
|
|
182
171
|
if (serverSeparator <= 0) return;
|
|
183
|
-
const serverEnd = serverStart + serverSeparator;
|
|
184
|
-
const shareStart = serverEnd + 1;
|
|
185
|
-
const shareSeparator = normalized.slice(shareStart).indexOf("\\");
|
|
186
|
-
const shareEnd = shareSeparator === -1 ? normalized.length : shareStart + shareSeparator;
|
|
187
|
-
const server = normalized.slice(serverStart, serverEnd);
|
|
188
|
-
const share = normalized.slice(shareStart, shareEnd);
|
|
172
|
+
const serverEnd = serverStart + serverSeparator, shareStart = serverEnd + 1, shareSeparator = normalized.slice(shareStart).indexOf("\\"), shareEnd = shareSeparator === -1 ? normalized.length : shareStart + shareSeparator, server = normalized.slice(serverStart, serverEnd), share = normalized.slice(shareStart, shareEnd);
|
|
189
173
|
if (share.length === 0 || !uncServerSegmentPattern.test(server) || !uncServerSegmentPattern.test(share)) return;
|
|
190
174
|
const suffix = normalized.slice(shareEnd);
|
|
191
175
|
return {
|
|
@@ -201,15 +185,14 @@ function queryDriveMapping(drive) {
|
|
|
201
185
|
if (status === errorMoreData) throw new Error(`WNetGetConnectionW returned an oversized mapping for ${drive}`);
|
|
202
186
|
if (unmappedDriveErrors.has(status)) return;
|
|
203
187
|
if (status !== 0) throw new Error(`WNetGetConnectionW failed for ${drive} with error ${status}`);
|
|
204
|
-
if (typeof remote !== "string" || !remote.startsWith(
|
|
188
|
+
if (typeof remote !== "string" || !remote.startsWith(String.raw`\\`)) throw new TypeError(`WNetGetConnectionW returned an invalid mapping for ${drive}`);
|
|
205
189
|
return normalizeUncRoot(remote);
|
|
206
190
|
}
|
|
207
191
|
function queryDriveMappings() {
|
|
208
192
|
if (driveMappings !== void 0) return driveMappings;
|
|
209
193
|
const result = [];
|
|
210
194
|
for (let code = "A".charCodeAt(0); code <= "Z".charCodeAt(0); code += 1) {
|
|
211
|
-
const drive = `${String.fromCharCode(code)}
|
|
212
|
-
const remote = queryDriveMapping(drive);
|
|
195
|
+
const drive = `${String.fromCharCode(code)}:`, remote = queryDriveMapping(drive);
|
|
213
196
|
if (remote !== void 0) result.push({
|
|
214
197
|
drive,
|
|
215
198
|
remote
|
|
@@ -219,8 +202,7 @@ function queryDriveMappings() {
|
|
|
219
202
|
return driveMappings;
|
|
220
203
|
}
|
|
221
204
|
function resolveMappedUncPath(path) {
|
|
222
|
-
const canonical = normalizeUncRoot(path.canonical);
|
|
223
|
-
const mapping = queryDriveMappings().find(({ remote }) => canonical === remote || canonical.startsWith(`${remote}\\`));
|
|
205
|
+
const canonical = normalizeUncRoot(path.canonical), mapping = queryDriveMappings().find(({ remote }) => canonical === remote || canonical.startsWith(`${remote}\\`));
|
|
224
206
|
if (mapping === void 0) return;
|
|
225
207
|
const relative = path.canonical.slice(mapping.remote.length);
|
|
226
208
|
return nodePath.win32.normalize(`${mapping.drive}${relative}`);
|
|
@@ -235,7 +217,7 @@ function resolveLocalAdministrativeShare(path) {
|
|
|
235
217
|
return nodePath.win32.normalize(`${match[1]}:${path.suffix || "\\"}`);
|
|
236
218
|
}
|
|
237
219
|
function resolveUncPath(value) {
|
|
238
|
-
if (process.platform !== "win32" || !value.startsWith(
|
|
220
|
+
if (process.platform !== "win32" || !value.startsWith(String.raw`\\`) && !value.startsWith("//")) return value;
|
|
239
221
|
if (containsControlCharacter(value)) return;
|
|
240
222
|
const path = parseUncPath(value);
|
|
241
223
|
if (path === void 0) return;
|
|
@@ -259,7 +241,7 @@ function hasWindowsHiddenAttribute(filePath) {
|
|
|
259
241
|
}
|
|
260
242
|
//#endregion
|
|
261
243
|
//#region src/search/hidden.ts
|
|
262
|
-
function pathKey$
|
|
244
|
+
function pathKey$5(value) {
|
|
263
245
|
return process.platform === "win32" ? value.toLowerCase() : value;
|
|
264
246
|
}
|
|
265
247
|
function relativePath(filePath, boundary) {
|
|
@@ -275,10 +257,10 @@ function createHiddenPathDetector() {
|
|
|
275
257
|
return { isHidden(filePath, boundary) {
|
|
276
258
|
if (process.platform !== "win32") return hasHiddenDotSegment(filePath, boundary);
|
|
277
259
|
relativePath(filePath, boundary);
|
|
278
|
-
const boundaryKey = pathKey$
|
|
260
|
+
const boundaryKey = pathKey$5(nodePath.resolve(boundary));
|
|
279
261
|
let current = nodePath.resolve(filePath);
|
|
280
|
-
while (pathKey$
|
|
281
|
-
const key = pathKey$
|
|
262
|
+
while (pathKey$5(current) !== boundaryKey) {
|
|
263
|
+
const key = pathKey$5(current);
|
|
282
264
|
let hidden = attributeCache.get(key);
|
|
283
265
|
if (hidden === void 0) {
|
|
284
266
|
hidden = hasWindowsHiddenAttribute(current);
|
|
@@ -300,6 +282,9 @@ const unreadableDirectoryErrors = /* @__PURE__ */ new Set([
|
|
|
300
282
|
"ENOENT",
|
|
301
283
|
"EPERM"
|
|
302
284
|
]);
|
|
285
|
+
function pathKey$4(value) {
|
|
286
|
+
return process.platform === "win32" ? value.toLowerCase() : value;
|
|
287
|
+
}
|
|
303
288
|
function isUnreadableDirectoryError(error) {
|
|
304
289
|
return error.code !== void 0 && unreadableDirectoryErrors.has(error.code);
|
|
305
290
|
}
|
|
@@ -308,62 +293,104 @@ function completeDirectoryRead(error, entries, callback) {
|
|
|
308
293
|
else if (isUnreadableDirectoryError(error)) callback(null, []);
|
|
309
294
|
else callback(error, []);
|
|
310
295
|
}
|
|
311
|
-
function
|
|
296
|
+
function indexScope(root, scope) {
|
|
297
|
+
if (scope === void 0) return;
|
|
298
|
+
const resolvedRoot = nodePath.resolve(root), childrenByDirectory = /* @__PURE__ */ new Map();
|
|
299
|
+
for (const relativePath of scope.paths) {
|
|
300
|
+
if (nodePath.isAbsolute(relativePath) || relativePath === ".." || relativePath.startsWith(`..${nodePath.sep}`)) throw new RangeError(`${relativePath} is outside the traversal root ${root}`);
|
|
301
|
+
let directory = resolvedRoot;
|
|
302
|
+
for (const name of relativePath.split(nodePath.sep)) {
|
|
303
|
+
const directoryKey = pathKey$4(directory), children = childrenByDirectory.get(directoryKey) ?? /* @__PURE__ */ new Set();
|
|
304
|
+
children.add(pathKey$4(name));
|
|
305
|
+
childrenByDirectory.set(directoryKey, children);
|
|
306
|
+
directory = nodePath.join(directory, name);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
childrenByDirectory,
|
|
311
|
+
passthroughNames: new Set(scope.passthroughNames.map(pathKey$4))
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
function filterToScope(filePath, entries, scope) {
|
|
315
|
+
if (scope === void 0) return entries;
|
|
316
|
+
const children = scope.childrenByDirectory.get(pathKey$4(nodePath.resolve(filePath)));
|
|
317
|
+
if (children === void 0) return [];
|
|
318
|
+
return entries.filter((entry) => {
|
|
319
|
+
const key = pathKey$4(typeof entry === "string" ? entry : entry.name);
|
|
320
|
+
return children.has(key) || scope.passthroughNames.has(key);
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
function completeTraversalRead(root, filePath, searchHidden, hiddenDetector, scope, error, entries, callback) {
|
|
324
|
+
const scopedEntries = error === null ? filterToScope(filePath, entries, scope) : entries;
|
|
325
|
+
if (error !== null || searchHidden) {
|
|
326
|
+
completeDirectoryRead(error, scopedEntries, callback);
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
try {
|
|
330
|
+
callback(null, scopedEntries.filter((entry) => {
|
|
331
|
+
if (typeof entry !== "string" && !entry.isDirectory()) return true;
|
|
332
|
+
const name = typeof entry === "string" ? entry : entry.name;
|
|
333
|
+
return !hiddenDetector.isHidden(nodePath.join(filePath, name), root);
|
|
334
|
+
}));
|
|
335
|
+
} catch (caughtError) {
|
|
336
|
+
callback(caughtError instanceof Error ? caughtError : new Error(String(caughtError)), []);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
function createReadDirectory(root, searchHidden, readDirectory, scope) {
|
|
312
340
|
const hiddenDetector = createHiddenPathDetector();
|
|
313
341
|
function traverseReadDirectory(filePath, optionsOrCallback, entryCallback) {
|
|
314
342
|
if (typeof optionsOrCallback === "function") {
|
|
315
343
|
readDirectory(filePath, (error, entries) => {
|
|
316
|
-
|
|
344
|
+
completeTraversalRead(root, filePath, searchHidden, hiddenDetector, scope, error, entries, optionsOrCallback);
|
|
317
345
|
});
|
|
318
346
|
return;
|
|
319
347
|
}
|
|
320
348
|
if (entryCallback === void 0) throw new TypeError("A directory entry callback is required");
|
|
321
349
|
readDirectory(filePath, optionsOrCallback, (error, entries) => {
|
|
322
|
-
|
|
323
|
-
completeDirectoryRead(error, entries, entryCallback);
|
|
324
|
-
return;
|
|
325
|
-
}
|
|
326
|
-
try {
|
|
327
|
-
entryCallback(null, entries.filter((entry) => !entry.isDirectory() || !hiddenDetector.isHidden(nodePath.join(filePath, entry.name), root)));
|
|
328
|
-
} catch (caught) {
|
|
329
|
-
entryCallback(caught instanceof Error ? caught : new Error(String(caught)), []);
|
|
330
|
-
}
|
|
350
|
+
completeTraversalRead(root, filePath, searchHidden, hiddenDetector, scope, error, entries, entryCallback);
|
|
331
351
|
});
|
|
332
352
|
}
|
|
333
353
|
return traverseReadDirectory;
|
|
334
354
|
}
|
|
335
|
-
function createTraversalFileSystem(root, searchHidden,
|
|
355
|
+
function createTraversalFileSystem(root, searchHidden, options = {}) {
|
|
356
|
+
const { readDirectory = nodeFileSystem.readdir, scope } = options;
|
|
336
357
|
return {
|
|
337
358
|
...nodeFileSystem,
|
|
338
|
-
readdir: createReadDirectory(root, searchHidden, readDirectory)
|
|
359
|
+
readdir: createReadDirectory(root, searchHidden, readDirectory, indexScope(root, scope))
|
|
339
360
|
};
|
|
340
361
|
}
|
|
341
362
|
//#endregion
|
|
342
363
|
//#region src/search/policy.ts
|
|
364
|
+
const ignoreFilePatterns = settings.ignoreFileNames.map((name) => `**/${convertPathToPattern(name)}`);
|
|
365
|
+
const ignoreFileNames = [".gitignore", ...settings.ignoreFileNames];
|
|
343
366
|
function pathKey$3(value) {
|
|
344
367
|
return process.platform === "win32" ? value.toLowerCase() : value;
|
|
345
368
|
}
|
|
346
369
|
function isWithinRoot(filePath, root) {
|
|
347
370
|
return filePath === root || isPathInside(filePath, root);
|
|
348
371
|
}
|
|
349
|
-
function traversalOptions(root, searchHidden) {
|
|
372
|
+
function traversalOptions(root, searchHidden, scopedPaths) {
|
|
373
|
+
const fileSystem = scopedPaths === void 0 ? createTraversalFileSystem(root, searchHidden) : createTraversalFileSystem(root, searchHidden, { scope: {
|
|
374
|
+
passthroughNames: ignoreFileNames,
|
|
375
|
+
paths: scopedPaths
|
|
376
|
+
} });
|
|
350
377
|
return {
|
|
351
378
|
caseSensitiveMatch: process.platform !== "win32",
|
|
352
379
|
cwd: root,
|
|
353
380
|
dot: process.platform === "win32" || searchHidden,
|
|
354
381
|
followSymbolicLinks: false,
|
|
355
|
-
fs:
|
|
382
|
+
fs: fileSystem,
|
|
356
383
|
onlyFiles: false,
|
|
357
384
|
unique: true
|
|
358
385
|
};
|
|
359
386
|
}
|
|
360
|
-
function globbyOptions(root, respectIgnore, searchHidden) {
|
|
387
|
+
function globbyOptions(root, respectIgnore, searchHidden, scopedPaths) {
|
|
361
388
|
return {
|
|
362
|
-
...traversalOptions(root, searchHidden),
|
|
389
|
+
...traversalOptions(root, searchHidden, scopedPaths),
|
|
363
390
|
expandDirectories: false,
|
|
364
391
|
gitignore: respectIgnore,
|
|
365
392
|
globalGitignore: respectIgnore,
|
|
366
|
-
...respectIgnore ? { ignoreFiles:
|
|
393
|
+
...respectIgnore ? { ignoreFiles: ignoreFilePatterns } : {}
|
|
367
394
|
};
|
|
368
395
|
}
|
|
369
396
|
async function resolveSearchDirectories(directories) {
|
|
@@ -386,17 +413,14 @@ async function listSearchEntries(root, respectIgnore, searchHidden) {
|
|
|
386
413
|
const entries = await globby("**/*", {
|
|
387
414
|
...globbyOptions(root, respectIgnore, searchHidden),
|
|
388
415
|
objectMode: true
|
|
389
|
-
});
|
|
390
|
-
const hiddenDetector = createHiddenPathDetector();
|
|
416
|
+
}), hiddenDetector = createHiddenPathDetector();
|
|
391
417
|
return entries.filter((entry) => searchHidden || !hiddenDetector.isHidden(nodePath.resolve(root, entry.path), root)).map((entry) => ({
|
|
392
418
|
directory: entry.dirent.isDirectory(),
|
|
393
419
|
path: entry.path
|
|
394
420
|
}));
|
|
395
421
|
}
|
|
396
422
|
async function filterSearchablePaths(paths, roots, respectIgnore, searchHidden) {
|
|
397
|
-
const allowed = /* @__PURE__ */ new Set();
|
|
398
|
-
const pathsByRoot = /* @__PURE__ */ new Map();
|
|
399
|
-
const hiddenDetector = createHiddenPathDetector();
|
|
423
|
+
const allowed = /* @__PURE__ */ new Set(), pathsByRoot = /* @__PURE__ */ new Map(), hiddenDetector = createHiddenPathDetector();
|
|
400
424
|
for (const filePath of paths) {
|
|
401
425
|
let hasSearchRoot = false;
|
|
402
426
|
for (const root of roots) {
|
|
@@ -412,14 +436,12 @@ async function filterSearchablePaths(paths, roots, respectIgnore, searchHidden)
|
|
|
412
436
|
}
|
|
413
437
|
}
|
|
414
438
|
if (hasSearchRoot) continue;
|
|
415
|
-
const filesystemRoot = nodePath.parse(filePath).root;
|
|
416
|
-
const hiddenBoundary = process.platform === "win32" ? nodePath.dirname(filePath) : filesystemRoot;
|
|
439
|
+
const filesystemRoot = nodePath.parse(filePath).root, hiddenBoundary = process.platform === "win32" ? nodePath.dirname(filePath) : filesystemRoot;
|
|
417
440
|
if (searchHidden || !hiddenDetector.isHidden(filePath, hiddenBoundary)) allowed.add(filePath);
|
|
418
441
|
}
|
|
419
442
|
await Promise.all([...pathsByRoot].map(async ([root, relativePaths]) => {
|
|
420
|
-
const patterns = relativePaths.map(convertPathToPattern)
|
|
421
|
-
|
|
422
|
-
...globbyOptions(root, true, true),
|
|
443
|
+
const patterns = relativePaths.map(convertPathToPattern), matches = await globby(patterns, {
|
|
444
|
+
...globbyOptions(root, true, true, relativePaths),
|
|
423
445
|
absolute: true
|
|
424
446
|
});
|
|
425
447
|
for (const match of matches) allowed.add(nodePath.normalize(match));
|
|
@@ -433,8 +455,7 @@ function pathKey$2(value) {
|
|
|
433
455
|
}
|
|
434
456
|
async function applySearchPolicies(existingPaths, roots, respectIgnore, searchHidden) {
|
|
435
457
|
if (!respectIgnore && searchHidden) return new Map(existingPaths);
|
|
436
|
-
const searchablePaths = await filterSearchablePaths([...existingPaths.keys()], roots, respectIgnore, searchHidden);
|
|
437
|
-
const searchableKeys = new Set([...searchablePaths].map(pathKey$2));
|
|
458
|
+
const searchablePaths = await filterSearchablePaths([...existingPaths.keys()], roots, respectIgnore, searchHidden), searchableKeys = new Set([...searchablePaths].map(pathKey$2));
|
|
438
459
|
return new Map([...existingPaths].filter(([filePath]) => searchableKeys.has(pathKey$2(filePath))));
|
|
439
460
|
}
|
|
440
461
|
//#endregion
|
|
@@ -454,7 +475,7 @@ function pathKey$1(value) {
|
|
|
454
475
|
}
|
|
455
476
|
function isUnavailablePathError(error, filePath) {
|
|
456
477
|
const code = error instanceof Error && "code" in error && typeof error.code === "string" ? error.code : void 0;
|
|
457
|
-
return code !== void 0 && (unavailablePathErrors.has(code) || filePath?.startsWith(
|
|
478
|
+
return code !== void 0 && (unavailablePathErrors.has(code) || filePath?.startsWith(String.raw`\\`) === true && unverifiableUncErrors.has(code));
|
|
458
479
|
}
|
|
459
480
|
async function classifyPath(filePath) {
|
|
460
481
|
try {
|
|
@@ -471,30 +492,25 @@ async function classifyAndAdd(found, filePath) {
|
|
|
471
492
|
if (kind !== void 0) found.set(filePath, kind);
|
|
472
493
|
}
|
|
473
494
|
async function classifyExistingPaths(paths, roots) {
|
|
474
|
-
const found = /* @__PURE__ */ new Map();
|
|
475
|
-
const limit = pLimit(settings.validationConcurrency);
|
|
495
|
+
const found = /* @__PURE__ */ new Map(), limit = pLimit(settings.validationConcurrency);
|
|
476
496
|
if (paths.length < settings.batchValidationThreshold) {
|
|
477
497
|
await limit.map(paths, (filePath) => classifyAndAdd(found, filePath));
|
|
478
498
|
return found;
|
|
479
499
|
}
|
|
480
|
-
const rootKeys = new Set(roots.map(pathKey$1));
|
|
481
|
-
const pathsByParent = /* @__PURE__ */ new Map();
|
|
500
|
+
const rootKeys = new Set(roots.map(pathKey$1)), pathsByParent = /* @__PURE__ */ new Map();
|
|
482
501
|
for (const filePath of paths) {
|
|
483
502
|
if (rootKeys.has(pathKey$1(filePath))) {
|
|
484
503
|
found.set(filePath, "directory");
|
|
485
504
|
continue;
|
|
486
505
|
}
|
|
487
|
-
const parent = nodePath.dirname(filePath)
|
|
488
|
-
const key = pathKey$1(parent);
|
|
489
|
-
const group = pathsByParent.get(key) ?? {
|
|
506
|
+
const parent = nodePath.dirname(filePath), key = pathKey$1(parent), group = pathsByParent.get(key) ?? {
|
|
490
507
|
parent,
|
|
491
508
|
paths: []
|
|
492
509
|
};
|
|
493
510
|
group.paths.push(filePath);
|
|
494
511
|
pathsByParent.set(key, group);
|
|
495
512
|
}
|
|
496
|
-
const directPaths = [];
|
|
497
|
-
const scannedGroups = [];
|
|
513
|
+
const directPaths = [], scannedGroups = [];
|
|
498
514
|
for (const group of pathsByParent.values()) if (group.paths.length < settings.directoryScanThreshold) directPaths.push(...group.paths);
|
|
499
515
|
else scannedGroups.push(group);
|
|
500
516
|
await Promise.all([limit.map(directPaths, (filePath) => classifyAndAdd(found, filePath)), limit.map(scannedGroups, async ({ parent, paths: groupPaths }) => {
|
|
@@ -507,8 +523,7 @@ async function classifyExistingPaths(paths, roots) {
|
|
|
507
523
|
}
|
|
508
524
|
const entriesByName = new Map(entries.map((entry) => [pathKey$1(entry.name), entry]));
|
|
509
525
|
await Promise.all(groupPaths.map(async (filePath) => {
|
|
510
|
-
const name = nodePath.basename(filePath);
|
|
511
|
-
const entry = entriesByName.get(pathKey$1(name));
|
|
526
|
+
const name = nodePath.basename(filePath), entry = entriesByName.get(pathKey$1(name));
|
|
512
527
|
if (entry?.isFile()) found.set(filePath, "file");
|
|
513
528
|
else if (entry?.isDirectory()) found.set(filePath, "directory");
|
|
514
529
|
else if (entry !== void 0 || process.platform === "win32" && name.includes(":")) await classifyAndAdd(found, filePath);
|
|
@@ -522,11 +537,8 @@ function removeContainedMatches(matches) {
|
|
|
522
537
|
const ordered = matches.map((match, index) => ({
|
|
523
538
|
index,
|
|
524
539
|
match
|
|
525
|
-
})).toSorted(({ match: left }, { match: right }) => left.position.start - right.position.start || right.position.end - left.position.end);
|
|
526
|
-
|
|
527
|
-
let maxEndBeforeStart = -1;
|
|
528
|
-
let groupStart = -1;
|
|
529
|
-
let maxEndInGroup = -1;
|
|
540
|
+
})).toSorted(({ match: left }, { match: right }) => left.position.start - right.position.start || right.position.end - left.position.end), kept = /* @__PURE__ */ new Set();
|
|
541
|
+
let maxEndBeforeStart = -1, groupStart = -1, maxEndInGroup = -1;
|
|
530
542
|
for (const { index, match } of ordered) {
|
|
531
543
|
const { start, end } = match.position;
|
|
532
544
|
if (start !== groupStart) {
|
|
@@ -547,9 +559,7 @@ function parseLocationPart(value, name) {
|
|
|
547
559
|
return result;
|
|
548
560
|
}
|
|
549
561
|
function prepareCandidate(candidate) {
|
|
550
|
-
let end = candidate
|
|
551
|
-
let start = candidate.start;
|
|
552
|
-
let value = candidate.value;
|
|
562
|
+
let { end } = candidate, { start } = candidate, { value } = candidate;
|
|
553
563
|
if (candidate.kind !== "inventory" && candidate.kind !== "quoted") {
|
|
554
564
|
const startTrimmed = value.trimStart();
|
|
555
565
|
start += value.length - startTrimmed.length;
|
|
@@ -557,7 +567,7 @@ function prepareCandidate(candidate) {
|
|
|
557
567
|
const endTrimmed = value.trimEnd();
|
|
558
568
|
end -= value.length - endTrimmed.length;
|
|
559
569
|
value = endTrimmed;
|
|
560
|
-
if (value.length >= 2 && (value
|
|
570
|
+
if (value.length >= 2 && (value.startsWith("\"") && value.at(-1) === "\"" || value.startsWith("'") && value.at(-1) === "'" || value.startsWith("`") && value.at(-1) === "`")) {
|
|
561
571
|
start += 1;
|
|
562
572
|
end -= 1;
|
|
563
573
|
value = value.slice(1, -1);
|
|
@@ -582,7 +592,7 @@ function prepareCandidate(candidate) {
|
|
|
582
592
|
value = value.slice(0, match.index);
|
|
583
593
|
}
|
|
584
594
|
}
|
|
585
|
-
if (value === "/") return;
|
|
595
|
+
if (value === "/" || value === ".") return;
|
|
586
596
|
return {
|
|
587
597
|
...location === void 0 ? {} : { location },
|
|
588
598
|
position: {
|
|
@@ -603,11 +613,12 @@ function uniquePaths(values) {
|
|
|
603
613
|
return [...paths.values()];
|
|
604
614
|
}
|
|
605
615
|
function unescape(value) {
|
|
606
|
-
if (value.startsWith(
|
|
616
|
+
if (value.startsWith(String.raw`\\`) && !value.startsWith(String.raw`\\\\`)) return value;
|
|
607
617
|
return value.replace(/\\(["'`\\])/gu, "$1").replace(/\\\\/gu, "\\");
|
|
608
618
|
}
|
|
609
619
|
function toPaths(value, roots, variables) {
|
|
610
620
|
let expanded = expandVariables(value, variables);
|
|
621
|
+
if (expanded.includes("\0")) return [];
|
|
611
622
|
if (expanded.startsWith("file://")) try {
|
|
612
623
|
expanded = fileURLToPath(expanded);
|
|
613
624
|
} catch (error) {
|
|
@@ -633,8 +644,7 @@ function mergeLocation(match, location) {
|
|
|
633
644
|
if (match.location.line !== location.line || match.location.column !== location.column) throw new Error("Candidates for the same path and position have conflicting locations");
|
|
634
645
|
}
|
|
635
646
|
async function validateCandidates(candidates, roots, variables, respectIgnore, searchHidden) {
|
|
636
|
-
const resolvedCandidates = [];
|
|
637
|
-
const validationPaths = /* @__PURE__ */ new Map();
|
|
647
|
+
const resolvedCandidates = [], validationPaths = /* @__PURE__ */ new Map();
|
|
638
648
|
for (const candidate of candidates) {
|
|
639
649
|
const prepared = prepareCandidate(candidate);
|
|
640
650
|
if (prepared === void 0) continue;
|
|
@@ -649,14 +659,11 @@ async function validateCandidates(candidates, roots, variables, respectIgnore, s
|
|
|
649
659
|
validationPaths.set(pathKey(filePath), filePath);
|
|
650
660
|
}
|
|
651
661
|
}
|
|
652
|
-
const classifiedPaths = await applySearchPolicies(await classifyExistingPaths([...validationPaths.values()], roots), roots, respectIgnore, searchHidden);
|
|
653
|
-
const kindsByPath = new Map([...classifiedPaths].map(([filePath, kind]) => [pathKey(filePath), kind]));
|
|
654
|
-
const matches = /* @__PURE__ */ new Map();
|
|
662
|
+
const classifiedPaths = await applySearchPolicies(await classifyExistingPaths([...validationPaths.values()], roots), roots, respectIgnore, searchHidden), kindsByPath = new Map([...classifiedPaths].map(([filePath, kind]) => [pathKey(filePath), kind])), matches = /* @__PURE__ */ new Map();
|
|
655
663
|
for (const { expectedKind, location, path, position } of resolvedCandidates) {
|
|
656
664
|
const kind = kindsByPath.get(pathKey(path));
|
|
657
665
|
if (kind === void 0 || expectedKind !== void 0 && kind !== expectedKind) continue;
|
|
658
|
-
const key = `${pathKey(path)}\0${position.start}\0${position.end}
|
|
659
|
-
const existing = matches.get(key);
|
|
666
|
+
const key = `${pathKey(path)}\0${position.start}\0${position.end}`, existing = matches.get(key);
|
|
660
667
|
if (existing !== void 0) {
|
|
661
668
|
mergeLocation(existing, location);
|
|
662
669
|
continue;
|
|
@@ -713,9 +720,7 @@ function addEntryVariants(patterns, entry) {
|
|
|
713
720
|
function createRootPrefixes(roots) {
|
|
714
721
|
const prefixes = /* @__PURE__ */ new Map();
|
|
715
722
|
for (const root of roots) {
|
|
716
|
-
const native = root.endsWith(nodePath.sep) ? root : `${root}${nodePath.sep}
|
|
717
|
-
const slashRoot = root.replaceAll(nodePath.sep, "/");
|
|
718
|
-
const slash = slashRoot.endsWith("/") ? slashRoot : `${slashRoot}/`;
|
|
723
|
+
const native = root.endsWith(nodePath.sep) ? root : `${root}${nodePath.sep}`, slashRoot = root.replaceAll(nodePath.sep, "/"), slash = slashRoot.endsWith("/") ? slashRoot : `${slashRoot}/`;
|
|
719
724
|
for (const value of [native, slash]) {
|
|
720
725
|
const key = process.platform === "win32" ? value.toLowerCase() : value;
|
|
721
726
|
prefixes.set(key, {
|
|
@@ -739,26 +744,21 @@ function addAbsoluteMatch(result, seen, source, text, pattern, prefixes, end, re
|
|
|
739
744
|
function hasSameEntries(cached, entries) {
|
|
740
745
|
if (cached.entries.length !== entries.length) return false;
|
|
741
746
|
for (let index = 0; index < entries.length; index += 1) {
|
|
742
|
-
const cachedEntries = cached.entries[index];
|
|
743
|
-
const currentEntries = entries[index];
|
|
747
|
+
const cachedEntries = cached.entries[index], currentEntries = entries[index];
|
|
744
748
|
if (cachedEntries === void 0 || currentEntries === void 0) return false;
|
|
745
749
|
if (cachedEntries.length !== currentEntries.length) return false;
|
|
746
750
|
for (let entryIndex = 0; entryIndex < currentEntries.length; entryIndex += 1) {
|
|
747
|
-
const cachedEntry = cachedEntries[entryIndex];
|
|
748
|
-
const currentEntry = currentEntries[entryIndex];
|
|
751
|
+
const cachedEntry = cachedEntries[entryIndex], currentEntry = currentEntries[entryIndex];
|
|
749
752
|
if (cachedEntry === void 0 || currentEntry === void 0 || cachedEntry.directory !== currentEntry.directory || cachedEntry.path !== currentEntry.path) return false;
|
|
750
753
|
}
|
|
751
754
|
}
|
|
752
755
|
return true;
|
|
753
756
|
}
|
|
754
757
|
function canReuseMatcher(cached, entries, roots, respectIgnore, searchHidden) {
|
|
755
|
-
return cached
|
|
758
|
+
return cached?.respectIgnore === respectIgnore && cached.searchHidden === searchHidden && cached.roots.length === roots.length && cached.roots.every((root, index) => root === roots[index]) && hasSameEntries(cached, entries);
|
|
756
759
|
}
|
|
757
760
|
async function inventoryCandidates(text, roots, respectIgnore, searchHidden) {
|
|
758
|
-
const entries = await Promise.all(roots.map((root) => listSearchEntries(root, respectIgnore, searchHidden)));
|
|
759
|
-
const result = [];
|
|
760
|
-
const seen = /* @__PURE__ */ new Set();
|
|
761
|
-
const source = process.platform === "win32" ? text.toLowerCase() : text;
|
|
761
|
+
const entries = await Promise.all(roots.map((root) => listSearchEntries(root, respectIgnore, searchHidden))), result = [], seen = /* @__PURE__ */ new Set(), source = process.platform === "win32" ? text.toLowerCase() : text;
|
|
762
762
|
let inventoryMatcher = inventoryMatcherCache;
|
|
763
763
|
if (!canReuseMatcher(inventoryMatcher, entries, roots, respectIgnore, searchHidden)) {
|
|
764
764
|
const patterns = /* @__PURE__ */ new Map();
|
|
@@ -798,8 +798,7 @@ async function findExistingPaths(options) {
|
|
|
798
798
|
validateVariables(variables);
|
|
799
799
|
if (typeof respectIgnore !== "boolean") throw new TypeError("respectIgnore must be a boolean");
|
|
800
800
|
if (typeof searchHidden !== "boolean") throw new TypeError("searchHidden must be a boolean");
|
|
801
|
-
const roots = await resolveSearchDirectories(directories);
|
|
802
|
-
const candidates = extractCandidates(text, level);
|
|
801
|
+
const roots = await resolveSearchDirectories(directories), candidates = extractCandidates(text, level);
|
|
803
802
|
if (level === MAX_LEVEL) candidates.push(...await inventoryCandidates(text, roots, respectIgnore, searchHidden));
|
|
804
803
|
return validateCandidates(candidates, roots, variables, respectIgnore, searchHidden);
|
|
805
804
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["pathKey","pathKey","pathKey","pathKey"],"sources":["../config/settings.ts","../src/variables.ts","../src/candidates.ts","../src/native/unc.ts","../src/native/attributes.ts","../src/search/hidden.ts","../src/search/traversal.ts","../src/search/policy.ts","../src/validation/eligibility.ts","../src/validation/existence.ts","../src/validation/containment.ts","../src/validation/preparation.ts","../src/validation/resolution.ts","../src/search/inventory.ts","../src/index.ts"],"sourcesContent":["import type { SearchSettings } from \"../src/types.js\";\n\nexport const settings: SearchSettings = {\n batchValidationThreshold: 48,\n directoryScanThreshold: 2,\n ignoreFilePatterns: [\"**/.ignore\", \"**/.rgignore\"],\n locationSuffixPattern: /:(?<line>\\d+)(?::(?<column>\\d+))?$/u,\n respectIgnoreByDefault: true,\n searchHiddenByDefault: false,\n spanWordLimits: [3, 24],\n trailingPunctuation: \".,;:!?,。;:!?、\",\n validationConcurrency: 32,\n};\n","import type { Variables } from \"./types.js\";\n\nconst nameSource = String.raw`[A-Za-z_][A-Za-z0-9_.-]*`;\nexport const variableReferenceSource = String.raw`(?:\\$\\{\\{\\s*(?:(?:env|vars|variables)[.:])?${nameSource}\\s*\\}\\}|\\{\\{\\s*${nameSource}\\s*\\}\\}|\\$\\{(?:env[.:])?${nameSource}\\}|\\$env:${nameSource}|\\$[A-Za-z_][A-Za-z0-9_]*|%${nameSource}%|!${nameSource}!|\\$\\(\\s*${nameSource}\\s*\\)|@${nameSource}@)`;\nconst expressionPatterns = [\n new RegExp(String.raw`\\$\\{\\{\\s*(?:(?:env|vars|variables)[.:])?(${nameSource})\\s*\\}\\}`, \"giu\"),\n new RegExp(String.raw`\\{\\{\\s*(${nameSource})\\s*\\}\\}`, \"gu\"),\n new RegExp(String.raw`\\$\\{(?:env[.:])?(${nameSource})\\}`, \"giu\"),\n new RegExp(String.raw`\\$env:(${nameSource})`, \"giu\"),\n new RegExp(String.raw`\\$(?!env:)([A-Za-z_][A-Za-z0-9_]*)`, \"giu\"),\n new RegExp(String.raw`%(${nameSource})%`, \"gu\"),\n new RegExp(String.raw`!(${nameSource})!`, \"gu\"),\n new RegExp(String.raw`\\$\\(\\s*(${nameSource})\\s*\\)`, \"gu\"),\n new RegExp(String.raw`@(${nameSource})@`, \"gu\"),\n];\nfunction resolveVariable(name: string, variables: Variables): string | undefined {\n const direct = variables[name] ?? process.env[name];\n if (direct !== undefined) {\n return direct;\n }\n const unscoped = /^(?:env|vars|variables)[.:](.+)$/iu.exec(name)?.[1];\n return unscoped === undefined ? undefined : (variables[unscoped] ?? process.env[unscoped]);\n}\nexport function expandVariables(value: string, variables: Variables): string {\n let result = value;\n for (const pattern of expressionPatterns) {\n result = result.replace(pattern, (match, name: string) => {\n const replacement = resolveVariable(name, variables);\n return replacement === undefined ? match : replacement;\n });\n }\n return result;\n}\n","import type { Candidate, SearchLevel } from \"./types.js\";\nimport { settings } from \"../config/settings.js\";\nimport { variableReferenceSource } from \"./variables.js\";\n\nconst explicitPattern =\n /(?:file:\\/\\/\\/?|[A-Za-z]:[\\\\/]|\\\\\\\\|\\/|(?:\\.{1,2}|~)[\\\\/])[^\"'`<>()[\\]{}\\s]+/gu;\nconst quotedPattern = /([\"'`])(?<value>[^\"'`\\r\\n]+)\\1/gu;\nconst tokenPattern = /[^\\s]+/gu;\nconst pathTokenPattern =\n /(?:(?:[\\p{L}\\p{N}_@%$+~.#[\\],-]+[\\\\/])+(?:[\\p{L}\\p{N}_@%$+~.#[\\],-]+)|[\\p{L}\\p{N}_@%$+~.#[\\],-]+\\.[\\p{L}\\p{N}_@%$-]{1,16})(?::\\d+){0,2}/gu;\nconst unquotedPathCharacterSource = \"[^\\\"'`<>()[\\\\]{}\\\\s]\";\nconst variablePathPattern = new RegExp(\n `${variableReferenceSource}(?:[\\\\\\\\/]${unquotedPathCharacterSource}+)+`,\n \"giu\",\n);\nconst clausePattern = /[^\\r\\n!?!?;;。]+/gu;\nconst pathHintPattern =\n /[\\\\/]|(?:^|[\\s\"'`])(?:\\.{1,2}|~|%[A-Za-z_][A-Za-z0-9_]*%|\\$\\{?[A-Za-z_][A-Za-z0-9_]*\\}?)(?:[\\\\/]|$)|\\.[\\p{L}\\p{N}]{1,16}(?::\\d+){0,2}(?:$|[\\s,.;:!?,。;:!?、])/u;\nconst variableHintPattern = new RegExp(String.raw`${variableReferenceSource}(?:[\\\\/]|$)`, \"iu\");\nfunction add(\n result: Candidate[],\n seen: Set<string>,\n value: string,\n start: number,\n end: number,\n kind: Candidate[\"kind\"],\n): void {\n if (value.length === 0 || value === \"/\") {\n return;\n }\n const key = `${start}:${end}:${value}`;\n if (!seen.has(key)) {\n seen.add(key);\n result.push({ end, kind, start, value });\n }\n}\nfunction addMatches(\n result: Candidate[],\n seen: Set<string>,\n text: string,\n pattern: RegExp,\n kind: Candidate[\"kind\"],\n): void {\n for (const match of text.matchAll(pattern)) {\n const value = match[0];\n const start = match.index ?? 0;\n add(result, seen, value, start, start + value.length, kind);\n }\n}\nfunction addQuotedMatches(result: Candidate[], seen: Set<string>, text: string): void {\n for (const match of text.matchAll(quotedPattern)) {\n const value = match.groups?.value;\n if (value === undefined) {\n continue;\n }\n const start = (match.index ?? 0) + match[0].indexOf(value);\n add(result, seen, value, start, start + value.length, \"quoted\");\n }\n}\nfunction addSpanMatches(\n result: Candidate[],\n seen: Set<string>,\n text: string,\n maximumWords: number,\n): void {\n for (const clause of text.matchAll(clausePattern)) {\n const clauseStart = clause.index ?? 0;\n const clauseText = clause[0];\n const tokens = [...clauseText.matchAll(tokenPattern)].map((token) => ({\n end: clauseStart + (token.index ?? 0) + token[0].length,\n hint: Number(pathHintPattern.test(token[0]) || variableHintPattern.test(token[0])),\n start: clauseStart + (token.index ?? 0),\n value: token[0],\n }));\n const hintCounts = [0];\n for (const token of tokens) {\n hintCounts.push((hintCounts.at(-1) ?? 0) + token.hint);\n }\n for (let start = 0; start < tokens.length; start += 1) {\n const last = Math.min(tokens.length, start + maximumWords);\n for (let end = start + 1; end <= last; end += 1) {\n const firstToken = tokens[start];\n const lastToken = tokens[end - 1];\n const hintsBefore = hintCounts[start];\n const hintsAfter = hintCounts[end];\n if (\n firstToken === undefined ||\n lastToken === undefined ||\n hintsBefore === undefined ||\n hintsAfter === undefined ||\n hintsBefore === hintsAfter\n ) {\n continue;\n }\n const value = text.slice(firstToken.start, lastToken.end);\n if (pathHintPattern.test(value)) {\n add(result, seen, value, firstToken.start, lastToken.end, \"span\");\n }\n }\n }\n }\n}\nexport function extractCandidates(text: string, level: SearchLevel): Candidate[] {\n const result: Candidate[] = [];\n const seen = new Set<string>();\n addQuotedMatches(result, seen, text);\n addMatches(result, seen, text, explicitPattern, \"explicit\");\n if (level >= 2) {\n addMatches(result, seen, text, variablePathPattern, \"heuristic\");\n addMatches(result, seen, text, pathTokenPattern, \"heuristic\");\n }\n if (level >= 3) {\n const maximumWords =\n settings.spanWordLimits[Math.min(level - 3, settings.spanWordLimits.length - 1)];\n if (maximumWords === undefined) {\n throw new RangeError(\"No text-span level is configured\");\n }\n addSpanMatches(result, seen, text, maximumWords);\n }\n return result;\n}\n","import { isIP } from \"node:net\";\nimport { hostname, networkInterfaces } from \"node:os\";\nimport nodePath from \"node:path\";\nimport nativeBridge from \"./windows-bridge.cjs\";\n\nconst native = process.platform === \"win32\" ? nativeBridge : undefined;\nconst uncServerSegmentPattern = /^[^\\\\/:*?\"<>|]+$/u;\nconst unmappedDriveErrors = new Set([1200, 1201, 1203, 1222, 2250]);\nconst errorMoreData = 234;\nconst mappingBufferChars = 32_768;\ninterface UncPath {\n canonical: string;\n server: string;\n share: string;\n suffix: string;\n}\ninterface DriveMapping {\n drive: string;\n remote: string;\n}\nfunction normalizeServerName(value: string): string {\n return value.replace(/\\.+$/u, \"\").toLowerCase();\n}\nfunction addLocalServerName(names: Set<string>, value: string | undefined): void {\n if (value !== undefined && uncServerSegmentPattern.test(value)) {\n names.add(normalizeServerName(value));\n }\n}\nfunction addIpv6LiteralName(names: Set<string>, value: string): void {\n const zoneIndex = value.indexOf(\"%\");\n const address = zoneIndex === -1 ? value : value.slice(0, zoneIndex);\n const zone = zoneIndex === -1 ? \"\" : `s${value.slice(zoneIndex + 1)}`;\n addLocalServerName(names, `${address.replaceAll(\":\", \"-\")}${zone}.ipv6-literal.net`);\n}\nfunction collectLocalServerNames(): Set<string> {\n const names = new Set<string>([\"localhost\"]);\n const computerName = process.env.COMPUTERNAME;\n addLocalServerName(names, hostname());\n addLocalServerName(names, computerName);\n if (computerName !== undefined && process.env.USERDNSDOMAIN !== undefined) {\n addLocalServerName(names, `${computerName}.${process.env.USERDNSDOMAIN}`);\n }\n for (const addresses of Object.values(networkInterfaces())) {\n for (const address of addresses ?? []) {\n if (isIP(address.address) === 4) {\n addLocalServerName(names, address.address);\n } else if (isIP(address.address) === 6) {\n addIpv6LiteralName(names, address.address);\n }\n }\n }\n addLocalServerName(names, \"--1.ipv6-literal.net\");\n return names;\n}\nconst localServerNames =\n process.platform === \"win32\" ? collectLocalServerNames() : new Set<string>();\nlet driveMappings: DriveMapping[] | undefined;\nfunction containsControlCharacter(value: string): boolean {\n return [...value].some((character) => character.charCodeAt(0) < 32);\n}\nfunction normalizeUncRoot(value: string): string {\n return value.replaceAll(\"/\", \"\\\\\").replace(/\\\\+$/u, \"\").toLowerCase();\n}\nfunction parseUncPath(value: string): UncPath | undefined {\n const normalized = value.replaceAll(\"/\", \"\\\\\");\n const extended = normalized.slice(0, 8).toLowerCase() === \"\\\\\\\\?\\\\unc\\\\\";\n if (normalized.startsWith(\"\\\\\\\\.\\\\\") || (normalized.startsWith(\"\\\\\\\\?\\\\\") && !extended)) {\n return undefined;\n }\n const serverStart = extended ? 8 : 2;\n const serverSeparator = normalized.slice(serverStart).indexOf(\"\\\\\");\n if (serverSeparator <= 0) {\n return undefined;\n }\n const serverEnd = serverStart + serverSeparator;\n const shareStart = serverEnd + 1;\n const shareSeparator = normalized.slice(shareStart).indexOf(\"\\\\\");\n const shareEnd = shareSeparator === -1 ? normalized.length : shareStart + shareSeparator;\n const server = normalized.slice(serverStart, serverEnd);\n const share = normalized.slice(shareStart, shareEnd);\n if (\n share.length === 0 ||\n !uncServerSegmentPattern.test(server) ||\n !uncServerSegmentPattern.test(share)\n ) {\n return undefined;\n }\n const suffix = normalized.slice(shareEnd);\n return {\n canonical: `\\\\\\\\${server}\\\\${share}${suffix}`,\n server,\n share,\n suffix,\n };\n}\nfunction queryDriveMapping(drive: string): string | undefined {\n if (native === undefined) {\n return undefined;\n }\n const { remote, status } = native.getDriveConnection(drive, mappingBufferChars);\n if (status === errorMoreData) {\n throw new Error(`WNetGetConnectionW returned an oversized mapping for ${drive}`);\n }\n if (unmappedDriveErrors.has(status)) {\n return undefined;\n }\n if (status !== 0) {\n throw new Error(`WNetGetConnectionW failed for ${drive} with error ${status}`);\n }\n if (typeof remote !== \"string\" || !remote.startsWith(\"\\\\\\\\\")) {\n throw new TypeError(`WNetGetConnectionW returned an invalid mapping for ${drive}`);\n }\n return normalizeUncRoot(remote);\n}\nfunction queryDriveMappings(): DriveMapping[] {\n if (driveMappings !== undefined) {\n return driveMappings;\n }\n const result: DriveMapping[] = [];\n for (let code = \"A\".charCodeAt(0); code <= \"Z\".charCodeAt(0); code += 1) {\n const drive = `${String.fromCharCode(code)}:`;\n const remote = queryDriveMapping(drive);\n if (remote !== undefined) {\n result.push({ drive, remote });\n }\n }\n driveMappings = result.toSorted((left, right) => right.remote.length - left.remote.length);\n return driveMappings;\n}\nfunction resolveMappedUncPath(path: UncPath): string | undefined {\n const canonical = normalizeUncRoot(path.canonical);\n const mapping = queryDriveMappings().find(\n ({ remote }) => canonical === remote || canonical.startsWith(`${remote}\\\\`),\n );\n if (mapping === undefined) {\n return undefined;\n }\n const relative = path.canonical.slice(mapping.remote.length);\n return nodePath.win32.normalize(`${mapping.drive}${relative}`);\n}\nfunction isLocalServer(value: string): boolean {\n const normalized = normalizeServerName(value);\n return (\n localServerNames.has(normalized) ||\n (isIP(value) === 4 && value.split(\".\")[0] === \"127\") ||\n normalized === \"--1.ipv6-literal.net\"\n );\n}\nfunction resolveLocalAdministrativeShare(path: UncPath): string | undefined {\n const match = /^([A-Za-z])\\$$/u.exec(path.share);\n if (match === null || !isLocalServer(path.server)) {\n return undefined;\n }\n return nodePath.win32.normalize(`${match[1]}:${path.suffix || \"\\\\\"}`);\n}\nexport function resolveUncPath(value: string): string | undefined {\n if (process.platform !== \"win32\" || (!value.startsWith(\"\\\\\\\\\") && !value.startsWith(\"//\"))) {\n return value;\n }\n if (containsControlCharacter(value)) {\n return undefined;\n }\n const path = parseUncPath(value);\n if (path === undefined) {\n return undefined;\n }\n return resolveMappedUncPath(path) ?? resolveLocalAdministrativeShare(path);\n}\n","import nodePath from \"node:path\";\nimport nativeBridge from \"./windows-bridge.cjs\";\n\nconst fileAttributeHidden = 0x2;\nconst invalidFileAttributes = 0xffffffff;\nconst missingPathErrors = new Set([2, 3]);\nexport function hasWindowsHiddenAttribute(filePath: string): boolean {\n if (process.platform !== \"win32\") {\n throw new Error(\"Windows file attributes are unavailable on this platform\");\n }\n const { attributes, error } = nativeBridge.getFileAttributes(nodePath.toNamespacedPath(filePath));\n if (!Number.isInteger(attributes) || !Number.isInteger(error)) {\n throw new TypeError(\"Windows file attribute lookup returned an invalid result\");\n }\n if (attributes !== invalidFileAttributes) {\n if (error !== 0) {\n throw new Error(`Windows file attribute lookup returned attributes with error ${error}`);\n }\n return (attributes & fileAttributeHidden) !== 0;\n }\n if (missingPathErrors.has(error)) {\n return false;\n }\n throw new Error(`Windows file attribute lookup failed for ${filePath} with error ${error}`);\n}\n","import nodePath from \"node:path\";\nimport { hasWindowsHiddenAttribute } from \"../native/attributes.js\";\n\nfunction pathKey(value: string): string {\n return process.platform === \"win32\" ? value.toLowerCase() : value;\n}\nfunction relativePath(filePath: string, boundary: string): string {\n const relative = nodePath.relative(boundary, filePath);\n if (\n nodePath.isAbsolute(relative) ||\n relative === \"..\" ||\n relative.startsWith(`..${nodePath.sep}`)\n ) {\n throw new RangeError(`${filePath} is outside the hidden-path boundary ${boundary}`);\n }\n return relative;\n}\nfunction hasHiddenDotSegment(filePath: string, boundary: string): boolean {\n return relativePath(filePath, boundary)\n .split(/[\\\\/]/u)\n .some((part) => part.length > 1 && part.startsWith(\".\"));\n}\nexport function createHiddenPathDetector() {\n const attributeCache = new Map<string, boolean>();\n return {\n isHidden(filePath: string, boundary: string): boolean {\n if (process.platform !== \"win32\") {\n return hasHiddenDotSegment(filePath, boundary);\n }\n relativePath(filePath, boundary);\n const boundaryKey = pathKey(nodePath.resolve(boundary));\n let current = nodePath.resolve(filePath);\n while (pathKey(current) !== boundaryKey) {\n const key = pathKey(current);\n let hidden = attributeCache.get(key);\n if (hidden === undefined) {\n hidden = hasWindowsHiddenAttribute(current);\n attributeCache.set(key, hidden);\n }\n if (hidden) {\n return true;\n }\n const parent = nodePath.dirname(current);\n if (parent === current) {\n throw new Error(`Unable to reach hidden-path boundary ${boundary} from ${filePath}`);\n }\n current = parent;\n }\n return false;\n },\n };\n}\n","import nodeFileSystem from \"node:fs\";\nimport nodePath from \"node:path\";\nimport type { Options as GlobbyOptions } from \"globby\";\nimport { createHiddenPathDetector } from \"./hidden.js\";\n\ntype ReadDirectory = NonNullable<NonNullable<GlobbyOptions[\"fs\"]>[\"readdir\"]>;\nconst unreadableDirectoryErrors = new Set([\"EACCES\", \"ENOTDIR\", \"ENOENT\", \"EPERM\"]);\ninterface DirectoryEntry {\n isBlockDevice(): boolean;\n isCharacterDevice(): boolean;\n isDirectory(): boolean;\n isFIFO(): boolean;\n isFile(): boolean;\n isSocket(): boolean;\n isSymbolicLink(): boolean;\n name: string;\n}\ntype DirectoryEntryCallback = (\n error: NodeJS.ErrnoException | null,\n entries: DirectoryEntry[],\n) => void;\ntype DirectoryNameCallback = (error: NodeJS.ErrnoException | null, entries: string[]) => void;\nfunction isUnreadableDirectoryError(error: NodeJS.ErrnoException): boolean {\n return error.code !== undefined && unreadableDirectoryErrors.has(error.code);\n}\nfunction completeDirectoryRead<T>(\n error: NodeJS.ErrnoException | null,\n entries: T[],\n callback: (error: NodeJS.ErrnoException | null, entries: T[]) => void,\n): void {\n if (error === null) {\n callback(null, entries);\n } else if (isUnreadableDirectoryError(error)) {\n callback(null, []);\n } else {\n callback(error, []);\n }\n}\nfunction createReadDirectory(\n root: string,\n searchHidden: boolean,\n readDirectory: ReadDirectory,\n): ReadDirectory {\n const hiddenDetector = createHiddenPathDetector();\n function traverseReadDirectory(\n filePath: string,\n options: { withFileTypes: true },\n callback: DirectoryEntryCallback,\n ): void;\n function traverseReadDirectory(filePath: string, callback: DirectoryNameCallback): void;\n function traverseReadDirectory(\n filePath: string,\n optionsOrCallback: { withFileTypes: true } | DirectoryNameCallback,\n entryCallback?: DirectoryEntryCallback,\n ): void {\n if (typeof optionsOrCallback === \"function\") {\n readDirectory(filePath, (error, entries) => {\n completeDirectoryRead(error, entries, optionsOrCallback);\n });\n return;\n }\n if (entryCallback === undefined) {\n throw new TypeError(\"A directory entry callback is required\");\n }\n readDirectory(filePath, optionsOrCallback, (error, entries) => {\n if (error !== null || searchHidden) {\n completeDirectoryRead(error, entries, entryCallback);\n return;\n }\n try {\n const visibleEntries = entries.filter(\n (entry) =>\n !entry.isDirectory() ||\n !hiddenDetector.isHidden(nodePath.join(filePath, entry.name), root),\n );\n entryCallback(null, visibleEntries);\n } catch (caught) {\n entryCallback(caught instanceof Error ? caught : new Error(String(caught)), []);\n }\n });\n }\n return traverseReadDirectory;\n}\nexport function createTraversalFileSystem(\n root: string,\n searchHidden: boolean,\n readDirectory: ReadDirectory = nodeFileSystem.readdir,\n) {\n return {\n ...nodeFileSystem,\n readdir: createReadDirectory(root, searchHidden, readDirectory),\n };\n}\n","import { stat } from \"node:fs/promises\";\nimport nodePath from \"node:path\";\nimport { convertPathToPattern, globby } from \"globby\";\nimport isPathInside from \"is-path-inside\";\nimport { settings } from \"../../config/settings.js\";\nimport { resolveUncPath } from \"../native/unc.js\";\nimport type { SearchEntry } from \"../types.js\";\nimport { createHiddenPathDetector } from \"./hidden.js\";\nimport { createTraversalFileSystem } from \"./traversal.js\";\n\nfunction pathKey(value: string): string {\n return process.platform === \"win32\" ? value.toLowerCase() : value;\n}\nfunction isWithinRoot(filePath: string, root: string): boolean {\n return filePath === root || isPathInside(filePath, root);\n}\nfunction traversalOptions(root: string, searchHidden: boolean) {\n return {\n caseSensitiveMatch: process.platform !== \"win32\",\n cwd: root,\n dot: process.platform === \"win32\" || searchHidden,\n followSymbolicLinks: false,\n fs: createTraversalFileSystem(root, searchHidden),\n onlyFiles: false,\n unique: true,\n } as const;\n}\nfunction globbyOptions(root: string, respectIgnore: boolean, searchHidden: boolean) {\n return {\n ...traversalOptions(root, searchHidden),\n expandDirectories: false,\n gitignore: respectIgnore,\n globalGitignore: respectIgnore,\n ...(respectIgnore ? { ignoreFiles: settings.ignoreFilePatterns } : {}),\n } as const;\n}\nexport async function resolveSearchDirectories(directories: readonly string[]): Promise<string[]> {\n if (!Array.isArray(directories)) {\n throw new TypeError(\"directories must be an array\");\n }\n if (directories.length === 0) {\n throw new RangeError(\"directories must not be empty\");\n }\n const unique = new Map<string, string>();\n for (const directory of directories) {\n if (typeof directory !== \"string\" || directory.length === 0) {\n throw new TypeError(\"every directory must be a non-empty string\");\n }\n const resolvedUnc = resolveUncPath(directory);\n if (resolvedUnc === undefined || resolvedUnc.length === 0) {\n throw new TypeError(`${directory} cannot be represented as a drive-based path`);\n }\n const resolved = nodePath.resolve(resolvedUnc);\n unique.set(pathKey(resolved), resolved);\n }\n await Promise.all(\n [...unique.values()].map(async (directory) => {\n if (!(await stat(directory)).isDirectory()) {\n throw new TypeError(`${directory} is not a directory`);\n }\n }),\n );\n return [...unique.values()];\n}\nexport async function listSearchEntries(\n root: string,\n respectIgnore: boolean,\n searchHidden: boolean,\n): Promise<SearchEntry[]> {\n const entries = await globby(\"**/*\", {\n ...globbyOptions(root, respectIgnore, searchHidden),\n objectMode: true,\n });\n const hiddenDetector = createHiddenPathDetector();\n return entries\n .filter(\n (entry) => searchHidden || !hiddenDetector.isHidden(nodePath.resolve(root, entry.path), root),\n )\n .map((entry) => ({\n directory: entry.dirent.isDirectory(),\n path: entry.path,\n }));\n}\nexport async function filterSearchablePaths(\n paths: readonly string[],\n roots: readonly string[],\n respectIgnore: boolean,\n searchHidden: boolean,\n): Promise<Set<string>> {\n const allowed = new Set<string>();\n const pathsByRoot = new Map<string, string[]>();\n const hiddenDetector = createHiddenPathDetector();\n for (const filePath of paths) {\n let hasSearchRoot = false;\n for (const root of roots) {\n if (!isWithinRoot(filePath, root)) {\n continue;\n }\n hasSearchRoot = true;\n const relative = nodePath.relative(root, filePath);\n if (!searchHidden && hiddenDetector.isHidden(filePath, root)) {\n continue;\n }\n if (relative === \"\" || !respectIgnore) {\n allowed.add(filePath);\n } else {\n const grouped = pathsByRoot.get(root) ?? [];\n grouped.push(relative);\n pathsByRoot.set(root, grouped);\n }\n }\n if (hasSearchRoot) {\n continue;\n }\n const filesystemRoot = nodePath.parse(filePath).root;\n const hiddenBoundary =\n process.platform === \"win32\" ? nodePath.dirname(filePath) : filesystemRoot;\n if (searchHidden || !hiddenDetector.isHidden(filePath, hiddenBoundary)) {\n allowed.add(filePath);\n }\n }\n await Promise.all(\n [...pathsByRoot].map(async ([root, relativePaths]) => {\n const patterns = relativePaths.map(convertPathToPattern);\n const matches = await globby(patterns, {\n ...globbyOptions(root, true, true),\n absolute: true,\n });\n for (const match of matches) {\n allowed.add(nodePath.normalize(match));\n }\n }),\n );\n return allowed;\n}\n","import { filterSearchablePaths } from \"../search/policy.js\";\nimport type { PathKind } from \"../types.js\";\n\nfunction pathKey(value: string): string {\n return process.platform === \"win32\" ? value.toLowerCase() : value;\n}\nexport async function applySearchPolicies(\n existingPaths: ReadonlyMap<string, PathKind>,\n roots: readonly string[],\n respectIgnore: boolean,\n searchHidden: boolean,\n): Promise<Map<string, PathKind>> {\n if (!respectIgnore && searchHidden) {\n return new Map(existingPaths);\n }\n const searchablePaths = await filterSearchablePaths(\n [...existingPaths.keys()],\n roots,\n respectIgnore,\n searchHidden,\n );\n const searchableKeys = new Set([...searchablePaths].map(pathKey));\n return new Map([...existingPaths].filter(([filePath]) => searchableKeys.has(pathKey(filePath))));\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport nodePath from \"node:path\";\nimport pLimit from \"p-limit\";\nimport { settings } from \"../../config/settings.js\";\nimport type { PathKind } from \"../types.js\";\n\nconst unavailablePathErrors = new Set([\n \"EACCES\",\n \"ELOOP\",\n \"ENAMETOOLONG\",\n \"ENOTDIR\",\n \"ENOENT\",\n \"EPERM\",\n \"EINVAL\",\n]);\nconst unverifiableUncErrors = new Set([\"UNKNOWN\", \"EUNKNOWN\"]);\nfunction pathKey(value: string): string {\n return process.platform === \"win32\" ? value.toLowerCase() : value;\n}\nfunction isUnavailablePathError(error: unknown, filePath?: string): boolean {\n const code =\n error instanceof Error && \"code\" in error && typeof error.code === \"string\"\n ? error.code\n : undefined;\n return (\n code !== undefined &&\n (unavailablePathErrors.has(code) ||\n (filePath?.startsWith(\"\\\\\\\\\") === true && unverifiableUncErrors.has(code)))\n );\n}\nasync function classifyPath(filePath: string): Promise<PathKind | undefined> {\n try {\n const pathStats = await stat(filePath);\n if (pathStats.isFile()) {\n return \"file\";\n }\n return pathStats.isDirectory() ? \"directory\" : undefined;\n } catch (error) {\n if (isUnavailablePathError(error, filePath)) {\n return undefined;\n }\n throw error;\n }\n}\nasync function classifyAndAdd(found: Map<string, PathKind>, filePath: string): Promise<void> {\n const kind = await classifyPath(filePath);\n if (kind !== undefined) {\n found.set(filePath, kind);\n }\n}\nexport async function classifyExistingPaths(\n paths: readonly string[],\n roots: readonly string[],\n): Promise<Map<string, PathKind>> {\n const found = new Map<string, PathKind>();\n const limit = pLimit(settings.validationConcurrency);\n if (paths.length < settings.batchValidationThreshold) {\n await limit.map(paths, (filePath) => classifyAndAdd(found, filePath));\n return found;\n }\n const rootKeys = new Set(roots.map(pathKey));\n const pathsByParent = new Map<string, { parent: string; paths: string[] }>();\n for (const filePath of paths) {\n if (rootKeys.has(pathKey(filePath))) {\n found.set(filePath, \"directory\");\n continue;\n }\n const parent = nodePath.dirname(filePath);\n const key = pathKey(parent);\n const group = pathsByParent.get(key) ?? { parent, paths: [] };\n group.paths.push(filePath);\n pathsByParent.set(key, group);\n }\n const directPaths: string[] = [];\n const scannedGroups: { parent: string; paths: string[] }[] = [];\n for (const group of pathsByParent.values()) {\n if (group.paths.length < settings.directoryScanThreshold) {\n directPaths.push(...group.paths);\n } else {\n scannedGroups.push(group);\n }\n }\n await Promise.all([\n limit.map(directPaths, (filePath) => classifyAndAdd(found, filePath)),\n limit.map(scannedGroups, async ({ parent, paths: groupPaths }) => {\n let entries;\n try {\n entries = await readdir(parent, { withFileTypes: true });\n } catch (error) {\n if (isUnavailablePathError(error, parent)) {\n return;\n }\n throw error;\n }\n const entriesByName = new Map(entries.map((entry) => [pathKey(entry.name), entry]));\n await Promise.all(\n groupPaths.map(async (filePath) => {\n const name = nodePath.basename(filePath);\n const entry = entriesByName.get(pathKey(name));\n if (entry?.isFile()) {\n found.set(filePath, \"file\");\n } else if (entry?.isDirectory()) {\n found.set(filePath, \"directory\");\n } else if (entry !== undefined || (process.platform === \"win32\" && name.includes(\":\"))) {\n await classifyAndAdd(found, filePath);\n }\n }),\n );\n }),\n ]);\n return found;\n}\n","import type { PathMatch } from \"../types.js\";\n\nexport function removeContainedMatches(matches: readonly PathMatch[]): PathMatch[] {\n const ordered = matches\n .map((match, index) => ({ index, match }))\n .toSorted(\n ({ match: left }, { match: right }) =>\n left.position.start - right.position.start || right.position.end - left.position.end,\n );\n const kept = new Set<number>();\n let maxEndBeforeStart = -1;\n let groupStart = -1;\n let maxEndInGroup = -1;\n for (const { index, match } of ordered) {\n const { start, end } = match.position;\n if (start !== groupStart) {\n maxEndBeforeStart = Math.max(maxEndBeforeStart, maxEndInGroup);\n groupStart = start;\n maxEndInGroup = -1;\n }\n if (maxEndBeforeStart < end && maxEndInGroup <= end) {\n kept.add(index);\n }\n maxEndInGroup = Math.max(maxEndInGroup, end);\n }\n return matches.filter((_, index) => kept.has(index));\n}\n","import { settings } from \"../../config/settings.js\";\nimport type { Candidate, PathLocation, PathPosition } from \"../types.js\";\n\nexport interface PreparedCandidate {\n location?: PathLocation;\n position: PathPosition;\n value: string;\n}\nfunction parseLocationPart(value: string, name: string): number {\n const result = Number(value);\n if (!Number.isSafeInteger(result)) {\n throw new RangeError(`${name} must be a safe integer`);\n }\n return result;\n}\nexport function prepareCandidate(candidate: Candidate): PreparedCandidate | undefined {\n let end = candidate.end;\n let start = candidate.start;\n let value = candidate.value;\n if (candidate.kind !== \"inventory\" && candidate.kind !== \"quoted\") {\n const startTrimmed = value.trimStart();\n start += value.length - startTrimmed.length;\n value = startTrimmed;\n const endTrimmed = value.trimEnd();\n end -= value.length - endTrimmed.length;\n value = endTrimmed;\n if (\n value.length >= 2 &&\n ((value[0] === '\"' && value.at(-1) === '\"') ||\n (value[0] === \"'\" && value.at(-1) === \"'\") ||\n (value[0] === \"`\" && value.at(-1) === \"`\"))\n ) {\n start += 1;\n end -= 1;\n value = value.slice(1, -1);\n }\n while (value.length > 0 && settings.trailingPunctuation.includes(value.at(-1) ?? \"\")) {\n end -= 1;\n value = value.slice(0, -1);\n }\n }\n let location: PathLocation | undefined;\n if (candidate.kind !== \"inventory\") {\n const match = settings.locationSuffixPattern.exec(value);\n if (match !== null) {\n const lineValue = match.groups?.line;\n if (lineValue === undefined) {\n throw new TypeError(\"locationSuffixPattern must capture a line\");\n }\n const columnValue = match.groups?.column;\n location =\n columnValue === undefined\n ? { line: parseLocationPart(lineValue, \"line\") }\n : {\n column: parseLocationPart(columnValue, \"column\"),\n line: parseLocationPart(lineValue, \"line\"),\n };\n end -= match[0].length;\n value = value.slice(0, match.index);\n }\n }\n if (value === \"/\") {\n return undefined;\n }\n return {\n ...(location === undefined ? {} : { location }),\n position: { end, start },\n value,\n };\n}\n","import { fileURLToPath } from \"node:url\";\nimport nodePath from \"node:path\";\nimport { applySearchPolicies } from \"./eligibility.js\";\nimport { classifyExistingPaths } from \"./existence.js\";\nimport { removeContainedMatches } from \"./containment.js\";\nimport { prepareCandidate } from \"./preparation.js\";\nimport { expandVariables } from \"../variables.js\";\nimport { resolveUncPath } from \"../native/unc.js\";\nimport type {\n Candidate,\n PathKind,\n PathLocation,\n PathMatch,\n PathPosition,\n Variables,\n} from \"../types.js\";\n\ninterface ResolvedCandidate {\n expectedKind?: PathKind;\n location?: PathLocation;\n path: string;\n position: PathPosition;\n}\nfunction pathKey(value: string): string {\n return process.platform === \"win32\" ? value.toLowerCase() : value;\n}\nfunction uniquePaths(values: Iterable<string>): string[] {\n const paths = new Map<string, string>();\n for (const value of values) {\n paths.set(pathKey(value), value);\n }\n return [...paths.values()];\n}\nfunction unescape(value: string): string {\n if (value.startsWith(\"\\\\\\\\\") && !value.startsWith(\"\\\\\\\\\\\\\\\\\")) {\n return value;\n }\n return value.replace(/\\\\([\"'`\\\\])/gu, \"$1\").replace(/\\\\\\\\/gu, \"\\\\\");\n}\nfunction toPaths(value: string, roots: readonly string[], variables: Variables): string[] {\n let expanded = expandVariables(value, variables);\n if (expanded.startsWith(\"file://\")) {\n try {\n expanded = fileURLToPath(expanded);\n } catch (error) {\n if (error instanceof TypeError) {\n return [];\n }\n throw error;\n }\n } else {\n expanded = unescape(expanded);\n if (expanded === \"~\" || /^~[\\\\/]/u.test(expanded)) {\n expanded = nodePath.join(\n variables.HOME ??\n variables.USERPROFILE ??\n process.env.HOME ??\n process.env.USERPROFILE ??\n \"\",\n expanded.slice(2),\n );\n }\n }\n const resolvedPath = resolveUncPath(expanded);\n if (resolvedPath === undefined || resolvedPath.length === 0) {\n return [];\n }\n expanded = resolvedPath;\n if (nodePath.isAbsolute(expanded)) {\n return [nodePath.normalize(expanded)];\n }\n return uniquePaths(roots.map((root) => nodePath.resolve(root, expanded)));\n}\nfunction mergeLocation(match: PathMatch, location: PathLocation | undefined): void {\n if (location === undefined) {\n return;\n }\n if (match.location === undefined) {\n match.location = location;\n return;\n }\n if (match.location.line !== location.line || match.location.column !== location.column) {\n throw new Error(\"Candidates for the same path and position have conflicting locations\");\n }\n}\nexport async function validateCandidates(\n candidates: Candidate[],\n roots: readonly string[],\n variables: Variables,\n respectIgnore: boolean,\n searchHidden: boolean,\n): Promise<PathMatch[]> {\n const resolvedCandidates: ResolvedCandidate[] = [];\n const validationPaths = new Map<string, string>();\n for (const candidate of candidates) {\n const prepared = prepareCandidate(candidate);\n if (prepared === undefined) {\n continue;\n }\n const paths = toPaths(prepared.value, roots, variables);\n for (const filePath of paths) {\n resolvedCandidates.push({\n ...(candidate.expectedKind === undefined ? {} : { expectedKind: candidate.expectedKind }),\n ...(prepared.location === undefined ? {} : { location: prepared.location }),\n path: filePath,\n position: prepared.position,\n });\n validationPaths.set(pathKey(filePath), filePath);\n }\n }\n const classifiedPaths = await applySearchPolicies(\n await classifyExistingPaths([...validationPaths.values()], roots),\n roots,\n respectIgnore,\n searchHidden,\n );\n const kindsByPath = new Map(\n [...classifiedPaths].map(([filePath, kind]) => [pathKey(filePath), kind]),\n );\n const matches = new Map<string, PathMatch>();\n for (const { expectedKind, location, path, position } of resolvedCandidates) {\n const kind = kindsByPath.get(pathKey(path));\n if (kind === undefined || (expectedKind !== undefined && kind !== expectedKind)) {\n continue;\n }\n const key = `${pathKey(path)}\\0${position.start}\\0${position.end}`;\n const existing = matches.get(key);\n if (existing !== undefined) {\n mergeLocation(existing, location);\n continue;\n }\n matches.set(key, {\n kind,\n ...(location === undefined ? {} : { location }),\n path,\n position,\n });\n }\n return removeContainedMatches([...matches.values()]);\n}\n","import nodePath from \"node:path\";\nimport { AhoCorasick } from \"@monyone/aho-corasick\";\nimport { listSearchEntries } from \"./policy.js\";\nimport type {\n Candidate,\n InventoryMatcher,\n InventoryPattern,\n RootPrefix,\n SearchEntry,\n} from \"../types.js\";\n\nlet inventoryMatcherCache: InventoryMatcher | undefined;\nfunction isBoundary(\n value: string | undefined,\n following: string | undefined,\n directoryEnd = false,\n): boolean {\n if (directoryEnd && value !== \".\") {\n return value === undefined || /[\\s\"'`<>)\\]},;:!?,。;:!?、]/u.test(value);\n }\n if (value === \".\") {\n return following === undefined || !/[\\p{L}\\p{N}_-]/u.test(following);\n }\n return value === undefined || !/[\\p{L}\\p{N}_/\\\\-]/u.test(value);\n}\nfunction addMatch(\n result: Candidate[],\n seen: Set<string>,\n text: string,\n value: string,\n start: number,\n end: number,\n expectedKind: InventoryPattern[\"expectedKind\"],\n): void {\n if (\n !isBoundary(text[start - 1], text[start]) ||\n !isBoundary(text[end], text[end + 1], expectedKind === \"directory\")\n ) {\n return;\n }\n const key = `${start}:${end}:${text.slice(start, end)}`;\n if (!seen.has(key)) {\n seen.add(key);\n result.push({ end, expectedKind, kind: \"inventory\", start, value });\n }\n}\nfunction addVariant(\n patterns: Map<string, InventoryPattern>,\n entry: SearchEntry,\n value: string,\n): void {\n const key = process.platform === \"win32\" ? value.toLowerCase() : value;\n if (!patterns.has(key)) {\n patterns.set(key, {\n expectedKind: entry.directory ? \"directory\" : \"file\",\n relative: entry.path,\n value,\n });\n }\n}\nfunction addEntryVariants(patterns: Map<string, InventoryPattern>, entry: SearchEntry): void {\n const native = entry.path.replaceAll(\"/\", nodePath.sep);\n if (entry.directory) {\n addVariant(patterns, entry, `${entry.path}/`);\n addVariant(patterns, entry, `${native}${nodePath.sep}`);\n return;\n }\n addVariant(patterns, entry, entry.path);\n addVariant(patterns, entry, native);\n}\nfunction createRootPrefixes(roots: readonly string[]): RootPrefix[] {\n const prefixes = new Map<string, RootPrefix>();\n for (const root of roots) {\n const native = root.endsWith(nodePath.sep) ? root : `${root}${nodePath.sep}`;\n const slashRoot = root.replaceAll(nodePath.sep, \"/\");\n const slash = slashRoot.endsWith(\"/\") ? slashRoot : `${slashRoot}/`;\n for (const value of [native, slash]) {\n const key = process.platform === \"win32\" ? value.toLowerCase() : value;\n prefixes.set(key, { root, value: key });\n }\n }\n return [...prefixes.values()];\n}\nfunction addAbsoluteMatch(\n result: Candidate[],\n seen: Set<string>,\n source: string,\n text: string,\n pattern: InventoryPattern,\n prefixes: readonly RootPrefix[],\n end: number,\n relativeStart: number,\n): boolean {\n for (const prefix of prefixes) {\n const start = relativeStart - prefix.value.length;\n if (start >= 0 && source.startsWith(prefix.value, start)) {\n addMatch(\n result,\n seen,\n text,\n nodePath.resolve(prefix.root, pattern.relative),\n start,\n end,\n pattern.expectedKind,\n );\n return true;\n }\n }\n return false;\n}\nfunction hasSameEntries(\n cached: InventoryMatcher,\n entries: readonly (readonly SearchEntry[])[],\n): boolean {\n if (cached.entries.length !== entries.length) {\n return false;\n }\n for (let index = 0; index < entries.length; index += 1) {\n const cachedEntries = cached.entries[index];\n const currentEntries = entries[index];\n if (cachedEntries === undefined || currentEntries === undefined) {\n return false;\n }\n if (cachedEntries.length !== currentEntries.length) {\n return false;\n }\n for (let entryIndex = 0; entryIndex < currentEntries.length; entryIndex += 1) {\n const cachedEntry = cachedEntries[entryIndex];\n const currentEntry = currentEntries[entryIndex];\n if (\n cachedEntry === undefined ||\n currentEntry === undefined ||\n cachedEntry.directory !== currentEntry.directory ||\n cachedEntry.path !== currentEntry.path\n ) {\n return false;\n }\n }\n }\n return true;\n}\nfunction canReuseMatcher(\n cached: InventoryMatcher | undefined,\n entries: readonly (readonly SearchEntry[])[],\n roots: readonly string[],\n respectIgnore: boolean,\n searchHidden: boolean,\n): cached is InventoryMatcher {\n return (\n cached !== undefined &&\n cached.respectIgnore === respectIgnore &&\n cached.searchHidden === searchHidden &&\n cached.roots.length === roots.length &&\n cached.roots.every((root, index) => root === roots[index]) &&\n hasSameEntries(cached, entries)\n );\n}\nexport async function inventoryCandidates(\n text: string,\n roots: readonly string[],\n respectIgnore: boolean,\n searchHidden: boolean,\n): Promise<Candidate[]> {\n const entries = await Promise.all(\n roots.map((root) => listSearchEntries(root, respectIgnore, searchHidden)),\n );\n const result: Candidate[] = [];\n const seen = new Set<string>();\n const source = process.platform === \"win32\" ? text.toLowerCase() : text;\n let inventoryMatcher = inventoryMatcherCache;\n if (!canReuseMatcher(inventoryMatcher, entries, roots, respectIgnore, searchHidden)) {\n const patterns = new Map<string, InventoryPattern>();\n for (const relativeEntries of entries) {\n for (const entry of relativeEntries) {\n addEntryVariants(patterns, entry);\n }\n }\n inventoryMatcher = {\n entries,\n matcher: new AhoCorasick([...patterns.keys()]),\n patterns,\n prefixes: createRootPrefixes(roots),\n respectIgnore,\n roots: [...roots],\n searchHidden,\n };\n inventoryMatcherCache = inventoryMatcher;\n }\n for (const { begin, end, keyword } of inventoryMatcher.matcher.matchInText(source)) {\n const pattern = inventoryMatcher.patterns.get(keyword);\n if (pattern === undefined) {\n throw new Error(\"Inventory matcher returned an unknown path\");\n }\n if (\n !addAbsoluteMatch(result, seen, source, text, pattern, inventoryMatcher.prefixes, end, begin)\n ) {\n addMatch(result, seen, text, pattern.value, begin, end, pattern.expectedKind);\n }\n }\n return result;\n}\n","import { extractCandidates } from \"./candidates.js\";\nimport { validateCandidates } from \"./validation/resolution.js\";\nimport { inventoryCandidates } from \"./search/inventory.js\";\nimport { resolveSearchDirectories } from \"./search/policy.js\";\nimport { settings } from \"../config/settings.js\";\nimport type { FindExistingPathsOptions, PathMatch, Variables } from \"./types.js\";\n\nexport const MAX_LEVEL = settings.spanWordLimits.length + 3;\nfunction validateOptions(value: unknown): asserts value is FindExistingPathsOptions {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(\"options must be an object\");\n }\n}\nfunction validateVariables(value: unknown): asserts value is Variables {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n Object.values(value).some((item) => typeof item !== \"string\")\n ) {\n throw new TypeError(\"variables must be an object of string values\");\n }\n}\nexport async function findExistingPaths(options: FindExistingPathsOptions): Promise<PathMatch[]> {\n validateOptions(options);\n const {\n directories,\n level,\n respectIgnore = settings.respectIgnoreByDefault,\n searchHidden = settings.searchHiddenByDefault,\n text,\n variables = {},\n } = options;\n if (typeof text !== \"string\") {\n throw new TypeError(\"text must be a string\");\n }\n if (!Number.isInteger(level) || level < 1 || level > MAX_LEVEL) {\n throw new RangeError(`level must be an integer from 1 to ${MAX_LEVEL}`);\n }\n validateVariables(variables);\n if (typeof respectIgnore !== \"boolean\") {\n throw new TypeError(\"respectIgnore must be a boolean\");\n }\n if (typeof searchHidden !== \"boolean\") {\n throw new TypeError(\"searchHidden must be a boolean\");\n }\n const roots = await resolveSearchDirectories(directories);\n const candidates = extractCandidates(text, level);\n if (level === MAX_LEVEL) {\n candidates.push(...(await inventoryCandidates(text, roots, respectIgnore, searchHidden)));\n }\n return validateCandidates(candidates, roots, variables, respectIgnore, searchHidden);\n}\nexport type {\n FindExistingPathsOptions,\n PathKind,\n PathLocation,\n PathMatch,\n PathPosition,\n SearchLevel,\n Variables,\n} from \"./types.js\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["pathKey","pathKey","pathKey","pathKey","pathKey"],"sources":["../config/settings.ts","../src/variables.ts","../src/candidates.ts","../src/native/unc.ts","../src/native/attributes.ts","../src/search/hidden.ts","../src/search/traversal.ts","../src/search/policy.ts","../src/validation/eligibility.ts","../src/validation/existence.ts","../src/validation/containment.ts","../src/validation/preparation.ts","../src/validation/resolution.ts","../src/search/inventory.ts","../src/index.ts"],"sourcesContent":["import type { SearchSettings } from \"../src/types.js\";\n\nexport const settings: SearchSettings = {\n batchValidationThreshold: 48,\n directoryScanThreshold: 2,\n ignoreFileNames: [\".ignore\", \".rgignore\"],\n locationSuffixPattern: /:(?<line>\\d+)(?::(?<column>\\d+))?$/u,\n respectIgnoreByDefault: true,\n searchHiddenByDefault: false,\n spanWordLimits: [3, 24],\n trailingPunctuation: \".,;:!?,。;:!?、\",\n validationConcurrency: 32,\n};\n","import type { Variables } from \"./types.js\";\n\nconst nameSource = String.raw`[A-Za-z_][A-Za-z0-9_.-]*`;\nexport const variableReferenceSource = String.raw`(?:\\$\\{\\{\\s*(?:(?:env|vars|variables)[.:])?${nameSource}\\s*\\}\\}|\\{\\{\\s*${nameSource}\\s*\\}\\}|\\$\\{(?:env[.:])?${nameSource}\\}|\\$env:${nameSource}|\\$[A-Za-z_][A-Za-z0-9_]*|%${nameSource}%|!${nameSource}!|\\$\\(\\s*${nameSource}\\s*\\)|@${nameSource}@)`;\nconst expressionPatterns = [\n new RegExp(String.raw`\\$\\{\\{\\s*(?:(?:env|vars|variables)[.:])?(${nameSource})\\s*\\}\\}`, \"giu\"),\n new RegExp(String.raw`\\{\\{\\s*(${nameSource})\\s*\\}\\}`, \"gu\"),\n new RegExp(String.raw`\\$\\{(?:env[.:])?(${nameSource})\\}`, \"giu\"),\n new RegExp(String.raw`\\$env:(${nameSource})`, \"giu\"),\n new RegExp(String.raw`\\$(?!env:)([A-Za-z_][A-Za-z0-9_]*)`, \"giu\"),\n new RegExp(String.raw`%(${nameSource})%`, \"gu\"),\n new RegExp(String.raw`!(${nameSource})!`, \"gu\"),\n new RegExp(String.raw`\\$\\(\\s*(${nameSource})\\s*\\)`, \"gu\"),\n new RegExp(String.raw`@(${nameSource})@`, \"gu\"),\n];\nfunction resolveVariable(name: string, variables: Variables): string | undefined {\n const direct = variables[name] ?? process.env[name];\n if (direct !== undefined) {\n return direct;\n }\n const unscoped = /^(?:env|vars|variables)[.:](.+)$/iu.exec(name)?.[1];\n return unscoped === undefined ? undefined : (variables[unscoped] ?? process.env[unscoped]);\n}\nexport function expandVariables(value: string, variables: Variables): string {\n let result = value;\n for (const pattern of expressionPatterns) {\n result = result.replace(pattern, (match, name: string) => {\n const replacement = resolveVariable(name, variables);\n return replacement === undefined ? match : replacement;\n });\n }\n return result;\n}\n","import type { Candidate, SearchLevel } from \"./types.js\";\nimport { settings } from \"../config/settings.js\";\nimport { variableReferenceSource } from \"./variables.js\";\n\nconst explicitPattern =\n /(?:file:\\/\\/\\/?|[A-Za-z]:[\\\\/]|\\\\\\\\|\\/|(?:\\.{1,2}|~)[\\\\/])[^\"'`<>()[\\]{}\\s]+/gu,\n quotedPattern = /([\"'`])(?<value>[^\"'`\\r\\n]+)\\1/gu,\n tokenPattern = /[^\\s]+/gu,\n pathTokenPattern =\n /(?:(?:[\\p{L}\\p{N}_@%$+~.#[\\],-]+[\\\\/])+(?:[\\p{L}\\p{N}_@%$+~.#[\\],-]+)|[\\p{L}\\p{N}_@%$+~.#[\\],-]+\\.[\\p{L}\\p{N}_@%$-]{1,16})(?::\\d+){0,2}/gu,\n unquotedPathCharacterSource = \"[^\\\"'`<>()[\\\\]{}\\\\s]\",\n variablePathPattern = new RegExp(\n `${variableReferenceSource}(?:[\\\\\\\\/]${unquotedPathCharacterSource}+)+`,\n \"giu\",\n ),\n clausePattern = /[^\\r\\n!?!?;;。]+/gu,\n pathHintPattern =\n /[\\\\/]|(?:^|[\\s\"'`])(?:\\.{1,2}|~|%[A-Za-z_][A-Za-z0-9_]*%|\\$\\{?[A-Za-z_][A-Za-z0-9_]*\\}?)(?:[\\\\/]|$)|\\.[\\p{L}\\p{N}]{1,16}(?::\\d+){0,2}(?:$|[\\s,.;:!?,。;:!?、])/u,\n variableHintPattern = new RegExp(String.raw`${variableReferenceSource}(?:[\\\\/]|$)`, \"iu\");\nfunction add(\n result: Candidate[],\n seen: Set<string>,\n value: string,\n start: number,\n end: number,\n kind: Candidate[\"kind\"],\n): void {\n if (value.length === 0 || value === \"/\") {\n return;\n }\n const key = `${start}:${end}:${value}`;\n if (!seen.has(key)) {\n seen.add(key);\n result.push({ end, kind, start, value });\n }\n}\nfunction addMatches(\n result: Candidate[],\n seen: Set<string>,\n text: string,\n pattern: RegExp,\n kind: Candidate[\"kind\"],\n): void {\n for (const match of text.matchAll(pattern)) {\n const value = match[0],\n start = match.index ?? 0;\n add(result, seen, value, start, start + value.length, kind);\n }\n}\nfunction addQuotedMatches(result: Candidate[], seen: Set<string>, text: string): void {\n for (const match of text.matchAll(quotedPattern)) {\n const value = match.groups?.value;\n if (value === undefined) {\n continue;\n }\n const start = (match.index ?? 0) + match[0].indexOf(value);\n add(result, seen, value, start, start + value.length, \"quoted\");\n }\n}\nfunction addSpanMatches(\n result: Candidate[],\n seen: Set<string>,\n text: string,\n maximumWords: number,\n): void {\n for (const clause of text.matchAll(clausePattern)) {\n const clauseStart = clause.index ?? 0,\n clauseText = clause[0],\n tokens = [...clauseText.matchAll(tokenPattern)].map((token) => ({\n end: clauseStart + (token.index ?? 0) + token[0].length,\n hint: Number(pathHintPattern.test(token[0]) || variableHintPattern.test(token[0])),\n start: clauseStart + (token.index ?? 0),\n value: token[0],\n })),\n hintCounts = [0];\n for (const token of tokens) {\n hintCounts.push((hintCounts.at(-1) ?? 0) + token.hint);\n }\n for (let start = 0; start < tokens.length; start += 1) {\n const last = Math.min(tokens.length, start + maximumWords);\n for (let end = start + 1; end <= last; end += 1) {\n const firstToken = tokens[start],\n lastToken = tokens[end - 1],\n hintsBefore = hintCounts[start],\n hintsAfter = hintCounts[end];\n if (\n firstToken === undefined ||\n lastToken === undefined ||\n hintsBefore === undefined ||\n hintsAfter === undefined ||\n hintsBefore === hintsAfter\n ) {\n continue;\n }\n const value = text.slice(firstToken.start, lastToken.end);\n if (pathHintPattern.test(value)) {\n add(result, seen, value, firstToken.start, lastToken.end, \"span\");\n }\n }\n }\n }\n}\nexport function extractCandidates(text: string, level: SearchLevel): Candidate[] {\n const result: Candidate[] = [],\n seen = new Set<string>();\n addQuotedMatches(result, seen, text);\n addMatches(result, seen, text, explicitPattern, \"explicit\");\n if (level >= 2) {\n addMatches(result, seen, text, variablePathPattern, \"heuristic\");\n addMatches(result, seen, text, pathTokenPattern, \"heuristic\");\n }\n if (level >= 3) {\n const maximumWords =\n settings.spanWordLimits[Math.min(level - 3, settings.spanWordLimits.length - 1)];\n if (maximumWords === undefined) {\n throw new RangeError(\"No text-span level is configured\");\n }\n addSpanMatches(result, seen, text, maximumWords);\n }\n return result;\n}\n","import { isIP } from \"node:net\";\nimport { hostname, networkInterfaces } from \"node:os\";\nimport nodePath from \"node:path\";\nimport nativeBridge from \"./windows-bridge.cjs\";\n\nconst native = process.platform === \"win32\" ? nativeBridge : undefined,\n uncServerSegmentPattern = /^[^\\\\/:*?\"<>|]+$/u,\n unmappedDriveErrors = new Set([1200, 1201, 1203, 1222, 2250]),\n errorMoreData = 234,\n mappingBufferChars = 32_768;\ninterface UncPath {\n canonical: string;\n server: string;\n share: string;\n suffix: string;\n}\ninterface DriveMapping {\n drive: string;\n remote: string;\n}\nfunction normalizeServerName(value: string): string {\n return value.replace(/\\.+$/u, \"\").toLowerCase();\n}\nfunction addLocalServerName(names: Set<string>, value: string | undefined): void {\n if (value !== undefined && uncServerSegmentPattern.test(value)) {\n names.add(normalizeServerName(value));\n }\n}\nfunction addIpv6LiteralName(names: Set<string>, value: string): void {\n const zoneIndex = value.indexOf(\"%\"),\n address = zoneIndex === -1 ? value : value.slice(0, zoneIndex),\n zone = zoneIndex === -1 ? \"\" : `s${value.slice(zoneIndex + 1)}`;\n addLocalServerName(names, `${address.replaceAll(\":\", \"-\")}${zone}.ipv6-literal.net`);\n}\nfunction collectLocalServerNames(): Set<string> {\n const names = new Set<string>([\"localhost\"]),\n computerName = process.env.COMPUTERNAME;\n addLocalServerName(names, hostname());\n addLocalServerName(names, computerName);\n if (computerName !== undefined && process.env.USERDNSDOMAIN !== undefined) {\n addLocalServerName(names, `${computerName}.${process.env.USERDNSDOMAIN}`);\n }\n for (const addresses of Object.values(networkInterfaces())) {\n for (const address of addresses ?? []) {\n if (isIP(address.address) === 4) {\n addLocalServerName(names, address.address);\n } else if (isIP(address.address) === 6) {\n addIpv6LiteralName(names, address.address);\n }\n }\n }\n addLocalServerName(names, \"--1.ipv6-literal.net\");\n return names;\n}\nconst localServerNames =\n process.platform === \"win32\" ? collectLocalServerNames() : new Set<string>();\nlet driveMappings: DriveMapping[] | undefined;\nfunction containsControlCharacter(value: string): boolean {\n for (const character of value) {\n if (character.charCodeAt(0) < 32) {\n return true;\n }\n }\n return false;\n}\nfunction normalizeUncRoot(value: string): string {\n return value.replaceAll(\"/\", \"\\\\\").replace(/\\\\+$/u, \"\").toLowerCase();\n}\nfunction parseUncPath(value: string): UncPath | undefined {\n const normalized = value.replaceAll(\"/\", \"\\\\\"),\n extended = normalized.slice(0, 8).toLowerCase() === \"\\\\\\\\?\\\\unc\\\\\";\n if (normalized.startsWith(\"\\\\\\\\.\\\\\") || (normalized.startsWith(\"\\\\\\\\?\\\\\") && !extended)) {\n return undefined;\n }\n const serverStart = extended ? 8 : 2,\n serverSeparator = normalized.slice(serverStart).indexOf(\"\\\\\");\n if (serverSeparator <= 0) {\n return undefined;\n }\n const serverEnd = serverStart + serverSeparator,\n shareStart = serverEnd + 1,\n shareSeparator = normalized.slice(shareStart).indexOf(\"\\\\\"),\n shareEnd = shareSeparator === -1 ? normalized.length : shareStart + shareSeparator,\n server = normalized.slice(serverStart, serverEnd),\n share = normalized.slice(shareStart, shareEnd);\n if (\n share.length === 0 ||\n !uncServerSegmentPattern.test(server) ||\n !uncServerSegmentPattern.test(share)\n ) {\n return undefined;\n }\n const suffix = normalized.slice(shareEnd);\n return {\n canonical: `\\\\\\\\${server}\\\\${share}${suffix}`,\n server,\n share,\n suffix,\n };\n}\nfunction queryDriveMapping(drive: string): string | undefined {\n if (native === undefined) {\n return undefined;\n }\n const { remote, status } = native.getDriveConnection(drive, mappingBufferChars);\n if (status === errorMoreData) {\n throw new Error(`WNetGetConnectionW returned an oversized mapping for ${drive}`);\n }\n if (unmappedDriveErrors.has(status)) {\n return undefined;\n }\n if (status !== 0) {\n throw new Error(`WNetGetConnectionW failed for ${drive} with error ${status}`);\n }\n if (typeof remote !== \"string\" || !remote.startsWith(String.raw`\\\\`)) {\n throw new TypeError(`WNetGetConnectionW returned an invalid mapping for ${drive}`);\n }\n return normalizeUncRoot(remote);\n}\nfunction queryDriveMappings(): DriveMapping[] {\n if (driveMappings !== undefined) {\n return driveMappings;\n }\n const result: DriveMapping[] = [];\n for (let code = \"A\".charCodeAt(0); code <= \"Z\".charCodeAt(0); code += 1) {\n const drive = `${String.fromCharCode(code)}:`,\n remote = queryDriveMapping(drive);\n if (remote !== undefined) {\n result.push({ drive, remote });\n }\n }\n driveMappings = result.toSorted((left, right) => right.remote.length - left.remote.length);\n return driveMappings;\n}\nfunction resolveMappedUncPath(path: UncPath): string | undefined {\n const canonical = normalizeUncRoot(path.canonical),\n mapping = queryDriveMappings().find(\n ({ remote }) => canonical === remote || canonical.startsWith(`${remote}\\\\`),\n );\n if (mapping === undefined) {\n return undefined;\n }\n const relative = path.canonical.slice(mapping.remote.length);\n return nodePath.win32.normalize(`${mapping.drive}${relative}`);\n}\nfunction isLocalServer(value: string): boolean {\n const normalized = normalizeServerName(value);\n return (\n localServerNames.has(normalized) ||\n (isIP(value) === 4 && value.split(\".\")[0] === \"127\") ||\n normalized === \"--1.ipv6-literal.net\"\n );\n}\nfunction resolveLocalAdministrativeShare(path: UncPath): string | undefined {\n const match = /^([A-Za-z])\\$$/u.exec(path.share);\n if (match === null || !isLocalServer(path.server)) {\n return undefined;\n }\n return nodePath.win32.normalize(`${match[1]}:${path.suffix || \"\\\\\"}`);\n}\nexport function resolveUncPath(value: string): string | undefined {\n if (\n process.platform !== \"win32\" ||\n (!value.startsWith(String.raw`\\\\`) && !value.startsWith(\"//\"))\n ) {\n return value;\n }\n if (containsControlCharacter(value)) {\n return undefined;\n }\n const path = parseUncPath(value);\n if (path === undefined) {\n return undefined;\n }\n return resolveMappedUncPath(path) ?? resolveLocalAdministrativeShare(path);\n}\n","import nodePath from \"node:path\";\nimport nativeBridge from \"./windows-bridge.cjs\";\n\nconst fileAttributeHidden = 0x2,\n invalidFileAttributes = 0xff_ff_ff_ff;\nconst missingPathErrors = new Set([2, 3]);\nexport function hasWindowsHiddenAttribute(filePath: string): boolean {\n if (process.platform !== \"win32\") {\n throw new Error(\"Windows file attributes are unavailable on this platform\");\n }\n const { attributes, error } = nativeBridge.getFileAttributes(nodePath.toNamespacedPath(filePath));\n if (!Number.isInteger(attributes) || !Number.isInteger(error)) {\n throw new TypeError(\"Windows file attribute lookup returned an invalid result\");\n }\n if (attributes !== invalidFileAttributes) {\n if (error !== 0) {\n throw new Error(`Windows file attribute lookup returned attributes with error ${error}`);\n }\n return (attributes & fileAttributeHidden) !== 0;\n }\n if (missingPathErrors.has(error)) {\n return false;\n }\n throw new Error(`Windows file attribute lookup failed for ${filePath} with error ${error}`);\n}\n","import nodePath from \"node:path\";\nimport { hasWindowsHiddenAttribute } from \"../native/attributes.js\";\n\nfunction pathKey(value: string): string {\n return process.platform === \"win32\" ? value.toLowerCase() : value;\n}\nfunction relativePath(filePath: string, boundary: string): string {\n const relative = nodePath.relative(boundary, filePath);\n if (\n nodePath.isAbsolute(relative) ||\n relative === \"..\" ||\n relative.startsWith(`..${nodePath.sep}`)\n ) {\n throw new RangeError(`${filePath} is outside the hidden-path boundary ${boundary}`);\n }\n return relative;\n}\nfunction hasHiddenDotSegment(filePath: string, boundary: string): boolean {\n return relativePath(filePath, boundary)\n .split(/[\\\\/]/u)\n .some((part) => part.length > 1 && part.startsWith(\".\"));\n}\nexport function createHiddenPathDetector() {\n const attributeCache = new Map<string, boolean>();\n return {\n isHidden(filePath: string, boundary: string): boolean {\n if (process.platform !== \"win32\") {\n return hasHiddenDotSegment(filePath, boundary);\n }\n relativePath(filePath, boundary);\n const boundaryKey = pathKey(nodePath.resolve(boundary));\n let current = nodePath.resolve(filePath);\n while (pathKey(current) !== boundaryKey) {\n const key = pathKey(current);\n let hidden = attributeCache.get(key);\n if (hidden === undefined) {\n hidden = hasWindowsHiddenAttribute(current);\n attributeCache.set(key, hidden);\n }\n if (hidden) {\n return true;\n }\n const parent = nodePath.dirname(current);\n if (parent === current) {\n throw new Error(`Unable to reach hidden-path boundary ${boundary} from ${filePath}`);\n }\n current = parent;\n }\n return false;\n },\n };\n}\n","import nodeFileSystem from \"node:fs\";\nimport nodePath from \"node:path\";\nimport type { Options as GlobbyOptions } from \"globby\";\nimport { createHiddenPathDetector } from \"./hidden.js\";\n\ntype ReadDirectory = NonNullable<NonNullable<GlobbyOptions[\"fs\"]>[\"readdir\"]>;\nconst unreadableDirectoryErrors = new Set([\"EACCES\", \"ENOTDIR\", \"ENOENT\", \"EPERM\"]);\ninterface DirectoryEntry {\n isBlockDevice(): boolean;\n isCharacterDevice(): boolean;\n isDirectory(): boolean;\n isFIFO(): boolean;\n isFile(): boolean;\n isSocket(): boolean;\n isSymbolicLink(): boolean;\n name: string;\n}\ntype DirectoryEntryCallback = (\n error: NodeJS.ErrnoException | null,\n entries: DirectoryEntry[],\n) => void;\ntype DirectoryNameCallback = (error: NodeJS.ErrnoException | null, entries: string[]) => void;\ninterface TraversalScope {\n paths: readonly string[];\n passthroughNames: readonly string[];\n}\ninterface TraversalFileSystemOptions {\n readDirectory?: ReadDirectory;\n scope?: TraversalScope;\n}\ninterface IndexedScope {\n childrenByDirectory: ReadonlyMap<string, ReadonlySet<string>>;\n passthroughNames: ReadonlySet<string>;\n}\nfunction pathKey(value: string): string {\n return process.platform === \"win32\" ? value.toLowerCase() : value;\n}\nfunction isUnreadableDirectoryError(error: NodeJS.ErrnoException): boolean {\n return error.code !== undefined && unreadableDirectoryErrors.has(error.code);\n}\nfunction completeDirectoryRead<T>(\n error: NodeJS.ErrnoException | null,\n entries: T[],\n callback: (error: NodeJS.ErrnoException | null, entries: T[]) => void,\n): void {\n if (error === null) {\n callback(null, entries);\n } else if (isUnreadableDirectoryError(error)) {\n callback(null, []);\n } else {\n callback(error, []);\n }\n}\nfunction indexScope(root: string, scope: TraversalScope | undefined): IndexedScope | undefined {\n if (scope === undefined) {\n return undefined;\n }\n const resolvedRoot = nodePath.resolve(root),\n childrenByDirectory = new Map<string, Set<string>>();\n for (const relativePath of scope.paths) {\n if (\n nodePath.isAbsolute(relativePath) ||\n relativePath === \"..\" ||\n relativePath.startsWith(`..${nodePath.sep}`)\n ) {\n throw new RangeError(`${relativePath} is outside the traversal root ${root}`);\n }\n let directory = resolvedRoot;\n for (const name of relativePath.split(nodePath.sep)) {\n const directoryKey = pathKey(directory),\n children = childrenByDirectory.get(directoryKey) ?? new Set<string>();\n children.add(pathKey(name));\n childrenByDirectory.set(directoryKey, children);\n directory = nodePath.join(directory, name);\n }\n }\n return {\n childrenByDirectory,\n passthroughNames: new Set(scope.passthroughNames.map(pathKey)),\n };\n}\nfunction filterToScope<T extends DirectoryEntry | string>(\n filePath: string,\n entries: T[],\n scope: IndexedScope | undefined,\n): T[] {\n if (scope === undefined) {\n return entries;\n }\n const children = scope.childrenByDirectory.get(pathKey(nodePath.resolve(filePath)));\n if (children === undefined) {\n return [];\n }\n return entries.filter((entry) => {\n const name = typeof entry === \"string\" ? entry : entry.name,\n key = pathKey(name);\n return children.has(key) || scope.passthroughNames.has(key);\n });\n}\nfunction completeTraversalRead<T extends DirectoryEntry | string>(\n root: string,\n filePath: string,\n searchHidden: boolean,\n hiddenDetector: ReturnType<typeof createHiddenPathDetector>,\n scope: IndexedScope | undefined,\n error: NodeJS.ErrnoException | null,\n entries: T[],\n callback: (error: NodeJS.ErrnoException | null, entries: T[]) => void,\n): void {\n const scopedEntries = error === null ? filterToScope(filePath, entries, scope) : entries;\n if (error !== null || searchHidden) {\n completeDirectoryRead(error, scopedEntries, callback);\n return;\n }\n try {\n const visibleEntries = scopedEntries.filter((entry) => {\n if (typeof entry !== \"string\" && !entry.isDirectory()) {\n return true;\n }\n const name = typeof entry === \"string\" ? entry : entry.name;\n return !hiddenDetector.isHidden(nodePath.join(filePath, name), root);\n });\n callback(null, visibleEntries);\n } catch (caughtError) {\n callback(caughtError instanceof Error ? caughtError : new Error(String(caughtError)), []);\n }\n}\nfunction createReadDirectory(\n root: string,\n searchHidden: boolean,\n readDirectory: ReadDirectory,\n scope: IndexedScope | undefined,\n): ReadDirectory {\n const hiddenDetector = createHiddenPathDetector();\n function traverseReadDirectory(\n filePath: string,\n options: { withFileTypes: true },\n callback: DirectoryEntryCallback,\n ): void;\n function traverseReadDirectory(filePath: string, callback: DirectoryNameCallback): void;\n function traverseReadDirectory(\n filePath: string,\n optionsOrCallback: { withFileTypes: true } | DirectoryNameCallback,\n entryCallback?: DirectoryEntryCallback,\n ): void {\n if (typeof optionsOrCallback === \"function\") {\n readDirectory(filePath, (error, entries) => {\n completeTraversalRead(\n root,\n filePath,\n searchHidden,\n hiddenDetector,\n scope,\n error,\n entries,\n optionsOrCallback,\n );\n });\n return;\n }\n if (entryCallback === undefined) {\n throw new TypeError(\"A directory entry callback is required\");\n }\n readDirectory(filePath, optionsOrCallback, (error, entries) => {\n completeTraversalRead(\n root,\n filePath,\n searchHidden,\n hiddenDetector,\n scope,\n error,\n entries,\n entryCallback,\n );\n });\n }\n return traverseReadDirectory;\n}\nexport function createTraversalFileSystem(\n root: string,\n searchHidden: boolean,\n options: TraversalFileSystemOptions = {},\n) {\n const { readDirectory = nodeFileSystem.readdir, scope } = options;\n return {\n ...nodeFileSystem,\n readdir: createReadDirectory(root, searchHidden, readDirectory, indexScope(root, scope)),\n };\n}\n","import { stat } from \"node:fs/promises\";\nimport nodePath from \"node:path\";\nimport { convertPathToPattern, globby } from \"globby\";\nimport isPathInside from \"is-path-inside\";\nimport { settings } from \"../../config/settings.js\";\nimport { resolveUncPath } from \"../native/unc.js\";\nimport type { SearchEntry } from \"../types.js\";\nimport { createHiddenPathDetector } from \"./hidden.js\";\nimport { createTraversalFileSystem } from \"./traversal.js\";\n\nconst ignoreFilePatterns = settings.ignoreFileNames.map(\n (name) => `**/${convertPathToPattern(name)}`,\n ),\n ignoreFileNames = [\".gitignore\", ...settings.ignoreFileNames];\nfunction pathKey(value: string): string {\n return process.platform === \"win32\" ? value.toLowerCase() : value;\n}\nfunction isWithinRoot(filePath: string, root: string): boolean {\n return filePath === root || isPathInside(filePath, root);\n}\nfunction traversalOptions(\n root: string,\n searchHidden: boolean,\n scopedPaths: readonly string[] | undefined,\n) {\n const fileSystem =\n scopedPaths === undefined\n ? createTraversalFileSystem(root, searchHidden)\n : createTraversalFileSystem(root, searchHidden, {\n scope: {\n passthroughNames: ignoreFileNames,\n paths: scopedPaths,\n },\n });\n return {\n caseSensitiveMatch: process.platform !== \"win32\",\n cwd: root,\n dot: process.platform === \"win32\" || searchHidden,\n followSymbolicLinks: false,\n fs: fileSystem,\n onlyFiles: false,\n unique: true,\n } as const;\n}\nfunction globbyOptions(\n root: string,\n respectIgnore: boolean,\n searchHidden: boolean,\n scopedPaths?: readonly string[],\n) {\n return {\n ...traversalOptions(root, searchHidden, scopedPaths),\n expandDirectories: false,\n gitignore: respectIgnore,\n globalGitignore: respectIgnore,\n ...(respectIgnore ? { ignoreFiles: ignoreFilePatterns } : {}),\n } as const;\n}\nexport async function resolveSearchDirectories(directories: readonly string[]): Promise<string[]> {\n if (!Array.isArray(directories)) {\n throw new TypeError(\"directories must be an array\");\n }\n if (directories.length === 0) {\n throw new RangeError(\"directories must not be empty\");\n }\n const unique = new Map<string, string>();\n for (const directory of directories) {\n if (typeof directory !== \"string\" || directory.length === 0) {\n throw new TypeError(\"every directory must be a non-empty string\");\n }\n const resolvedUnc = resolveUncPath(directory);\n if (resolvedUnc === undefined || resolvedUnc.length === 0) {\n throw new TypeError(`${directory} cannot be represented as a drive-based path`);\n }\n const resolved = nodePath.resolve(resolvedUnc);\n unique.set(pathKey(resolved), resolved);\n }\n await Promise.all(\n [...unique.values()].map(async (directory) => {\n if (!(await stat(directory)).isDirectory()) {\n throw new TypeError(`${directory} is not a directory`);\n }\n }),\n );\n return [...unique.values()];\n}\nexport async function listSearchEntries(\n root: string,\n respectIgnore: boolean,\n searchHidden: boolean,\n): Promise<SearchEntry[]> {\n const entries = await globby(\"**/*\", {\n ...globbyOptions(root, respectIgnore, searchHidden),\n objectMode: true,\n }),\n hiddenDetector = createHiddenPathDetector();\n return entries\n .filter(\n (entry) => searchHidden || !hiddenDetector.isHidden(nodePath.resolve(root, entry.path), root),\n )\n .map((entry) => ({\n directory: entry.dirent.isDirectory(),\n path: entry.path,\n }));\n}\nexport async function filterSearchablePaths(\n paths: readonly string[],\n roots: readonly string[],\n respectIgnore: boolean,\n searchHidden: boolean,\n): Promise<Set<string>> {\n const allowed = new Set<string>(),\n pathsByRoot = new Map<string, string[]>(),\n hiddenDetector = createHiddenPathDetector();\n for (const filePath of paths) {\n let hasSearchRoot = false;\n for (const root of roots) {\n if (!isWithinRoot(filePath, root)) {\n continue;\n }\n hasSearchRoot = true;\n const relative = nodePath.relative(root, filePath);\n if (!searchHidden && hiddenDetector.isHidden(filePath, root)) {\n continue;\n }\n if (relative === \"\" || !respectIgnore) {\n allowed.add(filePath);\n } else {\n const grouped = pathsByRoot.get(root) ?? [];\n grouped.push(relative);\n pathsByRoot.set(root, grouped);\n }\n }\n if (hasSearchRoot) {\n continue;\n }\n const filesystemRoot = nodePath.parse(filePath).root,\n hiddenBoundary = process.platform === \"win32\" ? nodePath.dirname(filePath) : filesystemRoot;\n if (searchHidden || !hiddenDetector.isHidden(filePath, hiddenBoundary)) {\n allowed.add(filePath);\n }\n }\n await Promise.all(\n [...pathsByRoot].map(async ([root, relativePaths]) => {\n const patterns = relativePaths.map(convertPathToPattern),\n matches = await globby(patterns, {\n ...globbyOptions(root, true, true, relativePaths),\n absolute: true,\n });\n for (const match of matches) {\n allowed.add(nodePath.normalize(match));\n }\n }),\n );\n return allowed;\n}\n","import { filterSearchablePaths } from \"../search/policy.js\";\nimport type { PathKind } from \"../types.js\";\n\nfunction pathKey(value: string): string {\n return process.platform === \"win32\" ? value.toLowerCase() : value;\n}\nexport async function applySearchPolicies(\n existingPaths: ReadonlyMap<string, PathKind>,\n roots: readonly string[],\n respectIgnore: boolean,\n searchHidden: boolean,\n): Promise<Map<string, PathKind>> {\n if (!respectIgnore && searchHidden) {\n return new Map(existingPaths);\n }\n const searchablePaths = await filterSearchablePaths(\n [...existingPaths.keys()],\n roots,\n respectIgnore,\n searchHidden,\n ),\n searchableKeys = new Set([...searchablePaths].map(pathKey));\n return new Map([...existingPaths].filter(([filePath]) => searchableKeys.has(pathKey(filePath))));\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport nodePath from \"node:path\";\nimport pLimit from \"p-limit\";\nimport { settings } from \"../../config/settings.js\";\nimport type { PathKind } from \"../types.js\";\n\nconst unavailablePathErrors = new Set([\n \"EACCES\",\n \"ELOOP\",\n \"ENAMETOOLONG\",\n \"ENOTDIR\",\n \"ENOENT\",\n \"EPERM\",\n \"EINVAL\",\n ]),\n unverifiableUncErrors = new Set([\"UNKNOWN\", \"EUNKNOWN\"]);\nfunction pathKey(value: string): string {\n return process.platform === \"win32\" ? value.toLowerCase() : value;\n}\nfunction isUnavailablePathError(error: unknown, filePath?: string): boolean {\n const code =\n error instanceof Error && \"code\" in error && typeof error.code === \"string\"\n ? error.code\n : undefined;\n return (\n code !== undefined &&\n (unavailablePathErrors.has(code) ||\n (filePath?.startsWith(String.raw`\\\\`) === true && unverifiableUncErrors.has(code)))\n );\n}\nasync function classifyPath(filePath: string): Promise<PathKind | undefined> {\n try {\n const pathStats = await stat(filePath);\n if (pathStats.isFile()) {\n return \"file\";\n }\n return pathStats.isDirectory() ? \"directory\" : undefined;\n } catch (error) {\n if (isUnavailablePathError(error, filePath)) {\n return undefined;\n }\n throw error;\n }\n}\nasync function classifyAndAdd(found: Map<string, PathKind>, filePath: string): Promise<void> {\n const kind = await classifyPath(filePath);\n if (kind !== undefined) {\n found.set(filePath, kind);\n }\n}\nexport async function classifyExistingPaths(\n paths: readonly string[],\n roots: readonly string[],\n): Promise<Map<string, PathKind>> {\n const found = new Map<string, PathKind>(),\n limit = pLimit(settings.validationConcurrency);\n if (paths.length < settings.batchValidationThreshold) {\n await limit.map(paths, (filePath) => classifyAndAdd(found, filePath));\n return found;\n }\n const rootKeys = new Set(roots.map(pathKey)),\n pathsByParent = new Map<string, { parent: string; paths: string[] }>();\n for (const filePath of paths) {\n if (rootKeys.has(pathKey(filePath))) {\n found.set(filePath, \"directory\");\n continue;\n }\n const parent = nodePath.dirname(filePath),\n key = pathKey(parent),\n group = pathsByParent.get(key) ?? { parent, paths: [] };\n group.paths.push(filePath);\n pathsByParent.set(key, group);\n }\n const directPaths: string[] = [],\n scannedGroups: { parent: string; paths: string[] }[] = [];\n for (const group of pathsByParent.values()) {\n if (group.paths.length < settings.directoryScanThreshold) {\n directPaths.push(...group.paths);\n } else {\n scannedGroups.push(group);\n }\n }\n await Promise.all([\n limit.map(directPaths, (filePath) => classifyAndAdd(found, filePath)),\n limit.map(scannedGroups, async ({ parent, paths: groupPaths }) => {\n let entries;\n try {\n entries = await readdir(parent, { withFileTypes: true });\n } catch (error) {\n if (isUnavailablePathError(error, parent)) {\n return;\n }\n throw error;\n }\n const entriesByName = new Map(entries.map((entry) => [pathKey(entry.name), entry]));\n await Promise.all(\n groupPaths.map(async (filePath) => {\n const name = nodePath.basename(filePath),\n entry = entriesByName.get(pathKey(name));\n if (entry?.isFile()) {\n found.set(filePath, \"file\");\n } else if (entry?.isDirectory()) {\n found.set(filePath, \"directory\");\n } else if (entry !== undefined || (process.platform === \"win32\" && name.includes(\":\"))) {\n await classifyAndAdd(found, filePath);\n }\n }),\n );\n }),\n ]);\n return found;\n}\n","import type { PathMatch } from \"../types.js\";\n\nexport function removeContainedMatches(matches: readonly PathMatch[]): PathMatch[] {\n const ordered = matches\n .map((match, index) => ({ index, match }))\n .toSorted(\n ({ match: left }, { match: right }) =>\n left.position.start - right.position.start || right.position.end - left.position.end,\n ),\n kept = new Set<number>();\n let maxEndBeforeStart = -1,\n groupStart = -1,\n maxEndInGroup = -1;\n for (const { index, match } of ordered) {\n const { start, end } = match.position;\n if (start !== groupStart) {\n maxEndBeforeStart = Math.max(maxEndBeforeStart, maxEndInGroup);\n groupStart = start;\n maxEndInGroup = -1;\n }\n if (maxEndBeforeStart < end && maxEndInGroup <= end) {\n kept.add(index);\n }\n maxEndInGroup = Math.max(maxEndInGroup, end);\n }\n return matches.filter((_, index) => kept.has(index));\n}\n","import { settings } from \"../../config/settings.js\";\nimport type { Candidate, PathLocation, PathPosition } from \"../types.js\";\n\nexport interface PreparedCandidate {\n location?: PathLocation;\n position: PathPosition;\n value: string;\n}\nfunction parseLocationPart(value: string, name: string): number {\n const result = Number(value);\n if (!Number.isSafeInteger(result)) {\n throw new RangeError(`${name} must be a safe integer`);\n }\n return result;\n}\nexport function prepareCandidate(candidate: Candidate): PreparedCandidate | undefined {\n let { end } = candidate,\n { start } = candidate,\n { value } = candidate;\n if (candidate.kind !== \"inventory\" && candidate.kind !== \"quoted\") {\n const startTrimmed = value.trimStart();\n start += value.length - startTrimmed.length;\n value = startTrimmed;\n const endTrimmed = value.trimEnd();\n end -= value.length - endTrimmed.length;\n value = endTrimmed;\n if (\n value.length >= 2 &&\n ((value.startsWith('\"') && value.at(-1) === '\"') ||\n (value.startsWith(\"'\") && value.at(-1) === \"'\") ||\n (value.startsWith(\"`\") && value.at(-1) === \"`\"))\n ) {\n start += 1;\n end -= 1;\n value = value.slice(1, -1);\n }\n while (value.length > 0 && settings.trailingPunctuation.includes(value.at(-1) ?? \"\")) {\n end -= 1;\n value = value.slice(0, -1);\n }\n }\n let location: PathLocation | undefined;\n if (candidate.kind !== \"inventory\") {\n const match = settings.locationSuffixPattern.exec(value);\n if (match !== null) {\n const lineValue = match.groups?.line;\n if (lineValue === undefined) {\n throw new TypeError(\"locationSuffixPattern must capture a line\");\n }\n const columnValue = match.groups?.column;\n location =\n columnValue === undefined\n ? { line: parseLocationPart(lineValue, \"line\") }\n : {\n column: parseLocationPart(columnValue, \"column\"),\n line: parseLocationPart(lineValue, \"line\"),\n };\n end -= match[0].length;\n value = value.slice(0, match.index);\n }\n }\n if (value === \"/\" || value === \".\") {\n return undefined;\n }\n return {\n ...(location === undefined ? {} : { location }),\n position: { end, start },\n value,\n };\n}\n","import { fileURLToPath } from \"node:url\";\nimport nodePath from \"node:path\";\nimport { applySearchPolicies } from \"./eligibility.js\";\nimport { classifyExistingPaths } from \"./existence.js\";\nimport { removeContainedMatches } from \"./containment.js\";\nimport { prepareCandidate } from \"./preparation.js\";\nimport { expandVariables } from \"../variables.js\";\nimport { resolveUncPath } from \"../native/unc.js\";\nimport type {\n Candidate,\n PathKind,\n PathLocation,\n PathMatch,\n PathPosition,\n Variables,\n} from \"../types.js\";\n\ninterface ResolvedCandidate {\n expectedKind?: PathKind;\n location?: PathLocation;\n path: string;\n position: PathPosition;\n}\nfunction pathKey(value: string): string {\n return process.platform === \"win32\" ? value.toLowerCase() : value;\n}\nfunction uniquePaths(values: Iterable<string>): string[] {\n const paths = new Map<string, string>();\n for (const value of values) {\n paths.set(pathKey(value), value);\n }\n return [...paths.values()];\n}\nfunction unescape(value: string): string {\n if (value.startsWith(String.raw`\\\\`) && !value.startsWith(String.raw`\\\\\\\\`)) {\n return value;\n }\n return value.replace(/\\\\([\"'`\\\\])/gu, \"$1\").replace(/\\\\\\\\/gu, \"\\\\\");\n}\nfunction toPaths(value: string, roots: readonly string[], variables: Variables): string[] {\n let expanded = expandVariables(value, variables);\n if (expanded.includes(\"\\0\")) {\n return [];\n }\n if (expanded.startsWith(\"file://\")) {\n try {\n expanded = fileURLToPath(expanded);\n } catch (error) {\n if (error instanceof TypeError) {\n return [];\n }\n throw error;\n }\n } else {\n expanded = unescape(expanded);\n if (expanded === \"~\" || /^~[\\\\/]/u.test(expanded)) {\n expanded = nodePath.join(\n variables.HOME ??\n variables.USERPROFILE ??\n process.env.HOME ??\n process.env.USERPROFILE ??\n \"\",\n expanded.slice(2),\n );\n }\n }\n const resolvedPath = resolveUncPath(expanded);\n if (resolvedPath === undefined || resolvedPath.length === 0) {\n return [];\n }\n expanded = resolvedPath;\n if (nodePath.isAbsolute(expanded)) {\n return [nodePath.normalize(expanded)];\n }\n return uniquePaths(roots.map((root) => nodePath.resolve(root, expanded)));\n}\nfunction mergeLocation(match: PathMatch, location: PathLocation | undefined): void {\n if (location === undefined) {\n return;\n }\n if (match.location === undefined) {\n match.location = location;\n return;\n }\n if (match.location.line !== location.line || match.location.column !== location.column) {\n throw new Error(\"Candidates for the same path and position have conflicting locations\");\n }\n}\nexport async function validateCandidates(\n candidates: Candidate[],\n roots: readonly string[],\n variables: Variables,\n respectIgnore: boolean,\n searchHidden: boolean,\n): Promise<PathMatch[]> {\n const resolvedCandidates: ResolvedCandidate[] = [],\n validationPaths = new Map<string, string>();\n for (const candidate of candidates) {\n const prepared = prepareCandidate(candidate);\n if (prepared === undefined) {\n continue;\n }\n const paths = toPaths(prepared.value, roots, variables);\n for (const filePath of paths) {\n resolvedCandidates.push({\n ...(candidate.expectedKind === undefined ? {} : { expectedKind: candidate.expectedKind }),\n ...(prepared.location === undefined ? {} : { location: prepared.location }),\n path: filePath,\n position: prepared.position,\n });\n validationPaths.set(pathKey(filePath), filePath);\n }\n }\n const classifiedPaths = await applySearchPolicies(\n await classifyExistingPaths([...validationPaths.values()], roots),\n roots,\n respectIgnore,\n searchHidden,\n ),\n kindsByPath = new Map(\n [...classifiedPaths].map(([filePath, kind]) => [pathKey(filePath), kind]),\n ),\n matches = new Map<string, PathMatch>();\n for (const { expectedKind, location, path, position } of resolvedCandidates) {\n const kind = kindsByPath.get(pathKey(path));\n if (kind === undefined || (expectedKind !== undefined && kind !== expectedKind)) {\n continue;\n }\n const key = `${pathKey(path)}\\0${position.start}\\0${position.end}`,\n existing = matches.get(key);\n if (existing !== undefined) {\n mergeLocation(existing, location);\n continue;\n }\n matches.set(key, {\n kind,\n ...(location === undefined ? {} : { location }),\n path,\n position,\n });\n }\n return removeContainedMatches([...matches.values()]);\n}\n","import nodePath from \"node:path\";\nimport { AhoCorasick } from \"@monyone/aho-corasick\";\nimport { listSearchEntries } from \"./policy.js\";\nimport type {\n Candidate,\n InventoryMatcher,\n InventoryPattern,\n RootPrefix,\n SearchEntry,\n} from \"../types.js\";\n\nlet inventoryMatcherCache: InventoryMatcher | undefined;\nfunction isBoundary(\n value: string | undefined,\n following: string | undefined,\n directoryEnd = false,\n): boolean {\n if (directoryEnd && value !== \".\") {\n return value === undefined || /[\\s\"'`<>)\\]},;:!?,。;:!?、]/u.test(value);\n }\n if (value === \".\") {\n return following === undefined || !/[\\p{L}\\p{N}_-]/u.test(following);\n }\n return value === undefined || !/[\\p{L}\\p{N}_/\\\\-]/u.test(value);\n}\nfunction addMatch(\n result: Candidate[],\n seen: Set<string>,\n text: string,\n value: string,\n start: number,\n end: number,\n expectedKind: InventoryPattern[\"expectedKind\"],\n): void {\n if (\n !isBoundary(text[start - 1], text[start]) ||\n !isBoundary(text[end], text[end + 1], expectedKind === \"directory\")\n ) {\n return;\n }\n const key = `${start}:${end}:${text.slice(start, end)}`;\n if (!seen.has(key)) {\n seen.add(key);\n result.push({ end, expectedKind, kind: \"inventory\", start, value });\n }\n}\nfunction addVariant(\n patterns: Map<string, InventoryPattern>,\n entry: SearchEntry,\n value: string,\n): void {\n const key = process.platform === \"win32\" ? value.toLowerCase() : value;\n if (!patterns.has(key)) {\n patterns.set(key, {\n expectedKind: entry.directory ? \"directory\" : \"file\",\n relative: entry.path,\n value,\n });\n }\n}\nfunction addEntryVariants(patterns: Map<string, InventoryPattern>, entry: SearchEntry): void {\n const native = entry.path.replaceAll(\"/\", nodePath.sep);\n if (entry.directory) {\n addVariant(patterns, entry, `${entry.path}/`);\n addVariant(patterns, entry, `${native}${nodePath.sep}`);\n return;\n }\n addVariant(patterns, entry, entry.path);\n addVariant(patterns, entry, native);\n}\nfunction createRootPrefixes(roots: readonly string[]): RootPrefix[] {\n const prefixes = new Map<string, RootPrefix>();\n for (const root of roots) {\n const native = root.endsWith(nodePath.sep) ? root : `${root}${nodePath.sep}`,\n slashRoot = root.replaceAll(nodePath.sep, \"/\"),\n slash = slashRoot.endsWith(\"/\") ? slashRoot : `${slashRoot}/`;\n for (const value of [native, slash]) {\n const key = process.platform === \"win32\" ? value.toLowerCase() : value;\n prefixes.set(key, { root, value: key });\n }\n }\n return [...prefixes.values()];\n}\nfunction addAbsoluteMatch(\n result: Candidate[],\n seen: Set<string>,\n source: string,\n text: string,\n pattern: InventoryPattern,\n prefixes: readonly RootPrefix[],\n end: number,\n relativeStart: number,\n): boolean {\n for (const prefix of prefixes) {\n const start = relativeStart - prefix.value.length;\n if (start >= 0 && source.startsWith(prefix.value, start)) {\n addMatch(\n result,\n seen,\n text,\n nodePath.resolve(prefix.root, pattern.relative),\n start,\n end,\n pattern.expectedKind,\n );\n return true;\n }\n }\n return false;\n}\nfunction hasSameEntries(\n cached: InventoryMatcher,\n entries: readonly (readonly SearchEntry[])[],\n): boolean {\n if (cached.entries.length !== entries.length) {\n return false;\n }\n for (let index = 0; index < entries.length; index += 1) {\n const cachedEntries = cached.entries[index],\n currentEntries = entries[index];\n if (cachedEntries === undefined || currentEntries === undefined) {\n return false;\n }\n if (cachedEntries.length !== currentEntries.length) {\n return false;\n }\n for (let entryIndex = 0; entryIndex < currentEntries.length; entryIndex += 1) {\n const cachedEntry = cachedEntries[entryIndex],\n currentEntry = currentEntries[entryIndex];\n if (\n cachedEntry === undefined ||\n currentEntry === undefined ||\n cachedEntry.directory !== currentEntry.directory ||\n cachedEntry.path !== currentEntry.path\n ) {\n return false;\n }\n }\n }\n return true;\n}\nfunction canReuseMatcher(\n cached: InventoryMatcher | undefined,\n entries: readonly (readonly SearchEntry[])[],\n roots: readonly string[],\n respectIgnore: boolean,\n searchHidden: boolean,\n): cached is InventoryMatcher {\n return (\n cached?.respectIgnore === respectIgnore &&\n cached.searchHidden === searchHidden &&\n cached.roots.length === roots.length &&\n cached.roots.every((root, index) => root === roots[index]) &&\n hasSameEntries(cached, entries)\n );\n}\nexport async function inventoryCandidates(\n text: string,\n roots: readonly string[],\n respectIgnore: boolean,\n searchHidden: boolean,\n): Promise<Candidate[]> {\n const entries = await Promise.all(\n roots.map((root) => listSearchEntries(root, respectIgnore, searchHidden)),\n ),\n result: Candidate[] = [],\n seen = new Set<string>(),\n source = process.platform === \"win32\" ? text.toLowerCase() : text;\n let inventoryMatcher = inventoryMatcherCache;\n if (!canReuseMatcher(inventoryMatcher, entries, roots, respectIgnore, searchHidden)) {\n const patterns = new Map<string, InventoryPattern>();\n for (const relativeEntries of entries) {\n for (const entry of relativeEntries) {\n addEntryVariants(patterns, entry);\n }\n }\n inventoryMatcher = {\n entries,\n matcher: new AhoCorasick([...patterns.keys()]),\n patterns,\n prefixes: createRootPrefixes(roots),\n respectIgnore,\n roots: [...roots],\n searchHidden,\n };\n inventoryMatcherCache = inventoryMatcher;\n }\n for (const { begin, end, keyword } of inventoryMatcher.matcher.matchInText(source)) {\n const pattern = inventoryMatcher.patterns.get(keyword);\n if (pattern === undefined) {\n throw new Error(\"Inventory matcher returned an unknown path\");\n }\n if (\n !addAbsoluteMatch(result, seen, source, text, pattern, inventoryMatcher.prefixes, end, begin)\n ) {\n addMatch(result, seen, text, pattern.value, begin, end, pattern.expectedKind);\n }\n }\n return result;\n}\n","import { extractCandidates } from \"./candidates.js\";\nimport { validateCandidates } from \"./validation/resolution.js\";\nimport { inventoryCandidates } from \"./search/inventory.js\";\nimport { resolveSearchDirectories } from \"./search/policy.js\";\nimport { settings } from \"../config/settings.js\";\nimport type { FindExistingPathsOptions, PathMatch, Variables } from \"./types.js\";\n\nexport const MAX_LEVEL = settings.spanWordLimits.length + 3;\nfunction validateOptions(value: unknown): asserts value is FindExistingPathsOptions {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(\"options must be an object\");\n }\n}\nfunction validateVariables(value: unknown): asserts value is Variables {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n Object.values(value).some((item) => typeof item !== \"string\")\n ) {\n throw new TypeError(\"variables must be an object of string values\");\n }\n}\nexport async function findExistingPaths(options: FindExistingPathsOptions): Promise<PathMatch[]> {\n validateOptions(options);\n const {\n directories,\n level,\n respectIgnore = settings.respectIgnoreByDefault,\n searchHidden = settings.searchHiddenByDefault,\n text,\n variables = {},\n } = options;\n if (typeof text !== \"string\") {\n throw new TypeError(\"text must be a string\");\n }\n if (!Number.isInteger(level) || level < 1 || level > MAX_LEVEL) {\n throw new RangeError(`level must be an integer from 1 to ${MAX_LEVEL}`);\n }\n validateVariables(variables);\n if (typeof respectIgnore !== \"boolean\") {\n throw new TypeError(\"respectIgnore must be a boolean\");\n }\n if (typeof searchHidden !== \"boolean\") {\n throw new TypeError(\"searchHidden must be a boolean\");\n }\n const roots = await resolveSearchDirectories(directories),\n candidates = extractCandidates(text, level);\n if (level === MAX_LEVEL) {\n candidates.push(...(await inventoryCandidates(text, roots, respectIgnore, searchHidden)));\n }\n return validateCandidates(candidates, roots, variables, respectIgnore, searchHidden);\n}\nexport type {\n FindExistingPathsOptions,\n PathKind,\n PathLocation,\n PathMatch,\n PathPosition,\n SearchLevel,\n Variables,\n} from \"./types.js\";\n"],"mappings":"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"}
|
|
@@ -1,63 +1,62 @@
|
|
|
1
1
|
const { Buffer } = require("node:buffer");
|
|
2
|
-
|
|
3
|
-
let fileApi;
|
|
2
|
+
|
|
3
|
+
let connectionApi, fileApi;
|
|
4
4
|
function getDriveConnection(drive, bufferChars) {
|
|
5
5
|
if (connectionApi === undefined) {
|
|
6
|
-
const koffi = require("koffi")
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
const koffi = require("koffi"),
|
|
7
|
+
getConnectionW = koffi
|
|
8
|
+
.load("mpr.dll")
|
|
9
|
+
.func(
|
|
10
|
+
"uint32_t WNetGetConnectionW(const char16_t *lpLocalName, _Out_ char16_t *lpRemoteName, _Inout_ uint32_t *lpnLength)",
|
|
11
|
+
);
|
|
12
12
|
connectionApi = { getConnectionW, koffi };
|
|
13
13
|
}
|
|
14
|
-
const buffer = Buffer.alloc(bufferChars * 2)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
status === 0 ? connectionApi.koffi.decode(buffer, "char16_t", bufferChars) : undefined;
|
|
14
|
+
const buffer = Buffer.alloc(bufferChars * 2),
|
|
15
|
+
length = [bufferChars],
|
|
16
|
+
status = connectionApi.getConnectionW(drive, buffer, length),
|
|
17
|
+
remote = status === 0 ? connectionApi.koffi.decode(buffer, "char16_t", bufferChars) : undefined;
|
|
19
18
|
return { remote, status };
|
|
20
19
|
}
|
|
21
20
|
function getFileAttributes(filePath) {
|
|
22
21
|
if (fileApi === undefined) {
|
|
23
|
-
const koffi = require("koffi")
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
22
|
+
const koffi = require("koffi"),
|
|
23
|
+
kernel32 = koffi.load("kernel32.dll"),
|
|
24
|
+
fileTime = koffi.struct({
|
|
25
|
+
highDateTime: "uint32_t",
|
|
26
|
+
lowDateTime: "uint32_t",
|
|
27
|
+
}),
|
|
28
|
+
findData = koffi.struct({
|
|
29
|
+
fileAttributes: "uint32_t",
|
|
30
|
+
creationTime: fileTime,
|
|
31
|
+
lastAccessTime: fileTime,
|
|
32
|
+
lastWriteTime: fileTime,
|
|
33
|
+
fileSizeHigh: "uint32_t",
|
|
34
|
+
fileSizeLow: "uint32_t",
|
|
35
|
+
reserved0: "uint32_t",
|
|
36
|
+
reserved1: "uint32_t",
|
|
37
|
+
fileName: koffi.array("char16_t", 260, "String"),
|
|
38
|
+
alternateFileName: koffi.array("char16_t", 14, "String"),
|
|
39
|
+
});
|
|
41
40
|
fileApi = {
|
|
41
|
+
findClose: kernel32.func("FindClose", "bool", ["void *"]),
|
|
42
42
|
findFirstFileW: kernel32.func("FindFirstFileW", "void *", [
|
|
43
43
|
"const char16_t *",
|
|
44
44
|
koffi.out(koffi.pointer(findData)),
|
|
45
45
|
]),
|
|
46
|
-
findClose: kernel32.func("FindClose", "bool", ["void *"]),
|
|
47
46
|
getLastError: kernel32.func("uint32_t GetLastError(void)"),
|
|
48
47
|
};
|
|
49
48
|
}
|
|
50
|
-
const data = {}
|
|
51
|
-
|
|
49
|
+
const data = {},
|
|
50
|
+
handle = fileApi.findFirstFileW(filePath, data);
|
|
52
51
|
if (
|
|
53
52
|
handle === null ||
|
|
54
53
|
handle === undefined ||
|
|
55
54
|
handle === -1 ||
|
|
56
55
|
handle === -1n ||
|
|
57
|
-
handle ===
|
|
58
|
-
handle ===
|
|
56
|
+
handle === 0xff_ff_ff_ffn ||
|
|
57
|
+
handle === 0xff_ff_ff_ff_ff_ff_ff_ffn
|
|
59
58
|
) {
|
|
60
|
-
return { attributes:
|
|
59
|
+
return { attributes: 0xff_ff_ff_ff, error: fileApi.getLastError() };
|
|
61
60
|
}
|
|
62
61
|
const closed = fileApi.findClose(handle);
|
|
63
62
|
if (!closed) {
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import nodeFileSystem from "node:fs";
|
|
2
2
|
import type { Options as GlobbyOptions } from "globby";
|
|
3
3
|
type ReadDirectory = NonNullable<NonNullable<GlobbyOptions["fs"]>["readdir"]>;
|
|
4
|
-
|
|
4
|
+
interface TraversalScope {
|
|
5
|
+
paths: readonly string[];
|
|
6
|
+
passthroughNames: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
interface TraversalFileSystemOptions {
|
|
9
|
+
readDirectory?: ReadDirectory;
|
|
10
|
+
scope?: TraversalScope;
|
|
11
|
+
}
|
|
12
|
+
export declare function createTraversalFileSystem(root: string, searchHidden: boolean, options?: TraversalFileSystemOptions): {
|
|
5
13
|
Stats: typeof nodeFileSystem.Stats;
|
|
6
14
|
StatsFs: typeof nodeFileSystem.StatsFs;
|
|
7
15
|
Dirent: typeof nodeFileSystem.Dirent;
|
|
@@ -158,17 +166,10 @@ export declare function createTraversalFileSystem(root: string, searchHidden: bo
|
|
|
158
166
|
readSync(fd: number, buffer: NodeJS.ArrayBufferView, offset: number, length: number, position: nodeFileSystem.ReadPosition | null): number;
|
|
159
167
|
readSync(fd: number, buffer: NodeJS.ArrayBufferView, opts?: nodeFileSystem.ReadOptions): number;
|
|
160
168
|
readFile: typeof nodeFileSystem.readFile;
|
|
161
|
-
readFileSync(path: nodeFileSystem.PathOrFileDescriptor, options
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
readFileSync(path: nodeFileSystem.PathOrFileDescriptor, options: {
|
|
166
|
-
encoding: BufferEncoding;
|
|
167
|
-
flag?: string | undefined;
|
|
168
|
-
} | BufferEncoding): string;
|
|
169
|
-
readFileSync(path: nodeFileSystem.PathOrFileDescriptor, options?: (nodeFileSystem.ObjectEncodingOptions & {
|
|
170
|
-
flag?: string | undefined;
|
|
171
|
-
}) | BufferEncoding | null): string | NonSharedBuffer;
|
|
169
|
+
readFileSync<T extends NodeJS.ArrayBufferView>(path: nodeFileSystem.PathOrFileDescriptor, options: nodeFileSystem.ReadFileSyncOptionsWithBuffer<T>): import("node:buffer").BufferView<T>;
|
|
170
|
+
readFileSync(path: nodeFileSystem.PathOrFileDescriptor, options?: nodeFileSystem.ReadFileSyncOptionsWithBufferEncoding | null): NonSharedBuffer;
|
|
171
|
+
readFileSync(path: nodeFileSystem.PathOrFileDescriptor, options: nodeFileSystem.ReadFileSyncOptionsWithStringEncoding | BufferEncoding): string;
|
|
172
|
+
readFileSync(path: nodeFileSystem.PathOrFileDescriptor, options: nodeFileSystem.ReadFileSyncOptions): string | NonSharedBuffer;
|
|
172
173
|
writeFile: typeof nodeFileSystem.writeFile;
|
|
173
174
|
writeFileSync(file: nodeFileSystem.PathOrFileDescriptor, data: string | NodeJS.ArrayBufferView, options?: nodeFileSystem.WriteFileOptions): void;
|
|
174
175
|
appendFile: typeof nodeFileSystem.appendFile;
|
|
@@ -56,7 +56,7 @@ export interface Candidate {
|
|
|
56
56
|
export interface SearchSettings {
|
|
57
57
|
batchValidationThreshold: number;
|
|
58
58
|
directoryScanThreshold: number;
|
|
59
|
-
|
|
59
|
+
ignoreFileNames: string[];
|
|
60
60
|
locationSuffixPattern: RegExp;
|
|
61
61
|
respectIgnoreByDefault: boolean;
|
|
62
62
|
searchHiddenByDefault: boolean;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pathprobe",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.14",
|
|
4
4
|
"description": "Extract, resolve, and validate file and directory paths mentioned in text, with variable expansion, ignore rules, hidden-file control, and configurable search roots.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
},
|
|
20
20
|
"scripts": {
|
|
21
21
|
"build": "tsdown --config config/tsdown.config.ts && tsc --project config/tsconfig.build.json",
|
|
22
|
-
"format": "oxfmt
|
|
23
|
-
"lint": "oxlint
|
|
22
|
+
"format": "oxfmt",
|
|
23
|
+
"lint": "oxlint",
|
|
24
24
|
"prepack": "bun run build",
|
|
25
25
|
"test": "node --test \"quality/test/*.test.mjs\" && bun test quality/test",
|
|
26
26
|
"test:benchmark": "node quality/benchmark/run.mjs",
|
|
@@ -34,9 +34,11 @@
|
|
|
34
34
|
"p-limit": "latest"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
+
"@types/bun": "latest",
|
|
37
38
|
"@types/node": "latest",
|
|
38
39
|
"oxfmt": "latest",
|
|
39
40
|
"oxlint": "latest",
|
|
41
|
+
"oxlint-tsgolint": "latest",
|
|
40
42
|
"tinybench": "latest",
|
|
41
43
|
"tsdown": "beta",
|
|
42
44
|
"typescript": "next"
|