UNPKG

prisma-trpc-generator

Version:

Prisma 2+ generator to emit fully implemented tRPC routers

157 lines 7.28 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.configSchema = void 0; const zod_1 = require("zod"); // Accept booleans and boolean-like strings const booleanLike = zod_1.z .union([zod_1.z.boolean(), zod_1.z.enum(['true', 'false'])]) .transform((val) => (typeof val === 'string' ? JSON.parse(val) : val)); // Middleware/shield can be boolean (enabled/disabled) or a string path const configMiddleware = zod_1.z.union([booleanLike, zod_1.z.string()]); const configShield = zod_1.z.union([booleanLike, zod_1.z.string()]); // Metadata configuration for tRPC procedures const metaConfig = zod_1.z.object({ openapi: booleanLike.optional().default(true), // Generate OpenAPI-compatible metadata auth: booleanLike.optional().default(false), // Generate authentication metadata description: booleanLike.optional().default(true), // Generate procedure descriptions customPath: zod_1.z.string().optional(), // Path to custom metadata configuration file defaultMeta: zod_1.z.record(zod_1.z.string(), zod_1.z.any()).optional().default({}), // Default metadata applied to all procedures }); const configMeta = zod_1.z.union([booleanLike, metaConfig]); // Define model actions directly since DMMF.ModelAction is not available at runtime const ModelAction = { findFirst: 'findFirst', findFirstOrThrow: 'findFirstOrThrow', findMany: 'findMany', findUnique: 'findUnique', findUniqueOrThrow: 'findUniqueOrThrow', create: 'create', createMany: 'createMany', createManyAndReturn: 'createManyAndReturn', update: 'update', updateMany: 'updateMany', updateManyAndReturn: 'updateManyAndReturn', upsert: 'upsert', delete: 'delete', deleteMany: 'deleteMany', aggregate: 'aggregate', groupBy: 'groupBy', count: 'count', findRaw: 'findRaw', aggregateRaw: 'aggregateRaw', }; const modelActionEnum = zod_1.z.nativeEnum(ModelAction); // Service layer configuration (opt-in) const serviceStyleEnum = zod_1.z.enum(['class', 'factory', 'plain']); const additionalImportSpec = zod_1.z.object({ from: zod_1.z.string(), names: zod_1.z.array(zod_1.z.string()).optional(), default: zod_1.z.string().optional(), namespace: zod_1.z.string().optional(), }); const authStrategyEnum = zod_1.z.enum(['session', 'jwt', 'custom']); const authConfig = zod_1.z.object({ strategy: authStrategyEnum.optional().default('session'), rolesField: zod_1.z.string().optional().default('role'), jwt: zod_1.z .object({ header: zod_1.z.string().optional().default('authorization'), scheme: zod_1.z.string().optional().default('Bearer'), secretEnv: zod_1.z.string().optional().default('JWT_SECRET'), verifyPath: zod_1.z.string().optional(), // path to module exporting verifyToken(token, secret): any getUserFromPayloadPath: zod_1.z.string().optional(), // path to module exporting getUserFromPayload(payload): any }) .optional(), session: zod_1.z .object({ getUserPath: zod_1.z.string().optional(), // path to module exporting getUser(req): any }) .optional(), custom: zod_1.z .object({ resolverPath: zod_1.z.string().optional(), // path to module exporting resolveUser(req): any }) .optional(), }); exports.configSchema = zod_1.z.object({ // Defaults: middleware/shield on by default; can be a path string to custom impls withMiddleware: configMiddleware.optional().default(true), // README: default false withShield: configShield.optional().default(false), withZod: booleanLike.optional().default(true), // Date/DateTime field handling strategy for Zod schemas dateTimeStrategy: zod_1.z .enum(['date', 'coerce', 'isoString']) .optional() .default('date'), // tRPC metadata support for OpenAPI, auth, descriptions, etc. withMeta: configMeta.optional().default(false), contextPath: zod_1.z.string().default('../../../../src/context'), // README default trpcOptionsPath: zod_1.z.string().optional().default('../../../../src/trpcOptions'), // Postman collection emission postman: zod_1.z .union([ booleanLike, zod_1.z.object({ endpoint: zod_1.z.string().optional().default('http://localhost:3000/trpc'), envName: zod_1.z.string().optional().default('TRPC_ENDPOINT'), fromOpenApi: booleanLike.optional().default(false), // Examples mode for request bodies in generated collection examples: zod_1.z.enum(['none', 'skeleton']).optional().default('none'), }), ]) .optional() .default(false), // OpenAPI emission (opt-in) openapi: zod_1.z .union([ booleanLike, zod_1.z.object({ enabled: booleanLike.optional().default(true), title: zod_1.z.string().optional().default('Prisma tRPC API'), version: zod_1.z.string().optional().default('1.0.0'), baseUrl: zod_1.z.string().optional().default('http://localhost:3000'), pathPrefix: zod_1.z.string().optional().default('trpc'), pathStyle: zod_1.z.enum(['slash', 'dot']).optional().default('slash'), includeExamples: booleanLike.optional().default(true), }), ]) .optional() .default(false), // Flat fallbacks for OpenAPI fine-tuning (Prisma config is flat key-value) openapiTitle: zod_1.z.string().optional(), openapiVersion: zod_1.z.string().optional(), openapiBaseUrl: zod_1.z.string().optional(), openapiPathPrefix: zod_1.z.string().optional(), openapiPathStyle: zod_1.z.enum(['slash', 'dot']).optional(), openapiIncludeExamples: booleanLike.optional(), // Flat fallback for Postman fromOpenApi toggle postmanFromOpenApi: booleanLike.optional(), // Flat alternative for configuring Postman examples (since Prisma generator config is flat key-value) postmanExamples: zod_1.z.enum(['none', 'skeleton']).optional().default('none'), // Request ID + logging withRequestId: booleanLike.optional().default(false), withLogging: booleanLike.optional().default(false), // Auth (session/JWT/custom) basic guard and strategy hooks auth: zod_1.z.union([booleanLike, authConfig]).optional().default(false), // README options (currently not used in generation, but accepted) isGenerateSelect: booleanLike.optional().default(false), isGenerateInclude: booleanLike.optional().default(false), showModelNameInProcedure: booleanLike.optional().default(true), generateModelActions: zod_1.z .string() .default(Object.values(ModelAction).join(',')) .transform((arg) => { return arg .split(',') .map((action) => modelActionEnum.parse(action.trim())); }), // Service layer (optional) withServices: booleanLike.optional().default(false), serviceStyle: serviceStyleEnum.optional().default('class'), serviceDir: zod_1.z.string().optional().default('services'), withListMethod: booleanLike.optional().default(true), serviceImports: zod_1.z.array(additionalImportSpec).optional().default([]), }); //# sourceMappingURL=config.js.map