🎮
GraphQL Code Generator と Prisma の型マッピングを自動化する
GraphQL Code Generator を使ってresolverの型を生成するときにPrismaで生成されたモデルの型を使用したいが以下のように1つ1つ書くのは面倒なので自動で行われるようにしたい。
mappers:
Post: "@prisma/client/index.d#Post"
User: "@prisma/client/index.d#User"
結論
import fs from 'fs'
// ファイルを読み込み、指定された正規表現を使用してObjectTypeまたはモデル名を抽出
const extractData = (filename: string, regex: RegExp) => {
const data = fs.readFileSync(filename, 'utf-8')
return Array.from(data.matchAll(regex)).map((m) => m[1] ?? '')
}
// graphqlの型とprismaの型からマッパーを作成
const generatePrismaTypeMappers = () => {
const graphqlTypes = extractData('schema.graphql', /type (\w+) ?\{/g)
const prismaTypes = extractData('prisma/schema.prisma', /model (\w+) ?\{/g)
return Object.fromEntries(
graphqlTypes
.filter((t) => prismaTypes.includes(t))
.map((model) => [model, `@prisma/client/index.d#${model}`])
)
}
上の関数を使いたいので GraphQL Code Generator の設定ファイルはTSファイルにする。
codegen.ts
config: {
mappers: generatePrismaTypeMappers(),
}
Discussion