prisma-trpc-generator
Version:
Prisma 2+ generator to emit fully implemented tRPC routers
157 lines • 7.28 kB
JavaScript
"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