UNPKG

@grnsft/if

Version:

Impact Framework

118 lines 14.9 kB
"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 (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.executeCommands = void 0; const path = __importStar(require("node:path")); const child_process_1 = require("child_process"); const fs_1 = require("../../common/util/fs"); const config_1 = require("../config"); const { IF_CHECK_VERIFIED } = config_1.STRINGS; /** * Escapes shell characters that could be dangerous in a command. */ const escapeShellArg = (str) => str.replace(/([`$\\&;|*?<>])/g, '\\$1'); /** * Executes a series of npm commands based on the provided manifest file. */ const executeCommands = async (manifest) => { // Determine if the npm command should be run globally const isGlobal = !!process.env.npm_config_global; // Get the directory path and file name of the manifest const manifestDirPath = path.dirname(manifest); const manifestFileName = (0, fs_1.getFileName)(manifest); // Create a path for the executed manifest file const executedManifest = path.join(manifestDirPath, `re-${manifestFileName}`); // Determine the prefix flag if the CURRENT_DIR environment variable is set and different from the current working directory const prefixFlag = process.env.CURRENT_DIR && process.env.CURRENT_DIR !== process.cwd() ? `--prefix=${path.relative(process.env.CURRENT_DIR, process.cwd())}` : ''; // Escape shell characters in the manifest paths const sanitizedManifest = escapeShellArg(manifest); const sanitizedExecutedManifest = escapeShellArg(executedManifest); // Construct the if-env command const ifEnvCommand = [ isGlobal ? 'if-env' : 'npm', ...(isGlobal ? [] : ['run', 'if-env']), isGlobal ? '' : '--', ...(prefixFlag === '' ? [] : [prefixFlag]), '-m', sanitizedManifest, ]; // Construct the if-run command const ifRunCommand = [ isGlobal ? 'if-run' : 'npm', ...(isGlobal ? [] : ['run', 'if-run']), isGlobal ? '' : '--', ...(prefixFlag === '' ? [] : [prefixFlag]), '-m', sanitizedManifest, '-o', sanitizedExecutedManifest, ]; // Construct the tty command to check if the process is running in a TTY context const ttyCommand = ['node', '-p', 'Boolean(process.stdout.isTTY)']; // Construct the if-diff command const ifDiffCommand = [ isGlobal ? 'if-diff' : 'npm', ...(isGlobal ? [] : ['run', 'if-diff']), isGlobal ? '' : '--', ...(prefixFlag === '' ? [] : [prefixFlag]), '-s', `${sanitizedExecutedManifest}.yaml`, '-t', sanitizedManifest, ]; const executionOptions = { cwd: process.env.CURRENT_DIR || process.cwd(), }; // Execute the if-env command (0, child_process_1.execFileSync)(ifEnvCommand[0], ifEnvCommand.slice(1), { ...executionOptions, shell: true, }); // Execute the if-run command (0, child_process_1.execFileSync)(ifRunCommand[0], ifRunCommand.slice(1), executionOptions); // Execute the tty command to check if the process is running in a TTY context (0, child_process_1.execFileSync)(ttyCommand[0], ttyCommand.slice(1), executionOptions); // Get the result of the tty command const ttyResult = (0, child_process_1.execFileSync)(ttyCommand[0], ttyCommand.slice(1), executionOptions); // Determine if the process is running in a TTY context const tty = ttyResult && ttyResult.toString().trim(); // Construct the full command to execute if-diff, optionally piping through tty const fullCommand = `${tty === 'true' ? 'tty |' : ''} ${ifDiffCommand.join(' ')}`; // Execute the full command (0, child_process_1.execFileSync)(fullCommand, { ...executionOptions, stdio: 'inherit', shell: true, }); // Remove the package.json file if it exists await (0, fs_1.removeFileIfExists)(`${manifestDirPath}/package.json`); // Remove the executed manifest file if it exists await (0, fs_1.removeFileIfExists)(`${executedManifest}.yaml`); console.log(IF_CHECK_VERIFIED(path.basename(manifest))); }; exports.executeCommands = executeCommands; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lmLWNoZWNrL3V0aWwvbnBtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQWtDO0FBQ2xDLGlEQUEyQztBQUMzQyw2Q0FBcUU7QUFDckUsc0NBQWtDO0FBRWxDLE1BQU0sRUFBQyxpQkFBaUIsRUFBQyxHQUFHLGdCQUFPLENBQUM7QUFFcEM7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUVoRjs7R0FFRztBQUNJLE1BQU0sZUFBZSxHQUFHLEtBQUssRUFBRSxRQUFnQixFQUFFLEVBQUU7SUFDeEQsc0RBQXNEO0lBQ3RELE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDO0lBQ2pELHVEQUF1RDtJQUN2RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSxnQkFBVyxFQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLCtDQUErQztJQUMvQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBRTlFLDRIQUE0SDtJQUM1SCxNQUFNLFVBQVUsR0FDZCxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsS0FBSyxPQUFPLENBQUMsR0FBRyxFQUFFO1FBQ2xFLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFD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RyxJQUFBLDRCQUFZLEVBQzVCLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFDYixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNuQixnQkFBZ0IsQ0FDakIsQ0FBQztJQUVGLHVEQUF1RDtJQUN2RCxNQUFNLEdBQUcsR0FBRyxTQUFTLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JELCtFQUErRTtJQUMvRSxNQUFNLFdBQVcsR0FBRyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQ3hFLEdBQUcsQ0FDSixFQUFFLENBQUM7SUFFSiwyQkFBMkI7SUFDM0IsSUFBQSw0QkFBWSxFQUFDLFdBQVcsRUFBRTtRQUN4QixHQUFHLGdCQUFnQjtRQUNuQixLQUFLLEVBQUUsU0FBUztRQUNoQixLQUFLLEVBQUUsSUFBSTtLQUNaLENBQUMsQ0FBQztJQUVILDRDQUE0QztJQUM1QyxNQUFNLElBQUEsdUJBQWtCLEVBQUMsR0FBRyxlQUFlLGVBQWUsQ0FBQyxDQUFDO0lBQzVELGlEQUFpRDtJQUNqRCxNQUFNLElBQUEsdUJBQWtCLEVBQUMsR0FBRyxnQkFBZ0IsT0FBTyxDQUFDLENBQUM7SUFFckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDLENBQUM7QUFuR1csUUFBQSxlQUFlLG1CQW1HMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge2V4ZWNGaWxlU3luY30gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge2dldEZpbGVOYW1lLCByZW1vdmVGaWxlSWZFeGlzdHN9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlsL2ZzJztcbmltcG9ydCB7U1RSSU5HU30gZnJvbSAnLi4vY29uZmlnJztcblxuY29uc3Qge0lGX0NIRUNLX1ZFUklGSUVEfSA9IFNUUklOR1M7XG5cbi8qKlxuICogRXNjYXBlcyBzaGVsbCBjaGFyYWN0ZXJzIHRoYXQgY291bGQgYmUgZGFuZ2Vyb3VzIGluIGEgY29tbWFuZC5cbiAqL1xuY29uc3QgZXNjYXBlU2hlbGxBcmcgPSAoc3RyOiBzdHJpbmcpID0+IHN0ci5yZXBsYWNlKC8oW2AkXFxcXCY7fCo/PD5dKS9nLCAnXFxcXCQxJyk7XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBzZXJpZXMgb2YgbnBtIGNvbW1hbmRzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBtYW5pZmVzdCBmaWxlLlxuICovXG5leHBvcnQgY29uc3QgZXhlY3V0ZUNvbW1hbmRzID0gYXN5bmMgKG1hbmlmZXN0OiBzdHJpbmcpID0+IHtcbiAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBucG0gY29tbWFuZCBzaG91bGQgYmUgcnVuIGdsb2JhbGx5XG4gIGNvbnN0IGlzR2xvYmFsID0gISFwcm9jZXNzLmVudi5ucG1fY29uZmlnX2dsb2JhbDtcbiAgLy8gR2V0IHRoZSBkaXJlY3RvcnkgcGF0aCBhbmQgZmlsZSBuYW1lIG9mIHRoZSBtYW5pZmVzdFxuICBjb25zdCBtYW5pZmVzdERpclBhdGggPSBwYXRoLmRpcm5hbWUobWFuaWZlc3QpO1xuICBjb25zdCBtYW5pZmVzdEZpbGVOYW1lID0gZ2V0RmlsZU5hbWUobWFuaWZlc3QpO1xuICAvLyBDcmVhdGUgYSBwYXRoIGZvciB0aGUgZXhlY3V0ZWQgbWFuaWZlc3QgZmlsZVxuICBjb25zdCBleGVjdXRlZE1hbmlmZXN0ID0gcGF0aC5qb2luKG1hbmlmZXN0RGlyUGF0aCwgYHJlLSR7bWFuaWZlc3RGaWxlTmFtZX1gKTtcblxuICAvLyBEZXRlcm1pbmUgdGhlIHByZWZpeCBmbGFnIGlmIHRoZSBDVVJSRU5UX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQgYW5kIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gIGNvbnN0IHByZWZpeEZsYWcgPVxuICAgIHByb2Nlc3MuZW52LkNVUlJFTlRfRElSICYmIHByb2Nlc3MuZW52LkNVUlJFTlRfRElSICE9PSBwcm9jZXNzLmN3ZCgpXG4gICAgICA/IGAtLXByZWZpeD0ke3BhdGgucmVsYXRpdmUocHJvY2Vzcy5lbnYuQ1VSUkVOVF9ESVIhLCBwcm9jZXNzLmN3ZCgpKX1gXG4gICAgICA6ICcnO1xuXG4gIC8vIEVzY2FwZSBzaGVsbCBjaGFyYWN0ZXJzIGluIHRoZSBtYW5pZmVzdCBwYXRoc1xuICBjb25zdCBzYW5pdGl6ZWRNYW5pZmVzdCA9IGVzY2FwZVNoZWxsQXJnKG1hbmlmZXN0KTtcbiAgY29uc3Qgc2FuaXRpemVkRXhlY3V0ZWRNYW5pZmVzdCA9IGVzY2FwZVNoZWxsQXJnKGV4ZWN1dGVkTWFuaWZlc3QpO1xuXG4gIC8vIENvbnN0cnVjdCB0aGUgaWYtZW52IGNvbW1hbmRcbiAgY29uc3QgaWZFbnZDb21tYW5kID0gW1xuICAgIGlzR2xvYmFsID8gJ2lmLWVudicgOiAnbnBtJyxcbiAgICAuLi4oaXNHbG9iYWwgPyBbXSA6IFsncnVuJywgJ2lmLWVudiddKSxcbiAgICBpc0dsb2JhbCA/ICcnIDogJy0tJyxcbiAgICAuLi4ocHJlZml4RmxhZyA9PT0gJycgPyBbXSA6IFtwcmVmaXhGbGFnXSksXG4gICAgJy1tJyxcbiAgICBzYW5pdGl6ZWRNYW5pZmVzdCxcbiAgXTtcblxuICAvLyBDb25zdHJ1Y3QgdGhlIGlmLXJ1biBjb21tYW5kXG4gIGNvbnN0IGlmUnVuQ29tbWFuZCA9IFtcbiAgICBpc0dsb2JhbCA/ICdpZi1ydW4nIDogJ25wbScsXG4gICAgLi4uKGlzR2xvYmFsID8gW10gOiBbJ3J1bicsICdpZi1ydW4nXSksXG4gICAgaXNHbG9iYWwgPyAnJyA6ICctLScsXG4gICAgLi4uKHByZWZpeEZsYWcgPT09ICcnID8gW10gOiBbcHJlZml4RmxhZ10pLFxuICAgICctbScsXG4gICAgc2FuaXRpemVkTWFuaWZlc3QsXG4gICAgJy1vJyxcbiAgICBzYW5pdGl6ZWRFeGVjdXRlZE1hbmlmZXN0LFxuICBdO1xuXG4gIC8vIENvbnN0cnVjdCB0aGUgdHR5IGNvbW1hbmQgdG8gY2hlY2sgaWYgdGhlIHByb2Nlc3MgaXMgcnVubmluZyBpbiBhIFRUWSBjb250ZXh0XG4gIGNvbnN0IHR0eUNvbW1hbmQgPSBbJ25vZGUnLCAnLXAnLCAnQm9vbGVhbihwcm9jZXNzLnN0ZG91dC5pc1RUWSknXTtcblxuICAvLyBDb25zdHJ1Y3QgdGhlIGlmLWRpZmYgY29tbWFuZFxuICBjb25zdCBpZkRpZmZDb21tYW5kID0gW1xuICAgIGlzR2xvYmFsID8gJ2lmLWRpZmYnIDogJ25wbScsXG4gICAgLi4uKGlzR2xvYmFsID8gW10gOiBbJ3J1bicsICdpZi1kaWZmJ10pLFxuICAgIGlzR2xvYmFsID8gJycgOiAnLS0nLFxuICAgIC4uLihwcmVmaXhGbGFnID09PSAnJyA/IFtdIDogW3ByZWZpeEZsYWddKSxcbiAgICAnLXMnLFxuICAgIGAke3Nhbml0aXplZEV4ZWN1dGVkTWFuaWZlc3R9LnlhbWxgLFxuICAgICctdCcsXG4gICAgc2FuaXRpemVkTWFuaWZlc3QsXG4gIF07XG5cbiAgY29uc3QgZXhlY3V0aW9uT3B0aW9ucyA9IHtcbiAgICBjd2Q6IHByb2Nlc3MuZW52LkNVUlJFTlRfRElSIHx8IHByb2Nlc3MuY3dkKCksXG4gIH07XG5cbiAgLy8gRXhlY3V0ZSB0aGUgaWYtZW52IGNvbW1hbmRcbiAgZXhlY0ZpbGVTeW5jKGlmRW52Q29tbWFuZFswXSwgaWZFbnZDb21tYW5kLnNsaWNlKDEpLCB7XG4gICAgLi4uZXhlY3V0aW9uT3B0aW9ucyxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgfSk7XG5cbiAgLy8gRXhlY3V0ZSB0aGUgaWYtcnVuIGNvbW1hbmRcbiAgZXhlY0ZpbGVTeW5jKGlmUnVuQ29tbWFuZFswXSwgaWZSdW5Db21tYW5kLnNsaWNlKDEpLCBleGVjdXRpb25PcHRpb25zKTtcblxuICAvLyBFeGVjdXRlIHRoZSB0dHkgY29tbWFuZCB0byBjaGVjayBpZiB0aGUgcHJvY2VzcyBpcyBydW5uaW5nIGluIGEgVFRZIGNvbnRleHRcbiAgZXhlY0ZpbGVTeW5jKHR0eUNvbW1hbmRbMF0sIHR0eUNvbW1hbmQuc2xpY2UoMSksIGV4ZWN1dGlvbk9wdGlvbnMpO1xuXG4gIC8vIEdldCB0aGUgcmVzdWx0IG9mIHRoZSB0dHkgY29tbWFuZFxuICBjb25zdCB0dHlSZXN1bHQgPSBleGVjRmlsZVN5bmMoXG4gICAgdHR5Q29tbWFuZFswXSxcbiAgICB0dHlDb21tYW5kLnNsaWNlKDEpLFxuICAgIGV4ZWN1dGlvbk9wdGlvbnNcbiAgKTtcblxuICAvLyBEZXRlcm1pbmUgaWYgdGhlIHByb2Nlc3MgaXMgcnVubmluZyBpbiBhIFRUWSBjb250ZXh0XG4gIGNvbnN0IHR0eSA9IHR0eVJlc3VsdCAmJiB0dHlSZXN1bHQudG9TdHJpbmcoKS50cmltKCk7XG4gIC8vIENvbnN0cnVjdCB0aGUgZnVsbCBjb21tYW5kIHRvIGV4ZWN1dGUgaWYtZGlmZiwgb3B0aW9uYWxseSBwaXBpbmcgdGhyb3VnaCB0dHlcbiAgY29uc3QgZnVsbENvbW1hbmQgPSBgJHt0dHkgPT09ICd0cnVlJyA/ICd0dHkgfCcgOiAnJ30gJHtpZkRpZmZDb21tYW5kLmpvaW4oXG4gICAgJyAnXG4gICl9YDtcblxuICAvLyBFeGVjdXRlIHRoZSBmdWxsIGNvbW1hbmRcbiAgZXhlY0ZpbGVTeW5jKGZ1bGxDb21tYW5kLCB7XG4gICAgLi4uZXhlY3V0aW9uT3B0aW9ucyxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHNoZWxsOiB0cnVlLFxuICB9KTtcblxuICAvLyBSZW1vdmUgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGlmIGl0IGV4aXN0c1xuICBhd2FpdCByZW1vdmVGaWxlSWZFeGlzdHMoYCR7bWFuaWZlc3REaXJQYXRofS9wYWNrYWdlLmpzb25gKTtcbiAgLy8gUmVtb3ZlIHRoZSBleGVjdXRlZCBtYW5pZmVzdCBmaWxlIGlmIGl0IGV4aXN0c1xuICBhd2FpdCByZW1vdmVGaWxlSWZFeGlzdHMoYCR7ZXhlY3V0ZWRNYW5pZmVzdH0ueWFtbGApO1xuXG4gIGNvbnNvbGUubG9nKElGX0NIRUNLX1ZFUklGSUVEKHBhdGguYmFzZW5hbWUobWFuaWZlc3QpKSk7XG59O1xuIl19