業務内で改善活動の一環としてStylelintのPluginを実装する機会があり、プライベートでもオリジナルのものを作りたくなった。そこで今回はシンプルな「line-height
の単位にpx
を使用するのを禁止する」というRuleを実装してみる。
ちなみに公式Docの例はVanilla JSで書かれているが、今回はTypeScriptで実装する。
0. 環境構築
プロジェクトを作成し、上記のように各ライブラリ・TypeScript・Jestの設定を行う。
それから今回は上記のようにrules
ディレクトリ下に各Ruleをクラスとして作成していく。
1. Ruleの抽象クラスを実装
各Ruleの基底クラスを実装する。
- Rule名
- 警告のメッセージ
- 重大度(デフォルトでは
error
)
の指定を必須とし、それぞれのRuleクラスでvalidate
メソッドに判定のロジックを書いていく。
また各Ruleクラス内で警告を出す際に呼ぶreport()
を実装しておく。
2. Ruleの実装
先程の`BaseRuleクラスを継承し、今回の目的のRuleを実装する。
PostCSS.Nodeにはwalkxxx
という便利なメソッドが生えており、Rule
・AtRule
・Declaration
・Comment
といったtypeを指定しつつ探索できるので非常に便利。
上記ではwalkDecls()
でline-height
というプロパティを使用しているDeclaration
に絞りつつ、値がpx
の場合にreport()
を呼んでいる。
3. Ruleをexportする
これでRuleを外部から参照できるようになった。
もし今後別のRuleを追加していく場合は上記のようにRuleを追加していけばよい。
4. テストの実装
jest-preset-stylelintというStylelintのPluginをテストするためのJestプリセットがあるので、これを利用することで非常に簡単にRule毎の検証ができる。
4-1. 共通処理の実装
4-2. Ruleを検証する
accept
・reject
それぞれにテストケースとなるCSSを記載
- SCSSを対象とする場合
customSyntax: 'postcss-scss'
の指定が必須
npm run test
してみると、無事にline-height
のpx指定がrejectされることが確認できた。
5. Pluginとして導入
今回作ったPluginとRuleを実際に利用してみる。
npm install
後にbuildされるようにnpm-scriptsに追記する。
次に実際にStylelintを導入しているプロジェクトにて、今回実装したパッケージをインストールする。
Stylelintのconfigファイルのplugins
・rules
に今回のものを追記すれば設定完了。
実際にCSSを書いてみると、今回実装したRuleが無事に警告されることが確認できた。