editia-core
Version:
Core services and utilities for Editia applications - Authentication, Monetization, Video Generation Types, and Database Management
145 lines • 6.93 kB
JavaScript
"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