import type { Config, ConfigObject, OptionsForRule, Plugin, Rule, RuleNames, Severity } from '@steiger/types' export function enableAllRules>( plugin: Plugin, options?: { severity: Exclude }, ): [Plugin, ConfigObject] { return [ plugin, { rules: Object.fromEntries(plugin.ruleDefinitions.map((rule) => [rule.name, options?.severity ?? 'error'])) as { [key in RuleNames]?: Severity | [Severity, OptionsForRule] }, }, ] } export function enableSpecificRules>( plugin: Plugin, rulesToEnable: Rules, options?: { severity: Exclude }, ): [Plugin, ConfigObject] { const namesOfRulesToEnable = rulesToEnable.map((ruleToEnable) => ruleToEnable.name) return [ plugin, { rules: Object.fromEntries( plugin.ruleDefinitions .filter((rule) => namesOfRulesToEnable.includes(rule.name)) .map((rule) => [rule.name, options?.severity ?? 'error']), ) as { [key in RuleNames]?: Severity | [Severity, OptionsForRule] }, }, ] } export function createConfigs = Array, Keys extends string = string>( configs: Record>, ): Record> { return configs } if (import.meta.vitest) { const { it, expect } = import.meta.vitest it('enables only specific rules with the given severity', () => { type TestContext = unknown const mockPlugin: Plugin = { meta: { name: 'test', version: '0.0.0', }, ruleDefinitions: [ { name: 'ruleA', check: () => ({ diagnostics: [] }), }, { name: 'ruleB', check: () => ({ diagnostics: [] }), }, { name: 'ruleC', check: () => ({ diagnostics: [] }), }, ], } const rulesToEnable = [ { name: 'ruleA', check: () => ({ diagnostics: [] }), }, { name: 'ruleC', check: () => ({ diagnostics: [] }), }, ] const [plugin, config] = enableSpecificRules(mockPlugin, rulesToEnable, { severity: 'warn' }) expect(plugin).toEqual(mockPlugin) expect(config).toEqual({ rules: { ruleA: 'warn', ruleC: 'warn', }, }) }) }