crapifyme
Version:
Ultra-fast developer productivity CLI tools - remove comments, logs, and more
161 lines • 6.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PreservationRuleManager = void 0;
const preservation_rules_1 = require("./preservation-rules");
const types_1 = require("./types");
class PreservationRuleManager {
constructor() {
this.rules = [];
this.initializeDefaultRules();
}
addRule(rule) {
this.rules.push(rule);
this.sortRulesByPriority();
}
removeRule(name) {
const initialLength = this.rules.length;
this.rules = this.rules.filter(rule => rule.name !== name);
return this.rules.length < initialLength;
}
getRules() {
return [...this.rules];
}
getRulesByCategory(category) {
return this.rules.filter(rule => rule.category === category);
}
classifyComment(comment) {
for (const rule of this.rules) {
if (rule.matches(comment)) {
return {
category: rule.category,
rule,
shouldPreserve: true,
metadata: rule.extractMetadata(comment)
};
}
}
return {
category: types_1.CommentCategory.REGULAR,
rule: null,
shouldPreserve: false,
metadata: {}
};
}
shouldPreserveComment(comment) {
return this.classifyComment(comment).shouldPreserve;
}
addCustomPattern(name, pattern, priority = 100) {
try {
const regex = new RegExp(pattern, 'i');
const rule = new preservation_rules_1.CustomPreservationRule(name, regex, priority, `Custom pattern: ${pattern}`, pattern);
this.addRule(rule);
}
catch (error) {
throw new Error(`Invalid regex pattern: ${pattern}`);
}
}
clearRules() {
this.rules = [];
}
resetToDefaults() {
this.clearRules();
this.initializeDefaultRules();
}
sortRulesByPriority() {
this.rules.sort((a, b) => b.priority - a.priority);
}
initializeDefaultRules() {
this.addFrameworkRules();
this.addDevelopmentRules();
this.addToolingRules();
this.addDocumentationRules();
}
addFrameworkRules() {
this.addRule(new preservation_rules_1.FrameworkPreservationRule('svelte-ignore', /svelte-ignore\s+[\w_-]+/i, 900, 'Svelte ignore directives', 'Svelte'));
this.addRule(new preservation_rules_1.FrameworkPreservationRule('vue-eslint-disable', /<!--\s*eslint-disable/i, 900, 'Vue.js ESLint disable comments', 'Vue'));
this.addRule(new preservation_rules_1.FrameworkPreservationRule('jsx-pragma', /@jsx\s+\w+/, 900, 'React/JSX pragma comments', 'React'));
this.addRule(new preservation_rules_1.FrameworkPreservationRule('typescript-reference', /\/\/\/\s*<reference\s+(path|types|lib|no-default-lib)=/, 900, 'TypeScript reference directives', 'TypeScript'));
this.addRule(new preservation_rules_1.FrameworkPreservationRule('webpack-magic', /webpack(ChunkName|Mode|Prefetch|Preload|Ignore|Include|Exclude|Exports):/i, 900, 'Webpack magic comments', 'Webpack'));
}
addDevelopmentRules() {
const keywords = ['TODO', 'FIXME', 'HACK', 'NOTE', 'XXX', 'BUG', 'WARN', 'WARNING'];
this.addRule(new preservation_rules_1.DevelopmentPreservationRule('development-keywords', new RegExp(`\\b(${keywords.join('|')})\\b`, 'i'), 700, 'Development keywords (TODO, FIXME, etc.)', keywords));
}
addToolingRules() {
this.addRule(new preservation_rules_1.ToolingPreservationRule('eslint-directives', /eslint-(disable|enable)(-next-line)?/i, 800, 'ESLint directives', 'ESLint'));
this.addRule(new preservation_rules_1.ToolingPreservationRule('prettier-ignore', /prettier-ignore/i, 800, 'Prettier ignore comments', 'Prettier'));
this.addRule(new preservation_rules_1.ToolingPreservationRule('typescript-ignore', /@ts-(ignore|expect-error|nocheck)\b/i, 800, 'TypeScript ignore comments', 'TypeScript'));
this.addRule(new preservation_rules_1.ToolingPreservationRule('coverage-ignore', /(istanbul|c8)\s+ignore/i, 800, 'Code coverage ignore comments', 'Coverage'));
}
addDocumentationRules() {
const jsdocTags = [
'param',
'returns?',
'return',
'throws?',
'throw',
'example',
'since',
'author',
'see',
'todo',
'override',
'readonly',
'static',
'private',
'public',
'protected',
'abstract',
'final',
'namespace',
'module',
'class',
'interface',
'typedef',
'callback',
'enum',
'memberof',
'inner',
'instance',
'global',
'ignore',
'fileoverview',
'deprecated',
'description',
'summary',
'version',
'license',
'copyright',
'constructor',
'extends',
'implements',
'mixes',
'augments',
'borrows',
'lends',
'requires',
'external',
'event',
'fires',
'listens',
'mixin',
'variation',
'kind',
'constant',
'default',
'defaultvalue',
'type',
'this',
'async',
'generator',
'hideconstructor',
'inheritdoc',
'inner',
'jsx',
'react'
];
this.addRule(new preservation_rules_1.DocumentationPreservationRule('jsdoc', new RegExp(`@(${jsdocTags.join('|')})\\b`, 'i'), 750, 'JSDoc comments with @ annotations'));
}
}
exports.PreservationRuleManager = PreservationRuleManager;
//# sourceMappingURL=rule-manager.js.map