UNPKG

editia-core

Version:

Core services and utilities for Editia applications - Authentication, Monetization, Video Generation Types, and Database Management

145 lines 6.93 kB
"use strict"; /** * Shared Zod validation schemas for video generation * Replaces duplicated validation logic across mobile and server-primary */ Object.defineProperty(exports, "__esModule", { value: true }); exports.TemplateValidationResultSchema = exports.isValidVideo = exports.isValidHexColor = exports.validateVideoGenerationRequest = exports.validateVideoEditorialProfile = exports.validateCaptionConfig = exports.validateVideoDuration = exports.ScenePlanSchema = exports.VideoStatusResponseSchema = exports.ApiResponseSchema = exports.VideoRequestSchema = exports.VideoGenerationResultSchema = exports.VideoGenerationRequestSchema = exports.VideoTypeSchema = exports.VideoEditorialProfileSchema = exports.CaptionConfigurationSchema = exports.HexColorSchema = exports.GenerationJobIdSchema = exports.UserIdSchema = exports.ScriptIdSchema = exports.VideoIdSchema = void 0; const zod_1 = require("zod"); const constants_1 = require("./constants"); // Utility schema for branded types exports.VideoIdSchema = zod_1.z.string().brand(); exports.ScriptIdSchema = zod_1.z.string().brand(); exports.UserIdSchema = zod_1.z.string().brand(); exports.GenerationJobIdSchema = zod_1.z.string().brand(); // Hex color validation exports.HexColorSchema = zod_1.z.string() .regex(/^#[0-9A-Fa-f]{6}$/, 'Must be a valid hex color') .brand(); // Caption configuration schema (unified from mobile and server) exports.CaptionConfigurationSchema = zod_1.z.object({ enabled: zod_1.z.boolean(), presetId: zod_1.z.string().optional(), placement: zod_1.z.enum(constants_1.CAPTION_PLACEMENTS), transcriptColor: exports.HexColorSchema.optional(), transcriptEffect: zod_1.z.enum(constants_1.TRANSCRIPT_EFFECTS).optional(), }); // Editorial profile schema for video generation (unified from mobile and server) exports.VideoEditorialProfileSchema = zod_1.z.object({ persona_description: zod_1.z.string().min(1, 'Persona description is required'), tone_of_voice: zod_1.z.string().min(1, 'Tone of voice is required'), audience: zod_1.z.string().min(1, 'Audience is required'), style_notes: zod_1.z.string().min(1, 'Style notes are required'), examples: zod_1.z.string().optional(), }); // Video type schema (base validation) exports.VideoTypeSchema = zod_1.z.object({ id: exports.VideoIdSchema, title: zod_1.z.string().min(1, 'Title is required'), description: zod_1.z.string(), upload_url: zod_1.z.string().url('Must be a valid URL'), tags: zod_1.z.array(zod_1.z.string()), user_id: exports.UserIdSchema, created_at: zod_1.z.string().optional(), duration_seconds: zod_1.z.number().nullable(), analysis_status: zod_1.z.string().optional(), analysis_data: zod_1.z.unknown().optional(), }); // Video generation request schema exports.VideoGenerationRequestSchema = zod_1.z.object({ scriptId: exports.ScriptIdSchema.optional(), prompt: zod_1.z.string().min(10, 'Prompt must be at least 10 characters'), selectedVideoIds: zod_1.z.array(exports.VideoIdSchema).min(1, 'At least one video must be selected'), captionConfig: exports.CaptionConfigurationSchema, editorialProfile: exports.VideoEditorialProfileSchema, outputLanguage: zod_1.z.enum(Object.keys(constants_1.LANGUAGES)), userId: exports.UserIdSchema, }); // Video generation result schema exports.VideoGenerationResultSchema = zod_1.z.object({ jobId: exports.GenerationJobIdSchema, status: zod_1.z.nativeEnum(constants_1.VideoRequestStatus), message: zod_1.z.string(), estimatedDuration: zod_1.z.number().positive().optional(), }); // Video request schema (for queue management) exports.VideoRequestSchema = zod_1.z.object({ id: exports.GenerationJobIdSchema, user_id: exports.UserIdSchema, script_id: exports.ScriptIdSchema.optional(), prompt: zod_1.z.string(), selected_videos: zod_1.z.array(exports.VideoIdSchema), caption_config: exports.CaptionConfigurationSchema, editorial_profile: exports.VideoEditorialProfileSchema, output_language: zod_1.z.enum(Object.keys(constants_1.LANGUAGES)), status: zod_1.z.nativeEnum(constants_1.VideoRequestStatus), created_at: zod_1.z.string(), updated_at: zod_1.z.string(), error_message: zod_1.z.string().optional(), video_url: zod_1.z.string().url().optional(), thumbnail_url: zod_1.z.string().url().optional(), }); // API response schema const ApiResponseSchema = (dataSchema) => zod_1.z.object({ success: zod_1.z.boolean(), data: dataSchema.optional(), error: zod_1.z.string().optional(), status: zod_1.z.number(), }); exports.ApiResponseSchema = ApiResponseSchema; // Video status response schema exports.VideoStatusResponseSchema = zod_1.z.object({ id: exports.GenerationJobIdSchema, status: zod_1.z.nativeEnum(constants_1.VideoRequestStatus), progress: zod_1.z.number().min(0).max(100).optional(), error_message: zod_1.z.string().optional(), video_url: zod_1.z.string().url().optional(), thumbnail_url: zod_1.z.string().url().optional(), updated_at: zod_1.z.string(), }); // Scene plan schema exports.ScenePlanSchema = zod_1.z.object({ id: zod_1.z.string(), startTime: zod_1.z.number().min(0), endTime: zod_1.z.number().min(0), duration: zod_1.z.number().positive(), text: zod_1.z.string(), videoId: exports.VideoIdSchema, }); // Template validation functions const validateVideoDuration = (scriptLength, videoDuration) => { const requiredDuration = scriptLength * constants_1.VIDEO_DURATION_MULTIPLIER; return videoDuration >= requiredDuration; }; exports.validateVideoDuration = validateVideoDuration; const validateCaptionConfig = (config) => { return exports.CaptionConfigurationSchema.safeParse(config).success; }; exports.validateCaptionConfig = validateCaptionConfig; const validateVideoEditorialProfile = (profile) => { return exports.VideoEditorialProfileSchema.safeParse(profile).success; }; exports.validateVideoEditorialProfile = validateVideoEditorialProfile; const validateVideoGenerationRequest = (request) => { return exports.VideoGenerationRequestSchema.safeParse(request).success; }; exports.validateVideoGenerationRequest = validateVideoGenerationRequest; // Type guards for runtime validation const isValidHexColor = (color) => { return typeof color === 'string' && /^#[0-9A-Fa-f]{6}$/.test(color); }; exports.isValidHexColor = isValidHexColor; const isValidVideo = (video) => { return exports.VideoTypeSchema.safeParse(video).success; }; exports.isValidVideo = isValidVideo; // Template validation result schema exports.TemplateValidationResultSchema = zod_1.z.object({ isValid: zod_1.z.boolean(), warnings: zod_1.z.array(zod_1.z.string()), errors: zod_1.z.array(zod_1.z.string()), captionsEnabled: zod_1.z.boolean(), totalDuration: zod_1.z.number(), requiredDuration: zod_1.z.number(), }); //# sourceMappingURL=validation.js.map