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
172 lines
7.0 KiB
2 months ago
|
"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
|