pathprobe 0.8.9 → 0.8.12
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
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { fileURLToPath } from "node:url";
|
|
2
2
|
import nodePath from "node:path";
|
|
3
3
|
import { readdir, stat } from "node:fs/promises";
|
|
4
|
-
import fastGlob from "fast-glob";
|
|
5
4
|
import { convertPathToPattern, globby } from "globby";
|
|
5
|
+
import isPathInside from "is-path-inside";
|
|
6
6
|
import { isIP } from "node:net";
|
|
7
7
|
import { hostname, networkInterfaces } from "node:os";
|
|
8
8
|
import nativeBridge from "./native/windows-bridge.cjs";
|
|
@@ -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,
|
|
@@ -249,17 +249,17 @@ const missingPathErrors = /* @__PURE__ */ new Set([2, 3]);
|
|
|
249
249
|
function hasWindowsHiddenAttribute(filePath) {
|
|
250
250
|
if (process.platform !== "win32") throw new Error("Windows file attributes are unavailable on this platform");
|
|
251
251
|
const { attributes, error } = nativeBridge.getFileAttributes(nodePath.toNamespacedPath(filePath));
|
|
252
|
-
if (!Number.isInteger(attributes) || !Number.isInteger(error)) throw new TypeError("
|
|
252
|
+
if (!Number.isInteger(attributes) || !Number.isInteger(error)) throw new TypeError("Windows file attribute lookup returned an invalid result");
|
|
253
253
|
if (attributes !== invalidFileAttributes) {
|
|
254
|
-
if (error !== 0) throw new Error(`
|
|
254
|
+
if (error !== 0) throw new Error(`Windows file attribute lookup returned attributes with error ${error}`);
|
|
255
255
|
return (attributes & fileAttributeHidden) !== 0;
|
|
256
256
|
}
|
|
257
257
|
if (missingPathErrors.has(error)) return false;
|
|
258
|
-
throw new Error(`
|
|
258
|
+
throw new Error(`Windows file attribute lookup failed for ${filePath} with error ${error}`);
|
|
259
259
|
}
|
|
260
260
|
//#endregion
|
|
261
261
|
//#region src/search/hidden.ts
|
|
262
|
-
function pathKey$
|
|
262
|
+
function pathKey$5(value) {
|
|
263
263
|
return process.platform === "win32" ? value.toLowerCase() : value;
|
|
264
264
|
}
|
|
265
265
|
function relativePath(filePath, boundary) {
|
|
@@ -275,10 +275,10 @@ function createHiddenPathDetector() {
|
|
|
275
275
|
return { isHidden(filePath, boundary) {
|
|
276
276
|
if (process.platform !== "win32") return hasHiddenDotSegment(filePath, boundary);
|
|
277
277
|
relativePath(filePath, boundary);
|
|
278
|
-
const boundaryKey = pathKey$
|
|
278
|
+
const boundaryKey = pathKey$5(nodePath.resolve(boundary));
|
|
279
279
|
let current = nodePath.resolve(filePath);
|
|
280
|
-
while (pathKey$
|
|
281
|
-
const key = pathKey$
|
|
280
|
+
while (pathKey$5(current) !== boundaryKey) {
|
|
281
|
+
const key = pathKey$5(current);
|
|
282
282
|
let hidden = attributeCache.get(key);
|
|
283
283
|
if (hidden === void 0) {
|
|
284
284
|
hidden = hasWindowsHiddenAttribute(current);
|
|
@@ -300,6 +300,9 @@ const unreadableDirectoryErrors = /* @__PURE__ */ new Set([
|
|
|
300
300
|
"ENOENT",
|
|
301
301
|
"EPERM"
|
|
302
302
|
]);
|
|
303
|
+
function pathKey$4(value) {
|
|
304
|
+
return process.platform === "win32" ? value.toLowerCase() : value;
|
|
305
|
+
}
|
|
303
306
|
function isUnreadableDirectoryError(error) {
|
|
304
307
|
return error.code !== void 0 && unreadableDirectoryErrors.has(error.code);
|
|
305
308
|
}
|
|
@@ -308,23 +311,53 @@ function completeDirectoryRead(error, entries, callback) {
|
|
|
308
311
|
else if (isUnreadableDirectoryError(error)) callback(null, []);
|
|
309
312
|
else callback(error, []);
|
|
310
313
|
}
|
|
311
|
-
function
|
|
314
|
+
function indexScope(root, scope) {
|
|
315
|
+
if (scope === void 0) return;
|
|
316
|
+
const resolvedRoot = nodePath.resolve(root);
|
|
317
|
+
const childrenByDirectory = /* @__PURE__ */ new Map();
|
|
318
|
+
for (const relativePath of scope.paths) {
|
|
319
|
+
if (nodePath.isAbsolute(relativePath) || relativePath === ".." || relativePath.startsWith(`..${nodePath.sep}`)) throw new RangeError(`${relativePath} is outside the traversal root ${root}`);
|
|
320
|
+
let directory = resolvedRoot;
|
|
321
|
+
for (const name of relativePath.split(nodePath.sep)) {
|
|
322
|
+
const directoryKey = pathKey$4(directory);
|
|
323
|
+
const children = childrenByDirectory.get(directoryKey) ?? /* @__PURE__ */ new Set();
|
|
324
|
+
children.add(pathKey$4(name));
|
|
325
|
+
childrenByDirectory.set(directoryKey, children);
|
|
326
|
+
directory = nodePath.join(directory, name);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return {
|
|
330
|
+
childrenByDirectory,
|
|
331
|
+
passthroughNames: new Set(scope.passthroughNames.map(pathKey$4))
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
function filterToScope(filePath, entries, scope) {
|
|
335
|
+
if (scope === void 0) return entries;
|
|
336
|
+
const children = scope.childrenByDirectory.get(pathKey$4(nodePath.resolve(filePath)));
|
|
337
|
+
if (children === void 0) return [];
|
|
338
|
+
return entries.filter((entry) => {
|
|
339
|
+
const key = pathKey$4(typeof entry === "string" ? entry : entry.name);
|
|
340
|
+
return children.has(key) || scope.passthroughNames.has(key);
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
function createReadDirectory(root, searchHidden, readDirectory, scope) {
|
|
312
344
|
const hiddenDetector = createHiddenPathDetector();
|
|
313
345
|
function traverseReadDirectory(filePath, optionsOrCallback, entryCallback) {
|
|
314
346
|
if (typeof optionsOrCallback === "function") {
|
|
315
347
|
readDirectory(filePath, (error, entries) => {
|
|
316
|
-
completeDirectoryRead(error, entries, optionsOrCallback);
|
|
348
|
+
completeDirectoryRead(error, error === null ? filterToScope(filePath, entries, scope) : entries, optionsOrCallback);
|
|
317
349
|
});
|
|
318
350
|
return;
|
|
319
351
|
}
|
|
320
352
|
if (entryCallback === void 0) throw new TypeError("A directory entry callback is required");
|
|
321
353
|
readDirectory(filePath, optionsOrCallback, (error, entries) => {
|
|
354
|
+
const scopedEntries = error === null ? filterToScope(filePath, entries, scope) : entries;
|
|
322
355
|
if (error !== null || searchHidden) {
|
|
323
|
-
completeDirectoryRead(error,
|
|
356
|
+
completeDirectoryRead(error, scopedEntries, entryCallback);
|
|
324
357
|
return;
|
|
325
358
|
}
|
|
326
359
|
try {
|
|
327
|
-
entryCallback(null,
|
|
360
|
+
entryCallback(null, scopedEntries.filter((entry) => !entry.isDirectory() || !hiddenDetector.isHidden(nodePath.join(filePath, entry.name), root)));
|
|
328
361
|
} catch (caught) {
|
|
329
362
|
entryCallback(caught instanceof Error ? caught : new Error(String(caught)), []);
|
|
330
363
|
}
|
|
@@ -332,39 +365,45 @@ function createReadDirectory(root, searchHidden, readDirectory) {
|
|
|
332
365
|
}
|
|
333
366
|
return traverseReadDirectory;
|
|
334
367
|
}
|
|
335
|
-
function createTraversalFileSystem(root, searchHidden,
|
|
368
|
+
function createTraversalFileSystem(root, searchHidden, options = {}) {
|
|
369
|
+
const { readDirectory = nodeFileSystem.readdir, scope } = options;
|
|
336
370
|
return {
|
|
337
371
|
...nodeFileSystem,
|
|
338
|
-
readdir: createReadDirectory(root, searchHidden, readDirectory)
|
|
372
|
+
readdir: createReadDirectory(root, searchHidden, readDirectory, indexScope(root, scope))
|
|
339
373
|
};
|
|
340
374
|
}
|
|
341
375
|
//#endregion
|
|
342
376
|
//#region src/search/policy.ts
|
|
377
|
+
const ignoreFilePatterns = settings.ignoreFileNames.map((name) => `**/${convertPathToPattern(name)}`);
|
|
378
|
+
const ignoreFileNames = [".gitignore", ...settings.ignoreFileNames];
|
|
343
379
|
function pathKey$3(value) {
|
|
344
380
|
return process.platform === "win32" ? value.toLowerCase() : value;
|
|
345
381
|
}
|
|
346
382
|
function isWithinRoot(filePath, root) {
|
|
347
|
-
|
|
348
|
-
return relative === "" || relative !== ".." && !relative.startsWith(`..${nodePath.sep}`) && !nodePath.isAbsolute(relative);
|
|
383
|
+
return filePath === root || isPathInside(filePath, root);
|
|
349
384
|
}
|
|
350
|
-
function traversalOptions(root, searchHidden) {
|
|
385
|
+
function traversalOptions(root, searchHidden, scopedPaths) {
|
|
386
|
+
const fileSystem = scopedPaths === void 0 ? createTraversalFileSystem(root, searchHidden) : createTraversalFileSystem(root, searchHidden, { scope: {
|
|
387
|
+
passthroughNames: ignoreFileNames,
|
|
388
|
+
paths: scopedPaths
|
|
389
|
+
} });
|
|
351
390
|
return {
|
|
352
391
|
caseSensitiveMatch: process.platform !== "win32",
|
|
353
392
|
cwd: root,
|
|
354
393
|
dot: process.platform === "win32" || searchHidden,
|
|
355
394
|
followSymbolicLinks: false,
|
|
356
|
-
fs:
|
|
395
|
+
fs: fileSystem,
|
|
357
396
|
onlyFiles: false,
|
|
358
397
|
unique: true
|
|
359
398
|
};
|
|
360
399
|
}
|
|
361
|
-
function globbyOptions(root, respectIgnore, searchHidden) {
|
|
400
|
+
function globbyOptions(root, respectIgnore, searchHidden, scopedPaths) {
|
|
362
401
|
return {
|
|
363
|
-
...traversalOptions(root, searchHidden),
|
|
402
|
+
...traversalOptions(root, searchHidden, scopedPaths),
|
|
364
403
|
expandDirectories: false,
|
|
365
404
|
gitignore: respectIgnore,
|
|
366
405
|
globalGitignore: respectIgnore,
|
|
367
|
-
...respectIgnore ? { ignoreFiles:
|
|
406
|
+
...respectIgnore ? { ignoreFiles: ignoreFilePatterns } : {}
|
|
368
407
|
};
|
|
369
408
|
}
|
|
370
409
|
async function resolveSearchDirectories(directories) {
|
|
@@ -384,10 +423,7 @@ async function resolveSearchDirectories(directories) {
|
|
|
384
423
|
return [...unique.values()];
|
|
385
424
|
}
|
|
386
425
|
async function listSearchEntries(root, respectIgnore, searchHidden) {
|
|
387
|
-
const entries =
|
|
388
|
-
...traversalOptions(root, searchHidden),
|
|
389
|
-
objectMode: true
|
|
390
|
-
}) : await globby("**/*", {
|
|
426
|
+
const entries = await globby("**/*", {
|
|
391
427
|
...globbyOptions(root, respectIgnore, searchHidden),
|
|
392
428
|
objectMode: true
|
|
393
429
|
});
|
|
@@ -423,7 +459,7 @@ async function filterSearchablePaths(paths, roots, respectIgnore, searchHidden)
|
|
|
423
459
|
await Promise.all([...pathsByRoot].map(async ([root, relativePaths]) => {
|
|
424
460
|
const patterns = relativePaths.map(convertPathToPattern);
|
|
425
461
|
const matches = await globby(patterns, {
|
|
426
|
-
...globbyOptions(root, true, true),
|
|
462
|
+
...globbyOptions(root, true, true, relativePaths),
|
|
427
463
|
absolute: true
|
|
428
464
|
});
|
|
429
465
|
for (const match of matches) allowed.add(nodePath.normalize(match));
|
|
@@ -478,7 +514,7 @@ async function classifyExistingPaths(paths, roots) {
|
|
|
478
514
|
const found = /* @__PURE__ */ new Map();
|
|
479
515
|
const limit = pLimit(settings.validationConcurrency);
|
|
480
516
|
if (paths.length < settings.batchValidationThreshold) {
|
|
481
|
-
await
|
|
517
|
+
await limit.map(paths, (filePath) => classifyAndAdd(found, filePath));
|
|
482
518
|
return found;
|
|
483
519
|
}
|
|
484
520
|
const rootKeys = new Set(roots.map(pathKey$1));
|
|
@@ -501,7 +537,7 @@ async function classifyExistingPaths(paths, roots) {
|
|
|
501
537
|
const scannedGroups = [];
|
|
502
538
|
for (const group of pathsByParent.values()) if (group.paths.length < settings.directoryScanThreshold) directPaths.push(...group.paths);
|
|
503
539
|
else scannedGroups.push(group);
|
|
504
|
-
await Promise.all([
|
|
540
|
+
await Promise.all([limit.map(directPaths, (filePath) => classifyAndAdd(found, filePath)), limit.map(scannedGroups, async ({ parent, paths: groupPaths }) => {
|
|
505
541
|
let entries;
|
|
506
542
|
try {
|
|
507
543
|
entries = await readdir(parent, { withFileTypes: true });
|
|
@@ -517,7 +553,7 @@ async function classifyExistingPaths(paths, roots) {
|
|
|
517
553
|
else if (entry?.isDirectory()) found.set(filePath, "directory");
|
|
518
554
|
else if (entry !== void 0 || process.platform === "win32" && name.includes(":")) await classifyAndAdd(found, filePath);
|
|
519
555
|
}));
|
|
520
|
-
})
|
|
556
|
+
})]);
|
|
521
557
|
return found;
|
|
522
558
|
}
|
|
523
559
|
//#endregion
|
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(\"GetFileAttributesW returned an invalid result\");\n }\n if (attributes !== invalidFileAttributes) {\n if (error !== 0) {\n throw new Error(`GetFileAttributesW 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(`GetFileAttributesW 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 fastGlob from \"fast-glob\";\nimport { createHiddenPathDetector } from \"./hidden.js\";\n\ntype ReadDirectory = fastGlob.FileSystemAdapter[\"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 fastGlob from \"fast-glob\";\nimport { convertPathToPattern, globby } from \"globby\";\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 const relative = nodePath.relative(root, filePath);\n return (\n relative === \"\" ||\n (relative !== \"..\" &&\n !relative.startsWith(`..${nodePath.sep}`) &&\n !nodePath.isAbsolute(relative))\n );\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 = !respectIgnore\n ? await fastGlob(\"**/*\", { ...traversalOptions(root, searchHidden), objectMode: true })\n : 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 Promise.all(paths.map((filePath) => limit(() => 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 ...directPaths.map((filePath) => limit(() => classifyAndAdd(found, filePath))),\n ...scannedGroups.map(({ parent, paths: groupPaths }) =>\n limit(async () => {\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 (\n entry !== undefined ||\n (process.platform === \"win32\" && name.includes(\":\"))\n ) {\n await classifyAndAdd(found, filePath);\n }\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;\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;\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 const 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 const 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 const key = pathKey(name);\n return children.has(key) || scope.passthroughNames.has(key);\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 const scopedEntries = error === null ? filterToScope(filePath, entries, scope) : entries;\n completeDirectoryRead(error, scopedEntries, 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 const scopedEntries = error === null ? filterToScope(filePath, entries, scope) : entries;\n if (error !== null || searchHidden) {\n completeDirectoryRead(error, scopedEntries, entryCallback);\n return;\n }\n try {\n const visibleEntries = scopedEntries.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 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);\nconst 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 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, 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 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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"}
|
|
@@ -22,13 +22,47 @@ function getFileAttributes(filePath) {
|
|
|
22
22
|
if (fileApi === undefined) {
|
|
23
23
|
const koffi = require("koffi");
|
|
24
24
|
const kernel32 = koffi.load("kernel32.dll");
|
|
25
|
+
const fileTime = koffi.struct({
|
|
26
|
+
lowDateTime: "uint32_t",
|
|
27
|
+
highDateTime: "uint32_t",
|
|
28
|
+
});
|
|
29
|
+
const findData = koffi.struct({
|
|
30
|
+
fileAttributes: "uint32_t",
|
|
31
|
+
creationTime: fileTime,
|
|
32
|
+
lastAccessTime: fileTime,
|
|
33
|
+
lastWriteTime: fileTime,
|
|
34
|
+
fileSizeHigh: "uint32_t",
|
|
35
|
+
fileSizeLow: "uint32_t",
|
|
36
|
+
reserved0: "uint32_t",
|
|
37
|
+
reserved1: "uint32_t",
|
|
38
|
+
fileName: koffi.array("char16_t", 260, "String"),
|
|
39
|
+
alternateFileName: koffi.array("char16_t", 14, "String"),
|
|
40
|
+
});
|
|
25
41
|
fileApi = {
|
|
26
|
-
|
|
42
|
+
findFirstFileW: kernel32.func("FindFirstFileW", "void *", [
|
|
43
|
+
"const char16_t *",
|
|
44
|
+
koffi.out(koffi.pointer(findData)),
|
|
45
|
+
]),
|
|
46
|
+
findClose: kernel32.func("FindClose", "bool", ["void *"]),
|
|
27
47
|
getLastError: kernel32.func("uint32_t GetLastError(void)"),
|
|
28
48
|
};
|
|
29
49
|
}
|
|
30
|
-
const
|
|
31
|
-
const
|
|
32
|
-
|
|
50
|
+
const data = {};
|
|
51
|
+
const handle = fileApi.findFirstFileW(filePath, data);
|
|
52
|
+
if (
|
|
53
|
+
handle === null ||
|
|
54
|
+
handle === undefined ||
|
|
55
|
+
handle === -1 ||
|
|
56
|
+
handle === -1n ||
|
|
57
|
+
handle === 0xffffffffn ||
|
|
58
|
+
handle === 0xffffffffffffffffn
|
|
59
|
+
) {
|
|
60
|
+
return { attributes: 0xffffffff, error: fileApi.getLastError() };
|
|
61
|
+
}
|
|
62
|
+
const closed = fileApi.findClose(handle);
|
|
63
|
+
if (!closed) {
|
|
64
|
+
throw new Error(`FindClose failed with error ${fileApi.getLastError()}`);
|
|
65
|
+
}
|
|
66
|
+
return { attributes: data.fileAttributes, error: 0 };
|
|
33
67
|
}
|
|
34
68
|
module.exports = { getDriveConnection, getFileAttributes };
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import nodeFileSystem from "node:fs";
|
|
2
|
-
import
|
|
3
|
-
type ReadDirectory =
|
|
4
|
-
|
|
2
|
+
import type { Options as GlobbyOptions } from "globby";
|
|
3
|
+
type ReadDirectory = NonNullable<NonNullable<GlobbyOptions["fs"]>["readdir"]>;
|
|
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;
|
|
@@ -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.8.
|
|
3
|
+
"version": "0.8.12",
|
|
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": {
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@monyone/aho-corasick": "latest",
|
|
31
|
-
"fast-glob": "latest",
|
|
32
31
|
"globby": "latest",
|
|
32
|
+
"is-path-inside": "latest",
|
|
33
33
|
"koffi": "latest",
|
|
34
34
|
"p-limit": "latest"
|
|
35
35
|
},
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"oxfmt": "latest",
|
|
39
39
|
"oxlint": "latest",
|
|
40
40
|
"tinybench": "latest",
|
|
41
|
-
"tsdown": "
|
|
41
|
+
"tsdown": "beta",
|
|
42
42
|
"typescript": "next"
|
|
43
43
|
},
|
|
44
44
|
"engines": {
|