UNPKG

@textlint/kernel

Version:
111 lines (101 loc) 3.83 kB
import { TextlintKernelFilterRule, TextlintKernelOptions, TextlintKernelPlugin, TextlintKernelRule } from "../textlint-kernel-interface.js"; import { TextlintRuleDescriptors } from "./TextlintRuleDescriptors.js"; import { TextlintPluginDescriptors } from "./TextlintPluginDescriptors.js"; import { TextlintFilterRuleDescriptors } from "./TextlintFilterRuleDescriptors.js"; import { createTextlintFilterRuleDescriptors, createTextlintPluginDescriptors, createTextlintRuleDescriptors } from "./DescriptorsFactory.js"; import { TextlintPluginDescriptor } from "./TextlintPluginDescriptor.js"; export interface TextlintKernelDescriptorArgs { // config base directory configBaseDir?: string; rules: TextlintKernelRule[]; filterRules: TextlintKernelFilterRule[]; plugins: TextlintKernelPlugin[]; } export class TextlintKernelDescriptor { readonly rule: TextlintRuleDescriptors; readonly filterRule: TextlintFilterRuleDescriptors; readonly plugin: TextlintPluginDescriptors; readonly configBaseDir?: string; constructor(private args: TextlintKernelDescriptorArgs) { this.rule = createTextlintRuleDescriptors(args.rules); this.filterRule = createTextlintFilterRuleDescriptors(args.filterRules); this.plugin = createTextlintPluginDescriptors(args.plugins); this.configBaseDir = args.configBaseDir; } /** * Return available extensions of plugins */ get availableExtensions(): string[] { return this.plugin.availableExtensions; } /** * Merge constructor args and partialArgs * It shallow merge partialArgs. * It means that overwrite own properties by partialArgs. */ shallowMerge(partialArgs: Partial<TextlintKernelDescriptorArgs>): TextlintKernelDescriptor { return new TextlintKernelDescriptor({ ...this.args, ...partialArgs }); } /** * Concat descriptors * If A.concat(B), A is base, B is added * Note: withoutDuplicated pick A from [A, B] If A and B have same ruleId. * @param other */ concat(other: TextlintKernelDescriptor): TextlintKernelDescriptor { return new TextlintKernelDescriptor({ configBaseDir: other.configBaseDir ?? this.configBaseDir, rules: this.rule.toKernelRulesFormat().concat(other.rule.toKernelRulesFormat()), filterRules: this.filterRule .toKernelFilterRulesFormat() .concat(other.filterRule.toKernelFilterRulesFormat()), plugins: this.plugin.toKernelPluginsFormat().concat(other.plugin.toKernelPluginsFormat()) }); } /** * find PluginDescriptor with extension. * This is forward match. * * If following config of textlint, this method prefer to select MarkdownA for markdown. * * { * "plugins": [MarkdownA, MarkdownB] * } * * @param extension file extension (e.g. ".md", ".txt") */ findPluginDescriptorWithExt(extension: string): TextlintPluginDescriptor | undefined { return this.plugin.findPluginDescriptorWithExt(extension); } /** * Convert descriptor to TextlintKernelOptions */ toKernelOptions(): Pick<TextlintKernelOptions, "configBaseDir" | "rules" | "filterRules" | "plugins"> { return { configBaseDir: this.configBaseDir, rules: this.rule.toKernelRulesFormat(), filterRules: this.filterRule.toKernelFilterRulesFormat(), plugins: this.plugin.toKernelPluginsFormat() }; } toJSON() { return { rule: this.rule.toJSON(), filterRule: this.filterRule.toJSON(), plugin: this.plugin.toJSON(), configBaseDir: this.configBaseDir }; } }