release-checker
Version:
Check your release before publishing
148 lines (147 loc) • 5.88 kB
JavaScript
;
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;