nanos-lint 3.3.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-DN7ZhC9e.js","names":["nodeFileURLToPath","parse","stripComments","parser.parse","parser.stripComments","process","os","fs","ee","ni","Ei","wi","yi","bi","Si","Ci","Ti","Ai","ki","re","gi","mi","Wi","execFileAsync","execFileAsync","globSync","globSync","process"],"sources":["../src/logger.ts","../src/types.ts","../node_modules/jsonc-parser/lib/esm/impl/scanner.js","../node_modules/jsonc-parser/lib/esm/impl/string-intern.js","../node_modules/jsonc-parser/lib/esm/impl/parser.js","../node_modules/jsonc-parser/lib/esm/main.js","../node_modules/is-safe-filename/index.js","../node_modules/env-paths/index.js","../src/paths.ts","../src/errors.ts","../src/config.ts","../node_modules/glob/dist/esm/index.min.js","../src/lock.ts","../src/terminal-progress.ts","../src/annotations-realms.ts","../src/download-guard.ts","../src/luals/version.ts","../src/luals/platform.ts","../src/luals/zip.ts","../src/luals/validation.ts","../src/luals/cache.ts","../src/luals/download.ts","../src/target-resolver.ts","../src/luals/offline.ts","../src/luals/files.ts","../src/luals/runner.ts","../src/deps.ts","../src/realms.ts","../src/reporter.ts","../node_modules/commander/lib/error.js","../node_modules/commander/lib/argument.js","../node_modules/commander/lib/help.js","../node_modules/commander/lib/option.js","../node_modules/commander/lib/suggestSimilar.js","../node_modules/commander/lib/command.js","../node_modules/commander/index.js","../src/annotations-metadata.ts","../src/annotations-download.ts","../src/annotations.ts","../src/cache-status.ts","../src/output.ts","../src/baseline.ts","../src/cli-check.ts","../src/cli.ts"],"sourcesContent":["export type LogLevel = \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\";\n\nexport const LOG_LEVELS: ReadonlyArray<LogLevel> = [\n \"silent\",\n \"error\",\n \"warn\",\n \"info\",\n \"debug\",\n] as const;\n\nexport const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n};\n\nexport const DEFAULT_LOG_LEVEL: LogLevel = \"warn\";\n\n/** Stream carrying `info`/`debug` diagnostics; `stderr` keeps stdout machine-readable. */\nexport type DiagnosticStream = \"stdout\" | \"stderr\";\n\n/** Validates whether a string corresponds to a recognized log level. */\nexport function isValidLogLevel(level: string): level is LogLevel {\n return level in LOG_LEVEL_PRIORITY;\n}\n\n/** Parses a string into a valid LogLevel, defaulting to 'warn'. */\nexport function parseLogLevel(raw?: string | null): LogLevel {\n if (!raw) return DEFAULT_LOG_LEVEL;\n const lower = raw.trim().toLowerCase();\n return isValidLogLevel(lower) ? lower : DEFAULT_LOG_LEVEL;\n}\n\nexport class Logger {\n private level: LogLevel = DEFAULT_LOG_LEVEL;\n private diagnosticStream: DiagnosticStream = \"stdout\";\n\n constructor(initialLevel?: LogLevel) {\n if (initialLevel && isValidLogLevel(initialLevel)) {\n this.level = initialLevel;\n } else {\n const envLevel = process.env.NANOS_LOG_LEVEL;\n if (envLevel && isValidLogLevel(envLevel.trim().toLowerCase())) {\n this.level = envLevel.trim().toLowerCase() as LogLevel;\n }\n }\n }\n\n /** Sets the active minimum logging level. */\n public setLevel(level: LogLevel): void {\n if (isValidLogLevel(level)) {\n this.level = level;\n }\n }\n\n /** Returns the current active log level. */\n public getLevel(): LogLevel {\n return this.level;\n }\n\n /**\n * Selects the stream used by `info`/`debug`. Machine-readable formats switch this to\n * `stderr`, so a report on stdout is never interleaved with diagnostic lines.\n */\n public setDiagnosticStream(stream: DiagnosticStream): void {\n this.diagnosticStream = stream;\n }\n\n /** Returns the stream used by `info`/`debug`. */\n public getDiagnosticStream(): DiagnosticStream {\n return this.diagnosticStream;\n }\n\n /** Checks if a message at the specified level should be emitted. */\n public isEnabledFor(level: LogLevel): boolean {\n return LOG_LEVEL_PRIORITY[this.level] >= LOG_LEVEL_PRIORITY[level];\n }\n\n /** Whether command results should be written; only `silent` disables them. */\n public isOutputEnabled(): boolean {\n return this.level !== \"silent\";\n }\n\n /** Logs an error-level message to stderr. */\n public error(...args: unknown[]): void {\n if (this.isEnabledFor(\"error\")) {\n console.error(...args);\n }\n }\n\n /** Logs a warning-level message to stderr. */\n public warn(...args: unknown[]): void {\n if (this.isEnabledFor(\"warn\")) {\n console.warn(...args);\n }\n }\n\n /** Logs an informational message to stdout, or to stderr when stdout carries a report. */\n public info(...args: unknown[]): void {\n if (this.isEnabledFor(\"info\")) {\n this.emitDiagnostic(args, \"log\");\n }\n }\n\n /** Logs a debug-level diagnostic message to stdout, or to stderr when stdout carries a report. */\n public debug(...args: unknown[]): void {\n if (this.isEnabledFor(\"debug\")) {\n this.emitDiagnostic(args, \"debug\");\n }\n }\n\n /** Writes an `info`/`debug` diagnostic on the configured stream. */\n private emitDiagnostic(args: unknown[], stdoutMethod: \"log\" | \"debug\"): void {\n if (this.diagnosticStream === \"stderr\") {\n console.error(...args);\n return;\n }\n if (stdoutMethod === \"debug\") {\n console.debug(...args);\n } else {\n console.log(...args);\n }\n }\n}\n\nexport const logger = new Logger();\n\nexport default logger;\n","import { fileURLToPath as nodeFileURLToPath } from \"node:url\";\nimport { logger } from \"./logger.js\";\n\nexport type DiagnosticSeverity = \"Error\" | \"Warning\" | \"Information\" | \"Hint\";\nexport type DiagnosticSeverityLevel = 1 | 2 | 3 | 4;\n\nexport interface DiagnosticRange {\n start: {\n line: number;\n character: number;\n };\n end: {\n line: number;\n character: number;\n };\n}\n\nexport interface Diagnostic {\n range: DiagnosticRange;\n severity: DiagnosticSeverityLevel; // 1 = Error, 2 = Warning, 3 = Information, 4 = Hint\n code?: string;\n message: string;\n source?: string;\n /** Present when comparing or recording a diagnostic baseline. */\n baseline?: boolean;\n}\n\nexport type DiagnosticReport = Record<string, Diagnostic[]>;\n\nexport interface CheckOptions {\n /** Single workspace path or file to check (legacy/convenience option). */\n path?: string;\n /** One or more workspace target paths or files to check. If provided, takes precedence over `path`. */\n paths?: string[];\n checklevel?: DiagnosticSeverity;\n configpath?: string;\n lualsVersion?: string;\n offline?: boolean;\n format?: \"pretty\" | \"json\" | \"github\";\n failOnError?: boolean;\n lualsBin?: string;\n ignore?: string[];\n /** External package dependency directories or Lua files. */\n deps?: string[];\n}\n\nexport interface CheckResult {\n passed: boolean;\n totalProblems: number;\n totalErrors?: number;\n totalWarnings?: number;\n totalFiles: number;\n totalFilesChecked?: number;\n diagnostics: DiagnosticReport;\n baselineSummary?: { new: number; baselined: number; total: number; stale: number };\n}\n\n/** Execution realm of a nanos world script, as loaded by the server or client VM. */\nexport type RealmName = \"client\" | \"server\" | \"shared\" | \"global\";\n\n/** nanos-lint specific settings embedded in `.luarc.json` under the `nanos` key. */\nexport interface NanosConfig {\n /** Maps glob patterns (relative to the checked root) to realm names. */\n realms?: Record<string, RealmName>;\n /** Package dependency paths or definition files. */\n deps?: string[];\n [key: string]: unknown;\n}\n\nexport interface LuaRCConfig {\n $schema?: string;\n runtime?: {\n version?: string;\n path?: string[];\n special?: Record<string, string>;\n [key: string]: unknown;\n };\n workspace?: {\n checkThirdParty?: boolean;\n library?: string[];\n ignoreDir?: string[];\n [key: string]: unknown;\n };\n files?: {\n exclude?: string[];\n [key: string]: unknown;\n };\n diagnostics?: {\n enable?: boolean;\n globals?: string[];\n disable?: string[];\n severity?: Record<string, string>;\n neededFileStatus?: Record<string, string>;\n [key: string]: unknown;\n };\n nanos?: NanosConfig;\n [key: string]: unknown;\n}\n\n/**\n * Converts a URI (e.g. `file:///path/to/file` or `file:///C:/path/to/file` or `file:///c%3A/path` or `file://server/share/file`)\n * to a standard local file system path across both Windows and Unix.\n */\nexport function fileUriToPath(uri: string): string {\n if (!uri.startsWith(\"file://\")) {\n return uri;\n }\n\n try {\n const parsed = nodeFileURLToPath(uri);\n let res = parsed.replace(/\\\\/g, \"/\");\n if (/^\\/[a-zA-Z]:/.test(res)) {\n res = res.slice(1);\n }\n if (/^[a-zA-Z]:/.test(res)) {\n res = res.charAt(0).toUpperCase() + res.slice(1);\n }\n return res;\n } catch (err) {\n logger.debug(\n `fileURLToPath fallback for URI \"${uri}\": ${err instanceof Error ? err.message : String(err)}`,\n );\n // Fallback if nodeFileURLToPath fails (e.g. malformed percent encoding)\n let decoded = uri.slice(7);\n try {\n decoded = decodeURIComponent(decoded);\n } catch (decodeErr) {\n logger.warn(\n `decodeURIComponent failed for path \"${decoded}\": ${decodeErr instanceof Error ? decodeErr.message : String(decodeErr)}`,\n );\n }\n\n if (decoded.startsWith(\"//\")) {\n return decoded;\n }\n\n if (!decoded.startsWith(\"/\") && uri.startsWith(\"file://\") && !uri.startsWith(\"file:///\")) {\n return `//${decoded}`;\n }\n\n // Windows file URIs often look like /C:/foo or /c:/foo\n if (/^\\/[a-zA-Z]:/.test(decoded)) {\n decoded = decoded.slice(1);\n }\n\n // Normalize drive letter to uppercase on Windows\n if (/^[a-zA-Z]:/.test(decoded)) {\n return decoded.charAt(0).toUpperCase() + decoded.slice(1);\n }\n\n return decoded;\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\n/**\n * Creates a JSON scanner on the given text.\n * If ignoreTrivia is set, whitespaces or comments are ignored.\n */\nexport function createScanner(text, ignoreTrivia = false) {\n const len = text.length;\n let pos = 0, value = '', tokenOffset = 0, token = 16 /* SyntaxKind.Unknown */, lineNumber = 0, lineStartOffset = 0, tokenLineStartOffset = 0, prevTokenLineStartOffset = 0, scanError = 0 /* ScanError.None */;\n function scanHexDigits(count, exact) {\n let digits = 0;\n let value = 0;\n while (digits < count || !exact) {\n let ch = text.charCodeAt(pos);\n if (ch >= 48 /* CharacterCodes._0 */ && ch <= 57 /* CharacterCodes._9 */) {\n value = value * 16 + ch - 48 /* CharacterCodes._0 */;\n }\n else if (ch >= 65 /* CharacterCodes.A */ && ch <= 70 /* CharacterCodes.F */) {\n value = value * 16 + ch - 65 /* CharacterCodes.A */ + 10;\n }\n else if (ch >= 97 /* CharacterCodes.a */ && ch <= 102 /* CharacterCodes.f */) {\n value = value * 16 + ch - 97 /* CharacterCodes.a */ + 10;\n }\n else {\n break;\n }\n pos++;\n digits++;\n }\n if (digits < count) {\n value = -1;\n }\n return value;\n }\n function setPosition(newPosition) {\n pos = newPosition;\n value = '';\n tokenOffset = 0;\n token = 16 /* SyntaxKind.Unknown */;\n scanError = 0 /* ScanError.None */;\n }\n function scanNumber() {\n let start = pos;\n if (text.charCodeAt(pos) === 48 /* CharacterCodes._0 */) {\n pos++;\n }\n else {\n pos++;\n while (pos < text.length && isDigit(text.charCodeAt(pos))) {\n pos++;\n }\n }\n if (pos < text.length && text.charCodeAt(pos) === 46 /* CharacterCodes.dot */) {\n pos++;\n if (pos < text.length && isDigit(text.charCodeAt(pos))) {\n pos++;\n while (pos < text.length && isDigit(text.charCodeAt(pos))) {\n pos++;\n }\n }\n else {\n scanError = 3 /* ScanError.UnexpectedEndOfNumber */;\n return text.substring(start, pos);\n }\n }\n let end = pos;\n if (pos < text.length && (text.charCodeAt(pos) === 69 /* CharacterCodes.E */ || text.charCodeAt(pos) === 101 /* CharacterCodes.e */)) {\n pos++;\n if (pos < text.length && text.charCodeAt(pos) === 43 /* CharacterCodes.plus */ || text.charCodeAt(pos) === 45 /* CharacterCodes.minus */) {\n pos++;\n }\n if (pos < text.length && isDigit(text.charCodeAt(pos))) {\n pos++;\n while (pos < text.length && isDigit(text.charCodeAt(pos))) {\n pos++;\n }\n end = pos;\n }\n else {\n scanError = 3 /* ScanError.UnexpectedEndOfNumber */;\n }\n }\n return text.substring(start, end);\n }\n function scanString() {\n let result = '', start = pos;\n while (true) {\n if (pos >= len) {\n result += text.substring(start, pos);\n scanError = 2 /* ScanError.UnexpectedEndOfString */;\n break;\n }\n const ch = text.charCodeAt(pos);\n if (ch === 34 /* CharacterCodes.doubleQuote */) {\n result += text.substring(start, pos);\n pos++;\n break;\n }\n if (ch === 92 /* CharacterCodes.backslash */) {\n result += text.substring(start, pos);\n pos++;\n if (pos >= len) {\n scanError = 2 /* ScanError.UnexpectedEndOfString */;\n break;\n }\n const ch2 = text.charCodeAt(pos++);\n switch (ch2) {\n case 34 /* CharacterCodes.doubleQuote */:\n result += '\\\"';\n break;\n case 92 /* CharacterCodes.backslash */:\n result += '\\\\';\n break;\n case 47 /* CharacterCodes.slash */:\n result += '/';\n break;\n case 98 /* CharacterCodes.b */:\n result += '\\b';\n break;\n case 102 /* CharacterCodes.f */:\n result += '\\f';\n break;\n case 110 /* CharacterCodes.n */:\n result += '\\n';\n break;\n case 114 /* CharacterCodes.r */:\n result += '\\r';\n break;\n case 116 /* CharacterCodes.t */:\n result += '\\t';\n break;\n case 117 /* CharacterCodes.u */:\n const ch3 = scanHexDigits(4, true);\n if (ch3 >= 0) {\n result += String.fromCharCode(ch3);\n }\n else {\n scanError = 4 /* ScanError.InvalidUnicode */;\n }\n break;\n default:\n scanError = 5 /* ScanError.InvalidEscapeCharacter */;\n }\n start = pos;\n continue;\n }\n if (ch >= 0 && ch <= 0x1f) {\n if (isLineBreak(ch)) {\n result += text.substring(start, pos);\n scanError = 2 /* ScanError.UnexpectedEndOfString */;\n break;\n }\n else {\n scanError = 6 /* ScanError.InvalidCharacter */;\n // mark as error but continue with string\n }\n }\n pos++;\n }\n return result;\n }\n function scanNext() {\n value = '';\n scanError = 0 /* ScanError.None */;\n tokenOffset = pos;\n lineStartOffset = lineNumber;\n prevTokenLineStartOffset = tokenLineStartOffset;\n if (pos >= len) {\n // at the end\n tokenOffset = len;\n return token = 17 /* SyntaxKind.EOF */;\n }\n let code = text.charCodeAt(pos);\n // trivia: whitespace\n if (isWhiteSpace(code)) {\n do {\n pos++;\n value += String.fromCharCode(code);\n code = text.charCodeAt(pos);\n } while (isWhiteSpace(code));\n return token = 15 /* SyntaxKind.Trivia */;\n }\n // trivia: newlines\n if (isLineBreak(code)) {\n pos++;\n value += String.fromCharCode(code);\n if (code === 13 /* CharacterCodes.carriageReturn */ && text.charCodeAt(pos) === 10 /* CharacterCodes.lineFeed */) {\n pos++;\n value += '\\n';\n }\n lineNumber++;\n tokenLineStartOffset = pos;\n return token = 14 /* SyntaxKind.LineBreakTrivia */;\n }\n switch (code) {\n // tokens: []{}:,\n case 123 /* CharacterCodes.openBrace */:\n pos++;\n return token = 1 /* SyntaxKind.OpenBraceToken */;\n case 125 /* CharacterCodes.closeBrace */:\n pos++;\n return token = 2 /* SyntaxKind.CloseBraceToken */;\n case 91 /* CharacterCodes.openBracket */:\n pos++;\n return token = 3 /* SyntaxKind.OpenBracketToken */;\n case 93 /* CharacterCodes.closeBracket */:\n pos++;\n return token = 4 /* SyntaxKind.CloseBracketToken */;\n case 58 /* CharacterCodes.colon */:\n pos++;\n return token = 6 /* SyntaxKind.ColonToken */;\n case 44 /* CharacterCodes.comma */:\n pos++;\n return token = 5 /* SyntaxKind.CommaToken */;\n // strings\n case 34 /* CharacterCodes.doubleQuote */:\n pos++;\n value = scanString();\n return token = 10 /* SyntaxKind.StringLiteral */;\n // comments\n case 47 /* CharacterCodes.slash */:\n const start = pos - 1;\n // Single-line comment\n if (text.charCodeAt(pos + 1) === 47 /* CharacterCodes.slash */) {\n pos += 2;\n while (pos < len) {\n if (isLineBreak(text.charCodeAt(pos))) {\n break;\n }\n pos++;\n }\n value = text.substring(start, pos);\n return token = 12 /* SyntaxKind.LineCommentTrivia */;\n }\n // Multi-line comment\n if (text.charCodeAt(pos + 1) === 42 /* CharacterCodes.asterisk */) {\n pos += 2;\n const safeLength = len - 1; // For lookahead.\n let commentClosed = false;\n while (pos < safeLength) {\n const ch = text.charCodeAt(pos);\n if (ch === 42 /* CharacterCodes.asterisk */ && text.charCodeAt(pos + 1) === 47 /* CharacterCodes.slash */) {\n pos += 2;\n commentClosed = true;\n break;\n }\n pos++;\n if (isLineBreak(ch)) {\n if (ch === 13 /* CharacterCodes.carriageReturn */ && text.charCodeAt(pos) === 10 /* CharacterCodes.lineFeed */) {\n pos++;\n }\n lineNumber++;\n tokenLineStartOffset = pos;\n }\n }\n if (!commentClosed) {\n pos++;\n scanError = 1 /* ScanError.UnexpectedEndOfComment */;\n }\n value = text.substring(start, pos);\n return token = 13 /* SyntaxKind.BlockCommentTrivia */;\n }\n // just a single slash\n value += String.fromCharCode(code);\n pos++;\n return token = 16 /* SyntaxKind.Unknown */;\n // numbers\n case 45 /* CharacterCodes.minus */:\n value += String.fromCharCode(code);\n pos++;\n if (pos === len || !isDigit(text.charCodeAt(pos))) {\n return token = 16 /* SyntaxKind.Unknown */;\n }\n // found a minus, followed by a number so\n // we fall through to proceed with scanning\n // numbers\n case 48 /* CharacterCodes._0 */:\n case 49 /* CharacterCodes._1 */:\n case 50 /* CharacterCodes._2 */:\n case 51 /* CharacterCodes._3 */:\n case 52 /* CharacterCodes._4 */:\n case 53 /* CharacterCodes._5 */:\n case 54 /* CharacterCodes._6 */:\n case 55 /* CharacterCodes._7 */:\n case 56 /* CharacterCodes._8 */:\n case 57 /* CharacterCodes._9 */:\n value += scanNumber();\n return token = 11 /* SyntaxKind.NumericLiteral */;\n // literals and unknown symbols\n default:\n // is a literal? Read the full word.\n while (pos < len && isUnknownContentCharacter(code)) {\n pos++;\n code = text.charCodeAt(pos);\n }\n if (tokenOffset !== pos) {\n value = text.substring(tokenOffset, pos);\n // keywords: true, false, null\n switch (value) {\n case 'true': return token = 8 /* SyntaxKind.TrueKeyword */;\n case 'false': return token = 9 /* SyntaxKind.FalseKeyword */;\n case 'null': return token = 7 /* SyntaxKind.NullKeyword */;\n }\n return token = 16 /* SyntaxKind.Unknown */;\n }\n // some\n value += String.fromCharCode(code);\n pos++;\n return token = 16 /* SyntaxKind.Unknown */;\n }\n }\n function isUnknownContentCharacter(code) {\n if (isWhiteSpace(code) || isLineBreak(code)) {\n return false;\n }\n switch (code) {\n case 125 /* CharacterCodes.closeBrace */:\n case 93 /* CharacterCodes.closeBracket */:\n case 123 /* CharacterCodes.openBrace */:\n case 91 /* CharacterCodes.openBracket */:\n case 34 /* CharacterCodes.doubleQuote */:\n case 58 /* CharacterCodes.colon */:\n case 44 /* CharacterCodes.comma */:\n case 47 /* CharacterCodes.slash */:\n return false;\n }\n return true;\n }\n function scanNextNonTrivia() {\n let result;\n do {\n result = scanNext();\n } while (result >= 12 /* SyntaxKind.LineCommentTrivia */ && result <= 15 /* SyntaxKind.Trivia */);\n return result;\n }\n return {\n setPosition: setPosition,\n getPosition: () => pos,\n scan: ignoreTrivia ? scanNextNonTrivia : scanNext,\n getToken: () => token,\n getTokenValue: () => value,\n getTokenOffset: () => tokenOffset,\n getTokenLength: () => pos - tokenOffset,\n getTokenStartLine: () => lineStartOffset,\n getTokenStartCharacter: () => tokenOffset - prevTokenLineStartOffset,\n getTokenError: () => scanError,\n };\n}\nfunction isWhiteSpace(ch) {\n return ch === 32 /* CharacterCodes.space */ || ch === 9 /* CharacterCodes.tab */;\n}\nfunction isLineBreak(ch) {\n return ch === 10 /* CharacterCodes.lineFeed */ || ch === 13 /* CharacterCodes.carriageReturn */;\n}\nfunction isDigit(ch) {\n return ch >= 48 /* CharacterCodes._0 */ && ch <= 57 /* CharacterCodes._9 */;\n}\nvar CharacterCodes;\n(function (CharacterCodes) {\n CharacterCodes[CharacterCodes[\"lineFeed\"] = 10] = \"lineFeed\";\n CharacterCodes[CharacterCodes[\"carriageReturn\"] = 13] = \"carriageReturn\";\n CharacterCodes[CharacterCodes[\"space\"] = 32] = \"space\";\n CharacterCodes[CharacterCodes[\"_0\"] = 48] = \"_0\";\n CharacterCodes[CharacterCodes[\"_1\"] = 49] = \"_1\";\n CharacterCodes[CharacterCodes[\"_2\"] = 50] = \"_2\";\n CharacterCodes[CharacterCodes[\"_3\"] = 51] = \"_3\";\n CharacterCodes[CharacterCodes[\"_4\"] = 52] = \"_4\";\n CharacterCodes[CharacterCodes[\"_5\"] = 53] = \"_5\";\n CharacterCodes[CharacterCodes[\"_6\"] = 54] = \"_6\";\n CharacterCodes[CharacterCodes[\"_7\"] = 55] = \"_7\";\n CharacterCodes[CharacterCodes[\"_8\"] = 56] = \"_8\";\n CharacterCodes[CharacterCodes[\"_9\"] = 57] = \"_9\";\n CharacterCodes[CharacterCodes[\"a\"] = 97] = \"a\";\n CharacterCodes[CharacterCodes[\"b\"] = 98] = \"b\";\n CharacterCodes[CharacterCodes[\"c\"] = 99] = \"c\";\n CharacterCodes[CharacterCodes[\"d\"] = 100] = \"d\";\n CharacterCodes[CharacterCodes[\"e\"] = 101] = \"e\";\n CharacterCodes[CharacterCodes[\"f\"] = 102] = \"f\";\n CharacterCodes[CharacterCodes[\"g\"] = 103] = \"g\";\n CharacterCodes[CharacterCodes[\"h\"] = 104] = \"h\";\n CharacterCodes[CharacterCodes[\"i\"] = 105] = \"i\";\n CharacterCodes[CharacterCodes[\"j\"] = 106] = \"j\";\n CharacterCodes[CharacterCodes[\"k\"] = 107] = \"k\";\n CharacterCodes[CharacterCodes[\"l\"] = 108] = \"l\";\n CharacterCodes[CharacterCodes[\"m\"] = 109] = \"m\";\n CharacterCodes[CharacterCodes[\"n\"] = 110] = \"n\";\n CharacterCodes[CharacterCodes[\"o\"] = 111] = \"o\";\n CharacterCodes[CharacterCodes[\"p\"] = 112] = \"p\";\n CharacterCodes[CharacterCodes[\"q\"] = 113] = \"q\";\n CharacterCodes[CharacterCodes[\"r\"] = 114] = \"r\";\n CharacterCodes[CharacterCodes[\"s\"] = 115] = \"s\";\n CharacterCodes[CharacterCodes[\"t\"] = 116] = \"t\";\n CharacterCodes[CharacterCodes[\"u\"] = 117] = \"u\";\n CharacterCodes[CharacterCodes[\"v\"] = 118] = \"v\";\n CharacterCodes[CharacterCodes[\"w\"] = 119] = \"w\";\n CharacterCodes[CharacterCodes[\"x\"] = 120] = \"x\";\n CharacterCodes[CharacterCodes[\"y\"] = 121] = \"y\";\n CharacterCodes[CharacterCodes[\"z\"] = 122] = \"z\";\n CharacterCodes[CharacterCodes[\"A\"] = 65] = \"A\";\n CharacterCodes[CharacterCodes[\"B\"] = 66] = \"B\";\n CharacterCodes[CharacterCodes[\"C\"] = 67] = \"C\";\n CharacterCodes[CharacterCodes[\"D\"] = 68] = \"D\";\n CharacterCodes[CharacterCodes[\"E\"] = 69] = \"E\";\n CharacterCodes[CharacterCodes[\"F\"] = 70] = \"F\";\n CharacterCodes[CharacterCodes[\"G\"] = 71] = \"G\";\n CharacterCodes[CharacterCodes[\"H\"] = 72] = \"H\";\n CharacterCodes[CharacterCodes[\"I\"] = 73] = \"I\";\n CharacterCodes[CharacterCodes[\"J\"] = 74] = \"J\";\n CharacterCodes[CharacterCodes[\"K\"] = 75] = \"K\";\n CharacterCodes[CharacterCodes[\"L\"] = 76] = \"L\";\n CharacterCodes[CharacterCodes[\"M\"] = 77] = \"M\";\n CharacterCodes[CharacterCodes[\"N\"] = 78] = \"N\";\n CharacterCodes[CharacterCodes[\"O\"] = 79] = \"O\";\n CharacterCodes[CharacterCodes[\"P\"] = 80] = \"P\";\n CharacterCodes[CharacterCodes[\"Q\"] = 81] = \"Q\";\n CharacterCodes[CharacterCodes[\"R\"] = 82] = \"R\";\n CharacterCodes[CharacterCodes[\"S\"] = 83] = \"S\";\n CharacterCodes[CharacterCodes[\"T\"] = 84] = \"T\";\n CharacterCodes[CharacterCodes[\"U\"] = 85] = \"U\";\n CharacterCodes[CharacterCodes[\"V\"] = 86] = \"V\";\n CharacterCodes[CharacterCodes[\"W\"] = 87] = \"W\";\n CharacterCodes[CharacterCodes[\"X\"] = 88] = \"X\";\n CharacterCodes[CharacterCodes[\"Y\"] = 89] = \"Y\";\n CharacterCodes[CharacterCodes[\"Z\"] = 90] = \"Z\";\n CharacterCodes[CharacterCodes[\"asterisk\"] = 42] = \"asterisk\";\n CharacterCodes[CharacterCodes[\"backslash\"] = 92] = \"backslash\";\n CharacterCodes[CharacterCodes[\"closeBrace\"] = 125] = \"closeBrace\";\n CharacterCodes[CharacterCodes[\"closeBracket\"] = 93] = \"closeBracket\";\n CharacterCodes[CharacterCodes[\"colon\"] = 58] = \"colon\";\n CharacterCodes[CharacterCodes[\"comma\"] = 44] = \"comma\";\n CharacterCodes[CharacterCodes[\"dot\"] = 46] = \"dot\";\n CharacterCodes[CharacterCodes[\"doubleQuote\"] = 34] = \"doubleQuote\";\n CharacterCodes[CharacterCodes[\"minus\"] = 45] = \"minus\";\n CharacterCodes[CharacterCodes[\"openBrace\"] = 123] = \"openBrace\";\n CharacterCodes[CharacterCodes[\"openBracket\"] = 91] = \"openBracket\";\n CharacterCodes[CharacterCodes[\"plus\"] = 43] = \"plus\";\n CharacterCodes[CharacterCodes[\"slash\"] = 47] = \"slash\";\n CharacterCodes[CharacterCodes[\"formFeed\"] = 12] = \"formFeed\";\n CharacterCodes[CharacterCodes[\"tab\"] = 9] = \"tab\";\n})(CharacterCodes || (CharacterCodes = {}));\n","export const cachedSpaces = new Array(20).fill(0).map((_, index) => {\n return ' '.repeat(index);\n});\nconst maxCachedValues = 200;\nexport const cachedBreakLinesWithSpaces = {\n ' ': {\n '\\n': new Array(maxCachedValues).fill(0).map((_, index) => {\n return '\\n' + ' '.repeat(index);\n }),\n '\\r': new Array(maxCachedValues).fill(0).map((_, index) => {\n return '\\r' + ' '.repeat(index);\n }),\n '\\r\\n': new Array(maxCachedValues).fill(0).map((_, index) => {\n return '\\r\\n' + ' '.repeat(index);\n }),\n },\n '\\t': {\n '\\n': new Array(maxCachedValues).fill(0).map((_, index) => {\n return '\\n' + '\\t'.repeat(index);\n }),\n '\\r': new Array(maxCachedValues).fill(0).map((_, index) => {\n return '\\r' + '\\t'.repeat(index);\n }),\n '\\r\\n': new Array(maxCachedValues).fill(0).map((_, index) => {\n return '\\r\\n' + '\\t'.repeat(index);\n }),\n }\n};\nexport const supportedEols = ['\\n', '\\r', '\\r\\n'];\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport { createScanner } from './scanner';\nvar ParseOptions;\n(function (ParseOptions) {\n ParseOptions.DEFAULT = {\n allowTrailingComma: false\n };\n})(ParseOptions || (ParseOptions = {}));\n/**\n * For a given offset, evaluate the location in the JSON document. Each segment in the location path is either a property name or an array index.\n */\nexport function getLocation(text, position) {\n const segments = []; // strings or numbers\n const earlyReturnException = new Object();\n let previousNode = undefined;\n const previousNodeInst = {\n value: {},\n offset: 0,\n length: 0,\n type: 'object',\n parent: undefined\n };\n let isAtPropertyKey = false;\n function setPreviousNode(value, offset, length, type) {\n previousNodeInst.value = value;\n previousNodeInst.offset = offset;\n previousNodeInst.length = length;\n previousNodeInst.type = type;\n previousNodeInst.colonOffset = undefined;\n previousNode = previousNodeInst;\n }\n try {\n visit(text, {\n onObjectBegin: (offset, length) => {\n if (position <= offset) {\n throw earlyReturnException;\n }\n previousNode = undefined;\n isAtPropertyKey = position > offset;\n segments.push(''); // push a placeholder (will be replaced)\n },\n onObjectProperty: (name, offset, length) => {\n if (position < offset) {\n throw earlyReturnException;\n }\n setPreviousNode(name, offset, length, 'property');\n segments[segments.length - 1] = name;\n if (position <= offset + length) {\n throw earlyReturnException;\n }\n },\n onObjectEnd: (offset, length) => {\n if (position <= offset) {\n throw earlyReturnException;\n }\n previousNode = undefined;\n segments.pop();\n },\n onArrayBegin: (offset, length) => {\n if (position <= offset) {\n throw earlyReturnException;\n }\n previousNode = undefined;\n segments.push(0);\n },\n onArrayEnd: (offset, length) => {\n if (position <= offset) {\n throw earlyReturnException;\n }\n previousNode = undefined;\n segments.pop();\n },\n onLiteralValue: (value, offset, length) => {\n if (position < offset) {\n throw earlyReturnException;\n }\n setPreviousNode(value, offset, length, getNodeType(value));\n if (position <= offset + length) {\n throw earlyReturnException;\n }\n },\n onSeparator: (sep, offset, length) => {\n if (position <= offset) {\n throw earlyReturnException;\n }\n if (sep === ':' && previousNode && previousNode.type === 'property') {\n previousNode.colonOffset = offset;\n isAtPropertyKey = false;\n previousNode = undefined;\n }\n else if (sep === ',') {\n const last = segments[segments.length - 1];\n if (typeof last === 'number') {\n segments[segments.length - 1] = last + 1;\n }\n else {\n isAtPropertyKey = true;\n segments[segments.length - 1] = '';\n }\n previousNode = undefined;\n }\n }\n });\n }\n catch (e) {\n if (e !== earlyReturnException) {\n throw e;\n }\n }\n return {\n path: segments,\n previousNode,\n isAtPropertyKey,\n matches: (pattern) => {\n let k = 0;\n for (let i = 0; k < pattern.length && i < segments.length; i++) {\n if (pattern[k] === segments[i] || pattern[k] === '*') {\n k++;\n }\n else if (pattern[k] !== '**') {\n return false;\n }\n }\n return k === pattern.length;\n }\n };\n}\n/**\n * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.\n * Therefore always check the errors list to find out if the input was valid.\n */\nexport function parse(text, errors = [], options = ParseOptions.DEFAULT) {\n let currentProperty = null;\n let currentParent = [];\n const previousParents = [];\n function onValue(value) {\n if (Array.isArray(currentParent)) {\n currentParent.push(value);\n }\n else if (currentProperty !== null) {\n currentParent[currentProperty] = value;\n }\n }\n const visitor = {\n onObjectBegin: () => {\n const object = {};\n onValue(object);\n previousParents.push(currentParent);\n currentParent = object;\n currentProperty = null;\n },\n onObjectProperty: (name) => {\n currentProperty = name;\n },\n onObjectEnd: () => {\n currentParent = previousParents.pop();\n },\n onArrayBegin: () => {\n const array = [];\n onValue(array);\n previousParents.push(currentParent);\n currentParent = array;\n currentProperty = null;\n },\n onArrayEnd: () => {\n currentParent = previousParents.pop();\n },\n onLiteralValue: onValue,\n onError: (error, offset, length) => {\n errors.push({ error, offset, length });\n }\n };\n visit(text, visitor, options);\n return currentParent[0];\n}\n/**\n * Parses the given text and returns a tree representation the JSON content. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.\n */\nexport function parseTree(text, errors = [], options = ParseOptions.DEFAULT) {\n let currentParent = { type: 'array', offset: -1, length: -1, children: [], parent: undefined }; // artificial root\n function ensurePropertyComplete(endOffset) {\n if (currentParent.type === 'property') {\n currentParent.length = endOffset - currentParent.offset;\n currentParent = currentParent.parent;\n }\n }\n function onValue(valueNode) {\n currentParent.children.push(valueNode);\n return valueNode;\n }\n const visitor = {\n onObjectBegin: (offset) => {\n currentParent = onValue({ type: 'object', offset, length: -1, parent: currentParent, children: [] });\n },\n onObjectProperty: (name, offset, length) => {\n currentParent = onValue({ type: 'property', offset, length: -1, parent: currentParent, children: [] });\n currentParent.children.push({ type: 'string', value: name, offset, length, parent: currentParent });\n },\n onObjectEnd: (offset, length) => {\n ensurePropertyComplete(offset + length); // in case of a missing value for a property: make sure property is complete\n currentParent.length = offset + length - currentParent.offset;\n currentParent = currentParent.parent;\n ensurePropertyComplete(offset + length);\n },\n onArrayBegin: (offset, length) => {\n currentParent = onValue({ type: 'array', offset, length: -1, parent: currentParent, children: [] });\n },\n onArrayEnd: (offset, length) => {\n currentParent.length = offset + length - currentParent.offset;\n currentParent = currentParent.parent;\n ensurePropertyComplete(offset + length);\n },\n onLiteralValue: (value, offset, length) => {\n onValue({ type: getNodeType(value), offset, length, parent: currentParent, value });\n ensurePropertyComplete(offset + length);\n },\n onSeparator: (sep, offset, length) => {\n if (currentParent.type === 'property') {\n if (sep === ':') {\n currentParent.colonOffset = offset;\n }\n else if (sep === ',') {\n ensurePropertyComplete(offset);\n }\n }\n },\n onError: (error, offset, length) => {\n errors.push({ error, offset, length });\n }\n };\n visit(text, visitor, options);\n const result = currentParent.children[0];\n if (result) {\n delete result.parent;\n }\n return result;\n}\n/**\n * Finds the node at the given path in a JSON DOM.\n */\nexport function findNodeAtLocation(root, path) {\n if (!root) {\n return undefined;\n }\n let node = root;\n for (let segment of path) {\n if (typeof segment === 'string') {\n if (node.type !== 'object' || !Array.isArray(node.children)) {\n return undefined;\n }\n let found = false;\n for (const propertyNode of node.children) {\n if (Array.isArray(propertyNode.children) && propertyNode.children[0].value === segment && propertyNode.children.length === 2) {\n node = propertyNode.children[1];\n found = true;\n break;\n }\n }\n if (!found) {\n return undefined;\n }\n }\n else {\n const index = segment;\n if (node.type !== 'array' || index < 0 || !Array.isArray(node.children) || index >= node.children.length) {\n return undefined;\n }\n node = node.children[index];\n }\n }\n return node;\n}\n/**\n * Gets the JSON path of the given JSON DOM node\n */\nexport function getNodePath(node) {\n if (!node.parent || !node.parent.children) {\n return [];\n }\n const path = getNodePath(node.parent);\n if (node.parent.type === 'property') {\n const key = node.parent.children[0].value;\n path.push(key);\n }\n else if (node.parent.type === 'array') {\n const index = node.parent.children.indexOf(node);\n if (index !== -1) {\n path.push(index);\n }\n }\n return path;\n}\n/**\n * Evaluates the JavaScript object of the given JSON DOM node\n */\nexport function getNodeValue(node) {\n switch (node.type) {\n case 'array':\n return node.children.map(getNodeValue);\n case 'object':\n const obj = Object.create(null);\n for (let prop of node.children) {\n const valueNode = prop.children[1];\n if (valueNode) {\n obj[prop.children[0].value] = getNodeValue(valueNode);\n }\n }\n return obj;\n case 'null':\n case 'string':\n case 'number':\n case 'boolean':\n return node.value;\n default:\n return undefined;\n }\n}\nexport function contains(node, offset, includeRightBound = false) {\n return (offset >= node.offset && offset < (node.offset + node.length)) || includeRightBound && (offset === (node.offset + node.length));\n}\n/**\n * Finds the most inner node at the given offset. If includeRightBound is set, also finds nodes that end at the given offset.\n */\nexport function findNodeAtOffset(node, offset, includeRightBound = false) {\n if (contains(node, offset, includeRightBound)) {\n const children = node.children;\n if (Array.isArray(children)) {\n for (let i = 0; i < children.length && children[i].offset <= offset; i++) {\n const item = findNodeAtOffset(children[i], offset, includeRightBound);\n if (item) {\n return item;\n }\n }\n }\n return node;\n }\n return undefined;\n}\n/**\n * Parses the given text and invokes the visitor functions for each object, array and literal reached.\n */\nexport function visit(text, visitor, options = ParseOptions.DEFAULT) {\n const _scanner = createScanner(text, false);\n // Important: Only pass copies of this to visitor functions to prevent accidental modification, and\n // to not affect visitor functions which stored a reference to a previous JSONPath\n const _jsonPath = [];\n // Depth of onXXXBegin() callbacks suppressed. onXXXEnd() decrements this if it isn't 0 already.\n // Callbacks are only called when this value is 0.\n let suppressedCallbacks = 0;\n function toNoArgVisit(visitFunction) {\n return visitFunction ? () => suppressedCallbacks === 0 && visitFunction(_scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()) : () => true;\n }\n function toOneArgVisit(visitFunction) {\n return visitFunction ? (arg) => suppressedCallbacks === 0 && visitFunction(arg, _scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()) : () => true;\n }\n function toOneArgVisitWithPath(visitFunction) {\n return visitFunction ? (arg) => suppressedCallbacks === 0 && visitFunction(arg, _scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter(), () => _jsonPath.slice()) : () => true;\n }\n function toBeginVisit(visitFunction) {\n return visitFunction ?\n () => {\n if (suppressedCallbacks > 0) {\n suppressedCallbacks++;\n }\n else {\n let cbReturn = visitFunction(_scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter(), () => _jsonPath.slice());\n if (cbReturn === false) {\n suppressedCallbacks = 1;\n }\n }\n }\n : () => true;\n }\n function toEndVisit(visitFunction) {\n return visitFunction ?\n () => {\n if (suppressedCallbacks > 0) {\n suppressedCallbacks--;\n }\n if (suppressedCallbacks === 0) {\n visitFunction(_scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter());\n }\n }\n : () => true;\n }\n const onObjectBegin = toBeginVisit(visitor.onObjectBegin), onObjectProperty = toOneArgVisitWithPath(visitor.onObjectProperty), onObjectEnd = toEndVisit(visitor.onObjectEnd), onArrayBegin = toBeginVisit(visitor.onArrayBegin), onArrayEnd = toEndVisit(visitor.onArrayEnd), onLiteralValue = toOneArgVisitWithPath(visitor.onLiteralValue), onSeparator = toOneArgVisit(visitor.onSeparator), onComment = toNoArgVisit(visitor.onComment), onError = toOneArgVisit(visitor.onError);\n const disallowComments = options && options.disallowComments;\n const allowTrailingComma = options && options.allowTrailingComma;\n function scanNext() {\n while (true) {\n const token = _scanner.scan();\n switch (_scanner.getTokenError()) {\n case 4 /* ScanError.InvalidUnicode */:\n handleError(14 /* ParseErrorCode.InvalidUnicode */);\n break;\n case 5 /* ScanError.InvalidEscapeCharacter */:\n handleError(15 /* ParseErrorCode.InvalidEscapeCharacter */);\n break;\n case 3 /* ScanError.UnexpectedEndOfNumber */:\n handleError(13 /* ParseErrorCode.UnexpectedEndOfNumber */);\n break;\n case 1 /* ScanError.UnexpectedEndOfComment */:\n if (!disallowComments) {\n handleError(11 /* ParseErrorCode.UnexpectedEndOfComment */);\n }\n break;\n case 2 /* ScanError.UnexpectedEndOfString */:\n handleError(12 /* ParseErrorCode.UnexpectedEndOfString */);\n break;\n case 6 /* ScanError.InvalidCharacter */:\n handleError(16 /* ParseErrorCode.InvalidCharacter */);\n break;\n }\n switch (token) {\n case 12 /* SyntaxKind.LineCommentTrivia */:\n case 13 /* SyntaxKind.BlockCommentTrivia */:\n if (disallowComments) {\n handleError(10 /* ParseErrorCode.InvalidCommentToken */);\n }\n else {\n onComment();\n }\n break;\n case 16 /* SyntaxKind.Unknown */:\n handleError(1 /* ParseErrorCode.InvalidSymbol */);\n break;\n case 15 /* SyntaxKind.Trivia */:\n case 14 /* SyntaxKind.LineBreakTrivia */:\n break;\n default:\n return token;\n }\n }\n }\n function handleError(error, skipUntilAfter = [], skipUntil = []) {\n onError(error);\n if (skipUntilAfter.length + skipUntil.length > 0) {\n let token = _scanner.getToken();\n while (token !== 17 /* SyntaxKind.EOF */) {\n if (skipUntilAfter.indexOf(token) !== -1) {\n scanNext();\n break;\n }\n else if (skipUntil.indexOf(token) !== -1) {\n break;\n }\n token = scanNext();\n }\n }\n }\n function parseString(isValue) {\n const value = _scanner.getTokenValue();\n if (isValue) {\n onLiteralValue(value);\n }\n else {\n onObjectProperty(value);\n // add property name afterwards\n _jsonPath.push(value);\n }\n scanNext();\n return true;\n }\n function parseLiteral() {\n switch (_scanner.getToken()) {\n case 11 /* SyntaxKind.NumericLiteral */:\n const tokenValue = _scanner.getTokenValue();\n let value = Number(tokenValue);\n if (isNaN(value)) {\n handleError(2 /* ParseErrorCode.InvalidNumberFormat */);\n value = 0;\n }\n onLiteralValue(value);\n break;\n case 7 /* SyntaxKind.NullKeyword */:\n onLiteralValue(null);\n break;\n case 8 /* SyntaxKind.TrueKeyword */:\n onLiteralValue(true);\n break;\n case 9 /* SyntaxKind.FalseKeyword */:\n onLiteralValue(false);\n break;\n default:\n return false;\n }\n scanNext();\n return true;\n }\n function parseProperty() {\n if (_scanner.getToken() !== 10 /* SyntaxKind.StringLiteral */) {\n handleError(3 /* ParseErrorCode.PropertyNameExpected */, [], [2 /* SyntaxKind.CloseBraceToken */, 5 /* SyntaxKind.CommaToken */]);\n return false;\n }\n parseString(false);\n if (_scanner.getToken() === 6 /* SyntaxKind.ColonToken */) {\n onSeparator(':');\n scanNext(); // consume colon\n if (!parseValue()) {\n handleError(4 /* ParseErrorCode.ValueExpected */, [], [2 /* SyntaxKind.CloseBraceToken */, 5 /* SyntaxKind.CommaToken */]);\n }\n }\n else {\n handleError(5 /* ParseErrorCode.ColonExpected */, [], [2 /* SyntaxKind.CloseBraceToken */, 5 /* SyntaxKind.CommaToken */]);\n }\n _jsonPath.pop(); // remove processed property name\n return true;\n }\n function parseObject() {\n onObjectBegin();\n scanNext(); // consume open brace\n let needsComma = false;\n while (_scanner.getToken() !== 2 /* SyntaxKind.CloseBraceToken */ && _scanner.getToken() !== 17 /* SyntaxKind.EOF */) {\n if (_scanner.getToken() === 5 /* SyntaxKind.CommaToken */) {\n if (!needsComma) {\n handleError(4 /* ParseErrorCode.ValueExpected */, [], []);\n }\n onSeparator(',');\n scanNext(); // consume comma\n if (_scanner.getToken() === 2 /* SyntaxKind.CloseBraceToken */ && allowTrailingComma) {\n break;\n }\n }\n else if (needsComma) {\n handleError(6 /* ParseErrorCode.CommaExpected */, [], []);\n }\n if (!parseProperty()) {\n handleError(4 /* ParseErrorCode.ValueExpected */, [], [2 /* SyntaxKind.CloseBraceToken */, 5 /* SyntaxKind.CommaToken */]);\n }\n needsComma = true;\n }\n onObjectEnd();\n if (_scanner.getToken() !== 2 /* SyntaxKind.CloseBraceToken */) {\n handleError(7 /* ParseErrorCode.CloseBraceExpected */, [2 /* SyntaxKind.CloseBraceToken */], []);\n }\n else {\n scanNext(); // consume close brace\n }\n return true;\n }\n function parseArray() {\n onArrayBegin();\n scanNext(); // consume open bracket\n let isFirstElement = true;\n let needsComma = false;\n while (_scanner.getToken() !== 4 /* SyntaxKind.CloseBracketToken */ && _scanner.getToken() !== 17 /* SyntaxKind.EOF */) {\n if (_scanner.getToken() === 5 /* SyntaxKind.CommaToken */) {\n if (!needsComma) {\n handleError(4 /* ParseErrorCode.ValueExpected */, [], []);\n }\n onSeparator(',');\n scanNext(); // consume comma\n if (_scanner.getToken() === 4 /* SyntaxKind.CloseBracketToken */ && allowTrailingComma) {\n break;\n }\n }\n else if (needsComma) {\n handleError(6 /* ParseErrorCode.CommaExpected */, [], []);\n }\n if (isFirstElement) {\n _jsonPath.push(0);\n isFirstElement = false;\n }\n else {\n _jsonPath[_jsonPath.length - 1]++;\n }\n if (!parseValue()) {\n handleError(4 /* ParseErrorCode.ValueExpected */, [], [4 /* SyntaxKind.CloseBracketToken */, 5 /* SyntaxKind.CommaToken */]);\n }\n needsComma = true;\n }\n onArrayEnd();\n if (!isFirstElement) {\n _jsonPath.pop(); // remove array index\n }\n if (_scanner.getToken() !== 4 /* SyntaxKind.CloseBracketToken */) {\n handleError(8 /* ParseErrorCode.CloseBracketExpected */, [4 /* SyntaxKind.CloseBracketToken */], []);\n }\n else {\n scanNext(); // consume close bracket\n }\n return true;\n }\n function parseValue() {\n switch (_scanner.getToken()) {\n case 3 /* SyntaxKind.OpenBracketToken */:\n return parseArray();\n case 1 /* SyntaxKind.OpenBraceToken */:\n return parseObject();\n case 10 /* SyntaxKind.StringLiteral */:\n return parseString(true);\n default:\n return parseLiteral();\n }\n }\n scanNext();\n if (_scanner.getToken() === 17 /* SyntaxKind.EOF */) {\n if (options.allowEmptyContent) {\n return true;\n }\n handleError(4 /* ParseErrorCode.ValueExpected */, [], []);\n return false;\n }\n if (!parseValue()) {\n handleError(4 /* ParseErrorCode.ValueExpected */, [], []);\n return false;\n }\n if (_scanner.getToken() !== 17 /* SyntaxKind.EOF */) {\n handleError(9 /* ParseErrorCode.EndOfFileExpected */, [], []);\n }\n return true;\n}\n/**\n * Takes JSON with JavaScript-style comments and remove\n * them. Optionally replaces every none-newline character\n * of comments with a replaceCharacter\n */\nexport function stripComments(text, replaceCh) {\n let _scanner = createScanner(text), parts = [], kind, offset = 0, pos;\n do {\n pos = _scanner.getPosition();\n kind = _scanner.scan();\n switch (kind) {\n case 12 /* SyntaxKind.LineCommentTrivia */:\n case 13 /* SyntaxKind.BlockCommentTrivia */:\n case 17 /* SyntaxKind.EOF */:\n if (offset !== pos) {\n parts.push(text.substring(offset, pos));\n }\n if (replaceCh !== undefined) {\n parts.push(_scanner.getTokenValue().replace(/[^\\r\\n]/g, replaceCh));\n }\n offset = _scanner.getPosition();\n break;\n }\n } while (kind !== 17 /* SyntaxKind.EOF */);\n return parts.join('');\n}\nexport function getNodeType(value) {\n switch (typeof value) {\n case 'boolean': return 'boolean';\n case 'number': return 'number';\n case 'string': return 'string';\n case 'object': {\n if (!value) {\n return 'null';\n }\n else if (Array.isArray(value)) {\n return 'array';\n }\n return 'object';\n }\n default: return 'null';\n }\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport * as formatter from './impl/format';\nimport * as edit from './impl/edit';\nimport * as scanner from './impl/scanner';\nimport * as parser from './impl/parser';\n/**\n * Creates a JSON scanner on the given text.\n * If ignoreTrivia is set, whitespaces or comments are ignored.\n */\nexport const createScanner = scanner.createScanner;\nexport var ScanError;\n(function (ScanError) {\n ScanError[ScanError[\"None\"] = 0] = \"None\";\n ScanError[ScanError[\"UnexpectedEndOfComment\"] = 1] = \"UnexpectedEndOfComment\";\n ScanError[ScanError[\"UnexpectedEndOfString\"] = 2] = \"UnexpectedEndOfString\";\n ScanError[ScanError[\"UnexpectedEndOfNumber\"] = 3] = \"UnexpectedEndOfNumber\";\n ScanError[ScanError[\"InvalidUnicode\"] = 4] = \"InvalidUnicode\";\n ScanError[ScanError[\"InvalidEscapeCharacter\"] = 5] = \"InvalidEscapeCharacter\";\n ScanError[ScanError[\"InvalidCharacter\"] = 6] = \"InvalidCharacter\";\n})(ScanError || (ScanError = {}));\nexport var SyntaxKind;\n(function (SyntaxKind) {\n SyntaxKind[SyntaxKind[\"OpenBraceToken\"] = 1] = \"OpenBraceToken\";\n SyntaxKind[SyntaxKind[\"CloseBraceToken\"] = 2] = \"CloseBraceToken\";\n SyntaxKind[SyntaxKind[\"OpenBracketToken\"] = 3] = \"OpenBracketToken\";\n SyntaxKind[SyntaxKind[\"CloseBracketToken\"] = 4] = \"CloseBracketToken\";\n SyntaxKind[SyntaxKind[\"CommaToken\"] = 5] = \"CommaToken\";\n SyntaxKind[SyntaxKind[\"ColonToken\"] = 6] = \"ColonToken\";\n SyntaxKind[SyntaxKind[\"NullKeyword\"] = 7] = \"NullKeyword\";\n SyntaxKind[SyntaxKind[\"TrueKeyword\"] = 8] = \"TrueKeyword\";\n SyntaxKind[SyntaxKind[\"FalseKeyword\"] = 9] = \"FalseKeyword\";\n SyntaxKind[SyntaxKind[\"StringLiteral\"] = 10] = \"StringLiteral\";\n SyntaxKind[SyntaxKind[\"NumericLiteral\"] = 11] = \"NumericLiteral\";\n SyntaxKind[SyntaxKind[\"LineCommentTrivia\"] = 12] = \"LineCommentTrivia\";\n SyntaxKind[SyntaxKind[\"BlockCommentTrivia\"] = 13] = \"BlockCommentTrivia\";\n SyntaxKind[SyntaxKind[\"LineBreakTrivia\"] = 14] = \"LineBreakTrivia\";\n SyntaxKind[SyntaxKind[\"Trivia\"] = 15] = \"Trivia\";\n SyntaxKind[SyntaxKind[\"Unknown\"] = 16] = \"Unknown\";\n SyntaxKind[SyntaxKind[\"EOF\"] = 17] = \"EOF\";\n})(SyntaxKind || (SyntaxKind = {}));\n/**\n * For a given offset, evaluate the location in the JSON document. Each segment in the location path is either a property name or an array index.\n */\nexport const getLocation = parser.getLocation;\n/**\n * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.\n * Therefore, always check the errors list to find out if the input was valid.\n */\nexport const parse = parser.parse;\n/**\n * Parses the given text and returns a tree representation the JSON content. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.\n */\nexport const parseTree = parser.parseTree;\n/**\n * Finds the node at the given path in a JSON DOM.\n */\nexport const findNodeAtLocation = parser.findNodeAtLocation;\n/**\n * Finds the innermost node at the given offset. If includeRightBound is set, also finds nodes that end at the given offset.\n */\nexport const findNodeAtOffset = parser.findNodeAtOffset;\n/**\n * Gets the JSON path of the given JSON DOM node\n */\nexport const getNodePath = parser.getNodePath;\n/**\n * Evaluates the JavaScript object of the given JSON DOM node\n */\nexport const getNodeValue = parser.getNodeValue;\n/**\n * Parses the given text and invokes the visitor functions for each object, array and literal reached.\n */\nexport const visit = parser.visit;\n/**\n * Takes JSON with JavaScript-style comments and remove\n * them. Optionally replaces every none-newline character\n * of comments with a replaceCharacter\n */\nexport const stripComments = parser.stripComments;\nexport var ParseErrorCode;\n(function (ParseErrorCode) {\n ParseErrorCode[ParseErrorCode[\"InvalidSymbol\"] = 1] = \"InvalidSymbol\";\n ParseErrorCode[ParseErrorCode[\"InvalidNumberFormat\"] = 2] = \"InvalidNumberFormat\";\n ParseErrorCode[ParseErrorCode[\"PropertyNameExpected\"] = 3] = \"PropertyNameExpected\";\n ParseErrorCode[ParseErrorCode[\"ValueExpected\"] = 4] = \"ValueExpected\";\n ParseErrorCode[ParseErrorCode[\"ColonExpected\"] = 5] = \"ColonExpected\";\n ParseErrorCode[ParseErrorCode[\"CommaExpected\"] = 6] = \"CommaExpected\";\n ParseErrorCode[ParseErrorCode[\"CloseBraceExpected\"] = 7] = \"CloseBraceExpected\";\n ParseErrorCode[ParseErrorCode[\"CloseBracketExpected\"] = 8] = \"CloseBracketExpected\";\n ParseErrorCode[ParseErrorCode[\"EndOfFileExpected\"] = 9] = \"EndOfFileExpected\";\n ParseErrorCode[ParseErrorCode[\"InvalidCommentToken\"] = 10] = \"InvalidCommentToken\";\n ParseErrorCode[ParseErrorCode[\"UnexpectedEndOfComment\"] = 11] = \"UnexpectedEndOfComment\";\n ParseErrorCode[ParseErrorCode[\"UnexpectedEndOfString\"] = 12] = \"UnexpectedEndOfString\";\n ParseErrorCode[ParseErrorCode[\"UnexpectedEndOfNumber\"] = 13] = \"UnexpectedEndOfNumber\";\n ParseErrorCode[ParseErrorCode[\"InvalidUnicode\"] = 14] = \"InvalidUnicode\";\n ParseErrorCode[ParseErrorCode[\"InvalidEscapeCharacter\"] = 15] = \"InvalidEscapeCharacter\";\n ParseErrorCode[ParseErrorCode[\"InvalidCharacter\"] = 16] = \"InvalidCharacter\";\n})(ParseErrorCode || (ParseErrorCode = {}));\nexport function printParseErrorCode(code) {\n switch (code) {\n case 1 /* ParseErrorCode.InvalidSymbol */: return 'InvalidSymbol';\n case 2 /* ParseErrorCode.InvalidNumberFormat */: return 'InvalidNumberFormat';\n case 3 /* ParseErrorCode.PropertyNameExpected */: return 'PropertyNameExpected';\n case 4 /* ParseErrorCode.ValueExpected */: return 'ValueExpected';\n case 5 /* ParseErrorCode.ColonExpected */: return 'ColonExpected';\n case 6 /* ParseErrorCode.CommaExpected */: return 'CommaExpected';\n case 7 /* ParseErrorCode.CloseBraceExpected */: return 'CloseBraceExpected';\n case 8 /* ParseErrorCode.CloseBracketExpected */: return 'CloseBracketExpected';\n case 9 /* ParseErrorCode.EndOfFileExpected */: return 'EndOfFileExpected';\n case 10 /* ParseErrorCode.InvalidCommentToken */: return 'InvalidCommentToken';\n case 11 /* ParseErrorCode.UnexpectedEndOfComment */: return 'UnexpectedEndOfComment';\n case 12 /* ParseErrorCode.UnexpectedEndOfString */: return 'UnexpectedEndOfString';\n case 13 /* ParseErrorCode.UnexpectedEndOfNumber */: return 'UnexpectedEndOfNumber';\n case 14 /* ParseErrorCode.InvalidUnicode */: return 'InvalidUnicode';\n case 15 /* ParseErrorCode.InvalidEscapeCharacter */: return 'InvalidEscapeCharacter';\n case 16 /* ParseErrorCode.InvalidCharacter */: return 'InvalidCharacter';\n }\n return '<unknown ParseErrorCode>';\n}\n/**\n * Computes the edit operations needed to format a JSON document.\n *\n * @param documentText The input text\n * @param range The range to format or `undefined` to format the full content\n * @param options The formatting options\n * @returns The edit operations describing the formatting changes to the original document following the format described in {@linkcode EditResult}.\n * To apply the edit operations to the input, use {@linkcode applyEdits}.\n */\nexport function format(documentText, range, options) {\n return formatter.format(documentText, range, options);\n}\n/**\n * Computes the edit operations needed to modify a value in the JSON document.\n *\n * @param documentText The input text\n * @param path The path of the value to change. The path represents either to the document root, a property or an array item.\n * If the path points to an non-existing property or item, it will be created.\n * @param value The new value for the specified property or item. If the value is undefined,\n * the property or item will be removed.\n * @param options Options\n * @returns The edit operations describing the changes to the original document, following the format described in {@linkcode EditResult}.\n * To apply the edit operations to the input, use {@linkcode applyEdits}.\n */\nexport function modify(text, path, value, options) {\n return edit.setProperty(text, path, value, options);\n}\n/**\n * Applies edits to an input string.\n * @param text The input text\n * @param edits Edit operations following the format described in {@linkcode EditResult}.\n * @returns The text with the applied edits.\n * @throws An error if the edit operations are not well-formed as described in {@linkcode EditResult}.\n */\nexport function applyEdits(text, edits) {\n let sortedEdits = edits.slice(0).sort((a, b) => {\n const diff = a.offset - b.offset;\n if (diff === 0) {\n return a.length - b.length;\n }\n return diff;\n });\n let lastModifiedOffset = text.length;\n for (let i = sortedEdits.length - 1; i >= 0; i--) {\n let e = sortedEdits[i];\n if (e.offset + e.length <= lastModifiedOffset) {\n text = edit.applyEdit(text, e);\n }\n else {\n throw new Error('Overlapping edit');\n }\n lastModifiedOffset = e.offset;\n }\n return text;\n}\n","export const unsafeFilenameFixtures = Object.freeze([\n\t'',\n\t' ',\n\t'.',\n\t'..',\n\t' .',\n\t'. ',\n\t' ..',\n\t'.. ',\n\t'../',\n\t'../foo',\n\t'foo/../bar',\n\t'foo/bar',\n\t'foo\\\\bar',\n\t'foo\\0bar',\n]);\n\nexport default function isSafeFilename(filename) {\n\tif (typeof filename !== 'string') {\n\t\treturn false;\n\t}\n\n\tconst trimmed = filename.trim();\n\n\treturn trimmed !== ''\n\t\t&& trimmed !== '.'\n\t\t&& trimmed !== '..'\n\t\t&& !filename.includes('/')\n\t\t&& !filename.includes('\\\\')\n\t\t&& !filename.includes('\\0');\n}\n\nexport function assertSafeFilename(filename) {\n\tif (typeof filename !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\tif (!isSafeFilename(filename)) {\n\t\tthrow new Error(`Unsafe filename: ${JSON.stringify(filename)}`);\n\t}\n}\n","import path from 'node:path';\nimport os from 'node:os';\nimport process from 'node:process';\nimport {assertSafeFilename} from 'is-safe-filename';\n\nconst homedir = os.homedir();\nconst tmpdir = os.tmpdir();\nconst {env} = process;\n\nconst macos = name => {\n\tconst library = path.join(homedir, 'Library');\n\n\treturn {\n\t\tdata: path.join(library, 'Application Support', name),\n\t\tconfig: path.join(library, 'Preferences', name),\n\t\tcache: path.join(library, 'Caches', name),\n\t\tlog: path.join(library, 'Logs', name),\n\t\ttemp: path.join(tmpdir, name),\n\t};\n};\n\nconst windows = name => {\n\tconst appData = env.APPDATA || path.join(homedir, 'AppData', 'Roaming');\n\tconst localAppData = env.LOCALAPPDATA || path.join(homedir, 'AppData', 'Local');\n\n\treturn {\n\t\t// Data/config/cache/log are invented by me as Windows isn't opinionated about this\n\t\tdata: path.join(localAppData, name, 'Data'),\n\t\tconfig: path.join(appData, name, 'Config'),\n\t\tcache: path.join(localAppData, name, 'Cache'),\n\t\tlog: path.join(localAppData, name, 'Log'),\n\t\ttemp: path.join(tmpdir, name),\n\t};\n};\n\n// https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html\nconst linux = name => {\n\tconst username = path.basename(homedir);\n\n\treturn {\n\t\tdata: path.join(env.XDG_DATA_HOME || path.join(homedir, '.local', 'share'), name),\n\t\tconfig: path.join(env.XDG_CONFIG_HOME || path.join(homedir, '.config'), name),\n\t\tcache: path.join(env.XDG_CACHE_HOME || path.join(homedir, '.cache'), name),\n\t\t// https://wiki.debian.org/XDGBaseDirectorySpecification#state\n\t\tlog: path.join(env.XDG_STATE_HOME || path.join(homedir, '.local', 'state'), name),\n\t\ttemp: path.join(tmpdir, username, name),\n\t};\n};\n\nexport default function envPaths(name, {suffix = 'nodejs'} = {}) {\n\tassertSafeFilename(name);\n\n\tif (suffix) {\n\t\t// Add suffix to prevent possible conflict with native apps\n\t\tname += `-${suffix}`;\n\t}\n\n\tassertSafeFilename(name);\n\n\tif (process.platform === 'darwin') {\n\t\treturn macos(name);\n\t}\n\n\tif (process.platform === 'win32') {\n\t\treturn windows(name);\n\t}\n\n\treturn linux(name);\n}\n","import fs from \"node:fs\";\nimport envPaths from \"env-paths\";\nimport { logger } from \"./logger.js\";\n\n/**\n * System paths resolved for nanos-lint using cross-platform conventions\n * provided by env-paths (XDG on Linux, %LOCALAPPDATA%/%APPDATA% on Windows, ~/Library on macOS).\n */\nexport const systemPaths = envPaths(\"nanos-lint\", { suffix: \"\" });\n\n/**\n * Clears the nanos-lint cache directory.\n * Returns the path of the cleared cache directory, or null if it did not exist.\n */\nexport function cleanCache(targetDir: string = systemPaths.cache): string | null {\n if (fs.existsSync(targetDir)) {\n fs.rmSync(targetDir, { recursive: true });\n return targetDir;\n }\n return null;\n}\n\n/**\n * Recursively calculates total disk usage of a file or directory in bytes.\n * Handles missing paths and inaccessible files gracefully.\n */\nexport function getDirectorySize(targetPath: string): number {\n if (!fs.existsSync(targetPath)) {\n return 0;\n }\n let total = 0;\n try {\n const stat = fs.statSync(targetPath);\n if (!stat.isDirectory()) {\n return stat.size;\n }\n const entries = fs.readdirSync(targetPath, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = `${targetPath}/${entry.name}`;\n try {\n if (entry.isDirectory()) {\n total += getDirectorySize(fullPath);\n } else if (entry.isFile()) {\n total += fs.statSync(fullPath).size;\n }\n } catch (err) {\n logger.debug(\n `[paths] Failed to stat entry ${fullPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n } catch (err) {\n logger.debug(\n `[paths] Failed to calculate directory size for ${targetPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n return 0;\n }\n return total;\n}\n\n/**\n * Formats byte values into human-readable strings (e.g. \"86.4 MB\", \"1.42 MB\", \"42.5 MB\").\n */\nexport function formatBytes(bytes: number): string {\n if (bytes <= 0 || !Number.isFinite(bytes)) return \"0 B\";\n if (bytes < 1) return `${Math.round(bytes)} B`;\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n let i = Math.max(0, Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1));\n let val = bytes / Math.pow(1024, i);\n if (Math.round(val) >= 1024 && i < units.length - 1) {\n i++;\n val /= 1024;\n }\n const formatted =\n i === 0\n ? val.toFixed(0)\n : val < 10\n ? val.toFixed(2)\n : val < 100\n ? val.toFixed(1)\n : val.toFixed(0);\n return `${formatted} ${units[i]}`;\n}\n\nexport default systemPaths;\n","export class NanosLintError extends Error {\n public override readonly name: string = \"NanosLintError\";\n\n constructor(\n message: string,\n public readonly code: string,\n public readonly remedy?: string,\n options?: { cause?: unknown },\n ) {\n super(message, options);\n }\n}\n\nexport class ConfigError extends NanosLintError {\n public override readonly name: string = \"ConfigError\";\n}\n\nexport class LuaLSError extends NanosLintError {\n public override readonly name: string = \"LuaLSError\";\n}\n\nexport class AnnotationsError extends NanosLintError {\n public override readonly name: string = \"AnnotationsError\";\n}\n\nexport class CacheError extends NanosLintError {\n public override readonly name: string = \"CacheError\";\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parse, stripComments, type ParseError, printParseErrorCode } from \"jsonc-parser\";\nimport { systemPaths } from \"./paths.js\";\nimport { logger } from \"./logger.js\";\nimport type { LuaRCConfig } from \"./types.js\";\nimport { ConfigError } from \"./errors.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Finds the package root directory across both development (src/) and production (dist/) environments.\n */\nexport function getPackageRoot(): string {\n let current = __dirname;\n while (current !== path.dirname(current)) {\n if (fs.existsSync(path.join(current, \"package.json\"))) {\n return current;\n }\n current = path.dirname(current);\n }\n return path.resolve(__dirname, \"..\");\n}\n\n/** Resolves the default annotations path from environment variable, bundled file, or user cache. */\nexport function getDefaultAnnotationsPath(): string {\n // 1. Env variable\n const envPath = process.env.NANOS_ANNOTATIONS_PATH || process.env.NANOS_ANNOTATIONS;\n if (envPath && fs.existsSync(envPath)) {\n return path.resolve(envPath);\n }\n // 2. Bundled with package (release distribution)\n const bundled = path.join(getPackageRoot(), \"annotations.lua\");\n if (fs.existsSync(bundled)) {\n return bundled;\n }\n // 3. User cache\n return path.join(systemPaths.cache, \"annotations\", \"annotations.lua\");\n}\n\n/**\n * @deprecated Use getDefaultAnnotationsPath() instead.\n * Returns the directory containing the resolved annotations.lua file.\n */\nexport function getDefinitionsDir(): string {\n return path.dirname(getDefaultAnnotationsPath());\n}\n\n/** Resolves the absolute path to the default .luarc.json template shipped with the package. */\nexport function getDefaultTemplatePath(): string {\n const root = getPackageRoot();\n return path.join(root, \"templates\", \".luarc.json\");\n}\n\n/**\n * Strips single-line and multi-line comments from JSONC text using jsonc-parser.\n */\nexport function stripJsonComments(text: string): string {\n const cleanText = text.replace(/^\\uFEFF/, \"\");\n return stripComments(cleanText);\n}\n\n/** Parses JSONC text with support for comments and trailing commas. */\nexport function parseJsonc<T = unknown>(text: string): T {\n const cleanText = text.replace(/^\\uFEFF/, \"\");\n const errors: ParseError[] = [];\n const result = parse(cleanText, errors, { allowTrailingComma: true });\n if (errors.length > 0) {\n const errorDetails = errors\n .map((e) => `${printParseErrorCode(e.error)} at offset ${e.offset}`)\n .join(\", \");\n throw new SyntaxError(`Invalid JSONC: ${errorDetails}`);\n }\n return result as T;\n}\n\n/** Reads and parses a .luarc.json configuration file from disk. */\nexport function loadConfigFile(filePath: string): LuaRCConfig {\n if (!fs.existsSync(filePath)) {\n throw new ConfigError(\n `Configuration file not found: ${filePath}`,\n \"ERR_CONFIG_NOT_FOUND\",\n \"Ensure the configuration file path is correct or run 'nanos-lint init' to generate a default config.\",\n );\n }\n const content = fs.readFileSync(filePath, \"utf-8\");\n try {\n return parseJsonc<LuaRCConfig>(content);\n } catch (err) {\n if (err instanceof ConfigError) {\n throw err;\n }\n throw new ConfigError(\n `Failed to parse configuration file at ${filePath}: ${err instanceof Error ? err.message : String(err)}`,\n \"ERR_CONFIG_PARSE\",\n \"Check your .luarc.json syntax or run 'nanos-lint init --force' to scaffold a clean template.\",\n { cause: err },\n );\n }\n}\n\n/**\n * Removes trailing `/` characters from a path-like string.\n *\n * Implemented with a scan instead of a `\\/+$` regular expression: on inputs made\n * of many slashes that do not end in a slash, a backtracking engine retries the\n * repetition at every offset, which is quadratic in the input length\n * (CodeQL: js/polynomial-redos).\n */\nexport function stripTrailingSlashes(value: string): string {\n let end = value.length;\n while (end > 0 && value.charCodeAt(end - 1) === 0x2f /* \"/\" */) {\n end -= 1;\n }\n return end === value.length ? value : value.slice(0, end);\n}\n\nexport interface MergeConfigOptions {\n cliIgnore?: string[];\n dependencyLibraries?: string[];\n}\n\n/**\n * Set of recognized diagnostic codes supported by Lua Language Server (LuaLS).\n * LuaLS discards the entire `diagnostics.severity` object if it contains a single\n * unrecognized key (such as obsolete 'syntax-error'). nanos-lint filters severity\n * and neededFileStatus maps against this allow-list to ensure valid configuration.\n */\nexport const VALID_LUALS_DIAGNOSTIC_CODES: ReadonlySet<string> = new Set([\n \"ambiguity-1\",\n \"assign-type-mismatch\",\n \"await-in-sync\",\n \"cast-local-type\",\n \"cast-type-mismatch\",\n \"circle-doc-class\",\n \"close-non-object\",\n \"code-after-break\",\n \"codestyle-check\",\n \"count-down-loop\",\n \"deprecated\",\n \"different-requires\",\n \"discard-returns\",\n \"doc-field-no-class\",\n \"duplicate-doc-alias\",\n \"duplicate-doc-field\",\n \"duplicate-doc-param\",\n \"duplicate-index\",\n \"duplicate-set-field\",\n \"empty-block\",\n \"global-element\",\n \"global-in-nil-env\",\n \"incomplete-signature-doc\",\n \"inject-field\",\n \"invisible\",\n \"lowercase-global\",\n \"missing-fields\",\n \"missing-global-doc\",\n \"missing-local-export-doc\",\n \"missing-parameter\",\n \"missing-return\",\n \"missing-return-value\",\n \"name-style-check\",\n \"need-check-nil\",\n \"newfield-call\",\n \"newline-call\",\n \"no-unknown\",\n \"not-yieldable\",\n \"param-type-mismatch\",\n \"redefined-local\",\n \"redundant-parameter\",\n \"redundant-return\",\n \"redundant-return-value\",\n \"redundant-value\",\n \"return-type-mismatch\",\n \"spell-check\",\n \"trailing-space\",\n \"unbalanced-assignments\",\n \"undefined-doc-class\",\n \"undefined-doc-name\",\n \"undefined-doc-param\",\n \"undefined-env-child\",\n \"undefined-field\",\n \"undefined-global\",\n \"unknown-cast-variable\",\n \"unknown-diag-code\",\n \"unknown-operator\",\n \"unreachable-code\",\n \"unused-function\",\n \"unused-label\",\n \"unused-local\",\n \"unused-vararg\",\n]);\n\n/**\n * Merges a base nanos configuration with a workspace override configuration.\n * Guarantees that nanos API annotations are included in workspace.library,\n * and standardizes paths for LuaLS.\n *\n * @param base Base configuration template\n * @param override Workspace override configuration\n * @param definitionsPath Path to annotations.lua file or directory containing it\n * @param options Additional merge options\n */\nexport function mergeConfigs(\n base: LuaRCConfig,\n override: LuaRCConfig = {},\n definitionsPath: string = getDefaultAnnotationsPath(),\n options?: MergeConfigOptions,\n): LuaRCConfig {\n let resolvedPath = definitionsPath;\n if (fs.existsSync(definitionsPath)) {\n try {\n if (fs.statSync(definitionsPath).isDirectory()) {\n const candidate = path.join(definitionsPath, \"annotations.lua\");\n if (fs.existsSync(candidate)) {\n resolvedPath = candidate;\n }\n }\n } catch (err) {\n logger.debug(\n `Error checking annotations definitionsPath directory (${definitionsPath}): ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n const normalizedDefPath = resolvedPath.split(path.sep).join(\"/\");\n\n // Merge library paths\n const baseLibraries = base.workspace?.library ?? [];\n const overrideLibraries = override.workspace?.library ?? [];\n const depLibraries = (options?.dependencyLibraries ?? []).map((p) => p.replace(/\\\\/g, \"/\"));\n const librarySet = new Set<string>([\n normalizedDefPath,\n ...baseLibraries,\n ...overrideLibraries,\n ...depLibraries,\n ]);\n\n // Merge globals\n const baseGlobals = base.diagnostics?.globals ?? [];\n const overrideGlobals = override.diagnostics?.globals ?? [];\n const globalsSet = new Set<string>([...baseGlobals, ...overrideGlobals]);\n\n // Merge severities and filter out unknown keys to prevent LuaLS from voiding the table\n const rawSeverity = {\n ...(base.diagnostics?.severity ?? {}),\n ...(override.diagnostics?.severity ?? {}),\n };\n const mergedSeverity: Record<string, string> = {};\n for (const [code, level] of Object.entries(rawSeverity)) {\n if (VALID_LUALS_DIAGNOSTIC_CODES.has(code)) {\n mergedSeverity[code] = level;\n } else {\n logger.warn(\n `[config] Unrecognized diagnostic code \"${code}\" in diagnostics.severity was dropped to prevent LuaLS from discarding the severity configuration.`,\n );\n }\n }\n\n // Merge neededFileStatus and filter out unknown keys\n const rawNeededFileStatus = {\n ...(base.diagnostics?.neededFileStatus ?? {}),\n ...(override.diagnostics?.neededFileStatus ?? {}),\n };\n const mergedNeededFileStatus: Record<string, string> = {};\n for (const [code, status] of Object.entries(rawNeededFileStatus)) {\n if (VALID_LUALS_DIAGNOSTIC_CODES.has(code)) {\n mergedNeededFileStatus[code] = status;\n } else {\n logger.warn(\n `[config] Unrecognized diagnostic code \"${code}\" in diagnostics.neededFileStatus was dropped.`,\n );\n }\n }\n\n const hasCliIgnore = Boolean(options?.cliIgnore && options.cliIgnore.length > 0);\n\n let mergedIgnoreDir: string[];\n let mergedFilesExclude: string[];\n\n const baseFilesExclude = base.files?.exclude ?? [];\n const overrideFilesExclude = override.files?.exclude ?? [];\n\n const defaultIgnore = [\n \".git\",\n \".vscode\",\n \".nanos-lint\",\n \"node_modules\",\n \"dist\",\n \"bin\",\n \"vendor\",\n \"script\",\n \"meta\",\n \"locale\",\n \"log\",\n ];\n const baseIgnore = base.workspace?.ignoreDir ?? defaultIgnore;\n const overrideIgnore = override.workspace?.ignoreDir ?? [];\n\n if (hasCliIgnore) {\n const normalizedCliIgnore = (options?.cliIgnore ?? [])\n .map((p) => p.replace(/\\\\/g, \"/\").trim())\n .filter(Boolean);\n\n const excludePatterns = new Set<string>([...baseFilesExclude, ...overrideFilesExclude]);\n for (const pat of normalizedCliIgnore) {\n excludePatterns.add(pat);\n if (!pat.includes(\"*\") && !pat.includes(\"?\") && !pat.endsWith(\".lua\")) {\n const dirPat = stripTrailingSlashes(pat);\n excludePatterns.add(`${dirPat}/**`);\n }\n }\n mergedFilesExclude = Array.from(excludePatterns);\n\n // For workspace.ignoreDir, keep default structural exclusions plus any CLI ignore dirs\n const cliDirs = normalizedCliIgnore\n .filter((p) => !p.includes(\"*\") && !p.includes(\"?\") && !p.endsWith(\".lua\"))\n .map((p) => stripTrailingSlashes(p));\n mergedIgnoreDir = Array.from(\n new Set([...defaultIgnore, ...baseIgnore, ...overrideIgnore, ...cliDirs]),\n );\n } else {\n // Merge ignoreDir using default rules\n mergedIgnoreDir = Array.from(new Set([...defaultIgnore, ...baseIgnore, ...overrideIgnore]));\n mergedFilesExclude = Array.from(new Set([...baseFilesExclude, ...overrideFilesExclude]));\n }\n\n const merged: LuaRCConfig = {\n $schema: override.$schema ?? base.$schema,\n ...base,\n ...override,\n runtime: {\n version: \"Lua 5.4\",\n ...(base.runtime ?? {}),\n ...(override.runtime ?? {}),\n },\n workspace: {\n checkThirdParty: false,\n ...(base.workspace ?? {}),\n ...(override.workspace ?? {}),\n library: Array.from(librarySet),\n ignoreDir: mergedIgnoreDir,\n },\n files: {\n ...(base.files ?? {}),\n ...(override.files ?? {}),\n exclude: mergedFilesExclude,\n },\n diagnostics: {\n enable: true,\n ...(base.diagnostics ?? {}),\n ...(override.diagnostics ?? {}),\n globals: Array.from(globalsSet),\n severity: mergedSeverity,\n ...(Object.keys(mergedNeededFileStatus).length > 0\n ? { neededFileStatus: mergedNeededFileStatus }\n : {}),\n },\n };\n\n return merged;\n}\n\nexport interface ResolveWorkspaceConfigOptions {\n ignore?: string[];\n annotationsPath?: string;\n dependencyLibraries?: string[];\n unrequestedExclusions?: string[];\n}\n\n/**\n * Loads the user workspace configuration from `--config` or `<workspace>/.luarc.json`,\n * returning an empty object when neither exists. Parse failures are reported with the\n * offending path so a broken `.luarc.json` is never silently ignored.\n */\nexport function loadUserConfig(workspacePath: string, customConfigPath?: string): LuaRCConfig {\n if (customConfigPath) {\n return loadConfigFile(path.resolve(customConfigPath));\n }\n const candidate = path.join(workspacePath, \".luarc.json\");\n if (!fs.existsSync(candidate)) {\n return {};\n }\n try {\n return loadConfigFile(candidate);\n } catch (err) {\n throw new Error(\n `Failed to parse workspace configuration file (${candidate}): ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n );\n }\n}\n\n/** Writes a merged configuration to a unique temporary file and returns its path. */\nexport function writeTempConfig(config: LuaRCConfig): string {\n const tempDir = systemPaths.temp;\n fs.mkdirSync(tempDir, { recursive: true });\n const tempConfigFile = path.join(\n tempDir,\n `luarc-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.json`,\n );\n fs.writeFileSync(tempConfigFile, JSON.stringify(config, null, 2), \"utf-8\");\n return tempConfigFile;\n}\n\n/**\n * Discovers any existing workspace configuration and merges it with the nanos template,\n * returning a LuaLS-ready configuration object without writing anything to disk.\n */\nexport function buildWorkspaceConfig(\n workspacePath: string,\n customConfigPath?: string,\n options?: ResolveWorkspaceConfigOptions,\n): LuaRCConfig {\n const defaultTemplate = loadConfigFile(getDefaultTemplatePath());\n const activeAnnotationsPath = options?.annotationsPath || getDefaultAnnotationsPath();\n const userConfig = loadUserConfig(workspacePath, customConfigPath);\n\n const hasCliIgnore = Boolean(options?.ignore && options.ignore.length > 0);\n\n // When relative to workspacePath, expand patterns if they start with workspace prefix\n let cliIgnore = options?.ignore;\n if (hasCliIgnore && cliIgnore) {\n const normWs = stripTrailingSlashes(workspacePath.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\"));\n const expanded: string[] = [];\n for (const pat of cliIgnore) {\n expanded.push(pat);\n const normPat = pat.replace(/\\\\/g, \"/\");\n if (normWs && normWs !== \".\" && normPat.startsWith(`${normWs}/`)) {\n expanded.push(normPat.slice(normWs.length + 1));\n }\n }\n cliIgnore = expanded;\n }\n\n const merged = mergeConfigs(defaultTemplate, userConfig, activeAnnotationsPath, {\n cliIgnore,\n dependencyLibraries: options?.dependencyLibraries,\n });\n\n // Only apply hardcoded tool directory exclusions when CLI ignore was NOT provided\n if (!hasCliIgnore) {\n const resolvedTarget = path.resolve(workspacePath);\n const isToolDirectory =\n fs.existsSync(path.join(resolvedTarget, \"main.lua\")) &&\n (fs.existsSync(path.join(resolvedTarget, \"bin\", \"lua-language-server.exe\")) ||\n fs.existsSync(path.join(resolvedTarget, \"bin\", \"lua-language-server\")));\n\n if (isToolDirectory) {\n merged.files = merged.files ?? {};\n const existingExclude = merged.files.exclude ?? [];\n merged.files.exclude = [\n ...new Set([\n ...existingExclude,\n \"main.lua\",\n \"debugger.lua\",\n \"**/main.lua\",\n \"**/debugger.lua\",\n ]),\n ];\n }\n }\n\n if (options?.unrequestedExclusions && options.unrequestedExclusions.length > 0) {\n merged.files = merged.files ?? {};\n const existingExclude = merged.files.exclude ?? [];\n merged.files.exclude = [...new Set([...existingExclude, ...options.unrequestedExclusions])];\n }\n\n return merged;\n}\n\n/**\n * Builds the merged workspace configuration for a single standard LuaLS pass and writes\n * it to a temporary file (deleted by the caller after the run).\n */\nexport function resolveWorkspaceConfig(\n workspacePath: string,\n customConfigPath?: string,\n options?: ResolveWorkspaceConfigOptions,\n): { configPath: string; isTemp: boolean } {\n return {\n configPath: writeTempConfig(buildWorkspaceConfig(workspacePath, customConfigPath, options)),\n isTemp: true,\n };\n}\n\n/** A glob pattern (relative to the checked root) bound to an execution realm. */\nexport interface RealmMapping {\n pattern: string;\n realm: \"client\" | \"server\" | \"shared\";\n}\n\n/** Conventional nanos world package layout used when `nanos.realms` is omitted. */\nexport const DEFAULT_REALM_MAPPINGS: ReadonlyArray<RealmMapping> = [\n { pattern: \"Server/**\", realm: \"server\" },\n { pattern: \"Client/**\", realm: \"client\" },\n { pattern: \"Shared/**\", realm: \"shared\" },\n];\n\nexport interface ResolvedRealmMappings {\n /** `false` when the user explicitly disabled realms with `nanos.realms: {}`. */\n enabled: boolean;\n mappings: RealmMapping[];\n}\n\n/** Normalizes a realm identifier, mapping the `global` alias onto `shared`. */\nfunction normalizeRealmName(value: unknown): RealmMapping[\"realm\"] | null {\n if (value === \"server\" || value === \"client\") {\n return value;\n }\n if (value === \"shared\" || value === \"global\") {\n return \"shared\";\n }\n return null;\n}\n\n/**\n * Resolves the realm mappings declared in `nanos.realms`.\n *\n * - The key is omitted: the conventional `Server/**`, `Client/**`, `Shared/**` layout is\n * used, and realms only activate when those patterns actually match files (#15, #35).\n * - The key is `{}`: realms are disabled and a single standard pass runs.\n * - Otherwise the declared mapping replaces the defaults, and `global` is accepted as an\n * alias of `shared`. Unusable entries are dropped with a warning.\n */\nexport function resolveRealmMappings(userConfig: LuaRCConfig): ResolvedRealmMappings {\n const raw = userConfig.nanos?.realms;\n if (raw === undefined) {\n return { enabled: true, mappings: [...DEFAULT_REALM_MAPPINGS] };\n }\n if (raw === null || typeof raw !== \"object\" || Array.isArray(raw)) {\n logger.warn(\n \"[realms] Ignoring nanos.realms: expected an object mapping glob patterns to realm names.\",\n );\n return { enabled: true, mappings: [...DEFAULT_REALM_MAPPINGS] };\n }\n\n const mappings: RealmMapping[] = [];\n for (const [rawPattern, rawRealm] of Object.entries(raw as Record<string, unknown>)) {\n const realm = normalizeRealmName(rawRealm);\n if (!realm) {\n logger.warn(\n `[realms] Ignoring nanos.realms entry \"${rawPattern}\": \"${String(rawRealm)}\" is not one of server, client, shared or global.`,\n );\n continue;\n }\n const pattern =\n typeof rawPattern === \"string\"\n ? stripTrailingSlashes(rawPattern.trim().replace(/\\\\/g, \"/\"))\n : \"\";\n if (!pattern || pattern === \".\") {\n logger.warn(`[realms] Ignoring unusable nanos.realms pattern \"${rawPattern}\".`);\n continue;\n }\n mappings.push({ pattern, realm });\n }\n\n if (mappings.length === 0) {\n logger.warn(\"[realms] nanos.realms has no usable entries; realm passes are disabled.\");\n return { enabled: false, mappings: [] };\n }\n return { enabled: true, mappings };\n}\n\nexport interface InitWorkspaceOptions {\n /** Custom JSONC configuration used as the scaffold base. */\n templatePath?: string;\n force?: boolean;\n /** Definitions file vendored into `.nanos-lint/`; only meaningful together with `vendor`. */\n annotationsPath?: string;\n /** Copies `annotations.lua` into the workspace and pins it in `workspace.library`. */\n vendor?: boolean;\n}\n\n/**\n * Initializes a new .luarc.json in a workspace.\n */\nexport function initWorkspace(workspacePath: string, options?: InitWorkspaceOptions): string {\n const targetFile = path.join(workspacePath, \".luarc.json\");\n if (fs.existsSync(targetFile) && !options?.force) {\n throw new ConfigError(\n `.luarc.json already exists at ${targetFile}. Use --force to overwrite.`,\n \"ERR_CONFIG_EXISTS\",\n \"Pass --force to overwrite the existing .luarc.json file.\",\n );\n }\n\n if (options?.annotationsPath && !options.vendor) {\n throw new ConfigError(\n \"--annotations requires --vendor: nanos-lint init does not pin or vendor annotations.lua by default.\",\n \"ERR_ANNOTATIONS_WITHOUT_VENDOR\",\n \"Run 'nanos-lint init --vendor --annotations <path>' (or pass vendor: true), or omit the custom path to use the managed annotations cache.\",\n );\n }\n\n const template = loadConfigFile(path.resolve(options?.templatePath ?? getDefaultTemplatePath()));\n if (!template || typeof template !== \"object\" || Array.isArray(template)) {\n throw new ConfigError(\"Init template must contain a configuration object.\", \"ERR_CONFIG_PARSE\");\n }\n template.nanos ??= {};\n template.nanos.realms ??= Object.fromEntries(\n DEFAULT_REALM_MAPPINGS.map(({ pattern, realm }) => [pattern, realm]),\n );\n\n if (options?.vendor) {\n const sourceAnnotations = options.annotationsPath || getDefaultAnnotationsPath();\n\n if (!fs.existsSync(sourceAnnotations)) {\n throw new ConfigError(\n `Definitions file not found at ${sourceAnnotations}. Make sure annotations have been downloaded or pass a valid file with --annotations.`,\n \"ERR_ANNOTATIONS_NOT_FOUND\",\n \"Run 'nanos-lint warmup' to download annotations or provide --annotations <path>.\",\n );\n }\n\n const targetAnnotations = path.join(workspacePath, \".nanos-lint\", \"annotations.lua\");\n fs.mkdirSync(path.dirname(targetAnnotations), { recursive: true });\n fs.copyFileSync(sourceAnnotations, targetAnnotations);\n\n template.workspace = template.workspace ?? {};\n template.workspace.library = [\n ...new Set([...(template.workspace.library ?? []), \".nanos-lint/annotations.lua\"]),\n ];\n\n template.workspace.ignoreDir = [\n ...new Set([\".nanos-lint\", ...(template.workspace.ignoreDir ?? [])]),\n ];\n\n template.files = template.files ?? {};\n template.files.exclude = [...new Set([\".nanos-lint/**\", ...(template.files.exclude ?? [])])];\n }\n\n fs.writeFileSync(targetFile, JSON.stringify(template, null, 2), \"utf-8\");\n return targetFile;\n}\n","var Gt=(n,t,e)=>{let s=n instanceof RegExp?ce(n,e):n,i=t instanceof RegExp?ce(t,e):t,r=s!==null&&i!=null&&ss(s,i,e);return r&&{start:r[0],end:r[1],pre:e.slice(0,r[0]),body:e.slice(r[0]+s.length,r[1]),post:e.slice(r[1]+i.length)}},ce=(n,t)=>{let e=t.match(n);return e?e[0]:null},ss=(n,t,e)=>{let s,i,r,o,h,a=e.indexOf(n),l=e.indexOf(t,a+1),u=a;if(a>=0&&l>0){if(n===t)return[a,l];for(s=[],r=e.length;u>=0&&!h;){if(u===a)s.push(u),a=e.indexOf(n,u+1);else if(s.length===1){let c=s.pop();c!==void 0&&(h=[c,l])}else i=s.pop(),i!==void 0&&i<r&&(r=i,o=l),l=e.indexOf(t,u+1);u=a<l&&a>=0?a:l}s.length&&o!==void 0&&(h=[r,o])}return h};var fe=\"\\0SLASH\"+Math.random()+\"\\0\",ue=\"\\0OPEN\"+Math.random()+\"\\0\",qt=\"\\0CLOSE\"+Math.random()+\"\\0\",de=\"\\0COMMA\"+Math.random()+\"\\0\",pe=\"\\0PERIOD\"+Math.random()+\"\\0\",is=new RegExp(fe,\"g\"),rs=new RegExp(ue,\"g\"),ns=new RegExp(qt,\"g\"),os=new RegExp(de,\"g\"),hs=new RegExp(pe,\"g\"),as=/\\\\\\\\/g,ls=/\\\\{/g,cs=/\\\\}/g,fs=/\\\\,/g,us=/\\\\./g,ds=1e5;function Ht(n){return isNaN(n)?n.charCodeAt(0):parseInt(n,10)}function ps(n){return n.replace(as,fe).replace(ls,ue).replace(cs,qt).replace(fs,de).replace(us,pe)}function ms(n){return n.replace(is,\"\\\\\").replace(rs,\"{\").replace(ns,\"}\").replace(os,\",\").replace(hs,\".\")}function me(n){if(!n)return[\"\"];let t=[],e=Gt(\"{\",\"}\",n);if(!e)return n.split(\",\");let{pre:s,body:i,post:r}=e,o=s.split(\",\");o[o.length-1]+=\"{\"+i+\"}\";let h=me(r);return r.length&&(o[o.length-1]+=h.shift(),o.push.apply(o,h)),t.push.apply(t,o),t}function ge(n,t={}){if(!n)return[];let{max:e=ds}=t;return n.slice(0,2)===\"{}\"&&(n=\"\\\\{\\\\}\"+n.slice(2)),ht(ps(n),e,!0).map(ms)}function gs(n){return\"{\"+n+\"}\"}function ws(n){return/^-?0\\d/.test(n)}function ys(n,t){return n<=t}function bs(n,t){return n>=t}function ht(n,t,e){let s=[],i=Gt(\"{\",\"}\",n);if(!i)return[n];let r=i.pre,o=i.post.length?ht(i.post,t,!1):[\"\"];if(/\\$$/.test(i.pre))for(let h=0;h<o.length&&h<t;h++){let a=r+\"{\"+i.body+\"}\"+o[h];s.push(a)}else{let h=/^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(i.body),a=/^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(i.body),l=h||a,u=i.body.indexOf(\",\")>=0;if(!l&&!u)return i.post.match(/,(?!,).*\\}/)?(n=i.pre+\"{\"+i.body+qt+i.post,ht(n,t,!0)):[n];let c;if(l)c=i.body.split(/\\.\\./);else if(c=me(i.body),c.length===1&&c[0]!==void 0&&(c=ht(c[0],t,!1).map(gs),c.length===1))return o.map(f=>i.pre+c[0]+f);let d;if(l&&c[0]!==void 0&&c[1]!==void 0){let f=Ht(c[0]),m=Ht(c[1]),p=Math.max(c[0].length,c[1].length),w=c.length===3&&c[2]!==void 0?Math.abs(Ht(c[2])):1,g=ys;m<f&&(w*=-1,g=bs);let E=c.some(ws);d=[];for(let y=f;g(y,m);y+=w){let b;if(a)b=String.fromCharCode(y),b===\"\\\\\"&&(b=\"\");else if(b=String(y),E){let z=p-b.length;if(z>0){let $=new Array(z+1).join(\"0\");y<0?b=\"-\"+$+b.slice(1):b=$+b}}d.push(b)}}else{d=[];for(let f=0;f<c.length;f++)d.push.apply(d,ht(c[f],t,!1))}for(let f=0;f<d.length;f++)for(let m=0;m<o.length&&s.length<t;m++){let p=r+d[f]+o[m];(!e||l||p)&&s.push(p)}}return s}var at=n=>{if(typeof n!=\"string\")throw new TypeError(\"invalid pattern\");if(n.length>65536)throw new TypeError(\"pattern is too long\")};var Ss={\"[:alnum:]\":[\"\\\\p{L}\\\\p{Nl}\\\\p{Nd}\",!0],\"[:alpha:]\":[\"\\\\p{L}\\\\p{Nl}\",!0],\"[:ascii:]\":[\"\\\\x00-\\\\x7f\",!1],\"[:blank:]\":[\"\\\\p{Zs}\\\\t\",!0],\"[:cntrl:]\":[\"\\\\p{Cc}\",!0],\"[:digit:]\":[\"\\\\p{Nd}\",!0],\"[:graph:]\":[\"\\\\p{Z}\\\\p{C}\",!0,!0],\"[:lower:]\":[\"\\\\p{Ll}\",!0],\"[:print:]\":[\"\\\\p{C}\",!0],\"[:punct:]\":[\"\\\\p{P}\",!0],\"[:space:]\":[\"\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f\",!0],\"[:upper:]\":[\"\\\\p{Lu}\",!0],\"[:word:]\":[\"\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}\",!0],\"[:xdigit:]\":[\"A-Fa-f0-9\",!1]},lt=n=>n.replace(/[[\\]\\\\-]/g,\"\\\\$&\"),Es=n=>n.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g,\"\\\\$&\"),we=n=>n.join(\"\"),ye=(n,t)=>{let e=t;if(n.charAt(e)!==\"[\")throw new Error(\"not in a brace expression\");let s=[],i=[],r=e+1,o=!1,h=!1,a=!1,l=!1,u=e,c=\"\";t:for(;r<n.length;){let p=n.charAt(r);if((p===\"!\"||p===\"^\")&&r===e+1){l=!0,r++;continue}if(p===\"]\"&&o&&!a){u=r+1;break}if(o=!0,p===\"\\\\\"&&!a){a=!0,r++;continue}if(p===\"[\"&&!a){for(let[w,[g,S,E]]of Object.entries(Ss))if(n.startsWith(w,r)){if(c)return[\"$.\",!1,n.length-e,!0];r+=w.length,E?i.push(g):s.push(g),h=h||S;continue t}}if(a=!1,c){p>c?s.push(lt(c)+\"-\"+lt(p)):p===c&&s.push(lt(p)),c=\"\",r++;continue}if(n.startsWith(\"-]\",r+1)){s.push(lt(p+\"-\")),r+=2;continue}if(n.startsWith(\"-\",r+1)){c=p,r+=2;continue}s.push(lt(p)),r++}if(u<r)return[\"\",!1,0,!1];if(!s.length&&!i.length)return[\"$.\",!1,n.length-e,!0];if(i.length===0&&s.length===1&&/^\\\\?.$/.test(s[0])&&!l){let p=s[0].length===2?s[0].slice(-1):s[0];return[Es(p),!1,u-e,!1]}let d=\"[\"+(l?\"^\":\"\")+we(s)+\"]\",f=\"[\"+(l?\"\":\"^\")+we(i)+\"]\";return[s.length&&i.length?\"(\"+d+\"|\"+f+\")\":s.length?d:f,h,u-e,!0]};var W=(n,{windowsPathsNoEscape:t=!1,magicalBraces:e=!0}={})=>e?t?n.replace(/\\[([^\\/\\\\])\\]/g,\"$1\"):n.replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g,\"$1$2\").replace(/\\\\([^\\/])/g,\"$1\"):t?n.replace(/\\[([^\\/\\\\{}])\\]/g,\"$1\"):n.replace(/((?!\\\\).|^)\\[([^\\/\\\\{}])\\]/g,\"$1$2\").replace(/\\\\([^\\/{}])/g,\"$1\");var xs=new Set([\"!\",\"?\",\"+\",\"*\",\"@\"]),be=n=>xs.has(n),vs=\"(?!(?:^|/)\\\\.\\\\.?(?:$|/))\",Ct=\"(?!\\\\.)\",Cs=new Set([\"[\",\".\"]),Ts=new Set([\"..\",\".\"]),As=new Set(\"().*{}+?[]^$\\\\!\"),ks=n=>n.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g,\"\\\\$&\"),Kt=\"[^/]\",Se=Kt+\"*?\",Ee=Kt+\"+?\",Q=class n{type;#t;#s;#n=!1;#r=[];#o;#S;#w;#c=!1;#h;#u;#f=!1;constructor(t,e,s={}){this.type=t,t&&(this.#s=!0),this.#o=e,this.#t=this.#o?this.#o.#t:this,this.#h=this.#t===this?s:this.#t.#h,this.#w=this.#t===this?[]:this.#t.#w,t===\"!\"&&!this.#t.#c&&this.#w.push(this),this.#S=this.#o?this.#o.#r.length:0}get hasMagic(){if(this.#s!==void 0)return this.#s;for(let t of this.#r)if(typeof t!=\"string\"&&(t.type||t.hasMagic))return this.#s=!0;return this.#s}toString(){return this.#u!==void 0?this.#u:this.type?this.#u=this.type+\"(\"+this.#r.map(t=>String(t)).join(\"|\")+\")\":this.#u=this.#r.map(t=>String(t)).join(\"\")}#a(){if(this!==this.#t)throw new Error(\"should only call on root\");if(this.#c)return this;this.toString(),this.#c=!0;let t;for(;t=this.#w.pop();){if(t.type!==\"!\")continue;let e=t,s=e.#o;for(;s;){for(let i=e.#S+1;!s.type&&i<s.#r.length;i++)for(let r of t.#r){if(typeof r==\"string\")throw new Error(\"string part in extglob AST??\");r.copyIn(s.#r[i])}e=s,s=e.#o}}return this}push(...t){for(let e of t)if(e!==\"\"){if(typeof e!=\"string\"&&!(e instanceof n&&e.#o===this))throw new Error(\"invalid part: \"+e);this.#r.push(e)}}toJSON(){let t=this.type===null?this.#r.slice().map(e=>typeof e==\"string\"?e:e.toJSON()):[this.type,...this.#r.map(e=>e.toJSON())];return this.isStart()&&!this.type&&t.unshift([]),this.isEnd()&&(this===this.#t||this.#t.#c&&this.#o?.type===\"!\")&&t.push({}),t}isStart(){if(this.#t===this)return!0;if(!this.#o?.isStart())return!1;if(this.#S===0)return!0;let t=this.#o;for(let e=0;e<this.#S;e++){let s=t.#r[e];if(!(s instanceof n&&s.type===\"!\"))return!1}return!0}isEnd(){if(this.#t===this||this.#o?.type===\"!\")return!0;if(!this.#o?.isEnd())return!1;if(!this.type)return this.#o?.isEnd();let t=this.#o?this.#o.#r.length:0;return this.#S===t-1}copyIn(t){typeof t==\"string\"?this.push(t):this.push(t.clone(this))}clone(t){let e=new n(this.type,t);for(let s of this.#r)e.copyIn(s);return e}static#i(t,e,s,i){let r=!1,o=!1,h=-1,a=!1;if(e.type===null){let f=s,m=\"\";for(;f<t.length;){let p=t.charAt(f++);if(r||p===\"\\\\\"){r=!r,m+=p;continue}if(o){f===h+1?(p===\"^\"||p===\"!\")&&(a=!0):p===\"]\"&&!(f===h+2&&a)&&(o=!1),m+=p;continue}else if(p===\"[\"){o=!0,h=f,a=!1,m+=p;continue}if(!i.noext&&be(p)&&t.charAt(f)===\"(\"){e.push(m),m=\"\";let w=new n(p,e);f=n.#i(t,w,f,i),e.push(w);continue}m+=p}return e.push(m),f}let l=s+1,u=new n(null,e),c=[],d=\"\";for(;l<t.length;){let f=t.charAt(l++);if(r||f===\"\\\\\"){r=!r,d+=f;continue}if(o){l===h+1?(f===\"^\"||f===\"!\")&&(a=!0):f===\"]\"&&!(l===h+2&&a)&&(o=!1),d+=f;continue}else if(f===\"[\"){o=!0,h=l,a=!1,d+=f;continue}if(be(f)&&t.charAt(l)===\"(\"){u.push(d),d=\"\";let m=new n(f,u);u.push(m),l=n.#i(t,m,l,i);continue}if(f===\"|\"){u.push(d),d=\"\",c.push(u),u=new n(null,e);continue}if(f===\")\")return d===\"\"&&e.#r.length===0&&(e.#f=!0),u.push(d),d=\"\",e.push(...c,u),l;d+=f}return e.type=null,e.#s=void 0,e.#r=[t.substring(s-1)],l}static fromGlob(t,e={}){let s=new n(null,void 0,e);return n.#i(t,s,0,e),s}toMMPattern(){if(this!==this.#t)return this.#t.toMMPattern();let t=this.toString(),[e,s,i,r]=this.toRegExpSource();if(!(i||this.#s||this.#h.nocase&&!this.#h.nocaseMagicOnly&&t.toUpperCase()!==t.toLowerCase()))return s;let h=(this.#h.nocase?\"i\":\"\")+(r?\"u\":\"\");return Object.assign(new RegExp(`^${e}$`,h),{_src:e,_glob:t})}get options(){return this.#h}toRegExpSource(t){let e=t??!!this.#h.dot;if(this.#t===this&&this.#a(),!this.type){let a=this.isStart()&&this.isEnd()&&!this.#r.some(f=>typeof f!=\"string\"),l=this.#r.map(f=>{let[m,p,w,g]=typeof f==\"string\"?n.#E(f,this.#s,a):f.toRegExpSource(t);return this.#s=this.#s||w,this.#n=this.#n||g,m}).join(\"\"),u=\"\";if(this.isStart()&&typeof this.#r[0]==\"string\"&&!(this.#r.length===1&&Ts.has(this.#r[0]))){let m=Cs,p=e&&m.has(l.charAt(0))||l.startsWith(\"\\\\.\")&&m.has(l.charAt(2))||l.startsWith(\"\\\\.\\\\.\")&&m.has(l.charAt(4)),w=!e&&!t&&m.has(l.charAt(0));u=p?vs:w?Ct:\"\"}let c=\"\";return this.isEnd()&&this.#t.#c&&this.#o?.type===\"!\"&&(c=\"(?:$|\\\\/)\"),[u+l+c,W(l),this.#s=!!this.#s,this.#n]}let s=this.type===\"*\"||this.type===\"+\",i=this.type===\"!\"?\"(?:(?!(?:\":\"(?:\",r=this.#d(e);if(this.isStart()&&this.isEnd()&&!r&&this.type!==\"!\"){let a=this.toString();return this.#r=[a],this.type=null,this.#s=void 0,[a,W(this.toString()),!1,!1]}let o=!s||t||e||!Ct?\"\":this.#d(!0);o===r&&(o=\"\"),o&&(r=`(?:${r})(?:${o})*?`);let h=\"\";if(this.type===\"!\"&&this.#f)h=(this.isStart()&&!e?Ct:\"\")+Ee;else{let a=this.type===\"!\"?\"))\"+(this.isStart()&&!e&&!t?Ct:\"\")+Se+\")\":this.type===\"@\"?\")\":this.type===\"?\"?\")?\":this.type===\"+\"&&o?\")\":this.type===\"*\"&&o?\")?\":`)${this.type}`;h=i+r+a}return[h,W(r),this.#s=!!this.#s,this.#n]}#d(t){return this.#r.map(e=>{if(typeof e==\"string\")throw new Error(\"string type in extglob ast??\");let[s,i,r,o]=e.toRegExpSource(t);return this.#n=this.#n||o,s}).filter(e=>!(this.isStart()&&this.isEnd())||!!e).join(\"|\")}static#E(t,e,s=!1){let i=!1,r=\"\",o=!1,h=!1;for(let a=0;a<t.length;a++){let l=t.charAt(a);if(i){i=!1,r+=(As.has(l)?\"\\\\\":\"\")+l;continue}if(l===\"*\"){if(h)continue;h=!0,r+=s&&/^[*]+$/.test(t)?Ee:Se,e=!0;continue}else h=!1;if(l===\"\\\\\"){a===t.length-1?r+=\"\\\\\\\\\":i=!0;continue}if(l===\"[\"){let[u,c,d,f]=ye(t,a);if(d){r+=u,o=o||c,a+=d-1,e=e||f;continue}}if(l===\"?\"){r+=Kt,e=!0;continue}r+=ks(l)}return[r,W(t),!!e,o]}};var tt=(n,{windowsPathsNoEscape:t=!1,magicalBraces:e=!1}={})=>e?t?n.replace(/[?*()[\\]{}]/g,\"[$&]\"):n.replace(/[?*()[\\]\\\\{}]/g,\"\\\\$&\"):t?n.replace(/[?*()[\\]]/g,\"[$&]\"):n.replace(/[?*()[\\]\\\\]/g,\"\\\\$&\");var O=(n,t,e={})=>(at(t),!e.nocomment&&t.charAt(0)===\"#\"?!1:new D(t,e).match(n)),Rs=/^\\*+([^+@!?\\*\\[\\(]*)$/,Os=n=>t=>!t.startsWith(\".\")&&t.endsWith(n),Fs=n=>t=>t.endsWith(n),Ds=n=>(n=n.toLowerCase(),t=>!t.startsWith(\".\")&&t.toLowerCase().endsWith(n)),Ms=n=>(n=n.toLowerCase(),t=>t.toLowerCase().endsWith(n)),Ns=/^\\*+\\.\\*+$/,_s=n=>!n.startsWith(\".\")&&n.includes(\".\"),Ls=n=>n!==\".\"&&n!==\"..\"&&n.includes(\".\"),Ws=/^\\.\\*+$/,Ps=n=>n!==\".\"&&n!==\"..\"&&n.startsWith(\".\"),js=/^\\*+$/,Is=n=>n.length!==0&&!n.startsWith(\".\"),zs=n=>n.length!==0&&n!==\".\"&&n!==\"..\",Bs=/^\\?+([^+@!?\\*\\[\\(]*)?$/,Us=([n,t=\"\"])=>{let e=Ce([n]);return t?(t=t.toLowerCase(),s=>e(s)&&s.toLowerCase().endsWith(t)):e},$s=([n,t=\"\"])=>{let e=Te([n]);return t?(t=t.toLowerCase(),s=>e(s)&&s.toLowerCase().endsWith(t)):e},Gs=([n,t=\"\"])=>{let e=Te([n]);return t?s=>e(s)&&s.endsWith(t):e},Hs=([n,t=\"\"])=>{let e=Ce([n]);return t?s=>e(s)&&s.endsWith(t):e},Ce=([n])=>{let t=n.length;return e=>e.length===t&&!e.startsWith(\".\")},Te=([n])=>{let t=n.length;return e=>e.length===t&&e!==\".\"&&e!==\"..\"},Ae=typeof process==\"object\"&&process?typeof process.env==\"object\"&&process.env&&process.env.__MINIMATCH_TESTING_PLATFORM__||process.platform:\"posix\",xe={win32:{sep:\"\\\\\"},posix:{sep:\"/\"}},qs=Ae===\"win32\"?xe.win32.sep:xe.posix.sep;O.sep=qs;var A=Symbol(\"globstar **\");O.GLOBSTAR=A;var Ks=\"[^/]\",Vs=Ks+\"*?\",Ys=\"(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?\",Xs=\"(?:(?!(?:\\\\/|^)\\\\.).)*?\",Js=(n,t={})=>e=>O(e,n,t);O.filter=Js;var N=(n,t={})=>Object.assign({},n,t),Zs=n=>{if(!n||typeof n!=\"object\"||!Object.keys(n).length)return O;let t=O;return Object.assign((s,i,r={})=>t(s,i,N(n,r)),{Minimatch:class extends t.Minimatch{constructor(i,r={}){super(i,N(n,r))}static defaults(i){return t.defaults(N(n,i)).Minimatch}},AST:class extends t.AST{constructor(i,r,o={}){super(i,r,N(n,o))}static fromGlob(i,r={}){return t.AST.fromGlob(i,N(n,r))}},unescape:(s,i={})=>t.unescape(s,N(n,i)),escape:(s,i={})=>t.escape(s,N(n,i)),filter:(s,i={})=>t.filter(s,N(n,i)),defaults:s=>t.defaults(N(n,s)),makeRe:(s,i={})=>t.makeRe(s,N(n,i)),braceExpand:(s,i={})=>t.braceExpand(s,N(n,i)),match:(s,i,r={})=>t.match(s,i,N(n,r)),sep:t.sep,GLOBSTAR:A})};O.defaults=Zs;var ke=(n,t={})=>(at(n),t.nobrace||!/\\{(?:(?!\\{).)*\\}/.test(n)?[n]:ge(n,{max:t.braceExpandMax}));O.braceExpand=ke;var Qs=(n,t={})=>new D(n,t).makeRe();O.makeRe=Qs;var ti=(n,t,e={})=>{let s=new D(t,e);return n=n.filter(i=>s.match(i)),s.options.nonull&&!n.length&&n.push(t),n};O.match=ti;var ve=/[?*]|[+@!]\\(.*?\\)|\\[|\\]/,ei=n=>n.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g,\"\\\\$&\"),D=class{options;set;pattern;windowsPathsNoEscape;nonegate;negate;comment;empty;preserveMultipleSlashes;partial;globSet;globParts;nocase;isWindows;platform;windowsNoMagicRoot;regexp;constructor(t,e={}){at(t),e=e||{},this.options=e,this.pattern=t,this.platform=e.platform||Ae,this.isWindows=this.platform===\"win32\";let s=\"allowWindowsEscape\";this.windowsPathsNoEscape=!!e.windowsPathsNoEscape||e[s]===!1,this.windowsPathsNoEscape&&(this.pattern=this.pattern.replace(/\\\\/g,\"/\")),this.preserveMultipleSlashes=!!e.preserveMultipleSlashes,this.regexp=null,this.negate=!1,this.nonegate=!!e.nonegate,this.comment=!1,this.empty=!1,this.partial=!!e.partial,this.nocase=!!this.options.nocase,this.windowsNoMagicRoot=e.windowsNoMagicRoot!==void 0?e.windowsNoMagicRoot:!!(this.isWindows&&this.nocase),this.globSet=[],this.globParts=[],this.set=[],this.make()}hasMagic(){if(this.options.magicalBraces&&this.set.length>1)return!0;for(let t of this.set)for(let e of t)if(typeof e!=\"string\")return!0;return!1}debug(...t){}make(){let t=this.pattern,e=this.options;if(!e.nocomment&&t.charAt(0)===\"#\"){this.comment=!0;return}if(!t){this.empty=!0;return}this.parseNegate(),this.globSet=[...new Set(this.braceExpand())],e.debug&&(this.debug=(...r)=>console.error(...r)),this.debug(this.pattern,this.globSet);let s=this.globSet.map(r=>this.slashSplit(r));this.globParts=this.preprocess(s),this.debug(this.pattern,this.globParts);let i=this.globParts.map((r,o,h)=>{if(this.isWindows&&this.windowsNoMagicRoot){let a=r[0]===\"\"&&r[1]===\"\"&&(r[2]===\"?\"||!ve.test(r[2]))&&!ve.test(r[3]),l=/^[a-z]:/i.test(r[0]);if(a)return[...r.slice(0,4),...r.slice(4).map(u=>this.parse(u))];if(l)return[r[0],...r.slice(1).map(u=>this.parse(u))]}return r.map(a=>this.parse(a))});if(this.debug(this.pattern,i),this.set=i.filter(r=>r.indexOf(!1)===-1),this.isWindows)for(let r=0;r<this.set.length;r++){let o=this.set[r];o[0]===\"\"&&o[1]===\"\"&&this.globParts[r][2]===\"?\"&&typeof o[3]==\"string\"&&/^[a-z]:$/i.test(o[3])&&(o[2]=\"?\")}this.debug(this.pattern,this.set)}preprocess(t){if(this.options.noglobstar)for(let s=0;s<t.length;s++)for(let i=0;i<t[s].length;i++)t[s][i]===\"**\"&&(t[s][i]=\"*\");let{optimizationLevel:e=1}=this.options;return e>=2?(t=this.firstPhasePreProcess(t),t=this.secondPhasePreProcess(t)):e>=1?t=this.levelOneOptimize(t):t=this.adjascentGlobstarOptimize(t),t}adjascentGlobstarOptimize(t){return t.map(e=>{let s=-1;for(;(s=e.indexOf(\"**\",s+1))!==-1;){let i=s;for(;e[i+1]===\"**\";)i++;i!==s&&e.splice(s,i-s)}return e})}levelOneOptimize(t){return t.map(e=>(e=e.reduce((s,i)=>{let r=s[s.length-1];return i===\"**\"&&r===\"**\"?s:i===\"..\"&&r&&r!==\"..\"&&r!==\".\"&&r!==\"**\"?(s.pop(),s):(s.push(i),s)},[]),e.length===0?[\"\"]:e))}levelTwoFileOptimize(t){Array.isArray(t)||(t=this.slashSplit(t));let e=!1;do{if(e=!1,!this.preserveMultipleSlashes){for(let i=1;i<t.length-1;i++){let r=t[i];i===1&&r===\"\"&&t[0]===\"\"||(r===\".\"||r===\"\")&&(e=!0,t.splice(i,1),i--)}t[0]===\".\"&&t.length===2&&(t[1]===\".\"||t[1]===\"\")&&(e=!0,t.pop())}let s=0;for(;(s=t.indexOf(\"..\",s+1))!==-1;){let i=t[s-1];i&&i!==\".\"&&i!==\"..\"&&i!==\"**\"&&(e=!0,t.splice(s-1,2),s-=2)}}while(e);return t.length===0?[\"\"]:t}firstPhasePreProcess(t){let e=!1;do{e=!1;for(let s of t){let i=-1;for(;(i=s.indexOf(\"**\",i+1))!==-1;){let o=i;for(;s[o+1]===\"**\";)o++;o>i&&s.splice(i+1,o-i);let h=s[i+1],a=s[i+2],l=s[i+3];if(h!==\"..\"||!a||a===\".\"||a===\"..\"||!l||l===\".\"||l===\"..\")continue;e=!0,s.splice(i,1);let u=s.slice(0);u[i]=\"**\",t.push(u),i--}if(!this.preserveMultipleSlashes){for(let o=1;o<s.length-1;o++){let h=s[o];o===1&&h===\"\"&&s[0]===\"\"||(h===\".\"||h===\"\")&&(e=!0,s.splice(o,1),o--)}s[0]===\".\"&&s.length===2&&(s[1]===\".\"||s[1]===\"\")&&(e=!0,s.pop())}let r=0;for(;(r=s.indexOf(\"..\",r+1))!==-1;){let o=s[r-1];if(o&&o!==\".\"&&o!==\"..\"&&o!==\"**\"){e=!0;let a=r===1&&s[r+1]===\"**\"?[\".\"]:[];s.splice(r-1,2,...a),s.length===0&&s.push(\"\"),r-=2}}}}while(e);return t}secondPhasePreProcess(t){for(let e=0;e<t.length-1;e++)for(let s=e+1;s<t.length;s++){let i=this.partsMatch(t[e],t[s],!this.preserveMultipleSlashes);if(i){t[e]=[],t[s]=i;break}}return t.filter(e=>e.length)}partsMatch(t,e,s=!1){let i=0,r=0,o=[],h=\"\";for(;i<t.length&&r<e.length;)if(t[i]===e[r])o.push(h===\"b\"?e[r]:t[i]),i++,r++;else if(s&&t[i]===\"**\"&&e[r]===t[i+1])o.push(t[i]),i++;else if(s&&e[r]===\"**\"&&t[i]===e[r+1])o.push(e[r]),r++;else if(t[i]===\"*\"&&e[r]&&(this.options.dot||!e[r].startsWith(\".\"))&&e[r]!==\"**\"){if(h===\"b\")return!1;h=\"a\",o.push(t[i]),i++,r++}else if(e[r]===\"*\"&&t[i]&&(this.options.dot||!t[i].startsWith(\".\"))&&t[i]!==\"**\"){if(h===\"a\")return!1;h=\"b\",o.push(e[r]),i++,r++}else return!1;return t.length===e.length&&o}parseNegate(){if(this.nonegate)return;let t=this.pattern,e=!1,s=0;for(let i=0;i<t.length&&t.charAt(i)===\"!\";i++)e=!e,s++;s&&(this.pattern=t.slice(s)),this.negate=e}matchOne(t,e,s=!1){let i=this.options;if(this.isWindows){let p=typeof t[0]==\"string\"&&/^[a-z]:$/i.test(t[0]),w=!p&&t[0]===\"\"&&t[1]===\"\"&&t[2]===\"?\"&&/^[a-z]:$/i.test(t[3]),g=typeof e[0]==\"string\"&&/^[a-z]:$/i.test(e[0]),S=!g&&e[0]===\"\"&&e[1]===\"\"&&e[2]===\"?\"&&typeof e[3]==\"string\"&&/^[a-z]:$/i.test(e[3]),E=w?3:p?0:void 0,y=S?3:g?0:void 0;if(typeof E==\"number\"&&typeof y==\"number\"){let[b,z]=[t[E],e[y]];b.toLowerCase()===z.toLowerCase()&&(e[y]=b,y>E?e=e.slice(y):E>y&&(t=t.slice(E)))}}let{optimizationLevel:r=1}=this.options;r>=2&&(t=this.levelTwoFileOptimize(t)),this.debug(\"matchOne\",this,{file:t,pattern:e}),this.debug(\"matchOne\",t.length,e.length);for(var o=0,h=0,a=t.length,l=e.length;o<a&&h<l;o++,h++){this.debug(\"matchOne loop\");var u=e[h],c=t[o];if(this.debug(e,u,c),u===!1)return!1;if(u===A){this.debug(\"GLOBSTAR\",[e,u,c]);var d=o,f=h+1;if(f===l){for(this.debug(\"** at the end\");o<a;o++)if(t[o]===\".\"||t[o]===\"..\"||!i.dot&&t[o].charAt(0)===\".\")return!1;return!0}for(;d<a;){var m=t[d];if(this.debug(`\nglobstar while`,t,d,e,f,m),this.matchOne(t.slice(d),e.slice(f),s))return this.debug(\"globstar found match!\",d,a,m),!0;if(m===\".\"||m===\"..\"||!i.dot&&m.charAt(0)===\".\"){this.debug(\"dot detected!\",t,d,e,f);break}this.debug(\"globstar swallow a segment, and continue\"),d++}return!!(s&&(this.debug(`\n>>> no match, partial?`,t,d,e,f),d===a))}let p;if(typeof u==\"string\"?(p=c===u,this.debug(\"string match\",u,c,p)):(p=u.test(c),this.debug(\"pattern match\",u,c,p)),!p)return!1}if(o===a&&h===l)return!0;if(o===a)return s;if(h===l)return o===a-1&&t[o]===\"\";throw new Error(\"wtf?\")}braceExpand(){return ke(this.pattern,this.options)}parse(t){at(t);let e=this.options;if(t===\"**\")return A;if(t===\"\")return\"\";let s,i=null;(s=t.match(js))?i=e.dot?zs:Is:(s=t.match(Rs))?i=(e.nocase?e.dot?Ms:Ds:e.dot?Fs:Os)(s[1]):(s=t.match(Bs))?i=(e.nocase?e.dot?$s:Us:e.dot?Gs:Hs)(s):(s=t.match(Ns))?i=e.dot?Ls:_s:(s=t.match(Ws))&&(i=Ps);let r=Q.fromGlob(t,this.options).toMMPattern();return i&&typeof r==\"object\"&&Reflect.defineProperty(r,\"test\",{value:i}),r}makeRe(){if(this.regexp||this.regexp===!1)return this.regexp;let t=this.set;if(!t.length)return this.regexp=!1,this.regexp;let e=this.options,s=e.noglobstar?Vs:e.dot?Ys:Xs,i=new Set(e.nocase?[\"i\"]:[]),r=t.map(a=>{let l=a.map(c=>{if(c instanceof RegExp)for(let d of c.flags.split(\"\"))i.add(d);return typeof c==\"string\"?ei(c):c===A?A:c._src});l.forEach((c,d)=>{let f=l[d+1],m=l[d-1];c!==A||m===A||(m===void 0?f!==void 0&&f!==A?l[d+1]=\"(?:\\\\/|\"+s+\"\\\\/)?\"+f:l[d]=s:f===void 0?l[d-1]=m+\"(?:\\\\/|\\\\/\"+s+\")?\":f!==A&&(l[d-1]=m+\"(?:\\\\/|\\\\/\"+s+\"\\\\/)\"+f,l[d+1]=A))});let u=l.filter(c=>c!==A);if(this.partial&&u.length>=1){let c=[];for(let d=1;d<=u.length;d++)c.push(u.slice(0,d).join(\"/\"));return\"(?:\"+c.join(\"|\")+\")\"}return u.join(\"/\")}).join(\"|\"),[o,h]=t.length>1?[\"(?:\",\")\"]:[\"\",\"\"];r=\"^\"+o+r+h+\"$\",this.partial&&(r=\"^(?:\\\\/|\"+o+r.slice(1,-1)+h+\")$\"),this.negate&&(r=\"^(?!\"+r+\").+$\");try{this.regexp=new RegExp(r,[...i].join(\"\"))}catch{this.regexp=!1}return this.regexp}slashSplit(t){return this.preserveMultipleSlashes?t.split(\"/\"):this.isWindows&&/^\\/\\/[^\\/]+/.test(t)?[\"\",...t.split(/\\/+/)]:t.split(/\\/+/)}match(t,e=this.partial){if(this.debug(\"match\",t,this.pattern),this.comment)return!1;if(this.empty)return t===\"\";if(t===\"/\"&&e)return!0;let s=this.options;this.isWindows&&(t=t.split(\"\\\\\").join(\"/\"));let i=this.slashSplit(t);this.debug(this.pattern,\"split\",i);let r=this.set;this.debug(this.pattern,\"set\",r);let o=i[i.length-1];if(!o)for(let h=i.length-2;!o&&h>=0;h--)o=i[h];for(let h=0;h<r.length;h++){let a=r[h],l=i;if(s.matchBase&&a.length===1&&(l=[o]),this.matchOne(l,a,e))return s.flipNegate?!0:!this.negate}return s.flipNegate?!1:this.negate}static defaults(t){return O.defaults(t).Minimatch}};O.AST=Q;O.Minimatch=D;O.escape=tt;O.unescape=W;import{fileURLToPath as Wi}from\"node:url\";var si=typeof performance==\"object\"&&performance&&typeof performance.now==\"function\"?performance:Date,Oe=new Set,Vt=typeof process==\"object\"&&process?process:{},Fe=(n,t,e,s)=>{typeof Vt.emitWarning==\"function\"?Vt.emitWarning(n,t,e,s):console.error(`[${e}] ${t}: ${n}`)},At=globalThis.AbortController,Re=globalThis.AbortSignal;if(typeof At>\"u\"){Re=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(e,s){this._onabort.push(s)}},At=class{constructor(){t()}signal=new Re;abort(e){if(!this.signal.aborted){this.signal.reason=e,this.signal.aborted=!0;for(let s of this.signal._onabort)s(e);this.signal.onabort?.(e)}}};let n=Vt.env?.LRU_CACHE_IGNORE_AC_WARNING!==\"1\",t=()=>{n&&(n=!1,Fe(\"AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.\",\"NO_ABORT_CONTROLLER\",\"ENOTSUP\",t))}}var ii=n=>!Oe.has(n);var q=n=>n&&n===Math.floor(n)&&n>0&&isFinite(n),De=n=>q(n)?n<=Math.pow(2,8)?Uint8Array:n<=Math.pow(2,16)?Uint16Array:n<=Math.pow(2,32)?Uint32Array:n<=Number.MAX_SAFE_INTEGER?Tt:null:null,Tt=class extends Array{constructor(n){super(n),this.fill(0)}},ri=class ct{heap;length;static#t=!1;static create(t){let e=De(t);if(!e)return[];ct.#t=!0;let s=new ct(t,e);return ct.#t=!1,s}constructor(t,e){if(!ct.#t)throw new TypeError(\"instantiate Stack using Stack.create(n)\");this.heap=new e(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},ft=class Me{#t;#s;#n;#r;#o;#S;#w;#c;get perf(){return this.#c}ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#h;#u;#f;#a;#i;#d;#E;#b;#p;#R;#m;#C;#T;#g;#y;#x;#A;#e;#_;static unsafeExposeInternals(t){return{starts:t.#T,ttls:t.#g,autopurgeTimers:t.#y,sizes:t.#C,keyMap:t.#f,keyList:t.#a,valList:t.#i,next:t.#d,prev:t.#E,get head(){return t.#b},get tail(){return t.#p},free:t.#R,isBackgroundFetch:e=>t.#l(e),backgroundFetch:(e,s,i,r)=>t.#U(e,s,i,r),moveToTail:e=>t.#W(e),indexes:e=>t.#F(e),rindexes:e=>t.#D(e),isStale:e=>t.#v(e)}}get max(){return this.#t}get maxSize(){return this.#s}get calculatedSize(){return this.#u}get size(){return this.#h}get fetchMethod(){return this.#S}get memoMethod(){return this.#w}get dispose(){return this.#n}get onInsert(){return this.#r}get disposeAfter(){return this.#o}constructor(t){let{max:e=0,ttl:s,ttlResolution:i=1,ttlAutopurge:r,updateAgeOnGet:o,updateAgeOnHas:h,allowStale:a,dispose:l,onInsert:u,disposeAfter:c,noDisposeOnSet:d,noUpdateTTL:f,maxSize:m=0,maxEntrySize:p=0,sizeCalculation:w,fetchMethod:g,memoMethod:S,noDeleteOnFetchRejection:E,noDeleteOnStaleGet:y,allowStaleOnFetchRejection:b,allowStaleOnFetchAbort:z,ignoreFetchAbort:$,perf:J}=t;if(J!==void 0&&typeof J?.now!=\"function\")throw new TypeError(\"perf option must have a now() method if specified\");if(this.#c=J??si,e!==0&&!q(e))throw new TypeError(\"max option must be a nonnegative integer\");let Z=e?De(e):Array;if(!Z)throw new Error(\"invalid max value: \"+e);if(this.#t=e,this.#s=m,this.maxEntrySize=p||this.#s,this.sizeCalculation=w,this.sizeCalculation){if(!this.#s&&!this.maxEntrySize)throw new TypeError(\"cannot set sizeCalculation without setting maxSize or maxEntrySize\");if(typeof this.sizeCalculation!=\"function\")throw new TypeError(\"sizeCalculation set to non-function\")}if(S!==void 0&&typeof S!=\"function\")throw new TypeError(\"memoMethod must be a function if defined\");if(this.#w=S,g!==void 0&&typeof g!=\"function\")throw new TypeError(\"fetchMethod must be a function if specified\");if(this.#S=g,this.#A=!!g,this.#f=new Map,this.#a=new Array(e).fill(void 0),this.#i=new Array(e).fill(void 0),this.#d=new Z(e),this.#E=new Z(e),this.#b=0,this.#p=0,this.#R=ri.create(e),this.#h=0,this.#u=0,typeof l==\"function\"&&(this.#n=l),typeof u==\"function\"&&(this.#r=u),typeof c==\"function\"?(this.#o=c,this.#m=[]):(this.#o=void 0,this.#m=void 0),this.#x=!!this.#n,this.#_=!!this.#r,this.#e=!!this.#o,this.noDisposeOnSet=!!d,this.noUpdateTTL=!!f,this.noDeleteOnFetchRejection=!!E,this.allowStaleOnFetchRejection=!!b,this.allowStaleOnFetchAbort=!!z,this.ignoreFetchAbort=!!$,this.maxEntrySize!==0){if(this.#s!==0&&!q(this.#s))throw new TypeError(\"maxSize must be a positive integer if specified\");if(!q(this.maxEntrySize))throw new TypeError(\"maxEntrySize must be a positive integer if specified\");this.#G()}if(this.allowStale=!!a,this.noDeleteOnStaleGet=!!y,this.updateAgeOnGet=!!o,this.updateAgeOnHas=!!h,this.ttlResolution=q(i)||i===0?i:1,this.ttlAutopurge=!!r,this.ttl=s||0,this.ttl){if(!q(this.ttl))throw new TypeError(\"ttl must be a positive integer if specified\");this.#M()}if(this.#t===0&&this.ttl===0&&this.#s===0)throw new TypeError(\"At least one of max, maxSize, or ttl is required\");if(!this.ttlAutopurge&&!this.#t&&!this.#s){let $t=\"LRU_CACHE_UNBOUNDED\";ii($t)&&(Oe.add($t),Fe(\"TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.\",\"UnboundedCacheWarning\",$t,Me))}}getRemainingTTL(t){return this.#f.has(t)?1/0:0}#M(){let t=new Tt(this.#t),e=new Tt(this.#t);this.#g=t,this.#T=e;let s=this.ttlAutopurge?new Array(this.#t):void 0;this.#y=s,this.#j=(o,h,a=this.#c.now())=>{if(e[o]=h!==0?a:0,t[o]=h,s?.[o]&&(clearTimeout(s[o]),s[o]=void 0),h!==0&&s){let l=setTimeout(()=>{this.#v(o)&&this.#O(this.#a[o],\"expire\")},h+1);l.unref&&l.unref(),s[o]=l}},this.#k=o=>{e[o]=t[o]!==0?this.#c.now():0},this.#N=(o,h)=>{if(t[h]){let a=t[h],l=e[h];if(!a||!l)return;o.ttl=a,o.start=l,o.now=i||r();let u=o.now-l;o.remainingTTL=a-u}};let i=0,r=()=>{let o=this.#c.now();if(this.ttlResolution>0){i=o;let h=setTimeout(()=>i=0,this.ttlResolution);h.unref&&h.unref()}return o};this.getRemainingTTL=o=>{let h=this.#f.get(o);if(h===void 0)return 0;let a=t[h],l=e[h];if(!a||!l)return 1/0;let u=(i||r())-l;return a-u},this.#v=o=>{let h=e[o],a=t[o];return!!a&&!!h&&(i||r())-h>a}}#k=()=>{};#N=()=>{};#j=()=>{};#v=()=>!1;#G(){let t=new Tt(this.#t);this.#u=0,this.#C=t,this.#P=e=>{this.#u-=t[e],t[e]=0},this.#I=(e,s,i,r)=>{if(this.#l(s))return 0;if(!q(i))if(r){if(typeof r!=\"function\")throw new TypeError(\"sizeCalculation must be a function\");if(i=r(s,e),!q(i))throw new TypeError(\"sizeCalculation return invalid (expect positive integer)\")}else throw new TypeError(\"invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.\");return i},this.#L=(e,s,i)=>{if(t[e]=s,this.#s){let r=this.#s-t[e];for(;this.#u>r;)this.#B(!0)}this.#u+=t[e],i&&(i.entrySize=s,i.totalCalculatedSize=this.#u)}}#P=t=>{};#L=(t,e,s)=>{};#I=(t,e,s,i)=>{if(s||i)throw new TypeError(\"cannot set size without setting maxSize or maxEntrySize on cache\");return 0};*#F({allowStale:t=this.allowStale}={}){if(this.#h)for(let e=this.#p;!(!this.#z(e)||((t||!this.#v(e))&&(yield e),e===this.#b));)e=this.#E[e]}*#D({allowStale:t=this.allowStale}={}){if(this.#h)for(let e=this.#b;!(!this.#z(e)||((t||!this.#v(e))&&(yield e),e===this.#p));)e=this.#d[e]}#z(t){return t!==void 0&&this.#f.get(this.#a[t])===t}*entries(){for(let t of this.#F())this.#i[t]!==void 0&&this.#a[t]!==void 0&&!this.#l(this.#i[t])&&(yield[this.#a[t],this.#i[t]])}*rentries(){for(let t of this.#D())this.#i[t]!==void 0&&this.#a[t]!==void 0&&!this.#l(this.#i[t])&&(yield[this.#a[t],this.#i[t]])}*keys(){for(let t of this.#F()){let e=this.#a[t];e!==void 0&&!this.#l(this.#i[t])&&(yield e)}}*rkeys(){for(let t of this.#D()){let e=this.#a[t];e!==void 0&&!this.#l(this.#i[t])&&(yield e)}}*values(){for(let t of this.#F())this.#i[t]!==void 0&&!this.#l(this.#i[t])&&(yield this.#i[t])}*rvalues(){for(let t of this.#D())this.#i[t]!==void 0&&!this.#l(this.#i[t])&&(yield this.#i[t])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]=\"LRUCache\";find(t,e={}){for(let s of this.#F()){let i=this.#i[s],r=this.#l(i)?i.__staleWhileFetching:i;if(r!==void 0&&t(r,this.#a[s],this))return this.get(this.#a[s],e)}}forEach(t,e=this){for(let s of this.#F()){let i=this.#i[s],r=this.#l(i)?i.__staleWhileFetching:i;r!==void 0&&t.call(e,r,this.#a[s],this)}}rforEach(t,e=this){for(let s of this.#D()){let i=this.#i[s],r=this.#l(i)?i.__staleWhileFetching:i;r!==void 0&&t.call(e,r,this.#a[s],this)}}purgeStale(){let t=!1;for(let e of this.#D({allowStale:!0}))this.#v(e)&&(this.#O(this.#a[e],\"expire\"),t=!0);return t}info(t){let e=this.#f.get(t);if(e===void 0)return;let s=this.#i[e],i=this.#l(s)?s.__staleWhileFetching:s;if(i===void 0)return;let r={value:i};if(this.#g&&this.#T){let o=this.#g[e],h=this.#T[e];if(o&&h){let a=o-(this.#c.now()-h);r.ttl=a,r.start=Date.now()}}return this.#C&&(r.size=this.#C[e]),r}dump(){let t=[];for(let e of this.#F({allowStale:!0})){let s=this.#a[e],i=this.#i[e],r=this.#l(i)?i.__staleWhileFetching:i;if(r===void 0||s===void 0)continue;let o={value:r};if(this.#g&&this.#T){o.ttl=this.#g[e];let h=this.#c.now()-this.#T[e];o.start=Math.floor(Date.now()-h)}this.#C&&(o.size=this.#C[e]),t.unshift([s,o])}return t}load(t){this.clear();for(let[e,s]of t){if(s.start){let i=Date.now()-s.start;s.start=this.#c.now()-i}this.set(e,s.value,s)}}set(t,e,s={}){if(e===void 0)return this.delete(t),this;let{ttl:i=this.ttl,start:r,noDisposeOnSet:o=this.noDisposeOnSet,sizeCalculation:h=this.sizeCalculation,status:a}=s,{noUpdateTTL:l=this.noUpdateTTL}=s,u=this.#I(t,e,s.size||0,h);if(this.maxEntrySize&&u>this.maxEntrySize)return a&&(a.set=\"miss\",a.maxEntrySizeExceeded=!0),this.#O(t,\"set\"),this;let c=this.#h===0?void 0:this.#f.get(t);if(c===void 0)c=this.#h===0?this.#p:this.#R.length!==0?this.#R.pop():this.#h===this.#t?this.#B(!1):this.#h,this.#a[c]=t,this.#i[c]=e,this.#f.set(t,c),this.#d[this.#p]=c,this.#E[c]=this.#p,this.#p=c,this.#h++,this.#L(c,u,a),a&&(a.set=\"add\"),l=!1,this.#_&&this.#r?.(e,t,\"add\");else{this.#W(c);let d=this.#i[c];if(e!==d){if(this.#A&&this.#l(d)){d.__abortController.abort(new Error(\"replaced\"));let{__staleWhileFetching:f}=d;f!==void 0&&!o&&(this.#x&&this.#n?.(f,t,\"set\"),this.#e&&this.#m?.push([f,t,\"set\"]))}else o||(this.#x&&this.#n?.(d,t,\"set\"),this.#e&&this.#m?.push([d,t,\"set\"]));if(this.#P(c),this.#L(c,u,a),this.#i[c]=e,a){a.set=\"replace\";let f=d&&this.#l(d)?d.__staleWhileFetching:d;f!==void 0&&(a.oldValue=f)}}else a&&(a.set=\"update\");this.#_&&this.onInsert?.(e,t,e===d?\"update\":\"replace\")}if(i!==0&&!this.#g&&this.#M(),this.#g&&(l||this.#j(c,i,r),a&&this.#N(a,c)),!o&&this.#e&&this.#m){let d=this.#m,f;for(;f=d?.shift();)this.#o?.(...f)}return this}pop(){try{for(;this.#h;){let t=this.#i[this.#b];if(this.#B(!0),this.#l(t)){if(t.__staleWhileFetching)return t.__staleWhileFetching}else if(t!==void 0)return t}}finally{if(this.#e&&this.#m){let t=this.#m,e;for(;e=t?.shift();)this.#o?.(...e)}}}#B(t){let e=this.#b,s=this.#a[e],i=this.#i[e];return this.#A&&this.#l(i)?i.__abortController.abort(new Error(\"evicted\")):(this.#x||this.#e)&&(this.#x&&this.#n?.(i,s,\"evict\"),this.#e&&this.#m?.push([i,s,\"evict\"])),this.#P(e),this.#y?.[e]&&(clearTimeout(this.#y[e]),this.#y[e]=void 0),t&&(this.#a[e]=void 0,this.#i[e]=void 0,this.#R.push(e)),this.#h===1?(this.#b=this.#p=0,this.#R.length=0):this.#b=this.#d[e],this.#f.delete(s),this.#h--,e}has(t,e={}){let{updateAgeOnHas:s=this.updateAgeOnHas,status:i}=e,r=this.#f.get(t);if(r!==void 0){let o=this.#i[r];if(this.#l(o)&&o.__staleWhileFetching===void 0)return!1;if(this.#v(r))i&&(i.has=\"stale\",this.#N(i,r));else return s&&this.#k(r),i&&(i.has=\"hit\",this.#N(i,r)),!0}else i&&(i.has=\"miss\");return!1}peek(t,e={}){let{allowStale:s=this.allowStale}=e,i=this.#f.get(t);if(i===void 0||!s&&this.#v(i))return;let r=this.#i[i];return this.#l(r)?r.__staleWhileFetching:r}#U(t,e,s,i){let r=e===void 0?void 0:this.#i[e];if(this.#l(r))return r;let o=new At,{signal:h}=s;h?.addEventListener(\"abort\",()=>o.abort(h.reason),{signal:o.signal});let a={signal:o.signal,options:s,context:i},l=(p,w=!1)=>{let{aborted:g}=o.signal,S=s.ignoreFetchAbort&&p!==void 0,E=s.ignoreFetchAbort||!!(s.allowStaleOnFetchAbort&&p!==void 0);if(s.status&&(g&&!w?(s.status.fetchAborted=!0,s.status.fetchError=o.signal.reason,S&&(s.status.fetchAbortIgnored=!0)):s.status.fetchResolved=!0),g&&!S&&!w)return c(o.signal.reason,E);let y=f,b=this.#i[e];return(b===f||S&&w&&b===void 0)&&(p===void 0?y.__staleWhileFetching!==void 0?this.#i[e]=y.__staleWhileFetching:this.#O(t,\"fetch\"):(s.status&&(s.status.fetchUpdated=!0),this.set(t,p,a.options))),p},u=p=>(s.status&&(s.status.fetchRejected=!0,s.status.fetchError=p),c(p,!1)),c=(p,w)=>{let{aborted:g}=o.signal,S=g&&s.allowStaleOnFetchAbort,E=S||s.allowStaleOnFetchRejection,y=E||s.noDeleteOnFetchRejection,b=f;if(this.#i[e]===f&&(!y||!w&&b.__staleWhileFetching===void 0?this.#O(t,\"fetch\"):S||(this.#i[e]=b.__staleWhileFetching)),E)return s.status&&b.__staleWhileFetching!==void 0&&(s.status.returnedStale=!0),b.__staleWhileFetching;if(b.__returned===b)throw p},d=(p,w)=>{let g=this.#S?.(t,r,a);g&&g instanceof Promise&&g.then(S=>p(S===void 0?void 0:S),w),o.signal.addEventListener(\"abort\",()=>{(!s.ignoreFetchAbort||s.allowStaleOnFetchAbort)&&(p(void 0),s.allowStaleOnFetchAbort&&(p=S=>l(S,!0)))})};s.status&&(s.status.fetchDispatched=!0);let f=new Promise(d).then(l,u),m=Object.assign(f,{__abortController:o,__staleWhileFetching:r,__returned:void 0});return e===void 0?(this.set(t,m,{...a.options,status:void 0}),e=this.#f.get(t)):this.#i[e]=m,m}#l(t){if(!this.#A)return!1;let e=t;return!!e&&e instanceof Promise&&e.hasOwnProperty(\"__staleWhileFetching\")&&e.__abortController instanceof At}async fetch(t,e={}){let{allowStale:s=this.allowStale,updateAgeOnGet:i=this.updateAgeOnGet,noDeleteOnStaleGet:r=this.noDeleteOnStaleGet,ttl:o=this.ttl,noDisposeOnSet:h=this.noDisposeOnSet,size:a=0,sizeCalculation:l=this.sizeCalculation,noUpdateTTL:u=this.noUpdateTTL,noDeleteOnFetchRejection:c=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:d=this.allowStaleOnFetchRejection,ignoreFetchAbort:f=this.ignoreFetchAbort,allowStaleOnFetchAbort:m=this.allowStaleOnFetchAbort,context:p,forceRefresh:w=!1,status:g,signal:S}=e;if(!this.#A)return g&&(g.fetch=\"get\"),this.get(t,{allowStale:s,updateAgeOnGet:i,noDeleteOnStaleGet:r,status:g});let E={allowStale:s,updateAgeOnGet:i,noDeleteOnStaleGet:r,ttl:o,noDisposeOnSet:h,size:a,sizeCalculation:l,noUpdateTTL:u,noDeleteOnFetchRejection:c,allowStaleOnFetchRejection:d,allowStaleOnFetchAbort:m,ignoreFetchAbort:f,status:g,signal:S},y=this.#f.get(t);if(y===void 0){g&&(g.fetch=\"miss\");let b=this.#U(t,y,E,p);return b.__returned=b}else{let b=this.#i[y];if(this.#l(b)){let Z=s&&b.__staleWhileFetching!==void 0;return g&&(g.fetch=\"inflight\",Z&&(g.returnedStale=!0)),Z?b.__staleWhileFetching:b.__returned=b}let z=this.#v(y);if(!w&&!z)return g&&(g.fetch=\"hit\"),this.#W(y),i&&this.#k(y),g&&this.#N(g,y),b;let $=this.#U(t,y,E,p),J=$.__staleWhileFetching!==void 0&&s;return g&&(g.fetch=z?\"stale\":\"refresh\",J&&z&&(g.returnedStale=!0)),J?$.__staleWhileFetching:$.__returned=$}}async forceFetch(t,e={}){let s=await this.fetch(t,e);if(s===void 0)throw new Error(\"fetch() returned undefined\");return s}memo(t,e={}){let s=this.#w;if(!s)throw new Error(\"no memoMethod provided to constructor\");let{context:i,forceRefresh:r,...o}=e,h=this.get(t,o);if(!r&&h!==void 0)return h;let a=s(t,h,{options:o,context:i});return this.set(t,a,o),a}get(t,e={}){let{allowStale:s=this.allowStale,updateAgeOnGet:i=this.updateAgeOnGet,noDeleteOnStaleGet:r=this.noDeleteOnStaleGet,status:o}=e,h=this.#f.get(t);if(h!==void 0){let a=this.#i[h],l=this.#l(a);return o&&this.#N(o,h),this.#v(h)?(o&&(o.get=\"stale\"),l?(o&&s&&a.__staleWhileFetching!==void 0&&(o.returnedStale=!0),s?a.__staleWhileFetching:void 0):(r||this.#O(t,\"expire\"),o&&s&&(o.returnedStale=!0),s?a:void 0)):(o&&(o.get=\"hit\"),l?a.__staleWhileFetching:(this.#W(h),i&&this.#k(h),a))}else o&&(o.get=\"miss\")}#$(t,e){this.#E[e]=t,this.#d[t]=e}#W(t){t!==this.#p&&(t===this.#b?this.#b=this.#d[t]:this.#$(this.#E[t],this.#d[t]),this.#$(this.#p,t),this.#p=t)}delete(t){return this.#O(t,\"delete\")}#O(t,e){let s=!1;if(this.#h!==0){let i=this.#f.get(t);if(i!==void 0)if(this.#y?.[i]&&(clearTimeout(this.#y?.[i]),this.#y[i]=void 0),s=!0,this.#h===1)this.#H(e);else{this.#P(i);let r=this.#i[i];if(this.#l(r)?r.__abortController.abort(new Error(\"deleted\")):(this.#x||this.#e)&&(this.#x&&this.#n?.(r,t,e),this.#e&&this.#m?.push([r,t,e])),this.#f.delete(t),this.#a[i]=void 0,this.#i[i]=void 0,i===this.#p)this.#p=this.#E[i];else if(i===this.#b)this.#b=this.#d[i];else{let o=this.#E[i];this.#d[o]=this.#d[i];let h=this.#d[i];this.#E[h]=this.#E[i]}this.#h--,this.#R.push(i)}}if(this.#e&&this.#m?.length){let i=this.#m,r;for(;r=i?.shift();)this.#o?.(...r)}return s}clear(){return this.#H(\"delete\")}#H(t){for(let e of this.#D({allowStale:!0})){let s=this.#i[e];if(this.#l(s))s.__abortController.abort(new Error(\"deleted\"));else{let i=this.#a[e];this.#x&&this.#n?.(s,i,t),this.#e&&this.#m?.push([s,i,t])}}if(this.#f.clear(),this.#i.fill(void 0),this.#a.fill(void 0),this.#g&&this.#T){this.#g.fill(0),this.#T.fill(0);for(let e of this.#y??[])e!==void 0&&clearTimeout(e);this.#y?.fill(void 0)}if(this.#C&&this.#C.fill(0),this.#b=0,this.#p=0,this.#R.length=0,this.#u=0,this.#h=0,this.#e&&this.#m){let e=this.#m,s;for(;s=e?.shift();)this.#o?.(...s)}}};import{posix as mi,win32 as re}from\"node:path\";import{fileURLToPath as gi}from\"node:url\";import{lstatSync as wi,readdir as yi,readdirSync as bi,readlinkSync as Si,realpathSync as Ei}from\"fs\";import*as xi from\"node:fs\";import{lstat as Ci,readdir as Ti,readlink as Ai,realpath as ki}from\"node:fs/promises\";import{EventEmitter as ee}from\"node:events\";import Pe from\"node:stream\";import{StringDecoder as ni}from\"node:string_decoder\";var Ne=typeof process==\"object\"&&process?process:{stdout:null,stderr:null},oi=n=>!!n&&typeof n==\"object\"&&(n instanceof V||n instanceof Pe||hi(n)||ai(n)),hi=n=>!!n&&typeof n==\"object\"&&n instanceof ee&&typeof n.pipe==\"function\"&&n.pipe!==Pe.Writable.prototype.pipe,ai=n=>!!n&&typeof n==\"object\"&&n instanceof ee&&typeof n.write==\"function\"&&typeof n.end==\"function\",G=Symbol(\"EOF\"),H=Symbol(\"maybeEmitEnd\"),K=Symbol(\"emittedEnd\"),kt=Symbol(\"emittingEnd\"),ut=Symbol(\"emittedError\"),Rt=Symbol(\"closed\"),_e=Symbol(\"read\"),Ot=Symbol(\"flush\"),Le=Symbol(\"flushChunk\"),P=Symbol(\"encoding\"),et=Symbol(\"decoder\"),v=Symbol(\"flowing\"),dt=Symbol(\"paused\"),st=Symbol(\"resume\"),C=Symbol(\"buffer\"),F=Symbol(\"pipes\"),T=Symbol(\"bufferLength\"),Yt=Symbol(\"bufferPush\"),Ft=Symbol(\"bufferShift\"),k=Symbol(\"objectMode\"),x=Symbol(\"destroyed\"),Xt=Symbol(\"error\"),Jt=Symbol(\"emitData\"),We=Symbol(\"emitEnd\"),Zt=Symbol(\"emitEnd2\"),B=Symbol(\"async\"),Qt=Symbol(\"abort\"),Dt=Symbol(\"aborted\"),pt=Symbol(\"signal\"),Y=Symbol(\"dataListeners\"),M=Symbol(\"discarded\"),mt=n=>Promise.resolve().then(n),li=n=>n(),ci=n=>n===\"end\"||n===\"finish\"||n===\"prefinish\",fi=n=>n instanceof ArrayBuffer||!!n&&typeof n==\"object\"&&n.constructor&&n.constructor.name===\"ArrayBuffer\"&&n.byteLength>=0,ui=n=>!Buffer.isBuffer(n)&&ArrayBuffer.isView(n),Mt=class{src;dest;opts;ondrain;constructor(t,e,s){this.src=t,this.dest=e,this.opts=s,this.ondrain=()=>t[st](),this.dest.on(\"drain\",this.ondrain)}unpipe(){this.dest.removeListener(\"drain\",this.ondrain)}proxyErrors(t){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},te=class extends Mt{unpipe(){this.src.removeListener(\"error\",this.proxyErrors),super.unpipe()}constructor(t,e,s){super(t,e,s),this.proxyErrors=i=>this.dest.emit(\"error\",i),t.on(\"error\",this.proxyErrors)}},di=n=>!!n.objectMode,pi=n=>!n.objectMode&&!!n.encoding&&n.encoding!==\"buffer\",V=class extends ee{[v]=!1;[dt]=!1;[F]=[];[C]=[];[k];[P];[B];[et];[G]=!1;[K]=!1;[kt]=!1;[Rt]=!1;[ut]=null;[T]=0;[x]=!1;[pt];[Dt]=!1;[Y]=0;[M]=!1;writable=!0;readable=!0;constructor(...t){let e=t[0]||{};if(super(),e.objectMode&&typeof e.encoding==\"string\")throw new TypeError(\"Encoding and objectMode may not be used together\");di(e)?(this[k]=!0,this[P]=null):pi(e)?(this[P]=e.encoding,this[k]=!1):(this[k]=!1,this[P]=null),this[B]=!!e.async,this[et]=this[P]?new ni(this[P]):null,e&&e.debugExposeBuffer===!0&&Object.defineProperty(this,\"buffer\",{get:()=>this[C]}),e&&e.debugExposePipes===!0&&Object.defineProperty(this,\"pipes\",{get:()=>this[F]});let{signal:s}=e;s&&(this[pt]=s,s.aborted?this[Qt]():s.addEventListener(\"abort\",()=>this[Qt]()))}get bufferLength(){return this[T]}get encoding(){return this[P]}set encoding(t){throw new Error(\"Encoding must be set at instantiation time\")}setEncoding(t){throw new Error(\"Encoding must be set at instantiation time\")}get objectMode(){return this[k]}set objectMode(t){throw new Error(\"objectMode must be set at instantiation time\")}get async(){return this[B]}set async(t){this[B]=this[B]||!!t}[Qt](){this[Dt]=!0,this.emit(\"abort\",this[pt]?.reason),this.destroy(this[pt]?.reason)}get aborted(){return this[Dt]}set aborted(t){}write(t,e,s){if(this[Dt])return!1;if(this[G])throw new Error(\"write after end\");if(this[x])return this.emit(\"error\",Object.assign(new Error(\"Cannot call write after a stream was destroyed\"),{code:\"ERR_STREAM_DESTROYED\"})),!0;typeof e==\"function\"&&(s=e,e=\"utf8\"),e||(e=\"utf8\");let i=this[B]?mt:li;if(!this[k]&&!Buffer.isBuffer(t)){if(ui(t))t=Buffer.from(t.buffer,t.byteOffset,t.byteLength);else if(fi(t))t=Buffer.from(t);else if(typeof t!=\"string\")throw new Error(\"Non-contiguous data written to non-objectMode stream\")}return this[k]?(this[v]&&this[T]!==0&&this[Ot](!0),this[v]?this.emit(\"data\",t):this[Yt](t),this[T]!==0&&this.emit(\"readable\"),s&&i(s),this[v]):t.length?(typeof t==\"string\"&&!(e===this[P]&&!this[et]?.lastNeed)&&(t=Buffer.from(t,e)),Buffer.isBuffer(t)&&this[P]&&(t=this[et].write(t)),this[v]&&this[T]!==0&&this[Ot](!0),this[v]?this.emit(\"data\",t):this[Yt](t),this[T]!==0&&this.emit(\"readable\"),s&&i(s),this[v]):(this[T]!==0&&this.emit(\"readable\"),s&&i(s),this[v])}read(t){if(this[x])return null;if(this[M]=!1,this[T]===0||t===0||t&&t>this[T])return this[H](),null;this[k]&&(t=null),this[C].length>1&&!this[k]&&(this[C]=[this[P]?this[C].join(\"\"):Buffer.concat(this[C],this[T])]);let e=this[_e](t||null,this[C][0]);return this[H](),e}[_e](t,e){if(this[k])this[Ft]();else{let s=e;t===s.length||t===null?this[Ft]():typeof s==\"string\"?(this[C][0]=s.slice(t),e=s.slice(0,t),this[T]-=t):(this[C][0]=s.subarray(t),e=s.subarray(0,t),this[T]-=t)}return this.emit(\"data\",e),!this[C].length&&!this[G]&&this.emit(\"drain\"),e}end(t,e,s){return typeof t==\"function\"&&(s=t,t=void 0),typeof e==\"function\"&&(s=e,e=\"utf8\"),t!==void 0&&this.write(t,e),s&&this.once(\"end\",s),this[G]=!0,this.writable=!1,(this[v]||!this[dt])&&this[H](),this}[st](){this[x]||(!this[Y]&&!this[F].length&&(this[M]=!0),this[dt]=!1,this[v]=!0,this.emit(\"resume\"),this[C].length?this[Ot]():this[G]?this[H]():this.emit(\"drain\"))}resume(){return this[st]()}pause(){this[v]=!1,this[dt]=!0,this[M]=!1}get destroyed(){return this[x]}get flowing(){return this[v]}get paused(){return this[dt]}[Yt](t){this[k]?this[T]+=1:this[T]+=t.length,this[C].push(t)}[Ft](){return this[k]?this[T]-=1:this[T]-=this[C][0].length,this[C].shift()}[Ot](t=!1){do;while(this[Le](this[Ft]())&&this[C].length);!t&&!this[C].length&&!this[G]&&this.emit(\"drain\")}[Le](t){return this.emit(\"data\",t),this[v]}pipe(t,e){if(this[x])return t;this[M]=!1;let s=this[K];return e=e||{},t===Ne.stdout||t===Ne.stderr?e.end=!1:e.end=e.end!==!1,e.proxyErrors=!!e.proxyErrors,s?e.end&&t.end():(this[F].push(e.proxyErrors?new te(this,t,e):new Mt(this,t,e)),this[B]?mt(()=>this[st]()):this[st]()),t}unpipe(t){let e=this[F].find(s=>s.dest===t);e&&(this[F].length===1?(this[v]&&this[Y]===0&&(this[v]=!1),this[F]=[]):this[F].splice(this[F].indexOf(e),1),e.unpipe())}addListener(t,e){return this.on(t,e)}on(t,e){let s=super.on(t,e);if(t===\"data\")this[M]=!1,this[Y]++,!this[F].length&&!this[v]&&this[st]();else if(t===\"readable\"&&this[T]!==0)super.emit(\"readable\");else if(ci(t)&&this[K])super.emit(t),this.removeAllListeners(t);else if(t===\"error\"&&this[ut]){let i=e;this[B]?mt(()=>i.call(this,this[ut])):i.call(this,this[ut])}return s}removeListener(t,e){return this.off(t,e)}off(t,e){let s=super.off(t,e);return t===\"data\"&&(this[Y]=this.listeners(\"data\").length,this[Y]===0&&!this[M]&&!this[F].length&&(this[v]=!1)),s}removeAllListeners(t){let e=super.removeAllListeners(t);return(t===\"data\"||t===void 0)&&(this[Y]=0,!this[M]&&!this[F].length&&(this[v]=!1)),e}get emittedEnd(){return this[K]}[H](){!this[kt]&&!this[K]&&!this[x]&&this[C].length===0&&this[G]&&(this[kt]=!0,this.emit(\"end\"),this.emit(\"prefinish\"),this.emit(\"finish\"),this[Rt]&&this.emit(\"close\"),this[kt]=!1)}emit(t,...e){let s=e[0];if(t!==\"error\"&&t!==\"close\"&&t!==x&&this[x])return!1;if(t===\"data\")return!this[k]&&!s?!1:this[B]?(mt(()=>this[Jt](s)),!0):this[Jt](s);if(t===\"end\")return this[We]();if(t===\"close\"){if(this[Rt]=!0,!this[K]&&!this[x])return!1;let r=super.emit(\"close\");return this.removeAllListeners(\"close\"),r}else if(t===\"error\"){this[ut]=s,super.emit(Xt,s);let r=!this[pt]||this.listeners(\"error\").length?super.emit(\"error\",s):!1;return this[H](),r}else if(t===\"resume\"){let r=super.emit(\"resume\");return this[H](),r}else if(t===\"finish\"||t===\"prefinish\"){let r=super.emit(t);return this.removeAllListeners(t),r}let i=super.emit(t,...e);return this[H](),i}[Jt](t){for(let s of this[F])s.dest.write(t)===!1&&this.pause();let e=this[M]?!1:super.emit(\"data\",t);return this[H](),e}[We](){return this[K]?!1:(this[K]=!0,this.readable=!1,this[B]?(mt(()=>this[Zt]()),!0):this[Zt]())}[Zt](){if(this[et]){let e=this[et].end();if(e){for(let s of this[F])s.dest.write(e);this[M]||super.emit(\"data\",e)}}for(let e of this[F])e.end();let t=super.emit(\"end\");return this.removeAllListeners(\"end\"),t}async collect(){let t=Object.assign([],{dataLength:0});this[k]||(t.dataLength=0);let e=this.promise();return this.on(\"data\",s=>{t.push(s),this[k]||(t.dataLength+=s.length)}),await e,t}async concat(){if(this[k])throw new Error(\"cannot concat in objectMode\");let t=await this.collect();return this[P]?t.join(\"\"):Buffer.concat(t,t.dataLength)}async promise(){return new Promise((t,e)=>{this.on(x,()=>e(new Error(\"stream destroyed\"))),this.on(\"error\",s=>e(s)),this.on(\"end\",()=>t())})}[Symbol.asyncIterator](){this[M]=!1;let t=!1,e=async()=>(this.pause(),t=!0,{value:void 0,done:!0});return{next:()=>{if(t)return e();let i=this.read();if(i!==null)return Promise.resolve({done:!1,value:i});if(this[G])return e();let r,o,h=c=>{this.off(\"data\",a),this.off(\"end\",l),this.off(x,u),e(),o(c)},a=c=>{this.off(\"error\",h),this.off(\"end\",l),this.off(x,u),this.pause(),r({value:c,done:!!this[G]})},l=()=>{this.off(\"error\",h),this.off(\"data\",a),this.off(x,u),e(),r({done:!0,value:void 0})},u=()=>h(new Error(\"stream destroyed\"));return new Promise((c,d)=>{o=d,r=c,this.once(x,u),this.once(\"error\",h),this.once(\"end\",l),this.once(\"data\",a)})},throw:e,return:e,[Symbol.asyncIterator](){return this},[Symbol.asyncDispose]:async()=>{}}}[Symbol.iterator](){this[M]=!1;let t=!1,e=()=>(this.pause(),this.off(Xt,e),this.off(x,e),this.off(\"end\",e),t=!0,{done:!0,value:void 0}),s=()=>{if(t)return e();let i=this.read();return i===null?e():{done:!1,value:i}};return this.once(\"end\",e),this.once(Xt,e),this.once(x,e),{next:s,throw:e,return:e,[Symbol.iterator](){return this},[Symbol.dispose]:()=>{}}}destroy(t){if(this[x])return t?this.emit(\"error\",t):this.emit(x),this;this[x]=!0,this[M]=!0,this[C].length=0,this[T]=0;let e=this;return typeof e.close==\"function\"&&!this[Rt]&&e.close(),t?this.emit(\"error\",t):this.emit(x),this}static get isStream(){return oi}};var vi=Ei.native,wt={lstatSync:wi,readdir:yi,readdirSync:bi,readlinkSync:Si,realpathSync:vi,promises:{lstat:Ci,readdir:Ti,readlink:Ai,realpath:ki}},Ue=n=>!n||n===wt||n===xi?wt:{...wt,...n,promises:{...wt.promises,...n.promises||{}}},$e=/^\\\\\\\\\\?\\\\([a-z]:)\\\\?$/i,Ri=n=>n.replace(/\\//g,\"\\\\\").replace($e,\"$1\\\\\"),Oi=/[\\\\\\/]/,L=0,Ge=1,He=2,U=4,qe=6,Ke=8,X=10,Ve=12,_=15,gt=~_,se=16,je=32,yt=64,j=128,Nt=256,Lt=512,Ie=yt|j|Lt,Fi=1023,ie=n=>n.isFile()?Ke:n.isDirectory()?U:n.isSymbolicLink()?X:n.isCharacterDevice()?He:n.isBlockDevice()?qe:n.isSocket()?Ve:n.isFIFO()?Ge:L,ze=new ft({max:2**12}),bt=n=>{let t=ze.get(n);if(t)return t;let e=n.normalize(\"NFKD\");return ze.set(n,e),e},Be=new ft({max:2**12}),_t=n=>{let t=Be.get(n);if(t)return t;let e=bt(n.toLowerCase());return Be.set(n,e),e},Wt=class extends ft{constructor(){super({max:256})}},ne=class extends ft{constructor(t=16*1024){super({maxSize:t,sizeCalculation:e=>e.length+1})}},Ye=Symbol(\"PathScurry setAsCwd\"),R=class{name;root;roots;parent;nocase;isCWD=!1;#t;#s;get dev(){return this.#s}#n;get mode(){return this.#n}#r;get nlink(){return this.#r}#o;get uid(){return this.#o}#S;get gid(){return this.#S}#w;get rdev(){return this.#w}#c;get blksize(){return this.#c}#h;get ino(){return this.#h}#u;get size(){return this.#u}#f;get blocks(){return this.#f}#a;get atimeMs(){return this.#a}#i;get mtimeMs(){return this.#i}#d;get ctimeMs(){return this.#d}#E;get birthtimeMs(){return this.#E}#b;get atime(){return this.#b}#p;get mtime(){return this.#p}#R;get ctime(){return this.#R}#m;get birthtime(){return this.#m}#C;#T;#g;#y;#x;#A;#e;#_;#M;#k;get parentPath(){return(this.parent||this).fullpath()}get path(){return this.parentPath}constructor(t,e=L,s,i,r,o,h){this.name=t,this.#C=r?_t(t):bt(t),this.#e=e&Fi,this.nocase=r,this.roots=i,this.root=s||this,this.#_=o,this.#g=h.fullpath,this.#x=h.relative,this.#A=h.relativePosix,this.parent=h.parent,this.parent?this.#t=this.parent.#t:this.#t=Ue(h.fs)}depth(){return this.#T!==void 0?this.#T:this.parent?this.#T=this.parent.depth()+1:this.#T=0}childrenCache(){return this.#_}resolve(t){if(!t)return this;let e=this.getRootString(t),i=t.substring(e.length).split(this.splitSep);return e?this.getRoot(e).#N(i):this.#N(i)}#N(t){let e=this;for(let s of t)e=e.child(s);return e}children(){let t=this.#_.get(this);if(t)return t;let e=Object.assign([],{provisional:0});return this.#_.set(this,e),this.#e&=~se,e}child(t,e){if(t===\"\"||t===\".\")return this;if(t===\"..\")return this.parent||this;let s=this.children(),i=this.nocase?_t(t):bt(t);for(let a of s)if(a.#C===i)return a;let r=this.parent?this.sep:\"\",o=this.#g?this.#g+r+t:void 0,h=this.newChild(t,L,{...e,parent:this,fullpath:o});return this.canReaddir()||(h.#e|=j),s.push(h),h}relative(){if(this.isCWD)return\"\";if(this.#x!==void 0)return this.#x;let t=this.name,e=this.parent;if(!e)return this.#x=this.name;let s=e.relative();return s+(!s||!e.parent?\"\":this.sep)+t}relativePosix(){if(this.sep===\"/\")return this.relative();if(this.isCWD)return\"\";if(this.#A!==void 0)return this.#A;let t=this.name,e=this.parent;if(!e)return this.#A=this.fullpathPosix();let s=e.relativePosix();return s+(!s||!e.parent?\"\":\"/\")+t}fullpath(){if(this.#g!==void 0)return this.#g;let t=this.name,e=this.parent;if(!e)return this.#g=this.name;let i=e.fullpath()+(e.parent?this.sep:\"\")+t;return this.#g=i}fullpathPosix(){if(this.#y!==void 0)return this.#y;if(this.sep===\"/\")return this.#y=this.fullpath();if(!this.parent){let i=this.fullpath().replace(/\\\\/g,\"/\");return/^[a-z]:\\//i.test(i)?this.#y=`//?/${i}`:this.#y=i}let t=this.parent,e=t.fullpathPosix(),s=e+(!e||!t.parent?\"\":\"/\")+this.name;return this.#y=s}isUnknown(){return(this.#e&_)===L}isType(t){return this[`is${t}`]()}getType(){return this.isUnknown()?\"Unknown\":this.isDirectory()?\"Directory\":this.isFile()?\"File\":this.isSymbolicLink()?\"SymbolicLink\":this.isFIFO()?\"FIFO\":this.isCharacterDevice()?\"CharacterDevice\":this.isBlockDevice()?\"BlockDevice\":this.isSocket()?\"Socket\":\"Unknown\"}isFile(){return(this.#e&_)===Ke}isDirectory(){return(this.#e&_)===U}isCharacterDevice(){return(this.#e&_)===He}isBlockDevice(){return(this.#e&_)===qe}isFIFO(){return(this.#e&_)===Ge}isSocket(){return(this.#e&_)===Ve}isSymbolicLink(){return(this.#e&X)===X}lstatCached(){return this.#e&je?this:void 0}readlinkCached(){return this.#M}realpathCached(){return this.#k}readdirCached(){let t=this.children();return t.slice(0,t.provisional)}canReadlink(){if(this.#M)return!0;if(!this.parent)return!1;let t=this.#e&_;return!(t!==L&&t!==X||this.#e&Nt||this.#e&j)}calledReaddir(){return!!(this.#e&se)}isENOENT(){return!!(this.#e&j)}isNamed(t){return this.nocase?this.#C===_t(t):this.#C===bt(t)}async readlink(){let t=this.#M;if(t)return t;if(this.canReadlink()&&this.parent)try{let e=await this.#t.promises.readlink(this.fullpath()),s=(await this.parent.realpath())?.resolve(e);if(s)return this.#M=s}catch(e){this.#D(e.code);return}}readlinkSync(){let t=this.#M;if(t)return t;if(this.canReadlink()&&this.parent)try{let e=this.#t.readlinkSync(this.fullpath()),s=this.parent.realpathSync()?.resolve(e);if(s)return this.#M=s}catch(e){this.#D(e.code);return}}#j(t){this.#e|=se;for(let e=t.provisional;e<t.length;e++){let s=t[e];s&&s.#v()}}#v(){this.#e&j||(this.#e=(this.#e|j)&gt,this.#G())}#G(){let t=this.children();t.provisional=0;for(let e of t)e.#v()}#P(){this.#e|=Lt,this.#L()}#L(){if(this.#e&yt)return;let t=this.#e;(t&_)===U&&(t&=gt),this.#e=t|yt,this.#G()}#I(t=\"\"){t===\"ENOTDIR\"||t===\"EPERM\"?this.#L():t===\"ENOENT\"?this.#v():this.children().provisional=0}#F(t=\"\"){t===\"ENOTDIR\"?this.parent.#L():t===\"ENOENT\"&&this.#v()}#D(t=\"\"){let e=this.#e;e|=Nt,t===\"ENOENT\"&&(e|=j),(t===\"EINVAL\"||t===\"UNKNOWN\")&&(e&=gt),this.#e=e,t===\"ENOTDIR\"&&this.parent&&this.parent.#L()}#z(t,e){return this.#U(t,e)||this.#B(t,e)}#B(t,e){let s=ie(t),i=this.newChild(t.name,s,{parent:this}),r=i.#e&_;return r!==U&&r!==X&&r!==L&&(i.#e|=yt),e.unshift(i),e.provisional++,i}#U(t,e){for(let s=e.provisional;s<e.length;s++){let i=e[s];if((this.nocase?_t(t.name):bt(t.name))===i.#C)return this.#l(t,i,s,e)}}#l(t,e,s,i){let r=e.name;return e.#e=e.#e&gt|ie(t),r!==t.name&&(e.name=t.name),s!==i.provisional&&(s===i.length-1?i.pop():i.splice(s,1),i.unshift(e)),i.provisional++,e}async lstat(){if((this.#e&j)===0)try{return this.#$(await this.#t.promises.lstat(this.fullpath())),this}catch(t){this.#F(t.code)}}lstatSync(){if((this.#e&j)===0)try{return this.#$(this.#t.lstatSync(this.fullpath())),this}catch(t){this.#F(t.code)}}#$(t){let{atime:e,atimeMs:s,birthtime:i,birthtimeMs:r,blksize:o,blocks:h,ctime:a,ctimeMs:l,dev:u,gid:c,ino:d,mode:f,mtime:m,mtimeMs:p,nlink:w,rdev:g,size:S,uid:E}=t;this.#b=e,this.#a=s,this.#m=i,this.#E=r,this.#c=o,this.#f=h,this.#R=a,this.#d=l,this.#s=u,this.#S=c,this.#h=d,this.#n=f,this.#p=m,this.#i=p,this.#r=w,this.#w=g,this.#u=S,this.#o=E;let y=ie(t);this.#e=this.#e&gt|y|je,y!==L&&y!==U&&y!==X&&(this.#e|=yt)}#W=[];#O=!1;#H(t){this.#O=!1;let e=this.#W.slice();this.#W.length=0,e.forEach(s=>s(null,t))}readdirCB(t,e=!1){if(!this.canReaddir()){e?t(null,[]):queueMicrotask(()=>t(null,[]));return}let s=this.children();if(this.calledReaddir()){let r=s.slice(0,s.provisional);e?t(null,r):queueMicrotask(()=>t(null,r));return}if(this.#W.push(t),this.#O)return;this.#O=!0;let i=this.fullpath();this.#t.readdir(i,{withFileTypes:!0},(r,o)=>{if(r)this.#I(r.code),s.provisional=0;else{for(let h of o)this.#z(h,s);this.#j(s)}this.#H(s.slice(0,s.provisional))})}#q;async readdir(){if(!this.canReaddir())return[];let t=this.children();if(this.calledReaddir())return t.slice(0,t.provisional);let e=this.fullpath();if(this.#q)await this.#q;else{let s=()=>{};this.#q=new Promise(i=>s=i);try{for(let i of await this.#t.promises.readdir(e,{withFileTypes:!0}))this.#z(i,t);this.#j(t)}catch(i){this.#I(i.code),t.provisional=0}this.#q=void 0,s()}return t.slice(0,t.provisional)}readdirSync(){if(!this.canReaddir())return[];let t=this.children();if(this.calledReaddir())return t.slice(0,t.provisional);let e=this.fullpath();try{for(let s of this.#t.readdirSync(e,{withFileTypes:!0}))this.#z(s,t);this.#j(t)}catch(s){this.#I(s.code),t.provisional=0}return t.slice(0,t.provisional)}canReaddir(){if(this.#e&Ie)return!1;let t=_&this.#e;return t===L||t===U||t===X}shouldWalk(t,e){return(this.#e&U)===U&&!(this.#e&Ie)&&!t.has(this)&&(!e||e(this))}async realpath(){if(this.#k)return this.#k;if(!((Lt|Nt|j)&this.#e))try{let t=await this.#t.promises.realpath(this.fullpath());return this.#k=this.resolve(t)}catch{this.#P()}}realpathSync(){if(this.#k)return this.#k;if(!((Lt|Nt|j)&this.#e))try{let t=this.#t.realpathSync(this.fullpath());return this.#k=this.resolve(t)}catch{this.#P()}}[Ye](t){if(t===this)return;t.isCWD=!1,this.isCWD=!0;let e=new Set([]),s=[],i=this;for(;i&&i.parent;)e.add(i),i.#x=s.join(this.sep),i.#A=s.join(\"/\"),i=i.parent,s.push(\"..\");for(i=t;i&&i.parent&&!e.has(i);)i.#x=void 0,i.#A=void 0,i=i.parent}},Pt=class n extends R{sep=\"\\\\\";splitSep=Oi;constructor(t,e=L,s,i,r,o,h){super(t,e,s,i,r,o,h)}newChild(t,e=L,s={}){return new n(t,e,this.root,this.roots,this.nocase,this.childrenCache(),s)}getRootString(t){return re.parse(t).root}getRoot(t){if(t=Ri(t.toUpperCase()),t===this.root.name)return this.root;for(let[e,s]of Object.entries(this.roots))if(this.sameRoot(t,e))return this.roots[t]=s;return this.roots[t]=new it(t,this).root}sameRoot(t,e=this.root.name){return t=t.toUpperCase().replace(/\\//g,\"\\\\\").replace($e,\"$1\\\\\"),t===e}},jt=class n extends R{splitSep=\"/\";sep=\"/\";constructor(t,e=L,s,i,r,o,h){super(t,e,s,i,r,o,h)}getRootString(t){return t.startsWith(\"/\")?\"/\":\"\"}getRoot(t){return this.root}newChild(t,e=L,s={}){return new n(t,e,this.root,this.roots,this.nocase,this.childrenCache(),s)}},It=class{root;rootPath;roots;cwd;#t;#s;#n;nocase;#r;constructor(t=process.cwd(),e,s,{nocase:i,childrenCacheSize:r=16*1024,fs:o=wt}={}){this.#r=Ue(o),(t instanceof URL||t.startsWith(\"file://\"))&&(t=gi(t));let h=e.resolve(t);this.roots=Object.create(null),this.rootPath=this.parseRootPath(h),this.#t=new Wt,this.#s=new Wt,this.#n=new ne(r);let a=h.substring(this.rootPath.length).split(s);if(a.length===1&&!a[0]&&a.pop(),i===void 0)throw new TypeError(\"must provide nocase setting to PathScurryBase ctor\");this.nocase=i,this.root=this.newRoot(this.#r),this.roots[this.rootPath]=this.root;let l=this.root,u=a.length-1,c=e.sep,d=this.rootPath,f=!1;for(let m of a){let p=u--;l=l.child(m,{relative:new Array(p).fill(\"..\").join(c),relativePosix:new Array(p).fill(\"..\").join(\"/\"),fullpath:d+=(f?\"\":c)+m}),f=!0}this.cwd=l}depth(t=this.cwd){return typeof t==\"string\"&&(t=this.cwd.resolve(t)),t.depth()}childrenCache(){return this.#n}resolve(...t){let e=\"\";for(let r=t.length-1;r>=0;r--){let o=t[r];if(!(!o||o===\".\")&&(e=e?`${o}/${e}`:o,this.isAbsolute(o)))break}let s=this.#t.get(e);if(s!==void 0)return s;let i=this.cwd.resolve(e).fullpath();return this.#t.set(e,i),i}resolvePosix(...t){let e=\"\";for(let r=t.length-1;r>=0;r--){let o=t[r];if(!(!o||o===\".\")&&(e=e?`${o}/${e}`:o,this.isAbsolute(o)))break}let s=this.#s.get(e);if(s!==void 0)return s;let i=this.cwd.resolve(e).fullpathPosix();return this.#s.set(e,i),i}relative(t=this.cwd){return typeof t==\"string\"&&(t=this.cwd.resolve(t)),t.relative()}relativePosix(t=this.cwd){return typeof t==\"string\"&&(t=this.cwd.resolve(t)),t.relativePosix()}basename(t=this.cwd){return typeof t==\"string\"&&(t=this.cwd.resolve(t)),t.name}dirname(t=this.cwd){return typeof t==\"string\"&&(t=this.cwd.resolve(t)),(t.parent||t).fullpath()}async readdir(t=this.cwd,e={withFileTypes:!0}){typeof t==\"string\"?t=this.cwd.resolve(t):t instanceof R||(e=t,t=this.cwd);let{withFileTypes:s}=e;if(t.canReaddir()){let i=await t.readdir();return s?i:i.map(r=>r.name)}else return[]}readdirSync(t=this.cwd,e={withFileTypes:!0}){typeof t==\"string\"?t=this.cwd.resolve(t):t instanceof R||(e=t,t=this.cwd);let{withFileTypes:s=!0}=e;return t.canReaddir()?s?t.readdirSync():t.readdirSync().map(i=>i.name):[]}async lstat(t=this.cwd){return typeof t==\"string\"&&(t=this.cwd.resolve(t)),t.lstat()}lstatSync(t=this.cwd){return typeof t==\"string\"&&(t=this.cwd.resolve(t)),t.lstatSync()}async readlink(t=this.cwd,{withFileTypes:e}={withFileTypes:!1}){typeof t==\"string\"?t=this.cwd.resolve(t):t instanceof R||(e=t.withFileTypes,t=this.cwd);let s=await t.readlink();return e?s:s?.fullpath()}readlinkSync(t=this.cwd,{withFileTypes:e}={withFileTypes:!1}){typeof t==\"string\"?t=this.cwd.resolve(t):t instanceof R||(e=t.withFileTypes,t=this.cwd);let s=t.readlinkSync();return e?s:s?.fullpath()}async realpath(t=this.cwd,{withFileTypes:e}={withFileTypes:!1}){typeof t==\"string\"?t=this.cwd.resolve(t):t instanceof R||(e=t.withFileTypes,t=this.cwd);let s=await t.realpath();return e?s:s?.fullpath()}realpathSync(t=this.cwd,{withFileTypes:e}={withFileTypes:!1}){typeof t==\"string\"?t=this.cwd.resolve(t):t instanceof R||(e=t.withFileTypes,t=this.cwd);let s=t.realpathSync();return e?s:s?.fullpath()}async walk(t=this.cwd,e={}){typeof t==\"string\"?t=this.cwd.resolve(t):t instanceof R||(e=t,t=this.cwd);let{withFileTypes:s=!0,follow:i=!1,filter:r,walkFilter:o}=e,h=[];(!r||r(t))&&h.push(s?t:t.fullpath());let a=new Set,l=(c,d)=>{a.add(c),c.readdirCB((f,m)=>{if(f)return d(f);let p=m.length;if(!p)return d();let w=()=>{--p===0&&d()};for(let g of m)(!r||r(g))&&h.push(s?g:g.fullpath()),i&&g.isSymbolicLink()?g.realpath().then(S=>S?.isUnknown()?S.lstat():S).then(S=>S?.shouldWalk(a,o)?l(S,w):w()):g.shouldWalk(a,o)?l(g,w):w()},!0)},u=t;return new Promise((c,d)=>{l(u,f=>{if(f)return d(f);c(h)})})}walkSync(t=this.cwd,e={}){typeof t==\"string\"?t=this.cwd.resolve(t):t instanceof R||(e=t,t=this.cwd);let{withFileTypes:s=!0,follow:i=!1,filter:r,walkFilter:o}=e,h=[];(!r||r(t))&&h.push(s?t:t.fullpath());let a=new Set([t]);for(let l of a){let u=l.readdirSync();for(let c of u){(!r||r(c))&&h.push(s?c:c.fullpath());let d=c;if(c.isSymbolicLink()){if(!(i&&(d=c.realpathSync())))continue;d.isUnknown()&&d.lstatSync()}d.shouldWalk(a,o)&&a.add(d)}}return h}[Symbol.asyncIterator](){return this.iterate()}iterate(t=this.cwd,e={}){return typeof t==\"string\"?t=this.cwd.resolve(t):t instanceof R||(e=t,t=this.cwd),this.stream(t,e)[Symbol.asyncIterator]()}[Symbol.iterator](){return this.iterateSync()}*iterateSync(t=this.cwd,e={}){typeof t==\"string\"?t=this.cwd.resolve(t):t instanceof R||(e=t,t=this.cwd);let{withFileTypes:s=!0,follow:i=!1,filter:r,walkFilter:o}=e;(!r||r(t))&&(yield s?t:t.fullpath());let h=new Set([t]);for(let a of h){let l=a.readdirSync();for(let u of l){(!r||r(u))&&(yield s?u:u.fullpath());let c=u;if(u.isSymbolicLink()){if(!(i&&(c=u.realpathSync())))continue;c.isUnknown()&&c.lstatSync()}c.shouldWalk(h,o)&&h.add(c)}}}stream(t=this.cwd,e={}){typeof t==\"string\"?t=this.cwd.resolve(t):t instanceof R||(e=t,t=this.cwd);let{withFileTypes:s=!0,follow:i=!1,filter:r,walkFilter:o}=e,h=new V({objectMode:!0});(!r||r(t))&&h.write(s?t:t.fullpath());let a=new Set,l=[t],u=0,c=()=>{let d=!1;for(;!d;){let f=l.shift();if(!f){u===0&&h.end();return}u++,a.add(f);let m=(w,g,S=!1)=>{if(w)return h.emit(\"error\",w);if(i&&!S){let E=[];for(let y of g)y.isSymbolicLink()&&E.push(y.realpath().then(b=>b?.isUnknown()?b.lstat():b));if(E.length){Promise.all(E).then(()=>m(null,g,!0));return}}for(let E of g)E&&(!r||r(E))&&(h.write(s?E:E.fullpath())||(d=!0));u--;for(let E of g){let y=E.realpathCached()||E;y.shouldWalk(a,o)&&l.push(y)}d&&!h.flowing?h.once(\"drain\",c):p||c()},p=!0;f.readdirCB(m,!0),p=!1}};return c(),h}streamSync(t=this.cwd,e={}){typeof t==\"string\"?t=this.cwd.resolve(t):t instanceof R||(e=t,t=this.cwd);let{withFileTypes:s=!0,follow:i=!1,filter:r,walkFilter:o}=e,h=new V({objectMode:!0}),a=new Set;(!r||r(t))&&h.write(s?t:t.fullpath());let l=[t],u=0,c=()=>{let d=!1;for(;!d;){let f=l.shift();if(!f){u===0&&h.end();return}u++,a.add(f);let m=f.readdirSync();for(let p of m)(!r||r(p))&&(h.write(s?p:p.fullpath())||(d=!0));u--;for(let p of m){let w=p;if(p.isSymbolicLink()){if(!(i&&(w=p.realpathSync())))continue;w.isUnknown()&&w.lstatSync()}w.shouldWalk(a,o)&&l.push(w)}}d&&!h.flowing&&h.once(\"drain\",c)};return c(),h}chdir(t=this.cwd){let e=this.cwd;this.cwd=typeof t==\"string\"?this.cwd.resolve(t):t,this.cwd[Ye](e)}},it=class extends It{sep=\"\\\\\";constructor(t=process.cwd(),e={}){let{nocase:s=!0}=e;super(t,re,\"\\\\\",{...e,nocase:s}),this.nocase=s;for(let i=this.cwd;i;i=i.parent)i.nocase=this.nocase}parseRootPath(t){return re.parse(t).root.toUpperCase()}newRoot(t){return new Pt(this.rootPath,U,void 0,this.roots,this.nocase,this.childrenCache(),{fs:t})}isAbsolute(t){return t.startsWith(\"/\")||t.startsWith(\"\\\\\")||/^[a-z]:(\\/|\\\\)/i.test(t)}},rt=class extends It{sep=\"/\";constructor(t=process.cwd(),e={}){let{nocase:s=!1}=e;super(t,mi,\"/\",{...e,nocase:s}),this.nocase=s}parseRootPath(t){return\"/\"}newRoot(t){return new jt(this.rootPath,U,void 0,this.roots,this.nocase,this.childrenCache(),{fs:t})}isAbsolute(t){return t.startsWith(\"/\")}},St=class extends rt{constructor(t=process.cwd(),e={}){let{nocase:s=!0}=e;super(t,{...e,nocase:s})}},Cr=process.platform===\"win32\"?Pt:jt,Xe=process.platform===\"win32\"?it:process.platform===\"darwin\"?St:rt;var Di=n=>n.length>=1,Mi=n=>n.length>=1,Ni=Symbol.for(\"nodejs.util.inspect.custom\"),nt=class n{#t;#s;#n;length;#r;#o;#S;#w;#c;#h;#u=!0;constructor(t,e,s,i){if(!Di(t))throw new TypeError(\"empty pattern list\");if(!Mi(e))throw new TypeError(\"empty glob list\");if(e.length!==t.length)throw new TypeError(\"mismatched pattern list and glob list lengths\");if(this.length=t.length,s<0||s>=this.length)throw new TypeError(\"index out of range\");if(this.#t=t,this.#s=e,this.#n=s,this.#r=i,this.#n===0){if(this.isUNC()){let[r,o,h,a,...l]=this.#t,[u,c,d,f,...m]=this.#s;l[0]===\"\"&&(l.shift(),m.shift());let p=[r,o,h,a,\"\"].join(\"/\"),w=[u,c,d,f,\"\"].join(\"/\");this.#t=[p,...l],this.#s=[w,...m],this.length=this.#t.length}else if(this.isDrive()||this.isAbsolute()){let[r,...o]=this.#t,[h,...a]=this.#s;o[0]===\"\"&&(o.shift(),a.shift());let l=r+\"/\",u=h+\"/\";this.#t=[l,...o],this.#s=[u,...a],this.length=this.#t.length}}}[Ni](){return\"Pattern <\"+this.#s.slice(this.#n).join(\"/\")+\">\"}pattern(){return this.#t[this.#n]}isString(){return typeof this.#t[this.#n]==\"string\"}isGlobstar(){return this.#t[this.#n]===A}isRegExp(){return this.#t[this.#n]instanceof RegExp}globString(){return this.#S=this.#S||(this.#n===0?this.isAbsolute()?this.#s[0]+this.#s.slice(1).join(\"/\"):this.#s.join(\"/\"):this.#s.slice(this.#n).join(\"/\"))}hasMore(){return this.length>this.#n+1}rest(){return this.#o!==void 0?this.#o:this.hasMore()?(this.#o=new n(this.#t,this.#s,this.#n+1,this.#r),this.#o.#h=this.#h,this.#o.#c=this.#c,this.#o.#w=this.#w,this.#o):this.#o=null}isUNC(){let t=this.#t;return this.#c!==void 0?this.#c:this.#c=this.#r===\"win32\"&&this.#n===0&&t[0]===\"\"&&t[1]===\"\"&&typeof t[2]==\"string\"&&!!t[2]&&typeof t[3]==\"string\"&&!!t[3]}isDrive(){let t=this.#t;return this.#w!==void 0?this.#w:this.#w=this.#r===\"win32\"&&this.#n===0&&this.length>1&&typeof t[0]==\"string\"&&/^[a-z]:$/i.test(t[0])}isAbsolute(){let t=this.#t;return this.#h!==void 0?this.#h:this.#h=t[0]===\"\"&&t.length>1||this.isDrive()||this.isUNC()}root(){let t=this.#t[0];return typeof t==\"string\"&&this.isAbsolute()&&this.#n===0?t:\"\"}checkFollowGlobstar(){return!(this.#n===0||!this.isGlobstar()||!this.#u)}markFollowGlobstar(){return this.#n===0||!this.isGlobstar()||!this.#u?!1:(this.#u=!1,!0)}};var _i=typeof process==\"object\"&&process&&typeof process.platform==\"string\"?process.platform:\"linux\",ot=class{relative;relativeChildren;absolute;absoluteChildren;platform;mmopts;constructor(t,{nobrace:e,nocase:s,noext:i,noglobstar:r,platform:o=_i}){this.relative=[],this.absolute=[],this.relativeChildren=[],this.absoluteChildren=[],this.platform=o,this.mmopts={dot:!0,nobrace:e,nocase:s,noext:i,noglobstar:r,optimizationLevel:2,platform:o,nocomment:!0,nonegate:!0};for(let h of t)this.add(h)}add(t){let e=new D(t,this.mmopts);for(let s=0;s<e.set.length;s++){let i=e.set[s],r=e.globParts[s];if(!i||!r)throw new Error(\"invalid pattern object\");for(;i[0]===\".\"&&r[0]===\".\";)i.shift(),r.shift();let o=new nt(i,r,0,this.platform),h=new D(o.globString(),this.mmopts),a=r[r.length-1]===\"**\",l=o.isAbsolute();l?this.absolute.push(h):this.relative.push(h),a&&(l?this.absoluteChildren.push(h):this.relativeChildren.push(h))}}ignored(t){let e=t.fullpath(),s=`${e}/`,i=t.relative()||\".\",r=`${i}/`;for(let o of this.relative)if(o.match(i)||o.match(r))return!0;for(let o of this.absolute)if(o.match(e)||o.match(s))return!0;return!1}childrenIgnored(t){let e=t.fullpath()+\"/\",s=(t.relative()||\".\")+\"/\";for(let i of this.relativeChildren)if(i.match(s))return!0;for(let i of this.absoluteChildren)if(i.match(e))return!0;return!1}};var oe=class n{store;constructor(t=new Map){this.store=t}copy(){return new n(new Map(this.store))}hasWalked(t,e){return this.store.get(t.fullpath())?.has(e.globString())}storeWalked(t,e){let s=t.fullpath(),i=this.store.get(s);i?i.add(e.globString()):this.store.set(s,new Set([e.globString()]))}},he=class{store=new Map;add(t,e,s){let i=(e?2:0)|(s?1:0),r=this.store.get(t);this.store.set(t,r===void 0?i:i&r)}entries(){return[...this.store.entries()].map(([t,e])=>[t,!!(e&2),!!(e&1)])}},ae=class{store=new Map;add(t,e){if(!t.canReaddir())return;let s=this.store.get(t);s?s.find(i=>i.globString()===e.globString())||s.push(e):this.store.set(t,[e])}get(t){let e=this.store.get(t);if(!e)throw new Error(\"attempting to walk unknown path\");return e}entries(){return this.keys().map(t=>[t,this.store.get(t)])}keys(){return[...this.store.keys()].filter(t=>t.canReaddir())}},Et=class n{hasWalkedCache;matches=new he;subwalks=new ae;patterns;follow;dot;opts;constructor(t,e){this.opts=t,this.follow=!!t.follow,this.dot=!!t.dot,this.hasWalkedCache=e?e.copy():new oe}processPatterns(t,e){this.patterns=e;let s=e.map(i=>[t,i]);for(let[i,r]of s){this.hasWalkedCache.storeWalked(i,r);let o=r.root(),h=r.isAbsolute()&&this.opts.absolute!==!1;if(o){i=i.resolve(o===\"/\"&&this.opts.root!==void 0?this.opts.root:o);let c=r.rest();if(c)r=c;else{this.matches.add(i,!0,!1);continue}}if(i.isENOENT())continue;let a,l,u=!1;for(;typeof(a=r.pattern())==\"string\"&&(l=r.rest());)i=i.resolve(a),r=l,u=!0;if(a=r.pattern(),l=r.rest(),u){if(this.hasWalkedCache.hasWalked(i,r))continue;this.hasWalkedCache.storeWalked(i,r)}if(typeof a==\"string\"){let c=a===\"..\"||a===\"\"||a===\".\";this.matches.add(i.resolve(a),h,c);continue}else if(a===A){(!i.isSymbolicLink()||this.follow||r.checkFollowGlobstar())&&this.subwalks.add(i,r);let c=l?.pattern(),d=l?.rest();if(!l||(c===\"\"||c===\".\")&&!d)this.matches.add(i,h,c===\"\"||c===\".\");else if(c===\"..\"){let f=i.parent||i;d?this.hasWalkedCache.hasWalked(f,d)||this.subwalks.add(f,d):this.matches.add(f,h,!0)}}else a instanceof RegExp&&this.subwalks.add(i,r)}return this}subwalkTargets(){return this.subwalks.keys()}child(){return new n(this.opts,this.hasWalkedCache)}filterEntries(t,e){let s=this.subwalks.get(t),i=this.child();for(let r of e)for(let o of s){let h=o.isAbsolute(),a=o.pattern(),l=o.rest();a===A?i.testGlobstar(r,o,l,h):a instanceof RegExp?i.testRegExp(r,a,l,h):i.testString(r,a,l,h)}return i}testGlobstar(t,e,s,i){if((this.dot||!t.name.startsWith(\".\"))&&(e.hasMore()||this.matches.add(t,i,!1),t.canReaddir()&&(this.follow||!t.isSymbolicLink()?this.subwalks.add(t,e):t.isSymbolicLink()&&(s&&e.checkFollowGlobstar()?this.subwalks.add(t,s):e.markFollowGlobstar()&&this.subwalks.add(t,e)))),s){let r=s.pattern();if(typeof r==\"string\"&&r!==\"..\"&&r!==\"\"&&r!==\".\")this.testString(t,r,s.rest(),i);else if(r===\"..\"){let o=t.parent||t;this.subwalks.add(o,s)}else r instanceof RegExp&&this.testRegExp(t,r,s.rest(),i)}}testRegExp(t,e,s,i){e.test(t.name)&&(s?this.subwalks.add(t,s):this.matches.add(t,i,!1))}testString(t,e,s,i){t.isNamed(e)&&(s?this.subwalks.add(t,s):this.matches.add(t,i,!1))}};var Li=(n,t)=>typeof n==\"string\"?new ot([n],t):Array.isArray(n)?new ot(n,t):n,zt=class{path;patterns;opts;seen=new Set;paused=!1;aborted=!1;#t=[];#s;#n;signal;maxDepth;includeChildMatches;constructor(t,e,s){if(this.patterns=t,this.path=e,this.opts=s,this.#n=!s.posix&&s.platform===\"win32\"?\"\\\\\":\"/\",this.includeChildMatches=s.includeChildMatches!==!1,(s.ignore||!this.includeChildMatches)&&(this.#s=Li(s.ignore??[],s),!this.includeChildMatches&&typeof this.#s.add!=\"function\")){let i=\"cannot ignore child matches, ignore lacks add() method.\";throw new Error(i)}this.maxDepth=s.maxDepth||1/0,s.signal&&(this.signal=s.signal,this.signal.addEventListener(\"abort\",()=>{this.#t.length=0}))}#r(t){return this.seen.has(t)||!!this.#s?.ignored?.(t)}#o(t){return!!this.#s?.childrenIgnored?.(t)}pause(){this.paused=!0}resume(){if(this.signal?.aborted)return;this.paused=!1;let t;for(;!this.paused&&(t=this.#t.shift());)t()}onResume(t){this.signal?.aborted||(this.paused?this.#t.push(t):t())}async matchCheck(t,e){if(e&&this.opts.nodir)return;let s;if(this.opts.realpath){if(s=t.realpathCached()||await t.realpath(),!s)return;t=s}let r=t.isUnknown()||this.opts.stat?await t.lstat():t;if(this.opts.follow&&this.opts.nodir&&r?.isSymbolicLink()){let o=await r.realpath();o&&(o.isUnknown()||this.opts.stat)&&await o.lstat()}return this.matchCheckTest(r,e)}matchCheckTest(t,e){return t&&(this.maxDepth===1/0||t.depth()<=this.maxDepth)&&(!e||t.canReaddir())&&(!this.opts.nodir||!t.isDirectory())&&(!this.opts.nodir||!this.opts.follow||!t.isSymbolicLink()||!t.realpathCached()?.isDirectory())&&!this.#r(t)?t:void 0}matchCheckSync(t,e){if(e&&this.opts.nodir)return;let s;if(this.opts.realpath){if(s=t.realpathCached()||t.realpathSync(),!s)return;t=s}let r=t.isUnknown()||this.opts.stat?t.lstatSync():t;if(this.opts.follow&&this.opts.nodir&&r?.isSymbolicLink()){let o=r.realpathSync();o&&(o?.isUnknown()||this.opts.stat)&&o.lstatSync()}return this.matchCheckTest(r,e)}matchFinish(t,e){if(this.#r(t))return;if(!this.includeChildMatches&&this.#s?.add){let r=`${t.relativePosix()}/**`;this.#s.add(r)}let s=this.opts.absolute===void 0?e:this.opts.absolute;this.seen.add(t);let i=this.opts.mark&&t.isDirectory()?this.#n:\"\";if(this.opts.withFileTypes)this.matchEmit(t);else if(s){let r=this.opts.posix?t.fullpathPosix():t.fullpath();this.matchEmit(r+i)}else{let r=this.opts.posix?t.relativePosix():t.relative(),o=this.opts.dotRelative&&!r.startsWith(\"..\"+this.#n)?\".\"+this.#n:\"\";this.matchEmit(r?o+r+i:\".\"+i)}}async match(t,e,s){let i=await this.matchCheck(t,s);i&&this.matchFinish(i,e)}matchSync(t,e,s){let i=this.matchCheckSync(t,s);i&&this.matchFinish(i,e)}walkCB(t,e,s){this.signal?.aborted&&s(),this.walkCB2(t,e,new Et(this.opts),s)}walkCB2(t,e,s,i){if(this.#o(t))return i();if(this.signal?.aborted&&i(),this.paused){this.onResume(()=>this.walkCB2(t,e,s,i));return}s.processPatterns(t,e);let r=1,o=()=>{--r===0&&i()};for(let[h,a,l]of s.matches.entries())this.#r(h)||(r++,this.match(h,a,l).then(()=>o()));for(let h of s.subwalkTargets()){if(this.maxDepth!==1/0&&h.depth()>=this.maxDepth)continue;r++;let a=h.readdirCached();h.calledReaddir()?this.walkCB3(h,a,s,o):h.readdirCB((l,u)=>this.walkCB3(h,u,s,o),!0)}o()}walkCB3(t,e,s,i){s=s.filterEntries(t,e);let r=1,o=()=>{--r===0&&i()};for(let[h,a,l]of s.matches.entries())this.#r(h)||(r++,this.match(h,a,l).then(()=>o()));for(let[h,a]of s.subwalks.entries())r++,this.walkCB2(h,a,s.child(),o);o()}walkCBSync(t,e,s){this.signal?.aborted&&s(),this.walkCB2Sync(t,e,new Et(this.opts),s)}walkCB2Sync(t,e,s,i){if(this.#o(t))return i();if(this.signal?.aborted&&i(),this.paused){this.onResume(()=>this.walkCB2Sync(t,e,s,i));return}s.processPatterns(t,e);let r=1,o=()=>{--r===0&&i()};for(let[h,a,l]of s.matches.entries())this.#r(h)||this.matchSync(h,a,l);for(let h of s.subwalkTargets()){if(this.maxDepth!==1/0&&h.depth()>=this.maxDepth)continue;r++;let a=h.readdirSync();this.walkCB3Sync(h,a,s,o)}o()}walkCB3Sync(t,e,s,i){s=s.filterEntries(t,e);let r=1,o=()=>{--r===0&&i()};for(let[h,a,l]of s.matches.entries())this.#r(h)||this.matchSync(h,a,l);for(let[h,a]of s.subwalks.entries())r++,this.walkCB2Sync(h,a,s.child(),o);o()}},xt=class extends zt{matches=new Set;constructor(t,e,s){super(t,e,s)}matchEmit(t){this.matches.add(t)}async walk(){if(this.signal?.aborted)throw this.signal.reason;return this.path.isUnknown()&&await this.path.lstat(),await new Promise((t,e)=>{this.walkCB(this.path,this.patterns,()=>{this.signal?.aborted?e(this.signal.reason):t(this.matches)})}),this.matches}walkSync(){if(this.signal?.aborted)throw this.signal.reason;return this.path.isUnknown()&&this.path.lstatSync(),this.walkCBSync(this.path,this.patterns,()=>{if(this.signal?.aborted)throw this.signal.reason}),this.matches}},vt=class extends zt{results;constructor(t,e,s){super(t,e,s),this.results=new V({signal:this.signal,objectMode:!0}),this.results.on(\"drain\",()=>this.resume()),this.results.on(\"resume\",()=>this.resume())}matchEmit(t){this.results.write(t),this.results.flowing||this.pause()}stream(){let t=this.path;return t.isUnknown()?t.lstat().then(()=>{this.walkCB(t,this.patterns,()=>this.results.end())}):this.walkCB(t,this.patterns,()=>this.results.end()),this.results}streamSync(){return this.path.isUnknown()&&this.path.lstatSync(),this.walkCBSync(this.path,this.patterns,()=>this.results.end()),this.results}};var Pi=typeof process==\"object\"&&process&&typeof process.platform==\"string\"?process.platform:\"linux\",I=class{absolute;cwd;root;dot;dotRelative;follow;ignore;magicalBraces;mark;matchBase;maxDepth;nobrace;nocase;nodir;noext;noglobstar;pattern;platform;realpath;scurry;stat;signal;windowsPathsNoEscape;withFileTypes;includeChildMatches;opts;patterns;constructor(t,e){if(!e)throw new TypeError(\"glob options required\");if(this.withFileTypes=!!e.withFileTypes,this.signal=e.signal,this.follow=!!e.follow,this.dot=!!e.dot,this.dotRelative=!!e.dotRelative,this.nodir=!!e.nodir,this.mark=!!e.mark,e.cwd?(e.cwd instanceof URL||e.cwd.startsWith(\"file://\"))&&(e.cwd=Wi(e.cwd)):this.cwd=\"\",this.cwd=e.cwd||\"\",this.root=e.root,this.magicalBraces=!!e.magicalBraces,this.nobrace=!!e.nobrace,this.noext=!!e.noext,this.realpath=!!e.realpath,this.absolute=e.absolute,this.includeChildMatches=e.includeChildMatches!==!1,this.noglobstar=!!e.noglobstar,this.matchBase=!!e.matchBase,this.maxDepth=typeof e.maxDepth==\"number\"?e.maxDepth:1/0,this.stat=!!e.stat,this.ignore=e.ignore,this.withFileTypes&&this.absolute!==void 0)throw new Error(\"cannot set absolute and withFileTypes:true\");if(typeof t==\"string\"&&(t=[t]),this.windowsPathsNoEscape=!!e.windowsPathsNoEscape||e.allowWindowsEscape===!1,this.windowsPathsNoEscape&&(t=t.map(a=>a.replace(/\\\\/g,\"/\"))),this.matchBase){if(e.noglobstar)throw new TypeError(\"base matching requires globstar\");t=t.map(a=>a.includes(\"/\")?a:`./**/${a}`)}if(this.pattern=t,this.platform=e.platform||Pi,this.opts={...e,platform:this.platform},e.scurry){if(this.scurry=e.scurry,e.nocase!==void 0&&e.nocase!==e.scurry.nocase)throw new Error(\"nocase option contradicts provided scurry option\")}else{let a=e.platform===\"win32\"?it:e.platform===\"darwin\"?St:e.platform?rt:Xe;this.scurry=new a(this.cwd,{nocase:e.nocase,fs:e.fs})}this.nocase=this.scurry.nocase;let s=this.platform===\"darwin\"||this.platform===\"win32\",i={braceExpandMax:1e4,...e,dot:this.dot,matchBase:this.matchBase,nobrace:this.nobrace,nocase:this.nocase,nocaseMagicOnly:s,nocomment:!0,noext:this.noext,nonegate:!0,optimizationLevel:2,platform:this.platform,windowsPathsNoEscape:this.windowsPathsNoEscape,debug:!!this.opts.debug},r=this.pattern.map(a=>new D(a,i)),[o,h]=r.reduce((a,l)=>(a[0].push(...l.set),a[1].push(...l.globParts),a),[[],[]]);this.patterns=o.map((a,l)=>{let u=h[l];if(!u)throw new Error(\"invalid pattern object\");return new nt(a,u,0,this.platform)})}async walk(){return[...await new xt(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).walk()]}walkSync(){return[...new xt(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).walkSync()]}stream(){return new vt(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).stream()}streamSync(){return new vt(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).streamSync()}iterateSync(){return this.streamSync()[Symbol.iterator]()}[Symbol.iterator](){return this.iterateSync()}iterate(){return this.stream()[Symbol.asyncIterator]()}[Symbol.asyncIterator](){return this.iterate()}};var le=(n,t={})=>{Array.isArray(n)||(n=[n]);for(let e of n)if(new D(e,t).hasMagic())return!0;return!1};function Bt(n,t={}){return new I(n,t).streamSync()}function Qe(n,t={}){return new I(n,t).stream()}function ts(n,t={}){return new I(n,t).walkSync()}async function Je(n,t={}){return new I(n,t).walk()}function Ut(n,t={}){return new I(n,t).iterateSync()}function es(n,t={}){return new I(n,t).iterate()}var ji=Bt,Ii=Object.assign(Qe,{sync:Bt}),zi=Ut,Bi=Object.assign(es,{sync:Ut}),Ui=Object.assign(ts,{stream:Bt,iterate:Ut}),Ze=Object.assign(Je,{glob:Je,globSync:ts,sync:Ui,globStream:Qe,stream:Ii,globStreamSync:Bt,streamSync:ji,globIterate:es,iterate:Bi,globIterateSync:Ut,iterateSync:zi,Glob:I,hasMagic:le,escape:tt,unescape:W});Ze.glob=Ze;export{I as Glob,ot as Ignore,tt as escape,Ze as glob,es as globIterate,Ut as globIterateSync,Qe as globStream,Bt as globStreamSync,ts as globSync,le as hasMagic,Bi as iterate,zi as iterateSync,Ii as stream,ji as streamSync,Ui as sync,W as unescape};\n//# sourceMappingURL=index.min.js.map\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { logger } from \"./logger.js\";\n\n/** Default time to wait for a contended lock before failing. */\nexport const DEFAULT_LOCK_TIMEOUT_MS = 60_000;\n/** A lock file older than this, or owned by a dead process, is treated as abandoned. */\nexport const DEFAULT_LOCK_STALE_MS = 30_000;\n/** Base polling interval for contended locks; it grows exponentially with jitter. */\nexport const DEFAULT_LOCK_POLL_INTERVAL_MS = 25;\n/** Upper bound for the polling interval, so a long wait stays responsive. */\nconst MAX_LOCK_POLL_INTERVAL_MS = 500;\n/** Upper bound for the automatic heartbeat interval, keeping it responsive. */\nconst MAX_LOCK_HEARTBEAT_INTERVAL_MS = 15_000;\n/** Default rename attempts used to absorb transient Windows file-lock errors. */\nconst DEFAULT_RENAME_RETRIES = 5;\n/**\n * A dead-looking lock is only reclaimed once it is at least this old. A single liveness\n * verdict (which can be wrong on Windows, where a live sibling may be reported as gone)\n * must never be enough to break a freshly created lock.\n */\nexport const DEFAULT_RECLAIM_GRACE_MS = 1_000;\n/** Create failures that mean \"the lock is there / being swapped\", not \"cannot lock\". */\nconst CONTENDED_CREATE_CODES = new Set([\"EPERM\", \"EACCES\", \"EBUSY\"]);\n/** Error codes raised when an antivirus, indexer or reader briefly holds a file. */\nconst TRANSIENT_RENAME_CODES = new Set([\"EBUSY\", \"EPERM\", \"EACCES\", \"ENOTEMPTY\"]);\n\nexport interface FileLockOptions {\n /** Milliseconds to keep retrying before failing. Defaults to 60s. */\n timeoutMs?: number;\n /** Milliseconds after which an unreleased lock is reclaimed. Defaults to 30s. */\n staleMs?: number;\n /** Minimum age before an abandoned-looking lock may be reclaimed. Defaults to 1s. */\n reclaimGraceMs?: number;\n /** Base backoff between acquisition attempts. Defaults to 25ms. */\n pollIntervalMs?: number;\n /** Human-readable owner description used in log messages. */\n label?: string;\n /**\n * Heartbeat interval in milliseconds to touch the lock file; defaults to staleMs / 4 (capped at 15s),\n * or disabled (0) when staleMs <= 0.\n */\n heartbeatIntervalMs?: number;\n}\n\nexport interface AtomicWriteOptions {\n /** Rename attempts before giving up. Defaults to 5. */\n retries?: number;\n}\n\ninterface LockMetadata {\n pid?: number;\n createdAt?: number;\n token?: string;\n}\n\n/** Blocks the current thread for a few milliseconds without any dependency. */\nfunction sleepSync(ms: number): void {\n const started = Date.now();\n const wait = new Int32Array(new SharedArrayBuffer(4));\n while (Date.now() - started < ms) {\n Atomics.wait(wait, 0, 0, Math.max(1, ms - (Date.now() - started)));\n }\n}\n\n/** Asynchronous sleep used between lock acquisition attempts. */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Returns whether a process id belongs to a live process. */\nfunction isProcessAlive(pid: unknown): boolean {\n if (typeof pid !== \"number\" || !Number.isInteger(pid) || pid <= 0) {\n return false;\n }\n if (pid === process.pid) {\n return true;\n }\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n return (err as NodeJS.ErrnoException)?.code === \"EPERM\";\n }\n}\n\n/** Reads the JSON metadata a lock owner wrote, returning null when it is unreadable. */\nfunction readLockMetadata(lockPath: string): LockMetadata | null {\n try {\n return JSON.parse(fs.readFileSync(lockPath, \"utf-8\")) as LockMetadata;\n } catch (err) {\n logger.debug(\n `[lock] Could not read lock metadata at ${lockPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n return null;\n }\n}\n\n/** Returns the most recent activity timestamp (createdAt or mtime) for a lock file. */\nfunction readLockActiveTime(lockPath: string, metadata?: LockMetadata | null): number | null {\n const meta = metadata !== undefined ? metadata : readLockMetadata(lockPath);\n let mtimeMs: number | null = null;\n try {\n mtimeMs = fs.statSync(lockPath).mtimeMs;\n } catch (err) {\n logger.debug(\n `[lock] Could not stat lock file ${lockPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n const createdAt = typeof meta?.createdAt === \"number\" ? meta.createdAt : null;\n if (createdAt !== null && mtimeMs !== null) {\n return Math.max(createdAt, mtimeMs);\n }\n return createdAt ?? mtimeMs;\n}\n\n/** Returns true when a lock was left behind by a dead owner or has expired. */\nexport function isLockStale(lockPath: string, staleMs: number = DEFAULT_LOCK_STALE_MS): boolean {\n const metadata = readLockMetadata(lockPath);\n if (typeof metadata?.pid === \"number\" && !isProcessAlive(metadata.pid)) {\n return true;\n }\n const activeTime = readLockActiveTime(lockPath, metadata);\n if (activeTime !== null) {\n return Date.now() - activeTime > staleMs;\n }\n return false;\n}\n\n/**\n * Atomically creates the lock file with `O_CREAT | O_EXCL` semantics, so exactly one\n * process wins the race. `fs.openSync(..., \"wx\")` is the cross-platform primitive used\n * instead of a dependency.\n */\nfunction tryCreateLockFile(lockPath: string, token: string): boolean {\n try {\n const fd = fs.openSync(lockPath, \"wx\");\n try {\n fs.writeSync(\n fd,\n JSON.stringify({ pid: process.pid, createdAt: Date.now(), token } satisfies LockMetadata),\n );\n } finally {\n fs.closeSync(fd);\n }\n return true;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException)?.code;\n if (code === \"EEXIST\") {\n return false;\n }\n // Windows reports EPERM/EACCES/EBUSY instead of EEXIST while another process is\n // deleting or swapping the lock file, so an existing path means contention.\n if (typeof code === \"string\" && CONTENDED_CREATE_CODES.has(code) && fs.existsSync(lockPath)) {\n logger.debug(\n `[lock] Creating ${lockPath} failed with ${code} while the lock exists; treating it as contention.`,\n );\n return false;\n }\n throw err;\n }\n}\n\n/** Returns the age of a lock file in milliseconds, from its metadata or its mtime. */\nfunction lockAgeMs(lockPath: string): number {\n const activeTime = readLockActiveTime(lockPath);\n if (activeTime !== null) {\n return Math.max(0, Date.now() - activeTime);\n }\n return Number.POSITIVE_INFINITY;\n}\n\n/** Confirms that a lock file still carries the token written by this process. */\nfunction ownsLockFile(lockPath: string, token: string): boolean {\n return readLockMetadata(lockPath)?.token === token;\n}\n\n/**\n * Deletes an abandoned lock, but only when the owner token is still the one the staleness\n * decision was based on: without that check a lock created by another process between the\n * check and the unlink would be removed, letting two processes into the critical section.\n */\nfunction reclaimAbandonedLock(lockPath: string, staleMs: number, label: string): boolean {\n const observed = readLockMetadata(lockPath);\n const observedToken = observed?.token ?? null;\n if (!isLockStale(lockPath, staleMs)) {\n return false;\n }\n if ((readLockMetadata(lockPath)?.token ?? null) !== observedToken) {\n logger.debug(`[lock] ${label} lock at ${lockPath} changed owner; leaving it alone.`);\n return false;\n }\n const ageMs = Math.round(lockAgeMs(lockPath));\n const reason =\n typeof observed?.pid === \"number\" && !isProcessAlive(observed.pid)\n ? `owner pid ${observed.pid} is gone`\n : `expired after ${ageMs}ms`;\n try {\n fs.unlinkSync(lockPath);\n logger.warn(\n `[lock] Reclaimed abandoned ${label} lock at ${lockPath} (${reason}, token ${observedToken ?? \"none\"}).`,\n );\n return true;\n } catch (err) {\n logger.debug(\n `[lock] Could not remove stale ${label} lock: ${err instanceof Error ? err.message : String(err)}`,\n );\n return false;\n }\n}\n\n/** Backoff for the next acquisition attempt: exponential growth capped with jitter. */\nfunction nextPollDelay(attempt: number, baseMs: number): number {\n const exponential = Math.min(baseMs * 2 ** Math.min(attempt, 8), MAX_LOCK_POLL_INTERVAL_MS);\n return exponential + Math.floor(Math.random() * baseMs);\n}\n\n/**\n * Waits until the lock file can be created, reclaiming abandoned locks (dead owner or\n * older than `staleMs`) along the way. Throws once `timeoutMs` elapses.\n */\nasync function acquireFileLock(lockPath: string, options: FileLockOptions): Promise<string> {\n const timeoutMs = options.timeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS;\n const staleMs = options.staleMs ?? DEFAULT_LOCK_STALE_MS;\n const reclaimGraceMs = options.reclaimGraceMs ?? DEFAULT_RECLAIM_GRACE_MS;\n const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_LOCK_POLL_INTERVAL_MS;\n const label = options.label ?? path.basename(lockPath);\n const token = `${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n const deadline = Date.now() + timeoutMs;\n\n fs.mkdirSync(path.dirname(lockPath), { recursive: true });\n\n for (let attempt = 0; ; attempt++) {\n if (tryCreateLockFile(lockPath, token)) {\n if (ownsLockFile(lockPath, token)) {\n return token;\n }\n // Another process reclaimed our file in the microseconds after creation; back off\n // instead of entering the critical section without a lock we still own.\n logger.debug(`[lock] Lost the ${label} lock right after creating it; retrying.`);\n }\n if (isLockStale(lockPath, staleMs)) {\n // A stale-looking lock that is younger than the grace period is left alone: the\n // liveness verdict behind it may be transient, but the deadline below must still\n // be honoured so a waiter can never spin here past its timeout.\n if (lockAgeMs(lockPath) >= reclaimGraceMs && reclaimAbandonedLock(lockPath, staleMs, label)) {\n continue;\n }\n }\n if (Date.now() >= deadline) {\n throw new Error(\n `Timed out after ${timeoutMs}ms waiting for the ${label} lock at ${lockPath}. ` +\n `Another nanos-lint process may be running; delete the file if it is stale.`,\n );\n }\n await sleep(nextPollDelay(attempt, pollIntervalMs));\n }\n}\n\n/** Releases a lock only when the token still belongs to the current caller. */\nexport function releaseFileLock(lockPath: string, token: string): void {\n const metadata = readLockMetadata(lockPath);\n if (metadata?.token !== token) {\n logger.debug(`[lock] Lock at ${lockPath} is owned by another process; leaving it in place.`);\n return;\n }\n try {\n fs.unlinkSync(lockPath);\n } catch (err) {\n logger.debug(\n `[lock] Could not release lock at ${lockPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Refreshes the active timestamp of a lock file if the caller still owns it.\n * Uses `fs.utimesSync` non-destructively so it never overwrites another owner's lock metadata.\n */\nexport function touchLockFile(lockPath: string, token: string): boolean {\n const metadata = readLockMetadata(lockPath);\n if (metadata?.token !== token) {\n logger.debug(`[lock] Cannot touch lock at ${lockPath}: token mismatch or missing lock.`);\n return false;\n }\n try {\n const now = new Date();\n fs.utimesSync(lockPath, now, now);\n return true;\n } catch (err) {\n logger.debug(\n `[lock] Could not touch lock at ${lockPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n return false;\n }\n}\n\n/** Calculates the default heartbeat interval for a given staleness threshold. */\nfunction defaultHeartbeatInterval(staleMs: number): number {\n if (staleMs <= 0) {\n return 0;\n }\n return Math.min(Math.max(1, Math.floor(staleMs / 4)), MAX_LOCK_HEARTBEAT_INTERVAL_MS);\n}\n\n/**\n * Runs `task` while holding an exclusive cross-process lock at `lockPath`, releasing it\n * in a `finally` block. Concurrent callers queue with jittered exponential backoff, so\n * parallel CI jobs and monorepo linters sharing one cache serialize instead of racing.\n */\nexport async function withFileLock<T>(\n lockPath: string,\n task: () => T | Promise<T>,\n options: FileLockOptions = {},\n): Promise<T> {\n const staleMs = options.staleMs ?? DEFAULT_LOCK_STALE_MS;\n const label = options.label ?? path.basename(lockPath);\n const resolvedOptions: FileLockOptions = {\n ...options,\n staleMs,\n label,\n };\n const token = await acquireFileLock(lockPath, resolvedOptions);\n const heartbeatIntervalMs = options.heartbeatIntervalMs ?? defaultHeartbeatInterval(staleMs);\n let heartbeatTimer: NodeJS.Timeout | undefined;\n let hasWarnedFailure = false;\n\n if (heartbeatIntervalMs > 0) {\n heartbeatTimer = setInterval(() => {\n const metadata = readLockMetadata(lockPath);\n if (metadata?.token !== token) {\n if (heartbeatTimer !== undefined) {\n clearInterval(heartbeatTimer);\n heartbeatTimer = undefined;\n }\n logger.warn(`[lock] Lost ownership of ${label} lock at ${lockPath}; stopping heartbeat.`);\n return;\n }\n if (!touchLockFile(lockPath, token)) {\n if (!hasWarnedFailure) {\n hasWarnedFailure = true;\n logger.warn(\n `[lock] Failed to touch ${label} lock at ${lockPath}; heartbeat could not update timestamp.`,\n );\n }\n }\n }, heartbeatIntervalMs);\n heartbeatTimer.unref();\n }\n\n try {\n return await task();\n } finally {\n if (heartbeatTimer !== undefined) {\n clearInterval(heartbeatTimer);\n heartbeatTimer = undefined;\n }\n releaseFileLock(lockPath, token);\n }\n}\n\n/** Returns whether a failed rename is worth retrying on a busy file system. */\nfunction isTransientRenameError(err: unknown): boolean {\n const code = (err as NodeJS.ErrnoException)?.code;\n return typeof code === \"string\" && TRANSIENT_RENAME_CODES.has(code);\n}\n\n/** Renames with bounded retries so parallel readers do not break a replacement. */\nfunction renameWithRetrySync(tempPath: string, targetPath: string, retries: number): void {\n for (let attempt = 0; ; attempt++) {\n try {\n fs.renameSync(tempPath, targetPath);\n return;\n } catch (err) {\n if (attempt >= retries - 1 || !isTransientRenameError(err)) {\n throw err;\n }\n sleepSync(25 * (attempt + 1));\n }\n }\n}\n\n/** Removes a temporary file left behind by a failed atomic write. */\nfunction cleanupTempFile(tempPath: string): void {\n try {\n if (fs.existsSync(tempPath)) {\n fs.unlinkSync(tempPath);\n }\n } catch (err) {\n logger.debug(\n `[lock] Could not remove temporary file ${tempPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/** Builds a unique sibling temp path so concurrent writers never share a scratch file. */\nfunction buildTempPath(targetPath: string): string {\n const suffix = `${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n return path.join(path.dirname(targetPath), `.${path.basename(targetPath)}.${suffix}.tmp`);\n}\n\n/**\n * Replaces `targetPath` with `data` atomically: the payload is written to a unique\n * sibling file first and then renamed over the target, so a concurrent reader either\n * sees the previous complete file or the new complete file, never a truncated one.\n */\nexport function writeAtomicFileSync(\n targetPath: string,\n data: string | Uint8Array,\n options: AtomicWriteOptions = {},\n): void {\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n const tempPath = buildTempPath(targetPath);\n try {\n fs.writeFileSync(tempPath, data);\n renameWithRetrySync(tempPath, targetPath, options.retries ?? DEFAULT_RENAME_RETRIES);\n } catch (err) {\n cleanupTempFile(tempPath);\n throw err;\n }\n}\n\n/** Asynchronous counterpart of {@link writeAtomicFileSync} for awaited code paths. */\nexport async function writeAtomicFile(\n targetPath: string,\n data: string | Uint8Array,\n options: AtomicWriteOptions = {},\n): Promise<void> {\n await fs.promises.mkdir(path.dirname(targetPath), { recursive: true });\n const tempPath = buildTempPath(targetPath);\n const retries = options.retries ?? DEFAULT_RENAME_RETRIES;\n try {\n await fs.promises.writeFile(tempPath, data);\n for (let attempt = 0; ; attempt++) {\n try {\n await fs.promises.rename(tempPath, targetPath);\n return;\n } catch (err) {\n if (attempt >= retries - 1 || !isTransientRenameError(err)) {\n throw err;\n }\n await sleep(25 * (attempt + 1));\n }\n }\n } catch (err) {\n cleanupTempFile(tempPath);\n throw err;\n }\n}\n","import fs from \"node:fs\";\nimport { logger } from \"./logger.js\";\nimport { formatBytes } from \"./paths.js\";\n\n/** Minimum delay between two terminal redraws (about ten frames per second). */\nexport const PROGRESS_THROTTLE_MS = 100;\n/** Braille frames cycled while an indeterminate operation runs. */\nexport const SPINNER_FRAMES: readonly string[] = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n/** Fractions of a transfer logged as milestones when no terminal can be redrawn. */\nexport const PROGRESS_MILESTONES: readonly number[] = [0.25, 0.5, 0.75];\n\n/** Redraw policy: `auto` follows terminal detection, `off` forces log milestones. */\nexport type ProgressMode = \"auto\" | \"off\";\n\n/** Terminal stream receiving progress frames, mirroring the parts of `tty.WriteStream` used. */\nexport interface ProgressStream {\n write(chunk: string): unknown;\n columns?: number | undefined;\n isTTY?: boolean | undefined;\n}\n\n/** Options shared by progress bars and spinners. */\nexport interface ProgressOptions {\n label: string;\n total?: number | undefined;\n stream?: ProgressStream | undefined;\n interactive?: boolean | undefined;\n announce?: boolean | undefined;\n now?: (() => number) | undefined;\n throttleMs?: number | undefined;\n}\n\nexport type ProgressBarOptions = ProgressOptions;\n\n/** Handle to a running byte progress bar. */\nexport interface ProgressBarHandle {\n update(transferred: number, total?: number): void;\n finish(message?: string): void;\n fail(message?: string): void;\n}\n\n/** Handle to a running indeterminate spinner. */\nexport interface SpinnerHandle {\n start(): void;\n tick(): void;\n updateText(label: string): void;\n stop(message?: string): void;\n fail(message?: string): void;\n}\n\nconst CURSOR_HIDE = \"\\u001b[?25l\";\nconst CURSOR_SHOW = \"\\u001b[?25h\";\nconst CLEAR_LINE = \"\\r\\u001b[2K\";\nconst FRAME_TAIL = \" \";\nconst DEFAULT_COLUMNS = 80;\nconst MIN_BAR_WIDTH = 8;\nconst MAX_BAR_WIDTH = 28;\nconst TRUNCATION = \"...\";\n\ninterface RenderState {\n stream: ProgressStream;\n interactive: boolean;\n ownsProcessStderr: boolean;\n label: string;\n now: () => number;\n throttleMs: number;\n startedAt: number;\n lastFrameAt: number;\n active: boolean;\n}\n\nlet progressMode: ProgressMode = \"auto\";\nlet cursorHidden = false;\nlet guardsInstalled = false;\nlet activeDynamicRenders = 0;\n\n/** Sets the redraw policy used by every progress display created afterwards. */\nexport function setProgressMode(mode: ProgressMode): void {\n progressMode = mode;\n}\n\n/** Returns the current redraw policy. */\nexport function getProgressMode(): ProgressMode {\n return progressMode;\n}\n\n/** Returns whether an environment value is set to anything but an explicit false. */\nfunction isEnvFlagSet(value: string | undefined): boolean {\n if (value === undefined) {\n return false;\n }\n const normalized = value.trim().toLowerCase();\n return (\n normalized !== \"\" &&\n normalized !== \"0\" &&\n normalized !== \"false\" &&\n normalized !== \"no\" &&\n normalized !== \"off\"\n );\n}\n\n/**\n * Returns whether dynamic redrawing is allowed for the given environment and terminal.\n * Non-interactive environments get single-line milestones instead of carriage returns.\n */\nexport function isProgressInteractive(\n env: NodeJS.ProcessEnv = process.env,\n isTTY: boolean | undefined = process.stderr.isTTY,\n): boolean {\n if (progressMode === \"off\" || !logger.isOutputEnabled() || !isTTY) {\n return false;\n }\n if ((env.TERM ?? \"\").trim().toLowerCase() === \"dumb\") {\n return false;\n }\n return !(\n isEnvFlagSet(env.CI) ||\n isEnvFlagSet(env.NO_COLOR) ||\n isEnvFlagSet(env.NANOS_NO_PROGRESS)\n );\n}\n\n/** Writes a control sequence straight to file descriptor 2, tolerating a closed stderr. */\nfunction writeToStderr(sequence: string): void {\n try {\n fs.writeSync(2, sequence);\n } catch (err) {\n void err;\n }\n}\n\n/**\n * Writes a progress line to stderr, so stdout keeps carrying only the command report.\n *\n * Without a terminal the displays fall back to these discrete milestones, which are just as\n * much part of the progress display as an in-place redraw and therefore share its stream.\n */\nfunction logProgressLine(message: string): void {\n if (logger.isEnabledFor(\"info\")) {\n console.error(message);\n }\n}\n\n/** Writes a settle message on the stream matching its severity. */\nfunction logSettle(message: string, level: \"info\" | \"warn\"): void {\n if (level === \"warn\") {\n logger.warn(message);\n return;\n }\n logProgressLine(message);\n}\n\n/** Restores the cursor and abandons the active progress line; safe to call at any time. */\nexport function restoreTerminal(): void {\n if (!cursorHidden) {\n return;\n }\n cursorHidden = false;\n writeToStderr(`${CLEAR_LINE}${CURSOR_SHOW}`);\n}\n\n/** Restores the cursor, then re-raises the signal with the default disposition. */\nfunction handleTerminationSignal(signal: NodeJS.Signals): void {\n restoreTerminal();\n removeTerminalGuards();\n process.kill(process.pid, signal);\n}\n\n/** Installs exit, crash and signal hooks so a hidden cursor is always restored. */\nfunction installTerminalGuards(): void {\n if (guardsInstalled) {\n return;\n }\n guardsInstalled = true;\n process.on(\"exit\", restoreTerminal);\n process.on(\"uncaughtExceptionMonitor\", restoreTerminal);\n process.on(\"SIGINT\", handleTerminationSignal);\n process.on(\"SIGTERM\", handleTerminationSignal);\n}\n\n/** Removes the cursor guards once no dynamic render is active. */\nfunction removeTerminalGuards(): void {\n if (!guardsInstalled) {\n return;\n }\n guardsInstalled = false;\n process.off(\"exit\", restoreTerminal);\n process.off(\"uncaughtExceptionMonitor\", restoreTerminal);\n process.off(\"SIGINT\", handleTerminationSignal);\n process.off(\"SIGTERM\", handleTerminationSignal);\n}\n\n/** Builds the mutable rendering state shared by bars and spinners. */\nfunction createRenderState(options: ProgressOptions): RenderState {\n const stream = options.stream ?? process.stderr;\n const now = options.now ?? Date.now;\n return {\n stream,\n interactive: options.interactive ?? isProgressInteractive(process.env, stream.isTTY),\n ownsProcessStderr: options.stream === undefined,\n label: options.label,\n now,\n throttleMs: Math.max(1, options.throttleMs ?? PROGRESS_THROTTLE_MS),\n startedAt: now(),\n lastFrameAt: Number.NEGATIVE_INFINITY,\n active: false,\n };\n}\n\n/** Truncates a frame so it never wraps onto a second terminal line. */\nfunction fitToWidth(state: RenderState, line: string): string {\n const limit = Math.max(1, (state.stream.columns ?? DEFAULT_COLUMNS) - 1);\n if (line.length <= limit) {\n return line;\n }\n if (limit <= TRUNCATION.length) {\n return TRUNCATION.slice(0, limit);\n }\n return `${line.slice(0, limit - TRUNCATION.length)}${TRUNCATION}`;\n}\n\n/** Hides the cursor and arms the exit guards when a dynamic render starts. */\nfunction beginFrame(state: RenderState): void {\n if (state.active) {\n return;\n }\n state.active = true;\n if (!state.ownsProcessStderr) {\n state.stream.write(CURSOR_HIDE);\n return;\n }\n activeDynamicRenders += 1;\n if (activeDynamicRenders > 1) {\n return;\n }\n cursorHidden = true;\n installTerminalGuards();\n state.stream.write(CURSOR_HIDE);\n}\n\n/** Clears the dynamic line and reveals the cursor once the render stops. */\nfunction endFrame(state: RenderState): void {\n if (!state.interactive || !state.active) {\n return;\n }\n state.active = false;\n state.stream.write(CLEAR_LINE);\n if (!state.ownsProcessStderr) {\n state.stream.write(CURSOR_SHOW);\n return;\n }\n activeDynamicRenders = Math.max(0, activeDynamicRenders - 1);\n if (activeDynamicRenders === 0) {\n cursorHidden = false;\n removeTerminalGuards();\n state.stream.write(CURSOR_SHOW);\n }\n}\n\n/** Draws one frame, throttled unless `force`d, replacing whatever the line held. */\nfunction drawFrame(state: RenderState, line: string, force = false): void {\n if (!state.interactive) {\n return;\n }\n const now = state.now();\n if (!force && now - state.lastFrameAt < state.throttleMs) {\n return;\n }\n state.lastFrameAt = now;\n beginFrame(state);\n state.stream.write(`${CLEAR_LINE}${fitToWidth(state, line)}${FRAME_TAIL}`);\n}\n\n/** Formats a duration in milliseconds as seconds. */\nfunction formatDuration(ms: number): string {\n const seconds = Math.max(0, ms) / 1000;\n return seconds < 10 ? `${seconds.toFixed(1)}s` : `${Math.round(seconds)}s`;\n}\n\n/** Formats a completed transfer as size, duration and average speed. */\nexport function formatTransferSummary(bytes: number, elapsedMs: number): string {\n const elapsed = Math.max(elapsedMs, 1);\n return `${formatBytes(bytes)} in ${formatDuration(elapsed)} (${formatBytes(bytes / (elapsed / 1000))}/s)`;\n}\n\n/** Builds the `[====> ]` fill for a completion ratio. */\nfunction buildBar(ratio: number, width: number): string {\n const filled = Math.max(0, Math.min(width, Math.round(ratio * width)));\n if (filled >= width) {\n return \"=\".repeat(width);\n }\n return `${\"=\".repeat(filled)}>${\" \".repeat(width - filled - 1)}`;\n}\n\n/** Picks a bar width that keeps the whole frame inside the terminal. */\nfunction barWidthFor(state: RenderState, reserved: number): number {\n const columns = state.stream.columns ?? DEFAULT_COLUMNS;\n return Math.max(MIN_BAR_WIDTH, Math.min(MAX_BAR_WIDTH, columns - reserved));\n}\n\n/** Renders one deterministic transfer frame. */\nfunction renderBarFrame(state: RenderState, transferred: number, total?: number): string {\n const elapsedMs = state.now() - state.startedAt;\n const speed = transferred / (Math.max(elapsedMs, 1) / 1000);\n const speedText = `${formatBytes(speed)}/s`;\n if (!total || total <= 0) {\n return `${state.label} ${formatBytes(transferred)} (${speedText}, ${formatDuration(elapsedMs)})`;\n }\n const ratio = Math.max(0, Math.min(1, transferred / total));\n const percent = Math.floor(ratio * 100);\n const eta =\n speed > 0 && transferred < total\n ? `, ETA ${formatDuration(((total - transferred) / speed) * 1000)}`\n : \"\";\n const tail = ` ${percent}% (${formatBytes(transferred)} / ${formatBytes(total)}, ${speedText}${eta})`;\n const width = barWidthFor(state, state.label.length + tail.length + FRAME_TAIL.length + 4);\n return `${state.label} [${buildBar(ratio, width)}]${tail}`;\n}\n\n/** Renders one indeterminate spinner frame. */\nfunction renderSpinnerFrame(state: RenderState, frame: number): string {\n const glyph = SPINNER_FRAMES[frame % SPINNER_FRAMES.length] ?? \"|\";\n return `${state.label} ${glyph} (${formatDuration(state.now() - state.startedAt)})`;\n}\n\n/** Creates a byte progress bar; without a terminal it logs start, milestones and completion. */\nexport function createProgressBar(options: ProgressBarOptions): ProgressBarHandle {\n const state = createRenderState(options);\n let transferred = 0;\n let total = options.total !== undefined && options.total > 0 ? options.total : undefined;\n let milestone = 0;\n\n if (!state.interactive && options.announce !== false) {\n logProgressLine(`${state.label}${total ? ` (${formatBytes(total)})` : \"\"}...`);\n }\n if (state.interactive) {\n drawFrame(state, renderBarFrame(state, 0, total), true);\n }\n\n const settle = (message: string | undefined, level: \"info\" | \"warn\"): void => {\n endFrame(state);\n if (message) {\n logSettle(message, level);\n }\n };\n\n return {\n update: (next: number, nextTotal?: number): void => {\n transferred = Math.max(transferred, next);\n if (nextTotal !== undefined && nextTotal > 0) {\n total = nextTotal;\n }\n // A transport can declare a compressed length (gzip) and then stream more bytes than\n // that, so a total the transfer has already passed is dropped rather than misreported.\n if (total !== undefined && transferred > total) {\n total = undefined;\n }\n if (state.interactive) {\n drawFrame(state, renderBarFrame(state, transferred, total));\n return;\n }\n if (!total) {\n return;\n }\n const ratio = transferred / total;\n while (\n milestone < PROGRESS_MILESTONES.length &&\n ratio >= (PROGRESS_MILESTONES[milestone] ?? 1)\n ) {\n const reached = PROGRESS_MILESTONES[milestone] ?? 1;\n milestone += 1;\n logProgressLine(\n `${state.label}: ${Math.round(reached * 100)}% (${formatBytes(transferred)} / ${formatBytes(total)})`,\n );\n }\n },\n finish: (message?: string): void => settle(message, \"info\"),\n fail: (message?: string): void => settle(message, \"warn\"),\n };\n}\n\n/** Creates an indeterminate spinner driven by a timer and by manual ticks from sync loops. */\nexport function createSpinner(options: ProgressOptions): SpinnerHandle {\n const state = createRenderState(options);\n let frame = 0;\n let timer: NodeJS.Timeout | undefined;\n\n const clearTimer = (): void => {\n if (timer !== undefined) {\n clearInterval(timer);\n timer = undefined;\n }\n };\n\n const settle = (message: string | undefined, level: \"info\" | \"warn\"): void => {\n clearTimer();\n endFrame(state);\n if (message) {\n logSettle(message, level);\n }\n };\n\n return {\n start: (): void => {\n if (!state.interactive) {\n if (options.announce !== false) {\n logProgressLine(`${state.label}...`);\n }\n return;\n }\n drawFrame(state, renderSpinnerFrame(state, frame), true);\n if (timer === undefined) {\n timer = setInterval(() => {\n frame += 1;\n drawFrame(state, renderSpinnerFrame(state, frame), true);\n }, state.throttleMs);\n timer.unref();\n }\n },\n tick: (): void => {\n frame += 1;\n drawFrame(state, renderSpinnerFrame(state, frame));\n },\n updateText: (label: string): void => {\n state.label = label;\n drawFrame(state, renderSpinnerFrame(state, frame), true);\n },\n stop: (message?: string): void => settle(message, \"info\"),\n fail: (message?: string): void => settle(message, \"warn\"),\n };\n}\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { logger } from \"./logger.js\";\nimport { writeAtomicFileSync } from \"./lock.js\";\nimport { systemPaths } from \"./paths.js\";\nimport { createSpinner } from \"./terminal-progress.js\";\n\n/** Realm name used by a pass; `global` is normalized to `shared` before this point. */\nexport type RealmPassName = \"client\" | \"server\" | \"shared\";\n\n/** Side markers emitted by the upstream docgen, mapped to the realm that owns them. */\nconst SIDE_MARKERS: ReadonlyArray<readonly [image: string, realm: RealmPassName]> = [\n [\"both\", \"shared\"],\n [\"client-only\", \"client\"],\n [\"server-only\", \"server\"],\n [\"authority-only\", \"shared\"],\n [\"network-authority\", \"shared\"],\n];\n\n/** Declaration forms recognized while segmenting `annotations.lua`. */\ntype AnnotationUnitKind = \"comment\" | \"class\" | \"static\" | \"instance\" | \"other\";\n\n/** Number of source lines parsed between two spinner ticks while splitting realms. */\nconst PARSE_PROGRESS_STEP_LINES = 2_000;\n\ninterface AnnotationUnit {\n doc: string[];\n decl: string[] | null;\n key: string | null;\n receiver: string | null;\n owner: RealmPassName | null;\n realm: RealmPassName;\n kind: AnnotationUnitKind;\n}\n\n/** Finds the realm declared by the side marker of a documentation block. */\nfunction realmOfDocBlock(doc: string[]): RealmPassName | null {\n for (const line of doc) {\n for (const [image, realm] of SIDE_MARKERS) {\n if (line.includes(`assets/${image}.png`)) {\n return realm;\n }\n }\n }\n return null;\n}\n\n/** Extracts `Receiver.member` for both `function X:y()` and `function X.y()` forms. */\nfunction memberKeyOf(declaration: string | null): string | null {\n if (!declaration) {\n return null;\n }\n const member = /^(?:function\\s+)?([A-Za-z_][A-Za-z0-9_]*)[.:]([A-Za-z_][A-Za-z0-9_]*)/.exec(\n declaration,\n );\n if (member) {\n return `${member[1]}.${member[2]}`;\n }\n const global = /^([A-Za-z_][A-Za-z0-9_]*)\\s*=/.exec(declaration);\n return global ? global[1]! : null;\n}\n\n/** Extracts the class/table a declaration belongs to. */\nfunction receiverOf(declaration: string | null): string | null {\n if (!declaration) {\n return null;\n }\n const member = /^(?:function\\s+)?([A-Za-z_][A-Za-z0-9_]*)[.:]/.exec(declaration);\n if (member) {\n return member[1]!;\n }\n const global = /^([A-Za-z_][A-Za-z0-9_]*)\\s*=/.exec(declaration);\n return global ? global[1]! : null;\n}\n\n/** Classifies a declaration so static members can inherit their class realm. */\nfunction kindOf(declaration: string | null): AnnotationUnitKind {\n if (!declaration) {\n return \"comment\";\n }\n if (/^function\\s+[A-Za-z_][A-Za-z0-9_]*\\./.test(declaration)) {\n return \"static\";\n }\n if (/^function\\s+[A-Za-z_][A-Za-z0-9_]*:/.test(declaration)) {\n return \"instance\";\n }\n if (/^[A-Za-z_][A-Za-z0-9_]*\\s*=\\s*\\{/.test(declaration)) {\n return \"class\";\n }\n return \"other\";\n}\n\n/** Segments annotations into comment runs plus their optional declaration statement. */\nfunction parseAnnotationUnits(text: string, onProgress?: () => void): AnnotationUnit[] {\n const lines = text.split(/\\r?\\n/);\n const units: AnnotationUnit[] = [];\n let index = 0;\n let nextTick = PARSE_PROGRESS_STEP_LINES;\n\n const tick = (): void => {\n if (onProgress !== undefined && index >= nextTick) {\n nextTick = index + PARSE_PROGRESS_STEP_LINES;\n onProgress();\n }\n };\n\n const push = (doc: string[], decl: string[] | null): void => {\n const first = decl?.[0] ?? null;\n units.push({\n doc,\n decl,\n key: memberKeyOf(first),\n receiver: receiverOf(first),\n owner: realmOfDocBlock(doc),\n realm: \"shared\",\n kind: kindOf(first),\n });\n };\n\n while (index < lines.length) {\n tick();\n const doc: string[] = [];\n while (\n index < lines.length &&\n (lines[index]!.startsWith(\"---\") || lines[index]!.trim() === \"\")\n ) {\n if (lines[index]!.startsWith(\"---\")) {\n doc.push(lines[index]!);\n } else if (doc.length > 0) {\n push(doc.splice(0, doc.length), null);\n }\n index += 1;\n }\n if (index >= lines.length) {\n if (doc.length > 0) {\n push(doc, null);\n }\n break;\n }\n const decl = [lines[index]!];\n index += 1;\n if (/=\\s*\\{$/.test(decl[0]!)) {\n while (index < lines.length && lines[index]!.trim() !== \"}\") {\n decl.push(lines[index]!);\n index += 1;\n }\n if (index < lines.length) {\n decl.push(lines[index]!);\n index += 1;\n }\n }\n push(doc, decl);\n }\n return units;\n}\n\n/** Realm of each class/global table declared in the file, keyed by name. */\nfunction classRealmsOf(units: AnnotationUnit[]): Map<string, RealmPassName> {\n const realms = new Map<string, RealmPassName>();\n for (const unit of units) {\n if (unit.kind === \"class\" && unit.owner && unit.receiver) {\n realms.set(unit.receiver, unit.owner);\n }\n }\n return realms;\n}\n\n/**\n * Classes whose instances or members clearly exist on both sides (for example `Weapon`,\n * declared server-only but with 35 shared instance methods) keep their unmarked members\n * available everywhere, because dropping them would flag legitimate client-side scripts.\n */\nfunction crossRealmClasses(units: AnnotationUnit[]): Set<string> {\n const classRealms = classRealmsOf(units);\n const crossRealm = new Set<string>();\n for (const unit of units) {\n if ((unit.kind !== \"static\" && unit.kind !== \"instance\") || !unit.owner || !unit.receiver) {\n continue;\n }\n const classRealm = classRealms.get(unit.receiver);\n if (!classRealm || classRealm === \"shared\") {\n continue;\n }\n const sharedInstance = unit.kind === \"instance\" && unit.owner === \"shared\";\n const oppositeRealm = unit.owner !== \"shared\" && unit.owner !== classRealm;\n if (sharedInstance || oppositeRealm) {\n crossRealm.add(unit.receiver);\n }\n }\n return crossRealm;\n}\n\n/** Realm of every member key that carries an explicit marker somewhere in the file. */\nfunction markedMemberRealms(units: AnnotationUnit[]): Map<string, RealmPassName> {\n const realms = new Map<string, RealmPassName>();\n for (const unit of units) {\n if (unit.key && unit.owner) {\n const previous = realms.get(unit.key);\n realms.set(unit.key, previous && previous !== unit.owner ? \"shared\" : unit.owner);\n }\n }\n return realms;\n}\n\n/** Emits the units owned by `realm`, keeping shared types available to both sides. */\nfunction renderRealm(units: AnnotationUnit[], realm: RealmPassName): string {\n const classRealms = classRealmsOf(units);\n const emittedClasses = new Set<string>();\n const instanceMembersInRealm = new Set<string>();\n\n for (const unit of units) {\n if (unit.kind !== \"instance\" || !unit.receiver) {\n continue;\n }\n if (unit.realm === realm || unit.realm === \"shared\") {\n instanceMembersInRealm.add(unit.receiver);\n }\n }\n for (const unit of units) {\n if (unit.kind !== \"class\" || !unit.receiver) {\n continue;\n }\n const classRealm = classRealms.get(unit.receiver) ?? unit.realm;\n if (\n classRealm === realm ||\n classRealm === \"shared\" ||\n instanceMembersInRealm.has(unit.receiver)\n ) {\n emittedClasses.add(unit.receiver);\n }\n }\n\n const lines: string[] = [];\n for (const unit of units) {\n const realmOwnsUnit = unit.realm === realm || unit.realm === \"shared\";\n if (unit.kind === \"comment\") {\n lines.push(...unit.doc);\n continue;\n }\n if (unit.kind === \"class\") {\n if (emittedClasses.has(unit.receiver ?? \"\")) {\n lines.push(...unit.doc, ...(unit.decl ?? []));\n }\n continue;\n }\n const receiverKnown = unit.receiver !== null && classRealms.has(unit.receiver);\n if (realmOwnsUnit && (!receiverKnown || emittedClasses.has(unit.receiver!))) {\n lines.push(...unit.doc, ...(unit.decl ?? []));\n }\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\n/**\n * Splits a nanos world `annotations.lua` into realm-scoped libraries (#15).\n *\n * Upstream marks every declaration with a side image, so the split is data-driven:\n * `both`/`authority` stay in every realm, `client-only` and `server-only` are restricted\n * to their own realm, unmarked declarations inherit their class or sibling member realm,\n * and a realm-specific class table is dropped from the other realm unless it still has\n * instance members there.\n */\nexport function splitAnnotationsByRealm(\n text: string,\n onProgress?: () => void,\n): { client: string; server: string } {\n const units = parseAnnotationUnits(text, onProgress);\n const classRealms = classRealmsOf(units);\n const crossRealm = crossRealmClasses(units);\n const memberRealms = markedMemberRealms(units);\n onProgress?.();\n\n for (const unit of units) {\n if (unit.owner) {\n unit.realm = unit.owner;\n continue;\n }\n const markedSibling = unit.key ? memberRealms.get(unit.key) : undefined;\n if (markedSibling) {\n unit.realm = markedSibling;\n continue;\n }\n const classRealm = unit.receiver ? classRealms.get(unit.receiver) : undefined;\n unit.realm =\n classRealm && classRealm !== \"shared\" && !crossRealm.has(unit.receiver!)\n ? classRealm\n : \"shared\";\n }\n onProgress?.();\n\n const client = renderRealm(units, \"client\");\n onProgress?.();\n const server = renderRealm(units, \"server\");\n return { client, server };\n}\n\nexport interface DerivedRealmAnnotations {\n client: string;\n server: string;\n}\n\n/** Cache directory holding realm-split libraries derived from one annotations revision. */\nfunction getRealmAnnotationsCacheDir(annotationsPath: string): string {\n const resolved = path.resolve(annotationsPath);\n let stamp = `${resolved}`;\n try {\n const stat = fs.statSync(resolved);\n stamp = `${resolved}|${stat.size}|${stat.mtimeMs}`;\n } catch (err) {\n logger.debug(\n `[realms] Could not stat annotations at ${resolved}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n const digest = crypto.createHash(\"sha256\").update(stamp).digest(\"hex\").slice(0, 16);\n return path.join(systemPaths.cache, \"realms\", digest);\n}\n\n/**\n * Derives `annotations.client.lua` and `annotations.server.lua` from the resolved\n * annotations file, caching them under the system cache keyed by the source revision.\n * A concurrent derivation is safe: files are written atomically (#7).\n */\nexport function deriveRealmAnnotationFiles(\n annotationsPath: string,\n cacheDir?: string,\n): DerivedRealmAnnotations {\n const targetDir = cacheDir ?? getRealmAnnotationsCacheDir(annotationsPath);\n const clientPath = path.join(targetDir, \"annotations.client.lua\");\n const serverPath = path.join(targetDir, \"annotations.server.lua\");\n\n if (fs.existsSync(clientPath) && fs.existsSync(serverPath)) {\n return { client: clientPath, server: serverPath };\n }\n\n const spinner = createSpinner({ label: \"[realms] Deriving client/server annotations\" });\n spinner.start();\n try {\n const source = fs.readFileSync(annotationsPath, \"utf-8\");\n const split = splitAnnotationsByRealm(source, () => spinner.tick());\n spinner.updateText(\"[realms] Writing derived annotations\");\n fs.mkdirSync(targetDir, { recursive: true });\n writeAtomicFileSync(clientPath, split.client);\n writeAtomicFileSync(serverPath, split.server);\n logger.debug(`[realms] Derived realm annotations in ${targetDir}.`);\n spinner.stop(`[realms] Derived client/server annotations in ${targetDir}.`);\n } catch (err) {\n spinner.fail();\n throw err;\n }\n return { client: clientPath, server: serverPath };\n}\n","/**\n * Shared transport policy for every outbound download performed by nanos-lint.\n *\n * `SECURITY.md` requires download requests *and* HTTP redirects to use HTTPS and to stay on\n * GitHub infrastructure. Redirects are therefore resolved hop by hop in `\"manual\"` mode: the\n * default `\"follow\"` mode contacts the redirect target before any check can run, which would\n * let a redirect downgrade to plaintext `http://` or reach an internal address.\n */\n\nexport const ALLOWED_DOWNLOAD_DOMAINS: readonly string[] = [\"github.com\", \"githubusercontent.com\"];\n\n/** Maximum number of redirect hops followed before a request is refused. */\nexport const MAX_REDIRECT_HOPS = 5;\n\n/** Headers that must never follow a redirect to another origin. */\nconst CREDENTIAL_HEADERS: readonly string[] = [\"authorization\", \"cookie\", \"proxy-authorization\"];\n\n/** Returns the origin of an already validated URL, or null when it cannot be parsed. */\nfunction originOf(urlString: string): string | null {\n try {\n return new URL(urlString).origin;\n } catch {\n return null;\n }\n}\n\n/**\n * Returns the caller's headers with credentials removed.\n *\n * The runtime strips `Authorization` when it follows a redirect by itself, so dropping it here\n * keeps that guarantee once the guard re-issues each hop manually instead of following it.\n */\nfunction withoutCredentialHeaders(headers: RequestInit[\"headers\"]): RequestInit[\"headers\"] {\n if (headers === undefined) {\n return undefined;\n }\n const stripped = new Headers(headers);\n for (const name of CREDENTIAL_HEADERS) {\n stripped.delete(name);\n }\n return stripped;\n}\n\n/** Validates that a URL uses HTTPS and targets an allowlisted GitHub host. */\nexport function isAllowedDownloadUrl(urlString: string): boolean {\n try {\n const parsed = new URL(urlString);\n if (parsed.protocol !== \"https:\") {\n return false;\n }\n const hostname = parsed.hostname.toLowerCase();\n return ALLOWED_DOWNLOAD_DOMAINS.some(\n (domain) => hostname === domain || hostname.endsWith(`.${domain}`),\n );\n } catch {\n return false;\n }\n}\n\n/** Why an outbound request was refused before or during its redirect chain. */\nexport type DownloadBlockReason =\n | \"disallowed-url\"\n | \"disallowed-redirect\"\n | \"missing-location\"\n | \"network-error\"\n | \"too-many-redirects\";\n\nexport interface GuardedFetchResult {\n ok: boolean;\n /** Final response; present only when the request was allowed end to end. */\n response?: Response;\n reason?: DownloadBlockReason;\n /** URL of the refused hop (the redirect target when a redirect was refused). */\n url?: string;\n /** Present when the transport failed before any response was received. */\n error?: unknown;\n}\n\n/**\n * Releases a response body without letting cleanup failures mask the block reason.\n *\n * Every failure mode is swallowed on purpose: a missing body, a double that exposes no\n * `cancel()`, and a `cancel()` that rejects or returns a non-promise must all leave the\n * caller free to report why the response was refused.\n */\nexport async function cancelResponseBody(res: Response): Promise<void> {\n try {\n if (typeof res.body?.cancel === \"function\") {\n await res.body.cancel();\n }\n } catch (err) {\n // Cleanup is best-effort: the refusal reason is the actionable information.\n void err;\n }\n}\n\n/** Reads the `Location` header of a redirect response, tolerating minimal test doubles. */\nfunction getRedirectLocation(res: Response): string | null {\n if (typeof res.headers?.get !== \"function\") {\n return null;\n }\n return res.headers.get(\"location\");\n}\n\n/**\n * Reads the `content-length` of a response whose bytes are streamed as received.\n *\n * A content-encoded response (`content-encoding: gzip`, `br`, ...) is decoded by the runtime\n * while its `content-length` still counts the compressed payload, so that value describes\n * neither the byte stream a progress bar counts nor the text that reaches the cache. Such a\n * response reports no usable length and progress falls back to transferred bytes and speed.\n */\nexport function parseDeclaredContentLength(res: Response): number | undefined {\n const encoding = (res.headers?.get?.(\"content-encoding\") ?? \"\").trim().toLowerCase();\n if (encoding !== \"\" && encoding !== \"identity\") {\n return undefined;\n }\n const header = res.headers?.get?.(\"content-length\");\n if (!header) {\n return undefined;\n }\n const declared = parseInt(header, 10);\n return Number.isFinite(declared) && declared > 0 ? declared : undefined;\n}\n\n/** Classifies a response the runtime followed by itself despite `redirect: \"manual\"`. */\nfunction isOpaqueRedirect(res: Response): boolean {\n return res.type === \"opaqueredirect\";\n}\n\n/**\n * Performs a fetch with hop-by-hop redirect validation against the allowlist.\n *\n * Each hop must use HTTPS and stay on an allowlisted GitHub host; a hop that does not is never\n * contacted, because `redirect: \"manual\"` surfaces the 3xx response instead of following it.\n * The final response URL is validated as well, which keeps the policy enforced even on a\n * runtime that ignores `\"manual\"` and follows redirects on its own.\n */\nexport async function guardedFetch(\n url: string,\n init: RequestInit = {},\n): Promise<GuardedFetchResult> {\n if (!isAllowedDownloadUrl(url)) {\n return { ok: false, reason: \"disallowed-url\", url };\n }\n\n let currentUrl = url;\n let currentInit = init;\n let followed = 0;\n const requestOrigin = originOf(url);\n\n for (;;) {\n let response: Response;\n try {\n response = await fetch(currentUrl, { ...currentInit, redirect: \"manual\" });\n } catch (err) {\n return { ok: false, reason: \"network-error\", url: currentUrl, error: err };\n }\n\n if (isOpaqueRedirect(response)) {\n await cancelResponseBody(response);\n return { ok: false, reason: \"disallowed-redirect\", url: currentUrl };\n }\n\n const isRedirect = response.status >= 300 && response.status < 400;\n\n if (!isRedirect) {\n // A non-redirect response should still be the URL that was requested. Checking it keeps\n // the policy enforced if the runtime followed a redirect despite `\"manual\"`.\n if (response.url && !isAllowedDownloadUrl(response.url)) {\n await cancelResponseBody(response);\n return { ok: false, reason: \"disallowed-redirect\", url: response.url };\n }\n return { ok: true, response };\n }\n\n // A 3xx without a usable target is never accepted as a final response. A blank `Location`\n // would otherwise resolve to the current URL and spin until the hop budget runs out.\n const location = getRedirectLocation(response);\n if (location === null || location.trim() === \"\") {\n await cancelResponseBody(response);\n return { ok: false, reason: \"missing-location\", url: currentUrl };\n }\n\n // The redirect target is validated before it is ever requested.\n let nextUrl: string;\n try {\n nextUrl = new URL(location, currentUrl).href;\n } catch (err) {\n void err;\n nextUrl = \"\";\n }\n if (!isAllowedDownloadUrl(nextUrl)) {\n await cancelResponseBody(response);\n return { ok: false, reason: \"disallowed-redirect\", url: nextUrl || location };\n }\n\n await cancelResponseBody(response);\n followed++;\n if (followed > MAX_REDIRECT_HOPS) {\n return { ok: false, reason: \"too-many-redirects\", url: nextUrl };\n }\n // The hop target is trusted, but a credential minted for the original host is not:\n // mirror the runtime's own cross-origin credential stripping.\n const nextOrigin = originOf(nextUrl);\n if (requestOrigin !== null && nextOrigin !== null && nextOrigin !== requestOrigin) {\n currentInit = { ...init, headers: withoutCredentialHeaders(init.headers) };\n }\n currentUrl = nextUrl;\n }\n}\n","import { logger } from \"../logger.js\";\nimport { LuaLSError } from \"../errors.js\";\nimport { guardedFetch } from \"../download-guard.js\";\n\nexport const FALLBACK_LUALS_VERSION = \"3.19.1\";\nexport const DEFAULT_LUALS_VERSION = \"latest\";\n\n/** Characters accepted in a safe LuaLS version tag. */\nconst SAFE_VERSION_CHARS: ReadonlyMap<string, string> = new Map(\n [...\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz._-\"].map((ch) => [ch, ch]),\n);\n\nconst MAX_VERSION_LENGTH = 64;\n\n/**\n * Validates and normalizes a LuaLS version string to prevent path traversal or injection.\n * Drops a single leading 'v' and returns null on invalid characters.\n */\nexport function sanitizeLuaLSVersion(raw: string): string | null {\n const trimmed = raw.trim();\n if (trimmed.length === 0 || trimmed.length > MAX_VERSION_LENGTH) {\n return null;\n }\n\n let version = \"\";\n for (const ch of trimmed) {\n const allowed = SAFE_VERSION_CHARS.get(ch);\n if (allowed === undefined) {\n return null;\n }\n version += allowed;\n }\n\n // Drop a single leading \"v\" (e.g. \"v3.19.1\" -> \"3.19.1\").\n if (version.charCodeAt(0) === 0x76 /* \"v\" */) {\n version = version.slice(1);\n }\n\n // First character must be alphanumeric to prevent directory traversal or alias.\n const first = version.charCodeAt(0);\n const startsAlphanumeric =\n (first >= 0x30 && first <= 0x39) || // 0-9\n (first >= 0x41 && first <= 0x5a) || // A-Z\n (first >= 0x61 && first <= 0x7a); // a-z\n\n return startsAlphanumeric ? version : null;\n}\n\n/**\n * Fetches the latest available LuaLS release tag from the GitHub API.\n * Returns null if the request fails, times out, or receives an invalid tag.\n */\nexport async function fetchLatestLuaLSVersionFromGitHub(): Promise<string | null> {\n try {\n const headers: Record<string, string> = { \"User-Agent\": \"nanos-lint\" };\n if (process.env.GITHUB_TOKEN) {\n headers[\"Authorization\"] = `token ${process.env.GITHUB_TOKEN}`;\n }\n const result = await guardedFetch(\n \"https://api.github.com/repos/LuaLS/lua-language-server/releases/latest\",\n {\n headers,\n signal: AbortSignal.timeout(5000),\n },\n );\n if (!result.ok || !result.response) {\n if (result.reason && result.reason !== \"network-error\") {\n logger.warn(\n `[luals] Refused LuaLS release lookup: requests must stay on allowlisted GitHub infrastructure over HTTPS (${result.url ?? \"unknown URL\"}).`,\n );\n }\n return null;\n }\n const res = result.response;\n if (res.ok) {\n const data = (await res.json()) as { tag_name?: string };\n // The response body is untrusted input: only use it when it is a valid tag.\n const version =\n typeof data.tag_name === \"string\" ? sanitizeLuaLSVersion(data.tag_name) : null;\n if (version) {\n return version;\n }\n }\n } catch (err) {\n logger.debug(\n `[luals] Failed to resolve latest LuaLS version from GitHub API: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n return null;\n}\n\n/**\n * Resolves the latest available LuaLS release tag from the GitHub API,\n * falling back to FALLBACK_LUALS_VERSION if offline or unreachable.\n */\nexport async function resolveLatestLuaLSVersion(): Promise<string> {\n const version = await fetchLatestLuaLSVersionFromGitHub();\n return version || FALLBACK_LUALS_VERSION;\n}\n\n/**\n * Resolves a version string (\"latest\" -> actual tag).\n *\n * @throws when an explicitly requested version is not a valid tag.\n */\nexport async function resolveLuaLSVersion(version?: string): Promise<string> {\n if (!version || version === \"latest\") {\n return await resolveLatestLuaLSVersion();\n }\n const sanitized = sanitizeLuaLSVersion(version);\n if (!sanitized) {\n throw new LuaLSError(\n `Invalid LuaLS version: \"${version}\". Expected a release tag such as \"3.19.1\", or \"latest\".`,\n \"ERR_LUALS_INVALID_VERSION\",\n \"Provide a valid release tag like '3.19.1' or use 'latest'.\",\n );\n }\n return sanitized;\n}\n","import path from \"node:path\";\nimport { FALLBACK_LUALS_VERSION } from \"./version.js\";\nimport { LuaLSError } from \"../errors.js\";\n\nexport interface PlatformInfo {\n platform: \"win32\" | \"linux\" | \"darwin\";\n arch: \"x64\" | \"arm64\" | \"ia32\";\n assetName: string;\n binaryRelativePath: string;\n}\n\n/** Resolves platform-specific binary naming and relative paths for the host operating system. */\nexport function getPlatformInfo(version: string = FALLBACK_LUALS_VERSION): PlatformInfo {\n const platform = process.platform;\n const arch = process.arch;\n\n if (platform === \"win32\") {\n if (arch === \"x64\") {\n return {\n platform: \"win32\",\n arch: \"x64\",\n assetName: `lua-language-server-${version}-win32-x64.zip`,\n binaryRelativePath: path.join(\"bin\", \"lua-language-server.exe\"),\n };\n }\n throw new LuaLSError(\n `Unsupported Windows architecture: ${arch}. Supported: x64`,\n \"ERR_LUALS_UNSUPPORTED_ARCH\",\n \"LuaLS provides pre-built binaries for Windows x64. Use a compatible system or set LUALS_BIN to a custom binary.\",\n );\n }\n\n if (platform === \"linux\") {\n if (arch === \"x64\") {\n return {\n platform: \"linux\",\n arch: \"x64\",\n assetName: `lua-language-server-${version}-linux-x64.tar.gz`,\n binaryRelativePath: path.join(\"bin\", \"lua-language-server\"),\n };\n }\n if (arch === \"arm64\") {\n return {\n platform: \"linux\",\n arch: \"arm64\",\n assetName: `lua-language-server-${version}-linux-arm64.tar.gz`,\n binaryRelativePath: path.join(\"bin\", \"lua-language-server\"),\n };\n }\n throw new LuaLSError(\n `Unsupported Linux architecture: ${arch}. Supported: x64, arm64`,\n \"ERR_LUALS_UNSUPPORTED_ARCH\",\n \"LuaLS provides pre-built binaries for Linux x64 and arm64. Use LUALS_BIN to specify a custom build.\",\n );\n }\n\n if (platform === \"darwin\") {\n const archName = arch === \"arm64\" ? \"arm64\" : \"x64\";\n return {\n platform: \"darwin\",\n arch: arch as \"x64\" | \"arm64\",\n assetName: `lua-language-server-${version}-darwin-${archName}.tar.gz`,\n binaryRelativePath: path.join(\"bin\", \"lua-language-server\"),\n };\n }\n\n throw new LuaLSError(\n `Unsupported platform: ${platform}`,\n \"ERR_LUALS_UNSUPPORTED_PLATFORM\",\n \"LuaLS provides pre-built binaries for Windows, Linux, and macOS. Use LUALS_BIN to specify a custom build.\",\n );\n}\n","import { LuaLSError } from \"../errors.js\";\n\n/**\n * Structural ZIP parsing for the pre-extraction archive inspection. These\n * helpers read end records, central directory records and local file headers,\n * and resolve the ZIP64 structures whenever a 32-bit field is a sentinel.\n * Declared counts, offsets and sizes are surfaced to the caller but bounded\n * here, so a hostile archive can never make the inspector read out of bounds.\n */\n\nconst ZIP_LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;\nconst ZIP_CENTRAL_FILE_HEADER_SIGNATURE = 0x02014b50;\nconst ZIP_END_OF_CENTRAL_DIRECTORY_SIGNATURE = 0x06054b50;\nconst ZIP64_END_OF_CENTRAL_DIRECTORY_SIGNATURE = 0x06064b50;\nconst ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE = 0x07064b50;\nconst ZIP64_EXTRA_FIELD_ID = 0x0001;\nconst ZIP_SENTINEL_UINT16 = 0xffff;\nconst ZIP_SENTINEL_UINT32 = 0xffffffff;\nexport const ZIP_EOCD_MIN_SIZE = 22;\nconst ZIP_MAX_COMMENT_SIZE = 0xffff;\nconst ZIP64_LOCATOR_SIZE = 20;\nconst ZIP64_EOCD_MIN_SIZE = 56;\nconst ZIP_CENTRAL_HEADER_SIZE = 46;\nconst ZIP_LOCAL_HEADER_SIZE = 30;\nconst ZIP_DATA_DESCRIPTOR_FLAG = 0x0008;\nconst ZIP_DATA_DESCRIPTOR_SIGNATURE = 0x08074b50;\n// Data descriptors are crc + compressed size + uncompressed size, in 32-bit or\n// 64-bit form, with an optional leading signature: 12/16/20/24/28 bytes.\nconst ZIP_DATA_DESCRIPTOR_SIZES = [12, 16, 20, 24, 28];\nconst ZIP_UNIX_FILE_TYPE_MASK = 0o170000;\n\n/**\n * Builds the pre-extraction inspection failure reported for every rejected\n * archive, so a fail-closed rejection always carries the same remediation.\n */\nexport function invalidZipArchive(reason: string): LuaLSError {\n return new LuaLSError(\n `Failed to inspect release archive before extraction: ${reason}`,\n \"ERR_LUALS_EXTRACT\",\n \"Run 'nanos-lint clean-cache' and verify the LuaLS release integrity.\",\n );\n}\n\n/** Converts an unsigned 64-bit ZIP field to a number, rejecting values above Number.MAX_SAFE_INTEGER. */\nfunction zip64ToNumber(value: bigint, what: string): number {\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw invalidZipArchive(`${what} exceeds the supported range`);\n }\n return Number(value);\n}\n\n/**\n * Locates the ZIP End Of Central Directory record that extraction will use.\n * Every extraction backend (libarchive's `tar.exe`, .NET's `Expand-Archive`,\n * Info-ZIP, Python) takes the last EOCD signature in the file and ignores its\n * declared comment length, so the inspection must take the same record:\n * preferring an earlier, comment-consistent record would let an attacker put a\n * second central directory in the first record's comment and have it extracted\n * without ever being walked here. Returns -1 when no EOCD signature is present.\n */\nexport function findEndOfCentralDirectory(buf: Buffer): number {\n const minOffset = Math.max(0, buf.length - ZIP_EOCD_MIN_SIZE - ZIP_MAX_COMMENT_SIZE);\n for (let i = buf.length - ZIP_EOCD_MIN_SIZE; i >= minOffset; i--) {\n if (buf.readUInt32LE(i) !== ZIP_END_OF_CENTRAL_DIRECTORY_SIGNATURE) continue;\n if (i + ZIP_EOCD_MIN_SIZE + buf.readUInt16LE(i + 20) !== buf.length) {\n throw invalidZipArchive(\n \"the last end of central directory record does not declare a comment reaching the end of the archive\",\n );\n }\n return i;\n }\n return -1;\n}\n\n/** Central directory location and record count declared by an archive's end records. */\nexport interface ZipCentralDirectoryLocation {\n entryCount: number;\n cdOffset: number;\n cdSize: number;\n}\n\n/**\n * Resolves the central directory offset, size and record count, following the\n * ZIP64 locator and end record whenever one is present or any 32-bit EOCD field\n * is a sentinel. Declared values are never trusted on their own: the caller\n * walks the directory and reconciles every record against them.\n */\nexport function resolveCentralDirectoryLocation(\n buf: Buffer,\n eocdOffset: number,\n): ZipCentralDirectoryLocation {\n const declared = {\n diskNumber: buf.readUInt16LE(eocdOffset + 4),\n cdStartDisk: buf.readUInt16LE(eocdOffset + 6),\n entriesOnDisk: buf.readUInt16LE(eocdOffset + 8),\n entryCount: buf.readUInt16LE(eocdOffset + 10),\n cdSize: buf.readUInt32LE(eocdOffset + 12),\n cdOffset: buf.readUInt32LE(eocdOffset + 16),\n };\n\n const needsZip64 =\n declared.diskNumber === ZIP_SENTINEL_UINT16 ||\n declared.cdStartDisk === ZIP_SENTINEL_UINT16 ||\n declared.entriesOnDisk === ZIP_SENTINEL_UINT16 ||\n declared.entryCount === ZIP_SENTINEL_UINT16 ||\n declared.cdSize === ZIP_SENTINEL_UINT32 ||\n declared.cdOffset === ZIP_SENTINEL_UINT32;\n\n // A ZIP64 end record is authoritative even when the 32-bit fields are not\n // sentinels, so its values are always reconciled when the locator is present.\n const locatorOffset = eocdOffset - ZIP64_LOCATOR_SIZE;\n const hasZip64Locator =\n locatorOffset >= 0 &&\n buf.readUInt32LE(locatorOffset) === ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE;\n if (hasZip64Locator) {\n return readZip64CentralDirectoryLocation(buf, eocdOffset, declared);\n }\n if (needsZip64) {\n throw invalidZipArchive(\"missing or corrupt ZIP64 end of central directory locator\");\n }\n if (\n declared.diskNumber !== 0 ||\n declared.cdStartDisk !== 0 ||\n declared.entriesOnDisk !== declared.entryCount\n ) {\n throw invalidZipArchive(\"multi-disk or inconsistent end of central directory record\");\n }\n return {\n entryCount: declared.entryCount,\n cdOffset: declared.cdOffset,\n cdSize: declared.cdSize,\n };\n}\n\n/** Reads the ZIP64 locator and end of central directory record carrying the 64-bit directory location. */\nfunction readZip64CentralDirectoryLocation(\n buf: Buffer,\n eocdOffset: number,\n declared: { entryCount: number; cdSize: number; cdOffset: number },\n): ZipCentralDirectoryLocation {\n const locatorOffset = eocdOffset - ZIP64_LOCATOR_SIZE;\n if (\n locatorOffset < 0 ||\n buf.readUInt32LE(locatorOffset) !== ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE\n ) {\n throw invalidZipArchive(\"missing or corrupt ZIP64 end of central directory locator\");\n }\n\n const recordOffset = zip64ToNumber(\n buf.readBigUInt64LE(locatorOffset + 8),\n \"ZIP64 end of central directory offset\",\n );\n if (\n recordOffset + ZIP64_EOCD_MIN_SIZE > buf.length ||\n buf.readUInt32LE(recordOffset) !== ZIP64_END_OF_CENTRAL_DIRECTORY_SIGNATURE\n ) {\n throw invalidZipArchive(\"missing or corrupt ZIP64 end of central directory record\");\n }\n\n const recordSize = zip64ToNumber(\n buf.readBigUInt64LE(recordOffset + 4),\n \"ZIP64 end of central directory size\",\n );\n if (recordOffset + 12 + recordSize !== locatorOffset) {\n throw invalidZipArchive(\"ZIP64 end of central directory record does not end at its locator\");\n }\n\n const diskNumber = buf.readUInt32LE(recordOffset + 16);\n const cdStartDisk = buf.readUInt32LE(recordOffset + 20);\n const entriesOnDisk = zip64ToNumber(buf.readBigUInt64LE(recordOffset + 24), \"ZIP64 entry count\");\n const entryCount = zip64ToNumber(buf.readBigUInt64LE(recordOffset + 32), \"ZIP64 entry count\");\n const cdSize = zip64ToNumber(\n buf.readBigUInt64LE(recordOffset + 40),\n \"ZIP64 central directory size\",\n );\n const cdOffset = zip64ToNumber(\n buf.readBigUInt64LE(recordOffset + 48),\n \"ZIP64 central directory offset\",\n );\n\n if (diskNumber !== 0 || cdStartDisk !== 0 || entriesOnDisk !== entryCount) {\n throw invalidZipArchive(\"multi-disk or inconsistent ZIP64 end of central directory record\");\n }\n if (\n (declared.entryCount !== ZIP_SENTINEL_UINT16 && declared.entryCount !== entryCount) ||\n (declared.cdSize !== ZIP_SENTINEL_UINT32 && declared.cdSize !== cdSize) ||\n (declared.cdOffset !== ZIP_SENTINEL_UINT32 && declared.cdOffset !== cdOffset)\n ) {\n throw invalidZipArchive(\"ZIP64 end of central directory record disagrees with the EOCD fields\");\n }\n return { entryCount, cdOffset, cdSize };\n}\n\n/** Returns the payload of the ZIP64 extended information extra field (0x0001), when present. */\nfunction findZip64ExtraField(extra: Buffer): Buffer | undefined {\n let cursor = 0;\n while (cursor + 4 <= extra.length) {\n const headerId = extra.readUInt16LE(cursor);\n const dataSize = extra.readUInt16LE(cursor + 2);\n if (cursor + 4 + dataSize > extra.length) return undefined;\n if (headerId === ZIP64_EXTRA_FIELD_ID) {\n return extra.subarray(cursor + 4, cursor + 4 + dataSize);\n }\n cursor += 4 + dataSize;\n }\n return undefined;\n}\n\n/** Reads one 8-byte ZIP64 extended information value, rejecting a truncated extra field. */\nfunction readZip64ExtraValue(data: Buffer, byteOffset: number, what: string): number {\n if (byteOffset + 8 > data.length) {\n throw invalidZipArchive(`truncated ZIP64 extended information extra field (${what})`);\n }\n return zip64ToNumber(data.readBigUInt64LE(byteOffset), `ZIP64 ${what}`);\n}\n\n/** Resolves a central directory record's 64-bit values from its ZIP64 extended information extra field. */\nfunction resolveZip64Values(\n extra: Buffer,\n base: {\n uncompressedSize: number;\n compressedSize: number;\n localHeaderOffset: number;\n diskStart: number;\n },\n): { uncompressedSize: number; compressedSize: number; localHeaderOffset: number } {\n const needsZip64 =\n base.uncompressedSize === ZIP_SENTINEL_UINT32 ||\n base.compressedSize === ZIP_SENTINEL_UINT32 ||\n base.localHeaderOffset === ZIP_SENTINEL_UINT32 ||\n base.diskStart === ZIP_SENTINEL_UINT16;\n if (!needsZip64) {\n if (base.diskStart !== 0) {\n throw invalidZipArchive(\"multi-disk zip archives are not supported\");\n }\n return base;\n }\n\n const data = findZip64ExtraField(extra);\n if (!data) {\n throw invalidZipArchive(\"central directory record is missing its ZIP64 extended information\");\n }\n let cursor = 0;\n let { uncompressedSize, compressedSize, localHeaderOffset } = base;\n let diskStart = base.diskStart;\n if (uncompressedSize === ZIP_SENTINEL_UINT32) {\n uncompressedSize = readZip64ExtraValue(data, cursor, \"uncompressed size\");\n cursor += 8;\n }\n if (compressedSize === ZIP_SENTINEL_UINT32) {\n compressedSize = readZip64ExtraValue(data, cursor, \"compressed size\");\n cursor += 8;\n }\n if (localHeaderOffset === ZIP_SENTINEL_UINT32) {\n localHeaderOffset = readZip64ExtraValue(data, cursor, \"local header offset\");\n cursor += 8;\n }\n if (diskStart === ZIP_SENTINEL_UINT16) {\n if (cursor + 4 > data.length) {\n throw invalidZipArchive(\"truncated ZIP64 extended information extra field (disk start)\");\n }\n diskStart = data.readUInt32LE(cursor);\n }\n if (diskStart !== 0) {\n throw invalidZipArchive(\"multi-disk zip archives are not supported\");\n }\n return { uncompressedSize, compressedSize, localHeaderOffset };\n}\n\n/** One central directory record with its ZIP64 sentinels resolved. */\nexport interface ZipCentralDirectoryRecord {\n fileName: string;\n fileNameBytes: Buffer;\n compressionMethod: number;\n crc32: number;\n compressedSize: number;\n uncompressedSize: number;\n localHeaderOffset: number;\n unixFileType: number;\n hasDataDescriptor: boolean;\n nextOffset: number;\n}\n\n/**\n * Reads and structurally validates one central directory record, resolving the\n * ZIP64 extended information sentinels. Returns `undefined` when the bytes at\n * `offset` are not a central directory record, so the caller can tell a\n * finished walk apart from a corrupt one.\n */\nexport function readZipCentralDirectoryRecord(\n buf: Buffer,\n offset: number,\n): ZipCentralDirectoryRecord | undefined {\n if (offset + ZIP_CENTRAL_HEADER_SIZE > buf.length) return undefined;\n if (buf.readUInt32LE(offset) !== ZIP_CENTRAL_FILE_HEADER_SIGNATURE) return undefined;\n\n const flags = buf.readUInt16LE(offset + 8);\n const compressionMethod = buf.readUInt16LE(offset + 10);\n const crc32 = buf.readUInt32LE(offset + 16);\n const compressedSize = buf.readUInt32LE(offset + 20);\n const uncompressedSize = buf.readUInt32LE(offset + 24);\n const fileNameLen = buf.readUInt16LE(offset + 28);\n const extraLen = buf.readUInt16LE(offset + 30);\n const commentLen = buf.readUInt16LE(offset + 32);\n const diskStart = buf.readUInt16LE(offset + 34);\n const externalAttributes = buf.readUInt32LE(offset + 38);\n const localHeaderOffset = buf.readUInt32LE(offset + 42);\n const nameStart = offset + ZIP_CENTRAL_HEADER_SIZE;\n const nameEnd = nameStart + fileNameLen;\n const extraEnd = nameEnd + extraLen;\n const nextOffset = extraEnd + commentLen;\n if (nextOffset > buf.length) {\n throw invalidZipArchive(\"corrupt or truncated central directory record\");\n }\n\n const values = resolveZip64Values(buf.subarray(nameEnd, extraEnd), {\n uncompressedSize,\n compressedSize,\n localHeaderOffset,\n diskStart,\n });\n return {\n fileName: buf.toString(\"utf-8\", nameStart, nameEnd),\n fileNameBytes: buf.subarray(nameStart, nameEnd),\n compressionMethod,\n crc32,\n compressedSize: values.compressedSize,\n uncompressedSize: values.uncompressedSize,\n localHeaderOffset: values.localHeaderOffset,\n unixFileType: (externalAttributes >>> 16) & ZIP_UNIX_FILE_TYPE_MASK,\n hasDataDescriptor: (flags & ZIP_DATA_DESCRIPTOR_FLAG) !== 0,\n nextOffset,\n };\n}\n\n/** One local file header with its ZIP64 sentinels resolved. */\nexport interface ZipLocalFileHeaderRecord {\n fileName: string;\n fileNameBytes: Buffer;\n compressionMethod: number;\n compressedSize: number;\n uncompressedSize: number;\n hasDataDescriptor: boolean;\n /** Offset of the member's first data byte, past the variable-length header fields. */\n dataOffset: number;\n}\n\n/** Reads the local file header starting at `offset`, or `undefined` when none starts there. */\nexport function readZipLocalFileHeader(\n buf: Buffer,\n offset: number,\n): ZipLocalFileHeaderRecord | undefined {\n if (offset + ZIP_LOCAL_HEADER_SIZE > buf.length) return undefined;\n if (buf.readUInt32LE(offset) !== ZIP_LOCAL_FILE_HEADER_SIGNATURE) return undefined;\n\n const flags = buf.readUInt16LE(offset + 6);\n const fileNameLen = buf.readUInt16LE(offset + 26);\n const extraLen = buf.readUInt16LE(offset + 28);\n const nameStart = offset + ZIP_LOCAL_HEADER_SIZE;\n const nameEnd = nameStart + fileNameLen;\n const extraEnd = nameEnd + extraLen;\n if (extraEnd > buf.length) {\n throw invalidZipArchive(\"truncated local file header\");\n }\n\n let compressedSize = buf.readUInt32LE(offset + 18);\n let uncompressedSize = buf.readUInt32LE(offset + 22);\n const hasDataDescriptor = (flags & ZIP_DATA_DESCRIPTOR_FLAG) !== 0;\n if (\n !hasDataDescriptor &&\n (compressedSize === ZIP_SENTINEL_UINT32 || uncompressedSize === ZIP_SENTINEL_UINT32)\n ) {\n const data = findZip64ExtraField(buf.subarray(nameEnd, extraEnd));\n if (!data) {\n throw invalidZipArchive(\"local file header is missing its ZIP64 extended information\");\n }\n let cursor = 0;\n if (uncompressedSize === ZIP_SENTINEL_UINT32) {\n uncompressedSize = readZip64ExtraValue(data, cursor, \"uncompressed size\");\n cursor += 8;\n }\n if (compressedSize === ZIP_SENTINEL_UINT32) {\n compressedSize = readZip64ExtraValue(data, cursor, \"compressed size\");\n }\n }\n\n return {\n fileName: buf.toString(\"utf-8\", nameStart, nameEnd),\n fileNameBytes: buf.subarray(nameStart, nameEnd),\n compressionMethod: buf.readUInt16LE(offset + 8),\n compressedSize,\n uncompressedSize,\n hasDataDescriptor,\n dataOffset: extraEnd,\n };\n}\n\n/** One central directory record paired with the local file header it points at. */\nexport interface ZipMemberPair {\n record: ZipCentralDirectoryRecord;\n local: ZipLocalFileHeaderRecord;\n}\n\n/**\n * Verifies that the central directory's members exactly cover the archive's\n * local region: the first member starts at offset 0, each member starts where\n * the previous member's data (plus its trailing data descriptor, when present)\n * ends, and the last member's data ends exactly at the central directory. A\n * gap, an overlap or an unreferenced local file header is a member a streaming\n * reader (`tar.exe` falls back to one when the EOCD is not in its search\n * window) extracts while the central directory walk never sees it (#31).\n */\nexport function assertLocalFileHeadersTileArchive(\n buf: Buffer,\n cdOffset: number,\n pairs: ZipMemberPair[],\n): void {\n const ordered = [...pairs].sort(\n (a, b) => a.record.localHeaderOffset - b.record.localHeaderOffset,\n );\n const first = ordered[0];\n if (!first || first.record.localHeaderOffset !== 0) {\n throw invalidZipArchive(\n \"local file header stream does not start at the beginning of the archive\",\n );\n }\n\n for (let i = 0; i < ordered.length; i++) {\n const pair = ordered[i]!;\n const dataEnd = pair.local.dataOffset + pair.record.compressedSize;\n const nextOffset = ordered[i + 1]?.record.localHeaderOffset ?? cdOffset;\n if (nextOffset < dataEnd) {\n throw invalidZipArchive(`archive members overlap at '${pair.record.fileName}'`);\n }\n const gap = nextOffset - dataEnd;\n if (gap === 0) continue;\n if (!pair.record.hasDataDescriptor && !pair.local.hasDataDescriptor) {\n throw invalidZipArchive(`unreferenced bytes follow member '${pair.record.fileName}'`);\n }\n assertDataDescriptorGap(buf, dataEnd, gap, pair.record);\n }\n}\n\n/** Validates the trailing data descriptor that accounts for a gap after a member. */\nfunction assertDataDescriptorGap(\n buf: Buffer,\n offset: number,\n gap: number,\n record: ZipCentralDirectoryRecord,\n): void {\n if (!ZIP_DATA_DESCRIPTOR_SIZES.includes(gap)) {\n throw invalidZipArchive(`unreferenced bytes follow member '${record.fileName}'`);\n }\n // The descriptor signature is optional; without it the 32/64-bit layout is\n // ambiguous, so the gap length is the strongest statement available.\n if (buf.readUInt32LE(offset) !== ZIP_DATA_DESCRIPTOR_SIGNATURE) return;\n const body = gap - 4;\n if (body >= 8 && buf.readUInt32LE(offset + 4) !== record.crc32) {\n throw invalidZipArchive(\n `data descriptor CRC does not match the central directory for '${record.fileName}'`,\n );\n }\n const sizesMatch =\n body === 12\n ? buf.readUInt32LE(offset + 8) === record.compressedSize &&\n buf.readUInt32LE(offset + 12) === record.uncompressedSize\n : body !== 20 ||\n (zip64ToNumber(buf.readBigUInt64LE(offset + 8), \"data descriptor size\") ===\n record.compressedSize &&\n zip64ToNumber(buf.readBigUInt64LE(offset + 16), \"data descriptor size\") ===\n record.uncompressedSize);\n if (!sizesMatch) {\n throw invalidZipArchive(\n `data descriptor sizes do not match the central directory for '${record.fileName}'`,\n );\n }\n}\n\n/**\n * Verifies that the walked central directory ends exactly at a valid end of\n * central directory structure. Records sometimes placed between the central\n * directory and the EOCD (archive extra data record `0x08064b50`, digital\n * signature `0x05054b50`) are rejected too: a release asset never carries them,\n * so failing closed costs nothing here.\n */\nexport function assertCentralDirectoryTerminator(\n buf: Buffer,\n cdEnd: number,\n eocdOffset: number,\n): void {\n if (cdEnd + 4 > buf.length) {\n throw invalidZipArchive(\n \"central directory is not terminated by an end of central directory record\",\n );\n }\n const signature = buf.readUInt32LE(cdEnd);\n if (signature === ZIP_END_OF_CENTRAL_DIRECTORY_SIGNATURE) {\n if (cdEnd !== eocdOffset) {\n throw invalidZipArchive(\n \"central directory does not end at the end of central directory record\",\n );\n }\n return;\n }\n if (signature !== ZIP64_END_OF_CENTRAL_DIRECTORY_SIGNATURE) {\n throw invalidZipArchive(\n \"central directory is not terminated by an end of central directory record\",\n );\n }\n if (cdEnd + ZIP64_EOCD_MIN_SIZE > buf.length) {\n throw invalidZipArchive(\"truncated ZIP64 end of central directory record\");\n }\n const recordSize = zip64ToNumber(\n buf.readBigUInt64LE(cdEnd + 4),\n \"ZIP64 end of central directory size\",\n );\n const locatorOffset = eocdOffset - ZIP64_LOCATOR_SIZE;\n if (\n locatorOffset < 0 ||\n cdEnd + 12 + recordSize !== locatorOffset ||\n buf.readUInt32LE(locatorOffset) !== ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE ||\n zip64ToNumber(\n buf.readBigUInt64LE(locatorOffset + 8),\n \"ZIP64 end of central directory offset\",\n ) !== cdEnd\n ) {\n throw invalidZipArchive(\n \"central directory is not terminated by a valid ZIP64 end of central directory record\",\n );\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { execFileSync, execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { logger } from \"../logger.js\";\nimport { LuaLSError } from \"../errors.js\";\nimport {\n assertCentralDirectoryTerminator,\n assertLocalFileHeadersTileArchive,\n findEndOfCentralDirectory,\n invalidZipArchive,\n readZipCentralDirectoryRecord,\n readZipLocalFileHeader,\n resolveCentralDirectoryLocation,\n ZIP_EOCD_MIN_SIZE,\n type ZipCentralDirectoryLocation,\n type ZipCentralDirectoryRecord,\n type ZipLocalFileHeaderRecord,\n type ZipMemberPair,\n} from \"./zip.js\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Escapes single quotes for safe PowerShell single-quoted string interpolation.\n */\nexport function escapePowerShellSingleQuote(str: string): string {\n return str.replace(/'/g, \"''\");\n}\n\n/**\n * Maximum total decompressed size of a LuaLS release archive (500 MB).\n * Protects against zip bombs and maliciously inflated archives (#31).\n */\nexport const MAX_DECOMPRESSED_SIZE_BYTES = 500 * 1024 * 1024;\n\n/**\n * Maximum number of members allowed in a LuaLS release archive (10,000).\n * Protects against inode exhaustion and archive recursion attacks (#31).\n */\nexport const MAX_ARCHIVE_MEMBER_COUNT = 10_000;\n\n/** Parses the file size column from a 'tar -tvf' listing output line. */\nexport function parseTarTvSize(line: string): number {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 5) return 0;\n const p1 = parts[1];\n const p2 = parts[2];\n const p4 = parts[4];\n if (p1 && p2 && p1.includes(\"/\") && /^\\d+$/.test(p2)) {\n return parseInt(p2, 10) || 0;\n }\n if (p4 && /^\\d+$/.test(p4)) {\n return parseInt(p4, 10) || 0;\n }\n for (let i = 2; i < Math.min(parts.length - 1, 6); i++) {\n const p = parts[i];\n if (p && /^\\d+$/.test(p)) {\n return parseInt(p, 10) || 0;\n }\n }\n return 0;\n}\n\n/**\n * Asserts that an archive entry name does not escape the destination directory.\n * Drive-letter paths are rejected whether absolute (`C:\\evil`) or drive-relative\n * (`C:evil`), because Windows resolves the latter against the current directory\n * of that drive.\n */\nfunction checkEscapedMember(member: string): void {\n if (\n member.startsWith(\"/\") ||\n member.startsWith(\"\\\\\") ||\n /^[a-zA-Z]:/.test(member) ||\n member.split(/[/\\\\]/).includes(\"..\")\n ) {\n throw new LuaLSError(\n `Archive member path escapes extraction directory: ${member}`,\n \"ERR_LUALS_EXTRACT\",\n \"Run 'nanos-lint clean-cache' and verify the LuaLS release integrity.\",\n );\n }\n}\n\n/** Validates that archive entry count and decompressed size do not exceed safety limits. */\nfunction checkArchiveLimits(count: number, size: number): void {\n if (count > MAX_ARCHIVE_MEMBER_COUNT) {\n throw new LuaLSError(\n `Archive member count (${count}) exceeds maximum limit (${MAX_ARCHIVE_MEMBER_COUNT})`,\n \"ERR_LUALS_EXTRACT\",\n \"Run 'nanos-lint clean-cache' and verify the LuaLS release integrity.\",\n );\n }\n if (size > MAX_DECOMPRESSED_SIZE_BYTES) {\n throw new LuaLSError(\n `Archive declared decompressed size (${size} bytes) exceeds maximum limit (${MAX_DECOMPRESSED_SIZE_BYTES} bytes)`,\n \"ERR_LUALS_EXTRACT\",\n \"Run 'nanos-lint clean-cache' and ensure there is sufficient disk space.\",\n );\n }\n}\n\n/** Locates the platform tar executable path, checking System32 on Windows. */\nexport function getTarBinary(): string {\n if (process.platform === \"win32\") {\n const sysTar = path.join(process.env.SystemRoot || \"C:\\\\Windows\", \"System32\", \"tar.exe\");\n if (fs.existsSync(sysTar)) {\n return sysTar;\n }\n }\n return \"tar\";\n}\n\n/** Unix file type of a symbolic link entry, as stored in a zip external attributes field. */\nconst ZIP_UNIX_SYMLINK_TYPE = 0o120000;\n\n/** Builds the refusal error for archive-planted symbolic or hard link members. */\nfunction archiveLinkMemberError(): LuaLSError {\n return new LuaLSError(\n \"Archive member is a symbolic or hard link. Refusing to extract archive-planted links.\",\n \"ERR_LUALS_EXTRACT\",\n \"Run 'nanos-lint clean-cache' and verify the LuaLS release integrity.\",\n );\n}\n\n/**\n * Cross-checks a member's local file header against its central directory\n * record, so extraction cannot read a name, method or size the inspection never\n * validated.\n */\nfunction checkLocalFileHeader(\n buf: Buffer,\n record: ZipCentralDirectoryRecord,\n): ZipLocalFileHeaderRecord {\n const local = readZipLocalFileHeader(buf, record.localHeaderOffset);\n if (!local) {\n throw invalidZipArchive(`local file header is missing for '${record.fileName}'`);\n }\n if (!local.fileNameBytes.equals(record.fileNameBytes)) {\n throw invalidZipArchive(`local file header name does not match '${record.fileName}'`);\n }\n if (local.compressionMethod !== record.compressionMethod) {\n throw invalidZipArchive(\n `local file header compression method does not match '${record.fileName}'`,\n );\n }\n // With a data descriptor the sizes are only final after the member data, so\n // the local header legitimately carries zeros there.\n if (local.hasDataDescriptor || record.hasDataDescriptor) return local;\n if (\n local.uncompressedSize !== record.uncompressedSize ||\n local.compressedSize !== record.compressedSize\n ) {\n throw invalidZipArchive(`local file header sizes do not match '${record.fileName}'`);\n }\n return local;\n}\n\n/**\n * Walks every central directory record from the declared offset until the\n * declared central directory end, enforcing the extraction constraints on each\n * member and reconciling the walked records with the declared count. A walk\n * that cannot be completed is a rejection, never an empty archive.\n */\nfunction walkCentralDirectory(\n buf: Buffer,\n eocdOffset: number,\n location: ZipCentralDirectoryLocation,\n): { memberCount: number; totalDeclaredSize: number } {\n const { entryCount, cdOffset, cdSize } = location;\n if (entryCount === 0) {\n throw invalidZipArchive(\"central directory declares zero members\");\n }\n checkArchiveLimits(entryCount, 0);\n\n const cdEnd = cdOffset + cdSize;\n if (cdEnd > buf.length) {\n throw invalidZipArchive(\"central directory extends past the end of the archive\");\n }\n\n let offset = cdOffset;\n let memberCount = 0;\n let totalDeclaredSize = 0;\n const pairs: ZipMemberPair[] = [];\n while (offset < cdEnd) {\n const record = readZipCentralDirectoryRecord(buf, offset);\n if (!record) {\n throw invalidZipArchive(\"truncated or corrupt central directory record\");\n }\n if (record.unixFileType === ZIP_UNIX_SYMLINK_TYPE) {\n throw archiveLinkMemberError();\n }\n checkEscapedMember(record.fileName);\n pairs.push({ record, local: checkLocalFileHeader(buf, record) });\n memberCount++;\n totalDeclaredSize += record.uncompressedSize;\n checkArchiveLimits(memberCount, totalDeclaredSize);\n offset = record.nextOffset;\n }\n\n if (offset !== cdEnd) {\n throw invalidZipArchive(\n \"central directory records overrun the declared central directory size\",\n );\n }\n if (memberCount !== entryCount) {\n throw invalidZipArchive(\n `central directory contains ${memberCount} member(s) but declares ${entryCount}`,\n );\n }\n assertCentralDirectoryTerminator(buf, cdEnd, eocdOffset);\n assertLocalFileHeadersTileArchive(buf, cdOffset, pairs);\n return { memberCount, totalDeclaredSize };\n}\n\n/**\n * Pre-inspects a ZIP archive's central directory to enforce extraction safety\n * constraints (#31). Fails closed: the directory is walked record by record and\n * rejected unless the walk terminates on a valid end record, matches the\n * declared member count and central directory size, and holds at least one member.\n */\nexport function inspectZipMembers(archivePath: string): {\n memberCount: number;\n totalDeclaredSize: number;\n} {\n const buf = fs.readFileSync(archivePath);\n if (buf.length < ZIP_EOCD_MIN_SIZE) {\n throw invalidZipArchive(\"archive is too small to be a valid zip\");\n }\n\n const eocdOffset = findEndOfCentralDirectory(buf);\n if (eocdOffset === -1) {\n throw invalidZipArchive(\"corrupt or invalid zip archive (missing EOCD)\");\n }\n\n const location = resolveCentralDirectoryLocation(buf, eocdOffset);\n return walkCentralDirectory(buf, eocdOffset, location);\n}\n\n/** Detects whether an archive file starts with ZIP magic bytes. */\nexport function isZipArchive(archivePath: string): boolean {\n try {\n const fd = fs.openSync(archivePath, \"r\");\n const buf = Buffer.alloc(4);\n const bytesRead = fs.readSync(fd, buf, 0, 4, 0);\n fs.closeSync(fd);\n if (bytesRead < 4) return false;\n return (\n buf[0] === 0x50 &&\n buf[1] === 0x4b &&\n ((buf[2] === 0x03 && buf[3] === 0x04) ||\n (buf[2] === 0x05 && buf[3] === 0x06) ||\n (buf[2] === 0x07 && buf[3] === 0x08))\n );\n } catch {\n return false;\n }\n}\n\n/** Detects whether an archive file starts with GZIP magic bytes. */\nexport function isGzipArchive(archivePath: string): boolean {\n try {\n const fd = fs.openSync(archivePath, \"r\");\n const buf = Buffer.alloc(2);\n const bytesRead = fs.readSync(fd, buf, 0, 2, 0);\n fs.closeSync(fd);\n return bytesRead >= 2 && buf[0] === 0x1f && buf[1] === 0x8b;\n } catch {\n return false;\n }\n}\n\n/** Pre-inspects archive members using tar listing or zip directory parsing to enforce extraction safety constraints (#31). */\nexport async function validateArchiveMembers(\n archivePath: string,\n): Promise<{ memberCount: number; totalDeclaredSize: number }> {\n if (\n isZipArchive(archivePath) ||\n (archivePath.toLowerCase().endsWith(\".zip\") && !isGzipArchive(archivePath))\n ) {\n return inspectZipMembers(archivePath);\n }\n\n let memberCount = 0;\n let totalDeclaredSize = 0;\n const tarBin = getTarBinary();\n const archiveDir = path.dirname(archivePath);\n const archiveFile = path.basename(archivePath);\n\n try {\n const [namesOutput, verboseOutput] = await Promise.all([\n execFileAsync(tarBin, [\"-tf\", archiveFile], { cwd: archiveDir }),\n execFileAsync(tarBin, [\"-tvf\", archiveFile], { cwd: archiveDir }),\n ]);\n\n for (const rawName of namesOutput.stdout.split(/\\r?\\n/)) {\n const member = rawName.trim();\n if (!member) continue;\n memberCount++;\n checkEscapedMember(member);\n }\n\n for (const rawLine of verboseOutput.stdout.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line) continue;\n if (/^[lh]/.test(line) || line.includes(\" -> \") || line.includes(\" link to \")) {\n throw new LuaLSError(\n \"Archive member is a symbolic or hard link. Refusing to extract archive-planted links.\",\n \"ERR_LUALS_EXTRACT\",\n \"Run 'nanos-lint clean-cache' and verify the LuaLS release integrity.\",\n );\n }\n totalDeclaredSize += parseTarTvSize(line);\n }\n checkArchiveLimits(memberCount, totalDeclaredSize);\n } catch (err) {\n if (err instanceof LuaLSError) throw err;\n throw new LuaLSError(\n `Failed to inspect release archive before extraction: ${err instanceof Error ? err.message : String(err)}`,\n \"ERR_LUALS_EXTRACT\",\n \"Run 'nanos-lint clean-cache' and ensure there is sufficient disk space.\",\n { cause: err },\n );\n }\n\n return { memberCount, totalDeclaredSize };\n}\n\n/**\n * Minimum plausible size of a downloaded LuaLS executable. Release assets are\n * several megabytes, so anything smaller is a truncated download or a stray\n * file. This floor only applies to binaries nanos-lint fetched itself: a\n * user-supplied `LUALS_BIN` may legitimately be a small wrapper script.\n */\nexport const MIN_DOWNLOADED_BINARY_SIZE_BYTES = 100_000;\n\n/** Propagates blocked LuaLS execution or cache access without triggering repair. */\nexport function rethrowLuaLSPermissionError(\n err: unknown,\n targetPath: string,\n operation: \"execute\" | \"access\" = \"access\",\n): void {\n if (\n err instanceof LuaLSError &&\n (err.code === \"ERR_LUALS_EXECUTION_DENIED\" || err.code === \"ERR_LUALS_CACHE_PERMISSION\")\n ) {\n throw err;\n }\n const code = (err as NodeJS.ErrnoException | null)?.code;\n if (code !== \"EPERM\" && code !== \"EACCES\") return;\n throw new LuaLSError(\n `Cannot ${operation} LuaLS ${operation === \"execute\" ? \"binary\" : \"cache path\"} '${targetPath}': ${code}: ${err instanceof Error ? err.message : String(err)}`,\n operation === \"execute\" ? \"ERR_LUALS_EXECUTION_DENIED\" : \"ERR_LUALS_CACHE_PERMISSION\",\n operation === \"execute\"\n ? \"Run nanos-lint in an environment that permits LuaLS execution and check the binary's execute permissions and sandbox policy. The existing cache has been preserved.\"\n : \"Allow access to the LuaLS cache directory or use a writable cache directory.\",\n { cause: err },\n );\n}\n\n/**\n * Runs `binaryPath --version` and checks that it reports a LuaLS version.\n * Shared by every binary validation path; the size heuristic stays separate\n * because only downloaded archives have a known-plausible size.\n */\nfunction reportsLuaLSVersion(binaryPath: string): boolean {\n try {\n const output = execFileSync(binaryPath, [\"--version\"], {\n timeout: 5000,\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n return /^\\d+\\.\\d+\\.\\d+/.test(output.trim());\n } catch (err) {\n rethrowLuaLSPermissionError(err, binaryPath, \"execute\");\n logger.debug(\n `[luals] Binary validation check failed for ${binaryPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n return false;\n }\n}\n\n/**\n * Verifies that a downloaded or cached LuaLS binary exists, has non-trivial\n * size, and is executable.\n */\nexport function isBinaryValid(binaryPath: string): boolean {\n if (!fs.existsSync(binaryPath)) {\n return false;\n }\n try {\n const stats = fs.statSync(binaryPath);\n if (!stats.isFile() || stats.size < MIN_DOWNLOADED_BINARY_SIZE_BYTES) {\n return false;\n }\n return reportsLuaLSVersion(binaryPath);\n } catch (err) {\n rethrowLuaLSPermissionError(err, binaryPath);\n logger.debug(\n `[luals] Binary validation check failed for ${binaryPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n return false;\n }\n}\n\n/**\n * Verifies that an explicitly configured binary is a regular file that runs and\n * reports a LuaLS version, without the downloaded-archive size heuristic so\n * wrapper scripts (`LUALS_BIN=/usr/local/bin/lua-language-server`) keep working.\n */\nexport function isBinaryRunnable(binaryPath: string): boolean {\n try {\n if (!fs.statSync(binaryPath).isFile()) {\n return false;\n }\n } catch (err) {\n rethrowLuaLSPermissionError(err, binaryPath);\n logger.debug(\n `[luals] Binary validation check failed for ${binaryPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n return false;\n }\n return reportsLuaLSVersion(binaryPath);\n}\n\n/**\n * Validates an explicitly configured LuaLS binary (`LUALS_BIN` environment\n * variable or `--luals-bin` CLI option) and returns its path.\n *\n * Both are documented escape hatches, so a typo, a stale path, a directory or an\n * unrelated executable must fail with an actionable error instead of a\n * confusing low-level failure deep inside the check run (#26). Executables are\n * accepted as-is when `--version` reports a version, including the thin wrapper\n * scripts that Homebrew/mason-style installations put on `PATH`: the size floor\n * used for downloaded archives would reject those.\n *\n * @param binaryPath Path exactly as the user supplied it.\n * @param source Name of the setting being validated (`LUALS_BIN` / `--luals-bin`).\n */\nexport function assertValidLuaLSBinary(binaryPath: string, source: string): string {\n let stats: fs.Stats;\n try {\n stats = fs.statSync(binaryPath);\n } catch (err) {\n rethrowLuaLSPermissionError(err, binaryPath);\n throw new LuaLSError(\n `${source} points to '${binaryPath}', which does not exist or cannot be read: ${err instanceof Error ? err.message : String(err)}`,\n \"ERR_LUALS_BIN_INVALID\",\n `Set ${source} to the full path of a lua-language-server executable, or leave it unset so nanos-lint resolves LuaLS automatically.`,\n { cause: err },\n );\n }\n\n if (!stats.isFile()) {\n throw new LuaLSError(\n `${source} points to '${binaryPath}', which is not a regular file (a directory or special file was found).`,\n \"ERR_LUALS_BIN_INVALID\",\n `Point ${source} at the lua-language-server executable itself, or leave it unset so nanos-lint resolves LuaLS automatically.`,\n );\n }\n\n if (!isBinaryRunnable(binaryPath)) {\n throw new LuaLSError(\n `${source} points to '${binaryPath}', which is not a runnable LuaLS binary (running it with '--version' failed or printed no version).`,\n \"ERR_LUALS_BIN_INVALID\",\n `Verify ${source} points at a working lua-language-server executable or wrapper script, or leave it unset so nanos-lint resolves LuaLS automatically.`,\n );\n }\n\n return binaryPath;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { systemPaths } from \"../paths.js\";\nimport { logger } from \"../logger.js\";\nimport { getPackageRoot } from \"../config.js\";\nimport { FALLBACK_LUALS_VERSION, sanitizeLuaLSVersion } from \"./version.js\";\nimport { getPlatformInfo } from \"./platform.js\";\nimport { isBinaryValid, rethrowLuaLSPermissionError } from \"./validation.js\";\nimport { writeAtomicFileSync } from \"../lock.js\";\n\n/** Returns the base directory in the system cache where LuaLS versions and metadata are stored. */\nexport function getBaseLuaLSCacheDir(): string {\n return path.join(systemPaths.cache, \"luals\");\n}\n\n/**\n * Cache directory of a LuaLS version. `baseCacheDir` defaults to the system\n * cache and can be overridden to keep a caller isolated from it.\n */\nexport function getCacheDir(\n version: string = FALLBACK_LUALS_VERSION,\n baseCacheDir: string = getBaseLuaLSCacheDir(),\n): string {\n return path.join(baseCacheDir, version);\n}\n\nexport const LUALS_METADATA_FILENAME = \"metadata.json\";\n\nexport interface LuaLSMetadata {\n lastCheckedWeek: string;\n latestVersion: string;\n lastCheckedDate?: string;\n}\n\n/**\n * Calculates the ISO 8601 week string for a given date in the format 'YYYY-Www' (e.g. '2026-W39').\n */\nexport function getIsoWeek(d: Date = new Date()): string {\n const date = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));\n const dayNum = date.getUTCDay() || 7;\n date.setUTCDate(date.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(date.getUTCFullYear(), 0, 1));\n const weekNo = Math.ceil(((date.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n return `${date.getUTCFullYear()}-W${String(weekNo).padStart(2, \"0\")}`;\n}\n\n/** Returns the path to the LuaLS metadata.json file within the specified cache directory. */\nexport function getLuaLSMetadataPath(baseCacheDir: string = getBaseLuaLSCacheDir()): string {\n return path.join(baseCacheDir, LUALS_METADATA_FILENAME);\n}\n\n/** Reads and parses the LuaLS metadata.json file, purging corrupted or invalid files automatically. */\nexport function readLuaLSMetadata(\n baseCacheDir: string = getBaseLuaLSCacheDir(),\n): LuaLSMetadata | null {\n const metaPath = getLuaLSMetadataPath(baseCacheDir);\n if (!fs.existsSync(metaPath)) {\n return null;\n }\n try {\n const content = fs.readFileSync(metaPath, \"utf-8\");\n const parsed = JSON.parse(content) as LuaLSMetadata;\n const rawVersion = parsed?.latestVersion;\n const safeVersion = typeof rawVersion === \"string\" ? sanitizeLuaLSVersion(rawVersion) : null;\n if (typeof parsed?.lastCheckedWeek === \"string\" && safeVersion !== null) {\n return {\n ...parsed,\n latestVersion: safeVersion,\n };\n }\n try {\n fs.unlinkSync(metaPath);\n logger.warn(`[luals] Stale or invalid LuaLS metadata at ${metaPath} purged.`);\n } catch (unlinkErr) {\n logger.debug(\n `[luals] Failed to unlink invalid metadata: ${unlinkErr instanceof Error ? unlinkErr.message : String(unlinkErr)}`,\n );\n }\n } catch (err) {\n logger.debug(\n `[luals] Failed to parse LuaLS metadata: ${err instanceof Error ? err.message : String(err)}`,\n );\n try {\n fs.unlinkSync(metaPath);\n logger.warn(`[luals] Corrupted LuaLS metadata at ${metaPath} purged.`);\n } catch (unlinkErr) {\n logger.debug(\n `[luals] Failed to unlink corrupted metadata: ${unlinkErr instanceof Error ? unlinkErr.message : String(unlinkErr)}`,\n );\n }\n }\n return null;\n}\n\n/**\n * Writes metadata.json containing the latest checked version and timestamp.\n * The write is atomic (#7), so a parallel reader never observes a half-written file.\n */\nexport function writeLuaLSMetadata(\n metadata: LuaLSMetadata,\n baseCacheDir: string = getBaseLuaLSCacheDir(),\n): void {\n try {\n const metaPath = getLuaLSMetadataPath(baseCacheDir);\n writeAtomicFileSync(metaPath, JSON.stringify(metadata, null, 2));\n } catch (err) {\n logger.warn(\n `[luals] Failed to write LuaLS metadata: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Lists all candidate LuaLS version directories under baseCacheDir without running\n * execution smoke tests on the binaries.\n */\nexport function listCachedLuaLSVersionDirs(\n baseCacheDir: string = getBaseLuaLSCacheDir(),\n): string[] {\n if (!fs.existsSync(baseCacheDir)) {\n return [];\n }\n try {\n const entries = fs.readdirSync(baseCacheDir, { withFileTypes: true });\n const versions: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith(\".\")) {\n continue;\n }\n const version = sanitizeLuaLSVersion(entry.name);\n if (version) {\n versions.push(version);\n }\n }\n return versions;\n } catch (err) {\n logger.debug(\n `[luals] Failed to list cached LuaLS version directories: ${err instanceof Error ? err.message : String(err)}`,\n );\n return [];\n }\n}\n\n/**\n * Lists all cached LuaLS versions in baseCacheDir that have a valid .complete marker\n * and a functional executable binary.\n */\nexport function listCachedLuaLSVersions(baseCacheDir: string = getBaseLuaLSCacheDir()): string[] {\n if (!fs.existsSync(baseCacheDir)) {\n return [];\n }\n try {\n const entries = fs.readdirSync(baseCacheDir, { withFileTypes: true });\n const versions: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith(\".\")) {\n continue;\n }\n const version = sanitizeLuaLSVersion(entry.name);\n if (!version) {\n continue;\n }\n const dirPath = path.join(baseCacheDir, entry.name);\n const marker = path.join(dirPath, \".complete\");\n const info = getPlatformInfo(version);\n const bin = path.join(dirPath, info.binaryRelativePath);\n if (fs.existsSync(marker) && fs.existsSync(bin)) {\n try {\n if (fs.readFileSync(marker, \"utf-8\").trim() === version && isBinaryValid(bin)) {\n versions.push(version);\n }\n } catch (err) {\n rethrowLuaLSPermissionError(err, bin);\n logger.debug(\n `[luals] Error validating cached version ${version}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n return versions;\n } catch (err) {\n rethrowLuaLSPermissionError(err, baseCacheDir);\n logger.debug(\n `[luals] Failed to list cached LuaLS versions: ${err instanceof Error ? err.message : String(err)}`,\n );\n return [];\n }\n}\n\n/**\n * Removes older cached LuaLS version directories, preserving keepVersion,\n * hidden/temporary directories, and metadata files.\n */\nexport function cleanupOldCachedLuaLSVersions(\n keepVersion: string,\n baseCacheDir: string = getBaseLuaLSCacheDir(),\n): string[] {\n if (!fs.existsSync(baseCacheDir)) {\n return [];\n }\n const removed: string[] = [];\n try {\n const entries = fs.readdirSync(baseCacheDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n if (entry.name.startsWith(\".\")) {\n continue;\n }\n if (entry.name !== keepVersion) {\n const dirPath = path.join(baseCacheDir, entry.name);\n try {\n fs.rmSync(dirPath, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });\n removed.push(entry.name);\n logger.info(`[luals] Cleaned up older cached LuaLS version: ${entry.name}`);\n } catch (err) {\n logger.warn(\n `[luals] Failed to remove older cached LuaLS version at ${dirPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n } catch (err) {\n logger.debug(\n `[luals] Failed to clean up old LuaLS versions: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n return removed;\n}\n\n/**\n * Locates an existing, valid LuaLS directory for the specified version in the\n * primary cache (`baseCacheDir`) or the package root.\n */\nexport function findExistingLuaLSDir(\n version: string,\n baseCacheDir: string = getBaseLuaLSCacheDir(),\n): string | null {\n const info = getPlatformInfo(version);\n\n // 1. Primary system cache\n const primaryCache = getCacheDir(version, baseCacheDir);\n const primaryBin = path.join(primaryCache, info.binaryRelativePath);\n const primaryMarker = path.join(primaryCache, \".complete\");\n if (fs.existsSync(primaryMarker)) {\n try {\n if (fs.readFileSync(primaryMarker, \"utf-8\").trim() === version && isBinaryValid(primaryBin)) {\n return primaryCache;\n }\n } catch (err) {\n rethrowLuaLSPermissionError(err, primaryMarker);\n logger.debug(\n `[luals] Error checking primary LuaLS cache marker at ${primaryMarker}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n // 2. Package bundled root (release distributions)\n const pkgRoot = getPackageRoot();\n const pkgBin = path.join(pkgRoot, info.binaryRelativePath);\n if (fs.existsSync(pkgBin) && isBinaryValid(pkgBin)) {\n return pkgRoot;\n }\n\n return null;\n}\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { logger } from \"../logger.js\";\nimport { DEFAULT_LUALS_VERSION, resolveLuaLSVersion } from \"./version.js\";\nimport { getPlatformInfo } from \"./platform.js\";\nimport { findExistingLuaLSDir, getBaseLuaLSCacheDir, getCacheDir } from \"./cache.js\";\nimport {\n rethrowLuaLSPermissionError,\n isBinaryValid,\n MAX_DECOMPRESSED_SIZE_BYTES,\n validateArchiveMembers,\n getTarBinary,\n escapePowerShellSingleQuote,\n} from \"./validation.js\";\nimport { LuaLSError } from \"../errors.js\";\nimport { formatBytes, getDirectorySize } from \"../paths.js\";\nimport { withFileLock } from \"../lock.js\";\nimport { cancelResponseBody, guardedFetch, parseDeclaredContentLength } from \"../download-guard.js\";\nimport { createProgressBar, createSpinner, formatTransferSummary } from \"../terminal-progress.js\";\n\nexport {\n isBinaryValid,\n MAX_DECOMPRESSED_SIZE_BYTES,\n MAX_ARCHIVE_MEMBER_COUNT,\n parseTarTvSize,\n validateArchiveMembers,\n getTarBinary,\n escapePowerShellSingleQuote,\n} from \"./validation.js\";\n\nexport const DOWNLOAD_TIMEOUT_MS = 120_000;\nexport const MAX_ARCHIVE_SIZE_BYTES = 150 * 1024 * 1024; // 150 MB\n\n/** Re-exported so the allowlist policy has a single definition (see `src/download-guard.ts`). */\nexport { ALLOWED_DOWNLOAD_DOMAINS, isAllowedDownloadUrl } from \"../download-guard.js\";\n\n/** Chunk size used when hashing an archive, so a 150 MB asset is never buffered whole. */\nconst HASH_CHUNK_SIZE_BYTES = 1024 * 1024;\n\n/**\n * Calculates the SHA-256 hash of a file on disk in bounded memory.\n */\nexport function computeFileSha256(filePath: string): string {\n const hash = crypto.createHash(\"sha256\");\n const fd = fs.openSync(filePath, \"r\");\n try {\n const buffer = Buffer.alloc(HASH_CHUNK_SIZE_BYTES);\n let position = 0;\n let bytesRead = fs.readSync(fd, buffer, 0, buffer.length, position);\n while (bytesRead > 0) {\n hash.update(buffer.subarray(0, bytesRead));\n position += bytesRead;\n bytesRead = fs.readSync(fd, buffer, 0, buffer.length, position);\n }\n } finally {\n fs.closeSync(fd);\n }\n return hash.digest(\"hex\");\n}\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Enforces a maximum byte count on an asynchronous download stream.\n */\nexport async function* limitDownloadStream(\n source: AsyncIterable<Uint8Array | Buffer>,\n): AsyncGenerator<Uint8Array | Buffer, void, unknown> {\n let total = 0;\n for await (const chunk of source) {\n total += chunk.length;\n if (total > MAX_ARCHIVE_SIZE_BYTES) {\n throw new LuaLSError(\n `Download exceeded maximum allowed size of ${MAX_ARCHIVE_SIZE_BYTES} bytes`,\n \"ERR_LUALS_DOWNLOAD\",\n \"Verify the LuaLS release asset size or specify a local binary with LUALS_BIN.\",\n );\n }\n yield chunk;\n }\n}\n\n/** Reports cumulative transferred bytes while passing a download stream through unchanged. */\nexport async function* trackDownloadProgress(\n source: AsyncIterable<Uint8Array | Buffer>,\n onProgress: (transferred: number) => void,\n): AsyncGenerator<Uint8Array | Buffer, void, unknown> {\n let transferred = 0;\n for await (const chunk of source) {\n transferred += chunk.length;\n onProgress(transferred);\n yield chunk;\n }\n}\n\nexport interface DownloadOptions {\n reuseExisting?: boolean;\n /** Base directory searched for an installed copy when reusing. Defaults to the system cache. */\n cacheDir?: string;\n}\n\n/** Returns whether a cache directory holds a complete, executable LuaLS installation. */\nfunction isCompleteLuaLSInstall(\n binaryPath: string,\n completeMarker: string,\n version: string,\n): boolean {\n if (!fs.existsSync(binaryPath) || !fs.existsSync(completeMarker)) {\n return false;\n }\n try {\n return fs.readFileSync(completeMarker, \"utf-8\").trim() === version && isBinaryValid(binaryPath);\n } catch (err) {\n rethrowLuaLSPermissionError(err, completeMarker);\n logger.debug(\n `[luals] Failed to read complete marker at ${completeMarker}: ${err instanceof Error ? err.message : String(err)}`,\n );\n return false;\n }\n}\n\n/**\n * Downloads, verifies, and extracts the LuaLS release archive for the current platform.\n *\n * Concurrent callers targeting the same cache directory serialize on a version lock\n * (`.luals-<version>.lock`) and the completion check is repeated once the lock is held,\n * so exactly one worker downloads while the others reuse the promoted directory (#7).\n */\nexport async function downloadAndExtractLuaLS(\n version: string = DEFAULT_LUALS_VERSION,\n targetDir?: string,\n options?: DownloadOptions,\n): Promise<string> {\n const resolvedVersion = await resolveLuaLSVersion(version);\n const info = getPlatformInfo(resolvedVersion);\n const destDir = targetDir || getCacheDir(resolvedVersion);\n const binaryPath = path.join(destDir, info.binaryRelativePath);\n const completeMarker = path.join(destDir, \".complete\");\n\n if (\n options?.reuseExisting !== false &&\n isCompleteLuaLSInstall(binaryPath, completeMarker, resolvedVersion)\n ) {\n return binaryPath;\n }\n\n const lockPath = path.join(path.dirname(destDir), `.${path.basename(destDir)}.lock`);\n return withFileLock(\n lockPath,\n () =>\n downloadAndPromoteLuaLS(resolvedVersion, info, destDir, binaryPath, completeMarker, options),\n { label: `LuaLS ${resolvedVersion}` },\n );\n}\n\n/** Performs the locked download/extraction work, skipping it when another worker won. */\nasync function downloadAndPromoteLuaLS(\n resolvedVersion: string,\n info: ReturnType<typeof getPlatformInfo>,\n destDir: string,\n binaryPath: string,\n completeMarker: string,\n options?: DownloadOptions,\n): Promise<string> {\n if (\n options?.reuseExisting !== false &&\n isCompleteLuaLSInstall(binaryPath, completeMarker, resolvedVersion)\n ) {\n logger.info(`[luals] LuaLS ${resolvedVersion} was installed by a concurrent run; reusing it.`);\n return binaryPath;\n }\n\n if (fs.existsSync(destDir)) {\n if (\n options?.reuseExisting !== false &&\n fs.existsSync(binaryPath) &&\n fs.existsSync(completeMarker)\n ) {\n try {\n const storedVersion = fs.readFileSync(completeMarker, \"utf-8\").trim();\n if (storedVersion === resolvedVersion && isBinaryValid(binaryPath)) {\n return binaryPath;\n }\n } catch (err) {\n rethrowLuaLSPermissionError(err, completeMarker);\n logger.debug(\n `[luals] Failed to read complete marker at ${completeMarker}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n // destDir exists but is invalid/corrupted/stale or reuseExisting is false: clean it up before downloading\n try {\n fs.rmSync(destDir, { recursive: true, force: true });\n } catch (err) {\n rethrowLuaLSPermissionError(err, destDir);\n logger.warn(\n `[luals] Failed to remove stale or invalid cache dir ${destDir}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n const parentDir = path.dirname(destDir);\n fs.mkdirSync(parentDir, { recursive: true });\n\n const tempDir = path.join(\n parentDir,\n `.${path.basename(destDir)}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n );\n fs.mkdirSync(tempDir, { recursive: true });\n\n const canReuse = options?.reuseExisting !== false;\n const existingSourceDir = canReuse\n ? findExistingLuaLSDir(resolvedVersion, options?.cacheDir ?? getBaseLuaLSCacheDir())\n : null;\n const shouldCopyFromExisting =\n existingSourceDir !== null && path.resolve(existingSourceDir) !== path.resolve(destDir);\n\n const url = `https://github.com/LuaLS/lua-language-server/releases/download/${resolvedVersion}/${info.assetName}`;\n const archivePath = path.join(tempDir, info.assetName);\n\n try {\n if (shouldCopyFromExisting) {\n logger.info(\n `[luals] Reusing existing LuaLS ${resolvedVersion} installation from ${existingSourceDir}...`,\n );\n fs.cpSync(existingSourceDir, tempDir, { recursive: true });\n } else {\n logger.info(`[luals] Downloading LuaLS ${resolvedVersion} from ${url}...`);\n\n let response: Response | null = null;\n let lastErr: unknown = null;\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n // The guard resolves redirects hop by hop, so the release asset is never requested\n // from a host the allowlist has not approved *before* that host is contacted.\n const outcome = await guardedFetch(url, {\n signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS),\n });\n if (!outcome.ok || !outcome.response) {\n if (outcome.reason !== \"network-error\") {\n // A refused hop is a policy verdict, not a transient failure: never retry it.\n const blockedMessage = `Redirect to untrusted URL blocked: ${outcome.url ?? url}`;\n logger.warn(`[luals] ${blockedMessage}`);\n throw new LuaLSError(\n blockedMessage,\n \"ERR_LUALS_DOWNLOAD\",\n \"Download redirects must stay on allowlisted HTTPS GitHub hosts.\",\n );\n }\n lastErr = outcome.error ?? new Error(`Failed to download ${url}`);\n } else if (outcome.response.ok && outcome.response.body) {\n response = outcome.response;\n break;\n } else {\n const res = outcome.response;\n await cancelResponseBody(res);\n lastErr = new Error(`Failed to download ${url}: ${res.status} ${res.statusText}`);\n }\n } catch (err) {\n if (err instanceof LuaLSError) {\n throw err;\n }\n lastErr = err;\n }\n if (attempt < 3) {\n await new Promise((resolve) => setTimeout(resolve, attempt * 1000));\n }\n }\n\n if (!response || !response.body) {\n throw new LuaLSError(\n `Failed to download LuaLS from ${url}${lastErr ? `: ${lastErr instanceof Error ? lastErr.message : String(lastErr)}` : \"\"}`,\n \"ERR_LUALS_DOWNLOAD\",\n \"Check your network connection or specify a custom binary with LUALS_BIN.\",\n { cause: lastErr },\n );\n }\n\n const contentLengthHeader = response.headers?.get?.(\"content-length\");\n if (contentLengthHeader) {\n const contentLength = parseInt(contentLengthHeader, 10);\n if (!isNaN(contentLength) && contentLength > MAX_ARCHIVE_SIZE_BYTES) {\n await response.body.cancel();\n throw new LuaLSError(\n `Archive size (${contentLength} bytes) exceeds maximum limit (${MAX_ARCHIVE_SIZE_BYTES} bytes)`,\n \"ERR_LUALS_DOWNLOAD\",\n \"Verify the LuaLS release asset size or specify a local binary with LUALS_BIN.\",\n );\n }\n }\n const declaredTotal = parseDeclaredContentLength(response);\n\n const downloadStartedAt = Date.now();\n let transferred = 0;\n const progress = createProgressBar({\n label: `[luals] Downloading ${info.assetName}`,\n total: declaredTotal,\n announce: false,\n });\n const fileStream = fs.createWriteStream(archivePath);\n try {\n const streamSource =\n typeof (Readable as unknown as { fromWeb?: (stream: unknown) => Readable }).fromWeb ===\n \"function\" && !(\"pipe\" in response.body)\n ? Readable.fromWeb(response.body as import(\"node:stream/web\").ReadableStream)\n : (response.body as unknown as Readable);\n\n await pipeline(\n streamSource,\n limitDownloadStream,\n (source: AsyncIterable<Uint8Array | Buffer>) =>\n trackDownloadProgress(source, (bytes) => {\n transferred = bytes;\n progress.update(bytes, declaredTotal);\n }),\n fileStream,\n );\n } catch (streamErr) {\n progress.fail();\n try {\n if (fs.existsSync(archivePath)) {\n fs.unlinkSync(archivePath);\n }\n } catch (unlinkErr) {\n void unlinkErr;\n }\n if (streamErr instanceof LuaLSError) {\n throw streamErr;\n }\n throw new LuaLSError(\n `Failed to download LuaLS from ${url}: ${streamErr instanceof Error ? streamErr.message : String(streamErr)}`,\n \"ERR_LUALS_DOWNLOAD\",\n \"Check your network connection or specify a custom binary with LUALS_BIN.\",\n { cause: streamErr },\n );\n }\n progress.finish(\n `[luals] Downloaded ${info.assetName} (${formatTransferSummary(transferred, Date.now() - downloadStartedAt)})`,\n );\n\n // Audit trail only: the digest is recorded so a downloaded asset can be\n // compared out of band. It is not checked against a pinned value, because\n // upstream publishes no signed checksums (see SECURITY.md).\n const archiveSha256 = computeFileSha256(archivePath);\n logger.info(`[luals] Downloaded ${info.assetName} (SHA-256 ${archiveSha256})`);\n\n logger.info(`[luals] Extracting to ${destDir}...`);\n\n const spinner = createSpinner({\n label: `[luals] Extracting ${info.assetName}`,\n announce: false,\n });\n spinner.start();\n let extractedSize: number;\n try {\n await validateArchiveMembers(archivePath);\n\n try {\n // Both Windows 10+ and UNIX systems have tar built in\n const tarArgs =\n process.platform === \"win32\"\n ? [\"-xf\", path.basename(archivePath), \"-C\", tempDir]\n : [\n \"-xf\",\n path.basename(archivePath),\n \"--no-same-owner\",\n \"--no-same-permissions\",\n \"-C\",\n tempDir,\n ];\n await execFileAsync(getTarBinary(), tarArgs, { cwd: path.dirname(archivePath) });\n } catch (tarErr) {\n // Fallback for PowerShell Expand-Archive on Windows if tar fails.\n // `validateArchiveMembers()` reconciled the central directory with the\n // archive's local file headers before this point, so both extractors see\n // the same members: retrying only changes which tool reports a failure.\n if (process.platform === \"win32\" && info.assetName.endsWith(\".zip\")) {\n await execFileAsync(\"powershell.exe\", [\n \"-NoProfile\",\n \"-Command\",\n `Expand-Archive -Path '${escapePowerShellSingleQuote(archivePath)}' -DestinationPath '${escapePowerShellSingleQuote(tempDir)}' -Force`,\n ]);\n } else {\n throw tarErr;\n }\n }\n\n spinner.updateText(\"[luals] Verifying extracted files\");\n extractedSize = getDirectorySize(tempDir);\n if (extractedSize > MAX_DECOMPRESSED_SIZE_BYTES) {\n throw new LuaLSError(\n `Extracted archive size (${extractedSize} bytes) exceeds maximum limit (${MAX_DECOMPRESSED_SIZE_BYTES} bytes)`,\n \"ERR_LUALS_EXTRACT\",\n \"Run 'nanos-lint clean-cache' and ensure there is sufficient disk space.\",\n );\n }\n\n // Cleanup archive file\n try {\n fs.unlinkSync(archivePath);\n } catch (err) {\n logger.debug(\n `[luals] Failed to delete temporary archive ${archivePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n spinner.stop(`[luals] Extracted ${formatBytes(extractedSize)} to ${destDir}`);\n } catch (extractErr) {\n spinner.fail();\n throw extractErr;\n }\n }\n\n const tempBinaryPath = path.join(tempDir, info.binaryRelativePath);\n\n // Verify file exists before checking attributes\n if (!fs.existsSync(tempBinaryPath)) {\n throw new LuaLSError(\n `Failed to extract valid LuaLS binary to expected path: ${tempBinaryPath}`,\n \"ERR_LUALS_EXTRACT\",\n \"Run 'nanos-lint clean-cache' and ensure there is sufficient disk space.\",\n );\n }\n\n // Verify binary is a regular file and not a symlink to prevent chmod following archive-planted symlinks\n const lstat = fs.lstatSync(tempBinaryPath);\n if (lstat.isSymbolicLink()) {\n throw new LuaLSError(\n `Extracted binary at '${tempBinaryPath}' is a symbolic link. Refusing to chmod or execute archive-planted symlinks.`,\n \"ERR_LUALS_EXTRACT\",\n \"Run 'nanos-lint clean-cache' and verify the LuaLS release integrity.\",\n );\n }\n if (!lstat.isFile()) {\n throw new LuaLSError(\n `Extracted binary at '${tempBinaryPath}' is not a regular file.`,\n \"ERR_LUALS_EXTRACT\",\n \"Run 'nanos-lint clean-cache' and verify the LuaLS release integrity.\",\n );\n }\n\n // Verify that the real path does not escape the extraction directory. Both\n // sides are canonicalized, because the extraction directory itself can be\n // reached through symlinks (for example `/var` -> `/private/var` on macOS,\n // where `os.tmpdir()` lives), which would otherwise reject every download.\n const realBinaryPath = fs.realpathSync(tempBinaryPath);\n const resolvedTemp = fs.realpathSync(tempDir);\n if (!realBinaryPath.startsWith(resolvedTemp + path.sep) && realBinaryPath !== resolvedTemp) {\n throw new LuaLSError(\n `Extracted binary path escapes extraction directory: ${realBinaryPath}`,\n \"ERR_LUALS_EXTRACT\",\n \"Run 'nanos-lint clean-cache' and verify the LuaLS release integrity.\",\n );\n }\n\n // Make executable on unix\n if (process.platform !== \"win32\") {\n try {\n fs.chmodSync(tempBinaryPath, 0o755);\n } catch (err) {\n logger.warn(\n `[luals] Failed to chmod binary at ${tempBinaryPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n if (lstat.size < 100_000) {\n throw new LuaLSError(\n `Failed to extract valid LuaLS binary to expected path: ${tempBinaryPath}`,\n \"ERR_LUALS_EXTRACT\",\n \"Run 'nanos-lint clean-cache' and ensure there is sufficient disk space.\",\n );\n }\n if (!isBinaryValid(tempBinaryPath)) {\n throw new LuaLSError(\n `Extracted LuaLS binary at ${tempBinaryPath} is invalid or non-functional.`,\n \"ERR_LUALS_INVALID_BINARY\",\n \"Run 'nanos-lint clean-cache' to remove corrupted downloads or set LUALS_BIN to a custom binary.\",\n );\n }\n\n // Write .complete marker in tempDir before promotion\n fs.writeFileSync(path.join(tempDir, \".complete\"), resolvedVersion, \"utf-8\");\n\n // Atomic promotion with retry and race resolution\n for (let attempt = 0; attempt < 5; attempt++) {\n try {\n fs.renameSync(tempDir, destDir);\n break;\n } catch (renameErr) {\n if (fs.existsSync(binaryPath) && isBinaryValid(binaryPath)) {\n // A concurrent worker already promoted destDir successfully\n try {\n fs.rmSync(tempDir, { recursive: true, force: true });\n } catch (err) {\n logger.debug(\n `[luals] Failed to remove temp directory after concurrent promotion: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n logger.info(`[luals] Ready: ${binaryPath}`);\n return binaryPath;\n }\n if (attempt < 4) {\n await new Promise((resolve) => setTimeout(resolve, 100 * (attempt + 1)));\n } else {\n // Clean up broken destDir if partially created or left corrupted during failed promotion\n if (\n fs.existsSync(destDir) &&\n (!fs.existsSync(binaryPath) || !fs.existsSync(completeMarker))\n ) {\n try {\n fs.rmSync(destDir, { recursive: true, force: true });\n } catch (err) {\n logger.warn(\n `[luals] Failed to clean up broken destination directory ${destDir}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n throw renameErr;\n }\n }\n }\n\n logger.info(`[luals] Ready: ${binaryPath}`);\n return binaryPath;\n } finally {\n if (fs.existsSync(tempDir)) {\n try {\n fs.rmSync(tempDir, { recursive: true, force: true });\n } catch (err) {\n logger.debug(\n `[luals] Failed to clean up temporary directory ${tempDir}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { stripTrailingSlashes } from \"./config.js\";\nimport { logger } from \"./logger.js\";\nimport { fileUriToPath } from \"./types.js\";\nimport type { DiagnosticReport } from \"./types.js\";\nimport { LuaLSError, ConfigError } from \"./errors.js\";\n\n/** Resolves the canonical filesystem path, falling back to original path on failure. */\nexport function getCanonicalPath(p: string): string {\n try {\n return fs.realpathSync.native ? fs.realpathSync.native(p) : fs.realpathSync(p);\n } catch {\n return p;\n }\n}\n\n/** Determines whether a path points to the root of a filesystem volume. */\nexport function isFilesystemRoot(dir: string): boolean {\n const stripped = dir.trim();\n if (stripped === \"/\" || stripped === \"\\\\\" || stripped === \"\") {\n return true;\n }\n if (/^[a-zA-Z]:[\\\\/]?$/.test(stripped)) {\n return true;\n }\n const norm = path.resolve(stripped);\n if (norm === \"/\" || norm === \"\\\\\") {\n return true;\n }\n return /^[a-zA-Z]:[\\\\/]?$/.test(norm);\n}\n\n/**\n * Computes the lowest common ancestor directory for a set of paths.\n * All paths must reside on the same filesystem root or volume.\n */\nexport function findCommonAncestorDirectory(paths: string[]): string {\n if (paths.length === 0) {\n return path.resolve(\".\");\n }\n\n const resolved = paths.map((p) => {\n const abs = path.resolve(p);\n try {\n if (fs.existsSync(abs)) {\n return fs.statSync(abs).isDirectory() ? abs : path.dirname(abs);\n }\n } catch (err) {\n void err;\n }\n return path.dirname(abs);\n });\n\n if (resolved.length === 1 && resolved[0]) {\n return resolved[0];\n }\n\n const isWin = process.platform === \"win32\";\n const splitPaths = resolved.map((p) => path.resolve(p).split(path.sep));\n\n const first = splitPaths[0];\n if (!first || first.length === 0) {\n return path.resolve(\".\");\n }\n\n const firstRoot = first[0];\n const sameDrive = splitPaths.every((p) => {\n const rootSeg = p[0];\n if (rootSeg === undefined) return false;\n return isWin ? rootSeg.toLowerCase() === firstRoot?.toLowerCase() : rootSeg === firstRoot;\n });\n\n if (!sameDrive || firstRoot === undefined) {\n throw new ConfigError(\n `Cannot check paths across different root drives or volumes: ${paths.join(\", \")}`,\n \"ERR_MULTIPLE_ROOTS\",\n \"Ensure all checked paths are within the same workspace or project root.\",\n );\n }\n\n const minLen = Math.min(...splitPaths.map((p) => p.length));\n let commonLen = 0;\n\n for (let i = 0; i < minLen; i++) {\n const segment = first[i];\n if (segment === undefined) {\n break;\n }\n const allMatch = splitPaths.every((p) => {\n const seg = p[i];\n if (seg === undefined) {\n return false;\n }\n return isWin ? seg.toLowerCase() === segment.toLowerCase() : seg === segment;\n });\n if (!allMatch) {\n break;\n }\n commonLen++;\n }\n\n if (commonLen === 0) {\n throw new ConfigError(\n `Cannot check paths across different root drives or volumes: ${paths.join(\", \")}`,\n \"ERR_MULTIPLE_ROOTS\",\n \"Ensure all checked paths are within the same workspace or project root.\",\n );\n }\n\n let commonPath = first.slice(0, commonLen).join(path.sep);\n if (!commonPath) {\n commonPath = path.sep;\n }\n if (isWin && /^[a-zA-Z]:$/.test(commonPath)) {\n commonPath = `${commonPath}\\\\`;\n }\n return path.resolve(commonPath);\n}\n\n/**\n * Searches upward from a starting directory to locate an enclosing project root\n * containing `.luarc.json`. Returns the start directory if not found.\n */\nexport function findProjectRoot(startDir: string): string {\n let curr = path.resolve(startDir);\n while (true) {\n if (fs.existsSync(path.join(curr, \".luarc.json\"))) {\n return curr;\n }\n if (fs.existsSync(path.join(curr, \".git\"))) {\n break;\n }\n const parent = path.dirname(curr);\n if (parent === curr) {\n break;\n }\n curr = parent;\n }\n return startDir;\n}\n\n/**\n * Characters the LuaLS glob matcher treats as syntax.\n *\n * LuaLS compiles `files.exclude` with `glob.gitignore` (see its\n * `script/glob/glob.lua`), whose grammar only understands backslash escapes:\n * bracket expressions such as `[[]` are parsed as character ranges and match\n * nothing useful. Escaping is therefore done with `\\`.\n */\nconst GLOB_METACHARACTERS: ReadonlySet<string> = new Set([\"*\", \"?\", \"[\", \"]\", \"{\", \"}\", \",\", \"\\\\\"]);\n\n/**\n * Escapes the glob metacharacters of a single path segment so it matches literally.\n *\n * Note: `normalizePattern()` in `src/luals/files.ts` rewrites backslashes to path\n * separators when counting checked files, so these escapes only reach LuaLS. That is\n * harmless: the counted file set is filtered by the requested target paths anyway.\n */\nfunction escapeGlobSegment(segment: string): string {\n let escaped = \"\";\n for (const char of segment) {\n escaped += GLOB_METACHARACTERS.has(char) ? `\\\\${char}` : char;\n }\n return escaped;\n}\n\n/** Escapes glob metacharacters in every segment of a slash-separated relative path. */\nfunction escapeGlobPath(relativePath: string): string {\n return relativePath.split(\"/\").map(escapeGlobSegment).join(\"/\");\n}\n\n/**\n * Computes glob exclusion patterns for directories and files under workspace root\n * that are completely outside the requested target paths.\n */\nexport function computeUnrequestedExclusions(root: string, targetPaths: string[]): string[] {\n const resolvedRoot = path.resolve(root);\n\n if (\n targetPaths.length === 0 ||\n targetPaths.some((t) => t === \".\" || t === \"\" || path.resolve(resolvedRoot, t) === resolvedRoot)\n ) {\n return [];\n }\n\n const isWin = process.platform === \"win32\";\n const canonicalRoot = getCanonicalPath(resolvedRoot);\n\n const relTargets = targetPaths\n .map((t) => {\n const resolved = path.isAbsolute(t) ? t : path.resolve(canonicalRoot, t);\n const canonical = getCanonicalPath(resolved);\n const rel = path.relative(canonicalRoot, canonical).replace(/\\\\/g, \"/\");\n return isWin ? rel.toLowerCase() : rel;\n })\n .filter((rel) => !rel.startsWith(\"../\") && rel !== \"..\");\n\n if (relTargets.length === 0 || relTargets.includes(\"\") || relTargets.includes(\".\")) {\n return [];\n }\n\n const exclusions: string[] = [];\n\n /** Recursively scans directory entries to identify unrequested paths. */\n function scanDir(dir: string, relPrefix: string) {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const entryRel = relPrefix ? `${relPrefix}/${entry.name}` : entry.name;\n const normEntry = isWin ? entryRel.toLowerCase() : entryRel;\n\n let isExactTarget = false;\n let isAncestorOfTarget = false;\n let isDescendantOfTarget = false;\n\n for (const target of relTargets) {\n if (normEntry === target) {\n isExactTarget = true;\n break;\n }\n if (target.startsWith(`${normEntry}/`)) {\n isAncestorOfTarget = true;\n break;\n }\n if (normEntry.startsWith(`${target}/`)) {\n isDescendantOfTarget = true;\n break;\n }\n }\n\n if (isExactTarget || isDescendantOfTarget) {\n continue;\n }\n\n if (isAncestorOfTarget) {\n if (entry.isDirectory()) {\n scanDir(path.join(dir, entry.name), entryRel);\n }\n continue;\n }\n\n // Dot-directories are excluded like any other unrequested sibling: skipping\n // them would leave their `.lua` files visible to LuaLS, where they could still\n // define globals for the requested targets.\n if (entry.isDirectory()) {\n exclusions.push(`${escapeGlobPath(entryRel)}/**`);\n } else if (entry.isFile() && entry.name.toLowerCase().endsWith(\".lua\")) {\n exclusions.push(escapeGlobPath(entryRel));\n }\n }\n }\n\n scanDir(canonicalRoot, \"\");\n return exclusions;\n}\n\n/** Determines whether a workspace-relative file path matches any of the target paths. */\nexport function matchesTargetPaths(\n relativePath: string,\n root: string,\n targetPaths: string[],\n): boolean {\n if (\n targetPaths.length === 0 ||\n (targetPaths.length === 1 && (targetPaths[0] === \".\" || targetPaths[0] === \"\"))\n ) {\n return true;\n }\n\n const isWin = process.platform === \"win32\";\n const canonicalRoot = getCanonicalPath(root);\n const normRel = isWin\n ? relativePath.replace(/\\\\/g, \"/\").toLowerCase()\n : relativePath.replace(/\\\\/g, \"/\");\n\n for (const rawTarget of targetPaths) {\n const fromCwd = path.resolve(rawTarget);\n const resolvedTarget = fs.existsSync(fromCwd)\n ? fromCwd\n : path.isAbsolute(rawTarget)\n ? rawTarget\n : path.resolve(canonicalRoot, rawTarget);\n const canonicalTarget = getCanonicalPath(resolvedTarget);\n\n let relTarget = path.relative(canonicalRoot, canonicalTarget).replace(/\\\\/g, \"/\");\n relTarget = stripTrailingSlashes(relTarget).replace(/^\\.\\//, \"\");\n\n const normTarget = isWin ? relTarget.toLowerCase() : relTarget;\n\n if (normTarget === \"\" || normTarget === \".\") {\n return true;\n }\n if (normRel === normTarget || normRel.startsWith(`${normTarget}/`)) {\n return true;\n }\n }\n\n return false;\n}\n\n/** Keeps only diagnostics for files that match the requested target paths. */\nexport function filterReportByTargetPaths(\n report: DiagnosticReport,\n root: string,\n targetPaths: string[],\n): DiagnosticReport {\n if (\n targetPaths.length === 0 ||\n (targetPaths.length === 1 && (targetPaths[0] === \".\" || targetPaths[0] === \"\"))\n ) {\n return report;\n }\n\n const filtered: DiagnosticReport = {};\n const canonicalRoot = getCanonicalPath(root);\n\n for (const [uri, diags] of Object.entries(report)) {\n const filePath = fileUriToPath(uri);\n const canonicalFile = getCanonicalPath(path.resolve(filePath));\n const relative = path.relative(canonicalRoot, canonicalFile).replace(/\\\\/g, \"/\");\n if (matchesTargetPaths(relative, canonicalRoot, targetPaths)) {\n filtered[uri] = diags;\n }\n }\n return filtered;\n}\n\nexport interface ResolvedCheckTargets {\n rootPath: string;\n targetPaths: string[];\n}\n\n/** Validates and resolves CLI target paths into a common root directory and target list. */\nexport function resolveCheckTargets(rawPaths?: string[]): ResolvedCheckTargets {\n const paths = rawPaths && rawPaths.length > 0 ? rawPaths : [\".\"];\n\n const canonicalTargets = paths.map((targetPath) => {\n const resolved = path.resolve(targetPath);\n if (!fs.existsSync(resolved)) {\n throw new LuaLSError(\n `Target path does not exist: ${targetPath}`,\n \"ERR_TARGET_NOT_FOUND\",\n \"Verify that the target path exists and is accessible.\",\n );\n }\n return getCanonicalPath(resolved);\n });\n\n const first = paths[0];\n if (paths.length === 1 && first) {\n const canonicalFirst = canonicalTargets[0]!;\n const isFile = fs.statSync(canonicalFirst).isFile();\n const startDir = isFile ? path.dirname(canonicalFirst) : canonicalFirst;\n const projRoot = findProjectRoot(startDir);\n if (projRoot !== startDir) {\n // Only reachable when `findProjectRoot` walked up to an ancestor holding a\n // `.luarc.json`; a filesystem root never contains one in practice, so this\n // guard is defensive. The target being the filesystem root itself is left\n // alone on purpose: the user asked for that directory explicitly.\n if (isFilesystemRoot(projRoot)) {\n throw new ConfigError(\n `Cannot check targets across the root filesystem (${projRoot}): checked paths must share a common project directory.`,\n \"ERR_ROOT_ANCESTOR\",\n \"Ensure all checked paths reside within a common project directory.\",\n );\n }\n logger.debug(`[targets] Using discovered project root \"${projRoot}\" for \"${first}\".`);\n return { rootPath: projRoot, targetPaths: canonicalTargets };\n }\n return { rootPath: first, targetPaths: canonicalTargets };\n }\n\n const ancestor = findCommonAncestorDirectory(canonicalTargets);\n if (isFilesystemRoot(ancestor)) {\n throw new ConfigError(\n `Cannot check targets across the root filesystem (${ancestor}): checked paths must share a common project directory.`,\n \"ERR_ROOT_ANCESTOR\",\n \"Ensure all checked paths reside within a common project directory.\",\n );\n }\n\n const rootPath = findProjectRoot(ancestor);\n if (rootPath !== ancestor) {\n logger.debug(`[targets] Using discovered project root \"${rootPath}\" for \"${ancestor}\".`);\n }\n return { rootPath, targetPaths: canonicalTargets };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport { getPackageRoot } from \"../config.js\";\nimport { LuaLSError } from \"../errors.js\";\nimport { logger } from \"../logger.js\";\nimport { getBaseLuaLSCacheDir, getCacheDir, listCachedLuaLSVersions } from \"./cache.js\";\nimport { getPlatformInfo } from \"./platform.js\";\nimport { assertValidLuaLSBinary, rethrowLuaLSPermissionError } from \"./validation.js\";\nimport { FALLBACK_LUALS_VERSION, sanitizeLuaLSVersion } from \"./version.js\";\n\n/** Validates an explicit local executable and checks a requested version against its output. */\nexport function validateOfflineBinary(binary: string, version: string): string {\n const resolved = assertValidLuaLSBinary(binary, \"offline local binary\");\n if (version !== \"latest\") {\n const output = execFileSync(resolved, [\"--version\"], { encoding: \"utf-8\", timeout: 5000 });\n if (!output.split(/\\s+/).some((part) => sanitizeLuaLSVersion(part) === version)) {\n throw new LuaLSError(\n `Offline LuaLS binary ${resolved} does not match requested version ${version}.`,\n \"ERR_LUALS_OFFLINE\",\n `Run 'nanos-lint warmup --luals-version ${version}' online or set LUALS_BIN to a matching binary.`,\n );\n }\n }\n return resolved;\n}\n\n/** Resolves local LuaLS assets without changing cache entries or discovering remote releases. */\nexport function resolveOfflineLuaLS(version: string, cacheDir = getBaseLuaLSCacheDir()): string {\n const requested = version === \"latest\" ? version : sanitizeLuaLSVersion(version);\n if (!requested) {\n throw new LuaLSError(`Invalid LuaLS version: \"${version}\".`, \"ERR_LUALS_INVALID_VERSION\");\n }\n if (process.env.LUALS_BIN) {\n return validateOfflineBinary(process.env.LUALS_BIN, requested);\n }\n const versions = listCachedLuaLSVersions(cacheDir).sort((a, b) =>\n b.localeCompare(a, \"en\", { numeric: true }),\n );\n const selected = requested === \"latest\" ? versions[0] : versions.find((v) => v === requested);\n if (selected) {\n logger.info(`[luals] Offline: using cached LuaLS ${selected}.`);\n return path.join(getCacheDir(selected, cacheDir), getPlatformInfo(selected).binaryRelativePath);\n }\n const bundled = path.join(\n getPackageRoot(),\n getPlatformInfo(FALLBACK_LUALS_VERSION).binaryRelativePath,\n );\n if (fs.existsSync(bundled)) {\n return validateOfflineBinary(bundled, requested);\n }\n try {\n const output = execFileSync(\n process.platform === \"win32\" ? \"where.exe\" : \"which\",\n [\"lua-language-server\"],\n { encoding: \"utf-8\" },\n );\n const found = output.trim().split(/\\r?\\n/)[0];\n if (found) return validateOfflineBinary(found, requested);\n } catch (err) {\n rethrowLuaLSPermissionError(err, \"lua-language-server\", \"execute\");\n }\n throw new LuaLSError(\n `Offline: no usable local LuaLS binary for ${requested}.`,\n \"ERR_LUALS_OFFLINE\",\n `Run 'nanos-lint warmup${requested === \"latest\" ? \"\" : ` --luals-version ${requested}`}' online or set LUALS_BIN to a matching local executable.`,\n );\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { globSync } from \"glob\";\nimport { logger } from \"../logger.js\";\nimport type { LuaRCConfig } from \"../types.js\";\nimport { matchesTargetPaths } from \"../target-resolver.js\";\n\n/** Directories skipped unless the workspace config overrides `workspace.ignoreDir`. */\nconst DEFAULT_IGNORE_DIRS = [\".git\", \".vscode\", \".nanos-lint\", \"node_modules\"];\n\n/** Candidate Lua files: LuaLS checks every `*.lua` file in the tree. */\nconst LUA_FILE_PATTERN = \"**/*.lua\";\n\n/** `glob` rejects patterns longer than this, so they are dropped before matching. */\nconst MAX_PATTERN_LENGTH = 65536;\n\n/**\n * Complexity budget per pattern to bound backtracking and combinatorial brace expansion.\n * Patterns exceeding limits are skipped with a warning to protect against ReDoS (#27).\n */\nconst MAX_WILDCARDS_PER_SEGMENT = 2;\nconst MAX_TOTAL_WILDCARDS = 12;\nconst MAX_BRACE_ALTERNATIVES = 256;\n\n/** Counts wildcard tokens (`*`, `?`, character classes and brace groups). */\nfunction countWildcards(value: string): number {\n let count = 0;\n for (const char of value) {\n if (char === \"*\" || char === \"?\" || char === \"[\" || char === \"{\") {\n count += 1;\n }\n }\n return count;\n}\n\n/**\n * Upper bound of the alternatives brace expansion would produce; `1` when the\n * pattern has no brace groups. Nested groups count towards their parent, which\n * over-estimates on purpose so the bound stays safe.\n */\nfunction estimateBraceAlternatives(pattern: string): number {\n const pending: number[] = [];\n let estimate = 1;\n for (const char of pattern) {\n if (char === \"{\") {\n pending.push(0);\n } else if (char === \"}\" && pending.length > 0) {\n const alternatives = (pending.pop() ?? 0) + 1;\n estimate *= alternatives;\n if (pending.length > 0) {\n pending[pending.length - 1] = (pending[pending.length - 1] ?? 0) + alternatives - 1;\n }\n } else if (char === \",\" && pending.length > 0) {\n pending[pending.length - 1] = (pending[pending.length - 1] ?? 0) + 1;\n }\n }\n return estimate;\n}\n\n/** Returns `false` when matching the pattern could become pathologically slow. */\nfunction isPatternWithinBudget(pattern: string): boolean {\n if (estimateBraceAlternatives(pattern) > MAX_BRACE_ALTERNATIVES) {\n return false;\n }\n if (countWildcards(pattern) > MAX_TOTAL_WILDCARDS) {\n return false;\n }\n return pattern\n .split(\"/\")\n .every((segment) => countWildcards(segment) <= MAX_WILDCARDS_PER_SEGMENT);\n}\n\n/** Outcome of normalizing one user-supplied glob pattern. */\ninterface NormalizedPattern {\n pattern: string | null;\n reason: string | null;\n /** `true` when the rejection is a likely user error worth warning about (#33). */\n actionable: boolean;\n}\n\n/**\n * Normalizes a user pattern to slash-separated form, dropping trailing slashes.\n *\n * v3.0.0 (#33) rejects two shapes that used to be silently misread:\n * - absolute patterns, because LuaLS matches patterns relative to the workspace root\n * and `glob` anchors them inconsistently across platforms;\n * - `!`-prefixed patterns, because LuaLS uses a gitignore-style matcher without\n * negation support, so honoring negation here would count files LuaLS never checks.\n */\nfunction normalizePattern(pattern: unknown): NormalizedPattern {\n const unusable = (reason: string, actionable = false): NormalizedPattern => ({\n pattern: null,\n reason,\n actionable,\n });\n if (typeof pattern !== \"string\") {\n return unusable(\"the value is not a string\");\n }\n const normalized = pattern.trim().replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n if (!normalized) {\n return unusable(\"the value is empty\");\n }\n if (normalized === \".\") {\n return unusable('\".\" refers to the workspace root');\n }\n if (normalized.length > MAX_PATTERN_LENGTH) {\n return unusable(`the pattern exceeds ${MAX_PATTERN_LENGTH} characters`);\n }\n if (normalized.includes(\"\\0\")) {\n return unusable(\"the pattern contains a NUL byte\");\n }\n if (isAbsolutePattern(normalized)) {\n return unusable(\"absolute patterns are not supported\", true);\n }\n if (normalized.startsWith(\"!\")) {\n return unusable(\"negation prefixes are not supported by LuaLS\", true);\n }\n return { pattern: normalized, reason: null, actionable: false };\n}\n\n/** Drive-letter prefixes, recognized on every platform (not just Windows). */\nconst WINDOWS_ABSOLUTE_PATTERN = /^[A-Za-z]:\\//;\n\n/** Rejects absolute patterns to maintain cross-platform consistency with LuaLS relative paths. */\nfunction isAbsolutePattern(normalized: string): boolean {\n return path.posix.isAbsolute(normalized) || WINDOWS_ABSOLUTE_PATTERN.test(normalized);\n}\n\n/** Expands a LuaLS pattern to include basename and sub-directory variants for glob matching. */\nfunction expandIgnorePattern(pattern: string): string[] {\n return pattern.includes(\"/\") ? [pattern, `${pattern}/**`] : [`**/${pattern}`, `**/${pattern}/**`];\n}\n\n/** Normalizes and expands a list of LuaLS patterns into `glob` ignore patterns. */\nfunction toIgnorePatterns(patterns: readonly unknown[]): string[] {\n const ignore: string[] = [];\n for (const raw of patterns) {\n const { pattern, reason, actionable } = normalizePattern(raw);\n if (!pattern) {\n const message = `[luals] Skipping glob pattern \"${String(raw)}\" while counting checked files: ${reason}.`;\n if (actionable) {\n logger.warn(\n `${message} LuaLS never applies it either, so the file count stays consistent.`,\n );\n } else {\n logger.debug(message);\n }\n continue;\n }\n if (!isPatternWithinBudget(pattern)) {\n logger.warn(\n `[luals] Skipping glob pattern \"${raw}\": it is too complex to match safely and would slow down file counting.`,\n );\n continue;\n }\n ignore.push(...expandIgnorePattern(pattern));\n }\n return ignore;\n}\n\n/** Resolves and canonicalizes the target, returning null when it does not exist. */\nfunction resolveTargetPath(targetPath: string): string | null {\n let absPath = path.resolve(targetPath);\n if (!fs.existsSync(absPath)) {\n return null;\n }\n try {\n absPath = fs.realpathSync.native(absPath);\n } catch {\n try {\n absPath = fs.realpathSync(absPath);\n } catch (err) {\n void err;\n }\n }\n return absPath;\n}\n\n/**\n * Lists the Lua files LuaLS checks under `targetPath` as slash-normalized relative paths,\n * honoring `workspace.ignoreDir` and `files.exclude` (#27). Absolute paths are returned\n * for single-file targets, and an empty list is returned when the walk fails.\n */\nexport function listCheckedFiles(\n targetPath: string,\n configPath?: string,\n targetPaths?: string[],\n): string[] {\n const absPath = resolveTargetPath(targetPath);\n if (!absPath) {\n return [];\n }\n\n if (fs.statSync(absPath).isFile()) {\n return absPath.toLowerCase().endsWith(\".lua\") ? [absPath] : [];\n }\n\n let ignoreDirs: readonly unknown[] = DEFAULT_IGNORE_DIRS;\n let excludePatterns: readonly unknown[] = [];\n\n if (configPath && fs.existsSync(configPath)) {\n try {\n const cfg = JSON.parse(fs.readFileSync(configPath, \"utf-8\")) as LuaRCConfig;\n // `.luarc.json` is user input, so the declared types are not guaranteed.\n if (Array.isArray(cfg.workspace?.ignoreDir)) {\n ignoreDirs = cfg.workspace.ignoreDir;\n }\n if (Array.isArray(cfg.files?.exclude)) {\n excludePatterns = cfg.files.exclude;\n }\n } catch (err) {\n logger.warn(\n `[luals] Failed to parse config file for file counting at ${configPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n const ignore = [...toIgnorePatterns(ignoreDirs), ...toIgnorePatterns(excludePatterns)];\n\n try {\n const entries = globSync(LUA_FILE_PATTERN, {\n cwd: absPath,\n ignore,\n dot: true,\n nocase: true,\n follow: false, // Disallow symlinks to prevent loops and directory escapes (#21)\n withFileTypes: true,\n });\n const files = entries.filter((entry) => entry.isFile()).map((entry) => entry.relativePosix());\n if (targetPaths && targetPaths.length > 0) {\n return files.filter((f) => matchesTargetPaths(f, absPath, targetPaths));\n }\n return files;\n } catch (err) {\n logger.warn(\n `[luals] Failed to walk ${absPath} while listing checked files: ${err instanceof Error ? err.message : String(err)}`,\n );\n return [];\n }\n}\n\n/** Counts candidate Lua files within targetPath, taking workspace ignoreDir and files.exclude into account (#27). */\nexport function countCheckedFiles(\n targetPath: string,\n configPath?: string,\n targetPaths?: string[],\n): number {\n return listCheckedFiles(targetPath, configPath, targetPaths).length;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { logger } from \"../logger.js\";\nimport { getPackageRoot } from \"../config.js\";\nimport { systemPaths } from \"../paths.js\";\nimport { fileUriToPath } from \"../types.js\";\nimport type { CheckOptions, CheckResult, DiagnosticReport } from \"../types.js\";\nimport { LuaLSError } from \"../errors.js\";\nimport { filterReportByTargetPaths } from \"../target-resolver.js\";\nimport {\n DEFAULT_LUALS_VERSION,\n FALLBACK_LUALS_VERSION,\n resolveLuaLSVersion,\n fetchLatestLuaLSVersionFromGitHub,\n sanitizeLuaLSVersion,\n} from \"./version.js\";\nimport { getPlatformInfo } from \"./platform.js\";\nimport {\n getBaseLuaLSCacheDir,\n getCacheDir,\n readLuaLSMetadata,\n writeLuaLSMetadata,\n listCachedLuaLSVersions,\n cleanupOldCachedLuaLSVersions,\n getIsoWeek,\n} from \"./cache.js\";\nimport {\n isBinaryValid,\n assertValidLuaLSBinary,\n rethrowLuaLSPermissionError,\n} from \"./validation.js\";\nimport { downloadAndExtractLuaLS } from \"./download.js\";\nimport { resolveOfflineLuaLS, validateOfflineBinary } from \"./offline.js\";\nimport { countCheckedFiles } from \"./files.js\";\n\nexport { countCheckedFiles } from \"./files.js\";\n\nconst execFileAsync = promisify(execFile);\n\n/** Determines if an error represents an offline network condition. */\nfunction isOfflineError(err: unknown): boolean {\n if (!err) return false;\n const msg = err instanceof Error ? err.message : String(err);\n return /offline|enotfound|eai_again|econnrefused|etimedout|fetch failed/i.test(msg);\n}\n\nexport interface ResolveLuaLSOptions {\n /** Cache base directory (version directories, metadata, temp extraction). Defaults to the system cache. */\n cacheDir?: string;\n /** Set to `false` to always fetch the archive instead of reusing an installed copy. */\n reuseExisting?: boolean;\n offline?: boolean;\n}\n\n/** Resolves the executable path of a LuaLS binary from env, bundle, cache, or network download. */\nexport async function resolveLuaLSBinary(\n version: string = DEFAULT_LUALS_VERSION,\n options?: ResolveLuaLSOptions,\n): Promise<string> {\n if (options?.offline) return resolveOfflineLuaLS(version, options.cacheDir);\n\n // 1. Environment variable override\n if (process.env.LUALS_BIN) {\n return assertValidLuaLSBinary(process.env.LUALS_BIN, \"LUALS_BIN\");\n }\n\n // 2. Bundled with package (release distribution) - check early for default version to avoid network delay\n if (options?.reuseExisting !== false && (!version || version === \"latest\")) {\n const defaultInfo = getPlatformInfo(FALLBACK_LUALS_VERSION);\n const defaultBundledPath = path.join(getPackageRoot(), defaultInfo.binaryRelativePath);\n if (fs.existsSync(defaultBundledPath) && isBinaryValid(defaultBundledPath)) {\n return defaultBundledPath;\n }\n }\n\n const isDefaultOrLatest = !version || version === \"latest\";\n\n const baseCacheDir = options?.cacheDir ?? getBaseLuaLSCacheDir();\n\n // When a specific version is explicitly requested (not \"latest\"):\n if (!isDefaultOrLatest) {\n const resolvedVersion = await resolveLuaLSVersion(version);\n const info = getPlatformInfo(resolvedVersion);\n\n // Bundled with package for explicitly requested version\n if (options?.reuseExisting !== false) {\n const bundledPath = path.join(getPackageRoot(), info.binaryRelativePath);\n if (fs.existsSync(bundledPath) && isBinaryValid(bundledPath)) {\n return bundledPath;\n }\n }\n\n // User cache for explicitly requested version\n const cachedDir = getCacheDir(resolvedVersion, baseCacheDir);\n const cachedPath = path.join(cachedDir, info.binaryRelativePath);\n const completeMarker = path.join(cachedDir, \".complete\");\n\n let wasCorrupted = false;\n if (fs.existsSync(cachedPath)) {\n let isValid = false;\n if (fs.existsSync(completeMarker)) {\n try {\n const storedVersion = fs.readFileSync(completeMarker, \"utf-8\").trim();\n if (storedVersion === resolvedVersion && isBinaryValid(cachedPath)) {\n isValid = true;\n if (options?.reuseExisting !== false) {\n return cachedPath;\n }\n }\n } catch (err) {\n rethrowLuaLSPermissionError(err, completeMarker);\n logger.debug(\n `[luals] Failed to read complete marker at ${completeMarker}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n if (!isValid) {\n wasCorrupted = true;\n logger.warn(\n `[luals] Cached LuaLS binary at ${cachedPath} is corrupted or incomplete. Repairing...`,\n );\n }\n try {\n fs.rmSync(cachedDir, { recursive: true, force: true });\n } catch (err) {\n rethrowLuaLSPermissionError(err, cachedDir);\n logger.warn(\n `[luals] Failed to remove corrupted cache directory ${cachedDir}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n // In PATH\n if (options?.reuseExisting !== false) {\n try {\n const cmd = process.platform === \"win32\" ? \"where.exe\" : \"which\";\n const { stdout } = await execFileAsync(cmd, [\"lua-language-server\"]);\n const found = stdout.trim().split(/\\r?\\n/)[0];\n if (found && fs.existsSync(found) && isBinaryValid(found)) {\n return found;\n }\n } catch (err) {\n rethrowLuaLSPermissionError(err, \"lua-language-server\", \"execute\");\n logger.debug(\n `[luals] LuaLS binary not found in PATH: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n // Download and cache explicit version\n try {\n return await downloadAndExtractLuaLS(\n resolvedVersion,\n getCacheDir(resolvedVersion, baseCacheDir),\n options,\n );\n } catch (err) {\n rethrowLuaLSPermissionError(err, cachedDir);\n if (wasCorrupted) {\n const isOffline = isOfflineError(err);\n const reason = isOffline\n ? \"while offline\"\n : err instanceof Error\n ? err.message\n : String(err);\n throw new LuaLSError(\n `Cached LuaLS binary at '${cachedPath}' is corrupted (failed execution/size check) and cannot be re-downloaded ${isOffline ? reason : `: ${reason}`}. Please ${isOffline ? \"connect to the internet\" : \"verify your network connection\"} to repair or run 'nanos-lint clean-cache'.`,\n \"ERR_LUALS_CORRUPTED_CACHE\",\n \"Connect to the internet to repair the corrupted binary or run 'nanos-lint clean-cache'.\",\n { cause: err },\n );\n }\n throw err;\n }\n }\n\n // 3. Default/latest version: Weekly cache check & auto-cleanup\n const currentWeek = getIsoWeek();\n const metadata = readLuaLSMetadata(baseCacheDir);\n\n // Fast path first: enumerating the cache would spawn every cached binary.\n const safeLatest = metadata?.latestVersion ? sanitizeLuaLSVersion(metadata.latestVersion) : null;\n if (\n options?.reuseExisting !== false &&\n metadata &&\n metadata.lastCheckedWeek === currentWeek &&\n safeLatest\n ) {\n const info = getPlatformInfo(safeLatest);\n const targetDir = path.resolve(getCacheDir(safeLatest, baseCacheDir));\n const resolvedBase = path.resolve(baseCacheDir);\n if (targetDir.startsWith(resolvedBase + path.sep) || targetDir === resolvedBase) {\n const cachedPath = path.join(targetDir, info.binaryRelativePath);\n if (isBinaryValid(cachedPath)) {\n return cachedPath;\n }\n }\n }\n\n const cachedVersions =\n options?.reuseExisting !== false ? listCachedLuaLSVersions(baseCacheDir) : [];\n\n // Same week, but the recorded version is unusable: reuse another cached one.\n const firstCachedVersion = cachedVersions[0];\n if (\n options?.reuseExisting !== false &&\n metadata &&\n metadata.lastCheckedWeek === currentWeek &&\n firstCachedVersion\n ) {\n const info = getPlatformInfo(firstCachedVersion);\n return path.join(getCacheDir(firstCachedVersion, baseCacheDir), info.binaryRelativePath);\n }\n\n // We need to check for updates (new week, missing metadata, or no valid binary in cache)\n const onlineTag = await fetchLatestLuaLSVersionFromGitHub();\n const today = new Date().toISOString().split(\"T\")[0];\n\n let targetVersion: string;\n if (onlineTag) {\n targetVersion = onlineTag;\n } else if (metadata?.latestVersion && cachedVersions.includes(metadata.latestVersion)) {\n logger.info(\n `[luals] Network unreachable or rate limited; using cached LuaLS ${metadata.latestVersion}.`,\n );\n targetVersion = metadata.latestVersion;\n } else if (firstCachedVersion) {\n logger.info(\n `[luals] Network unreachable or rate limited; using cached LuaLS ${firstCachedVersion}.`,\n );\n targetVersion = firstCachedVersion;\n } else {\n targetVersion = FALLBACK_LUALS_VERSION;\n }\n\n // Update metadata with the current week and target version\n writeLuaLSMetadata(\n {\n lastCheckedWeek: currentWeek,\n latestVersion: targetVersion,\n lastCheckedDate: today,\n },\n baseCacheDir,\n );\n\n const info = getPlatformInfo(targetVersion);\n const targetCacheDir = getCacheDir(targetVersion, baseCacheDir);\n const targetBinaryPath = path.join(targetCacheDir, info.binaryRelativePath);\n const completeMarker = path.join(targetCacheDir, \".complete\");\n let wasCorrupted = false;\n if (fs.existsSync(targetBinaryPath)) {\n if (fs.existsSync(completeMarker) && isBinaryValid(targetBinaryPath)) {\n if (options?.reuseExisting !== false) {\n // Already downloaded and valid; clean up any older versions\n cleanupOldCachedLuaLSVersions(targetVersion, baseCacheDir);\n return targetBinaryPath;\n }\n } else {\n wasCorrupted = true;\n }\n }\n\n // Check PATH as fallback before downloading if offline/unreachable\n if (options?.reuseExisting !== false && !onlineTag) {\n try {\n const cmd = process.platform === \"win32\" ? \"where.exe\" : \"which\";\n const { stdout } = await execFileAsync(cmd, [\"lua-language-server\"]);\n const found = stdout.trim().split(/\\r?\\n/)[0];\n if (found && fs.existsSync(found) && isBinaryValid(found)) {\n return found;\n }\n } catch (err) {\n rethrowLuaLSPermissionError(err, \"lua-language-server\", \"execute\");\n logger.debug(\n `[luals] LuaLS binary not found in PATH: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n // Download and extract latest LuaLS\n let downloadedBinary: string;\n try {\n downloadedBinary = await downloadAndExtractLuaLS(targetVersion, targetCacheDir, options);\n } catch (err) {\n rethrowLuaLSPermissionError(err, targetCacheDir);\n if (wasCorrupted) {\n const isOffline = isOfflineError(err);\n const reason = isOffline ? \"while offline\" : err instanceof Error ? err.message : String(err);\n throw new LuaLSError(\n `Cached LuaLS binary at '${targetBinaryPath}' is corrupted (failed execution/size check) and cannot be re-downloaded ${isOffline ? reason : `: ${reason}`}. Please ${isOffline ? \"connect to the internet\" : \"verify your network connection\"} to repair or run 'nanos-lint clean-cache'.`,\n \"ERR_LUALS_CORRUPTED_CACHE\",\n \"Connect to the internet to repair the corrupted binary or run 'nanos-lint clean-cache'.\",\n { cause: err },\n );\n }\n throw err;\n }\n\n // If update is found, download latest LuaLS to replace the older one, remove the older one from cache afterwards\n cleanupOldCachedLuaLSVersions(targetVersion, baseCacheDir);\n\n return downloadedBinary;\n}\n\n/** Executes the LuaLS diagnostics check on the target path using merged configurations. */\nexport async function runLuaLSCheck(\n targetPath: string,\n configPath: string,\n options: CheckOptions,\n): Promise<CheckResult> {\n let absoluteTarget = path.resolve(targetPath);\n try {\n if (fs.existsSync(absoluteTarget)) {\n absoluteTarget = fs.realpathSync.native(absoluteTarget);\n }\n } catch (err) {\n logger.debug(\n `[luals] Failed to resolve native realpath for target: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n if (!fs.existsSync(absoluteTarget)) {\n throw new LuaLSError(\n `Target path does not exist: ${targetPath}`,\n \"ERR_TARGET_NOT_FOUND\",\n \"Verify that the target path exists and is accessible.\",\n );\n }\n\n const binary = options.lualsBin\n ? options.offline\n ? validateOfflineBinary(options.lualsBin, options.lualsVersion ?? \"latest\")\n : assertValidLuaLSBinary(options.lualsBin, \"--luals-bin\")\n : await resolveLuaLSBinary(options.lualsVersion, { offline: options.offline });\n\n let checkDir = absoluteTarget;\n let targetFileOnly: string | null = null;\n\n if (fs.statSync(absoluteTarget).isFile()) {\n checkDir = path.dirname(absoluteTarget);\n targetFileOnly = absoluteTarget;\n }\n\n const tempOutputDir = systemPaths.temp;\n fs.mkdirSync(tempOutputDir, { recursive: true });\n const checkOutPath = path.join(\n tempOutputDir,\n `check-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.json`,\n );\n\n const args: string[] = [\n `--check=${checkDir}`,\n `--configpath=${path.resolve(configPath)}`,\n `--check_out_path=${checkOutPath}`,\n \"--check_format=json\",\n ];\n\n if (options.checklevel) {\n args.push(`--checklevel=${options.checklevel}`);\n }\n\n let execError: unknown = null;\n try {\n await execFileAsync(binary, args, {\n maxBuffer: 100 * 1024 * 1024,\n timeout: 120_000,\n });\n } catch (err) {\n execError = err;\n logger.debug(\n `[luals] LuaLS process exited with error or non-zero status: ${err instanceof Error ? err.message : String(err)}`,\n );\n // Process may exit with non-zero when diagnostics are found\n }\n\n let diagnostics: DiagnosticReport = {};\n let parseSucceeded = false;\n if (fs.existsSync(checkOutPath)) {\n try {\n const content = fs.readFileSync(checkOutPath, \"utf-8\");\n diagnostics = JSON.parse(content) as DiagnosticReport;\n parseSucceeded = true;\n } catch (err) {\n logger.error(\n `[luals] Failed to read or parse diagnostic output from ${checkOutPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n try {\n fs.unlinkSync(checkOutPath);\n } catch (err) {\n logger.debug(\n `[luals] Failed to delete check output file ${checkOutPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n\n if (!parseSucceeded) {\n const cacheHint = `(Cache location: ${getCacheDir()})`;\n if (execError) {\n throw new LuaLSError(\n `LuaLS check failed to execute or produce diagnostic output: ${execError instanceof Error ? execError.message : String(execError)}. ${cacheHint}`,\n \"ERR_LUALS_EXECUTION\",\n \"Inspect the debug log with --log-level=debug or run 'nanos-lint clean-cache' to re-fetch LuaLS.\",\n { cause: execError },\n );\n }\n throw new LuaLSError(\n `LuaLS check failed to produce diagnostic output at: ${checkOutPath}. ${cacheHint}`,\n \"ERR_LUALS_NO_OUTPUT\",\n \"Ensure the temporary directory is writable and sufficient disk space is available.\",\n );\n }\n\n // If a single file was requested, filter diagnostics to only that file\n if (targetFileOnly) {\n const filtered: DiagnosticReport = {};\n const normalizeComparable = (p: string): string => {\n try {\n if (fs.existsSync(p)) {\n return fs.realpathSync.native(p).replace(/\\\\/g, \"/\").toLowerCase();\n }\n } catch (err) {\n logger.debug(\n `[luals] Failed to resolve native realpath for comparison: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n return path.resolve(p).replace(/\\\\/g, \"/\").toLowerCase();\n };\n const normTarget = normalizeComparable(targetFileOnly);\n for (const [rawUri, diags] of Object.entries(diagnostics)) {\n const filePath = fileUriToPath(rawUri);\n if (normalizeComparable(filePath) === normTarget) {\n filtered[rawUri] = diags;\n }\n }\n diagnostics = filtered;\n } else if (options.paths && options.paths.length > 0) {\n diagnostics = filterReportByTargetPaths(diagnostics, checkDir, options.paths);\n }\n\n let totalProblems = 0;\n let totalErrors = 0;\n let totalWarnings = 0;\n let problemFiles = 0;\n\n for (const [_, diags] of Object.entries(diagnostics)) {\n if (diags.length > 0) {\n problemFiles += 1;\n totalProblems += diags.length;\n for (const d of diags) {\n if (d.severity === 1) {\n totalErrors += 1;\n } else if (d.severity === 2) {\n totalWarnings += 1;\n }\n }\n }\n }\n\n const passed = totalProblems === 0;\n const filesChecked = countCheckedFiles(targetPath, configPath, options.paths);\n const totalFiles = passed ? filesChecked : problemFiles;\n\n return {\n passed,\n totalProblems,\n totalErrors,\n totalWarnings,\n totalFiles,\n totalFilesChecked: filesChecked,\n diagnostics,\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { logger } from \"./logger.js\";\nimport { loadUserConfig, resolveRealmMappings } from \"./config.js\";\nimport type { LuaRCConfig } from \"./types.js\";\n\n/** Accumulates repeatable --dep arguments. */\nexport function collectDeps(val: string, prev?: string[]): string[] {\n const trimmed = val.trim();\n if (!trimmed) {\n return prev ?? [];\n }\n return (prev ?? []).concat(trimmed);\n}\n\nexport interface ResolvedDependencyRealms {\n /** Libraries to include in server realm passes (Server + Shared folders, or shared files). */\n server: string[];\n /** Libraries to include in client realm passes (Client + Shared folders, or shared files). */\n client: string[];\n /** Libraries to include in shared realm passes (Shared folders, or shared files). */\n shared: string[];\n /** All libraries for a single standard pass (realms disabled). */\n all: string[];\n}\n\ninterface DepQueueItem {\n rawPath: string;\n fromDir: string;\n}\n\n/** Normalizes a filesystem path to forward slashes for LuaLS compatibility. */\nfunction normalizeSlash(p: string): string {\n return p.replace(/\\\\/g, \"/\");\n}\n\n/**\n * Resolves package dependencies declared in .luarc.json (nanos.deps) or via CLI (--dep),\n * resolving transitive dependencies with cycle detection and partitioning them by realm.\n */\nexport function resolvePackageDependencies(\n root: string,\n userConfig: LuaRCConfig,\n cliDeps?: string[],\n): ResolvedDependencyRealms {\n const visited = new Set<string>();\n const queue: DepQueueItem[] = [];\n\n if (cliDeps && cliDeps.length > 0) {\n for (const dep of cliDeps) {\n if (typeof dep === \"string\" && dep.trim()) {\n queue.push({ rawPath: dep.trim(), fromDir: process.cwd() });\n }\n }\n }\n\n const rawConfigDeps = userConfig.nanos?.deps;\n if (rawConfigDeps !== undefined) {\n if (Array.isArray(rawConfigDeps)) {\n for (const dep of rawConfigDeps) {\n if (typeof dep === \"string\" && dep.trim()) {\n queue.push({ rawPath: dep.trim(), fromDir: root });\n } else {\n logger.warn(`[deps] Skipping invalid nanos.deps entry: expected a string path.`);\n }\n }\n } else {\n logger.warn(`[deps] Ignoring nanos.deps: expected an array of path strings.`);\n }\n }\n\n const resolvedFiles: string[] = [];\n const resolvedDirs: string[] = [];\n const depConfigMap = new Map<string, LuaRCConfig>();\n\n const isWin = process.platform === \"win32\";\n\n while (queue.length > 0) {\n const item = queue.shift();\n if (!item) {\n continue;\n }\n\n const { rawPath, fromDir } = item;\n const absPath = path.resolve(fromDir, rawPath);\n\n if (!fs.existsSync(absPath)) {\n logger.warn(`[deps] Dependency path not found: \"${rawPath}\" (skipping).`);\n continue;\n }\n\n let canonical: string;\n try {\n canonical = fs.realpathSync.native(absPath);\n } catch (err) {\n void err;\n try {\n canonical = fs.realpathSync(absPath);\n } catch (innerErr) {\n void innerErr;\n canonical = absPath;\n }\n }\n\n const cycleKey = isWin ? canonical.toLowerCase() : canonical;\n if (visited.has(cycleKey)) {\n continue;\n }\n visited.add(cycleKey);\n\n let stat: fs.Stats;\n try {\n stat = fs.statSync(canonical);\n } catch (err) {\n void err;\n continue;\n }\n\n if (stat.isFile()) {\n if (canonical.toLowerCase().endsWith(\".lua\")) {\n resolvedFiles.push(normalizeSlash(canonical));\n } else {\n logger.warn(`[deps] Skipping non-Lua dependency file: \"${rawPath}\".`);\n }\n continue;\n }\n\n if (stat.isDirectory()) {\n resolvedDirs.push(canonical);\n\n const candidateLuarc = path.join(canonical, \".luarc.json\");\n if (fs.existsSync(candidateLuarc)) {\n try {\n const depConfig = loadUserConfig(canonical);\n depConfigMap.set(canonical, depConfig);\n const transDeps = depConfig.nanos?.deps;\n if (transDeps !== undefined) {\n if (Array.isArray(transDeps)) {\n for (const trans of transDeps) {\n if (typeof trans === \"string\" && trans.trim()) {\n queue.push({ rawPath: trans.trim(), fromDir: canonical });\n } else {\n logger.warn(\n `[deps] Skipping invalid nanos.deps entry in \"${canonical}\": expected a string path.`,\n );\n }\n }\n } else {\n logger.warn(\n `[deps] Ignoring nanos.deps in \"${canonical}\": expected an array of path strings.`,\n );\n }\n }\n } catch (err) {\n logger.warn(\n `[deps] Failed to parse transitive dependency configuration at \"${candidateLuarc}\": ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n }\n\n const serverSet = new Set<string>();\n const clientSet = new Set<string>();\n const sharedSet = new Set<string>();\n const allSet = new Set<string>();\n\n for (const file of resolvedFiles) {\n serverSet.add(file);\n clientSet.add(file);\n sharedSet.add(file);\n allSet.add(file);\n }\n\n for (const depDir of resolvedDirs) {\n const normDepDir = normalizeSlash(depDir);\n allSet.add(normDepDir);\n\n let depConfig = depConfigMap.get(depDir);\n if (!depConfig) {\n try {\n depConfig = loadUserConfig(depDir);\n } catch (err) {\n void err;\n depConfig = {};\n }\n }\n\n const { enabled, mappings } = resolveRealmMappings(depConfig);\n\n if (!enabled) {\n serverSet.add(normDepDir);\n clientSet.add(normDepDir);\n sharedSet.add(normDepDir);\n continue;\n }\n\n const serverFolder = path.join(depDir, \"Server\");\n const clientFolder = path.join(depDir, \"Client\");\n const sharedFolder = path.join(depDir, \"Shared\");\n\n const hasServer = fs.existsSync(serverFolder);\n const hasClient = fs.existsSync(clientFolder);\n const hasShared = fs.existsSync(sharedFolder);\n\n if (hasServer || hasClient || hasShared) {\n if (hasServer) {\n serverSet.add(normalizeSlash(serverFolder));\n }\n if (hasClient) {\n clientSet.add(normalizeSlash(clientFolder));\n }\n if (hasShared) {\n const normShared = normalizeSlash(sharedFolder);\n serverSet.add(normShared);\n clientSet.add(normShared);\n sharedSet.add(normShared);\n }\n\n try {\n const entries = fs.readdirSync(depDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.toLowerCase().endsWith(\".lua\")) {\n const rootFile = normalizeSlash(path.join(depDir, entry.name));\n serverSet.add(rootFile);\n clientSet.add(rootFile);\n sharedSet.add(rootFile);\n }\n }\n } catch (err) {\n void err;\n }\n continue;\n }\n\n if (depConfig.nanos?.realms) {\n let matchedAnyCustom = false;\n for (const { pattern, realm } of mappings) {\n const baseFolder = pattern.replace(/\\/\\*\\*.*$/, \"\").replace(/\\/\\*.*$/, \"\");\n const targetPath = path.join(depDir, baseFolder);\n if (fs.existsSync(targetPath)) {\n matchedAnyCustom = true;\n const norm = normalizeSlash(targetPath);\n if (realm === \"server\") {\n serverSet.add(norm);\n } else if (realm === \"client\") {\n clientSet.add(norm);\n } else {\n serverSet.add(norm);\n clientSet.add(norm);\n sharedSet.add(norm);\n }\n }\n }\n if (matchedAnyCustom) {\n continue;\n }\n }\n\n serverSet.add(normDepDir);\n clientSet.add(normDepDir);\n sharedSet.add(normDepDir);\n }\n\n return {\n server: Array.from(serverSet),\n client: Array.from(clientSet),\n shared: Array.from(sharedSet),\n all: Array.from(allSet),\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { globSync } from \"glob\";\nimport {\n buildWorkspaceConfig,\n resolveRealmMappings,\n writeTempConfig,\n type RealmMapping,\n} from \"./config.js\";\nimport { deriveRealmAnnotationFiles, type RealmPassName } from \"./annotations-realms.js\";\nimport { logger } from \"./logger.js\";\nimport { listCheckedFiles, runLuaLSCheck } from \"./luals.js\";\nimport {\n computeUnrequestedExclusions,\n getCanonicalPath,\n matchesTargetPaths,\n} from \"./target-resolver.js\";\nimport { resolvePackageDependencies } from \"./deps.js\";\nimport {\n fileUriToPath,\n type CheckOptions,\n type CheckResult,\n type DiagnosticReport,\n type LuaRCConfig,\n} from \"./types.js\";\n\nexport {\n deriveRealmAnnotationFiles,\n splitAnnotationsByRealm,\n type DerivedRealmAnnotations,\n type RealmPassName,\n} from \"./annotations-realms.js\";\n\n/** `--realm` selection: `all` runs every pass, others keep the shared pass too. */\nexport type RealmSelection = \"all\" | RealmPassName;\n\nexport interface RealmFileSets {\n client: string[];\n server: string[];\n /** Files matched by a shared/global pattern. */\n shared: string[];\n /** Files matched by no pattern: they are checked with full context. */\n unmatched: string[];\n}\n\n/** Normalizes a workspace-relative path for case-insensitive comparison on Windows. */\nfunction normalizeRelative(candidate: string): string {\n const normalized = candidate.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n return process.platform === \"win32\" ? normalized.toLowerCase() : normalized;\n}\n\n/**\n * Assigns every checked Lua file to a realm, returning the paths exactly as they are on\n * disk (comparisons are case-insensitive on Windows). The last matching `nanos.realms`\n * entry wins, and files matched by no entry belong to the shared (full-context) pass.\n */\nexport function collectRealmFiles(\n root: string,\n mappings: RealmMapping[],\n checkedFiles: string[],\n): RealmFileSets {\n const checked = new Set(checkedFiles.map(normalizeRelative));\n const assignments = new Map<string, RealmPassName>();\n\n for (const { pattern, realm } of mappings) {\n let matches: string[];\n try {\n matches = globSync(pattern, {\n cwd: root,\n dot: true,\n nocase: true,\n follow: false,\n withFileTypes: true,\n })\n .filter((entry) => entry.isFile())\n .map((entry) => entry.relativePosix());\n } catch (err) {\n logger.warn(\n `[realms] Skipping nanos.realms pattern \"${pattern}\": ${err instanceof Error ? err.message : String(err)}`,\n );\n continue;\n }\n for (const match of matches) {\n const key = normalizeRelative(match);\n if (key.endsWith(\".lua\") && checked.has(key)) {\n assignments.set(key, realm);\n }\n }\n }\n\n const sets: RealmFileSets = { client: [], server: [], shared: [], unmatched: [] };\n for (const file of checkedFiles) {\n const realm = assignments.get(normalizeRelative(file));\n if (realm) {\n sets[realm].push(file);\n } else {\n sets.unmatched.push(file);\n }\n }\n return sets;\n}\n\nexport interface RealmPass {\n realm: RealmPassName;\n configPath: string;\n /** Workspace-relative files whose diagnostics belong to this pass. */\n reportFiles: Set<string>;\n}\n\nexport interface RealmCheckPlan {\n baseConfigPath: string;\n passes: RealmPass[];\n cleanup: () => void;\n}\n\nexport interface PlanRealmCheckOptions {\n targetPath: string;\n userConfig: LuaRCConfig;\n selection: RealmSelection;\n annotationsPath: string;\n customConfigPath?: string;\n ignore?: string[];\n targetPaths?: string[];\n cliDeps?: string[];\n}\n\n/** Returns the passes selected by `--realm`, always pairing a side with the shared pass. */\nfunction selectedRealms(selection: RealmSelection): RealmPassName[] {\n if (selection === \"all\") {\n return [\"server\", \"client\", \"shared\"];\n }\n if (selection === \"shared\") {\n return [\"shared\"];\n }\n return [\"shared\", selection];\n}\n\n/** Builds a pass config from the merged base config by swapping library and exclusions. */\nfunction buildPassConfig(\n baseConfig: Record<string, unknown>,\n realm: RealmPassName,\n annotationsPath: string,\n realmAnnotationPath: string,\n excludedPatterns: string[],\n dependencyLibraries: string[] = [],\n): Record<string, unknown> {\n const config = JSON.parse(JSON.stringify(baseConfig)) as {\n workspace?: { library?: string[] };\n files?: { exclude?: string[] };\n };\n const normalizedFull = annotationsPath.replace(/\\\\/g, \"/\");\n const libraries = (config.workspace?.library ?? []).filter(\n (entry) => entry.replace(/\\\\/g, \"/\") !== normalizedFull,\n );\n config.workspace = {\n ...(config.workspace ?? {}),\n library: Array.from(new Set([realmAnnotationPath, ...libraries, ...dependencyLibraries])),\n };\n if (realm !== \"shared\" && excludedPatterns.length > 0) {\n config.files = {\n ...(config.files ?? {}),\n exclude: [...new Set([...(config.files?.exclude ?? []), ...excludedPatterns])],\n };\n }\n return config as Record<string, unknown>;\n}\n\n/**\n * Plans realm-aware checking for a target. Returns `null` when a single standard pass is\n * the right answer: realms disabled, the target is a file, or no configured realm pattern\n * matches a checked Lua file.\n */\nexport function planRealmCheck(options: PlanRealmCheckOptions): RealmCheckPlan | null {\n const { targetPath, userConfig, selection, annotationsPath } = options;\n const resolvedTarget = path.resolve(targetPath);\n\n if (!fs.existsSync(resolvedTarget) || fs.statSync(resolvedTarget).isFile()) {\n return null;\n }\n const { enabled, mappings } = resolveRealmMappings(userConfig);\n if (!enabled) {\n logger.debug(\"[realms] Realm mapping disabled; running a single standard pass.\");\n return null;\n }\n\n const unrequestedExclusions = options.targetPaths\n ? computeUnrequestedExclusions(resolvedTarget, options.targetPaths)\n : [];\n const baseConfig = buildWorkspaceConfig(resolvedTarget, options.customConfigPath, {\n ignore: options.ignore,\n annotationsPath,\n unrequestedExclusions,\n });\n const tempConfigs: string[] = [];\n const baseConfigPath = writeTempConfig(baseConfig);\n tempConfigs.push(baseConfigPath);\n try {\n const checkedFiles = listCheckedFiles(resolvedTarget, baseConfigPath);\n const realmFiles = collectRealmFiles(resolvedTarget, mappings, checkedFiles);\n\n const isTargetFile = (file: string): boolean => {\n if (!options.targetPaths || options.targetPaths.length === 0) {\n return true;\n }\n return matchesTargetPaths(file, resolvedTarget, options.targetPaths);\n };\n\n // Report sets are keyed by normalized paths: diagnostics arrive as real file paths,\n // so membership must survive Windows' case-insensitive file system.\n const realmReportFiles: Record<RealmPassName, Set<string>> = {\n client: new Set(realmFiles.client.filter(isTargetFile).map(normalizeRelative)),\n server: new Set(realmFiles.server.filter(isTargetFile).map(normalizeRelative)),\n shared: new Set(\n [...realmFiles.shared, ...realmFiles.unmatched].filter(isTargetFile).map(normalizeRelative),\n ),\n };\n const hasRealmFolders =\n realmFiles.client.length > 0 || realmFiles.server.length > 0 || realmFiles.shared.length > 0;\n if (selection === \"all\" && !hasRealmFolders) {\n logger.debug(\"[realms] No realm folders matched; running a single standard pass.\");\n for (const tempConfig of tempConfigs) {\n removeTempConfig(tempConfig);\n }\n return null;\n }\n\n const wanted = selectedRealms(selection).filter((realm) => realmReportFiles[realm].size > 0);\n if (wanted.length === 0) {\n if (selection !== \"all\") {\n logger.warn(\n `[realms] No target files match the requested realm \"${selection}\"; falling back to a standard check.`,\n );\n } else {\n logger.debug(\n \"[realms] No files to report for selected realm pass; running a single standard pass.\",\n );\n }\n for (const tempConfig of tempConfigs) {\n removeTempConfig(tempConfig);\n }\n return null;\n }\n const needsSplitLibraries = wanted.some((realm) => realm !== \"shared\");\n const derived = needsSplitLibraries\n ? deriveRealmAnnotationFiles(annotationsPath)\n : { client: annotationsPath, server: annotationsPath };\n const resolvedDeps = resolvePackageDependencies(resolvedTarget, userConfig, options.cliDeps);\n const passes: RealmPass[] = [];\n for (const realm of wanted) {\n const excluded = mappings\n .filter((mapping) => mapping.realm !== realm && mapping.realm !== \"shared\")\n .map((mapping) => mapping.pattern);\n const depLibraries =\n realm === \"server\"\n ? resolvedDeps.server\n : realm === \"client\"\n ? resolvedDeps.client\n : resolvedDeps.shared;\n const passConfig = buildPassConfig(\n baseConfig as unknown as Record<string, unknown>,\n realm,\n annotationsPath,\n realm === \"client\" ? derived.client : realm === \"server\" ? derived.server : annotationsPath,\n excluded,\n depLibraries,\n );\n const configPath = writeTempConfig(passConfig);\n tempConfigs.push(configPath);\n passes.push({ realm, configPath, reportFiles: realmReportFiles[realm] });\n }\n\n return {\n baseConfigPath,\n passes,\n cleanup: () => {\n for (const tempConfig of tempConfigs) {\n removeTempConfig(tempConfig);\n }\n },\n };\n } catch (err) {\n for (const tempConfig of tempConfigs) {\n removeTempConfig(tempConfig);\n }\n throw err;\n }\n}\n\n/** Deletes a temporary configuration file, ignoring cleanup failures. */\nfunction removeTempConfig(configPath: string): void {\n try {\n if (fs.existsSync(configPath)) {\n fs.unlinkSync(configPath);\n }\n } catch (err) {\n logger.warn(\n `Failed to clean up temporary config file ${configPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/** Keeps only the diagnostics of files owned by the pass. */\nfunction filterReportByFiles(\n report: DiagnosticReport,\n root: string,\n reportFiles: Set<string>,\n): DiagnosticReport {\n const filtered: DiagnosticReport = {};\n const canonicalRoot = getCanonicalPath(root);\n for (const [uri, diagnostics] of Object.entries(report)) {\n const filePath = fileUriToPath(uri);\n const resolvedFile = path.resolve(filePath);\n let relative = normalizeRelative(path.relative(root, resolvedFile));\n if (!reportFiles.has(relative)) {\n const canonicalFile = getCanonicalPath(resolvedFile);\n relative = normalizeRelative(path.relative(canonicalRoot, canonicalFile));\n }\n if (reportFiles.has(relative)) {\n filtered[uri] = diagnostics;\n }\n }\n return filtered;\n}\n\n/**\n * Runs every planned realm pass, merges the per-realm reports into one result, and\n * recomputes the totals. Shared files are reported by the full-context pass only, so a\n * file never yields duplicate diagnostics.\n */\nexport async function runRealmAwareCheck(\n plan: RealmCheckPlan,\n targetPath: string,\n options: CheckOptions,\n): Promise<CheckResult> {\n const root = path.resolve(targetPath);\n const diagnostics: DiagnosticReport = {};\n let totalProblems = 0;\n let totalErrors = 0;\n let totalWarnings = 0;\n\n for (const pass of plan.passes) {\n logger.info(`[realms] Checking the ${pass.realm} realm (${pass.reportFiles.size} file(s))...`);\n const passResult = await runLuaLSCheck(targetPath, pass.configPath, options);\n const report = filterReportByFiles(passResult.diagnostics, root, pass.reportFiles);\n for (const [uri, diags] of Object.entries(report)) {\n if (diags.length === 0) {\n continue;\n }\n diagnostics[uri] = [...(diagnostics[uri] ?? []), ...diags];\n totalProblems += diags.length;\n for (const diagnostic of diags) {\n if (diagnostic.severity === 1) {\n totalErrors += 1;\n } else if (diagnostic.severity === 2) {\n totalWarnings += 1;\n }\n }\n }\n }\n\n const checkedFiles = new Set<string>();\n for (const pass of plan.passes) {\n for (const file of pass.reportFiles) {\n checkedFiles.add(file);\n }\n }\n const filesChecked = checkedFiles.size;\n const problemFiles = Object.values(diagnostics).filter((diags) => diags.length > 0).length;\n return {\n passed: totalProblems === 0,\n totalProblems,\n totalErrors,\n totalWarnings,\n totalFiles: totalProblems === 0 ? filesChecked : problemFiles,\n totalFilesChecked: filesChecked,\n diagnostics,\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileUriToPath } from \"./types.js\";\nimport { logger } from \"./logger.js\";\nimport type { CheckResult, DiagnosticSeverity } from \"./types.js\";\n\nconst SEVERITY_NAMES: Record<number, DiagnosticSeverity> = {\n 1: \"Error\",\n 2: \"Warning\",\n 3: \"Information\",\n 4: \"Hint\",\n};\n\n/**\n * Determines whether ANSI color codes should be enabled according to the NO_COLOR convention\n * and TTY detection.\n */\nexport function shouldEnableColor(): boolean {\n if (process.env.NO_COLOR !== undefined && process.env.NO_COLOR !== \"\") {\n return false;\n }\n if (process.env.FORCE_COLOR !== undefined && process.env.FORCE_COLOR !== \"0\") {\n return true;\n }\n return process.stdout ? Boolean(process.stdout.isTTY) : true;\n}\n\n/** Returns ANSI color escape code helpers or empty strings when colors are disabled. */\nexport function getColors(useColor: boolean = shouldEnableColor()) {\n if (!useColor) {\n return {\n reset: \"\",\n bold: \"\",\n dim: \"\",\n red: \"\",\n green: \"\",\n yellow: \"\",\n blue: \"\",\n magenta: \"\",\n cyan: \"\",\n gray: \"\",\n };\n }\n return {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n gray: \"\\x1b[90m\",\n };\n}\n\n/** Formats a numeric diagnostic severity level into a colored badge. */\nexport function formatSeverityBadge(\n severity: number,\n useColor: boolean = shouldEnableColor(),\n): string {\n const c = getColors(useColor);\n const name = SEVERITY_NAMES[severity] || \"Warning\";\n switch (severity) {\n case 1:\n return `${c.red}[${name}]${c.reset}`;\n case 2:\n return `${c.yellow}[${name}]${c.reset}`;\n case 3:\n return `${c.cyan}[${name}]${c.reset}`;\n default:\n return `${c.gray}[${name}]${c.reset}`;\n }\n}\n\n/** Formats a noun with its count and pluralizes if necessary. */\nexport function pluralize(\n count: number,\n singular: string,\n plural: string = `${singular}s`,\n): string {\n return `${count} ${count === 1 ? singular : plural}`;\n}\n\n/** Formats the summary text detailing diagnostic counts and affected files. */\nexport function formatProblemSummary(\n totalProblems: number,\n errors: number,\n warnings: number,\n files: number,\n): string {\n const parts: string[] = [];\n if (errors > 0) {\n parts.push(pluralize(errors, \"error\"));\n }\n if (warnings > 0) {\n parts.push(pluralize(warnings, \"warning\"));\n }\n const other = totalProblems - (errors + warnings);\n if (other > 0) {\n parts.push(pluralize(other, \"other\"));\n }\n\n const breakdown = parts.length > 0 ? ` (${parts.join(\", \")})` : \"\";\n const problemStr = pluralize(totalProblems, \"problem\");\n const fileStr = pluralize(files, \"file\");\n\n return `Diagnosis complete: ${problemStr}${breakdown} found across ${fileStr}.`;\n}\n\n/** Formats check results into pretty human-readable terminal output. */\nexport function formatPretty(\n result: CheckResult,\n cwd: string = process.cwd(),\n useColor: boolean = shouldEnableColor(),\n): string {\n const c = getColors(useColor);\n const symCross = \"✖ \";\n const symCheck = \"✔ \";\n\n if (result.passed && !result.baselineSummary) {\n const files = result.totalFilesChecked ?? result.totalFiles;\n const fileStr = pluralize(files, \"file\");\n return `${c.green}${c.bold}${symCheck}Diagnosis completed, no problems found across ${fileStr}.${c.reset}`;\n }\n\n const lines: string[] = [];\n\n for (const [rawUri, diags] of Object.entries(result.diagnostics)) {\n if (!diags || diags.length === 0) continue;\n\n // Convert file:// or absolute path to relative if within cwd\n const filePath = fileUriToPath(rawUri);\n\n const relPath = path.isAbsolute(filePath) ? path.relative(cwd, filePath) || filePath : filePath;\n\n let fileContent: string[] = [];\n try {\n if (fs.existsSync(filePath)) {\n fileContent = fs.readFileSync(filePath, \"utf-8\").split(/\\r?\\n/);\n }\n } catch (err) {\n logger.debug(\n `Failed to read file snippet for ${filePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n for (const d of diags) {\n if (d.baseline) continue;\n const line = d.range.start.line + 1;\n const col = d.range.start.character + 1;\n const badge = formatSeverityBadge(d.severity, useColor);\n const code = d.code ? `${c.magenta}(${d.code})${c.reset}` : \"\";\n\n lines.push(`${c.blue}${relPath}:${line}:${col}${c.reset} ${badge} ${d.message} ${code}`);\n\n // Line snippet preview\n if (fileContent.length >= line) {\n const sourceLine = fileContent[line - 1];\n const indent = \" \";\n lines.push(`${indent}${sourceLine}`);\n\n const caretOffset = Math.max(0, d.range.start.character);\n const caretLength =\n d.range.start.line === d.range.end.line\n ? Math.max(1, d.range.end.character - d.range.start.character)\n : 1;\n\n const pointer = \" \".repeat(caretOffset) + \"^\".repeat(caretLength);\n lines.push(`${indent}${c.gray}${pointer}${c.reset}`);\n }\n }\n }\n\n let errors = result.totalErrors;\n let warnings = result.totalWarnings;\n if (errors === undefined || warnings === undefined) {\n errors = 0;\n warnings = 0;\n for (const diags of Object.values(result.diagnostics)) {\n for (const d of diags) {\n if (d.severity === 1) errors++;\n else if (d.severity === 2) warnings++;\n }\n }\n }\n\n lines.push(\"\");\n const counts = result.baselineSummary;\n const summary = counts\n ? `Diagnosis complete: ${counts.new} new, ${counts.baselined} baselined, ${counts.total} total (${counts.stale} stale baseline entries).`\n : formatProblemSummary(result.totalProblems, errors, warnings, result.totalFiles);\n const color = result.passed ? c.green : c.red;\n lines.push(`${color}${c.bold}${result.passed ? symCheck : symCross}${summary}${c.reset}`);\n\n return lines.join(\"\\n\");\n}\n\n/** Formats check diagnostics into GitHub Actions workflow annotation commands. */\nexport function formatGitHubAnnotations(result: CheckResult, cwd: string = process.cwd()): string {\n const commands: string[] = [];\n\n for (const [rawUri, diags] of Object.entries(result.diagnostics)) {\n if (!diags || diags.length === 0) continue;\n\n const filePath = fileUriToPath(rawUri);\n\n const relPath = path.isAbsolute(filePath)\n ? path.relative(cwd, filePath).replace(/\\\\/g, \"/\")\n : filePath.replace(/\\\\/g, \"/\");\n\n const escapedFile = relPath.replace(/%/g, \"%25\").replace(/,/g, \"%2C\");\n\n for (const d of diags) {\n if (d.baseline) continue;\n const line = d.range.start.line + 1;\n const col = d.range.start.character + 1;\n const endLine = d.range.end.line + 1;\n const endCol = d.range.end.character + 1;\n\n const level = d.severity === 1 ? \"error\" : d.severity === 2 ? \"warning\" : \"notice\";\n const codeSuffix = d.code ? ` (${d.code})` : \"\";\n const escapedMessage = d.message\n .replace(/%/g, \"%25\")\n .replace(/\\r/g, \"%0D\")\n .replace(/\\n/g, \"%0A\");\n\n commands.push(\n `::${level} file=${escapedFile},line=${line},col=${col},endLine=${endLine},endColumn=${endCol},title=nanos-lint::${escapedMessage}${codeSuffix}`,\n );\n }\n }\n\n return commands.join(\"\\n\");\n}\n\n/** Formats check results according to the chosen format (pretty, json, github). */\nexport function formatReport(\n result: CheckResult,\n format: \"pretty\" | \"json\" | \"github\" = \"pretty\",\n cwd: string = process.cwd(),\n useColor: boolean = shouldEnableColor(),\n): string {\n switch (format) {\n case \"json\":\n return JSON.stringify(result, null, 2);\n case \"github\": {\n const pretty = formatPretty(result, cwd, useColor);\n const annotations = formatGitHubAnnotations(result, cwd);\n return annotations ? `${annotations}\\n\\n${pretty}` : pretty;\n }\n case \"pretty\":\n default:\n return formatPretty(result, cwd, useColor);\n }\n}\n","/**\n * CommanderError class\n */\nexport class CommanderError extends Error {\n /**\n * Constructs the CommanderError class\n * @param {number} exitCode suggested exit code which could be used with process.exit\n * @param {string} code an id string representing the error\n * @param {string} message human-readable description of the error\n */\n constructor(exitCode, code, message) {\n super(message);\n // properly capture stack trace in Node.js\n Error.captureStackTrace(this, this.constructor);\n this.name = this.constructor.name;\n this.code = code;\n this.exitCode = exitCode;\n this.nestedError = undefined;\n }\n}\n\n/**\n * InvalidArgumentError class\n */\nexport class InvalidArgumentError extends CommanderError {\n /**\n * Constructs the InvalidArgumentError class\n * @param {string} [message] explanation of why argument is invalid\n */\n constructor(message) {\n super(1, 'commander.invalidArgument', message);\n // properly capture stack trace in Node.js\n Error.captureStackTrace(this, this.constructor);\n this.name = this.constructor.name;\n }\n}\n","import { InvalidArgumentError } from './error.js';\n\nexport class Argument {\n /**\n * Initialize a new command argument with the given name and description.\n * The default is that the argument is required, and you can explicitly\n * indicate this with <> around the name. Put [] around the name for an optional argument.\n *\n * @param {string} name\n * @param {string} [description]\n */\n\n constructor(name, description) {\n this.description = description || '';\n this.variadic = false;\n this.parseArg = undefined;\n this.defaultValue = undefined;\n this.defaultValueDescription = undefined;\n this.argChoices = undefined;\n\n switch (name[0]) {\n case '<': // e.g. <required>\n this.required = true;\n this._name = name.slice(1, -1);\n break;\n case '[': // e.g. [optional]\n this.required = false;\n this._name = name.slice(1, -1);\n break;\n default:\n this.required = true;\n this._name = name;\n break;\n }\n\n if (this._name.endsWith('...')) {\n this.variadic = true;\n this._name = this._name.slice(0, -3);\n }\n }\n\n /**\n * Return argument name.\n *\n * @return {string}\n */\n\n name() {\n return this._name;\n }\n\n /**\n * @package\n */\n\n _collectValue(value, previous) {\n if (previous === this.defaultValue || !Array.isArray(previous)) {\n return [value];\n }\n\n previous.push(value);\n return previous;\n }\n\n /**\n * Set the default value, and optionally supply the description to be displayed in the help.\n *\n * @param {*} value\n * @param {string} [description]\n * @return {Argument}\n */\n\n default(value, description) {\n this.defaultValue = value;\n this.defaultValueDescription = description;\n return this;\n }\n\n /**\n * Set the custom handler for processing CLI command arguments into argument values.\n *\n * @param {Function} [fn]\n * @return {Argument}\n */\n\n argParser(fn) {\n this.parseArg = fn;\n return this;\n }\n\n /**\n * Only allow argument value to be one of choices.\n *\n * @param {string[]} values\n * @return {Argument}\n */\n\n choices(values) {\n this.argChoices = values.slice();\n this.parseArg = (arg, previous) => {\n if (!this.argChoices.includes(arg)) {\n throw new InvalidArgumentError(\n `Allowed choices are ${this.argChoices.join(', ')}.`,\n );\n }\n if (this.variadic) {\n return this._collectValue(arg, previous);\n }\n return arg;\n };\n return this;\n }\n\n /**\n * Make argument required.\n *\n * @returns {Argument}\n */\n argRequired() {\n this.required = true;\n return this;\n }\n\n /**\n * Make argument optional.\n *\n * @returns {Argument}\n */\n argOptional() {\n this.required = false;\n return this;\n }\n}\n\n/**\n * Takes an argument and returns its human readable equivalent for help usage.\n *\n * @param {Argument} arg\n * @return {string}\n * @private\n */\n\nexport function humanReadableArgName(arg) {\n const nameOutput = arg.name() + (arg.variadic === true ? '...' : '');\n\n return arg.required ? '<' + nameOutput + '>' : '[' + nameOutput + ']';\n}\n","import { humanReadableArgName } from './argument.js';\nimport { stripVTControlCharacters } from 'node:util';\n\n/**\n * TypeScript import types for JSDoc, used by Visual Studio Code IntelliSense and `npm run typescript-checkJS`\n * https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#import-types\n * @typedef { import(\"./argument.js\").Argument } Argument\n * @typedef { import(\"./command.js\").Command } Command\n * @typedef { import(\"./option.js\").Option } Option\n */\n\n// Although this is a class, methods are static in style to allow override using subclass or just functions.\nexport class Help {\n constructor() {\n this.helpWidth = undefined;\n this.minWidthToWrap = 40;\n this.sortSubcommands = false;\n this.sortOptions = false;\n this.showGlobalOptions = false;\n }\n\n /**\n * prepareContext is called by Commander after applying overrides from `Command.configureHelp()`\n * and just before calling `formatHelp()`.\n *\n * Commander just uses the helpWidth and the rest is provided for optional use by more complex subclasses.\n *\n * @param {{ error?: boolean, helpWidth?: number, outputHasColors?: boolean }} contextOptions\n */\n prepareContext(contextOptions) {\n this.helpWidth = this.helpWidth ?? contextOptions.helpWidth ?? 80;\n }\n\n /**\n * Get an array of the visible subcommands. Includes a placeholder for the implicit help command, if there is one.\n *\n * @param {Command} cmd\n * @returns {Command[]}\n */\n\n visibleCommands(cmd) {\n const visibleCommands = cmd.commands.filter((cmd) => !cmd._hidden);\n const helpCommand = cmd._getHelpCommand();\n if (helpCommand && !helpCommand._hidden) {\n visibleCommands.push(helpCommand);\n }\n if (this.sortSubcommands) {\n visibleCommands.sort((a, b) => {\n // @ts-ignore: because overloaded return type\n return a.name().localeCompare(b.name());\n });\n }\n return visibleCommands;\n }\n\n /**\n * Compare options for sort.\n *\n * @param {Option} a\n * @param {Option} b\n * @returns {number}\n */\n compareOptions(a, b) {\n const getSortKey = (option) => {\n // WYSIWYG for order displayed in help. Short used for comparison if present. No special handling for negated.\n return option.short\n ? option.short.replace(/^-/, '')\n : option.long.replace(/^--/, '');\n };\n return getSortKey(a).localeCompare(getSortKey(b));\n }\n\n /**\n * Get an array of the visible options. Includes a placeholder for the implicit help option, if there is one.\n *\n * @param {Command} cmd\n * @returns {Option[]}\n */\n\n visibleOptions(cmd) {\n const visibleOptions = cmd.options.filter((option) => !option.hidden);\n // Built-in help option.\n const helpOption = cmd._getHelpOption();\n if (helpOption && !helpOption.hidden) {\n // Automatically hide conflicting flags. Bit dubious but a historical behaviour that is convenient for single-command programs.\n const removeShort = helpOption.short && cmd._findOption(helpOption.short);\n const removeLong = helpOption.long && cmd._findOption(helpOption.long);\n if (!removeShort && !removeLong) {\n visibleOptions.push(helpOption); // no changes needed\n } else if (helpOption.long && !removeLong) {\n visibleOptions.push(\n cmd.createOption(helpOption.long, helpOption.description),\n );\n } else if (helpOption.short && !removeShort) {\n visibleOptions.push(\n cmd.createOption(helpOption.short, helpOption.description),\n );\n }\n }\n if (this.sortOptions) {\n visibleOptions.sort(this.compareOptions);\n }\n return visibleOptions;\n }\n\n /**\n * Get an array of the visible global options. (Not including help.)\n *\n * @param {Command} cmd\n * @returns {Option[]}\n */\n\n visibleGlobalOptions(cmd) {\n if (!this.showGlobalOptions) return [];\n\n const globalOptions = [];\n for (\n let ancestorCmd = cmd.parent;\n ancestorCmd;\n ancestorCmd = ancestorCmd.parent\n ) {\n const visibleOptions = ancestorCmd.options.filter(\n (option) => !option.hidden,\n );\n globalOptions.push(...visibleOptions);\n }\n if (this.sortOptions) {\n globalOptions.sort(this.compareOptions);\n }\n return globalOptions;\n }\n\n /**\n * Get an array of the arguments if any have a description.\n *\n * @param {Command} cmd\n * @returns {Argument[]}\n */\n\n visibleArguments(cmd) {\n // Side effect! Apply the legacy descriptions before the arguments are displayed.\n if (cmd._argsDescription) {\n cmd.registeredArguments.forEach((argument) => {\n argument.description =\n argument.description || cmd._argsDescription[argument.name()] || '';\n });\n }\n\n // If there are any arguments with a description then return all the arguments.\n if (cmd.registeredArguments.find((argument) => argument.description)) {\n return cmd.registeredArguments;\n }\n return [];\n }\n\n /**\n * Get the command term to show in the list of subcommands.\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n subcommandTerm(cmd) {\n // Legacy. Ignores custom usage string, and nested commands.\n const args = cmd.registeredArguments\n .map((arg) => humanReadableArgName(arg))\n .join(' ');\n return (\n cmd._name +\n (cmd._aliases[0] ? '|' + cmd._aliases[0] : '') +\n (cmd.options.length ? ' [options]' : '') + // simplistic check for non-help option\n (args ? ' ' + args : '')\n );\n }\n\n /**\n * Get the option term to show in the list of options.\n *\n * @param {Option} option\n * @returns {string}\n */\n\n optionTerm(option) {\n return option.flags;\n }\n\n /**\n * Get the argument term to show in the list of arguments.\n *\n * @param {Argument} argument\n * @returns {string}\n */\n\n argumentTerm(argument) {\n return argument.name();\n }\n\n /**\n * Get the longest command term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestSubcommandTermLength(cmd, helper) {\n return helper.visibleCommands(cmd).reduce((max, command) => {\n return Math.max(\n max,\n this.displayWidth(\n helper.styleSubcommandTerm(helper.subcommandTerm(command)),\n ),\n );\n }, 0);\n }\n\n /**\n * Get the longest option term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestOptionTermLength(cmd, helper) {\n return helper.visibleOptions(cmd).reduce((max, option) => {\n return Math.max(\n max,\n this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option))),\n );\n }, 0);\n }\n\n /**\n * Get the longest global option term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestGlobalOptionTermLength(cmd, helper) {\n return helper.visibleGlobalOptions(cmd).reduce((max, option) => {\n return Math.max(\n max,\n this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option))),\n );\n }, 0);\n }\n\n /**\n * Get the longest argument term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestArgumentTermLength(cmd, helper) {\n return helper.visibleArguments(cmd).reduce((max, argument) => {\n return Math.max(\n max,\n this.displayWidth(\n helper.styleArgumentTerm(helper.argumentTerm(argument)),\n ),\n );\n }, 0);\n }\n\n /**\n * Get the command usage to be displayed at the top of the built-in help.\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n commandUsage(cmd) {\n // Usage\n let cmdName = cmd._name;\n if (cmd._aliases[0]) {\n cmdName = cmdName + '|' + cmd._aliases[0];\n }\n let ancestorCmdNames = '';\n for (\n let ancestorCmd = cmd.parent;\n ancestorCmd;\n ancestorCmd = ancestorCmd.parent\n ) {\n ancestorCmdNames = ancestorCmd.name() + ' ' + ancestorCmdNames;\n }\n return ancestorCmdNames + cmdName + ' ' + cmd.usage();\n }\n\n /**\n * Get the description for the command.\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n commandDescription(cmd) {\n // @ts-ignore: because overloaded return type\n return cmd.description();\n }\n\n /**\n * Get the subcommand summary to show in the list of subcommands.\n * (Fallback to description for backwards compatibility.)\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n subcommandDescription(cmd) {\n // @ts-ignore: because overloaded return type\n return cmd.summary() || cmd.description();\n }\n\n /**\n * Get the option description to show in the list of options.\n *\n * @param {Option} option\n * @return {string}\n */\n\n optionDescription(option) {\n const extraInfo = [];\n\n if (option.argChoices) {\n extraInfo.push(\n // use stringify to match the display of the default value\n `choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`,\n );\n }\n if (option.defaultValue !== undefined) {\n // default for boolean and negated more for programmer than end user,\n // but show true/false for boolean option as may be for hand-rolled env or config processing.\n const showDefault =\n option.required ||\n option.optional ||\n (option.isBoolean() && typeof option.defaultValue === 'boolean');\n if (showDefault) {\n extraInfo.push(\n `default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}`,\n );\n }\n }\n // preset for boolean and negated are more for programmer than end user\n if (option.presetArg !== undefined && option.optional) {\n extraInfo.push(`preset: ${JSON.stringify(option.presetArg)}`);\n }\n if (option.envVar !== undefined) {\n extraInfo.push(`env: ${option.envVar}`);\n }\n if (extraInfo.length > 0) {\n const extraDescription = `(${extraInfo.join(', ')})`;\n if (option.description) {\n return `${option.description} ${extraDescription}`;\n }\n return extraDescription;\n }\n\n return option.description;\n }\n\n /**\n * Get the argument description to show in the list of arguments.\n *\n * @param {Argument} argument\n * @return {string}\n */\n\n argumentDescription(argument) {\n const extraInfo = [];\n if (argument.argChoices) {\n extraInfo.push(\n // use stringify to match the display of the default value\n `choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`,\n );\n }\n if (argument.defaultValue !== undefined) {\n extraInfo.push(\n `default: ${argument.defaultValueDescription || JSON.stringify(argument.defaultValue)}`,\n );\n }\n if (extraInfo.length > 0) {\n const extraDescription = `(${extraInfo.join(', ')})`;\n if (argument.description) {\n return `${argument.description} ${extraDescription}`;\n }\n return extraDescription;\n }\n return argument.description;\n }\n\n /**\n * Format a list of items, given a heading and an array of formatted items.\n *\n * @param {string} heading\n * @param {string[]} items\n * @param {Help} helper\n * @returns string[]\n */\n formatItemList(heading, items, helper) {\n if (items.length === 0) return [];\n\n return [helper.styleTitle(heading), ...items, ''];\n }\n\n /**\n * Group items by their help group heading.\n *\n * @param {Command[] | Option[]} unsortedItems\n * @param {Command[] | Option[]} visibleItems\n * @param {Function} getGroup\n * @returns {Map<string, Command[] | Option[]>}\n */\n groupItems(unsortedItems, visibleItems, getGroup) {\n const result = new Map();\n // Add groups in order of appearance in unsortedItems.\n unsortedItems.forEach((item) => {\n const group = getGroup(item);\n if (!result.has(group)) result.set(group, []);\n });\n // Add items in order of appearance in visibleItems.\n visibleItems.forEach((item) => {\n const group = getGroup(item);\n if (!result.has(group)) {\n result.set(group, []);\n }\n result.get(group).push(item);\n });\n return result;\n }\n\n /**\n * Generate the built-in help text.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {string}\n */\n\n formatHelp(cmd, helper) {\n const termWidth = helper.padWidth(cmd, helper);\n const helpWidth = helper.helpWidth ?? 80; // in case prepareContext() was not called\n\n function callFormatItem(term, description) {\n return helper.formatItem(term, termWidth, description, helper);\n }\n\n // Usage\n let output = [\n `${helper.styleTitle('Usage:')} ${helper.styleUsage(helper.commandUsage(cmd))}`,\n '',\n ];\n\n // Description\n const commandDescription = helper.commandDescription(cmd);\n if (commandDescription.length > 0) {\n output = output.concat([\n helper.boxWrap(\n helper.styleCommandDescription(commandDescription),\n helpWidth,\n ),\n '',\n ]);\n }\n\n // Arguments\n const argumentList = helper.visibleArguments(cmd).map((argument) => {\n return callFormatItem(\n helper.styleArgumentTerm(helper.argumentTerm(argument)),\n helper.styleArgumentDescription(helper.argumentDescription(argument)),\n );\n });\n output = output.concat(\n this.formatItemList('Arguments:', argumentList, helper),\n );\n\n // Options\n const optionGroups = this.groupItems(\n cmd.options,\n helper.visibleOptions(cmd),\n (option) => option.helpGroupHeading ?? 'Options:',\n );\n optionGroups.forEach((options, group) => {\n const optionList = options.map((option) => {\n return callFormatItem(\n helper.styleOptionTerm(helper.optionTerm(option)),\n helper.styleOptionDescription(helper.optionDescription(option)),\n );\n });\n output = output.concat(this.formatItemList(group, optionList, helper));\n });\n\n if (helper.showGlobalOptions) {\n const globalOptionList = helper\n .visibleGlobalOptions(cmd)\n .map((option) => {\n return callFormatItem(\n helper.styleOptionTerm(helper.optionTerm(option)),\n helper.styleOptionDescription(helper.optionDescription(option)),\n );\n });\n output = output.concat(\n this.formatItemList('Global Options:', globalOptionList, helper),\n );\n }\n\n // Commands\n const commandGroups = this.groupItems(\n cmd.commands,\n helper.visibleCommands(cmd),\n (sub) => sub.helpGroup() || 'Commands:',\n );\n commandGroups.forEach((commands, group) => {\n const commandList = commands.map((sub) => {\n return callFormatItem(\n helper.styleSubcommandTerm(helper.subcommandTerm(sub)),\n helper.styleSubcommandDescription(helper.subcommandDescription(sub)),\n );\n });\n output = output.concat(this.formatItemList(group, commandList, helper));\n });\n\n return output.join('\\n');\n }\n\n /**\n * Return display width of string, ignoring ANSI escape sequences. Used in padding and wrapping calculations.\n *\n * @param {string} str\n * @returns {number}\n */\n displayWidth(str) {\n return stripVTControlCharacters(str).length;\n }\n\n /**\n * Style the title for displaying in the help. Called with 'Usage:', 'Options:', etc.\n *\n * @param {string} str\n * @returns {string}\n */\n styleTitle(str) {\n return str;\n }\n\n styleUsage(str) {\n // Usage has lots of parts the user might like to color separately! Assume default usage string which is formed like:\n // command subcommand [options] [command] <foo> [bar]\n return str\n .split(' ')\n .map((word) => {\n if (word === '[options]') return this.styleOptionText(word);\n if (word === '[command]') return this.styleSubcommandText(word);\n if (word[0] === '[' || word[0] === '<')\n return this.styleArgumentText(word);\n return this.styleCommandText(word); // Restrict to initial words?\n })\n .join(' ');\n }\n styleCommandDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleOptionDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleSubcommandDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleArgumentDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleDescriptionText(str) {\n return str;\n }\n styleOptionTerm(str) {\n return this.styleOptionText(str);\n }\n styleSubcommandTerm(str) {\n // This is very like usage with lots of parts! Assume default string which is formed like:\n // subcommand [options] <foo> [bar]\n return str\n .split(' ')\n .map((word) => {\n if (word === '[options]') return this.styleOptionText(word);\n if (word[0] === '[' || word[0] === '<')\n return this.styleArgumentText(word);\n return this.styleSubcommandText(word); // Restrict to initial words?\n })\n .join(' ');\n }\n styleArgumentTerm(str) {\n return this.styleArgumentText(str);\n }\n styleOptionText(str) {\n return str;\n }\n styleArgumentText(str) {\n return str;\n }\n styleSubcommandText(str) {\n return str;\n }\n styleCommandText(str) {\n return str;\n }\n\n /**\n * Calculate the pad width from the maximum term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n padWidth(cmd, helper) {\n return Math.max(\n helper.longestOptionTermLength(cmd, helper),\n helper.longestGlobalOptionTermLength(cmd, helper),\n helper.longestSubcommandTermLength(cmd, helper),\n helper.longestArgumentTermLength(cmd, helper),\n );\n }\n\n /**\n * Detect manually wrapped and indented strings by checking for line break followed by whitespace.\n *\n * @param {string} str\n * @returns {boolean}\n */\n preformatted(str) {\n return /\\n[^\\S\\r\\n]/.test(str);\n }\n\n /**\n * Format the \"item\", which consists of a term and description. Pad the term and wrap the description, indenting the following lines.\n *\n * So \"TTT\", 5, \"DDD DDDD DD DDD\" might be formatted for this.helpWidth=17 like so:\n * TTT DDD DDDD\n * DD DDD\n *\n * @param {string} term\n * @param {number} termWidth\n * @param {string} description\n * @param {Help} helper\n * @returns {string}\n */\n formatItem(term, termWidth, description, helper) {\n const itemIndent = 2;\n const itemIndentStr = ' '.repeat(itemIndent);\n if (!description) return itemIndentStr + term;\n\n // Pad the term out to a consistent width, so descriptions are aligned.\n const paddedTerm = term.padEnd(\n termWidth + term.length - helper.displayWidth(term),\n );\n\n // Format the description.\n const spacerWidth = 2; // between term and description\n const helpWidth = this.helpWidth ?? 80; // in case prepareContext() was not called\n const remainingWidth = helpWidth - termWidth - spacerWidth - itemIndent;\n let formattedDescription;\n if (\n remainingWidth < this.minWidthToWrap ||\n helper.preformatted(description)\n ) {\n formattedDescription = description;\n } else {\n const wrappedDescription = helper.boxWrap(description, remainingWidth);\n formattedDescription = wrappedDescription.replace(\n /\\n/g,\n '\\n' + ' '.repeat(termWidth + spacerWidth),\n );\n }\n\n // Construct and overall indent.\n return (\n itemIndentStr +\n paddedTerm +\n ' '.repeat(spacerWidth) +\n formattedDescription.replace(/\\n/g, `\\n${itemIndentStr}`)\n );\n }\n\n /**\n * Wrap a string at whitespace, preserving existing line breaks.\n * Wrapping is skipped if the width is less than `minWidthToWrap`.\n *\n * @param {string} str\n * @param {number} width\n * @returns {string}\n */\n boxWrap(str, width) {\n if (width < this.minWidthToWrap) return str;\n\n const rawLines = str.split(/\\r\\n|\\n/);\n // split up text by whitespace\n const chunkPattern = /[\\s]*[^\\s]+/g;\n const wrappedLines = [];\n rawLines.forEach((line) => {\n const chunks = line.match(chunkPattern);\n if (chunks === null) {\n wrappedLines.push('');\n return;\n }\n\n let sumChunks = [chunks.shift()];\n let sumWidth = this.displayWidth(sumChunks[0]);\n chunks.forEach((chunk) => {\n const visibleWidth = this.displayWidth(chunk);\n // Accumulate chunks while they fit into width.\n if (sumWidth + visibleWidth <= width) {\n sumChunks.push(chunk);\n sumWidth += visibleWidth;\n return;\n }\n wrappedLines.push(sumChunks.join(''));\n\n const nextChunk = chunk.trimStart(); // trim space at line break\n sumChunks = [nextChunk];\n sumWidth = this.displayWidth(nextChunk);\n });\n wrappedLines.push(sumChunks.join(''));\n });\n\n return wrappedLines.join('\\n');\n }\n}\n","import { InvalidArgumentError } from './error.js';\n\nexport class Option {\n /**\n * Initialize a new `Option` with the given `flags` and `description`.\n *\n * @param {string} flags\n * @param {string} [description]\n */\n\n constructor(flags, description) {\n this.flags = flags;\n this.description = description || '';\n\n this.required = flags.includes('<'); // A value must be supplied when the option is specified.\n this.optional = flags.includes('['); // A value is optional when the option is specified.\n // variadic test ignores <value,...> et al which might be used to describe custom splitting of single argument\n this.variadic = /\\w\\.\\.\\.[>\\]]$/.test(flags); // The option can take multiple values.\n this.mandatory = false; // The option must have a value after parsing, which usually means it must be specified on command line.\n const optionFlags = splitOptionFlags(flags);\n this.short = optionFlags.shortFlag; // May be a short flag, undefined, or even a long flag (if option has two long flags).\n this.long = optionFlags.longFlag;\n this.negate = false;\n if (this.long) {\n this.negate = this.long.startsWith('--no-');\n }\n this.defaultValue = undefined;\n this.defaultValueDescription = undefined;\n this.presetArg = undefined;\n this.envVar = undefined;\n this.parseArg = undefined;\n this.hidden = false;\n this.argChoices = undefined;\n this.conflictsWith = [];\n this.implied = undefined;\n this.helpGroupHeading = undefined; // soft initialised when option added to command\n }\n\n /**\n * Set the default value, and optionally supply the description to be displayed in the help.\n *\n * @param {*} value\n * @param {string} [description]\n * @return {Option}\n */\n\n default(value, description) {\n this.defaultValue = value;\n this.defaultValueDescription = description;\n return this;\n }\n\n /**\n * Preset to use when option used without option-argument, especially optional but also boolean and negated.\n * The custom processing (parseArg) is called.\n *\n * @example\n * new Option('--color').default('GREYSCALE').preset('RGB');\n * new Option('--donate [amount]').preset('20').argParser(parseFloat);\n *\n * @param {*} arg\n * @return {Option}\n */\n\n preset(arg) {\n this.presetArg = arg;\n return this;\n }\n\n /**\n * Add option name(s) that conflict with this option.\n * An error will be displayed if conflicting options are found during parsing.\n *\n * @example\n * new Option('--rgb').conflicts('cmyk');\n * new Option('--js').conflicts(['ts', 'jsx']);\n *\n * @param {(string | string[])} names\n * @return {Option}\n */\n\n conflicts(names) {\n this.conflictsWith = this.conflictsWith.concat(names);\n return this;\n }\n\n /**\n * Specify implied option values for when this option is set and the implied options are not.\n *\n * The custom processing (parseArg) is not called on the implied values.\n *\n * @example\n * program\n * .addOption(new Option('--log', 'write logging information to file'))\n * .addOption(new Option('--trace', 'log extra details').implies({ log: 'trace.txt' }));\n *\n * @param {object} impliedOptionValues\n * @return {Option}\n */\n implies(impliedOptionValues) {\n let newImplied = impliedOptionValues;\n if (typeof impliedOptionValues === 'string') {\n // string is not documented, but easy mistake and we can do what user probably intended.\n newImplied = { [impliedOptionValues]: true };\n }\n this.implied = Object.assign(this.implied || {}, newImplied);\n return this;\n }\n\n /**\n * Set environment variable to check for option value.\n *\n * An environment variable is only used if when processed the current option value is\n * undefined, or the source of the current value is 'default' or 'config' or 'env'.\n *\n * @param {string} name\n * @return {Option}\n */\n\n env(name) {\n this.envVar = name;\n return this;\n }\n\n /**\n * Set the custom handler for processing CLI option arguments into option values.\n *\n * @param {Function} [fn]\n * @return {Option}\n */\n\n argParser(fn) {\n this.parseArg = fn;\n return this;\n }\n\n /**\n * Whether the option is mandatory and must have a value after parsing.\n *\n * @param {boolean} [mandatory=true]\n * @return {Option}\n */\n\n makeOptionMandatory(mandatory = true) {\n this.mandatory = !!mandatory;\n return this;\n }\n\n /**\n * Hide option in help.\n *\n * @param {boolean} [hide=true]\n * @return {Option}\n */\n\n hideHelp(hide = true) {\n this.hidden = !!hide;\n return this;\n }\n\n /**\n * @package\n */\n\n _collectValue(value, previous) {\n if (previous === this.defaultValue || !Array.isArray(previous)) {\n return [value];\n }\n\n previous.push(value);\n return previous;\n }\n\n /**\n * Only allow option value to be one of choices.\n *\n * @param {string[]} values\n * @return {Option}\n */\n\n choices(values) {\n this.argChoices = values.slice();\n this.parseArg = (arg, previous) => {\n if (!this.argChoices.includes(arg)) {\n throw new InvalidArgumentError(\n `Allowed choices are ${this.argChoices.join(', ')}.`,\n );\n }\n if (this.variadic) {\n return this._collectValue(arg, previous);\n }\n return arg;\n };\n return this;\n }\n\n /**\n * Return option name.\n *\n * @return {string}\n */\n\n name() {\n if (this.long) {\n return this.long.replace(/^--/, '');\n }\n return this.short.replace(/^-/, '');\n }\n\n /**\n * Return option name, in a camelcase format that can be used\n * as an object attribute key.\n *\n * @return {string}\n */\n\n attributeName() {\n if (this.negate) {\n return camelcase(this.name().replace(/^no-/, ''));\n }\n return camelcase(this.name());\n }\n\n /**\n * Set the help group heading.\n *\n * @param {string} heading\n * @return {Option}\n */\n helpGroup(heading) {\n this.helpGroupHeading = heading;\n return this;\n }\n\n /**\n * Check if `arg` matches the short or long flag.\n *\n * @param {string} arg\n * @return {boolean}\n * @package\n */\n\n is(arg) {\n return this.short === arg || this.long === arg;\n }\n\n /**\n * Return whether a boolean option.\n *\n * Options are one of boolean, negated, required argument, or optional argument.\n *\n * @return {boolean}\n * @package\n */\n\n isBoolean() {\n return !this.required && !this.optional && !this.negate;\n }\n}\n\n/**\n * This class is to make it easier to work with dual options, without changing the existing\n * implementation. We support separate dual options for separate positive and negative options,\n * like `--build` and `--no-build`, which share a single option value. This works nicely for some\n * use cases, but is tricky for others where we want separate behaviours despite\n * the single shared option value.\n */\nexport class DualOptions {\n /**\n * @param {Option[]} options\n */\n constructor(options) {\n this.positiveOptions = new Map();\n this.negativeOptions = new Map();\n this.dualOptions = new Set();\n options.forEach((option) => {\n if (option.negate) {\n this.negativeOptions.set(option.attributeName(), option);\n } else {\n this.positiveOptions.set(option.attributeName(), option);\n }\n });\n this.negativeOptions.forEach((value, key) => {\n if (this.positiveOptions.has(key)) {\n this.dualOptions.add(key);\n }\n });\n }\n\n /**\n * Did the value come from the option, and not from possible matching dual option?\n *\n * @param {*} value\n * @param {Option} option\n * @returns {boolean}\n */\n valueFromOption(value, option) {\n const optionKey = option.attributeName();\n if (!this.dualOptions.has(optionKey)) return true;\n\n // Use the value to deduce if (probably) came from the option.\n const preset = this.negativeOptions.get(optionKey).presetArg;\n const negativeValue = preset !== undefined ? preset : false;\n return option.negate === (negativeValue === value);\n }\n}\n\n/**\n * Convert string from kebab-case to camelCase.\n *\n * @param {string} str\n * @return {string}\n * @private\n */\n\nfunction camelcase(str) {\n return str.split('-').reduce((str, word) => {\n return str + word[0].toUpperCase() + word.slice(1);\n });\n}\n\n/**\n * Split the short and long flag out of something like '-m,--mixed <value>'\n *\n * @private\n */\n\nfunction splitOptionFlags(flags) {\n let shortFlag;\n let longFlag;\n // short flag, single dash and single character\n const shortFlagExp = /^-[^-]$/;\n // long flag, double dash and at least one character\n const longFlagExp = /^--[^-]/;\n\n const flagParts = flags.split(/[ |,]+/).concat('guard');\n // Normal is short and/or long.\n if (shortFlagExp.test(flagParts[0])) shortFlag = flagParts.shift();\n if (longFlagExp.test(flagParts[0])) longFlag = flagParts.shift();\n // Long then short. Rarely used but fine.\n if (!shortFlag && shortFlagExp.test(flagParts[0]))\n shortFlag = flagParts.shift();\n // Allow two long flags, like '--ws, --workspace'\n // This is the supported way to have a shortish option flag.\n if (!shortFlag && longFlagExp.test(flagParts[0])) {\n shortFlag = longFlag;\n longFlag = flagParts.shift();\n }\n\n // Check for unprocessed flag. Fail noisily rather than silently ignore.\n if (flagParts[0].startsWith('-')) {\n const unsupportedFlag = flagParts[0];\n const baseError = `option creation failed due to '${unsupportedFlag}' in option flags '${flags}'`;\n if (/^-[^-][^-]/.test(unsupportedFlag))\n throw new Error(\n `${baseError}\n- a short flag is a single dash and a single character\n - either use a single dash and a single character (for a short flag)\n - or use a double dash for a long option (and can have two, like '--ws, --workspace')`,\n );\n if (shortFlagExp.test(unsupportedFlag))\n throw new Error(`${baseError}\n- too many short flags`);\n if (longFlagExp.test(unsupportedFlag))\n throw new Error(`${baseError}\n- too many long flags`);\n\n throw new Error(`${baseError}\n- unrecognised flag format`);\n }\n if (shortFlag === undefined && longFlag === undefined)\n throw new Error(\n `option creation failed due to no flags found in '${flags}'.`,\n );\n\n return { shortFlag, longFlag };\n}\n","const maxDistance = 3;\n\nfunction editDistance(a, b) {\n // https://en.wikipedia.org/wiki/Damerau–Levenshtein_distance\n // Calculating optimal string alignment distance, no substring is edited more than once.\n // (Simple implementation.)\n\n // Quick early exit, return worst case.\n if (Math.abs(a.length - b.length) > maxDistance)\n return Math.max(a.length, b.length);\n\n // distance between prefix substrings of a and b\n const d = [];\n\n // pure deletions turn a into empty string\n for (let i = 0; i <= a.length; i++) {\n d[i] = [i];\n }\n // pure insertions turn empty string into b\n for (let j = 0; j <= b.length; j++) {\n d[0][j] = j;\n }\n\n // fill matrix\n for (let j = 1; j <= b.length; j++) {\n for (let i = 1; i <= a.length; i++) {\n let cost;\n if (a[i - 1] === b[j - 1]) {\n cost = 0;\n } else {\n cost = 1;\n }\n d[i][j] = Math.min(\n d[i - 1][j] + 1, // deletion\n d[i][j - 1] + 1, // insertion\n d[i - 1][j - 1] + cost, // substitution\n );\n // transposition\n if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) {\n d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + 1);\n }\n }\n }\n\n return d[a.length][b.length];\n}\n\n/**\n * Find close matches, restricted to same number of edits.\n *\n * @param {string} word\n * @param {string[]} candidates\n * @returns {string}\n */\n\nexport function suggestSimilar(word, candidates) {\n if (!candidates || candidates.length === 0) return '';\n // remove possible duplicates\n candidates = Array.from(new Set(candidates));\n\n const searchingOptions = word.startsWith('--');\n if (searchingOptions) {\n word = word.slice(2);\n candidates = candidates.map((candidate) => candidate.slice(2));\n }\n\n let similar = [];\n let bestDistance = maxDistance;\n const minSimilarity = 0.4;\n candidates.forEach((candidate) => {\n if (candidate.length <= 1) return; // no one character guesses\n\n const distance = editDistance(word, candidate);\n const length = Math.max(word.length, candidate.length);\n const similarity = (length - distance) / length;\n if (similarity > minSimilarity) {\n if (distance < bestDistance) {\n // better edit distance, throw away previous worse matches\n bestDistance = distance;\n similar = [candidate];\n } else if (distance === bestDistance) {\n similar.push(candidate);\n }\n }\n });\n\n similar.sort((a, b) => a.localeCompare(b));\n if (searchingOptions) {\n similar = similar.map((candidate) => `--${candidate}`);\n }\n\n if (similar.length > 1) {\n return `\\n(Did you mean one of ${similar.join(', ')}?)`;\n }\n if (similar.length === 1) {\n return `\\n(Did you mean ${similar[0]}?)`;\n }\n return '';\n}\n","import { EventEmitter } from 'node:events';\nimport childProcess from 'node:child_process';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport process from 'node:process';\nimport { stripVTControlCharacters } from 'node:util';\n\nimport { Argument, humanReadableArgName } from './argument.js';\nimport { CommanderError } from './error.js';\nimport { Help } from './help.js';\nimport { Option, DualOptions } from './option.js';\nimport { suggestSimilar } from './suggestSimilar.js';\n\nexport class Command extends EventEmitter {\n /**\n * Initialize a new `Command`.\n *\n * @param {string} [name]\n */\n\n constructor(name) {\n super();\n /** @type {Command[]} */\n this.commands = [];\n /** @type {Option[]} */\n this.options = [];\n this.parent = null;\n this._allowUnknownOption = false;\n this._allowExcessArguments = false;\n /** @type {Argument[]} */\n this.registeredArguments = [];\n this._args = this.registeredArguments; // deprecated old name\n /** @type {string[]} */\n this.args = []; // cli args with options removed\n this.rawArgs = [];\n this.processedArgs = []; // like .args but after custom processing and collecting variadic\n this._scriptPath = null;\n this._name = name || '';\n this._optionValues = {};\n this._optionValueSources = {}; // default, env, cli etc\n this._storeOptionsAsProperties = false;\n this._actionHandler = null;\n this._executableHandler = false;\n this._executableFile = null; // custom name for executable\n this._executableDir = null; // custom search directory for subcommands\n this._defaultCommandName = null;\n this._exitCallback = null;\n this._aliases = [];\n this._combineFlagAndOptionalValue = true;\n this._description = '';\n this._summary = '';\n this._argsDescription = undefined; // legacy\n this._enablePositionalOptions = false;\n this._passThroughOptions = false;\n this._lifeCycleHooks = {}; // a hash of arrays\n /** @type {(boolean | string)} */\n this._showHelpAfterError = false;\n this._showSuggestionAfterError = true;\n this._savedState = null; // used in save/restoreStateBeforeParse\n\n // see configureOutput() for docs\n this._outputConfiguration = {\n writeOut: (str) => process.stdout.write(str),\n writeErr: (str) => process.stderr.write(str),\n outputError: (str, write) => write(str),\n getOutHelpWidth: () =>\n process.stdout.isTTY ? process.stdout.columns : undefined,\n getErrHelpWidth: () =>\n process.stderr.isTTY ? process.stderr.columns : undefined,\n getOutHasColors: () =>\n useColor() ?? (process.stdout.isTTY && process.stdout.hasColors?.()),\n getErrHasColors: () =>\n useColor() ?? (process.stderr.isTTY && process.stderr.hasColors?.()),\n stripColor: (str) => stripVTControlCharacters(str),\n };\n\n this._hidden = false;\n /** @type {(Option | null | undefined)} */\n this._helpOption = undefined; // Lazy created on demand. May be null if help option is disabled.\n this._addImplicitHelpCommand = undefined; // undecided whether true or false yet, not inherited\n /** @type {Command} */\n this._helpCommand = undefined; // lazy initialised, inherited\n this._helpConfiguration = {};\n /** @type {string | undefined} */\n this._helpGroupHeading = undefined; // soft initialised when added to parent\n /** @type {string | undefined} */\n this._defaultCommandGroup = undefined;\n /** @type {string | undefined} */\n this._defaultOptionGroup = undefined;\n }\n\n /**\n * Copy settings that are useful to have in common across root command and subcommands.\n *\n * (Used internally when adding a command using `.command()` so subcommands inherit parent settings.)\n *\n * @param {Command} sourceCommand\n * @return {Command} `this` command for chaining\n */\n copyInheritedSettings(sourceCommand) {\n this._outputConfiguration = sourceCommand._outputConfiguration;\n this._helpOption = sourceCommand._helpOption;\n this._helpCommand = sourceCommand._helpCommand;\n this._helpConfiguration = sourceCommand._helpConfiguration;\n this._exitCallback = sourceCommand._exitCallback;\n this._storeOptionsAsProperties = sourceCommand._storeOptionsAsProperties;\n this._combineFlagAndOptionalValue =\n sourceCommand._combineFlagAndOptionalValue;\n this._allowExcessArguments = sourceCommand._allowExcessArguments;\n this._enablePositionalOptions = sourceCommand._enablePositionalOptions;\n this._showHelpAfterError = sourceCommand._showHelpAfterError;\n this._showSuggestionAfterError = sourceCommand._showSuggestionAfterError;\n\n return this;\n }\n\n /**\n * @returns {Command[]}\n * @private\n */\n\n _getCommandAndAncestors() {\n const result = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n for (let command = this; command; command = command.parent) {\n result.push(command);\n }\n return result;\n }\n\n /**\n * Define a command.\n *\n * There are two styles of command: pay attention to where to put the description.\n *\n * @example\n * // Command implemented using action handler (description is supplied separately to `.command`)\n * program\n * .command('clone <source> [destination]')\n * .description('clone a repository into a newly created directory')\n * .action((source, destination) => {\n * console.log('clone command called');\n * });\n *\n * // Command implemented using separate executable file (description is second parameter to `.command`)\n * program\n * .command('start <service>', 'start named service')\n * .command('stop [service]', 'stop named service, or all if no name supplied');\n *\n * @param {string} nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`\n * @param {(object | string)} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable)\n * @param {object} [execOpts] - configuration options (for executable)\n * @return {Command} returns new command for action handler, or `this` for executable command\n */\n\n command(nameAndArgs, actionOptsOrExecDesc, execOpts) {\n let desc = actionOptsOrExecDesc;\n let opts = execOpts;\n if (typeof desc === 'object' && desc !== null) {\n opts = desc;\n desc = null;\n }\n opts = opts || {};\n const [, name, args] = nameAndArgs.match(/([^ ]+) *(.*)/);\n\n const cmd = this.createCommand(name);\n if (desc) {\n cmd.description(desc);\n cmd._executableHandler = true;\n }\n if (opts.isDefault) this._defaultCommandName = cmd._name;\n cmd._hidden = !!(opts.noHelp || opts.hidden); // noHelp is deprecated old name for hidden\n cmd._executableFile = opts.executableFile || null; // Custom name for executable file, set missing to null to match constructor\n if (args) cmd.arguments(args);\n this._registerCommand(cmd);\n cmd.parent = this;\n cmd.copyInheritedSettings(this);\n\n if (desc) return this;\n return cmd;\n }\n\n /**\n * Factory routine to create a new unattached command.\n *\n * See .command() for creating an attached subcommand, which uses this routine to\n * create the command. You can override createCommand to customise subcommands.\n *\n * @param {string} [name]\n * @return {Command} new command\n */\n\n createCommand(name) {\n return new Command(name);\n }\n\n /**\n * You can customise the help with a subclass of Help by overriding createHelp,\n * or by overriding Help properties using configureHelp().\n *\n * @return {Help}\n */\n\n createHelp() {\n return Object.assign(new Help(), this.configureHelp());\n }\n\n /**\n * You can customise the help by overriding Help properties using configureHelp(),\n * or with a subclass of Help by overriding createHelp().\n *\n * @param {object} [configuration] - configuration options\n * @return {(Command | object)} `this` command for chaining, or stored configuration\n */\n\n configureHelp(configuration) {\n if (configuration === undefined) return this._helpConfiguration;\n\n this._helpConfiguration = configuration;\n return this;\n }\n\n /**\n * The default output goes to stdout and stderr. You can customise this for special\n * applications. You can also customise the display of errors by overriding outputError.\n *\n * The configuration properties are all functions:\n *\n * // change how output being written, defaults to stdout and stderr\n * writeOut(str)\n * writeErr(str)\n * // change how output being written for errors, defaults to writeErr\n * outputError(str, write) // used for displaying errors and not used for displaying help\n * // specify width for wrapping help\n * getOutHelpWidth()\n * getErrHelpWidth()\n * // color support, currently only used with Help\n * getOutHasColors()\n * getErrHasColors()\n * stripColor() // used to remove ANSI escape codes if output does not have colors\n *\n * @param {object} [configuration] - configuration options\n * @return {(Command | object)} `this` command for chaining, or stored configuration\n */\n\n configureOutput(configuration) {\n if (configuration === undefined) return this._outputConfiguration;\n\n this._outputConfiguration = {\n ...this._outputConfiguration,\n ...configuration,\n };\n return this;\n }\n\n /**\n * Display the help or a custom message after an error occurs.\n *\n * @param {(boolean|string)} [displayHelp]\n * @return {Command} `this` command for chaining\n */\n showHelpAfterError(displayHelp = true) {\n if (typeof displayHelp !== 'string') displayHelp = !!displayHelp;\n this._showHelpAfterError = displayHelp;\n return this;\n }\n\n /**\n * Display suggestion of similar commands for unknown commands, or options for unknown options.\n *\n * @param {boolean} [displaySuggestion]\n * @return {Command} `this` command for chaining\n */\n showSuggestionAfterError(displaySuggestion = true) {\n this._showSuggestionAfterError = !!displaySuggestion;\n return this;\n }\n\n /**\n * Add a prepared subcommand.\n *\n * See .command() for creating an attached subcommand which inherits settings from its parent.\n *\n * @param {Command} cmd - new subcommand\n * @param {object} [opts] - configuration options\n * @return {Command} `this` command for chaining\n */\n\n addCommand(cmd, opts) {\n if (!cmd._name) {\n throw new Error(`Command passed to .addCommand() must have a name\n- specify the name in Command constructor or using .name()`);\n }\n\n opts = opts || {};\n if (opts.isDefault) this._defaultCommandName = cmd._name;\n if (opts.noHelp || opts.hidden) cmd._hidden = true; // modifying passed command due to existing implementation\n\n this._registerCommand(cmd);\n cmd.parent = this;\n cmd._checkForBrokenPassThrough();\n\n return this;\n }\n\n /**\n * Factory routine to create a new unattached argument.\n *\n * See .argument() for creating an attached argument, which uses this routine to\n * create the argument. You can override createArgument to return a custom argument.\n *\n * @param {string} name\n * @param {string} [description]\n * @return {Argument} new argument\n */\n\n createArgument(name, description) {\n return new Argument(name, description);\n }\n\n /**\n * Define argument syntax for command.\n *\n * The default is that the argument is required, and you can explicitly\n * indicate this with <> around the name. Put [] around the name for an optional argument.\n *\n * @example\n * program.argument('<input-file>');\n * program.argument('[output-file]');\n *\n * @param {string} name\n * @param {string} [description]\n * @param {(Function|*)} [parseArg] - custom argument processing function or default value\n * @param {*} [defaultValue]\n * @return {Command} `this` command for chaining\n */\n argument(name, description, parseArg, defaultValue) {\n const argument = this.createArgument(name, description);\n if (typeof parseArg === 'function') {\n argument.default(defaultValue).argParser(parseArg);\n } else {\n argument.default(parseArg);\n }\n this.addArgument(argument);\n return this;\n }\n\n /**\n * Define argument syntax for command, adding multiple at once (without descriptions).\n *\n * See also .argument().\n *\n * @example\n * program.arguments('<cmd> [env]');\n *\n * @param {string} names\n * @return {Command} `this` command for chaining\n */\n\n arguments(names) {\n names\n .trim()\n .split(/ +/)\n .forEach((detail) => {\n this.argument(detail);\n });\n return this;\n }\n\n /**\n * Define argument syntax for command, adding a prepared argument.\n *\n * @param {Argument} argument\n * @return {Command} `this` command for chaining\n */\n addArgument(argument) {\n const previousArgument = this.registeredArguments.slice(-1)[0];\n if (previousArgument?.variadic) {\n throw new Error(\n `only the last argument can be variadic '${previousArgument.name()}'`,\n );\n }\n if (\n argument.required &&\n argument.defaultValue !== undefined &&\n argument.parseArg === undefined\n ) {\n throw new Error(\n `a default value for a required argument is never used: '${argument.name()}'`,\n );\n }\n this.registeredArguments.push(argument);\n return this;\n }\n\n /**\n * Customise or override default help command. By default a help command is automatically added if your command has subcommands.\n *\n * @example\n * program.helpCommand('help [cmd]');\n * program.helpCommand('help [cmd]', 'show help');\n * program.helpCommand(false); // suppress default help command\n * program.helpCommand(true); // add help command even if no subcommands\n *\n * @param {string|boolean} enableOrNameAndArgs - enable with custom name and/or arguments, or boolean to override whether added\n * @param {string} [description] - custom description\n * @return {Command} `this` command for chaining\n */\n\n helpCommand(enableOrNameAndArgs, description) {\n if (typeof enableOrNameAndArgs === 'boolean') {\n this._addImplicitHelpCommand = enableOrNameAndArgs;\n if (enableOrNameAndArgs && this._defaultCommandGroup) {\n // make the command to store the group\n this._initCommandGroup(this._getHelpCommand());\n }\n return this;\n }\n\n const nameAndArgs = enableOrNameAndArgs ?? 'help [command]';\n const [, helpName, helpArgs] = nameAndArgs.match(/([^ ]+) *(.*)/);\n const helpDescription = description ?? 'display help for command';\n\n const helpCommand = this.createCommand(helpName);\n helpCommand.helpOption(false);\n if (helpArgs) helpCommand.arguments(helpArgs);\n if (helpDescription) helpCommand.description(helpDescription);\n\n this._addImplicitHelpCommand = true;\n this._helpCommand = helpCommand;\n // init group unless lazy create\n if (enableOrNameAndArgs || description) this._initCommandGroup(helpCommand);\n\n return this;\n }\n\n /**\n * Add prepared custom help command.\n *\n * @param {(Command|string|boolean)} helpCommand - custom help command, or deprecated enableOrNameAndArgs as for `.helpCommand()`\n * @param {string} [deprecatedDescription] - deprecated custom description used with custom name only\n * @return {Command} `this` command for chaining\n */\n addHelpCommand(helpCommand, deprecatedDescription) {\n // If not passed an object, call through to helpCommand for backwards compatibility,\n // as addHelpCommand was originally used like helpCommand is now.\n if (typeof helpCommand !== 'object') {\n this.helpCommand(helpCommand, deprecatedDescription);\n return this;\n }\n\n this._addImplicitHelpCommand = true;\n this._helpCommand = helpCommand;\n this._initCommandGroup(helpCommand);\n return this;\n }\n\n /**\n * Lazy create help command.\n *\n * @return {(Command|null)}\n * @package\n */\n _getHelpCommand() {\n const hasImplicitHelpCommand =\n this._addImplicitHelpCommand ??\n (this.commands.length &&\n !this._actionHandler &&\n !this._findCommand('help'));\n\n if (hasImplicitHelpCommand) {\n if (this._helpCommand === undefined) {\n this.helpCommand(undefined, undefined); // use default name and description\n }\n return this._helpCommand;\n }\n return null;\n }\n\n /**\n * Add hook for life cycle event.\n *\n * @param {string} event\n * @param {Function} listener\n * @return {Command} `this` command for chaining\n */\n\n hook(event, listener) {\n const allowedValues = ['preSubcommand', 'preAction', 'postAction'];\n if (!allowedValues.includes(event)) {\n throw new Error(`Unexpected value for event passed to hook : '${event}'.\nExpecting one of '${allowedValues.join(\"', '\")}'`);\n }\n if (this._lifeCycleHooks[event]) {\n this._lifeCycleHooks[event].push(listener);\n } else {\n this._lifeCycleHooks[event] = [listener];\n }\n return this;\n }\n\n /**\n * Register callback to use as replacement for calling process.exit.\n *\n * @param {Function} [fn] optional callback which will be passed a CommanderError, defaults to throwing\n * @return {Command} `this` command for chaining\n */\n\n exitOverride(fn) {\n if (fn) {\n this._exitCallback = fn;\n } else {\n this._exitCallback = (err) => {\n if (err.code !== 'commander.executeSubCommandAsync') {\n throw err;\n } else {\n // Async callback from spawn events, not useful to throw.\n }\n };\n }\n return this;\n }\n\n /**\n * Call process.exit, and _exitCallback if defined.\n *\n * @param {number} exitCode exit code for using with process.exit\n * @param {string} code an id string representing the error\n * @param {string} message human-readable description of the error\n * @return never\n * @private\n */\n\n _exit(exitCode, code, message) {\n if (this._exitCallback) {\n this._exitCallback(new CommanderError(exitCode, code, message));\n // Expecting this line is not reached.\n }\n process.exit(exitCode);\n }\n\n /**\n * Register callback `fn` for the command.\n *\n * @example\n * program\n * .command('serve')\n * .description('start service')\n * .action(function() {\n * // do work here\n * });\n *\n * @param {Function} fn\n * @return {Command} `this` command for chaining\n */\n\n action(fn) {\n const listener = (args) => {\n // The .action callback takes an extra parameter which is the command or options.\n const expectedArgsCount = this.registeredArguments.length;\n const actionArgs = args.slice(0, expectedArgsCount);\n if (this._storeOptionsAsProperties) {\n actionArgs[expectedArgsCount] = this; // backwards compatible \"options\"\n } else {\n actionArgs[expectedArgsCount] = this.opts();\n }\n actionArgs.push(this);\n\n return fn.apply(this, actionArgs);\n };\n this._actionHandler = listener;\n return this;\n }\n\n /**\n * Factory routine to create a new unattached option.\n *\n * See .option() for creating an attached option, which uses this routine to\n * create the option. You can override createOption to return a custom option.\n *\n * @param {string} flags\n * @param {string} [description]\n * @return {Option} new option\n */\n\n createOption(flags, description) {\n return new Option(flags, description);\n }\n\n /**\n * Wrap parseArgs to catch 'commander.invalidArgument'.\n *\n * @param {(Option | Argument)} target\n * @param {string} value\n * @param {*} previous\n * @param {string} invalidArgumentMessage\n * @private\n */\n\n _callParseArg(target, value, previous, invalidArgumentMessage) {\n try {\n return target.parseArg(value, previous);\n } catch (err) {\n if (err.code === 'commander.invalidArgument') {\n const message = `${invalidArgumentMessage} ${err.message}`;\n this.error(message, { exitCode: err.exitCode, code: err.code });\n }\n throw err;\n }\n }\n\n /**\n * Check for option flag conflicts.\n * Register option if no conflicts found, or throw on conflict.\n *\n * @param {Option} option\n * @private\n */\n\n _registerOption(option) {\n const matchingOption =\n (option.short && this._findOption(option.short)) ||\n (option.long && this._findOption(option.long));\n if (matchingOption) {\n const matchingFlag =\n option.long && this._findOption(option.long)\n ? option.long\n : option.short;\n throw new Error(`Cannot add option '${option.flags}'${this._name && ` to command '${this._name}'`} due to conflicting flag '${matchingFlag}'\n- already used by option '${matchingOption.flags}'`);\n }\n\n this._initOptionGroup(option);\n this.options.push(option);\n }\n\n /**\n * Check for command name and alias conflicts with existing commands.\n * Register command if no conflicts found, or throw on conflict.\n *\n * @param {Command} command\n * @private\n */\n\n _registerCommand(command) {\n const knownBy = (cmd) => {\n return [cmd.name()].concat(cmd.aliases());\n };\n\n const alreadyUsed = knownBy(command).find((name) =>\n this._findCommand(name),\n );\n if (alreadyUsed) {\n const existingCmd = knownBy(this._findCommand(alreadyUsed)).join('|');\n const newCmd = knownBy(command).join('|');\n throw new Error(\n `cannot add command '${newCmd}' as already have command '${existingCmd}'`,\n );\n }\n\n this._initCommandGroup(command);\n this.commands.push(command);\n }\n\n /**\n * Add an option.\n *\n * @param {Option} option\n * @return {Command} `this` command for chaining\n */\n addOption(option) {\n this._registerOption(option);\n\n const oname = option.name();\n const name = option.attributeName();\n\n // store default value\n if (option.defaultValue !== undefined) {\n this.setOptionValueWithSource(name, option.defaultValue, 'default');\n }\n\n // handler for cli and env supplied values\n const handleOptionValue = (val, invalidValueMessage, valueSource) => {\n // val is null for optional option used without an optional-argument.\n // val is undefined for boolean and negated option.\n if (val == null && option.presetArg !== undefined) {\n val = option.presetArg;\n }\n\n // custom processing\n const oldValue = this.getOptionValue(name);\n if (val !== null && option.parseArg) {\n val = this._callParseArg(option, val, oldValue, invalidValueMessage);\n } else if (val !== null && option.variadic) {\n val = option._collectValue(val, oldValue);\n }\n\n // Fill-in appropriate missing values. Long winded but easy to follow.\n if (val == null) {\n if (option.negate) {\n val = false;\n } else if (option.isBoolean() || option.optional) {\n val = true;\n } else {\n val = ''; // not normal, parseArg might have failed or be a mock function for testing\n }\n }\n this.setOptionValueWithSource(name, val, valueSource);\n };\n\n this.on('option:' + oname, (val) => {\n const invalidValueMessage = `error: option '${option.flags}' argument '${val}' is invalid.`;\n handleOptionValue(val, invalidValueMessage, 'cli');\n });\n\n if (option.envVar) {\n this.on('optionEnv:' + oname, (val) => {\n const invalidValueMessage = `error: option '${option.flags}' value '${val}' from env '${option.envVar}' is invalid.`;\n handleOptionValue(val, invalidValueMessage, 'env');\n });\n }\n\n return this;\n }\n\n /**\n * Internal implementation shared by .option() and .requiredOption()\n *\n * @return {Command} `this` command for chaining\n * @private\n */\n _optionEx(config, flags, description, fn, defaultValue) {\n if (typeof flags === 'object' && flags instanceof Option) {\n throw new Error(\n 'To add an Option object use addOption() instead of option() or requiredOption()',\n );\n }\n const option = this.createOption(flags, description);\n option.makeOptionMandatory(!!config.mandatory);\n if (typeof fn === 'function') {\n option.default(defaultValue).argParser(fn);\n } else if (fn instanceof RegExp) {\n // deprecated\n const regex = fn;\n fn = (val, def) => {\n const m = regex.exec(val);\n return m ? m[0] : def;\n };\n option.default(defaultValue).argParser(fn);\n } else {\n option.default(fn);\n }\n\n return this.addOption(option);\n }\n\n /**\n * Define option with `flags`, `description`, and optional argument parsing function or `defaultValue` or both.\n *\n * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space. A required\n * option-argument is indicated by `<>` and an optional option-argument by `[]`.\n *\n * See the README for more details, and see also addOption() and requiredOption().\n *\n * @example\n * program\n * .option('-p, --pepper', 'add pepper')\n * .option('--pt, --pizza-type <TYPE>', 'type of pizza') // required option-argument\n * .option('-c, --cheese [CHEESE]', 'add extra cheese', 'mozzarella') // optional option-argument with default\n * .option('-t, --tip <VALUE>', 'add tip to purchase cost', parseFloat) // custom parse function\n *\n * @param {string} flags\n * @param {string} [description]\n * @param {(Function|*)} [parseArg] - custom option processing function or default value\n * @param {*} [defaultValue]\n * @return {Command} `this` command for chaining\n */\n\n option(flags, description, parseArg, defaultValue) {\n return this._optionEx({}, flags, description, parseArg, defaultValue);\n }\n\n /**\n * Add a required option which must have a value after parsing. This usually means\n * the option must be specified on the command line. (Otherwise the same as .option().)\n *\n * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space.\n *\n * @param {string} flags\n * @param {string} [description]\n * @param {(Function|*)} [parseArg] - custom option processing function or default value\n * @param {*} [defaultValue]\n * @return {Command} `this` command for chaining\n */\n\n requiredOption(flags, description, parseArg, defaultValue) {\n return this._optionEx(\n { mandatory: true },\n flags,\n description,\n parseArg,\n defaultValue,\n );\n }\n\n /**\n * Alter parsing of short flags with optional values.\n *\n * @example\n * // for `.option('-f,--flag [value]'):\n * program.combineFlagAndOptionalValue(true); // `-f80` is treated like `--flag=80`, this is the default behaviour\n * program.combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b`\n *\n * @param {boolean} [combine] - if `true` or omitted, an optional value can be specified directly after the flag.\n * @return {Command} `this` command for chaining\n */\n combineFlagAndOptionalValue(combine = true) {\n this._combineFlagAndOptionalValue = !!combine;\n return this;\n }\n\n /**\n * Allow unknown options on the command line.\n *\n * @param {boolean} [allowUnknown] - if `true` or omitted, no error will be thrown for unknown options.\n * @return {Command} `this` command for chaining\n */\n allowUnknownOption(allowUnknown = true) {\n this._allowUnknownOption = !!allowUnknown;\n return this;\n }\n\n /**\n * Allow excess command-arguments on the command line. Pass false to make excess arguments an error.\n *\n * @param {boolean} [allowExcess] - if `true` or omitted, no error will be thrown for excess arguments.\n * @return {Command} `this` command for chaining\n */\n allowExcessArguments(allowExcess = true) {\n this._allowExcessArguments = !!allowExcess;\n return this;\n }\n\n /**\n * Enable positional options. Positional means global options are specified before subcommands which lets\n * subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions.\n * The default behaviour is non-positional and global options may appear anywhere on the command line.\n *\n * @param {boolean} [positional]\n * @return {Command} `this` command for chaining\n */\n enablePositionalOptions(positional = true) {\n this._enablePositionalOptions = !!positional;\n return this;\n }\n\n /**\n * Pass through options that come after command-arguments rather than treat them as command-options,\n * so actual command-options come before command-arguments. Turning this on for a subcommand requires\n * positional options to have been enabled on the program (parent commands).\n * The default behaviour is non-positional and options may appear before or after command-arguments.\n *\n * @param {boolean} [passThrough] for unknown options.\n * @return {Command} `this` command for chaining\n */\n passThroughOptions(passThrough = true) {\n this._passThroughOptions = !!passThrough;\n this._checkForBrokenPassThrough();\n return this;\n }\n\n /**\n * @private\n */\n\n _checkForBrokenPassThrough() {\n if (\n this.parent &&\n this._passThroughOptions &&\n !this.parent._enablePositionalOptions\n ) {\n throw new Error(\n `passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`,\n );\n }\n }\n\n /**\n * Whether to store option values as properties on command object,\n * or store separately (specify false). In both cases the option values can be accessed using .opts().\n *\n * @param {boolean} [storeAsProperties=true]\n * @return {Command} `this` command for chaining\n */\n\n storeOptionsAsProperties(storeAsProperties = true) {\n if (this.options.length) {\n throw new Error('call .storeOptionsAsProperties() before adding options');\n }\n if (Object.keys(this._optionValues).length) {\n throw new Error(\n 'call .storeOptionsAsProperties() before setting option values',\n );\n }\n this._storeOptionsAsProperties = !!storeAsProperties;\n return this;\n }\n\n /**\n * Retrieve option value.\n *\n * @param {string} key\n * @return {object} value\n */\n\n getOptionValue(key) {\n if (this._storeOptionsAsProperties) {\n return this[key];\n }\n return this._optionValues[key];\n }\n\n /**\n * Store option value.\n *\n * @param {string} key\n * @param {object} value\n * @return {Command} `this` command for chaining\n */\n\n setOptionValue(key, value) {\n return this.setOptionValueWithSource(key, value, undefined);\n }\n\n /**\n * Store option value and where the value came from.\n *\n * @param {string} key\n * @param {object} value\n * @param {string} source - expected values are default/config/env/cli/implied\n * @return {Command} `this` command for chaining\n */\n\n setOptionValueWithSource(key, value, source) {\n if (this._storeOptionsAsProperties) {\n this[key] = value;\n } else {\n this._optionValues[key] = value;\n }\n this._optionValueSources[key] = source;\n return this;\n }\n\n /**\n * Get source of option value.\n * Expected values are default | config | env | cli | implied\n *\n * @param {string} key\n * @return {string}\n */\n\n getOptionValueSource(key) {\n return this._optionValueSources[key];\n }\n\n /**\n * Get source of option value. See also .optsWithGlobals().\n * Expected values are default | config | env | cli | implied\n *\n * @param {string} key\n * @return {string}\n */\n\n getOptionValueSourceWithGlobals(key) {\n // global overwrites local, like optsWithGlobals\n let source;\n this._getCommandAndAncestors().forEach((cmd) => {\n if (cmd.getOptionValueSource(key) !== undefined) {\n source = cmd.getOptionValueSource(key);\n }\n });\n return source;\n }\n\n /**\n * Get user arguments from implied or explicit arguments.\n * Side-effects: set _scriptPath if args included script. Used for default program name, and subcommand searches.\n *\n * @private\n */\n\n _prepareUserArgs(argv, parseOptions) {\n if (argv !== undefined && !Array.isArray(argv)) {\n throw new Error('first parameter to parse must be array or undefined');\n }\n parseOptions = parseOptions || {};\n\n // auto-detect argument conventions if nothing supplied\n if (argv === undefined && parseOptions.from === undefined) {\n if (process.versions?.electron) {\n parseOptions.from = 'electron';\n }\n // check node specific options for scenarios where user CLI args follow executable without scriptname\n const execArgv = process.execArgv ?? [];\n if (\n execArgv.includes('-e') ||\n execArgv.includes('--eval') ||\n execArgv.includes('-p') ||\n execArgv.includes('--print')\n ) {\n parseOptions.from = 'eval'; // internal usage, not documented\n }\n }\n\n // default to using process.argv\n if (argv === undefined) {\n argv = process.argv;\n }\n this.rawArgs = argv.slice();\n\n // extract the user args and scriptPath\n let userArgs;\n switch (parseOptions.from) {\n case undefined:\n case 'node':\n this._scriptPath = argv[1];\n userArgs = argv.slice(2);\n break;\n case 'electron':\n // @ts-ignore: because defaultApp is an unknown property\n if (process.defaultApp) {\n this._scriptPath = argv[1];\n userArgs = argv.slice(2);\n } else {\n userArgs = argv.slice(1);\n }\n break;\n case 'user':\n userArgs = argv.slice(0);\n break;\n case 'eval':\n userArgs = argv.slice(1);\n break;\n default:\n throw new Error(\n `unexpected parse option { from: '${parseOptions.from}' }`,\n );\n }\n\n // Find default name for program from arguments.\n if (!this._name && this._scriptPath)\n this.nameFromFilename(this._scriptPath);\n this._name = this._name || 'program';\n\n return userArgs;\n }\n\n /**\n * Parse `argv`, setting options and invoking commands when defined.\n *\n * Use parseAsync instead of parse if any of your action handlers are async.\n *\n * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!\n *\n * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:\n * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that\n * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged\n * - `'user'`: just user arguments\n *\n * @example\n * program.parse(); // parse process.argv and auto-detect electron and special node flags\n * program.parse(process.argv); // assume argv[0] is app and argv[1] is script\n * program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]\n *\n * @param {string[]} [argv] - optional, defaults to process.argv\n * @param {object} [parseOptions] - optionally specify style of options with from: node/user/electron\n * @param {string} [parseOptions.from] - where the args are from: 'node', 'user', 'electron'\n * @return {Command} `this` command for chaining\n */\n\n parse(argv, parseOptions) {\n this._prepareForParse();\n const userArgs = this._prepareUserArgs(argv, parseOptions);\n this._parseCommand([], userArgs);\n\n return this;\n }\n\n /**\n * Parse `argv`, setting options and invoking commands when defined.\n *\n * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!\n *\n * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:\n * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that\n * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged\n * - `'user'`: just user arguments\n *\n * @example\n * await program.parseAsync(); // parse process.argv and auto-detect electron and special node flags\n * await program.parseAsync(process.argv); // assume argv[0] is app and argv[1] is script\n * await program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]\n *\n * @param {string[]} [argv]\n * @param {object} [parseOptions]\n * @param {string} parseOptions.from - where the args are from: 'node', 'user', 'electron'\n * @return {Promise}\n */\n\n async parseAsync(argv, parseOptions) {\n this._prepareForParse();\n const userArgs = this._prepareUserArgs(argv, parseOptions);\n await this._parseCommand([], userArgs);\n\n return this;\n }\n\n _prepareForParse() {\n // Save the state the first time, then restore the state before each subsequent parse.\n if (this._savedState === null) {\n // Do the special default of lone negated option to true, now that we have all the options.\n // Filter for negated options that have not been processed already.\n this.options\n .filter(\n (option) =>\n option.negate &&\n option.defaultValue === undefined &&\n this.getOptionValue(option.attributeName()) === undefined,\n )\n .forEach((option) => {\n // check for lone negated option: --no-foo without a --foo option\n const positiveLongFlag = option.long.replace(/^--no-/, '--');\n if (!this._findOption(positiveLongFlag)) {\n this.setOptionValueWithSource(\n option.attributeName(),\n true,\n 'default',\n );\n }\n });\n\n this.saveStateBeforeParse();\n } else {\n this.restoreStateBeforeParse();\n }\n }\n\n /**\n * Called the first time parse is called to save state and allow a restore before subsequent calls to parse.\n * Not usually called directly, but available for subclasses to save their custom state.\n *\n * This is called in a lazy way. Only commands used in parsing chain will have state saved.\n */\n saveStateBeforeParse() {\n this._savedState = {\n // name is stable if supplied by author, but may be unspecified for root command and deduced during parsing\n _name: this._name,\n // option values before parse have default values (including false for negated options)\n // shallow clones\n _optionValues: { ...this._optionValues },\n _optionValueSources: { ...this._optionValueSources },\n };\n }\n\n /**\n * Restore state before parse for calls after the first.\n * Not usually called directly, but available for subclasses to save their custom state.\n *\n * This is called in a lazy way. Only commands used in parsing chain will have state restored.\n */\n restoreStateBeforeParse() {\n if (this._storeOptionsAsProperties)\n throw new Error(`Can not call parse again when storeOptionsAsProperties is true.\n- either make a new Command for each call to parse, or stop storing options as properties`);\n\n // clear state from _prepareUserArgs\n this._name = this._savedState._name;\n this._scriptPath = null;\n this.rawArgs = [];\n // clear state from setOptionValueWithSource\n this._optionValues = { ...this._savedState._optionValues };\n this._optionValueSources = { ...this._savedState._optionValueSources };\n // clear state from _parseCommand\n this.args = [];\n // clear state from _processArguments\n this.processedArgs = [];\n }\n\n /**\n * Throw if expected executable is missing. Add lots of help for author.\n *\n * @param {string} executableFile\n * @param {string} executableDir\n * @param {string} subcommandName\n */\n _checkForMissingExecutable(executableFile, executableDir, subcommandName) {\n if (fs.existsSync(executableFile)) return;\n\n const executableDirMessage = executableDir\n ? `searched for local subcommand relative to directory '${executableDir}'`\n : 'no directory for search for local subcommand, use .executableDir() to supply a custom directory';\n const executableMissing = `'${executableFile}' does not exist\n - if '${subcommandName}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead\n - if the default executable name is not suitable, use the executableFile option to supply a custom name or path\n - ${executableDirMessage}`;\n throw new Error(executableMissing);\n }\n\n /**\n * Execute a sub-command executable.\n *\n * @private\n */\n\n _executeSubCommand(subcommand, args) {\n args = args.slice();\n const sourceExt = ['.js', '.ts', '.tsx', '.mjs', '.cjs'];\n\n function findFile(baseDir, baseName) {\n // Look for specified file\n const localBin = path.resolve(baseDir, baseName);\n if (fs.existsSync(localBin)) return localBin;\n\n // Stop looking if candidate already has an expected extension.\n if (sourceExt.includes(path.extname(baseName))) return undefined;\n\n // Try all the extensions.\n const foundExt = sourceExt.find((ext) =>\n fs.existsSync(`${localBin}${ext}`),\n );\n if (foundExt) return `${localBin}${foundExt}`;\n\n return undefined;\n }\n\n // Not checking for help first. Unlikely to have mandatory and executable, and can't robustly test for help flags in external command.\n this._checkForMissingMandatoryOptions();\n this._checkForConflictingOptions();\n\n // executableFile and executableDir might be full path, or just a name\n let executableFile =\n subcommand._executableFile || `${this._name}-${subcommand._name}`;\n let executableDir = this._executableDir || '';\n if (this._scriptPath) {\n let resolvedScriptPath; // resolve possible symlink for installed npm binary\n try {\n resolvedScriptPath = fs.realpathSync(this._scriptPath);\n } catch {\n resolvedScriptPath = this._scriptPath;\n }\n executableDir = path.resolve(\n path.dirname(resolvedScriptPath),\n executableDir,\n );\n }\n\n // Look for a local file in preference to a command in PATH.\n if (executableDir) {\n let localFile = findFile(executableDir, executableFile);\n\n // Legacy search using prefix of script name instead of command name\n if (!localFile && !subcommand._executableFile && this._scriptPath) {\n const legacyName = path.basename(\n this._scriptPath,\n path.extname(this._scriptPath),\n );\n if (legacyName !== this._name) {\n localFile = findFile(\n executableDir,\n `${legacyName}-${subcommand._name}`,\n );\n }\n }\n executableFile = localFile || executableFile;\n }\n\n const launchWithNode = sourceExt.includes(path.extname(executableFile));\n\n let proc;\n if (process.platform !== 'win32') {\n if (launchWithNode) {\n args.unshift(executableFile);\n // add executable arguments to spawn\n args = incrementNodeInspectorPort(process.execArgv).concat(args);\n\n proc = childProcess.spawn(process.argv[0], args, { stdio: 'inherit' });\n } else {\n proc = childProcess.spawn(executableFile, args, { stdio: 'inherit' });\n }\n } else {\n this._checkForMissingExecutable(\n executableFile,\n executableDir,\n subcommand._name,\n );\n args.unshift(executableFile);\n // add executable arguments to spawn\n args = incrementNodeInspectorPort(process.execArgv).concat(args);\n proc = childProcess.spawn(process.execPath, args, { stdio: 'inherit' });\n }\n\n if (!proc.killed) {\n // testing mainly to avoid leak warnings during unit tests with mocked spawn\n const signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];\n signals.forEach((signal) => {\n process.on(signal, () => {\n if (proc.killed === false && proc.exitCode === null) {\n // @ts-ignore because signals not typed to known strings\n proc.kill(signal);\n }\n });\n });\n }\n\n // By default terminate process when spawned process terminates.\n const exitCallback = this._exitCallback;\n proc.on('close', (code) => {\n code = code ?? 1; // code is null if spawned process terminated due to a signal\n if (!exitCallback) {\n process.exit(code);\n } else {\n exitCallback(\n new CommanderError(\n code,\n 'commander.executeSubCommandAsync',\n '(close)',\n ),\n );\n }\n });\n proc.on('error', (err) => {\n // @ts-ignore: because err.code is an unknown property\n if (err.code === 'ENOENT') {\n this._checkForMissingExecutable(\n executableFile,\n executableDir,\n subcommand._name,\n );\n // @ts-ignore: because err.code is an unknown property\n } else if (err.code === 'EACCES') {\n throw new Error(`'${executableFile}' not executable`);\n }\n if (!exitCallback) {\n process.exit(1);\n } else {\n const wrappedError = new CommanderError(\n 1,\n 'commander.executeSubCommandAsync',\n '(error)',\n );\n wrappedError.nestedError = err;\n exitCallback(wrappedError);\n }\n });\n\n // Store the reference to the child process\n this.runningCommand = proc;\n }\n\n /**\n * @private\n */\n\n _dispatchSubcommand(commandName, operands, unknown) {\n const subCommand = this._findCommand(commandName);\n if (!subCommand) this.help({ error: true });\n\n subCommand._prepareForParse();\n let promiseChain;\n promiseChain = this._chainOrCallSubCommandHook(\n promiseChain,\n subCommand,\n 'preSubcommand',\n );\n promiseChain = this._chainOrCall(promiseChain, () => {\n if (subCommand._executableHandler) {\n this._executeSubCommand(subCommand, operands.concat(unknown));\n } else {\n return subCommand._parseCommand(operands, unknown);\n }\n });\n return promiseChain;\n }\n\n /**\n * Invoke help directly if possible, or dispatch if necessary.\n * e.g. help foo\n *\n * @private\n */\n\n _dispatchHelpCommand(subcommandName) {\n if (!subcommandName) {\n this.help();\n }\n const subCommand = this._findCommand(subcommandName);\n if (subCommand && !subCommand._executableHandler) {\n subCommand.help();\n }\n\n // Fallback to parsing the help flag to invoke the help.\n return this._dispatchSubcommand(\n subcommandName,\n [],\n [this._getHelpOption()?.long ?? this._getHelpOption()?.short ?? '--help'],\n );\n }\n\n /**\n * Check this.args against expected this.registeredArguments.\n *\n * @private\n */\n\n _checkNumberOfArguments() {\n // too few\n this.registeredArguments.forEach((arg, i) => {\n if (arg.required && this.args[i] == null) {\n this.missingArgument(arg.name());\n }\n });\n // too many\n if (\n this.registeredArguments.length > 0 &&\n this.registeredArguments[this.registeredArguments.length - 1].variadic\n ) {\n return;\n }\n if (this.args.length > this.registeredArguments.length) {\n this._excessArguments(this.args);\n }\n }\n\n /**\n * Process this.args using this.registeredArguments and save as this.processedArgs!\n *\n * @private\n */\n\n _processArguments() {\n const myParseArg = (argument, value, previous) => {\n // Extra processing for nice error message on parsing failure.\n let parsedValue = value;\n if (value !== null && argument.parseArg) {\n const invalidValueMessage = `error: command-argument value '${value}' is invalid for argument '${argument.name()}'.`;\n parsedValue = this._callParseArg(\n argument,\n value,\n previous,\n invalidValueMessage,\n );\n }\n return parsedValue;\n };\n\n this._checkNumberOfArguments();\n\n const processedArgs = [];\n this.registeredArguments.forEach((declaredArg, index) => {\n let value = declaredArg.defaultValue;\n if (declaredArg.variadic) {\n // Collect together remaining arguments for passing together as an array.\n if (index < this.args.length) {\n value = this.args.slice(index);\n if (declaredArg.parseArg) {\n value = value.reduce((processed, v) => {\n return myParseArg(declaredArg, v, processed);\n }, declaredArg.defaultValue);\n }\n } else if (value === undefined) {\n value = [];\n }\n } else if (index < this.args.length) {\n value = this.args[index];\n if (declaredArg.parseArg) {\n value = myParseArg(declaredArg, value, declaredArg.defaultValue);\n }\n }\n processedArgs[index] = value;\n });\n this.processedArgs = processedArgs;\n }\n\n /**\n * Once we have a promise we chain, but call synchronously until then.\n *\n * @param {(Promise|undefined)} promise\n * @param {Function} fn\n * @return {(Promise|undefined)}\n * @private\n */\n\n _chainOrCall(promise, fn) {\n // thenable\n if (promise?.then && typeof promise.then === 'function') {\n // already have a promise, chain callback\n return promise.then(() => fn());\n }\n // callback might return a promise\n return fn();\n }\n\n /**\n *\n * @param {(Promise|undefined)} promise\n * @param {string} event\n * @return {(Promise|undefined)}\n * @private\n */\n\n _chainOrCallHooks(promise, event) {\n let result = promise;\n const hooks = [];\n this._getCommandAndAncestors()\n .reverse()\n .filter((cmd) => cmd._lifeCycleHooks[event] !== undefined)\n .forEach((hookedCommand) => {\n hookedCommand._lifeCycleHooks[event].forEach((callback) => {\n hooks.push({ hookedCommand, callback });\n });\n });\n if (event === 'postAction') {\n hooks.reverse();\n }\n\n hooks.forEach((hookDetail) => {\n result = this._chainOrCall(result, () => {\n return hookDetail.callback(hookDetail.hookedCommand, this);\n });\n });\n return result;\n }\n\n /**\n *\n * @param {(Promise|undefined)} promise\n * @param {Command} subCommand\n * @param {string} event\n * @return {(Promise|undefined)}\n * @private\n */\n\n _chainOrCallSubCommandHook(promise, subCommand, event) {\n let result = promise;\n if (this._lifeCycleHooks[event] !== undefined) {\n this._lifeCycleHooks[event].forEach((hook) => {\n result = this._chainOrCall(result, () => {\n return hook(this, subCommand);\n });\n });\n }\n return result;\n }\n\n /**\n * Process arguments in context of this command.\n * Returns action result, in case it is a promise.\n *\n * @private\n */\n\n _parseCommand(operands, unknown) {\n const parsed = this.parseOptions(unknown);\n this._parseOptionsEnv(); // after cli, so parseArg not called on both cli and env\n this._parseOptionsImplied();\n operands = operands.concat(parsed.operands);\n unknown = parsed.unknown;\n this.args = operands.concat(unknown);\n\n if (operands && this._findCommand(operands[0])) {\n return this._dispatchSubcommand(operands[0], operands.slice(1), unknown);\n }\n if (\n this._getHelpCommand() &&\n operands[0] === this._getHelpCommand().name()\n ) {\n return this._dispatchHelpCommand(operands[1]);\n }\n if (this._defaultCommandName) {\n this._outputHelpIfRequested(unknown); // Run the help for default command from parent rather than passing to default command\n return this._dispatchSubcommand(\n this._defaultCommandName,\n operands,\n unknown,\n );\n }\n if (\n this.commands.length &&\n this.args.length === 0 &&\n !this._actionHandler &&\n !this._defaultCommandName\n ) {\n // probably missing subcommand and no handler, user needs help (and exit)\n this.help({ error: true });\n }\n\n this._outputHelpIfRequested(parsed.unknown);\n this._checkForMissingMandatoryOptions();\n this._checkForConflictingOptions();\n\n // We do not always call this check to avoid masking a \"better\" error, like unknown command.\n const checkForUnknownOptions = () => {\n if (parsed.unknown.length > 0) {\n this.unknownOption(parsed.unknown[0]);\n }\n };\n\n const commandEvent = `command:${this.name()}`;\n if (this._actionHandler) {\n checkForUnknownOptions();\n this._processArguments();\n\n let promiseChain;\n promiseChain = this._chainOrCallHooks(promiseChain, 'preAction');\n promiseChain = this._chainOrCall(promiseChain, () =>\n this._actionHandler(this.processedArgs),\n );\n if (this.parent) {\n promiseChain = this._chainOrCall(promiseChain, () => {\n this.parent.emit(commandEvent, operands, unknown); // legacy\n });\n }\n promiseChain = this._chainOrCallHooks(promiseChain, 'postAction');\n return promiseChain;\n }\n if (this.parent?.listenerCount(commandEvent)) {\n checkForUnknownOptions();\n this._processArguments();\n this.parent.emit(commandEvent, operands, unknown); // legacy\n } else if (operands.length) {\n if (this._findCommand('*')) {\n // legacy default command\n return this._dispatchSubcommand('*', operands, unknown);\n }\n if (this.listenerCount('command:*')) {\n // skip option check, emit event for possible misspelling suggestion\n this.emit('command:*', operands, unknown);\n } else if (this.commands.length) {\n this.unknownCommand();\n } else {\n checkForUnknownOptions();\n this._processArguments();\n }\n } else if (this.commands.length) {\n checkForUnknownOptions();\n // This command has subcommands and nothing hooked up at this level, so display help (and exit).\n this.help({ error: true });\n } else {\n checkForUnknownOptions();\n this._processArguments();\n // fall through for caller to handle after calling .parse()\n }\n }\n\n /**\n * Find matching command.\n *\n * @private\n * @return {Command | undefined}\n */\n _findCommand(name) {\n if (!name) return undefined;\n return this.commands.find(\n (cmd) => cmd._name === name || cmd._aliases.includes(name),\n );\n }\n\n /**\n * Return an option matching `arg` if any.\n *\n * @param {string} arg\n * @return {Option}\n * @package\n */\n\n _findOption(arg) {\n return this.options.find((option) => option.is(arg));\n }\n\n /**\n * Display an error message if a mandatory option does not have a value.\n * Called after checking for help flags in leaf subcommand.\n *\n * @private\n */\n\n _checkForMissingMandatoryOptions() {\n // Walk up hierarchy so can call in subcommand after checking for displaying help.\n this._getCommandAndAncestors().forEach((cmd) => {\n cmd.options.forEach((anOption) => {\n if (\n anOption.mandatory &&\n cmd.getOptionValue(anOption.attributeName()) === undefined\n ) {\n cmd.missingMandatoryOptionValue(anOption);\n }\n });\n });\n }\n\n /**\n * Display an error message if conflicting options are used together in this.\n *\n * @private\n */\n _checkForConflictingLocalOptions() {\n const definedNonDefaultOptions = this.options.filter((option) => {\n const optionKey = option.attributeName();\n if (this.getOptionValue(optionKey) === undefined) {\n return false;\n }\n return this.getOptionValueSource(optionKey) !== 'default';\n });\n\n const optionsWithConflicting = definedNonDefaultOptions.filter(\n (option) => option.conflictsWith.length > 0,\n );\n\n optionsWithConflicting.forEach((option) => {\n const conflictingAndDefined = definedNonDefaultOptions.find((defined) =>\n option.conflictsWith.includes(defined.attributeName()),\n );\n if (conflictingAndDefined) {\n this._conflictingOption(option, conflictingAndDefined);\n }\n });\n }\n\n /**\n * Display an error message if conflicting options are used together.\n * Called after checking for help flags in leaf subcommand.\n *\n * @private\n */\n _checkForConflictingOptions() {\n // Walk up hierarchy so can call in subcommand after checking for displaying help.\n this._getCommandAndAncestors().forEach((cmd) => {\n cmd._checkForConflictingLocalOptions();\n });\n }\n\n /**\n * Parse options from `argv` removing known options,\n * and return argv split into operands and unknown arguments.\n *\n * Side effects: modifies command by storing options. Does not reset state if called again.\n *\n * Examples:\n *\n * argv => operands, unknown\n * --known kkk op => [op], []\n * op --known kkk => [op], []\n * sub --unknown uuu op => [sub], [--unknown uuu op]\n * sub -- --unknown uuu op => [sub --unknown uuu op], []\n *\n * @param {string[]} args\n * @return {{operands: string[], unknown: string[]}}\n */\n\n parseOptions(args) {\n const operands = []; // operands, not options or values\n const unknown = []; // first unknown option and remaining unknown args\n let dest = operands;\n\n function maybeOption(arg) {\n return arg.length > 1 && arg[0] === '-';\n }\n\n const negativeNumberArg = (arg) => {\n // return false if not a negative number\n if (!/^-(\\d+|\\d*\\.\\d+)(e[+-]?\\d+)?$/.test(arg)) return false;\n // negative number is ok unless digit used as an option in command hierarchy\n return !this._getCommandAndAncestors().some((cmd) =>\n cmd.options\n .map((opt) => opt.short)\n .some((short) => /^-\\d$/.test(short)),\n );\n };\n\n // parse options\n let activeVariadicOption = null;\n let activeGroup = null; // working through group of short options, like -abc\n let i = 0;\n while (i < args.length || activeGroup) {\n const arg = activeGroup ?? args[i++];\n activeGroup = null;\n\n // literal\n if (arg === '--') {\n if (dest === unknown) dest.push(arg);\n dest.push(...args.slice(i));\n break;\n }\n\n if (\n activeVariadicOption &&\n (!maybeOption(arg) || negativeNumberArg(arg))\n ) {\n this.emit(`option:${activeVariadicOption.name()}`, arg);\n continue;\n }\n activeVariadicOption = null;\n\n if (maybeOption(arg)) {\n const option = this._findOption(arg);\n // recognised option, call listener to assign value with possible custom processing\n if (option) {\n if (option.required) {\n const value = args[i++];\n if (value === undefined) this.optionMissingArgument(option);\n this.emit(`option:${option.name()}`, value);\n } else if (option.optional) {\n let value = null;\n // historical behaviour is optional value is following arg unless an option\n if (\n i < args.length &&\n (!maybeOption(args[i]) || negativeNumberArg(args[i]))\n ) {\n value = args[i++];\n }\n this.emit(`option:${option.name()}`, value);\n } else {\n // boolean flag\n this.emit(`option:${option.name()}`);\n }\n activeVariadicOption = option.variadic ? option : null;\n continue;\n }\n }\n\n // Look for combo options following single dash, eat first one if known.\n if (arg.length > 2 && arg[0] === '-' && arg[1] !== '-') {\n const option = this._findOption(`-${arg[1]}`);\n if (option) {\n if (\n option.required ||\n (option.optional && this._combineFlagAndOptionalValue)\n ) {\n // option with value following in same argument\n this.emit(`option:${option.name()}`, arg.slice(2));\n } else {\n // boolean option\n this.emit(`option:${option.name()}`);\n // remove the processed option and keep processing group\n activeGroup = `-${arg.slice(2)}`;\n }\n continue;\n }\n }\n\n // Look for known long flag with value, like --foo=bar\n if (/^--[^=]+=/.test(arg)) {\n const index = arg.indexOf('=');\n const option = this._findOption(arg.slice(0, index));\n if (option && (option.required || option.optional)) {\n this.emit(`option:${option.name()}`, arg.slice(index + 1));\n continue;\n }\n }\n\n // Not a recognised option by this command.\n // Might be a command-argument, or subcommand option, or unknown option, or help command or option.\n\n // An unknown option means further arguments also classified as unknown so can be reprocessed by subcommands.\n // A negative number in a leaf command is not an unknown option.\n if (\n dest === operands &&\n maybeOption(arg) &&\n !(this.commands.length === 0 && negativeNumberArg(arg))\n ) {\n dest = unknown;\n }\n\n // If using positionalOptions, stop processing our options at subcommand.\n if (\n (this._enablePositionalOptions || this._passThroughOptions) &&\n operands.length === 0 &&\n unknown.length === 0\n ) {\n if (this._findCommand(arg)) {\n operands.push(arg);\n unknown.push(...args.slice(i));\n break;\n } else if (\n this._getHelpCommand() &&\n arg === this._getHelpCommand().name()\n ) {\n operands.push(arg, ...args.slice(i));\n break;\n } else if (this._defaultCommandName) {\n unknown.push(arg, ...args.slice(i));\n break;\n }\n }\n\n // If using passThroughOptions, stop processing options at first command-argument.\n if (this._passThroughOptions) {\n dest.push(arg, ...args.slice(i));\n break;\n }\n\n // add arg\n dest.push(arg);\n }\n\n return { operands, unknown };\n }\n\n /**\n * Return an object containing local option values as key-value pairs.\n *\n * @return {object}\n */\n opts() {\n if (this._storeOptionsAsProperties) {\n // Preserve original behaviour so backwards compatible when still using properties\n const result = {};\n const len = this.options.length;\n\n for (let i = 0; i < len; i++) {\n const key = this.options[i].attributeName();\n result[key] =\n key === this._versionOptionName ? this._version : this[key];\n }\n return result;\n }\n\n return this._optionValues;\n }\n\n /**\n * Return an object containing merged local and global option values as key-value pairs.\n *\n * @return {object}\n */\n optsWithGlobals() {\n // globals overwrite locals\n return this._getCommandAndAncestors().reduce(\n (combinedOptions, cmd) => Object.assign(combinedOptions, cmd.opts()),\n {},\n );\n }\n\n /**\n * Display error message and exit (or call exitOverride).\n *\n * @param {string} message\n * @param {object} [errorOptions]\n * @param {string} [errorOptions.code] - an id string representing the error\n * @param {number} [errorOptions.exitCode] - used with process.exit\n */\n error(message, errorOptions) {\n // output handling\n this._outputConfiguration.outputError(\n `${message}\\n`,\n this._outputConfiguration.writeErr,\n );\n if (typeof this._showHelpAfterError === 'string') {\n this._outputConfiguration.writeErr(`${this._showHelpAfterError}\\n`);\n } else if (this._showHelpAfterError) {\n this._outputConfiguration.writeErr('\\n');\n this.outputHelp({ error: true });\n }\n\n // exit handling\n const config = errorOptions || {};\n const exitCode = config.exitCode || 1;\n const code = config.code || 'commander.error';\n this._exit(exitCode, code, message);\n }\n\n /**\n * Apply any option related environment variables, if option does\n * not have a value from cli or client code.\n *\n * @private\n */\n _parseOptionsEnv() {\n this.options.forEach((option) => {\n if (option.envVar && option.envVar in process.env) {\n const optionKey = option.attributeName();\n // Priority check. Do not overwrite cli or options from unknown source (client-code).\n if (\n this.getOptionValue(optionKey) === undefined ||\n ['default', 'config', 'env'].includes(\n this.getOptionValueSource(optionKey),\n )\n ) {\n if (option.required || option.optional) {\n // option can take a value\n // keep very simple, optional always takes value\n this.emit(`optionEnv:${option.name()}`, process.env[option.envVar]);\n } else {\n // boolean\n // keep very simple, only care that envVar defined and not the value\n this.emit(`optionEnv:${option.name()}`);\n }\n }\n }\n });\n }\n\n /**\n * Apply any implied option values, if option is undefined or default value.\n *\n * @private\n */\n _parseOptionsImplied() {\n const dualHelper = new DualOptions(this.options);\n const hasCustomOptionValue = (optionKey) => {\n return (\n this.getOptionValue(optionKey) !== undefined &&\n !['default', 'implied'].includes(this.getOptionValueSource(optionKey))\n );\n };\n this.options\n .filter(\n (option) =>\n option.implied !== undefined &&\n hasCustomOptionValue(option.attributeName()) &&\n dualHelper.valueFromOption(\n this.getOptionValue(option.attributeName()),\n option,\n ),\n )\n .forEach((option) => {\n Object.keys(option.implied)\n .filter((impliedKey) => !hasCustomOptionValue(impliedKey))\n .forEach((impliedKey) => {\n this.setOptionValueWithSource(\n impliedKey,\n option.implied[impliedKey],\n 'implied',\n );\n });\n });\n }\n\n /**\n * Argument `name` is missing.\n *\n * @param {string} name\n * @private\n */\n\n missingArgument(name) {\n const message = `error: missing required argument '${name}'`;\n this.error(message, { code: 'commander.missingArgument' });\n }\n\n /**\n * `Option` is missing an argument.\n *\n * @param {Option} option\n * @private\n */\n\n optionMissingArgument(option) {\n const message = `error: option '${option.flags}' argument missing`;\n this.error(message, { code: 'commander.optionMissingArgument' });\n }\n\n /**\n * `Option` does not have a value, and is a mandatory option.\n *\n * @param {Option} option\n * @private\n */\n\n missingMandatoryOptionValue(option) {\n const message = `error: required option '${option.flags}' not specified`;\n this.error(message, { code: 'commander.missingMandatoryOptionValue' });\n }\n\n /**\n * `Option` conflicts with another option.\n *\n * @param {Option} option\n * @param {Option} conflictingOption\n * @private\n */\n _conflictingOption(option, conflictingOption) {\n // The calling code does not know whether a negated option is the source of the\n // value, so do some work to take an educated guess.\n const findBestOptionFromValue = (option) => {\n const optionKey = option.attributeName();\n const optionValue = this.getOptionValue(optionKey);\n const negativeOption = this.options.find(\n (target) => target.negate && optionKey === target.attributeName(),\n );\n const positiveOption = this.options.find(\n (target) => !target.negate && optionKey === target.attributeName(),\n );\n if (\n negativeOption &&\n ((negativeOption.presetArg === undefined && optionValue === false) ||\n (negativeOption.presetArg !== undefined &&\n optionValue === negativeOption.presetArg))\n ) {\n return negativeOption;\n }\n return positiveOption || option;\n };\n\n const getErrorMessage = (option) => {\n const bestOption = findBestOptionFromValue(option);\n const optionKey = bestOption.attributeName();\n const source = this.getOptionValueSource(optionKey);\n if (source === 'env') {\n return `environment variable '${bestOption.envVar}'`;\n }\n return `option '${bestOption.flags}'`;\n };\n\n const message = `error: ${getErrorMessage(option)} cannot be used with ${getErrorMessage(conflictingOption)}`;\n this.error(message, { code: 'commander.conflictingOption' });\n }\n\n /**\n * Unknown option `flag`.\n *\n * @param {string} flag\n * @private\n */\n\n unknownOption(flag) {\n if (this._allowUnknownOption) return;\n let suggestion = '';\n\n if (flag.startsWith('--') && this._showSuggestionAfterError) {\n // Looping to pick up the global options too\n let candidateFlags = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let command = this;\n do {\n const moreFlags = command\n .createHelp()\n .visibleOptions(command)\n .filter((option) => option.long)\n .map((option) => option.long);\n candidateFlags = candidateFlags.concat(moreFlags);\n command = command.parent;\n } while (command && !command._enablePositionalOptions);\n suggestion = suggestSimilar(flag, candidateFlags);\n }\n\n const message = `error: unknown option '${flag}'${suggestion}`;\n this.error(message, { code: 'commander.unknownOption' });\n }\n\n /**\n * Excess arguments, more than expected.\n *\n * @param {string[]} receivedArgs\n * @private\n */\n\n _excessArguments(receivedArgs) {\n if (this._allowExcessArguments) return;\n\n const expected = this.registeredArguments.length;\n const s = expected === 1 ? '' : 's';\n const received = receivedArgs.length;\n const forSubcommand = this.parent ? ` for '${this.name()}'` : '';\n const details = receivedArgs.join(', ');\n const message = `error: too many arguments${forSubcommand}. Expected ${expected} argument${s} but got ${received}: ${details}.`;\n this.error(message, { code: 'commander.excessArguments' });\n }\n\n /**\n * Unknown command.\n *\n * @private\n */\n\n unknownCommand() {\n const unknownName = this.args[0];\n let suggestion = '';\n\n if (this._showSuggestionAfterError) {\n const candidateNames = [];\n this.createHelp()\n .visibleCommands(this)\n .forEach((command) => {\n candidateNames.push(command.name());\n // just visible alias\n if (command.alias()) candidateNames.push(command.alias());\n });\n suggestion = suggestSimilar(unknownName, candidateNames);\n }\n\n const message = `error: unknown command '${unknownName}'${suggestion}`;\n this.error(message, { code: 'commander.unknownCommand' });\n }\n\n /**\n * Get or set the program version.\n *\n * This method auto-registers the \"-V, --version\" option which will print the version number.\n *\n * You can optionally supply the flags and description to override the defaults.\n *\n * @param {string} [str]\n * @param {string} [flags]\n * @param {string} [description]\n * @return {(this | string | undefined)} `this` command for chaining, or version string if no arguments\n */\n\n version(str, flags, description) {\n if (str === undefined) return this._version;\n this._version = str;\n flags = flags || '-V, --version';\n description = description || 'output the version number';\n const versionOption = this.createOption(flags, description);\n this._versionOptionName = versionOption.attributeName();\n this._registerOption(versionOption);\n\n this.on('option:' + versionOption.name(), () => {\n this._outputConfiguration.writeOut(`${str}\\n`);\n this._exit(0, 'commander.version', str);\n });\n return this;\n }\n\n /**\n * Set the description.\n *\n * @param {string} [str]\n * @param {object} [argsDescription]\n * @return {(string|Command)}\n */\n description(str, argsDescription) {\n if (str === undefined && argsDescription === undefined)\n return this._description;\n this._description = str;\n if (argsDescription) {\n this._argsDescription = argsDescription;\n }\n return this;\n }\n\n /**\n * Set the summary. Used when listed as subcommand of parent.\n *\n * @param {string} [str]\n * @return {(string|Command)}\n */\n summary(str) {\n if (str === undefined) return this._summary;\n this._summary = str;\n return this;\n }\n\n /**\n * Set an alias for the command.\n *\n * You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help.\n *\n * @param {string} [alias]\n * @return {(string|Command)}\n */\n\n alias(alias) {\n if (alias === undefined) return this._aliases[0]; // just return first, for backwards compatibility\n\n /** @type {Command} */\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let command = this;\n if (\n this.commands.length !== 0 &&\n this.commands[this.commands.length - 1]._executableHandler\n ) {\n // assume adding alias for last added executable subcommand, rather than this\n command = this.commands[this.commands.length - 1];\n }\n\n if (alias === command._name)\n throw new Error(\"Command alias can't be the same as its name\");\n const matchingCommand = this.parent?._findCommand(alias);\n if (matchingCommand) {\n // c.f. _registerCommand\n const existingCmd = [matchingCommand.name()]\n .concat(matchingCommand.aliases())\n .join('|');\n throw new Error(\n `cannot add alias '${alias}' to command '${this.name()}' as already have command '${existingCmd}'`,\n );\n }\n\n command._aliases.push(alias);\n return this;\n }\n\n /**\n * Set aliases for the command.\n *\n * Only the first alias is shown in the auto-generated help.\n *\n * @param {string[]} [aliases]\n * @return {(string[]|Command)}\n */\n\n aliases(aliases) {\n // Getter for the array of aliases is the main reason for having aliases() in addition to alias().\n if (aliases === undefined) return this._aliases;\n\n aliases.forEach((alias) => this.alias(alias));\n return this;\n }\n\n /**\n * Set / get the command usage `str`.\n *\n * @param {string} [str]\n * @return {(string|Command)}\n */\n\n usage(str) {\n if (str === undefined) {\n if (this._usage) return this._usage;\n\n const args = this.registeredArguments.map((arg) => {\n return humanReadableArgName(arg);\n });\n return []\n .concat(\n this.options.length || this._helpOption !== null ? '[options]' : [],\n this.commands.length ? '[command]' : [],\n this.registeredArguments.length ? args : [],\n )\n .join(' ');\n }\n\n this._usage = str;\n return this;\n }\n\n /**\n * Get or set the name of the command.\n *\n * @param {string} [str]\n * @return {(string|Command)}\n */\n\n name(str) {\n if (str === undefined) return this._name;\n this._name = str;\n return this;\n }\n\n /**\n * Set/get the help group heading for this subcommand in parent command's help.\n *\n * @param {string} [heading]\n * @return {Command | string}\n */\n\n helpGroup(heading) {\n if (heading === undefined) return this._helpGroupHeading ?? '';\n this._helpGroupHeading = heading;\n return this;\n }\n\n /**\n * Set/get the default help group heading for subcommands added to this command.\n * (This does not override a group set directly on the subcommand using .helpGroup().)\n *\n * @example\n * program.commandsGroup('Development Commands:);\n * program.command('watch')...\n * program.command('lint')...\n * ...\n *\n * @param {string} [heading]\n * @returns {Command | string}\n */\n commandsGroup(heading) {\n if (heading === undefined) return this._defaultCommandGroup ?? '';\n this._defaultCommandGroup = heading;\n return this;\n }\n\n /**\n * Set/get the default help group heading for options added to this command.\n * (This does not override a group set directly on the option using .helpGroup().)\n *\n * @example\n * program\n * .optionsGroup('Development Options:')\n * .option('-d, --debug', 'output extra debugging')\n * .option('-p, --profile', 'output profiling information')\n *\n * @param {string} [heading]\n * @returns {Command | string}\n */\n optionsGroup(heading) {\n if (heading === undefined) return this._defaultOptionGroup ?? '';\n this._defaultOptionGroup = heading;\n return this;\n }\n\n /**\n * @param {Option} option\n * @private\n */\n _initOptionGroup(option) {\n if (this._defaultOptionGroup && !option.helpGroupHeading)\n option.helpGroup(this._defaultOptionGroup);\n }\n\n /**\n * @param {Command} cmd\n * @private\n */\n _initCommandGroup(cmd) {\n if (this._defaultCommandGroup && !cmd.helpGroup())\n cmd.helpGroup(this._defaultCommandGroup);\n }\n\n /**\n * Set the name of the command from script filename, such as process.argv[1],\n * or import.meta.filename.\n *\n * (Used internally and public although not documented in README.)\n *\n * @example\n * program.nameFromFilename(import.meta.filename);\n *\n * @param {string} filename\n * @return {Command}\n */\n\n nameFromFilename(filename) {\n this._name = path.basename(filename, path.extname(filename));\n\n return this;\n }\n\n /**\n * Get or set the directory for searching for executable subcommands of this command.\n *\n * @example\n * program.executableDir(import.meta.dirname);\n * // or\n * program.executableDir('subcommands');\n *\n * @param {string} [path]\n * @return {(string|null|Command)}\n */\n\n executableDir(path) {\n if (path === undefined) return this._executableDir;\n this._executableDir = path;\n return this;\n }\n\n /**\n * Return program help documentation.\n *\n * @param {{ error: boolean }} [contextOptions] - pass {error:true} to wrap for stderr instead of stdout\n * @return {string}\n */\n\n helpInformation(contextOptions) {\n const helper = this.createHelp();\n const context = this._getOutputContext(contextOptions);\n helper.prepareContext({\n error: context.error,\n helpWidth: context.helpWidth,\n outputHasColors: context.hasColors,\n });\n const text = helper.formatHelp(this, helper);\n if (context.hasColors) return text;\n return this._outputConfiguration.stripColor(text);\n }\n\n /**\n * @typedef HelpContext\n * @type {object}\n * @property {boolean} error\n * @property {number} helpWidth\n * @property {boolean} hasColors\n * @property {function} write - includes stripColor if needed\n *\n * @returns {HelpContext}\n * @private\n */\n\n _getOutputContext(contextOptions) {\n contextOptions = contextOptions || {};\n const error = !!contextOptions.error;\n let baseWrite;\n let hasColors;\n let helpWidth;\n if (error) {\n baseWrite = (str) => this._outputConfiguration.writeErr(str);\n hasColors = this._outputConfiguration.getErrHasColors();\n helpWidth = this._outputConfiguration.getErrHelpWidth();\n } else {\n baseWrite = (str) => this._outputConfiguration.writeOut(str);\n hasColors = this._outputConfiguration.getOutHasColors();\n helpWidth = this._outputConfiguration.getOutHelpWidth();\n }\n const write = (str) => {\n if (!hasColors) str = this._outputConfiguration.stripColor(str);\n return baseWrite(str);\n };\n return { error, write, hasColors, helpWidth };\n }\n\n /**\n * Output help information for this command.\n *\n * Outputs built-in help, and custom text added using `.addHelpText()`.\n *\n * @param {{ error: boolean } | Function} [contextOptions] - pass {error:true} to write to stderr instead of stdout\n */\n\n outputHelp(contextOptions) {\n let deprecatedCallback;\n if (typeof contextOptions === 'function') {\n deprecatedCallback = contextOptions;\n contextOptions = undefined;\n }\n\n const outputContext = this._getOutputContext(contextOptions);\n /** @type {HelpTextEventContext} */\n const eventContext = {\n error: outputContext.error,\n write: outputContext.write,\n command: this,\n };\n\n this._getCommandAndAncestors()\n .reverse()\n .forEach((command) => command.emit('beforeAllHelp', eventContext));\n this.emit('beforeHelp', eventContext);\n\n let helpInformation = this.helpInformation({ error: outputContext.error });\n if (deprecatedCallback) {\n helpInformation = deprecatedCallback(helpInformation);\n if (\n typeof helpInformation !== 'string' &&\n !Buffer.isBuffer(helpInformation)\n ) {\n throw new Error('outputHelp callback must return a string or a Buffer');\n }\n }\n outputContext.write(helpInformation);\n\n if (this._getHelpOption()?.long) {\n this.emit(this._getHelpOption().long); // deprecated\n }\n this.emit('afterHelp', eventContext);\n this._getCommandAndAncestors().forEach((command) =>\n command.emit('afterAllHelp', eventContext),\n );\n }\n\n /**\n * You can pass in flags and a description to customise the built-in help option.\n * Pass in false to disable the built-in help option.\n *\n * @example\n * program.helpOption('-?, --help' 'show help'); // customise\n * program.helpOption(false); // disable\n *\n * @param {(string | boolean)} flags\n * @param {string} [description]\n * @return {Command} `this` command for chaining\n */\n\n helpOption(flags, description) {\n // Support enabling/disabling built-in help option.\n if (typeof flags === 'boolean') {\n if (flags) {\n if (this._helpOption === null) this._helpOption = undefined; // reenable\n if (this._defaultOptionGroup) {\n // make the option to store the group\n this._initOptionGroup(this._getHelpOption());\n }\n } else {\n this._helpOption = null; // disable\n }\n return this;\n }\n\n // Customise flags and description.\n this._helpOption = this.createOption(\n flags ?? '-h, --help',\n description ?? 'display help for command',\n );\n // init group unless lazy create\n if (flags || description) this._initOptionGroup(this._helpOption);\n\n return this;\n }\n\n /**\n * Lazy create help option.\n * Returns null if has been disabled with .helpOption(false).\n *\n * @returns {(Option | null)} the help option\n * @package\n */\n _getHelpOption() {\n // Lazy create help option on demand.\n if (this._helpOption === undefined) {\n this.helpOption(undefined, undefined);\n }\n return this._helpOption;\n }\n\n /**\n * Supply your own option to use for the built-in help option.\n * This is an alternative to using helpOption() to customise the flags and description etc.\n *\n * @param {Option} option\n * @return {Command} `this` command for chaining\n */\n addHelpOption(option) {\n this._helpOption = option;\n this._initOptionGroup(option);\n return this;\n }\n\n /**\n * Output help information and exit.\n *\n * Outputs built-in help, and custom text added using `.addHelpText()`.\n *\n * @param {{ error: boolean }} [contextOptions] - pass {error:true} to write to stderr instead of stdout\n */\n\n help(contextOptions) {\n this.outputHelp(contextOptions);\n let exitCode = Number(process.exitCode ?? 0); // process.exitCode does allow a string or an integer, but we prefer just a number\n if (\n exitCode === 0 &&\n contextOptions &&\n typeof contextOptions !== 'function' &&\n contextOptions.error\n ) {\n exitCode = 1;\n }\n // message: do not have all displayed text available so only passing placeholder.\n this._exit(exitCode, 'commander.help', '(outputHelp)');\n }\n\n /**\n * // Do a little typing to coordinate emit and listener for the help text events.\n * @typedef HelpTextEventContext\n * @type {object}\n * @property {boolean} error\n * @property {Command} command\n * @property {function} write\n */\n\n /**\n * Add additional text to be displayed with the built-in help.\n *\n * Position is 'before' or 'after' to affect just this command,\n * and 'beforeAll' or 'afterAll' to affect this command and all its subcommands.\n *\n * @param {string} position - before or after built-in help\n * @param {(string | Function)} text - string to add, or a function returning a string\n * @return {Command} `this` command for chaining\n */\n\n addHelpText(position, text) {\n const allowedValues = ['beforeAll', 'before', 'after', 'afterAll'];\n if (!allowedValues.includes(position)) {\n throw new Error(`Unexpected value for position to addHelpText.\nExpecting one of '${allowedValues.join(\"', '\")}'`);\n }\n\n const helpEvent = `${position}Help`;\n this.on(helpEvent, (/** @type {HelpTextEventContext} */ context) => {\n let helpStr;\n if (typeof text === 'function') {\n helpStr = text({ error: context.error, command: context.command });\n } else {\n helpStr = text;\n }\n // Ignore falsy value when nothing to output.\n if (helpStr) {\n context.write(`${helpStr}\\n`);\n }\n });\n return this;\n }\n\n /**\n * Output help information if help flags specified\n *\n * @param {Array} args - array of options to search for help flags\n * @private\n */\n\n _outputHelpIfRequested(args) {\n const helpOption = this._getHelpOption();\n const helpRequested = helpOption && args.find((arg) => helpOption.is(arg));\n if (helpRequested) {\n this.outputHelp();\n // (Do not have all displayed text available so only passing placeholder.)\n this._exit(0, 'commander.helpDisplayed', '(outputHelp)');\n }\n }\n}\n\n/**\n * Scan arguments and increment port number for inspect calls (to avoid conflicts when spawning new command).\n *\n * @param {string[]} args - array of arguments from node.execArgv\n * @returns {string[]}\n * @private\n */\n\nfunction incrementNodeInspectorPort(args) {\n // Testing for these options:\n // --inspect[=[host:]port]\n // --inspect-brk[=[host:]port]\n // --inspect-port=[host:]port\n return args.map((arg) => {\n if (!arg.startsWith('--inspect')) {\n return arg;\n }\n let debugOption;\n let debugHost = '127.0.0.1';\n let debugPort = '9229';\n let match;\n if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) {\n // e.g. --inspect\n debugOption = match[1];\n } else if (\n (match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null\n ) {\n debugOption = match[1];\n if (/^\\d+$/.test(match[3])) {\n // e.g. --inspect=1234\n debugPort = match[3];\n } else {\n // e.g. --inspect=localhost\n debugHost = match[3];\n }\n } else if (\n (match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\\d+)$/)) !== null\n ) {\n // e.g. --inspect=localhost:1234\n debugOption = match[1];\n debugHost = match[3];\n debugPort = match[4];\n }\n\n if (debugOption && debugPort !== '0') {\n return `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`;\n }\n return arg;\n });\n}\n\n/**\n * Exported for using from tests, not otherwise used outside this file.\n *\n * @returns {boolean | undefined}\n * @package\n */\nexport function useColor() {\n // Test for common conventions.\n // NB: the observed behaviour is in combination with how author adds color! For example:\n // - we do not test NODE_DISABLE_COLORS, but util:styletext does\n // - we do test NO_COLOR, but Chalk does not\n //\n // References:\n // https://no-color.org\n // https://bixense.com/clicolors/\n // https://github.com/nodejs/node/blob/0a00217a5f67ef4a22384cfc80eb6dd9a917fdc1/lib/internal/tty.js#L109\n // https://github.com/chalk/supports-color/blob/c214314a14bcb174b12b3014b2b0a8de375029ae/index.js#L33\n // (https://force-color.org recent web page from 2023, does not match major javascript implementations)\n\n if (\n process.env.NO_COLOR ||\n process.env.FORCE_COLOR === '0' ||\n process.env.FORCE_COLOR === 'false'\n )\n return false;\n if (process.env.FORCE_COLOR || process.env.CLICOLOR_FORCE !== undefined)\n return true;\n return undefined;\n}\n","import { Argument } from './lib/argument.js';\nimport { Command } from './lib/command.js';\nimport { CommanderError, InvalidArgumentError } from './lib/error.js';\nimport { Help } from './lib/help.js';\nimport { Option } from './lib/option.js';\n\nexport const program = new Command();\n\nexport const createCommand = (name) => new Command(name);\nexport const createOption = (flags, description) =>\n new Option(flags, description);\nexport const createArgument = (name, description) =>\n new Argument(name, description);\n\n/**\n * Expose classes\n */\n\nexport { Command, Option, Argument, Help };\nexport { CommanderError, InvalidArgumentError };\nexport { InvalidArgumentError as InvalidOptionArgumentError }; // Deprecated\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { systemPaths } from \"./paths.js\";\nimport { logger } from \"./logger.js\";\nimport { writeAtomicFileSync } from \"./lock.js\";\n\nexport interface AnnotationsDate {\n year: number;\n month: number;\n day: number;\n}\n\nexport interface AnnotationsMetadata {\n commitId: string;\n lastChecked: string;\n date: AnnotationsDate;\n}\n\nexport const ANNOTATIONS_FILENAME = \"annotations.lua\";\nexport const METADATA_FILENAME = \"metadata.json\";\nexport const MIN_ANNOTATIONS_SIZE_BYTES = 1000;\nexport const MAX_ANNOTATIONS_SIZE_BYTES = 10 * 1024 * 1024;\nexport const MAX_COMMIT_JSON_SIZE_BYTES = 1024 * 1024;\n\n/** Returns current date string formatted as YYYY-MM-DD alongside a date components object. */\nexport function getTodayDateString(d: Date = new Date()): {\n dateStr: string;\n dateObj: AnnotationsDate;\n} {\n const year = d.getFullYear();\n const month = d.getMonth() + 1;\n const day = d.getDate();\n const dateStr = `${year}-${String(month).padStart(2, \"0\")}-${String(day).padStart(2, \"0\")}`;\n return { dateStr, dateObj: { year, month, day } };\n}\n\n/** Returns the system cache directory used for nanos world annotations. */\nexport function getAnnotationsCacheDir(): string {\n return path.join(systemPaths.cache, \"annotations\");\n}\n\n/** Returns the full path to the cached annotations.lua file. */\nexport function getCachedAnnotationsFilePath(): string {\n return path.join(getAnnotationsCacheDir(), ANNOTATIONS_FILENAME);\n}\n\n/** Returns the full path to the annotations metadata.json file. */\nexport function getAnnotationsMetadataFilePath(): string {\n return path.join(getAnnotationsCacheDir(), METADATA_FILENAME);\n}\n\n/** Reads and parses annotations metadata.json, purging corrupt files automatically. */\nexport function readAnnotationsMetadata(\n cacheDir: string = getAnnotationsCacheDir(),\n): AnnotationsMetadata | null {\n const metaPath = path.join(cacheDir, \"metadata.json\");\n if (!fs.existsSync(metaPath)) return null;\n\n const purge = (reason: string) => {\n try {\n fs.unlinkSync(metaPath);\n logger.warn(`[annotations] ${reason} annotations metadata at ${metaPath} purged.`);\n } catch (err) {\n logger.debug(\n `[annotations] Failed to unlink metadata: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n };\n\n try {\n const parsed = JSON.parse(fs.readFileSync(metaPath, \"utf-8\")) as AnnotationsMetadata;\n if (typeof parsed?.commitId === \"string\" && typeof parsed?.lastChecked === \"string\") {\n return parsed;\n }\n purge(\"Stale or invalid\");\n } catch (err) {\n logger.debug(\n `Failed to parse annotations metadata: ${err instanceof Error ? err.message : String(err)}`,\n );\n purge(\"Corrupted\");\n }\n return null;\n}\n\n/** Verifies that an annotations file exists, is non-trivial in size, and contains valid header. */\nexport function isAnnotationsValid(filePath: string): boolean {\n if (!fs.existsSync(filePath)) return false;\n try {\n const stat = fs.statSync(filePath);\n if (!stat.isFile() || stat.size < MIN_ANNOTATIONS_SIZE_BYTES) return false;\n const fd = fs.openSync(filePath, \"r\");\n try {\n const buffer = Buffer.alloc(512);\n const bytesRead = fs.readSync(fd, buffer, 0, buffer.length, 0);\n const header = buffer.toString(\"utf-8\", 0, bytesRead).trimStart();\n return (\n header.startsWith(\"---@meta\") ||\n header.includes(\"nanos world\") ||\n header.includes(\"nanos-world\")\n );\n } finally {\n fs.closeSync(fd);\n }\n } catch (err) {\n logger.debug(\n `[annotations] Annotation validation failed for ${filePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n return false;\n }\n}\n\n/** Updates metadata lastChecked date atomically without modifying annotations.lua. */\nexport function updateLastCheckedDate(\n commitId: string,\n cacheDir: string = getAnnotationsCacheDir(),\n): AnnotationsMetadata {\n const { dateStr, dateObj } = getTodayDateString();\n const metadata: AnnotationsMetadata = { commitId, lastChecked: dateStr, date: dateObj };\n fs.mkdirSync(cacheDir, { recursive: true });\n const metaPath = path.join(cacheDir, METADATA_FILENAME);\n // Atomic replacement (#7): concurrent readers always parse a complete file.\n writeAtomicFileSync(metaPath, JSON.stringify(metadata, null, 2));\n return metadata;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { logger } from \"./logger.js\";\nimport { AnnotationsError } from \"./errors.js\";\nimport { withFileLock, writeAtomicFile } from \"./lock.js\";\nimport {\n guardedFetch,\n parseDeclaredContentLength,\n type GuardedFetchResult,\n} from \"./download-guard.js\";\nimport { createProgressBar, formatTransferSummary } from \"./terminal-progress.js\";\nimport {\n ANNOTATIONS_FILENAME,\n METADATA_FILENAME,\n MIN_ANNOTATIONS_SIZE_BYTES,\n MAX_ANNOTATIONS_SIZE_BYTES,\n MAX_COMMIT_JSON_SIZE_BYTES,\n type AnnotationsMetadata,\n getAnnotationsCacheDir,\n getTodayDateString,\n isAnnotationsValid,\n readAnnotationsMetadata,\n} from \"./annotations-metadata.js\";\n\nexport const DOCGEN_REPO = \"nanos-world/vscode-extension\";\nexport const DOCGEN_BRANCH = \"docgen-output\";\nexport const RAW_ANNOTATIONS_URL =\n \"https://raw.githubusercontent.com/nanos-world/vscode-extension/refs/heads/docgen-output/annotations.lua\";\nexport const GITHUB_COMMITS_API =\n \"https://api.github.com/repos/nanos-world/vscode-extension/commits/docgen-output\";\n\n/** Reads an HTTP response body with an upper byte limit to guard against memory exhaustion. */\nasync function readBoundedResponseBody(\n res: Response,\n maxBytes: number,\n onExceeded: (bytes: number, reason: \"header\" | \"stream\") => never | void,\n onProgress?: (transferred: number) => void,\n): Promise<string | null> {\n const lengthHeader = res.headers?.get?.(\"content-length\");\n if (lengthHeader) {\n const declared = parseInt(lengthHeader, 10);\n if (!isNaN(declared) && declared > maxBytes) {\n if (typeof res.body?.cancel === \"function\") {\n await res.body.cancel().catch(() => {});\n }\n onExceeded(declared, \"header\");\n return null;\n }\n }\n\n if (\n res.body &&\n typeof (res.body as unknown as { [Symbol.asyncIterator]?: unknown })[Symbol.asyncIterator] ===\n \"function\"\n ) {\n let total = 0;\n const chunks: Buffer[] = [];\n for await (const chunk of res.body as AsyncIterable<Uint8Array | Buffer>) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n total += buf.length;\n if (total > maxBytes) {\n if (typeof res.body.cancel === \"function\") {\n await res.body.cancel().catch(() => {});\n }\n onExceeded(total, \"stream\");\n return null;\n }\n onProgress?.(total);\n chunks.push(buf);\n }\n return Buffer.concat(chunks).toString(\"utf-8\");\n }\n\n if (typeof res.text === \"function\") {\n const text = await res.text();\n const len = Buffer.byteLength(text, \"utf-8\");\n if (len > maxBytes) {\n onExceeded(len, \"stream\");\n return null;\n }\n return text;\n }\n\n return \"\";\n}\n\n/**\n * Resolves a request through the download guard, which refuses an off-allowlist request URL,\n * an off-allowlist redirect hop and an off-allowlist final response URL, releasing the body of\n * every refused response instead of downloading it.\n */\nasync function resolveGuardedResponse(\n url: string,\n init: RequestInit,\n): Promise<{ res: Response } | { block: GuardedFetchResult }> {\n const result = await guardedFetch(url, init);\n if (result.ok && result.response) {\n return { res: result.response };\n }\n return { block: result };\n}\n\n/** Builds the user-facing error for a request refused by the download transport policy. */\nfunction downloadBlockError(result: GuardedFetchResult): AnnotationsError {\n if (result.reason === \"network-error\") {\n return new AnnotationsError(\n `Failed to download annotations.lua: ${result.error instanceof Error ? result.error.message : String(result.error)}`,\n \"ERR_ANNOTATIONS_DOWNLOAD\",\n \"Verify your internet connection and that GitHub raw endpoints are accessible.\",\n { cause: result.error },\n );\n }\n const detail =\n result.reason === \"too-many-redirects\"\n ? \"Redirect chain too long\"\n : result.reason === \"missing-location\"\n ? \"Redirect without a usable target\"\n : \"Redirect blocked\";\n return new AnnotationsError(\n `${detail}: requests must stay on allowlisted GitHub infrastructure over HTTPS (${result.url ?? \"unknown URL\"})`,\n \"ERR_ANNOTATIONS_DOWNLOAD\",\n \"Verify that no proxy or DNS override redirects GitHub traffic to another host or to plaintext http://.\",\n );\n}\n\n/** Fetches the latest commit SHA for the annotations branch from the GitHub API. */\nexport async function fetchLatestCommitId(): Promise<string | null> {\n try {\n const headers: Record<string, string> = { \"User-Agent\": \"nanos-lint\" };\n if (process.env.GITHUB_TOKEN) {\n headers[\"Authorization\"] = `token ${process.env.GITHUB_TOKEN}`;\n }\n const outcome = await resolveGuardedResponse(GITHUB_COMMITS_API, {\n headers,\n signal: AbortSignal.timeout(5000),\n });\n if (\"block\" in outcome) {\n if (outcome.block.reason !== \"network-error\") {\n logger.warn(`[annotations] ${downloadBlockError(outcome.block).message}`);\n }\n return null;\n }\n const { res } = outcome;\n if (res.ok) {\n const rawJson = await readBoundedResponseBody(res, MAX_COMMIT_JSON_SIZE_BYTES, (bytes) => {\n logger.warn(\n `GitHub commits response exceeded size limit of ${MAX_COMMIT_JSON_SIZE_BYTES} bytes (${bytes} bytes)`,\n );\n });\n if (rawJson === null) {\n return null;\n }\n if (!rawJson && !res.bodyUsed && typeof res.json === \"function\") {\n const data = (await res.json()) as { sha?: string };\n if (typeof data.sha === \"string\" && /^[0-9a-fA-F]{7,40}$/.test(data.sha)) {\n return data.sha;\n }\n return null;\n }\n if (!rawJson) {\n return null;\n }\n const data = JSON.parse(rawJson) as { sha?: string };\n if (typeof data.sha === \"string\" && /^[0-9a-fA-F]{7,40}$/.test(data.sha)) {\n return data.sha;\n }\n }\n } catch (err) {\n logger.warn(\n `Failed to resolve latest annotations commit from GitHub: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n return null;\n}\n\n/** Returns raw annotations URL, pinned to commit SHA if provided and valid. */\nexport function getRawAnnotationsUrl(commitSha?: string): string {\n if (commitSha && /^[0-9a-fA-F]{7,40}$/.test(commitSha)) {\n return `https://raw.githubusercontent.com/${DOCGEN_REPO}/${commitSha}/annotations.lua`;\n }\n return RAW_ANNOTATIONS_URL;\n}\n\n/** Downloads raw annotations.lua content from GitHub raw content endpoints. */\nexport async function fetchRawAnnotationsContent(commitSha?: string): Promise<string> {\n const url = getRawAnnotationsUrl(commitSha);\n const outcome = await resolveGuardedResponse(url, {\n headers: { \"User-Agent\": \"nanos-lint\" },\n signal: AbortSignal.timeout(15000),\n });\n if (\"block\" in outcome) {\n const blockError = downloadBlockError(outcome.block);\n logger.warn(`[annotations] ${blockError.message}`);\n throw blockError;\n }\n const { res } = outcome;\n if (!res.ok) {\n throw new AnnotationsError(\n `Failed to download annotations.lua: ${res.status} ${res.statusText}`,\n \"ERR_ANNOTATIONS_DOWNLOAD\",\n \"Verify your internet connection and that GitHub raw endpoints are accessible.\",\n );\n }\n\n const declaredTotal = parseDeclaredContentLength(res);\n const startedAt = Date.now();\n let transferred = 0;\n const commitLabel = commitSha ? ` (${commitSha.slice(0, 7)})` : \"\";\n const progress = createProgressBar({\n label: `[annotations] Downloading ${ANNOTATIONS_FILENAME}${commitLabel}`,\n total: declaredTotal,\n announce: false,\n });\n\n let text: string | null;\n try {\n text = await readBoundedResponseBody(\n res,\n MAX_ANNOTATIONS_SIZE_BYTES,\n (bytes, reason) => {\n const msg =\n reason === \"header\"\n ? `Annotations file size (${bytes} bytes) exceeds maximum limit (${MAX_ANNOTATIONS_SIZE_BYTES} bytes)`\n : `Annotations file download exceeded maximum allowed size of ${MAX_ANNOTATIONS_SIZE_BYTES} bytes`;\n throw new AnnotationsError(\n msg,\n \"ERR_ANNOTATIONS_TOO_LARGE\",\n \"Specify a local annotations file via --annotations <path>.\",\n );\n },\n (bytes) => {\n transferred = bytes;\n progress.update(bytes, declaredTotal);\n },\n );\n\n if (!text || text.length < MIN_ANNOTATIONS_SIZE_BYTES) {\n throw new AnnotationsError(\n \"Downloaded annotations.lua appears truncated or invalid\",\n \"ERR_ANNOTATIONS_INVALID\",\n \"Retry downloading or pass a local annotations file via --annotations <path>.\",\n );\n }\n } catch (err) {\n progress.fail();\n throw err;\n }\n\n progress.finish(\n `[annotations] Downloaded ${ANNOTATIONS_FILENAME} (${formatTransferSummary(transferred, Date.now() - startedAt)})`,\n );\n return text;\n}\n\n/**\n * Downloads annotations.lua and writes it with its metadata inside an exclusive cache\n * lock (`.annotations.lock`). The completion check is repeated once the lock is held, so\n * parallel callers reuse the file a concurrent worker just wrote instead of racing on\n * the same paths, and both files are replaced atomically (#7).\n */\nexport async function downloadAndCacheAnnotations(\n commitId: string,\n cacheDir: string = getAnnotationsCacheDir(),\n): Promise<string> {\n fs.mkdirSync(cacheDir, { recursive: true });\n\n const finalAnnotationsPath = path.join(cacheDir, ANNOTATIONS_FILENAME);\n const finalMetaPath = path.join(cacheDir, METADATA_FILENAME);\n const lockPath = path.join(cacheDir, \".annotations.lock\");\n\n return withFileLock(\n lockPath,\n async () => {\n const existingMeta = readAnnotationsMetadata(cacheDir);\n if (\n existingMeta &&\n existingMeta.commitId === commitId &&\n fs.existsSync(finalAnnotationsPath) &&\n isAnnotationsValid(finalAnnotationsPath)\n ) {\n logger.debug(`[annotations] Reusing cached annotations for commit ${commitId}.`);\n return finalAnnotationsPath;\n }\n\n const label = commitId && commitId !== \"unknown\" ? ` (${commitId.slice(0, 7)})` : \"\";\n logger.info(`[annotations] Downloading nanos world API annotations${label}...`);\n const content = await fetchRawAnnotationsContent(commitId);\n const { dateStr, dateObj } = getTodayDateString();\n const metadata: AnnotationsMetadata = { commitId, lastChecked: dateStr, date: dateObj };\n\n // Atomic replacement keeps readers on either the previous or the new complete\n // file. The metadata is written last, so an interrupted update is retried later.\n await writeAtomicFile(finalAnnotationsPath, content);\n await writeAtomicFile(finalMetaPath, JSON.stringify(metadata, null, 2));\n\n const commitLabel =\n commitId && commitId !== \"unknown\" ? ` to commit ${commitId.slice(0, 7)}` : \"\";\n logger.info(`[annotations] Updated annotations.lua${commitLabel}.`);\n return finalAnnotationsPath;\n },\n { label: \"annotations\" },\n );\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { getPackageRoot } from \"./config.js\";\nimport { logger } from \"./logger.js\";\nimport { AnnotationsError } from \"./errors.js\";\nimport {\n ANNOTATIONS_FILENAME,\n getAnnotationsCacheDir,\n getTodayDateString,\n isAnnotationsValid,\n readAnnotationsMetadata,\n updateLastCheckedDate,\n} from \"./annotations-metadata.js\";\nimport { downloadAndCacheAnnotations, fetchLatestCommitId } from \"./annotations-download.js\";\n\nexport * from \"./annotations-metadata.js\";\nexport * from \"./annotations-download.js\";\n\nexport interface ResolveAnnotationsOptions {\n customPath?: string;\n cacheDir?: string;\n offline?: boolean;\n}\n\n/** Validates that a user-supplied or environment-specified annotations path exists and is a valid file. */\nfunction validateCustomAnnotationsPath(filePath: string, source: \"custom\" | \"env\"): string {\n const resolved = path.resolve(filePath);\n const isCustom = source === \"custom\";\n const targetDesc = isCustom\n ? \"path specified in --annotations\"\n : \"path specified in NANOS_ANNOTATIONS_PATH or NANOS_ANNOTATIONS\";\n if (!fs.existsSync(resolved)) {\n throw new AnnotationsError(\n isCustom\n ? `Custom annotations file not found: ${resolved}`\n : `Annotations file specified in environment not found: ${resolved}`,\n isCustom ? \"ERR_ANNOTATIONS_NOT_FOUND\" : \"ERR_ANNOTATIONS_ENV_NOT_FOUND\",\n `Verify that the ${targetDesc} exists and is accessible.`,\n );\n }\n\n const stat = fs.statSync(resolved);\n if (!stat.isFile()) {\n throw new AnnotationsError(\n isCustom\n ? `Custom annotations path is not a file: ${resolved}`\n : `Annotations path specified in environment is not a file: ${resolved}`,\n \"ERR_ANNOTATIONS_NOT_A_FILE\",\n `Verify that the ${targetDesc} points to a regular file, not a directory.`,\n );\n }\n\n if (stat.size === 0) {\n throw new AnnotationsError(\n isCustom\n ? `Custom annotations file is empty: ${resolved}`\n : `Annotations file specified in environment is empty: ${resolved}`,\n \"ERR_ANNOTATIONS_INVALID\",\n `Verify that the ${targetDesc} is a valid non-empty Lua annotations file.`,\n );\n }\n\n try {\n const fd = fs.openSync(resolved, \"r\");\n let isBinary = false;\n try {\n const buffer = Buffer.alloc(Math.min(stat.size, 512));\n const bytesRead = fs.readSync(fd, buffer, 0, buffer.length, 0);\n isBinary = buffer.subarray(0, bytesRead).includes(0);\n } finally {\n fs.closeSync(fd);\n }\n if (isBinary) {\n throw new AnnotationsError(\n isCustom\n ? `Custom annotations file appears to be a binary file: ${resolved}`\n : `Annotations file specified in environment appears to be a binary file: ${resolved}`,\n \"ERR_ANNOTATIONS_INVALID\",\n \"Verify that the annotations file is a valid Lua text annotations file.\",\n );\n }\n } catch (err) {\n if (err instanceof AnnotationsError) {\n throw err;\n }\n }\n\n return resolved;\n}\n\n/**\n * Resolves the nanos world annotations.lua definitions file path.\n * Resolution precedence:\n * 1. CLI option (`customPath`)\n * 2. Environment variable (`NANOS_ANNOTATIONS_PATH` or `NANOS_ANNOTATIONS`)\n * 3. Bundled inside package root (`annotations.lua`)\n * 4. User cache (checked once per day from upstream GitHub)\n */\nexport async function resolveAnnotations(options: ResolveAnnotationsOptions = {}): Promise<string> {\n if (options.customPath) {\n return validateCustomAnnotationsPath(options.customPath, \"custom\");\n }\n\n const envPath = process.env.NANOS_ANNOTATIONS_PATH || process.env.NANOS_ANNOTATIONS;\n if (envPath) {\n return validateCustomAnnotationsPath(envPath, \"env\");\n }\n\n const bundled = path.join(getPackageRoot(), \"annotations.lua\");\n if (fs.existsSync(bundled) && isAnnotationsValid(bundled)) {\n return bundled;\n }\n\n const cacheDir = options.cacheDir ?? getAnnotationsCacheDir();\n const cachedAnnotationsFile = path.join(cacheDir, ANNOTATIONS_FILENAME);\n if (options.offline) {\n if (isAnnotationsValid(cachedAnnotationsFile)) return cachedAnnotationsFile;\n throw new AnnotationsError(\n `Offline: no usable local annotations.lua at ${cachedAnnotationsFile}.`,\n \"ERR_ANNOTATIONS_OFFLINE\",\n \"Run 'nanos-lint warmup' online or specify --annotations <path>.\",\n );\n }\n const metadata = readAnnotationsMetadata(cacheDir);\n const { dateStr } = getTodayDateString();\n\n if (fs.existsSync(cachedAnnotationsFile) && !isAnnotationsValid(cachedAnnotationsFile)) {\n logger.warn(\n \"[annotations] Cached annotations.lua is corrupted or empty. Purging and refreshing...\",\n );\n try {\n fs.unlinkSync(cachedAnnotationsFile);\n } catch (err) {\n logger.warn(\n `[annotations] Failed to remove corrupted cached annotations: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n if (\n metadata &&\n metadata.lastChecked === dateStr &&\n fs.existsSync(cachedAnnotationsFile) &&\n isAnnotationsValid(cachedAnnotationsFile)\n ) {\n return cachedAnnotationsFile;\n }\n\n const latestCommitId = await fetchLatestCommitId();\n\n if (latestCommitId) {\n if (\n metadata &&\n metadata.commitId === latestCommitId &&\n fs.existsSync(cachedAnnotationsFile) &&\n isAnnotationsValid(cachedAnnotationsFile)\n ) {\n updateLastCheckedDate(latestCommitId, cacheDir);\n return cachedAnnotationsFile;\n }\n\n return await downloadAndCacheAnnotations(latestCommitId, cacheDir);\n }\n\n if (fs.existsSync(cachedAnnotationsFile) && isAnnotationsValid(cachedAnnotationsFile)) {\n try {\n updateLastCheckedDate(metadata?.commitId || \"unknown\", cacheDir);\n } catch (err) {\n logger.warn(\n `Failed to update lastChecked date for cached annotations: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n return cachedAnnotationsFile;\n }\n\n try {\n return await downloadAndCacheAnnotations(\"unknown\", cacheDir);\n } catch (err) {\n if (fs.existsSync(bundled) && isAnnotationsValid(bundled)) {\n logger.info(\n \"[annotations] Network offline and cache unavailable. Falling back to bundled annotations.\",\n );\n return bundled;\n }\n\n const isFsError =\n Boolean(\n err &&\n typeof err === \"object\" &&\n \"code\" in err &&\n typeof (err as { code: unknown }).code === \"string\" &&\n [\"EACCES\", \"EPERM\", \"ENOSPC\", \"EROFS\", \"EEXIST\", \"ENOENT\"].includes(\n (err as { code: string }).code,\n ),\n ) ||\n (err instanceof Error && /permission denied|read-only|no space left/i.test(err.message));\n\n if (isFsError) {\n throw new AnnotationsError(\n `Failed to resolve nanos world API annotations due to a filesystem error: ${err instanceof Error ? err.message : String(err)}. Please check directory permissions or pass a custom file with --annotations.`,\n \"ERR_ANNOTATIONS_FS\",\n \"Check directory permissions for the cache directory or specify --annotations <path>.\",\n { cause: err },\n );\n }\n throw new AnnotationsError(\n `Failed to resolve nanos world API annotations. Please check your network connection or pass a custom file with --annotations. (${err instanceof Error ? err.message : String(err)})`,\n \"ERR_ANNOTATIONS_NETWORK\",\n \"Check your network connection, run 'nanos-lint warmup' when online, or specify --annotations <path>.\",\n { cause: err },\n );\n }\n}\n\nexport interface CopyAnnotationsOptions {\n force?: boolean;\n annotationsPath?: string;\n cacheDir?: string;\n offline?: boolean;\n}\n\nconst DEFAULT_COPY_TARGET = `.nanos-lint/${ANNOTATIONS_FILENAME}`;\n\n/**\n * Copies nanos world annotations.lua definitions into a target file or directory.\n * A target counts as a directory when it ends with a separator, already is a directory,\n * or does not end in `.lua` (case-insensitively).\n */\nexport async function copyAnnotations(\n targetPath: string = DEFAULT_COPY_TARGET,\n options: CopyAnnotationsOptions = {},\n): Promise<string> {\n let resolvedTarget = path.resolve(targetPath);\n const isDirectoryTarget =\n targetPath.endsWith(\"/\") ||\n targetPath.endsWith(\"\\\\\") ||\n (fs.existsSync(resolvedTarget) && fs.statSync(resolvedTarget).isDirectory()) ||\n path.extname(resolvedTarget).toLowerCase() !== \".lua\";\n if (isDirectoryTarget) {\n resolvedTarget = path.join(resolvedTarget, ANNOTATIONS_FILENAME);\n }\n\n if (fs.existsSync(resolvedTarget) && !options.force) {\n throw new AnnotationsError(\n `Target annotations file already exists: ${resolvedTarget}. Use --force to overwrite.`,\n \"ERR_ANNOTATIONS_EXISTS\",\n \"Pass --force to overwrite the existing annotations file.\",\n );\n }\n\n const sourcePath = options.annotationsPath\n ? validateCustomAnnotationsPath(options.annotationsPath, \"custom\")\n : await resolveAnnotations({ cacheDir: options.cacheDir, offline: options.offline });\n\n const targetDir = path.dirname(resolvedTarget);\n fs.mkdirSync(targetDir, { recursive: true });\n fs.copyFileSync(sourcePath, resolvedTarget);\n\n return resolvedTarget;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { systemPaths, getDirectorySize, formatBytes } from \"./paths.js\";\nimport { readLuaLSMetadata, listCachedLuaLSVersionDirs, getCacheDir } from \"./luals/cache.js\";\nimport { getPlatformInfo } from \"./luals/platform.js\";\nimport { isBinaryValid } from \"./luals/validation.js\";\nimport { readAnnotationsMetadata, isAnnotationsValid } from \"./annotations.js\";\n\nexport interface CachedLuaLSVersionInfo {\n version: string;\n status: \"valid\" | \"corrupted\";\n size: number;\n sizeFormatted: string;\n path: string;\n}\n\nexport interface LuaLSCacheStatus {\n weeklyCheck: string | null;\n lastCheckedDate: string | null;\n targetVersion: string | null;\n versions: CachedLuaLSVersionInfo[];\n}\n\nexport interface AnnotationsCacheStatus {\n status: \"valid\" | \"corrupted\" | \"missing\";\n size: number;\n sizeFormatted: string;\n path: string;\n commitId: string | null;\n lastChecked: string | null;\n}\n\nexport interface CacheStatusReport {\n cacheDirectory: string;\n totalSize: number;\n totalSizeFormatted: string;\n luals: LuaLSCacheStatus;\n annotations: AnnotationsCacheStatus;\n}\n\n/** Collects detailed status and disk usage information for LuaLS and annotations caches. */\nexport function getCacheStatus(baseCacheDir: string = systemPaths.cache): CacheStatusReport {\n const totalSize = getDirectorySize(baseCacheDir);\n const totalSizeFormatted = formatBytes(totalSize);\n\n // 1. LuaLS Inspection\n const lualsBaseDir = path.join(baseCacheDir, \"luals\");\n const lualsMeta = readLuaLSMetadata(lualsBaseDir);\n const candidateVersions = listCachedLuaLSVersionDirs(lualsBaseDir);\n\n const versionInfos: CachedLuaLSVersionInfo[] = [];\n\n for (const ver of candidateVersions) {\n const versionDir = getCacheDir(ver, lualsBaseDir);\n const marker = path.join(versionDir, \".complete\");\n const info = getPlatformInfo(ver);\n const binPath = path.join(versionDir, info.binaryRelativePath);\n let isValid = false;\n if (fs.existsSync(marker) && fs.existsSync(binPath)) {\n try {\n isValid = fs.readFileSync(marker, \"utf-8\").trim() === ver && isBinaryValid(binPath);\n } catch {\n isValid = false;\n }\n }\n const dirSize = getDirectorySize(versionDir);\n\n versionInfos.push({\n version: ver,\n status: isValid ? \"valid\" : \"corrupted\",\n size: dirSize,\n sizeFormatted: formatBytes(dirSize),\n path: versionDir,\n });\n }\n\n const lualsStatus: LuaLSCacheStatus = {\n weeklyCheck: lualsMeta?.lastCheckedWeek ?? null,\n lastCheckedDate: lualsMeta?.lastCheckedDate ?? null,\n targetVersion: lualsMeta?.latestVersion ?? null,\n versions: versionInfos,\n };\n\n // 2. Annotations Inspection\n const annotationsDir = path.join(baseCacheDir, \"annotations\");\n const annotationsFile = path.join(annotationsDir, \"annotations.lua\");\n const annMeta = readAnnotationsMetadata(annotationsDir);\n\n let annStatus: \"valid\" | \"corrupted\" | \"missing\" = \"missing\";\n let annSize = 0;\n\n if (fs.existsSync(annotationsFile)) {\n annSize = getDirectorySize(annotationsFile);\n annStatus = isAnnotationsValid(annotationsFile) ? \"valid\" : \"corrupted\";\n }\n\n const annotationsStatus: AnnotationsCacheStatus = {\n status: annStatus,\n size: annSize,\n sizeFormatted: formatBytes(annSize),\n path: annotationsFile,\n commitId: annMeta?.commitId ?? null,\n lastChecked: annMeta?.lastChecked ?? null,\n };\n\n return {\n cacheDirectory: baseCacheDir,\n totalSize,\n totalSizeFormatted,\n luals: lualsStatus,\n annotations: annotationsStatus,\n };\n}\n\n/** Formats a cache status report into human-readable terminal output. */\nexport function formatCacheStatusPretty(report: CacheStatusReport): string {\n const lines: string[] = [];\n\n lines.push(\"nanos-lint Cache Status\");\n lines.push(\"\");\n lines.push(`Cache Directory: ${report.cacheDirectory}`);\n lines.push(`Total Disk Usage: ${report.totalSizeFormatted}`);\n lines.push(\"\");\n lines.push(\"Lua Language Server (LuaLS):\");\n\n const weeklyStr = report.luals.weeklyCheck\n ? `${report.luals.weeklyCheck}${report.luals.lastCheckedDate ? ` (last checked: ${report.luals.lastCheckedDate})` : \"\"}`\n : \"none\";\n lines.push(` - Weekly Check: ${weeklyStr}`);\n\n const targetVer = report.luals.targetVersion ?? \"none\";\n lines.push(` - Target Version: ${targetVer}`);\n\n if (report.luals.versions.length === 0) {\n lines.push(\" - Cached Copies: none\");\n } else {\n lines.push(\" - Cached Copies:\");\n for (const v of report.luals.versions) {\n lines.push(` * ${v.version} (status: ${v.status}, size: ${v.sizeFormatted})`);\n }\n }\n\n lines.push(\"\");\n lines.push(\"nanos world Annotations:\");\n\n if (report.annotations.status === \"missing\") {\n lines.push(\" - Status: Not cached\");\n } else {\n const statusCap = report.annotations.status === \"valid\" ? \"Valid\" : \"Corrupted\";\n lines.push(` - Status: ${statusCap} (${report.annotations.sizeFormatted})`);\n if (report.annotations.commitId) {\n const sha = report.annotations.commitId;\n const shaDisplay =\n sha.length >= 7 && sha !== \"unknown\" ? `${sha.slice(0, 8)} (docgen-output)` : sha;\n lines.push(` - Commit SHA: ${shaDisplay}`);\n }\n if (report.annotations.lastChecked) {\n lines.push(` - Last Checked: ${report.annotations.lastChecked}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n","import { logger } from \"./logger.js\";\n\n/** Writes command results to stdout unless the log level is `silent`. */\nexport function writeOutput(message: string): void {\n if (logger.isOutputEnabled()) {\n console.log(message);\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { ConfigError } from \"./errors.js\";\nimport { writeAtomicFileSync } from \"./lock.js\";\nimport { fileUriToPath, type Diagnostic, type CheckResult } from \"./types.js\";\n\nexport interface BaselineEntry {\n path: string;\n code: string;\n message: string;\n severity: number;\n count: number;\n}\n\nexport interface DiagnosticBaseline {\n version: 1;\n entries: BaselineEntry[];\n}\n\n/** Builds a line-independent diagnostic identity relative to the checked workspace root. */\nfunction entryFor(root: string, uri: string, diagnostic: Diagnostic): BaselineEntry {\n const file = fileUriToPath(uri);\n const relative = path.relative(root, path.isAbsolute(file) ? file : path.resolve(root, file));\n return {\n path: relative.replace(/\\\\/g, \"/\"),\n code: diagnostic.code ?? \"\",\n message: diagnostic.message.replace(/\\s+/g, \" \").trim(),\n severity: diagnostic.severity,\n count: 1,\n };\n}\n\n/** Serializes the fields defining a diagnostic identity, excluding occurrence count. */\nfunction keyFor(entry: BaselineEntry): string {\n return JSON.stringify([entry.path, entry.code, entry.message, entry.severity]);\n}\n\n/** Records sorted diagnostic identities and multiplicities without source positions. */\nexport function createBaseline(result: CheckResult, root: string): DiagnosticBaseline {\n const entries = new Map<string, BaselineEntry>();\n for (const [uri, diagnostics] of Object.entries(result.diagnostics)) {\n for (const diagnostic of diagnostics) {\n const entry = entryFor(root, uri, diagnostic);\n const key = keyFor(entry);\n const previous = entries.get(key);\n if (previous) previous.count++;\n else entries.set(key, entry);\n }\n }\n return {\n version: 1,\n entries: [...entries.values()].sort((a, b) => {\n const left = keyFor(a);\n const right = keyFor(b);\n return left < right ? -1 : left > right ? 1 : 0;\n }),\n };\n}\n\n/** Validates a persisted baseline and rejects ambiguous or incompatible entries. */\nexport function readBaseline(file: string): DiagnosticBaseline {\n try {\n const parsed = JSON.parse(fs.readFileSync(file, \"utf-8\")) as DiagnosticBaseline;\n if (parsed?.version !== 1 || !Array.isArray(parsed.entries)) {\n throw new Error(\"Unsupported baseline schema (expected version 1).\");\n }\n const keys = new Set<string>();\n for (const entry of parsed.entries) {\n if (\n !entry ||\n typeof entry.path !== \"string\" ||\n !entry.path ||\n typeof entry.code !== \"string\" ||\n typeof entry.message !== \"string\" ||\n !Number.isInteger(entry.severity) ||\n entry.severity < 1 ||\n entry.severity > 4 ||\n !Number.isSafeInteger(entry.count) ||\n entry.count < 1\n ) {\n throw new Error(\"Invalid baseline diagnostic entry.\");\n }\n const key = keyFor(entry);\n if (keys.has(key)) throw new Error(\"Duplicate baseline diagnostic entry.\");\n keys.add(key);\n }\n return parsed;\n } catch (cause) {\n throw new ConfigError(\n `Cannot read diagnostic baseline ${file}: ${cause instanceof Error ? cause.message : String(cause)}`,\n \"ERR_BASELINE_READ\",\n \"Regenerate with 'nanos-lint check <targets> --write-baseline <path>' using the same targets and options.\",\n { cause },\n );\n }\n}\n\n/** Atomically writes a deterministic baseline, creating its parent directory if needed. */\nexport function writeBaseline(file: string, result: CheckResult, root: string): void {\n try {\n writeAtomicFileSync(\n path.resolve(file),\n `${JSON.stringify(createBaseline(result, root), null, 2)}\\n`,\n );\n } catch (cause) {\n throw new ConfigError(\n `Cannot write diagnostic baseline ${file}: ${cause instanceof Error ? cause.message : String(cause)}`,\n \"ERR_BASELINE_WRITE\",\n \"Choose a writable baseline path.\",\n { cause },\n );\n }\n}\n\n/** Classifies each diagnostic against an occurrence budget and computes strict staleness. */\nexport function compareBaseline(\n result: CheckResult,\n baseline: DiagnosticBaseline,\n root: string,\n strict = false,\n): CheckResult {\n const remaining = new Map(baseline.entries.map((entry) => [keyFor(entry), entry.count]));\n const diagnostics: CheckResult[\"diagnostics\"] = {};\n let baselined = 0;\n let total = 0;\n for (const [uri, items] of Object.entries(result.diagnostics)) {\n diagnostics[uri] = [...items]\n .sort(\n (a, b) =>\n a.range.start.line - b.range.start.line ||\n a.range.start.character - b.range.start.character,\n )\n .map((diagnostic) => {\n const key = keyFor(entryFor(root, uri, diagnostic));\n const count = remaining.get(key) ?? 0;\n const matched = count > 0;\n if (matched) {\n remaining.set(key, count - 1);\n baselined++;\n }\n total++;\n return { ...diagnostic, baseline: matched };\n });\n }\n const stale = [...remaining.values()].reduce((sum, count) => sum + count, 0);\n const newProblems = total - baselined;\n return {\n ...result,\n diagnostics,\n passed: newProblems === 0 && (!strict || stale === 0),\n baselineSummary: { new: newProblems, baselined, total, stale },\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { resolveWorkspaceConfig, loadUserConfig } from \"./config.js\";\nimport { planRealmCheck, runRealmAwareCheck, type RealmSelection } from \"./realms.js\";\nimport { resolvePackageDependencies } from \"./deps.js\";\nimport { resolveAnnotations } from \"./annotations.js\";\nimport { runLuaLSCheck } from \"./luals.js\";\nimport { readBaseline, writeBaseline, compareBaseline, createBaseline } from \"./baseline.js\";\nimport { formatReport } from \"./reporter.js\";\nimport { logger, LogLevel, isValidLogLevel } from \"./logger.js\";\nimport { writeOutput } from \"./output.js\";\nimport { setProgressMode } from \"./terminal-progress.js\";\nimport { ConfigError } from \"./errors.js\";\nimport { computeUnrequestedExclusions, resolveCheckTargets } from \"./target-resolver.js\";\nimport type { CheckOptions, DiagnosticSeverity } from \"./types.js\";\n\nexport interface CheckCommandOptions {\n checklevel: DiagnosticSeverity;\n config?: string;\n annotations?: string;\n format?: \"pretty\" | \"json\" | \"github\";\n lualsVersion: string;\n fail: boolean;\n logLevel?: string;\n progress?: boolean;\n github?: boolean;\n offline?: boolean;\n baseline?: string;\n writeBaseline?: string;\n baselineStrict?: boolean;\n ignore?: string[];\n dep?: string[];\n realm?: RealmSelection;\n}\n\n/** Executes the check command on target paths with specified options. */\nexport async function executeCheckCommand(\n targetPaths: string[] = [\".\"],\n opts: CheckCommandOptions,\n setExitCode: (code: number) => void,\n): Promise<void> {\n if (opts.logLevel && isValidLogLevel(opts.logLevel)) {\n logger.setLevel(opts.logLevel as LogLevel);\n }\n\n const rawPaths = targetPaths && targetPaths.length > 0 ? targetPaths : [\".\"];\n const { rootPath, targetPaths: canonicalTargets } = resolveCheckTargets(rawPaths);\n\n const format = opts.github\n ? \"github\"\n : opts.format || (process.env.GITHUB_ACTIONS ? \"github\" : \"pretty\");\n\n if (format === \"json\") {\n setProgressMode(\"off\");\n logger.setDiagnosticStream(\"stderr\");\n }\n\n if ((opts.baseline && opts.writeBaseline) || (opts.baselineStrict && !opts.baseline)) {\n throw new ConfigError(\n \"Use either --baseline or --write-baseline; --baseline-strict requires --baseline.\",\n \"ERR_BASELINE_OPTIONS\",\n );\n }\n const baseline = opts.baseline ? readBaseline(path.resolve(opts.baseline)) : undefined;\n\n const checkOptions: CheckOptions = {\n offline: opts.offline,\n path: rootPath,\n paths: canonicalTargets,\n configpath: opts.config,\n checklevel: opts.checklevel,\n format,\n lualsVersion: opts.lualsVersion,\n failOnError: opts.fail !== false,\n ignore: opts.ignore,\n deps: opts.dep,\n };\n\n if (opts.config) {\n const resolvedConfig = path.resolve(opts.config);\n if (!fs.existsSync(resolvedConfig)) {\n throw new ConfigError(\n `Configuration file not found: ${resolvedConfig}`,\n \"ERR_CONFIG_NOT_FOUND\",\n \"Verify the path passed to --config exists and is readable.\",\n );\n }\n }\n\n const annotationsPath = await resolveAnnotations({\n customPath: opts.annotations,\n offline: opts.offline,\n });\n\n const userConfig = loadUserConfig(rootPath, checkOptions.configpath);\n const realmPlan = planRealmCheck({\n targetPath: rootPath,\n userConfig,\n selection: opts.realm ?? \"all\",\n annotationsPath,\n customConfigPath: checkOptions.configpath,\n ignore: checkOptions.ignore,\n targetPaths: canonicalTargets,\n cliDeps: checkOptions.deps,\n });\n\n let result;\n if (realmPlan) {\n try {\n result = await runRealmAwareCheck(realmPlan, rootPath, checkOptions);\n } finally {\n realmPlan.cleanup();\n }\n } else {\n const resolvedDeps = resolvePackageDependencies(rootPath, userConfig, checkOptions.deps);\n const unrequestedExclusions = computeUnrequestedExclusions(rootPath, canonicalTargets);\n const resolved = resolveWorkspaceConfig(rootPath, checkOptions.configpath, {\n ignore: checkOptions.ignore,\n annotationsPath,\n dependencyLibraries: resolvedDeps.all,\n unrequestedExclusions,\n });\n try {\n result = await runLuaLSCheck(rootPath, resolved.configPath, checkOptions);\n } finally {\n if (resolved.isTemp && fs.existsSync(resolved.configPath)) {\n try {\n fs.unlinkSync(resolved.configPath);\n } catch (err) {\n logger.warn(\n `Failed to clean up temporary config file ${resolved.configPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n }\n\n if (opts.writeBaseline) {\n writeBaseline(opts.writeBaseline, result, rootPath);\n result = compareBaseline(result, createBaseline(result, rootPath), rootPath);\n } else if (baseline) {\n result = compareBaseline(result, baseline, rootPath, opts.baselineStrict);\n }\n\n const output = formatReport(result, checkOptions.format, process.cwd());\n if (output) {\n writeOutput(output);\n }\n\n if (!result.passed && checkOptions.failOnError) {\n setExitCode(1);\n } else {\n setExitCode(0);\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command, CommanderError, Option } from \"commander\";\nimport { initWorkspace, getPackageRoot } from \"./config.js\";\nimport { collectDeps } from \"./deps.js\";\nimport { resolveAnnotations, readAnnotationsMetadata, copyAnnotations } from \"./annotations.js\";\nimport { resolveLuaLSBinary, DEFAULT_LUALS_VERSION } from \"./luals.js\";\nimport { cleanCache, systemPaths } from \"./paths.js\";\nimport { getCacheStatus, formatCacheStatusPretty } from \"./cache-status.js\";\nimport { logger, LogLevel, isValidLogLevel, DEFAULT_LOG_LEVEL } from \"./logger.js\";\nimport { writeOutput } from \"./output.js\";\nimport { setProgressMode } from \"./terminal-progress.js\";\nimport { NanosLintError } from \"./errors.js\";\nimport { executeCheckCommand, type CheckCommandOptions } from \"./cli-check.js\";\n\n/** Retrieves the formatted package name and version string from package.json. */\nfunction getVersionString(): string {\n const root = getPackageRoot();\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(root, \"package.json\"), \"utf-8\"));\n return `nanos-lint v${pkg.version}`;\n } catch (err) {\n logger.debug(\n `Could not read version from package.json: ${err instanceof Error ? err.message : String(err)}`,\n );\n return \"nanos-lint v1.0.0\";\n }\n}\n\n/** Accumulates repeatable --ignore pattern arguments, splitting by comma and newline. */\nexport function collectIgnorePatterns(val: string, prev?: string[]): string[] {\n const parts = val\n .split(/[\\r\\n,]+/)\n .map((s) => s.trim())\n .filter(Boolean);\n return (prev ?? []).concat(parts);\n}\n\nexport interface CreateProgramOptions {\n setExitCode?: (code: number) => void;\n}\n\n/** Constructs and configures the top-level Commander program and its CLI subcommands. */\nexport function createProgram(options?: CreateProgramOptions): Command {\n const setExitCode = options?.setExitCode ?? (() => {});\n const program = new Command(\"nanos-lint\");\n\n program\n .description(\"Linter and type-checker for nanos world Lua scripts\")\n .version(getVersionString(), \"-v, --version\", \"Show version information\")\n .addOption(\n new Option(\"-l, --log-level <level>\", \"Logging level: error, warn, info, debug, silent\")\n .choices([\"error\", \"warn\", \"info\", \"debug\", \"silent\"])\n .default(DEFAULT_LOG_LEVEL),\n )\n .option(\"--offline\", \"Use local dependencies only; never access the network\")\n .option(\n \"--no-progress\",\n \"Disable the interactive download, extraction and realm derivation progress display\",\n )\n .hook(\"preAction\", (thisCommand, actionCommand) => {\n const target = actionCommand || thisCommand;\n const opts = target.optsWithGlobals\n ? target.optsWithGlobals<{ logLevel?: string; progress?: boolean }>()\n : target.opts<{ logLevel?: string; progress?: boolean }>();\n if (opts.logLevel && isValidLogLevel(opts.logLevel)) {\n logger.setLevel(opts.logLevel as LogLevel);\n }\n if (opts.progress === false) {\n setProgressMode(\"off\");\n }\n })\n .exitOverride()\n .configureHelp({ showGlobalOptions: true })\n .configureOutput({\n writeOut: (str) => console.log(str.trimEnd()),\n writeErr: (str) => logger.error(str.trimEnd()),\n });\n\n program\n .command(\"check [paths...]\", { isDefault: true })\n .description(\"Check workspace files or directories (default command)\")\n .addOption(\n new Option(\n \"--checklevel <level>\",\n \"Minimum diagnostic level: Error, Warning, Information, Hint\",\n )\n .choices([\"Error\", \"Warning\", \"Information\", \"Hint\"])\n .default(\"Warning\"),\n )\n .option(\"--config <path>\", \"Path to custom .luarc.json configuration file\")\n .option(\"--annotations <path>\", \"Path to custom annotations.lua file\")\n .addOption(\n new Option(\n \"--format <format>\",\n \"Output format: pretty, json, github (default: pretty, auto-detects GitHub Actions)\",\n ).choices([\"pretty\", \"json\", \"github\"]),\n )\n .option(\n \"-i, --ignore <pattern>\",\n \"Files or directories to ignore (supports glob patterns, repeatable)\",\n collectIgnorePatterns,\n )\n .option(\n \"-d, --dep <path>\",\n \"Path to package dependency or Lua definition file (repeatable)\",\n collectDeps,\n )\n .option(\n \"--luals-version <ver>\",\n `Version of LuaLS to use (default: ${DEFAULT_LUALS_VERSION})`,\n DEFAULT_LUALS_VERSION,\n )\n .option(\"--baseline <path>\", \"Report and fail only on diagnostics absent from a saved baseline\")\n .option(\n \"--write-baseline <path>\",\n \"Record current diagnostics as a baseline and exit successfully\",\n )\n .option(\"--baseline-strict\", \"Also fail on stale baseline entries (requires --baseline)\")\n .option(\"--no-fail\", \"Do not exit with code 1 if diagnostics are found\")\n .addOption(\n new Option(\n \"-l, --log-level <level>\",\n \"Logging level: error, warn, info, debug, silent\",\n ).choices([\"error\", \"warn\", \"info\", \"debug\", \"silent\"]),\n )\n .option(\"--github\", \"Output in GitHub Actions format (shortcut for --format=github)\")\n .addOption(\n new Option(\n \"--realm <realm>\",\n \"Execution realm to check: all, client, server, shared (default: all)\",\n )\n .choices([\"all\", \"client\", \"server\", \"shared\"])\n .default(\"all\"),\n )\n .action(async (targetPaths: string[] = [\".\"], opts: CheckCommandOptions, cmd: Command) => {\n opts.offline = cmd.optsWithGlobals().offline;\n await executeCheckCommand(targetPaths, opts, setExitCode);\n });\n\n program\n .command(\"init [path]\")\n .description(\"Scaffold a .luarc.json configuration in the workspace\")\n .option(\"-t, --template <path>\", \"Custom JSONC .luarc.json scaffold template\")\n .option(\"-f, --force\", \"Overwrite existing .luarc.json configuration\")\n .option(\n \"--vendor\",\n \"Vendor annotations.lua into .nanos-lint/ inside workspace for portable standalone editor setup\",\n )\n .option(\"--annotations <path>\", \"Path to custom annotations.lua file (requires --vendor)\")\n .action(\n async (\n targetPath: string = \".\",\n opts: {\n force?: boolean;\n annotations?: string;\n vendor?: boolean;\n template?: string;\n offline?: boolean;\n },\n cmd: Command,\n ) => {\n opts.offline = cmd.optsWithGlobals().offline;\n const shouldVendor = Boolean(opts.vendor);\n // Without --vendor the path is passed through on purpose: initWorkspace rejects the\n // combination instead of silently generating a configuration that ignores the file.\n const annotationsPath = shouldVendor\n ? await resolveAnnotations({ customPath: opts.annotations, offline: opts.offline })\n : opts.annotations;\n const created = initWorkspace(path.resolve(targetPath), {\n force: opts.force,\n annotationsPath,\n vendor: shouldVendor,\n templatePath: opts.template,\n });\n writeOutput(`[init] Initialized nanos world LuaLS configuration: ${created}`);\n setExitCode(0);\n },\n );\n\n program\n .command(\"copy-annotations [destination]\")\n .alias(\"export-annotations\")\n .description(\n \"Copy cached nanos world annotations.lua definitions into a target file or directory (targets not ending in .lua are treated as directories)\",\n )\n .option(\"-f, --force\", \"Overwrite existing annotations file\")\n .option(\"--annotations <path>\", \"Path to custom annotations.lua source file\")\n .action(\n async (\n destination: string | undefined,\n opts: { force?: boolean; annotations?: string },\n cmd: Command,\n ) => {\n const copied = await copyAnnotations(destination, {\n force: opts.force,\n annotationsPath: opts.annotations,\n offline: cmd.optsWithGlobals().offline,\n });\n writeOutput(`[copy-annotations] Copied nanos world annotations to: ${copied}`);\n setExitCode(0);\n },\n );\n\n program\n .command(\"warmup\")\n .alias(\"download\")\n .description(\"Pre-fetch and cache both LuaLS binary and annotations for offline execution\")\n .option(\"--luals-version <ver>\", `Version of LuaLS to use (default: ${DEFAULT_LUALS_VERSION})`)\n .option(\"--annotations <path>\", \"Path to custom annotations.lua file\")\n .action(async (opts: { lualsVersion?: string; annotations?: string }, cmd: Command) => {\n const ver = opts?.lualsVersion || DEFAULT_LUALS_VERSION;\n const bin = await resolveLuaLSBinary(ver, { offline: cmd.optsWithGlobals().offline });\n writeOutput(`[warmup] LuaLS binary ready: ${bin}`);\n\n const annotationsPath = await resolveAnnotations({\n customPath: opts?.annotations,\n offline: cmd.optsWithGlobals().offline,\n });\n const meta = readAnnotationsMetadata();\n const commitInfo =\n meta?.commitId && meta.commitId !== \"unknown\"\n ? ` (commit ${meta.commitId.slice(0, 7)})`\n : \"\";\n writeOutput(`[warmup] nanos world annotations ready: ${annotationsPath}${commitInfo}`);\n writeOutput(\"[warmup] Cache pre-warmed successfully. Ready for offline execution.\");\n setExitCode(0);\n });\n\n program\n .command(\"download-luals [version]\")\n .description(\"Download and cache the LuaLS binary\")\n .option(\"--luals-version <ver>\", `Version of LuaLS to use (default: ${DEFAULT_LUALS_VERSION})`)\n .action(async (version: string | undefined, opts: { lualsVersion?: string }, cmd: Command) => {\n const ver = version || opts?.lualsVersion || DEFAULT_LUALS_VERSION;\n writeOutput(`[luals] Downloading LuaLS ${ver}...`);\n const bin = await resolveLuaLSBinary(ver, { offline: cmd.optsWithGlobals().offline });\n writeOutput(`[luals] Ready at: ${bin}`);\n setExitCode(0);\n });\n\n const handleCleanCache = (): void => {\n try {\n const cleared = cleanCache();\n if (cleared) {\n writeOutput(`[cache] Cleared cache at: ${cleared}`);\n } else {\n writeOutput(`[cache] Cache is already empty (${systemPaths.cache})`);\n }\n setExitCode(0);\n } catch (err) {\n logger.error(\n `[cache] Failed to clear cache: ${err instanceof Error ? err.message : String(err)}`,\n );\n setExitCode(1);\n }\n };\n\n const handleCacheStatus = (opts?: { json?: boolean }): void => {\n if (opts?.json) {\n // Machine-readable output owns stdout: diagnostics must not interleave with the JSON report.\n logger.setDiagnosticStream(\"stderr\");\n }\n const report = getCacheStatus();\n if (opts?.json) {\n writeOutput(JSON.stringify(report, null, 2));\n } else {\n writeOutput(formatCacheStatusPretty(report));\n }\n setExitCode(0);\n };\n\n const cacheCmd = program\n .command(\"cache\")\n .description(\"Inspect or manage the nanos-lint cache\")\n .option(\"--json\", \"Output cache state in JSON format\");\n\n cacheCmd\n .command(\"status\", { isDefault: true })\n .alias(\"info\")\n .description(\"Show cache status, installed versions, and disk usage\")\n .option(\"--json\", \"Output cache state in JSON format\")\n .action((opts: { json?: boolean }, cmd: Command) => {\n const json = opts?.json || (cmd.parent ? Boolean(cmd.parent.opts()?.json) : false);\n handleCacheStatus({ json });\n });\n\n cacheCmd\n .command(\"clean\")\n .description(\"Clear the nanos-lint cache\")\n .action(() => {\n handleCleanCache();\n });\n\n program\n .command(\"cache-status\")\n .description(\"Show cache status, installed versions, and disk usage\")\n .option(\"--json\", \"Output cache state in JSON format\")\n .action((opts: { json?: boolean }) => {\n handleCacheStatus(opts);\n });\n\n program\n .command(\"clean-cache\")\n .alias(\"clean\")\n .description(\"Clear the nanos-lint cache\")\n .action(() => {\n handleCleanCache();\n });\n\n program\n .command(\"version\")\n .description(\"Show version information\")\n .action(() => {\n writeOutput(getVersionString());\n setExitCode(0);\n });\n\n program.helpCommand(\"help [command]\", \"Show this help message\");\n\n program.addHelpText(\n \"after\",\n `\nExamples:\n $ npx nanos-lint\n $ npx nanos-lint warmup\n $ npx nanos-lint cache status\n $ npx nanos-lint check ./my-package\n $ npx nanos-lint check . --checklevel=Error\n $ npx nanos-lint check . --ignore \"myfolder/hello-*.lua\"\n $ npx nanos-lint check . --realm server\n $ npx nanos-lint check Shared/ Server/ --realm server\n $ npx nanos-lint init\n $ npx nanos-lint copy-annotations\n $ npx nanos-lint clean-cache\n`,\n );\n\n return program;\n}\n\n/** Parses command-line arguments and executes the requested CLI action. */\nexport async function runCLI(args: string[] = process.argv.slice(2)): Promise<number> {\n // The redraw policy and the diagnostic stream are process-global and derived from the parsed\n // flags, so every run starts from the defaults: a previous in-process run cannot leak into it.\n setProgressMode(\"auto\");\n logger.setDiagnosticStream(\"stdout\");\n\n // Early parse of log-level so early exits (e.g. --version, --help) configure the logger\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (!arg) {\n continue;\n }\n if (arg === \"-l\" || arg === \"--log-level\") {\n const nextArg = args[i + 1];\n if (nextArg && isValidLogLevel(nextArg)) {\n logger.setLevel(nextArg as LogLevel);\n }\n } else if (arg.startsWith(\"--log-level=\")) {\n const val = arg.split(\"=\")[1];\n if (val && isValidLogLevel(val)) {\n logger.setLevel(val as LogLevel);\n }\n }\n }\n\n let exitCode = 0;\n const program = createProgram({\n setExitCode: (code) => {\n exitCode = code;\n },\n });\n\n try {\n await program.parseAsync(args, { from: \"user\" });\n return exitCode;\n } catch (err) {\n if (err instanceof CommanderError) {\n return err.exitCode;\n }\n if (err instanceof NanosLintError) {\n logger.error(`error: ${err.message}`);\n if (err.remedy) {\n logger.error(`hint: ${err.remedy}`);\n }\n if ((logger.getLevel() === \"debug\" || process.env.DEBUG) && err.stack) {\n logger.error(err.stack);\n if (err.cause) {\n logger.error(\n `cause: ${err.cause instanceof Error ? err.cause.stack || err.cause.message : String(err.cause)}`,\n );\n }\n }\n return 1;\n }\n const message = err instanceof Error ? err.message : String(err);\n logger.error(`error: ${message}`);\n if ((logger.getLevel() === \"debug\" || process.env.DEBUG) && err instanceof Error && err.stack) {\n logger.error(err.stack);\n }\n return 1;\n }\n}\n\n/** Determines whether the current module is being directly executed as an application entrypoint. */\nexport function isDirectExecution(\n importMetaUrl: string = import.meta.url,\n argv1: string | undefined = process.argv[1],\n): boolean {\n if (!argv1) {\n return false;\n }\n const toPath = (urlStr: string): string => {\n try {\n if (urlStr.startsWith(\"file:\")) {\n return fileURLToPath(urlStr);\n }\n return urlStr;\n } catch (err) {\n logger.debug(\n `[cli] Failed to convert URL \"${urlStr}\" using fileURLToPath: ${err instanceof Error ? err.message : String(err)}`,\n );\n return urlStr.replace(/^file:\\/\\/\\/?/, \"\");\n }\n };\n\n try {\n const scriptPath = fs.realpathSync(path.resolve(argv1)).toLowerCase();\n const modulePath = fs.realpathSync(toPath(importMetaUrl)).toLowerCase();\n if (scriptPath === modulePath) {\n return true;\n }\n const moduleDir = path.dirname(modulePath);\n const cliJsPath = path.join(moduleDir, \"cli.js\").toLowerCase();\n const cliTsPath = path.join(moduleDir, \"cli.ts\").toLowerCase();\n if (scriptPath === cliJsPath || scriptPath === cliTsPath) {\n return true;\n }\n } catch (err) {\n logger.debug(\n `[cli] Failed to resolve realpath for entry detection: ${err instanceof Error ? err.message : String(err)}`,\n );\n const normArgv = path.resolve(argv1).toLowerCase();\n const normMeta = toPath(importMetaUrl).toLowerCase();\n if (normArgv === normMeta) {\n return true;\n }\n const normDir = path.dirname(normMeta);\n if (\n normArgv === path.join(normDir, \"cli.js\").toLowerCase() ||\n normArgv === path.join(normDir, \"cli.ts\").toLowerCase()\n ) {\n return true;\n }\n }\n return false;\n}\n\nif (isDirectExecution()) {\n runCLI()\n .then((code) => {\n process.exit(code);\n })\n .catch((err) => {\n logger.error(err);\n process.exit(1);\n });\n}\n"],"x_google_ignoreList":[2,3,4,5,6,7,11,29,30,31,32,33,34,35],"mappings":"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QAAQ,MAAM;CAC5C,eAAe,eAAe,QAAQ,MAAM;CAC5C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,OAAO;CAC5C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO,MAAM;CAC3C,eAAe,eAAe,OAAO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"}