【Prisma】npx prisma db seedが実行できなかった2つの原因を掘り下げていく
モチベーション
開発初期はnpx prisma db seed
を実行できていたのに途中から動かなくなってしまった。原因特定から解決までをどのように辿っていったのかメモしていく。
※npx prisma db seed
については下記を参照しています。
ts-nodeでエイリアスを有効にしていなかった
npx prisma db seedを実行したところ次のエラーが発生した
Error: Cannot find module '@/functions/constants/metedatas'
tsconfig.jsonで設定しているはずのパスエイリアスが有効になっていないっぽい。調査してみると同様のエラーに関するisuueを見つけた。
解決するためにはtsconfig-pathsを使ってパスエイリアスを有効にする必要があるらしい。
ts-nodeは単体ではパスエイリアスに対応してないっぽいissueもあった
"prisma": {
"seed": "ts-node -r tsconfig-paths/register --compiler-options {\"module\":\"CommonJS\"} prisma/seed.ts",
},
上記のようにコマンドを変更して「ts-nodeでエイリアスを有効にしていなかった」エラーは解決したが新しいエラーが発生した
tsconfig.jsonでのvalueに配列を使っていた
エラー内容の通りts-node/dist/util.js:62
でエラーが発生しているっぽい
/Users/user-name/Documents/code/app-name/node_modules/ts-node/dist/util.js:62
return value.replace(backslashRegExp, directorySeparator);
以下は実際のエラー箇所の中身
const directorySeparator = '/';
const backslashRegExp = /\\/g;
/**
* Replace backslashes with forward slashes.
* @internal
*/
function normalizeSlashes(value) {
return value.replace(backslashRegExp, directorySeparator);
}
exports.normalizeSlashes = normalizeSlashes;
ここからは過去の実装内容を反芻して原因を予想してみる。
そもそもvalue.replace(backslashRegExp, directorySeparator);
でエラーが起きている時点でstring以外が入っている可能性が高い。
ts-nodeのエラーになるのでtsconfig.jsonの中で最近stringから変更した箇所があったっけ?と見てみると...あった。
{
"extends": ["@tsconfig/strictest/tsconfig", "@tsconfig/next/tsconfig"],
"compilerOptions": {...},
...
}
次のスクラップ記事にtsconfig/basesの詳細はまとめているが、tsconfig/basesを導入するにあたってTypeScript v5.0.0から提供されるようになった「複数の構成を一度に拡張できる機能(Supporting Multiple Configuration Files in extends
)」を使っているからだった。
tsconfig/basesの紹介記事
そもそも「複数の構成を一度に拡張できる機能(Supporting Multiple Configuration Files in extends
)」にts-nodeが対応しきれていないのではないかと調査してみると同様のisuueを見つけた。(類似のissueもある)
tsconfig/basesに関しては試験的に入れていただけなのでこだわりはなく、一旦strictestだけを有効にする方針にした。これで解決。
{
"extends": "@tsconfig/strictest/tsconfig",
"compilerOptions": {...},
...
}
まとめ
- ts-nodeでエイリアスを有効にしていなかった
- tsconfig.jsonでのvalueに配列を使っていた
Prisma
とtsconfig/bases
を使用している方は注意する必要がありそうですね。この記事がどなたかの参考になりましたら幸いです。
Discussion