"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.detectRuntime = detectRuntime;
exports.which = which;
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const securityEnhanced_1 = require("./securityEnhanced");
const RUNTIME_MAP = {
".py": { name: "python", executable: "python3", extension: ".py" },
".js": { name: "node", executable: "node", extension: ".js" },
".ts": { name: "node", executable: "node", extension: ".ts" },
".bash": { name: "bash", executable: "bash", extension: ".bash" },
".sh": { name: "bash", executable: "bash", extension: ".sh" },
".ps1": { name: "pwsh", executable: "pwsh", extension: ".ps1" },
".psm1": { name: "pwsh", executable: "pwsh", extension: ".psm1" },
".psd1": { name: "pwsh", executable: "pwsh", extension: ".psd1" },
".java": { name: "java", executable: "java", extension: ".java" },
".rb": { name: "ruby", executable: "ruby", extension: ".rb" },
".go": { name: "go", executable: "go", extension: ".go" },
".rs": { name: "rust", executable: "rustc", extension: ".rs" },
};
/**
* Detect runtime language from a file extension.
*/
function detectRuntime(filePath) {
const ext = path.extname(filePath).toLowerCase();
const info = RUNTIME_MAP[ext];
if (info)
return info;
// Fallback: check shebang
try {
const content = fs.readFileSync((0, securityEnhanced_1.expandPath)(filePath), "utf8");
const shebang = content.split("\n")[0];
if (shebang.startsWith("#!/bin/bash") || shebang.startsWith("#!/bin/sh"))
return { name: "bash", executable: "bash", extension: ext };
if (shebang.startsWith("#!/usr/bin/env python"))
return { name: "python", executable: "python3", extension: ext };
if (shebang.startsWith("#!/usr/bin/env node"))
return { name: "node", executable: "node", extension: ext };
if (shebang.startsWith("#!/usr/bin/env pwsh"))
return { name: "pwsh", executable: "pwsh", extension: ext };
}
catch { /* ignore */ }
return { name: "unknown", executable: "unknown", extension: ext };
}
/**
* Resolve the full path of an executable in PATH.
*/
function which(executable) {
const which = require("child_process").execSync;
try {
const platform = require("os").platform();
const cmd = platform === "win32" ? `where ${executable}` : `which ${executable}`;
const result = which(cmd, { encoding: "utf8", timeout: 3000 }).trim();
const lines = result.split("\n").filter((l) => l.trim());
return lines.length > 0 ? lines[lines.length - 1].trim() : null;
}
catch {
return null;
}
}
//# sourceMappingURL=runtimeResolver.js.map