node-apis
Version:
🚀 Advanced TypeScript API generator with clean architecture, comprehensive testing, and automatic formatting. Generate production-ready Node.js APIs with complete integration test suites.
119 lines (117 loc) • 4.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateTypedCustomValidatorContent = void 0;
/**
* Typed custom validator templates
* Generates Zod validation schemas based on parsed TypeScript types
*/
const naming_utils_1 = require("../shared/utils/naming.utils");
const generateTypedCustomValidatorContent = ({ customName, moduleName, parsedType, }) => {
const naming = (0, naming_utils_1.getModuleNaming)(moduleName);
return generateGenericTypedCustomValidatorContent(customName, naming, parsedType);
};
exports.generateTypedCustomValidatorContent = generateTypedCustomValidatorContent;
/**
* Converts TypeScript type to Zod validation schema
*/
const typeToZodSchema = (field) => {
const { type, optional } = field;
const fieldName = field.name.toLowerCase();
let baseSchema;
// Field name-based intelligent validation
if (fieldName.includes('email')) {
baseSchema = 'z.string().email().min(3).max(255)';
}
else if (fieldName.includes('url') || fieldName.includes('link')) {
baseSchema = 'z.string().url().min(3).max(2048)';
}
else if (fieldName.includes('phone') || fieldName.includes('mobile')) {
baseSchema = 'z.string().min(10).max(20)';
}
else if ((fieldName.includes('id') || fieldName.endsWith('id')) && type === 'string') {
baseSchema = 'z.string().min(1).max(255)'; // Customize based on your ID format (UUID, nanoid, etc.)
}
else if (fieldName.includes('name') || fieldName.includes('title')) {
baseSchema = 'z.string().min(1).max(255)';
}
else if (fieldName.includes('description') || fieldName.includes('content') || fieldName.includes('text')) {
baseSchema = 'z.string().min(1).max(5000)';
}
else if (fieldName.includes('code') || fieldName.includes('slug') || fieldName.includes('key')) {
baseSchema = 'z.string().min(1).max(100)';
}
else if (fieldName.includes('password')) {
baseSchema = 'z.string().min(8).max(255)';
}
else if (fieldName.includes('age')) {
baseSchema = 'z.number().int().min(0).max(150)';
}
else if (fieldName.includes('price') || fieldName.includes('amount') || fieldName.includes('cost')) {
baseSchema = 'z.number().min(0).max(999999999)';
}
else if (fieldName.includes('quantity') || fieldName.includes('count')) {
baseSchema = 'z.number().int().min(0).max(999999999)';
}
else if (type === 'string') {
baseSchema = 'z.string().min(1).max(500)'; // Customize length limits as needed
}
else if (type === 'number') {
baseSchema = 'z.number().min(-999999999).max(999999999)'; // Adjust range as needed
}
else if (type === 'boolean') {
baseSchema = 'z.boolean()';
}
else if (type === 'Date') {
baseSchema = 'z.date()';
}
else if (type.includes('[]')) {
// Array types
const arrayType = type.replace('[]', '');
if (arrayType === 'string') {
baseSchema = 'z.array(z.string().min(1).max(500)).min(0).max(1000)'; // Customize array and element limits
}
else if (arrayType === 'number') {
baseSchema = 'z.array(z.number().min(-999999999).max(999999999)).min(0).max(1000)';
}
else {
baseSchema = 'z.array(z.any()).min(0).max(1000)';
}
}
else if (type.includes('|')) {
// Union types
baseSchema = 'z.string().min(1).max(500)';
}
else {
// Fallback for complex types
baseSchema = 'z.any()';
}
return optional ? `${baseSchema}.optional()` : baseSchema;
};
/**
* Generates generic typed custom validator content
*/
const generateGenericTypedCustomValidatorContent = (customName, naming, parsedType) => {
// Generate validation for all fields
const zodFields = parsedType.fields.length > 0
? parsedType.fields
.map(field => {
const schema = typeToZodSchema(field);
return ` ${field.name}: ${schema},`;
})
.join('\n')
: ` // No fields defined in typePayload`;
return `import { z } from 'zod';
import type { typePayload } from '../types/${customName}.${naming.file}';
export const payloadSchema = z.object({
${zodFields}
});
export const validatePayload = (data: unknown): { success: true; data: typePayload } | { success: false; error: z.ZodError } => {
const result = payloadSchema.safeParse(data);
if (result.success) {
return { success: true, data: result.data as typePayload };
}
return { success: false, error: result.error };
};
`;
};
//# sourceMappingURL=typed-custom.validators.js.map