🎮

GraphQL Code Generator と Prisma の型マッピングを自動化する

2023/05/25に公開

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(),
}

https://the-guild.dev/graphql/codegen/docs/config-reference/codegen-config

Discussion