PRIMEIRO ENVIO

This commit is contained in:
2025-12-25 12:02:07 -03:00
parent ca49575224
commit c4d3bd9a86
92 changed files with 26976 additions and 1 deletions
+15
View File
@@ -0,0 +1,15 @@
{
"name": "@cloneweb/types",
"version": "1.0.0",
"description": "TypeScript type definitions",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"scripts": {
"build": "tsc",
"dev": "tsc --watch",
"clean": "rm -rf dist"
},
"devDependencies": {
"typescript": "^5.2.2"
}
}
+326
View File
@@ -0,0 +1,326 @@
// Core Types
export interface CrawlerConfig {
maxDepth: number;
maxPages: number;
respectRobots: boolean;
rateLimit: number;
userAgent: string;
timeout: number;
}
export interface PageInfo {
url: string;
title: string;
depth: number;
links: string[];
assets: AssetInfo[];
metadata: PageMetadata;
}
export interface AssetInfo {
url: string;
type: 'image' | 'css' | 'js' | 'font' | 'media';
size: number;
hash: string;
dependencies: string[];
}
export interface PageMetadata {
description?: string;
keywords?: string[];
author?: string;
viewport?: string;
charset?: string;
language?: string;
}
// Visual Scraping Types
export interface Viewport {
width: number;
height: number;
deviceScaleFactor: number;
isMobile: boolean;
}
export interface Screenshot {
viewport: Viewport;
data: Buffer;
format: 'png' | 'jpeg' | 'webp';
quality: number;
}
export interface VisualData {
screenshots: Screenshot[];
computedStyles: Record<string, Record<string, string>>;
layoutMetrics: LayoutMetrics;
animations: AnimationInfo[];
}
export interface LayoutMetrics {
width: number;
height: number;
scrollWidth: number;
scrollHeight: number;
elements: ElementMetrics[];
}
export interface ElementMetrics {
selector: string;
boundingBox: BoundingBox;
styles: Record<string, string>;
isVisible: boolean;
}
export interface BoundingBox {
x: number;
y: number;
width: number;
height: number;
}
export interface AnimationInfo {
selector: string;
property: string;
duration: number;
timing: string;
delay: number;
}
// Code Generation Types
export interface GenerationConfig {
framework: 'vanilla' | 'react' | 'vue' | 'angular';
cssFramework: 'none' | 'tailwind' | 'bootstrap';
optimization: 'none' | 'basic' | 'aggressive';
accessibility: boolean;
responsive: boolean;
}
export interface GeneratedCode {
html: string;
css: string;
javascript: string;
components: ComponentDefinition[];
assets: AssetMapping[];
}
export interface ComponentDefinition {
id: string;
name: string;
type: ComponentType;
html: string;
css: string;
javascript?: string;
props: ComponentProp[];
instances: ComponentInstance[];
}
export interface ComponentProp {
name: string;
type: 'string' | 'number' | 'boolean' | 'object';
required: boolean;
defaultValue?: any;
}
export interface ComponentInstance {
id: string;
selector: string;
props: Record<string, any>;
}
export interface AssetMapping {
originalUrl: string;
localPath: string;
optimized: boolean;
size: number;
}
// Component Detection Types
export interface ComponentPattern {
type: ComponentType;
selector: string;
frequency: number;
variations: ComponentVariation[];
confidence: number;
}
export interface ComponentVariation {
html: string;
css: string;
props: Record<string, any>;
}
export type ComponentType =
| 'navigation'
| 'header'
| 'footer'
| 'card'
| 'form'
| 'button'
| 'modal'
| 'sidebar'
| 'hero'
| 'gallery'
| 'other';
// Site Structure Types
export interface SiteMap {
rootUrl: string;
pages: PageInfo[];
assets: AssetInfo[];
structure: SiteStructure;
metadata: SiteMetadata;
}
export interface SiteStructure {
hierarchy: PageHierarchy[];
navigation: NavigationStructure[];
breadcrumbs: BreadcrumbStructure[];
}
export interface PageHierarchy {
url: string;
level: number;
parent?: string;
children: string[];
}
export interface NavigationStructure {
type: 'main' | 'footer' | 'sidebar' | 'breadcrumb';
items: NavigationItem[];
}
export interface NavigationItem {
text: string;
url: string;
children?: NavigationItem[];
}
export interface BreadcrumbStructure {
page: string;
breadcrumbs: NavigationItem[];
}
export interface SiteMetadata {
title: string;
description?: string;
language: string;
favicon?: string;
robots?: string;
sitemap?: string;
}
// API Types
export interface ApiResponse<T = any> {
success: boolean;
data?: T;
error?: string;
message?: string;
}
export interface PaginatedResponse<T> extends ApiResponse<T[]> {
pagination: {
page: number;
limit: number;
total: number;
totalPages: number;
};
}
// Job Queue Types
export interface CrawlJob {
projectId: string;
startUrl: string;
config: CrawlerConfig;
}
export interface ScrapeJob {
projectId: string;
pageId: string;
url: string;
config: ScreenshotConfig;
}
export interface GenerateJob {
projectId: string;
visualData: VisualData;
config: GenerationConfig;
}
export interface ScreenshotConfig {
viewports: Viewport[];
fullPage: boolean;
quality: number;
format: 'png' | 'jpeg' | 'webp';
}
// User and Project Types
export interface UserProfile {
id: string;
email: string;
firstName?: string;
lastName?: string;
avatar?: string;
subscription: SubscriptionTier;
usage: UsageMetrics;
}
export interface UsageMetrics {
pagesCloned: number;
storageUsed: number;
apiCalls: number;
lastReset: Date;
}
export type SubscriptionTier = 'FREE' | 'BASIC' | 'PRO' | 'ENTERPRISE';
export interface ProjectSettings {
crawlerConfig: CrawlerConfig;
generationConfig: GenerationConfig;
notifications: NotificationSettings;
}
export interface NotificationSettings {
email: boolean;
webhook?: string;
slack?: string;
}
// Error Types
export class CloneWebError extends Error {
constructor(
message: string,
public code: string,
public statusCode: number = 500
) {
super(message);
this.name = 'CloneWebError';
}
}
export class ValidationError extends CloneWebError {
constructor(message: string, public field?: string) {
super(message, 'VALIDATION_ERROR', 400);
this.name = 'ValidationError';
}
}
export class AuthenticationError extends CloneWebError {
constructor(message: string = 'Authentication required') {
super(message, 'AUTHENTICATION_ERROR', 401);
this.name = 'AuthenticationError';
}
}
export class AuthorizationError extends CloneWebError {
constructor(message: string = 'Insufficient permissions') {
super(message, 'AUTHORIZATION_ERROR', 403);
this.name = 'AuthorizationError';
}
}
export class RateLimitError extends CloneWebError {
constructor(message: string = 'Rate limit exceeded') {
super(message, 'RATE_LIMIT_ERROR', 429);
this.name = 'RateLimitError';
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "./dist",
"rootDir": "./src",
"noEmit": false,
"declaration": true,
"declarationMap": true
},
"include": ["src/**/*"],
"exclude": ["dist", "node_modules"]
}
File diff suppressed because one or more lines are too long