UNPKG

release-checker

Version:
148 lines (147 loc) 5.88 kB
"use strict"; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result["default"] = mod; return result; }; Object.defineProperty(exports, "__esModule", { value: true }); var fs_1 = require("fs"); var globMatching = __importStar(require("micromatch")); var os_1 = require("os"); var path_1 = require("path"); var exec_sync_1 = require("../../utils/exec-sync"); var fs_2 = require("../../utils/fs"); var npm_infos_1 = require("../../utils/npm-infos"); exports.sensitiveDataChecker = { canRun: function () { return npm_infos_1.currentNpmVersion() .canReportInJson() .packCommand(); }, cliOption: '--sensitivedata', id: 'sensivitive-data-checker', run: function () { return validate(); }, shortCliOption: '-s', statusToDisplayWhileValidating: 'Checking for the sensitive and non-essential data in the npm package', whyCannotRun: function () { return "Cannot check sensitive and non-essential data because npm version is " + npm_infos_1.getCurrentNpmVersion() + ". Upgrade npm to version 5.9.0 or above to enable this check."; }, }; function validate() { var validationErrorsAndWarnings = []; var npmPackagesInfos = createPackageAndReadAsJson(); var allSensitiveDataPatterns = getSensitiveData(); npmPackagesInfos.forEach(function (npmPackageInfos) { npmPackageInfos.files .map(function (fileInfo) { return fileInfo.path; }) .filter(function (path) { return packagedFile(path).isSensitiveData(allSensitiveDataPatterns); }) .forEach(function (path) { validationErrorsAndWarnings.push({ reason: "Sensitive or non essential data found in npm package: " + path, severity: 'error', }); }); }); npmPackagesInfos.forEach(function (npmPackageInfos) { fs_2.removeFile(npmPackageInfos.filename).fromDirectory(process.cwd()); }); return validationErrorsAndWarnings; } function getLogFilepath() { var tempFolder = os_1.tmpdir(); var currentFolder = process.cwd(); var projectName = currentFolder.split(path_1.sep).pop(); var packLogFilename = "npm-pack-" + projectName.trim().replace(/'\s'/g, '-') + ".log"; var logFilepath = path_1.join(tempFolder, packLogFilename); return logFilepath; } function createPackageAndReadAsJson() { var logFilepath = getLogFilepath(); var command = "npm pack --json > " + logFilepath; exec_sync_1.execOrThrow(command); var content = fs_1.readFileSync(logFilepath).toString(); try { var extractedJson = extractJsonDataFrom(content); var result = JSON.parse(extractedJson); return result; } catch (error) { throw new Error("cannot parse to JSON the content of file: " + logFilepath); } } exports.createPackageAndReadAsJson = createPackageAndReadAsJson; function extractJsonDataFrom(content) { for (var index = 0; index <= content.length - 1; index++) { try { var extractedContent = content.substr(index); JSON.parse(extractedContent); return extractedContent; } catch (error) { continue; } } throw new Error('Cannot extract JSON data'); } exports.extractJsonDataFrom = extractJsonDataFrom; function getSensitiveData() { if (fs_2.file('.sensitivedata').existsInDirectory(process.cwd())) { return readSensitiveDataIn(process.cwd()); } return readSensitiveDataIn(__dirname); } exports.getSensitiveData = getSensitiveData; function readSensitiveDataIn(directory) { var sensitiveDataFile = path_1.join(directory, '.sensitivedata'); var content = fs_1.readFileSync(sensitiveDataFile).toString(); var allPatterns = content .split(/\n|\r/) .map(function (line) { return line.replace(/[\t]/g, ' '); }) .map(function (line) { return line.trim(); }) .filter(function (line) { return line && line.length > 0; }) .filter(function (line) { return !line.startsWith('#'); }); var sensitiveData = allPatterns.filter(function (pattern) { return !pattern.startsWith('!'); }); var ignoredData = allPatterns .filter(function (pattern) { return pattern.startsWith('!'); }) .map(function (pattern) { return pattern.replace('!', ''); }) .map(function (pattern) { return pattern.trim(); }); return { ignoredData: ignoredData, sensitiveData: sensitiveData }; } exports.readSensitiveDataIn = readSensitiveDataIn; function packagedFile(filepath) { return { isSensitiveData: function (allSensitiveDataPatterns) { if (filepath && allSensitiveDataPatterns && allSensitiveDataPatterns.ignoredData && globMatching.any(filepath, allSensitiveDataPatterns.ignoredData, { matchBase: true, nocase: true, })) { return false; } if (filepath && allSensitiveDataPatterns && allSensitiveDataPatterns.sensitiveData && globMatching.any(filepath, allSensitiveDataPatterns.sensitiveData, { matchBase: true, nocase: true, })) { return true; } return false; }, }; } exports.packagedFile = packagedFile; function ejectSensitiveData() { if (fs_2.file('.sensitivedata').existsInDirectory(process.cwd())) { return; } fs_2.copyFile('.sensitivedata') .fromDirectory(__dirname) .toDirectory(process.cwd()); } exports.ejectSensitiveData = ejectSensitiveData;