You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

172 lines
7.0 KiB

"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.serializeSuppression = exports.deleteBulkSuppressionsFileInEslintrcFolder = exports.writeSuppressionsJsonToFile = exports.getAllBulkSuppressionsConfigsByEslintrcFolderPath = exports.getSuppressionsConfigForEslintrcFolderPath = void 0;
const fs_1 = __importDefault(require("fs"));
const constants_1 = require("./constants");
const IS_RUNNING_IN_VSCODE = process.env[constants_1.VSCODE_PID_ENV_VAR_NAME] !== undefined;
const TEN_SECONDS_MS = 10 * 1000;
const SUPPRESSIONS_JSON_FILENAME = '.eslint-bulk-suppressions.json';
function throwIfAnythingOtherThanNotExistError(e) {
if ((e === null || e === void 0 ? void 0 : e.code) !== 'ENOENT') {
// Throw an error if any other error than file not found
throw e;
}
}
const suppressionsJsonByFolderPath = new Map();
function getSuppressionsConfigForEslintrcFolderPath(eslintrcFolderPath) {
const cachedSuppressionsConfig = suppressionsJsonByFolderPath.get(eslintrcFolderPath);
let shouldLoad;
let suppressionsConfig;
if (cachedSuppressionsConfig) {
shouldLoad = IS_RUNNING_IN_VSCODE && cachedSuppressionsConfig.readTime < Date.now() - TEN_SECONDS_MS;
suppressionsConfig = cachedSuppressionsConfig.suppressionsConfig;
}
else {
shouldLoad = true;
}
if (shouldLoad) {
const suppressionsPath = `${eslintrcFolderPath}/${SUPPRESSIONS_JSON_FILENAME}`;
let rawJsonFile;
try {
rawJsonFile = fs_1.default.readFileSync(suppressionsPath).toString();
}
catch (e) {
throwIfAnythingOtherThanNotExistError(e);
}
if (!rawJsonFile) {
suppressionsConfig = {
serializedSuppressions: new Set(),
jsonObject: { suppressions: [] },
newSerializedSuppressions: new Set(),
newJsonObject: { suppressions: [] }
};
}
else {
const jsonObject = JSON.parse(rawJsonFile);
validateSuppressionsJson(jsonObject);
const serializedSuppressions = new Set();
for (const suppression of jsonObject.suppressions) {
serializedSuppressions.add(serializeSuppression(suppression));
}
suppressionsConfig = {
serializedSuppressions,
jsonObject,
newSerializedSuppressions: new Set(),
newJsonObject: { suppressions: [] }
};
}
suppressionsJsonByFolderPath.set(eslintrcFolderPath, { readTime: Date.now(), suppressionsConfig });
}
return suppressionsConfig;
}
exports.getSuppressionsConfigForEslintrcFolderPath = getSuppressionsConfigForEslintrcFolderPath;
function getAllBulkSuppressionsConfigsByEslintrcFolderPath() {
const result = [];
for (const [eslintrcFolderPath, { suppressionsConfig }] of suppressionsJsonByFolderPath) {
result.push([eslintrcFolderPath, suppressionsConfig]);
}
return result;
}
exports.getAllBulkSuppressionsConfigsByEslintrcFolderPath = getAllBulkSuppressionsConfigsByEslintrcFolderPath;
function writeSuppressionsJsonToFile(eslintrcFolderPath, suppressionsConfig) {
suppressionsJsonByFolderPath.set(eslintrcFolderPath, { readTime: Date.now(), suppressionsConfig });
const suppressionsPath = `${eslintrcFolderPath}/${SUPPRESSIONS_JSON_FILENAME}`;
if (suppressionsConfig.jsonObject.suppressions.length === 0) {
deleteFile(suppressionsPath);
}
else {
suppressionsConfig.jsonObject.suppressions.sort(compareSuppressions);
fs_1.default.writeFileSync(suppressionsPath, JSON.stringify(suppressionsConfig.jsonObject, undefined, 2));
}
}
exports.writeSuppressionsJsonToFile = writeSuppressionsJsonToFile;
function deleteBulkSuppressionsFileInEslintrcFolder(eslintrcFolderPath) {
const suppressionsPath = `${eslintrcFolderPath}/${SUPPRESSIONS_JSON_FILENAME}`;
deleteFile(suppressionsPath);
}
exports.deleteBulkSuppressionsFileInEslintrcFolder = deleteBulkSuppressionsFileInEslintrcFolder;
function deleteFile(filePath) {
try {
fs_1.default.unlinkSync(filePath);
}
catch (e) {
throwIfAnythingOtherThanNotExistError(e);
}
}
function serializeSuppression({ file, scopeId, rule }) {
return `${file}|${scopeId}|${rule}`;
}
exports.serializeSuppression = serializeSuppression;
function compareSuppressions(a, b) {
if (a.file < b.file) {
return -1;
}
else if (a.file > b.file) {
return 1;
}
else if (a.scopeId < b.scopeId) {
return -1;
}
else if (a.scopeId > b.scopeId) {
return 1;
}
else if (a.rule < b.rule) {
return -1;
}
else if (a.rule > b.rule) {
return 1;
}
else {
return 0;
}
}
function validateSuppressionsJson(json) {
if (typeof json !== 'object') {
throw new Error(`Invalid JSON object: ${JSON.stringify(json, null, 2)}`);
}
if (!json) {
throw new Error('JSON object is null.');
}
const EXPECTED_ROOT_PROPERTY_NAMES = new Set(['suppressions']);
for (const propertyName of Object.getOwnPropertyNames(json)) {
if (!EXPECTED_ROOT_PROPERTY_NAMES.has(propertyName)) {
throw new Error(`Unexpected property name: ${propertyName}`);
}
}
const { suppressions } = json;
if (!suppressions) {
throw new Error('Missing "suppressions" property.');
}
if (!Array.isArray(suppressions)) {
throw new Error('"suppressions" property is not an array.');
}
const EXPECTED_SUPPRESSION_PROPERTY_NAMES = new Set(['file', 'scopeId', 'rule']);
for (const suppression of suppressions) {
if (typeof suppression !== 'object') {
throw new Error(`Invalid suppression: ${JSON.stringify(suppression, null, 2)}`);
}
if (!suppression) {
throw new Error(`Suppression is null: ${JSON.stringify(suppression, null, 2)}`);
}
for (const propertyName of Object.getOwnPropertyNames(suppression)) {
if (!EXPECTED_SUPPRESSION_PROPERTY_NAMES.has(propertyName)) {
throw new Error(`Unexpected property name: ${propertyName}`);
}
}
for (const propertyName of EXPECTED_SUPPRESSION_PROPERTY_NAMES) {
if (!suppression.hasOwnProperty(propertyName)) {
throw new Error(`Missing "${propertyName}" property in suppression: ${JSON.stringify(suppression, null, 2)}`);
}
else if (typeof suppression[propertyName] !== 'string') {
throw new Error(`"${propertyName}" property in suppression is not a string: ${JSON.stringify(suppression, null, 2)}`);
}
}
}
return true;
}
//# sourceMappingURL=bulk-suppressions-file.js.map