USB Type C ケーブル 【1m+1m+2m+2m/4本】タイプc ケーブル PD対応 60W急速充電】データ転送 断線防止 高耐久ナイロン iPhone 16 /iPhone 15 / MacBook、iPad Pro/Air、Galaxy、Sony、Pixel Type C機種対応
¥798 (2025年4月26日 13:05 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)Anker PowerLine III Flow USB-C & USB-C ケーブル Anker絡まないケーブル 100W 結束バンド付き USB PD対応 シリコン素材採用 iPhone 16 / 15 / Galaxy iPad Pro MacBook Pro/Air 各種対応 (1.8m ミッドナイトブラック)
¥1,890 (2025年4月26日 13:07 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)USB C ケーブル タイプc 1M/2M 各2本 PD対応 60W超急速充電 断線防止 高速データ転送 Type-C to Type-Cケーブル for iPhone 16/15 Pro/Plus/Pro Max MacBook iPad Galaxy Sony Google Pixel 7a等USB-C各種対応
¥699 (2025年4月26日 13:05 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の一般的な問題ですね。他にも良いやり方がある気はするんですが、こういうパターンもあったということを書いておきます。