@velopays/prisma-crud-generator
Version:
Generate CRUD operations and tests from Prisma models for NestJS
170 lines • 8.14 kB
JavaScript
;
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