|
|
|
|
|
|
|
|
|
|
|
|
|
export const ENVIRONMENT = { |
|
isProduction: () => process.env.NODE_ENV === 'production', |
|
isHuggingface: () => { |
|
if (typeof window === 'undefined') return false; |
|
return ( |
|
window.location.hostname.includes('hf.space') || |
|
window.location.hostname.includes('huggingface.co') |
|
); |
|
}, |
|
isDevelopment: () => process.env.NODE_ENV === 'development' |
|
}; |
|
|
|
|
|
export const PERFORMANCE_CONFIG = { |
|
|
|
RENDER_TIMEOUT: ENVIRONMENT.isProduction() ? 10000 : 15000, |
|
|
|
|
|
CANVAS: { |
|
DEFAULT_SCALE: ENVIRONMENT.isHuggingface() ? 1 : 2, |
|
MAX_SCALE: 4, |
|
QUALITY: 0.9, |
|
BACKGROUND_COLOR: null |
|
}, |
|
|
|
|
|
SVG: { |
|
MAX_SIZE_BYTES: 1024 * 1024, |
|
MIN_DIMENSION: 1, |
|
MAX_DIMENSION: 4096, |
|
SERIALIZATION_TIMEOUT: 5000 |
|
}, |
|
|
|
|
|
MONITORING: { |
|
ENABLED: ENVIRONMENT.isProduction(), |
|
MAX_METRICS_COUNT: 100, |
|
OPERATIONS: { |
|
SVG_TO_BASE64: 'svg2base64', |
|
CANVAS_RENDER: 'canvas_render', |
|
HTML_EXPORT: 'html_export', |
|
DIMENSION_CHECK: 'dimension_check' |
|
} |
|
} |
|
}; |
|
|
|
|
|
export const ERROR_CONFIG = { |
|
|
|
RETRY: { |
|
MAX_ATTEMPTS: 3, |
|
DELAY_MS: 1000, |
|
BACKOFF_MULTIPLIER: 2 |
|
}, |
|
|
|
|
|
FALLBACK: { |
|
ENABLE_CANVAS_FALLBACK: true, |
|
ENABLE_SIMPLIFIED_SVG: true, |
|
ENABLE_PLACEHOLDER: true, |
|
PLACEHOLDER_COLOR: '#f5f5f5', |
|
PLACEHOLDER_TEXT: 'Vector' |
|
}, |
|
|
|
|
|
LOGGING: { |
|
VERBOSE: !ENVIRONMENT.isProduction(), |
|
ERROR_ONLY: ENVIRONMENT.isProduction(), |
|
INCLUDE_STACK_TRACE: !ENVIRONMENT.isProduction() |
|
} |
|
}; |
|
|
|
|
|
export const EXPORT_CONFIG = { |
|
|
|
HTML: { |
|
INCLUDE_INLINE_SVG: true, |
|
OPTIMIZE_SVG_SIZE: true, |
|
REMOVE_VECTOR_EFFECTS: true, |
|
ENSURE_NAMESPACES: true |
|
}, |
|
|
|
|
|
IMAGE: { |
|
DEFAULT_FORMAT: 'png' as const, |
|
SUPPORTED_FORMATS: ['png', 'jpeg', 'webp'] as const, |
|
DEFAULT_QUALITY: 0.9, |
|
USE_CORS: true |
|
}, |
|
|
|
|
|
BASE64: { |
|
PREFIX: 'data:image/svg+xml;base64,', |
|
ENCODING: 'utf-8' as const, |
|
VALIDATE_OUTPUT: true, |
|
MIN_LENGTH: 100 |
|
} |
|
}; |
|
|
|
|
|
export const COMPATIBILITY_CONFIG = { |
|
|
|
FEATURES: { |
|
CANVAS_SUPPORT: () => { |
|
try { |
|
const canvas = document.createElement('canvas'); |
|
return !!(canvas.getContext && canvas.getContext('2d')); |
|
} catch { |
|
return false; |
|
} |
|
}, |
|
|
|
SVG_SUPPORT: () => { |
|
try { |
|
return !!(document.createElementNS && |
|
document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect); |
|
} catch { |
|
return false; |
|
} |
|
}, |
|
|
|
BLOB_SUPPORT: () => { |
|
try { |
|
return typeof Blob !== 'undefined'; |
|
} catch { |
|
return false; |
|
} |
|
} |
|
}, |
|
|
|
|
|
PLATFORM_OPTIMIZATIONS: { |
|
HUGGINGFACE: { |
|
PREFER_SIMPLE_RENDERING: true, |
|
REDUCE_LOGGING: true, |
|
OPTIMIZE_MEMORY: true, |
|
USE_MINIMAL_FALLBACKS: true |
|
}, |
|
|
|
MOBILE: { |
|
REDUCE_SCALE: true, |
|
OPTIMIZE_PERFORMANCE: true, |
|
LIMIT_CONCURRENT_RENDERS: true |
|
} |
|
} |
|
}; |
|
|
|
|
|
export const VALIDATION_CONFIG = { |
|
DIMENSIONS: { |
|
MIN_WIDTH: 1, |
|
MIN_HEIGHT: 1, |
|
MAX_WIDTH: 8192, |
|
MAX_HEIGHT: 8192 |
|
}, |
|
|
|
SVG_ATTRIBUTES: { |
|
REQUIRED: ['xmlns'], |
|
FORBIDDEN: ['vector-effect'], |
|
OPTIONAL: ['viewBox', 'width', 'height'] |
|
}, |
|
|
|
OUTPUT: { |
|
MIN_BASE64_LENGTH: 50, |
|
MAX_BASE64_LENGTH: 10 * 1024 * 1024, |
|
VALID_PREFIXES: ['data:image/svg+xml;base64,', 'data:image/png;base64,'] |
|
} |
|
}; |
|
|
|
|
|
export const VECTOR_EXPORT_CONFIG = { |
|
ENVIRONMENT, |
|
PERFORMANCE_CONFIG, |
|
ERROR_CONFIG, |
|
EXPORT_CONFIG, |
|
COMPATIBILITY_CONFIG, |
|
VALIDATION_CONFIG |
|
} as const; |
|
|
|
export default VECTOR_EXPORT_CONFIG; |