| "use strict"; | |
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | |
| if (k2 === undefined) k2 = k; | |
| Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | |
| }) : (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 (mod) { | |
| if (mod && mod.__esModule) return mod; | |
| var result = {}; | |
| if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | |
| __setModuleDefault(result, mod); | |
| return result; | |
| }; | |
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | |
| function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | |
| return new (P || (P = Promise))(function (resolve, reject) { | |
| function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | |
| function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | |
| function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | |
| step((generator = generator.apply(thisArg, _arguments || [])).next()); | |
| }); | |
| }; | |
| var _a; | |
| Object.defineProperty(exports, "__esModule", { value: true }); | |
| exports.getCmdPath = exports.tryGetExecutablePath = exports.isRooted = exports.isDirectory = exports.exists = exports.READONLY = exports.UV_FS_O_EXLOCK = exports.IS_WINDOWS = exports.unlink = exports.symlink = exports.stat = exports.rmdir = exports.rm = exports.rename = exports.readlink = exports.readdir = exports.open = exports.mkdir = exports.lstat = exports.copyFile = exports.chmod = void 0; | |
| const fs = __importStar(require("fs")); | |
| const path = __importStar(require("path")); | |
| _a = fs.promises | |
| // export const {open} = 'fs' | |
| , exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.open = _a.open, exports.readdir = _a.readdir, exports.readlink = _a.readlink, exports.rename = _a.rename, exports.rm = _a.rm, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink; | |
| // export const {open} = 'fs' | |
| exports.IS_WINDOWS = process.platform === 'win32'; | |
| // See https://github.com/nodejs/node/blob/d0153aee367422d0858105abec186da4dff0a0c5/deps/uv/include/uv/win.h#L691 | |
| exports.UV_FS_O_EXLOCK = 0x10000000; | |
| exports.READONLY = fs.constants.O_RDONLY; | |
| function exists(fsPath) { | |
| return __awaiter(this, void 0, void 0, function* () { | |
| try { | |
| yield exports.stat(fsPath); | |
| } | |
| catch (err) { | |
| if (err.code === 'ENOENT') { | |
| return false; | |
| } | |
| throw err; | |
| } | |
| return true; | |
| }); | |
| } | |
| exports.exists = exists; | |
| function isDirectory(fsPath, useStat = false) { | |
| return __awaiter(this, void 0, void 0, function* () { | |
| const stats = useStat ? yield exports.stat(fsPath) : yield exports.lstat(fsPath); | |
| return stats.isDirectory(); | |
| }); | |
| } | |
| exports.isDirectory = isDirectory; | |
| /** | |
| * On OSX/Linux, true if path starts with '/'. On Windows, true for paths like: | |
| * \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases). | |
| */ | |
| function isRooted(p) { | |
| p = normalizeSeparators(p); | |
| if (!p) { | |
| throw new Error('isRooted() parameter "p" cannot be empty'); | |
| } | |
| if (exports.IS_WINDOWS) { | |
| return (p.startsWith('\\') || /^[A-Z]:/i.test(p) // e.g. \ or \hello or \\hello | |
| ); // e.g. C: or C:\hello | |
| } | |
| return p.startsWith('/'); | |
| } | |
| exports.isRooted = isRooted; | |
| /** | |
| * Best effort attempt to determine whether a file exists and is executable. | |
| * @param filePath file path to check | |
| * @param extensions additional file extensions to try | |
| * @return if file exists and is executable, returns the file path. otherwise empty string. | |
| */ | |
| function tryGetExecutablePath(filePath, extensions) { | |
| return __awaiter(this, void 0, void 0, function* () { | |
| let stats = undefined; | |
| try { | |
| // test file exists | |
| stats = yield exports.stat(filePath); | |
| } | |
| catch (err) { | |
| if (err.code !== 'ENOENT') { | |
| // eslint-disable-next-line no-console | |
| console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); | |
| } | |
| } | |
| if (stats && stats.isFile()) { | |
| if (exports.IS_WINDOWS) { | |
| // on Windows, test for valid extension | |
| const upperExt = path.extname(filePath).toUpperCase(); | |
| if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) { | |
| return filePath; | |
| } | |
| } | |
| else { | |
| if (isUnixExecutable(stats)) { | |
| return filePath; | |
| } | |
| } | |
| } | |
| // try each extension | |
| const originalFilePath = filePath; | |
| for (const extension of extensions) { | |
| filePath = originalFilePath + extension; | |
| stats = undefined; | |
| try { | |
| stats = yield exports.stat(filePath); | |
| } | |
| catch (err) { | |
| if (err.code !== 'ENOENT') { | |
| // eslint-disable-next-line no-console | |
| console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); | |
| } | |
| } | |
| if (stats && stats.isFile()) { | |
| if (exports.IS_WINDOWS) { | |
| // preserve the case of the actual file (since an extension was appended) | |
| try { | |
| const directory = path.dirname(filePath); | |
| const upperName = path.basename(filePath).toUpperCase(); | |
| for (const actualName of yield exports.readdir(directory)) { | |
| if (upperName === actualName.toUpperCase()) { | |
| filePath = path.join(directory, actualName); | |
| break; | |
| } | |
| } | |
| } | |
| catch (err) { | |
| // eslint-disable-next-line no-console | |
| console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`); | |
| } | |
| return filePath; | |
| } | |
| else { | |
| if (isUnixExecutable(stats)) { | |
| return filePath; | |
| } | |
| } | |
| } | |
| } | |
| return ''; | |
| }); | |
| } | |
| exports.tryGetExecutablePath = tryGetExecutablePath; | |
| function normalizeSeparators(p) { | |
| p = p || ''; | |
| if (exports.IS_WINDOWS) { | |
| // convert slashes on Windows | |
| p = p.replace(/\//g, '\\'); | |
| // remove redundant slashes | |
| return p.replace(/\\\\+/g, '\\'); | |
| } | |
| // remove redundant slashes | |
| return p.replace(/\/\/+/g, '/'); | |
| } | |
| // on Mac/Linux, test the execute bit | |
| // R W X R W X R W X | |
| // 256 128 64 32 16 8 4 2 1 | |
| function isUnixExecutable(stats) { | |
| return ((stats.mode & 1) > 0 || | |
| ((stats.mode & 8) > 0 && stats.gid === process.getgid()) || | |
| ((stats.mode & 64) > 0 && stats.uid === process.getuid())); | |
| } | |
| // Get the path of cmd.exe in windows | |
| function getCmdPath() { | |
| var _a; | |
| return (_a = process.env['COMSPEC']) !== null && _a !== void 0 ? _a : `cmd.exe`; | |
| } | |
| exports.getCmdPath = getCmdPath; | |
| //# sourceMappingURL=io-util.js.map |