【1m+1m+2m 3本/黒】RAMPOW usb c ケーブル タイプc ケーブル QC3.0対応高速充電 データ転送USB2.0規格 iPhone 16/16e 充電ケーブル/iPhone 15 充電ケーブル Sony Xperia/Samsung/Asus Zenfone/Fujitsu Arrows/PS5コントローラー タイプc多機種対応 在宅勤務支援
¥999 (2025年4月26日 13:07 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)新版 iphone 【MFi認証】ライトニングケーブル 2M 3本セット 充電器 ケーブル 最大2.4A急速充電 lightning 断線防止 超高耐久 iPhone14/14 Pro/14 ProMax/13/13 Pro/12/12 ProMax/11/X/8/iPad/AirPods/MacBookなど各種対応
¥799 (2025年4月26日 13:09 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)
tsconfig.jsonのpaths設定でimport文にエイリアスを使えるようにしたものの、
- tscでトランスパイルするとエイリアス形式のパスは変換されない
- パスの変換のためにtsconfig-pathsなどの追加ライブラリが必要で、ビルドコマンドが冗長になる
- jestなどはpathsを反映するために追加設定が必要
などで微妙な気持ちになってきたことはありませんか。
一度導入すると利用箇所が結構多くなってきて手動で戻すには大変すぎるし、まあ動いてるからいいか…みたいな。
そんな時のために自動で相対パスに戻せるeslintプラグインを作ってみました。
やめ方
@mkizka/eslint-plugin-relative-import を入れてeslint --fix
するだけ。
設定は↓のような感じです。
import { relativeImport } from "@mkizka/eslint-plugin-relative-import";
export default [relativeImport({ alias: { "~": "./app" } })];
.eslintrcにも対応しています。
{
"plugins": ["@mkizka/relative-import"],
"rules": {
"@mkizka/relative-import/no-path-alias": [
"error",
{ "alias": { "~": "./app" } }
]
}
}
eslint --fix
を実行すると以下のように変換されます。
-import { prisma } from "~/server/service/prisma";
-import { createLogger } from "~/utils/logger";
-import { tryCatch } from "~/utils/tryCatch";
+import { prisma } from "../prisma";
+import { createLogger } from "../../../utils/logger";
+import { tryCatch } from "../../../utils/tryCatch";
変換した後は型チェックやテストなどで元の動作が変わっていないことを十分に確認してください。
TypeScriptかつESMで困ったところ
作ってみた、だけで終わりそうなのでTypeScriptかつESMでeslintプラグインを作ってみた知見も置いておきます。
今回プラグインを作るにあたってeslintrcとCommonJSにも対応させてみたのですが、CommonJSへの変換で少し困ることがありました。
公式ドキュメントの解説を読むとプラグインは以下のようなオブジェクトをdefault exportする必要があるようです。
export default {
meta: {},
configs: {},
rules: {},
};
ただしビルド設定(例えば今回使用したtsup)によっては、CJSのビルド結果が以下のようになります。
var index_exports = {};
__export(index_exports, {
default: () => index_default,
});
module.exports = __toCommonJS(index_exports);
これはmodule.exports = { default: { ... } }
でありdefault
が余計なためか、この状態だとeslintrcでは読み込むことが出来ませんでした。
そこで以下のように書くと動作しました。
export const rules = { ... }
これをビルドすると以下のようになっています。
var index_exports = {};
__export(index_exports, {
rules: () => rules,
});
module.exports = __toCommonJS(index_exports);
これによってFlat Config向けの設定のnamed exportと、eslintrc向けのrulesフィールドを1ファイルで両立することが出来ました。relative-importでは以下のようにしています。
eslintというよりESM/CJSの一般的な問題ですね。他にも良いやり方がある気はするんですが、こういうパターンもあったということを書いておきます。