UNPKG

@velopays/prisma-crud-generator

Version:

Generate CRUD operations and tests from Prisma models for NestJS

170 lines 8.14 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.main = main; const commander_1 = require("commander"); const path = __importStar(require("path")); const fs = __importStar(require("fs-extra")); const chalk_1 = __importDefault(require("chalk")); const generator_1 = require("./generator"); const program = new commander_1.Command(); program .name('prisma-crud') .description('Generate CRUD operations and tests from Prisma models') .version(require('../package.json').version); program .command('generate') .description('Generate CRUD files for all models') .option('-s, --schema <path>', 'Path to Prisma schema file') .option('-o, --output <path>', 'Output directory for generated files') .option('-p, --prefix <prefix>', 'API prefix') .option('--no-swagger', 'Disable Swagger decorators') .option('-t, --templates <path>', 'Path to custom templates directory') .option('-n, --schema-name <name>', 'Schema name for organizing generated files') .option('--client-path <path>', 'Path to generated Prisma client (for multi-file schema support)') .option('-c, --config <path>', 'Path to configuration file', 'prisma-crud.config.json') .action(async (options) => { try { let config; // Try to load config file first const configPath = path.resolve(options.config); if (fs.existsSync(configPath)) { console.log(chalk_1.default.blue(`Loading config from ${configPath}...`)); const fileConfig = await fs.readJson(configPath); // Merge CLI options with file config (CLI options take precedence) config = { prismaSchemaPath: options.schema ? path.resolve(options.schema) : path.resolve(fileConfig.schema), outputPath: options.output ? path.resolve(options.output) : path.resolve(fileConfig.output), apiPrefix: options.prefix ?? fileConfig.apiPrefix ?? 'api', swaggerEnabled: options.swagger ?? fileConfig.swaggerEnabled ?? true, customTemplatesPath: options.templates ? path.resolve(options.templates) : fileConfig.customTemplatesPath ? path.resolve(fileConfig.customTemplatesPath) : undefined, schemaName: options.schemaName ?? fileConfig.schemaName, clientPath: options.clientPath ? path.resolve(options.clientPath) : fileConfig.clientPath ? path.resolve(fileConfig.clientPath) : undefined, generateCommonFiles: fileConfig.generateCommonFiles ?? true, generateRootModules: fileConfig.generateRootModules ?? true, includeRelationsInCreateDto: fileConfig.includeRelationsInCreateDto ?? false, includeRelationsInQueryDto: fileConfig.includeRelationsInQueryDto ?? false, imports: fileConfig.imports, schemaMap: fileConfig.schemaMap, }; } else if (options.schema && options.output) { // Use CLI options only config = { prismaSchemaPath: path.resolve(options.schema), outputPath: path.resolve(options.output), apiPrefix: options.prefix ?? 'api', swaggerEnabled: options.swagger ?? true, customTemplatesPath: options.templates ? path.resolve(options.templates) : undefined, schemaName: options.schemaName, clientPath: options.clientPath ? path.resolve(options.clientPath) : undefined, }; } else { console.error(chalk_1.default.red('Error: Either provide a config file or specify --schema and --output options')); console.error(chalk_1.default.yellow('Run "prisma-crud init" to create a config file')); process.exit(1); } // Validate schema file exists if (!fs.existsSync(config.prismaSchemaPath)) { console.error(chalk_1.default.red(`Prisma schema file not found: ${config.prismaSchemaPath}`)); process.exit(1); } // Create output directory if it doesn't exist await fs.ensureDir(config.outputPath); console.log(chalk_1.default.blue('🚀 Starting CRUD generation...')); console.log(chalk_1.default.gray(`Schema: ${config.prismaSchemaPath}`)); console.log(chalk_1.default.gray(`Output: ${config.outputPath}`)); console.log(chalk_1.default.gray(`API Prefix: ${config.apiPrefix}`)); console.log(chalk_1.default.gray(`Swagger: ${config.swaggerEnabled}`)); const prismaGenerator = new generator_1.PrismaCrudGenerator(config); await prismaGenerator.generate(); console.log(chalk_1.default.gray(`Schema name: ${prismaGenerator.getSchemaName()}`)); console.log(chalk_1.default.green('✅ CRUD generation completed successfully!')); } catch (error) { console.error(chalk_1.default.red('Error:'), error.message); process.exit(1); } }); program .command('init') .description('Initialize configuration file') .action(async () => { const configPath = path.resolve('prisma-crud.config.json'); if (fs.existsSync(configPath)) { console.error(chalk_1.default.red('Configuration file already exists')); process.exit(1); } const defaultConfig = { schema: "./prisma/schema.prisma", output: "./src/modules", apiPrefix: "api", swaggerEnabled: true, customTemplatesPath: null, schemaName: null, clientPath: null, generateCommonFiles: true, generateRootModules: true, includeRelationsInCreateDto: false, includeRelationsInQueryDto: false, imports: { apiResponseDto: "@/common/dto/api-response.dto", jwtAuthGuard: "@/modules/auth/guards/jwt-auth.guard", permissionGuard: "@/modules/auth/guards/permission.guard", requirePermission: "@/modules/auth/decorators/require-permission.decorator", permissionTypes: "@/modules/auth/types/permission.types", baseQueryDto: "@/common/dto/base-query.dto", prismaService: "@/shared/prisma/prisma.service" }, schemaMap: { // "Model": "schemaName", // Example: // "User": "auth", // "Product": "catalog" } }; await fs.writeJson(configPath, defaultConfig, { spaces: 2 }); console.log(chalk_1.default.green('✅ Created prisma-crud.config.json')); }); function main() { program.parse(process.argv); } //# sourceMappingURL=cli.js.map