PRIMEIRO ENVIO
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
export * from './logger';
|
||||
export * from './validation';
|
||||
@@ -0,0 +1,29 @@
|
||||
import winston from 'winston';
|
||||
|
||||
const logLevel = process.env.LOG_LEVEL || 'info';
|
||||
|
||||
export const logger = winston.createLogger({
|
||||
level: logLevel,
|
||||
format: winston.format.combine(
|
||||
winston.format.timestamp(),
|
||||
winston.format.errors({ stack: true }),
|
||||
winston.format.json()
|
||||
),
|
||||
defaultMeta: { service: 'cloneweb-platform' },
|
||||
transports: [
|
||||
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
|
||||
new winston.transports.File({ filename: 'logs/combined.log' }),
|
||||
],
|
||||
});
|
||||
|
||||
// If we're not in production, log to the console as well
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
logger.add(new winston.transports.Console({
|
||||
format: winston.format.combine(
|
||||
winston.format.colorize(),
|
||||
winston.format.simple()
|
||||
)
|
||||
}));
|
||||
}
|
||||
|
||||
export default logger;
|
||||
@@ -0,0 +1,105 @@
|
||||
import { z } from 'zod';
|
||||
|
||||
// URL validation schema
|
||||
export const urlSchema = z.string().url('Invalid URL format');
|
||||
|
||||
// Crawler configuration validation
|
||||
export const crawlerConfigSchema = z.object({
|
||||
maxDepth: z.number().min(1).max(10).default(3),
|
||||
maxPages: z.number().min(1).max(10000).default(100),
|
||||
respectRobots: z.boolean().default(true),
|
||||
rateLimit: z.number().min(100).max(10000).default(1000),
|
||||
userAgent: z.string().min(1).default('CloneWeb-Bot/1.0'),
|
||||
timeout: z.number().min(5000).max(60000).default(30000)
|
||||
});
|
||||
|
||||
// Viewport validation
|
||||
export const viewportSchema = z.object({
|
||||
width: z.number().min(320).max(3840),
|
||||
height: z.number().min(240).max(2160),
|
||||
deviceScaleFactor: z.number().min(1).max(3).default(1),
|
||||
isMobile: z.boolean().default(false)
|
||||
});
|
||||
|
||||
// Screenshot configuration validation
|
||||
export const screenshotConfigSchema = z.object({
|
||||
viewports: z.array(viewportSchema).min(1),
|
||||
fullPage: z.boolean().default(true),
|
||||
quality: z.number().min(1).max(100).default(90),
|
||||
format: z.enum(['png', 'jpeg', 'webp']).default('png')
|
||||
});
|
||||
|
||||
// Generation configuration validation
|
||||
export const generationConfigSchema = z.object({
|
||||
framework: z.enum(['vanilla', 'react', 'vue', 'angular']).default('vanilla'),
|
||||
cssFramework: z.enum(['none', 'tailwind', 'bootstrap']).default('none'),
|
||||
optimization: z.enum(['none', 'basic', 'aggressive']).default('basic'),
|
||||
accessibility: z.boolean().default(true),
|
||||
responsive: z.boolean().default(true)
|
||||
});
|
||||
|
||||
// User registration validation
|
||||
export const userRegistrationSchema = z.object({
|
||||
email: z.string().email('Invalid email format'),
|
||||
password: z.string().min(8, 'Password must be at least 8 characters'),
|
||||
firstName: z.string().min(1).optional(),
|
||||
lastName: z.string().min(1).optional()
|
||||
});
|
||||
|
||||
// User login validation
|
||||
export const userLoginSchema = z.object({
|
||||
email: z.string().email('Invalid email format'),
|
||||
password: z.string().min(1, 'Password is required')
|
||||
});
|
||||
|
||||
// Project creation validation
|
||||
export const projectCreationSchema = z.object({
|
||||
name: z.string().min(1, 'Project name is required').max(100),
|
||||
description: z.string().max(500).optional(),
|
||||
sourceUrl: urlSchema,
|
||||
settings: z.object({
|
||||
crawlerConfig: crawlerConfigSchema.optional(),
|
||||
generationConfig: generationConfigSchema.optional()
|
||||
}).optional()
|
||||
});
|
||||
|
||||
// Asset validation
|
||||
export const assetSchema = z.object({
|
||||
originalUrl: urlSchema,
|
||||
type: z.enum(['image', 'css', 'js', 'font', 'media', 'other']),
|
||||
size: z.number().min(0),
|
||||
hash: z.string().min(1)
|
||||
});
|
||||
|
||||
// Component validation
|
||||
export const componentSchema = z.object({
|
||||
name: z.string().min(1).max(100),
|
||||
type: z.enum(['navigation', 'header', 'footer', 'card', 'form', 'button', 'modal', 'sidebar', 'hero', 'gallery', 'other']),
|
||||
html: z.string().min(1),
|
||||
css: z.string().min(1),
|
||||
javascript: z.string().optional(),
|
||||
props: z.array(z.object({
|
||||
name: z.string().min(1),
|
||||
type: z.enum(['string', 'number', 'boolean', 'object']),
|
||||
required: z.boolean(),
|
||||
defaultValue: z.any().optional()
|
||||
})).default([])
|
||||
});
|
||||
|
||||
// Pagination validation
|
||||
export const paginationSchema = z.object({
|
||||
page: z.number().min(1).default(1),
|
||||
limit: z.number().min(1).max(100).default(20)
|
||||
});
|
||||
|
||||
// Export validation functions
|
||||
export const validateUrl = (url: string) => urlSchema.parse(url);
|
||||
export const validateCrawlerConfig = (config: any) => crawlerConfigSchema.parse(config);
|
||||
export const validateScreenshotConfig = (config: any) => screenshotConfigSchema.parse(config);
|
||||
export const validateGenerationConfig = (config: any) => generationConfigSchema.parse(config);
|
||||
export const validateUserRegistration = (data: any) => userRegistrationSchema.parse(data);
|
||||
export const validateUserLogin = (data: any) => userLoginSchema.parse(data);
|
||||
export const validateProjectCreation = (data: any) => projectCreationSchema.parse(data);
|
||||
export const validateAsset = (data: any) => assetSchema.parse(data);
|
||||
export const validateComponent = (data: any) => componentSchema.parse(data);
|
||||
export const validatePagination = (data: any) => paginationSchema.parse(data);
|
||||
Reference in New Issue
Block a user