🙄

【Prisma】npx prisma db seedが実行できなかった2つの原因を掘り下げていく

2024/01/28に公開

モチベーション

開発初期はnpx prisma db seedを実行できていたのに途中から動かなくなってしまった。原因特定から解決までをどのように辿っていったのかメモしていく。

npx prisma db seedについては下記を参照しています。

https://www.prisma.io/docs/guides/migrate/seed-database

ts-nodeでエイリアスを有効にしていなかった

npx prisma db seedを実行したところ次のエラーが発生した

エラー内容
Error: Cannot find module '@/functions/constants/metedatas'

tsconfig.jsonで設定しているはずのパスエイリアスが有効になっていないっぽい。調査してみると同様のエラーに関するisuueを見つけた。

解決するためにはtsconfig-pathsを使ってパスエイリアスを有効にする必要があるらしい。

ts-nodeは単体ではパスエイリアスに対応してないっぽいissueもあった

package.json
  "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);

以下は実際のエラー箇所の中身

ts-node/dist/util.js
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以外が入っている可能性が高い。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace

ts-nodeのエラーになるのでtsconfig.jsonの中で最近stringから変更した箇所があったっけ?と見てみると...あった。

tsconfig.json
{
  "extends": ["@tsconfig/strictest/tsconfig", "@tsconfig/next/tsconfig"],
  "compilerOptions": {...},
  ...
}

次のスクラップ記事にtsconfig/basesの詳細はまとめているが、tsconfig/basesを導入するにあたってTypeScript v5.0.0から提供されるようになった「複数の構成を一度に拡張できる機能(Supporting Multiple Configuration Files in extends)」を使っているからだった。

tsconfig/basesの紹介記事

https://zenn.dev/shuuuuuun/scraps/48ac73aeb3076c

そもそも「複数の構成を一度に拡張できる機能(Supporting Multiple Configuration Files in extends)」にts-nodeが対応しきれていないのではないかと調査してみると同様のisuueを見つけた。(類似のissueもある)

tsconfig/basesに関しては試験的に入れていただけなのでこだわりはなく、一旦strictestだけを有効にする方針にした。これで解決。

tsconfig.json
{
  "extends": "@tsconfig/strictest/tsconfig",
  "compilerOptions": {...},
  ...
}

まとめ

  • ts-nodeでエイリアスを有効にしていなかった
  • tsconfig.jsonでのvalueに配列を使っていた

Prismatsconfig/basesを使用している方は注意する必要がありそうですね。この記事がどなたかの参考になりましたら幸いです。

参考記事

Discussion