pathprobe 0.6.7 → 0.7.7

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
@@ -140,7 +140,7 @@ const knownFileErrors = /* @__PURE__ */ new Set([
140
140
  "EINVAL"
141
141
  ]);
142
142
  const unverifiableUncErrors = /* @__PURE__ */ new Set(["UNKNOWN", "EUNKNOWN"]);
143
- function pathKey$2(value) {
143
+ function pathKey$3(value) {
144
144
  return process.platform === "win32" ? value.toLowerCase() : value;
145
145
  }
146
146
  function fileErrorCode(error) {
@@ -171,15 +171,15 @@ async function classifyExistingPaths(paths, roots) {
171
171
  await Promise.all(paths.map((filePath) => limit(() => classifyAndAdd(found, filePath))));
172
172
  return found;
173
173
  }
174
- const rootKeys = new Set(roots.map(pathKey$2));
174
+ const rootKeys = new Set(roots.map(pathKey$3));
175
175
  const pathsByParent = /* @__PURE__ */ new Map();
176
176
  for (const filePath of paths) {
177
- if (rootKeys.has(pathKey$2(filePath))) {
177
+ if (rootKeys.has(pathKey$3(filePath))) {
178
178
  found.set(filePath, "directory");
179
179
  continue;
180
180
  }
181
181
  const parent = nodePath.dirname(filePath);
182
- const key = pathKey$2(parent);
182
+ const key = pathKey$3(parent);
183
183
  const group = pathsByParent.get(key) ?? {
184
184
  parent,
185
185
  paths: []
@@ -199,10 +199,10 @@ async function classifyExistingPaths(paths, roots) {
199
199
  if (isKnownFileError(error, parent)) return;
200
200
  throw error;
201
201
  }
202
- const entriesByName = new Map(entries.map((entry) => [pathKey$2(entry.name), entry]));
202
+ const entriesByName = new Map(entries.map((entry) => [pathKey$3(entry.name), entry]));
203
203
  await Promise.all(groupPaths.map(async (filePath) => {
204
204
  const name = nodePath.basename(filePath);
205
- const entry = entriesByName.get(pathKey$2(name));
205
+ const entry = entriesByName.get(pathKey$3(name));
206
206
  if (entry?.isFile()) found.set(filePath, "file");
207
207
  else if (entry?.isDirectory()) found.set(filePath, "directory");
208
208
  else if (entry !== void 0 || process.platform === "win32" && name.includes(":")) await classifyAndAdd(found, filePath);
@@ -346,6 +346,57 @@ function resolveUncPath(value) {
346
346
  return resolveMappedUncPath(path) ?? resolveLocalAdministrativeShare(path);
347
347
  }
348
348
  //#endregion
349
+ //#region src/native/attributes.ts
350
+ const fileAttributeHidden = 2;
351
+ const invalidFileAttributes = 4294967295;
352
+ const missingPathErrors = /* @__PURE__ */ new Set([2, 3]);
353
+ function hasWindowsHiddenAttribute(filePath) {
354
+ if (process.platform !== "win32") throw new Error("Windows file attributes are unavailable on this platform");
355
+ const { attributes, error } = nativeBridge.getFileAttributes(nodePath.toNamespacedPath(filePath));
356
+ if (!Number.isInteger(attributes) || !Number.isInteger(error)) throw new TypeError("GetFileAttributesW returned an invalid result");
357
+ if (attributes !== invalidFileAttributes) {
358
+ if (error !== 0) throw new Error(`GetFileAttributesW returned attributes with error ${error}`);
359
+ return (attributes & fileAttributeHidden) !== 0;
360
+ }
361
+ if (missingPathErrors.has(error)) return false;
362
+ throw new Error(`GetFileAttributesW failed for ${filePath} with error ${error}`);
363
+ }
364
+ //#endregion
365
+ //#region src/search/hidden.ts
366
+ function pathKey$2(value) {
367
+ return process.platform === "win32" ? value.toLowerCase() : value;
368
+ }
369
+ function relativePath(filePath, boundary) {
370
+ const relative = nodePath.relative(boundary, filePath);
371
+ if (nodePath.isAbsolute(relative) || relative === ".." || relative.startsWith(`..${nodePath.sep}`)) throw new RangeError(`${filePath} is outside the hidden-path boundary ${boundary}`);
372
+ return relative;
373
+ }
374
+ function hasHiddenDotSegment(filePath, boundary) {
375
+ return relativePath(filePath, boundary).split(/[\\/]/u).some((part) => part.length > 1 && part.startsWith("."));
376
+ }
377
+ function createHiddenPathDetector() {
378
+ const attributeCache = /* @__PURE__ */ new Map();
379
+ return { isHidden(filePath, boundary) {
380
+ if (process.platform !== "win32") return hasHiddenDotSegment(filePath, boundary);
381
+ relativePath(filePath, boundary);
382
+ const boundaryKey = pathKey$2(nodePath.resolve(boundary));
383
+ let current = nodePath.resolve(filePath);
384
+ while (pathKey$2(current) !== boundaryKey) {
385
+ const key = pathKey$2(current);
386
+ let hidden = attributeCache.get(key);
387
+ if (hidden === void 0) {
388
+ hidden = hasWindowsHiddenAttribute(current);
389
+ attributeCache.set(key, hidden);
390
+ }
391
+ if (hidden) return true;
392
+ const parent = nodePath.dirname(current);
393
+ if (parent === current) throw new Error(`Unable to reach hidden-path boundary ${boundary} from ${filePath}`);
394
+ current = parent;
395
+ }
396
+ return false;
397
+ } };
398
+ }
399
+ //#endregion
349
400
  //#region src/search/policy.ts
350
401
  function pathKey$1(value) {
351
402
  return process.platform === "win32" ? value.toLowerCase() : value;
@@ -354,14 +405,11 @@ function isWithinRoot(filePath, root) {
354
405
  const relative = nodePath.relative(root, filePath);
355
406
  return relative === "" || relative !== ".." && !relative.startsWith(`..${nodePath.sep}`) && !nodePath.isAbsolute(relative);
356
407
  }
357
- function isHidden(relativePath) {
358
- return relativePath.split(/[\\/]/u).some((part) => part.length > 1 && part.startsWith("."));
359
- }
360
408
  function traversalOptions(root, searchHidden) {
361
409
  return {
362
410
  caseSensitiveMatch: process.platform !== "win32",
363
411
  cwd: root,
364
- dot: searchHidden,
412
+ dot: process.platform === "win32" || searchHidden,
365
413
  followSymbolicLinks: false,
366
414
  onlyFiles: false,
367
415
  unique: true
@@ -393,13 +441,15 @@ async function resolveSearchDirectories(directories) {
393
441
  return [...unique.values()];
394
442
  }
395
443
  async function listSearchEntries(root, respectIgnore, searchHidden) {
396
- return (!respectIgnore ? await fastGlob("**/*", {
444
+ const entries = !respectIgnore ? await fastGlob("**/*", {
397
445
  ...traversalOptions(root, searchHidden),
398
446
  objectMode: true
399
447
  }) : await globby("**/*", {
400
448
  ...globbyOptions(root, respectIgnore, searchHidden),
401
449
  objectMode: true
402
- })).map((entry) => ({
450
+ });
451
+ const hiddenDetector = createHiddenPathDetector();
452
+ return entries.filter((entry) => searchHidden || !hiddenDetector.isHidden(nodePath.resolve(root, entry.path), root)).map((entry) => ({
403
453
  directory: entry.dirent.isDirectory(),
404
454
  path: entry.path
405
455
  }));
@@ -407,13 +457,14 @@ async function listSearchEntries(root, respectIgnore, searchHidden) {
407
457
  async function filterSearchablePaths(paths, roots, respectIgnore, searchHidden) {
408
458
  const allowed = /* @__PURE__ */ new Set();
409
459
  const pathsByRoot = /* @__PURE__ */ new Map();
460
+ const hiddenDetector = createHiddenPathDetector();
410
461
  for (const filePath of paths) {
411
462
  let hasSearchRoot = false;
412
463
  for (const root of roots) {
413
464
  if (!isWithinRoot(filePath, root)) continue;
414
465
  hasSearchRoot = true;
415
466
  const relative = nodePath.relative(root, filePath);
416
- if (!searchHidden && isHidden(relative)) continue;
467
+ if (!searchHidden && hiddenDetector.isHidden(filePath, root)) continue;
417
468
  if (relative === "" || !respectIgnore) allowed.add(filePath);
418
469
  else {
419
470
  const grouped = pathsByRoot.get(root) ?? [];
@@ -422,8 +473,9 @@ async function filterSearchablePaths(paths, roots, respectIgnore, searchHidden)
422
473
  }
423
474
  }
424
475
  if (hasSearchRoot) continue;
425
- const filesystemRelative = nodePath.relative(nodePath.parse(filePath).root, filePath);
426
- if (searchHidden || !isHidden(filesystemRelative)) allowed.add(filePath);
476
+ const filesystemRoot = nodePath.parse(filePath).root;
477
+ const hiddenBoundary = process.platform === "win32" ? nodePath.dirname(filePath) : filesystemRoot;
478
+ if (searchHidden || !hiddenDetector.isHidden(filePath, hiddenBoundary)) allowed.add(filePath);
427
479
  }
428
480
  await Promise.all([...pathsByRoot].map(async ([root, relativePaths]) => {
429
481
  const patterns = relativePaths.map(convertPathToPattern);
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["pathKey","pathKey"],"sources":["../config/settings.ts","../src/variables.ts","../src/candidates.ts","../src/validation/existence.ts","../src/validation/containment.ts","../src/native/unc.ts","../src/search/policy.ts","../src/validation/filesystem.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) {\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 { 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 knownFileErrors = 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 fileErrorCode(error: unknown): string | undefined {\n if (error instanceof Error && \"code\" in error && typeof error.code === \"string\") {\n return error.code;\n }\n return undefined;\n}\nfunction isKnownFileError(error: unknown, filePath?: string): boolean {\n const code = fileErrorCode(error);\n return (\n code !== undefined &&\n (knownFileErrors.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 (isKnownFileError(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 (isKnownFileError(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 { 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 { 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\";\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 isHidden(relativePath: string): boolean {\n return relativePath.split(/[\\\\/]/u).some((part) => part.length > 1 && part.startsWith(\".\"));\n}\nfunction traversalOptions(root: string, searchHidden: boolean) {\n return {\n caseSensitiveMatch: process.platform !== \"win32\",\n cwd: root,\n dot: searchHidden,\n followSymbolicLinks: false,\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 return entries.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 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 && isHidden(relative)) {\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 filesystemRelative = nodePath.relative(nodePath.parse(filePath).root, filePath);\n if (searchHidden || !isHidden(filesystemRelative)) {\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 { fileURLToPath } from \"node:url\";\nimport nodePath from \"node:path\";\nimport { classifyExistingPaths } from \"./existence.js\";\nimport { removeContainedMatches } from \"./containment.js\";\nimport { filterSearchablePaths } from \"../search/policy.js\";\nimport { expandVariables } from \"../variables.js\";\nimport { resolveUncPath } from \"../native/unc.js\";\nimport { settings } from \"../../config/settings.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}\ntype PreparedCandidate = Pick<ResolvedCandidate, \"location\" | \"position\"> & { value: string };\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 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}\nfunction prepareCandidate(candidate: Candidate): PreparedCandidate {\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 if (candidate.kind === \"inventory\") {\n return { position: { end, start }, value };\n }\n const match = settings.locationSuffixPattern.exec(value);\n if (match === null) {\n return { position: { end, start }, value };\n }\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 const location: PathLocation =\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 return {\n location,\n position: { end, start },\n value: value.slice(0, match.index),\n };\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 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 let searchablePaths = [...validationPaths.values()];\n if (respectIgnore || !searchHidden) {\n searchablePaths = [\n ...(await filterSearchablePaths(searchablePaths, roots, respectIgnore, searchHidden)),\n ];\n }\n const classifiedPaths = await classifyExistingPaths(searchablePaths, roots);\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/filesystem.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"],"sources":["../config/settings.ts","../src/variables.ts","../src/candidates.ts","../src/validation/existence.ts","../src/validation/containment.ts","../src/native/unc.ts","../src/native/attributes.ts","../src/search/hidden.ts","../src/search/policy.ts","../src/validation/filesystem.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) {\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 { 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 knownFileErrors = 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 fileErrorCode(error: unknown): string | undefined {\n if (error instanceof Error && \"code\" in error && typeof error.code === \"string\") {\n return error.code;\n }\n return undefined;\n}\nfunction isKnownFileError(error: unknown, filePath?: string): boolean {\n const code = fileErrorCode(error);\n return (\n code !== undefined &&\n (knownFileErrors.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 (isKnownFileError(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 (isKnownFileError(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 { 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 { 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\";\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 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 { fileURLToPath } from \"node:url\";\nimport nodePath from \"node:path\";\nimport { classifyExistingPaths } from \"./existence.js\";\nimport { removeContainedMatches } from \"./containment.js\";\nimport { filterSearchablePaths } from \"../search/policy.js\";\nimport { expandVariables } from \"../variables.js\";\nimport { resolveUncPath } from \"../native/unc.js\";\nimport { settings } from \"../../config/settings.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}\ntype PreparedCandidate = Pick<ResolvedCandidate, \"location\" | \"position\"> & { value: string };\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 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}\nfunction prepareCandidate(candidate: Candidate): PreparedCandidate {\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 if (candidate.kind === \"inventory\") {\n return { position: { end, start }, value };\n }\n const match = settings.locationSuffixPattern.exec(value);\n if (match === null) {\n return { position: { end, start }, value };\n }\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 const location: PathLocation =\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 return {\n location,\n position: { end, start },\n value: value.slice(0, match.index),\n };\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 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 let searchablePaths = [...validationPaths.values()];\n if (respectIgnore || !searchHidden) {\n searchablePaths = [\n ...(await filterSearchablePaths(searchablePaths, roots, respectIgnore, searchHidden)),\n ];\n }\n const classifiedPaths = await classifyExistingPaths(searchablePaths, roots);\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/filesystem.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,5 +1,6 @@
1
1
  const { Buffer } = require("node:buffer");
2
2
  let connectionApi;
3
+ let fileApi;
3
4
  function getDriveConnection(drive, bufferChars) {
4
5
  if (connectionApi === undefined) {
5
6
  const koffi = require("koffi");
@@ -17,4 +18,17 @@ function getDriveConnection(drive, bufferChars) {
17
18
  status === 0 ? connectionApi.koffi.decode(buffer, "char16_t", bufferChars) : undefined;
18
19
  return { remote, status };
19
20
  }
20
- module.exports = { getDriveConnection };
21
+ function getFileAttributes(filePath) {
22
+ if (fileApi === undefined) {
23
+ const koffi = require("koffi");
24
+ const kernel32 = koffi.load("kernel32.dll");
25
+ fileApi = {
26
+ getFileAttributesW: kernel32.func("uint32_t GetFileAttributesW(const char16_t *lpFileName)"),
27
+ getLastError: kernel32.func("uint32_t GetLastError(void)"),
28
+ };
29
+ }
30
+ const attributes = fileApi.getFileAttributesW(filePath);
31
+ const error = attributes === 0xffffffff ? fileApi.getLastError() : 0;
32
+ return { attributes, error };
33
+ }
34
+ module.exports = { getDriveConnection, getFileAttributes };
@@ -0,0 +1 @@
1
+ export declare function hasWindowsHiddenAttribute(filePath: string): boolean;
@@ -0,0 +1,3 @@
1
+ export declare function createHiddenPathDetector(): {
2
+ isHidden(filePath: string, boundary: string): boolean;
3
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pathprobe",
3
- "version": "0.6.7",
3
+ "version": "0.7.7",
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": {