How TypeScript, Zod, Prisma, and GraphQL Codegen enable type sharing across frontend and backend in monorepos