{
  "version": 3,
  "sources": ["../../src/runtime/languages.ts"],
  "sourcesContent": ["import { delimiter, join } from \"node:path\";\nimport {\n\tdirectMatch,\n\tformatVersion,\n\tMAX_METADATA_FILE_BYTES,\n\toptionString,\n\toptionStrings,\n\tpathName,\n\trunBounded,\n\tsafeMetadata,\n} from \"./helpers.js\";\nimport type { CollectorContext, MutableModuleSnapshot } from \"./types.js\";\n\nconst LANGUAGE_NAMES = [\"nodejs\", \"python\", \"rust\", \"golang\", \"bun\", \"deno\"] as const;\ntype LanguageName = (typeof LANGUAGE_NAMES)[number];\n\nconst DEFAULT_DETECTION: Record<\n\tLanguageName,\n\t{ files: string[]; extensions: string[]; folders: string[] }\n> = {\n\tnodejs: {\n\t\tfiles: [\n\t\t\t\"package.json\",\n\t\t\t\".node-version\",\n\t\t\t\".nvmrc\",\n\t\t\t\"!bun.lock\",\n\t\t\t\"!bun.lockb\",\n\t\t\t\"!deno.json\",\n\t\t\t\"!deno.jsonc\",\n\t\t],\n\t\textensions: [\"js\", \"mjs\", \"cjs\", \"ts\", \"mts\", \"cts\"],\n\t\tfolders: [\"node_modules\"],\n\t},\n\tpython: {\n\t\tfiles: [\"pyproject.toml\", \"requirements.txt\", \"Pipfile\", \"poetry.lock\", \".python-version\"],\n\t\textensions: [\"py\"],\n\t\tfolders: [\".venv\", \"venv\"],\n\t},\n\trust: { files: [\"Cargo.toml\"], extensions: [\"rs\"], folders: [] },\n\tgolang: { files: [\"go.mod\", \"go.sum\", \"go.work\"], extensions: [\"go\"], folders: [] },\n\tbun: { files: [\"bun.lock\", \"bun.lockb\", \"bunfig.toml\"], extensions: [], folders: [] },\n\tdeno: { files: [\"deno.json\", \"deno.jsonc\", \"deno.lock\"], extensions: [], folders: [] },\n};\n\nexport async function collectLanguages(context: CollectorContext): Promise<MutableModuleSnapshot> {\n\tconst result: MutableModuleSnapshot = {};\n\tif (!LANGUAGE_NAMES.some((name) => context.needs(name))) return result;\n\tconst entries = await context.entries();\n\tfor (const name of LANGUAGE_NAMES) {\n\t\tif (!context.needs(name)) continue;\n\t\tconst defaults = DEFAULT_DETECTION[name];\n\t\tconst files = optionStrings(context, name, \"detect_files\");\n\t\tconst extensions = optionStrings(context, name, \"detect_extensions\");\n\t\tconst folders = optionStrings(context, name, \"detect_folders\");\n\t\tif (\n\t\t\t!directMatch(\n\t\t\t\tentries,\n\t\t\t\tfiles.length > 0 ? files : defaults.files,\n\t\t\t\textensions.length > 0 ? extensions : defaults.extensions,\n\t\t\t\tfolders.length > 0 ? folders : defaults.folders,\n\t\t\t)\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst values: Record<string, string> = {};\n\t\taddEnvironmentValues(context, name, values);\n\t\tif (context.needs(name, \"engines_version\")) {\n\t\t\tconst engine = await readNodeEngine(context);\n\t\t\tif (engine) values.engines_version = engine;\n\t\t}\n\t\tconst needsVersion = context.needs(name, \"version\");\n\t\tconst needsNumver = name === \"rust\" && context.needs(name, \"numver\");\n\t\tif (needsVersion || needsNumver) {\n\t\t\tconst command = await versionCommand(context, name);\n\t\t\tif (command) {\n\t\t\t\tconst output = await runBounded(context, command[0], command[1]);\n\t\t\t\tconst version = output ? parseRuntimeVersion(name, output) : undefined;\n\t\t\t\tif (version) {\n\t\t\t\t\tif (needsVersion) {\n\t\t\t\t\t\tvalues.version = formatVersion(version, optionString(context, name, \"version_format\"));\n\t\t\t\t\t}\n\t\t\t\t\tif (needsNumver) values.numver = version.replace(/^v/u, \"\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tresult[name] = values;\n\t}\n\treturn result;\n}\n\nfunction addEnvironmentValues(\n\tcontext: CollectorContext,\n\tname: LanguageName,\n\tvalues: Record<string, string>,\n): void {\n\tconst env = context.input.environment;\n\tif (name === \"python\") {\n\t\tconst virtualenv = safeMetadata(env.VIRTUAL_ENV ?? env.CONDA_DEFAULT_ENV);\n\t\tif (virtualenv && context.needs(name, \"virtualenv\")) values.virtualenv = pathName(virtualenv);\n\t\tconst pyenv = safeMetadata(env.PYENV_VERSION);\n\t\tif (pyenv && context.needs(name, \"pyenv_prefix\")) values.pyenv_prefix = pyenv;\n\t}\n\tif (name === \"rust\") {\n\t\tconst toolchain = safeMetadata(env.RUSTUP_TOOLCHAIN);\n\t\tif (toolchain && context.needs(name, \"toolchain\")) values.toolchain = toolchain;\n\t}\n}\n\nasync function readNodeEngine(context: CollectorContext): Promise<string | undefined> {\n\tconst source = await context.fs.readFile(\n\t\tjoin(context.input.cwd, \"package.json\"),\n\t\tMAX_METADATA_FILE_BYTES,\n\t);\n\tif (!source) return undefined;\n\ttry {\n\t\tconst document = JSON.parse(source) as { engines?: { node?: unknown } };\n\t\treturn safeMetadata(document.engines?.node, 80);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nasync function versionCommand(\n\tcontext: CollectorContext,\n\tname: LanguageName,\n): Promise<[string, string[]] | undefined> {\n\tswitch (name) {\n\t\tcase \"nodejs\":\n\t\t\treturn [\"node\", [\"--version\"]];\n\t\tcase \"python\": {\n\t\t\tconst virtualenv = safeMetadata(context.input.environment.VIRTUAL_ENV);\n\t\t\tif (virtualenv) {\n\t\t\t\tconst candidate = join(\n\t\t\t\t\tvirtualenv,\n\t\t\t\t\tcontext.input.platform === \"win32\" ? \"Scripts/python.exe\" : \"bin/python\",\n\t\t\t\t);\n\t\t\t\tif (await context.fs.fileExists(candidate)) return [candidate, [\"--version\"]];\n\t\t\t}\n\t\t\treturn [\"python\", [\"--version\"]];\n\t\t}\n\t\tcase \"rust\": {\n\t\t\tconst rustc = await safeRustCompiler(context);\n\t\t\treturn rustc ? [rustc, [\"--version\"]] : undefined;\n\t\t}\n\t\tcase \"golang\":\n\t\t\treturn [\"go\", [\"version\"]];\n\t\tcase \"bun\":\n\t\t\treturn [\"bun\", [\"--version\"]];\n\t\tcase \"deno\":\n\t\t\treturn [\"deno\", [\"-V\"]];\n\t}\n}\n\nasync function safeRustCompiler(context: CollectorContext): Promise<string | undefined> {\n\tconst candidates = [\n\t\tcontext.input.environment.RUSTC,\n\t\t...(context.input.environment.PATH ?? \"\")\n\t\t\t.split(delimiter)\n\t\t\t.filter(Boolean)\n\t\t\t.map((directory) =>\n\t\t\t\tjoin(directory, context.input.platform === \"win32\" ? \"rustc.exe\" : \"rustc\"),\n\t\t\t),\n\t];\n\tfor (const rawCandidate of candidates) {\n\t\tconst candidate = safeMetadata(rawCandidate, 1_024);\n\t\tif (!candidate || /(?:^|[\\\\/])\\.(?:cargo|rustup)(?:[\\\\/]|$)/iu.test(candidate)) continue;\n\t\tif (await context.fs.fileExists(candidate)) return candidate;\n\t}\n\treturn undefined;\n}\n\nexport function parseRuntimeVersion(name: LanguageName, output: string): string | undefined {\n\tconst normalized = output.trim();\n\tif (\n\t\t!normalized ||\n\t\tnormalized.includes(\"\\n\") ||\n\t\tnormalized.includes(\"\\r\") ||\n\t\tnormalized.includes(\"\uFFFD\")\n\t) {\n\t\treturn undefined;\n\t}\n\tlet match: RegExpExecArray | null;\n\tswitch (name) {\n\t\tcase \"nodejs\":\n\t\t\tmatch = /^v(\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?)$/u.exec(normalized);\n\t\t\tbreak;\n\t\tcase \"python\":\n\t\t\tmatch = /^Python (\\d+\\.\\d+(?:\\.\\d+)?(?:[0-9A-Za-z.+-]*)?)$/u.exec(normalized);\n\t\t\tbreak;\n\t\tcase \"rust\":\n\t\t\tmatch = /^rustc (\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?)(?: .*)?$/u.exec(normalized);\n\t\t\tbreak;\n\t\tcase \"golang\":\n\t\t\tmatch = /^go version go(\\d+\\.\\d+(?:\\.\\d+)?(?:[0-9A-Za-z.+-]*))(?:\\s+.*)?$/u.exec(normalized);\n\t\t\tbreak;\n\t\tcase \"bun\":\n\t\t\tmatch = /^(\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?)$/u.exec(normalized);\n\t\t\tbreak;\n\t\tcase \"deno\":\n\t\t\tmatch = /^(?:deno\\s+)?(\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?)$/u.exec(normalized);\n\t\t\tbreak;\n\t}\n\tconst version = match?.[1];\n\treturn version ? `v${version}` : undefined;\n}\n"],
  "mappings": "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",
  "names": []
}
