Skip to content

Latest commit

 

History

History
155 lines (121 loc) · 3.55 KB

rule-preset.md

File metadata and controls

155 lines (121 loc) · 3.55 KB
id title
rule-preset
Creating Preset

"preset" is a collection of rules and rulesConfig.

The basic source code format for a preset is:

module.exports = {
    rules: {
        "no-todo": require("textlint-rule-no-todo").default
    },
    rulesConfig: {
        "no-todo": true
    }
};
  • "rules" is rule creator object.
  • "rulesConfig" is rule config object for "rules".

Example

e.g.) "textlint-rule-preset-gizmo"

textlint-rule-preset-gizmo includes the following rules:

  • ruleA
  • ruleB

textlint-rule-preset-gizmo.js:

module.exports = {
    rules: {
        ruleA: require("textlint-rule-A"),
        ruleB: require("textlint-rule-B")
    },
    rulesConfig: {
        ruleA: true,
        ruleB: true
    }
};

Usage of "textlint-rule-preset-gizmo":

.textlintrc.json

{
    "rules": {
        "preset-gizmo": {
            "ruleA": false
            /* ruleB's options is defined by preset-gizmo */
        }
    }
}

Recommended: use @textlint/module-interop for loading external package.

When require external textlint rule package, you should use @textlint/module-interop instead of require function. Because, some rule package expose exports.default instead of exports. That .default property is generated by ES2015+ transpiler like Babel, TypeScript.

@textlint/module-interop help to load both of exports.default and exports.

const { moduleInterop } = require("@textlint/module-interop");
module.exports = {
    rules: {
        ruleA: moduleInterop(require("textlint-rule-external-A")),
        ruleB: moduleInterop(require("@scope/textlint-rule-external-B"))
    },
    rulesConfig: {
        ruleA: true,
        ruleB: true
    }
};

Of course, If you use Babel or TypeScript(with esModuleInterop option), you can just use import statement. These transpiler wrap require function with interop helper function automatically.

import RuleA from "textlint-rule-external-A";
// It will be transpiled to `const RuleA = __importDefault(require("textlint-rule-external-A"))`
import RuleB from "@scope/textlint-rule-external-B";
// It will be transpiled to `const RuleB = __importDefault(require("textlint-rule-external-B"))`
module.exports = {
    rules: {
        ruleA: RuleA,
        ruleB: RuleB
    },
    rulesConfig: {
        ruleA: true,
        ruleB: true
    }
};

Publishing

If you want to publish your textlint rule preset, see following documents.

Package Naming Conventions

textlint rule package naming should have textlint-rule-preset- prefix.

  • textlint-rule-preset-<name>
  • @scope/textlint-rule-preset-<name>

Example: textlint-rule-preset-example

textlint user use it following:

{
    "rules": {
        "preset-example": true
    }
}

Example: @textlint-rule/textlint-rule-preset-google-developer

textlint user use it following:

{
    "rules": {
        "@textlint-rule/preset-google-developer": true
    }
}

Keywords

You should add textlintrule to npm's keywords

{
  "name": "textlint-rule-preset-foo-bar",
  "description": "Your preset of rules description",
  "version": "1.0.1",
  "keywords": [
    "textlintrule"
  ]
}