🦔

import { promises as fs } from "fs"; を禁止するESLintルール

2022/07/17に公開

少し前にNode.js v12がEoLを迎えましたね。つまりライブラリ開発者は堂々とv12のサポートを切ってv14の機能を使うことができるようになったということです。

v14から使えるようになった機能の一つとしてfs/promsiesエイリアスがあります。今までは

import { promsies as fs } from "node:fs";

のようにしてfsの非同期APIを使っていましたが、Node.js v14からは

import fs from "node:fs/promises";

のようにして直接非同期APIをimport/requireできます。

参考:

https://shisama.hatenablog.com/entry/2020/04/22/011221#fs-add-fspromises-alias-module

どちらの書き方でも同じ意味なのでどっちでも良いのですが、プロジェクト内では統一しておきたいところです。

ということでESLintルールを書きました。めんどくさいのでauto-fixはなしです。

"use strict";

const selector = [
  "ImportDeclaration",
  "[specifiers.length=1]",
  '[source.value="node:fs"]',
  ">",
  "ImportSpecifier:first-child",
  '[imported.name="promises"]',
].join("");

const messageId = "prefer-fs-promises";

module.exports = {
  meta: {
    type: "suggestion",
    messages: {
      [messageId]:
        'Prefer `import fs from "node:fs/promises"` instead of `import { promises as fs } from "fs";`',
    },
  },
  create(context) {
    return {
      [selector](node) {
        context.report({
          node,
          messageId,
        });
      },
    };
  },
};

このルールは自分の関わっているプロジェクトで最低限上手く機能するようになっているので、お好みでselector部分をいじっていい感じにしてください。

Discussion