Skip to content

Commit

Permalink
feature(plugin): rewrite
Browse files Browse the repository at this point in the history
  • Loading branch information
chiefmikey committed Sep 23, 2023
1 parent f318fc1 commit 64f92bf
Showing 1 changed file with 122 additions and 1 deletion.
123 changes: 122 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,122 @@
export { configs, rules } from './rules';
import fs from 'node:fs';
import path from 'node:path';

import appRoot from 'app-root-path';
import { Rule, Linter, AST, SourceCode } from 'eslint';
import ruleComposer from 'eslint-rule-composer';
import _ from 'lodash';

interface EslintPlugin {
rules: { [key: string]: Rule.RuleModule };
id: string;
}

interface Problem {
message: string;
messageId: string | undefined;
data: object | undefined;
loc: AST.SourceLocation;
fix: undefined;
}

interface Metadata {
sourceCode: SourceCode;
settings?: object;
filename: string;
}

interface DisabledRules {
[name: string]: Rule.RuleModule;
}

type Predicate<T> = (problem: Problem, metadata: Metadata) => T;

type MapReports = (
rule: Rule.RuleModule,
iteratee: Predicate<Problem>,
) => Rule.RuleModule;

const linter = new Linter();
const disabledRules: DisabledRules = {};
const dirname = appRoot.toString();
const nodeModules = 'node_modules/';
const importedPlugins = [];

const map = (ruleComposer as { mapReports: MapReports }).mapReports;

const disableMeta = (rule: Rule.RuleModule) => {
if (rule.meta?.fixable) {
delete rule.meta.fixable;
}
return rule;
};

const disableFix = (rule: Rule.RuleModule) => {
const disableReports = map(rule, (problem) => {
delete problem.fix;
return problem;
});
return disableMeta(disableReports);
};

const convertPluginId = (pluginId: string) => {
return pluginId.includes('@')
? // `@angular-eslint/eslint-plugin` -> `@angular-eslint`
// `@angular-eslint/eslint-plugin-template` -> `@angular-eslint/template`
pluginId.replace(/eslint-plugin(-|)/u, '').replace(/\/$/, '')
: // `eslint-plugin-react` -> `react`
pluginId.replace(/^eslint-plugin-/u, '');
};

const builtinRules = linter.getRules();
for (const [ruleId, rule] of builtinRules) {
disabledRules[ruleId] = disableFix(_.cloneDeep(rule));
}

const importPlugins = fs
.readdirSync(path.join(dirname, nodeModules))
.filter(
(plugin) =>
(plugin.startsWith('eslint-plugin') ||
(plugin.startsWith('@') && /eslint/u.test(plugin))) &&
plugin !== 'eslint-plugin-disable-autofix' &&
plugin !== '@eslint',
);

for (const plugin of importPlugins) {
if (plugin.includes('@')) {
const pluginDirectories = fs
.readdirSync(path.join(dirname, nodeModules, plugin))
.filter((read) => /plugin/u.test(read));
for (const pluginDirectory of pluginDirectories) {
const scopedPlugin = path.join(plugin, pluginDirectory);
const importedPlugin = require(scopedPlugin) as EslintPlugin;
importedPlugin.id = scopedPlugin.replace(
path.join(dirname, nodeModules),
'',
);
importedPlugins.push(importedPlugin);
}
} else {
const imported = require(plugin) as EslintPlugin;
imported.id = plugin;
importedPlugins.push(imported);
}
}

for (const plugin of importedPlugins) {
const pluginRules = plugin.rules || {};
const pluginId = plugin.id || '';
const pluginName = convertPluginId(pluginId);
for (const ruleId of Object.keys(pluginRules)) {
disabledRules[`${pluginName}/${ruleId}`] = disableFix(
_.cloneDeep(pluginRules[ruleId]),
);
}
}

const plugin = {
rules: disabledRules,
};

export default plugin;

0 comments on commit 64f92bf

Please sign in to comment.