svger-cli 2.0.6 → 2.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,2654 +1,2377 @@
1
- # SVGER-CLI v2.0.5 - Enterprise SVG Processing Framework
2
-
3
- [![npm version](https://badge.fury.io/js/svger-cli.svg)](https://badge.fury.io/js/svger-cli)
4
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
- [![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue.svg)](https://www.typescriptlang.org/)
6
- [![Zero Dependencies](https://img.shields.io/badge/Dependencies-Zero-green.svg)](https://www.npmjs.com/package/svger-cli)
7
-
8
- > **The most advanced, zero-dependency SVG to component converter, now with first-class support for
9
- > 8+ UI frameworks. Enjoy enterprise-grade performance, auto-generated exports, and a unified
10
- > workflow for your entire design system.**
11
-
12
- ## 🆕 **Latest Developer Experience Improvements**
13
-
14
- ### **🔧 Recent Critical Fixes (v2.0.5)**
15
-
16
- - **🆕 CRITICAL FIX: PascalCase Component Naming**: Fixed issue where files like "ArrowBendDownLeft.svg" were incorrectly converted to "Arrowbenddownleft.tsx" instead of preserving the correct "ArrowBendDownLeft.tsx" format
17
- - **✅ Fixed TypeScript Duplicate Export Errors**: Resolved duplicate export issues in
18
- auto-generated index files
19
- - **✅ Enhanced PascalCase Preservation**: Improved filename casing preservation (e.g.,
20
- "ArrowBendDownLeft.svg" "ArrowBendDownLeft.tsx")
21
- - **✅ Comprehensive Configuration Schema**: Complete implementation of all promised configuration
22
- features
23
- - **✅ Framework-Specific Configuration**: Full React, Vue, and Angular configuration support
24
- - **✅ Advanced Performance Options**: Parallel processing, caching, and memory optimization
25
- - **✅ Enhanced Error Handling**: Robust error strategies with retry mechanisms
26
- - **✅ Responsive Design System**: Built-in responsive breakpoints and values
27
- - **✅ Theme System Integration**: Light/dark mode with CSS variable support
28
-
29
- ### **Auto-Generated index.ts Exports**
30
-
31
- Automatically generates clean index.ts files with a **single, consistent export pattern** that avoids naming conflicts:
32
-
33
- ```typescript
34
- // Auto-generated in your output directory
35
- // Re-exports with renamed defaults for tree-shaking
36
- export { default as ArrowLeft } from './ArrowLeft';
37
- export { default as ArrowRight } from './ArrowRight';
38
- export { default as HomeIcon } from './HomeIcon';
39
- export { default as UserProfile } from './UserProfile';
40
-
41
- /**
42
- * SVG Components Index
43
- * Generated by svger-cli
44
- *
45
- * Import individual components:
46
- * import { ArrowLeft } from './components';
47
- *
48
- * Import all components:
49
- * import * as Icons from './components';
50
- */
51
- ```
52
-
53
- **Import flexibility:**
54
-
55
- ```typescript
56
- // Named imports (recommended - tree-shaking friendly)
57
- import { ArrowLeft, ArrowRight, HomeIcon } from './components';
58
-
59
- // Namespace import (for accessing all icons)
60
- import * as Icons from './components';
61
- const ArrowIcon = Icons.ArrowLeft;
62
-
63
- // Individual file imports (when you need just one component)
64
- import ArrowLeft from './components/ArrowLeft';
65
- ```
66
-
67
- **Why this approach?**
68
- - ✅ **No naming conflicts**: Each export has a unique name
69
- - **Tree-shaking optimized**: Named exports work perfectly with bundlers
70
- - ✅ **TypeScript safe**: No duplicate identifier errors
71
- - ✅ **Consistent**: Single export pattern reduces confusion
72
-
73
- ### **Enhanced Props & Styling**
74
-
75
- Components now support comprehensive prop interfaces with React.forwardRef:
76
-
77
- ```typescript
78
- <Icon className="custom-class" style={{ color: 'red' }} size={32} />
79
- ```
80
-
81
- ### **Comprehensive File Protection**
82
-
83
- Lock files to prevent accidental modifications during builds:
84
-
85
- ```bash
86
- svger-cli lock ./icons/critical-logo.svg # Protects during all operations
87
- ```
88
-
89
- ## 🚀 **Feature Comparison & Technical Analysis**
90
-
91
- > **Disclaimer**: This comparison is based on extensive research and testing conducted in November 2025. We acknowledge that all mentioned tools are valuable in their respective ecosystems. This analysis aims to highlight differences in approach and capabilities to help developers make informed decisions.
92
-
93
- ### **🔍 Detailed Feature Analysis**
94
-
95
- | **Feature Category** | **SVGER-CLI v2.0** | **SVGR (Webpack Ecosystem)** | **vite-svg-loader** | **svelte-svg** | **SVGO** |
96
- |---------------------|---------------------|------------------------------|-------------------|----------------|----------|
97
- | **Dependencies (Development)** | ✅ **Zero dependencies** | ⚠️ **15+ dev dependencies**<br/>*webpack, @babel/core, @babel/preset-react, etc.*<br/>**Bundle Impact**: None (dev-only) | ⚠️ **9+ dependencies**<br/>*Vite ecosystem required* | ⚠️ **7+ dependencies**<br/>*Svelte ecosystem* | ⚠️ **8+ dependencies**<br/>*chalk, csso, commander, etc.* |
98
- | **Framework Support** | ✅ **8 frameworks native**<br/>*React, Vue, Angular, Svelte, Solid, Lit, Preact, Vanilla* | ✅ **Multi-framework via webpack**<br/>*React (primary), Vue, Angular possible*<br/>*Requires separate webpack configs* | 🔶 **Vite/Vue ecosystem**<br/>*Can work with other Vite frameworks* | ❌ **Svelte specific** | ✅ **Framework agnostic**<br/>*SVG optimization only* |
99
- | **Auto-Generated Exports** | ✅ **Built-in index.ts generation**<br/>*Named, default, and tree-shakable exports* | ❌ **Manual webpack configuration**<br/>*Requires custom webpack plugins*<br/>*[Example needed in docs]* | ❌ **Manual implementation** | ❌ **Manual implementation** | ❌ **Not applicable**<br/>*Optimization tool only* |
100
- | **Component Props Interface** | **Enhanced props system**<br/>*size, variant, theme + all SVGProps*<br/>```tsx<br/><Icon size="lg" variant="primary" />``` | ✅ **Full SVGProps support**<br/>*Configurable via webpack options*<br/>```tsx<br/><Icon width={24} height={24} />``` | ✅ **Vue props support**<br/>*Standard Vue component props* | ✅ **Svelte props support**<br/>*Standard Svelte props* | ❌ **Not applicable** |
101
- | **Build Integration** | ✅ **Standalone CLI + Watch**<br/>*Independent of build tools* | ✅ **Webpack integration**<br/>*Hot reload, on-demand compilation* | ✅ **Vite integration**<br/>*HMR support* | ✅ **Svelte/Vite integration** | ✅ **CLI optimization** |
102
- | **TypeScript Support** | ✅ **Native TypeScript**<br/>*First-class TS generation* | ✅ **TypeScript support**<br/>*Via @svgr/webpack + TS config* | ✅ **TypeScript support**<br/>*Vite TS integration* | 🔶 **Limited TS support**<br/>*Basic Svelte TS* | ❌ **No TypeScript**<br/>*Plain SVG output* |
103
-
104
- ### **📊 Performance Comparison Methodology**
105
-
106
- **Performance Test Environment:**
107
- - **Hardware**: Intel i7-12700K, 32GB DDR4, NVMe SSD
108
- - **Dataset**: 1,000 production SVG files (2KB-100KB each)
109
- - **Metrics**: Processing time, memory usage, build integration time
110
-
111
- **Performance Claims Clarification:**
112
-
113
- #### **85% Performance Improvement - Detailed Breakdown**
114
-
115
- **SVGER-CLI vs SVGR (Webpack Build Context):**
116
- ```bash
117
- # Test Scenario: Converting 1,000 SVG files to React components
118
-
119
- # SVGR with Webpack (webpack build time)
120
- npm run build # 12.3 seconds total build time
121
- # - Webpack compilation: 8.2s
122
- # - SVGR processing: 3.1s
123
- # - Bundle generation: 1.0s
124
-
125
- # SVGER-CLI (pre-build generation)
126
- svger-cli build ./icons ./components # 1.8 seconds
127
- # Performance improvement: 85% faster than SVGR's portion
128
- # Note: Different workflow - pre-build vs build-time
129
- ```
130
-
131
- **Important Context:**
132
- - **SVGR**: Processes SVGs during webpack build (on-demand)
133
- - **SVGER-CLI**: Pre-processes SVGs into components (build-time generation)
134
- - **85% improvement**: Refers to SVG-to-component conversion time specifically
135
- - **Trade-off**: SVGR offers hot reload, SVGER-CLI offers faster builds
136
-
137
- #### **Memory Usage Comparison**
138
- ```typescript
139
- const memoryUsage = {
140
- svgrWebpack: {
141
- devDependencies: 120, // MB (webpack + babel ecosystem)
142
- buildTime: 180, // MB (peak during processing)
143
- runtime: 0 // MB (components bundled)
144
- },
145
- svgerCli: {
146
- dependencies: 0, // MB (zero dependencies)
147
- buildTime: 45, // MB (processing only)
148
- runtime: 0 // MB (generated components)
149
- }
150
- };
151
- ```
152
-
153
- ### **🔧 Feature Clarifications**
154
-
155
- #### **"Advanced Props" Definition**
156
- **SVGER-CLI Enhanced Props:**
157
- ```tsx
158
- // Beyond standard SVGProps
159
- <Icon
160
- size="lg" // Predefined sizes (sm, md, lg, xl)
161
- variant="primary" // Theme variants
162
- responsive={true} // Responsive behavior
163
- theme="dark" // Dark/light mode
164
- animation="hover" // Built-in animations
165
- {...standardSVGProps} // All standard SVG attributes
166
- />
167
- ```
168
-
169
- **SVGR Standard Props:**
170
- ```tsx
171
- // Full SVGProps support (configurable)
172
- <Icon
173
- width={24}
174
- height={24}
175
- fill="currentColor"
176
- stroke="none"
177
- className="icon"
178
- onClick={handleClick}
179
- // All standard SVG attributes supported
180
- />
181
- ```
182
-
183
- **Clarification**: Both tools support SVG attributes. SVGER-CLI adds convenience props, while SVGR focuses on standard SVG API.
184
-
185
- #### **"File Protection" Explanation**
186
- ```bash
187
- # SVGER-CLI Lock System
188
- svger-cli lock ./icons/logo.svg
189
- # Prevents accidental regeneration of critical components
190
- # Useful for manually customized components
191
-
192
- # SVGR Workflow
193
- # No built-in protection - webpack processes all matching files
194
- # Manual exclusion via webpack configuration required
195
- ```
196
-
197
- ### **🎯 Use Case Recommendations**
198
-
199
- #### **Choose SVGR when:**
200
- - Already using webpack in your project
201
- - Need hot reload during development
202
- - Want on-demand SVG processing
203
- - ✅ Working primarily with React
204
- - Need tight build tool integration
205
-
206
- #### **Choose SVGER-CLI when:**
207
- - Working with multiple frameworks
208
- - Want zero build tool dependencies
209
- - Need automated index file generation
210
- - Prefer pre-build component generation
211
- - Want enhanced theming/responsive features
212
- - ✅ Working in CI/CD environments
213
-
214
- ### **🤝 Acknowledgments**
215
-
216
- We recognize and appreciate the excellent work by:
217
- - **SVGR Team**: Pioneering webpack-based SVG-to-component conversion
218
- - **Vite Team**: Creating efficient build tooling for modern frameworks
219
- - **Svelte Team**: Building an elegant component framework
220
- - **SVGO Team**: Providing industry-standard SVG optimization
221
-
222
- Each tool serves specific use cases and contributes valuable capabilities to the developer ecosystem.
223
-
224
- ### **📝 Comparison Transparency & Feedback**
225
-
226
- **Our Commitment to Accuracy:**
227
- - This comparison is based on our current understanding and testing as of November 2025
228
- - We welcome corrections, clarifications, and updates from the community
229
- - If you find inaccuracies, please open an issue or submit a PR
230
- - We regularly update this documentation based on community feedback
231
-
232
- **Research Sources:**
233
- - Official documentation of each mentioned tool
234
- - GitHub repositories and source code analysis
235
- - Community discussions and real-world usage reports
236
- - Direct testing and benchmarking
237
-
238
- **Feedback Welcome:**
239
- - 📧 **Email**: navidrezadoost07@gmail.com
240
- - 🐛 **Issues**: [GitHub Issues](https://github.com/faezemohades/svger-cli/issues)
241
- - 💬 **Discussions**: We encourage open dialogue about tool comparisons
242
-
243
- ---
244
-
245
- ## **Performance Analysis: SVG-to-Component Processing Speed**
246
-
247
- ### **Performance Context & Methodology**
248
-
249
- The **85% performance improvement** claim refers specifically to SVG-to-component conversion speed in isolated processing scenarios, not overall build times. This comparison acknowledges that SVGR and SVGER-CLI operate in different workflows:
250
-
251
- - **SVGR**: Integrates with webpack for on-demand processing during builds
252
- - **SVGER-CLI**: Pre-processes SVGs into static component files
253
-
254
- #### **🔬 Benchmarking Methodology & Context**
255
-
256
- **Test Environment:**
257
- - **Hardware**: Intel i7-12700K, 32GB DDR4, NVMe SSD
258
- - **Dataset**: 1,000 production SVG files (ranging 2KB-100KB)
259
- - **Comparison Scope**: Pure SVG processing time (excluding webpack overhead)
260
- - **Frameworks Tested**: React, Vue, Angular, Svelte
261
-
262
- ```typescript
263
- // Performance Test Suite Results
264
- const benchmarkResults = {
265
- singleFile: {
266
- svgerCli: 15, // milliseconds
267
- svgr: 25,
268
- improvement: 40 // percent
269
- },
270
- batchProcessing: {
271
- svgerCli: 850, // milliseconds (100 files)
272
- svgr: 1450,
273
- improvement: 70 // percent
274
- },
275
- memoryUsage: {
276
- svgerCli: 45, // MB (1000 files)
277
- svgr: 120,
278
- improvement: 62 // percent
279
- }
280
- };
281
- ```
282
-
283
- #### **🏗️ Core Performance Optimizations**
284
-
285
- ### **1. Zero-Dependency Architecture (25% improvement)**
286
-
287
- **Problem**: Traditional tools like SVGR rely on 15+ dependencies, creating overhead in:
288
- - Module resolution and loading
289
- - Memory allocation for dependency trees
290
- - Function call overhead through abstraction layers
291
-
292
- **Solution**: Native implementation written in TypeScript with zero runtime dependencies.
293
-
294
- ```typescript
295
- // Traditional approach (SVGR)
296
- import babel from '@babel/core';
297
- import traverse from '@babel/traverse';
298
- import generate from '@babel/generator';
299
- import template from '@babel/template';
300
-
301
- // SVGER-CLI approach - Native implementation
302
- class NativeSVGProcessor {
303
- private parseAttributes(svgContent: string): SVGAttributes {
304
- // Direct string parsing with optimized regex patterns
305
- const attributeRegex = /(\w+)=["']([^"']+)["']/g;
306
- return this.extractAttributes(svgContent, attributeRegex);
307
- }
308
-
309
- private optimizeViewBox(viewBox: string): string {
310
- // Native numeric optimization without dependency overhead
311
- return this.normalizeViewBoxValues(viewBox);
312
- }
313
- }
314
- ```
315
-
316
- **Performance Impact**:
317
- - **Startup time**: 65% faster (120ms vs 340ms)
318
- - **Memory footprint**: 89% smaller (2.1MB vs 18.7MB)
319
- - **Module loading**: Zero dependency resolution overhead
320
-
321
- ### **2. Advanced Parallel Processing Engine (35% improvement)**
322
-
323
- **Problem**: Sequential processing creates CPU underutilization and longer processing times.
324
-
325
- **Solution**: Custom-built parallel processing engine with intelligent work distribution.
326
-
327
- ```typescript
328
- class PerformanceEngine {
329
- private readonly workerPool: WorkerThread[];
330
- private readonly batchQueue: ProcessingQueue;
331
-
332
- async processBatch(files: SVGFile[], options: ProcessingOptions): Promise<ProcessingResult[]> {
333
- // Intelligent batch sizing based on system resources
334
- const optimalBatchSize = this.calculateOptimalBatchSize(
335
- files.length,
336
- this.systemMetrics.availableCores,
337
- this.systemMetrics.availableMemory
338
- );
339
-
340
- // Parallel processing with load balancing
341
- const batches = this.createOptimalBatches(files, optimalBatchSize);
342
-
343
- // Process batches in parallel with worker threads
344
- const results = await Promise.all(
345
- batches.map(batch => this.processWorkerBatch(batch, options))
346
- );
347
-
348
- return this.mergeResults(results);
349
- }
350
-
351
- private calculateOptimalBatchSize(
352
- totalFiles: number,
353
- availableCores: number,
354
- availableMemory: number
355
- ): number {
356
- // Dynamic batch sizing algorithm
357
- const memoryConstraint = Math.floor(availableMemory / 50); // 50MB per batch
358
- const coreConstraint = availableCores * 2.5; // Optimal CPU utilization
359
- const fileConstraint = Math.ceil(totalFiles / 20); // Prevent too many small batches
360
-
361
- return Math.min(memoryConstraint, coreConstraint, Math.max(fileConstraint, 5));
362
- }
363
- }
364
- ```
365
-
366
- **Performance Metrics**:
367
- - **CPU Utilization**: 85% vs 45% (traditional tools)
368
- - **Processing Time**: 70% reduction for batches >50 files
369
- - **Memory Efficiency**: 40% better through intelligent batching
370
-
371
- ### **3. Native Template Engine (15% improvement)**
372
-
373
- **Problem**: Template engines like Handlebars or EJS add parsing overhead and memory allocation.
374
-
375
- **Solution**: Custom template compiler with pre-compiled templates and template caching.
376
-
377
- ```typescript
378
- class NativeTemplateEngine {
379
- private readonly templateCache = new Map<string, CompiledTemplate>();
380
- private readonly precompiledTemplates: Record<Framework, CompiledTemplate>;
381
-
382
- constructor() {
383
- // Pre-compile all framework templates at startup
384
- this.precompiledTemplates = {
385
- react: this.compileTemplate(REACT_TEMPLATE),
386
- vue: this.compileTemplate(VUE_TEMPLATE),
387
- angular: this.compileTemplate(ANGULAR_TEMPLATE),
388
- svelte: this.compileTemplate(SVELTE_TEMPLATE)
389
- };
390
- }
391
-
392
- generateComponent(svgData: SVGData, framework: Framework): string {
393
- // Use pre-compiled template - no runtime compilation
394
- const template = this.precompiledTemplates[framework];
395
-
396
- // Direct string interpolation (fastest method)
397
- return template.render({
398
- componentName: svgData.componentName,
399
- svgContent: svgData.optimizedContent,
400
- props: svgData.props,
401
- interfaces: svgData.typeDefinitions
402
- });
403
- }
404
-
405
- private compileTemplate(templateSource: string): CompiledTemplate {
406
- // Custom template compilation with optimized variable substitution
407
- const variables = this.extractVariables(templateSource);
408
- const compiledFunction = this.generateRenderFunction(templateSource, variables);
409
-
410
- return {
411
- render: compiledFunction,
412
- variables,
413
- cacheKey: this.generateCacheKey(templateSource)
414
- };
415
- }
416
- }
417
- ```
418
-
419
- **Performance Benefits**:
420
- - **Template Rendering**: 80% faster than Handlebars
421
- - **Memory Usage**: 60% reduction through template caching
422
- - **Startup Time**: No runtime template compilation
423
-
424
- ### **4. Optimized SVG Parsing & Processing (10% improvement)**
425
-
426
- **Problem**: XML parsers like `xmldom` add overhead for simple SVG attribute extraction.
427
-
428
- **Solution**: Custom SVG parser optimized for common patterns with intelligent caching.
429
-
430
- ```typescript
431
- class OptimizedSVGProcessor {
432
- private readonly attributeCache = new LRUCache<string, SVGAttributes>(1000);
433
- private readonly pathOptimizer = new PathOptimizer();
434
-
435
- processSVG(svgContent: string): ProcessedSVG {
436
- const cacheKey = this.generateCacheKey(svgContent);
437
-
438
- // Check cache first
439
- if (this.attributeCache.has(cacheKey)) {
440
- return this.attributeCache.get(cacheKey)!;
441
- }
442
-
443
- // Optimized parsing using regex patterns
444
- const attributes = this.fastParseAttributes(svgContent);
445
- const optimizedPaths = this.pathOptimizer.optimizePaths(
446
- this.extractPaths(svgContent)
447
- );
448
-
449
- const result = {
450
- attributes,
451
- paths: optimizedPaths,
452
- viewBox: this.normalizeViewBox(attributes.viewBox),
453
- dimensions: this.calculateDimensions(attributes)
454
- };
455
-
456
- // Cache result
457
- this.attributeCache.set(cacheKey, result);
458
- return result;
459
- }
460
-
461
- private fastParseAttributes(svgContent: string): SVGAttributes {
462
- // Optimized regex patterns for common SVG attributes
463
- const patterns = {
464
- viewBox: /viewBox=["']([^"']+)["']/,
465
- width: /width=["']([^"']+)["']/,
466
- height: /height=["']([^"']+)["']/,
467
- fill: /fill=["']([^"']+)["']/g,
468
- stroke: /stroke=["']([^"']+)["']/g
469
- };
470
-
471
- return Object.entries(patterns).reduce((attrs, [key, pattern]) => {
472
- const match = svgContent.match(pattern);
473
- attrs[key] = match ? match[1] : null;
474
- return attrs;
475
- }, {} as SVGAttributes);
476
- }
477
- }
478
- ```
479
-
480
- **Optimization Results**:
481
- - **Parsing Speed**: 90% faster than XML-based parsers
482
- - **Memory Allocation**: 50% reduction through object pooling
483
- - **Cache Hit Rate**: 85% for repeated processing
484
-
485
- ### **📊 Detailed Performance Breakdown**
486
-
487
- #### **Single File Processing (100KB SVG)**
488
- ```typescript
489
- const singleFileMetrics = {
490
- traditional: {
491
- dependencyLoading: 8, // ms
492
- svgParsing: 12, // ms
493
- templateProcessing: 15, // ms
494
- fileWriting: 5, // ms
495
- total: 40 // ms
496
- },
497
- svgerCli: {
498
- svgParsing: 3, // ms (optimized parser)
499
- templateProcessing: 2, // ms (pre-compiled)
500
- fileWriting: 5, // ms
501
- overhead: 5, // ms
502
- total: 15 // ms
503
- },
504
- improvement: 62.5 // percent
505
- };
506
- ```
507
-
508
- #### **Batch Processing (1000 files)**
509
- ```typescript
510
- const batchMetrics = {
511
- traditional: {
512
- sequential: 45000, // ms (45 seconds)
513
- parallelBasic: 18000, // ms (limited parallelism)
514
- memoryOverhead: 250, // MB
515
- },
516
- svgerCli: {
517
- parallelOptimized: 6500, // ms (6.5 seconds)
518
- memoryOptimized: 85, // MB
519
- cacheHitRate: 0.85, // 85% cache efficiency
520
- },
521
- improvement: 85.5 // percent
522
- };
523
- ```
524
-
525
- #### **Memory Usage Optimization**
526
- ```typescript
527
- const memoryProfile = {
528
- baseline: {
529
- dependencies: 120, // MB (node_modules loaded)
530
- processing: 180, // MB (peak during batch)
531
- total: 300 // MB
532
- },
533
- optimized: {
534
- nativeCode: 15, // MB (zero dependencies)
535
- processing: 45, // MB (optimized algorithms)
536
- caching: 25, // MB (intelligent cache)
537
- total: 85 // MB
538
- },
539
- reduction: 71.6 // percent
540
- };
541
- ```
542
-
543
- ### **🔬 Real-World Performance Validation**
544
-
545
- #### **Enterprise Customer Benchmarks**
546
- - **Company A** (2,500 icons): Processing time reduced from 8 minutes to 1.2 minutes
547
- - **Company B** (5,000 icons): Memory usage reduced from 450MB to 120MB
548
- - **Company C** (10,000 icons): Build time reduced from 15 minutes to 2.5 minutes
549
-
550
- #### **Framework-Specific Optimizations**
551
- ```typescript
552
- const frameworkOptimizations = {
553
- react: {
554
- forwardRefOptimization: true, // Reduces render overhead
555
- memoization: 'selective', // Smart memoization
556
- propsInterface: 'extends', // Efficient TypeScript
557
- improvement: 88 // percent
558
- },
559
- vue: {
560
- compositionAPI: true, // Faster than Options API
561
- scriptSetup: true, // Compile-time optimization
562
- templateOptimization: true, // Optimized template compilation
563
- improvement: 82 // percent
564
- },
565
- angular: {
566
- standaloneComponents: true, // Tree-shaking friendly
567
- onPushStrategy: true, // Reduced change detection
568
- signalsIntegration: true, // Modern Angular optimization
569
- improvement: 85 // percent
570
- }
571
- };
572
- ```
573
-
574
- ### **⚙️ Performance Configuration**
575
-
576
- #### **Optimal Performance Settings**
577
- ```bash
578
- # Maximum performance configuration
579
- svger-cli build \
580
- --src ./icons \
581
- --out ./components \
582
- --framework react \
583
- --parallel \
584
- --batch-size 25 \
585
- --max-concurrency 8 \
586
- --cache \
587
- --optimization maximum \
588
- --memory-limit 512
589
- ```
590
-
591
- #### **Performance Monitoring**
592
- ```typescript
593
- // Built-in performance monitoring
594
- const performanceMetrics = {
595
- processingTime: 850, // ms
596
- memoryPeak: 45, // MB
597
- cacheHitRate: 0.85, // 85%
598
- filesPerSecond: 117, // throughput
599
- cpuUtilization: 0.85, // 85%
600
- ioOperations: 1000, // file operations
601
- optimizationLevel: 'maximum'
602
- };
603
-
604
- // Performance recommendations
605
- const recommendations = [
606
- 'Increase batch size to 30 for better throughput',
607
- 'Enable caching for 40% improvement',
608
- 'Use parallel processing with 6 workers'
609
- ];
610
- ```
611
-
612
- ### **🚀 Continuous Performance Improvements**
613
-
614
- #### **Upcoming Optimizations (v2.1)**
615
- - **WASM Integration**: 15% additional improvement for path optimization
616
- - **Streaming Processing**: 20% improvement for large files
617
- - **GPU Acceleration**: 30% improvement for complex transformations
618
-
619
- ---
620
-
621
- ## � **Why SVGER-CLI? The Zero-Dependency Advantage**
622
-
623
- In a landscape cluttered with heavy, single-framework tools, **SVGER-CLI** stands alone. It's
624
- engineered from the ground up with a single philosophy: **native, zero-dependency performance**.
625
-
626
- - **No `node_modules` bloat**: Drastically smaller footprint.
627
- - **Faster installs**: Perfect for CI/CD and rapid development.
628
- - **Unmatched security**: No third-party vulnerabilities.
629
- - **Cross-framework consistency**: The same powerful engine for every framework.
630
-
631
- This lean approach delivers up to **85% faster processing** and a **90% smaller bundle size**
632
- compared to alternatives that rely on dozens of transitive dependencies.
633
-
634
- ---
635
-
636
- ## 📦 **Installation**
637
-
638
- Install globally for access to the `svger-cli` command anywhere.
639
-
640
- ```bash
641
- npm install -g svger-cli
642
- ```
643
-
644
- Or add it to your project's dev dependencies:
645
-
646
- ```bash
647
- npm install --save-dev svger-cli
648
- ```
649
-
650
- ---
651
-
652
- ## 🚀 **Quick Start: Your First Conversion**
653
-
654
- 1. **Place your SVGs** in a directory (e.g., `./my-svgs`).
655
- 2. **Run the build command**:
656
-
657
- ```bash
658
- # Convert all SVGs to React components (default)
659
- svger-cli build ./my-svgs ./components
660
- ```
661
-
662
- 3. **Use your components**: An `index.ts` is auto-generated for easy imports.
663
-
664
- ```tsx
665
- // Your app's component
666
- import { MyIcon, AnotherIcon } from './components';
667
-
668
- function App() {
669
- return (
670
- <div>
671
- <MyIcon className="text-blue-500" />
672
- <AnotherIcon size={32} style={{ color: 'red' }} />
673
- </div>
674
- );
675
- }
676
- ```
677
-
678
- ---
679
-
680
- ## 🌐 **Multi-Framework Usage Guide**
681
-
682
- SVGER-CLI brings a unified, powerful experience to every major framework. Select your target with
683
- the `--framework` flag.
684
-
685
- ### **React**
686
-
687
- Generate optimized React components with `forwardRef`, `memo`, and TypeScript interfaces.
688
-
689
- ```bash
690
- svger-cli build ./my-svgs ./react-components --framework react
691
- ```
692
-
693
- **Generated React Component (`.tsx`):**
694
-
695
- ```tsx
696
- import * as React from 'react';
697
-
698
- interface IconProps extends React.SVGProps<SVGSVGElement> {
699
- size?: number;
700
- }
701
-
702
- const MyIcon: React.FC<IconProps> = React.memo(
703
- React.forwardRef<SVGSVGElement, IconProps>(({ size = 24, ...props }, ref) => (
704
- <svg ref={ref} width={size} height={size} viewBox="0 0 24 24" {...props}>
705
- {/* SVG content */}
706
- </svg>
707
- ))
708
- );
709
-
710
- MyIcon.displayName = 'MyIcon';
711
- export default MyIcon;
712
- ```
713
-
714
- ### **Vue 3**
715
-
716
- Choose between **Composition API** (`--composition`) or **Options API**.
717
-
718
- ```bash
719
- # Composition API with <script setup>
720
- svger-cli build ./my-svgs ./vue-components --framework vue --composition
721
-
722
- # Options API
723
- svger-cli build ./my-svgs ./vue-components --framework vue
724
- ```
725
-
726
- **Generated Vue Component (`.vue`):**
727
-
728
- ```vue
729
- <script setup lang="ts">
730
- import { computed } from 'vue';
731
-
732
- interface Props {
733
- size?: number | string;
734
- }
735
-
736
- const props = withDefaults(defineProps<Props>(), {
737
- size: 24,
738
- });
739
-
740
- const sizeValue = computed(() => `${props.size}px`);
741
- </script>
742
-
743
- <template>
744
- <svg :width="sizeValue" :height="sizeValue" viewBox="0 0 24 24" v-bind="$attrs">
745
- {/* SVG content */}
746
- </svg>
747
- </template>
748
- ```
749
-
750
- ### **Angular**
751
-
752
- Generate **standalone components** (`--standalone`) or traditional module-based components.
753
-
754
- ```bash
755
- # Standalone component (recommended)
756
- svger-cli build ./my-svgs ./angular-components --framework angular --standalone
757
-
758
- # Module-based component
759
- svger-cli build ./my-svgs ./angular-components --framework angular
760
- ```
761
-
762
- **Generated Angular Component (`.component.ts`):**
763
-
764
- ```typescript
765
- import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
766
-
767
- @Component({
768
- selector: 'app-my-icon',
769
- standalone: true,
770
- template: `
771
- <svg
772
- [attr.width]="size"
773
- [attr.height]="size"
774
- viewBox="0 0 24 24"
775
- >
776
- {/* SVG content */}
777
- </svg>
778
- `,
779
- changeDetection: ChangeDetectionStrategy.OnPush,
780
- })
781
- export class MyIconComponent {
782
- @Input() size: number | string = 24;
783
- }
784
- ```
785
-
786
- ### **Svelte**
787
-
788
- Create native Svelte components with TypeScript props.
789
-
790
- ```bash
791
- svger-cli build ./my-svgs ./svelte-components --framework svelte
792
- ```
793
-
794
- **Generated Svelte Component (`.svelte`):**
795
-
796
- ```html
797
- <script lang="ts">
798
- export let size: number | string = 24;
799
- </script>
800
-
801
- <svg width="{size}" height="{size}" viewBox="0 0 24 24" {...$$restProps}>{/* SVG content */}</svg>
802
- ```
803
-
804
- ### **Solid**
805
-
806
- Generate efficient SolidJS components.
807
-
808
- ```bash
809
- svger-cli build ./my-svgs ./solid-components --framework solid
810
- ```
811
-
812
- **Generated Solid Component (`.tsx`):**
813
-
814
- ```tsx
815
- import type { Component, JSX } from 'solid-js';
816
-
817
- interface IconProps extends JSX.SvgSVGAttributes<SVGSVGElement> {
818
- size?: number | string;
819
- }
820
-
821
- const MyIcon: Component<IconProps> = props => {
822
- return (
823
- <svg width={props.size || 24} height={props.size || 24} viewBox="0 0 24 24" {...props}>
824
- {/* SVG content */}
825
- </svg>
826
- );
827
- };
828
-
829
- export default MyIcon;
830
- ```
831
-
832
- ### **Lit**
833
-
834
- Generate standard Web Components using the Lit library.
835
-
836
- ```bash
837
- svger-cli build ./my-svgs ./lit-components --framework lit
838
- ```
839
-
840
- **Generated Lit Component (`.ts`):**
841
-
842
- ```ts
843
- import { LitElement, html, svg } from 'lit';
844
- import { customElement, property } from 'lit/decorators.js';
845
-
846
- @customElement('my-icon')
847
- export class MyIcon extends LitElement {
848
- @property({ type: Number })
849
- size = 24;
850
-
851
- render() {
852
- return html`
853
- <svg width=${this.size} height=${this.size} viewBox="0 0 24 24">
854
- ${svg`{/* SVG content */}`}
855
- </svg>
856
- `;
857
- }
858
- }
859
- ```
860
-
861
- ### **Preact**
862
-
863
- Generate lightweight Preact components.
864
-
865
- ```bash
866
- svger-cli build ./my-svgs ./preact-components --framework preact
867
- ```
868
-
869
- **Generated Preact Component (`.tsx`):**
870
-
871
- ```tsx
872
- import { h } from 'preact';
873
- import type { FunctionalComponent } from 'preact';
874
-
875
- interface IconProps extends h.JSX.SVGAttributes<SVGSVGElement> {
876
- size?: number | string;
877
- }
878
-
879
- const MyIcon: FunctionalComponent<IconProps> = ({ size = 24, ...props }) => {
880
- return (
881
- <svg width={size} height={size} viewBox="0 0 24 24" {...props}>
882
- {/* SVG content */}
883
- </svg>
884
- );
885
- };
886
-
887
- export default MyIcon;
888
- ```
889
-
890
- ### **Vanilla JS/TS**
891
-
892
- Generate framework-agnostic factory functions for use anywhere.
893
-
894
- ```bash
895
- svger-cli build ./my-svgs ./vanilla-components --framework vanilla
896
- ```
897
-
898
- **Generated Vanilla Component (`.ts`):**
899
-
900
- ```ts
901
- interface IconOptions {
902
- size?: number | string;
903
- [key: string]: any;
904
- }
905
-
906
- export function createMyIcon(options: IconOptions = {}): SVGSVGElement {
907
- const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
908
- const size = options.size || 24;
909
-
910
- svg.setAttribute('width', String(size));
911
- svg.setAttribute('height', String(size));
912
- svg.setAttribute('viewBox', '0 0 24 24');
913
-
914
- svg.innerHTML = `{/* SVG content */}`;
915
- return svg;
916
- }
917
- ```
918
-
919
- ---
920
-
921
- ## 🔧 **Comprehensive CLI Reference**
922
-
923
- ### **1. Initialize Command**
924
-
925
- Set up SVGER-CLI configuration for your project.
926
-
927
- ```bash
928
- svger-cli init [options]
929
- ```
930
-
931
- **Options:**
932
-
933
- - `--framework <type>` - Target framework (react|vue|svelte|angular|solid|preact|lit|vanilla)
934
- - `--typescript` - Enable TypeScript generation (default: true)
935
- - `--src <path>` - Source directory for SVG files (default: ./src/assets/svg)
936
- - `--out <path>` - Output directory for components (default: ./src/components/icons)
937
- - `--interactive` - Interactive configuration wizard
938
-
939
- **Examples:**
940
-
941
- ```bash
942
- # Initialize with React + TypeScript
943
- svger-cli init --framework react --typescript
944
-
945
- # Initialize with Vue Composition API
946
- svger-cli init --framework vue --composition --typescript
947
-
948
- # Interactive setup
949
- svger-cli init --interactive
950
- ```
951
-
952
- **Generated Configuration (`.svgerconfig.json`):**
953
-
954
- ```json
955
- {
956
- "source": "./src/assets/svg",
957
- "output": "./src/components/icons",
958
- "framework": "react",
959
- "typescript": true,
960
- "componentType": "functional",
961
-
962
- "watch": false,
963
- "parallel": true,
964
- "batchSize": 10,
965
- "maxConcurrency": 4,
966
- "cache": true,
967
-
968
- "defaultWidth": 24,
969
- "defaultHeight": 24,
970
- "defaultFill": "currentColor",
971
- "defaultStroke": "none",
972
- "defaultStrokeWidth": 1,
973
-
974
- "exclude": ["logo.svg"],
975
- "include": ["icons/**", "illustrations/**"],
976
-
977
- "styleRules": {
978
- "fill": "inherit",
979
- "stroke": "none",
980
- "strokeWidth": "1",
981
- "opacity": "1"
982
- },
983
-
984
- "responsive": {
985
- "breakpoints": ["sm", "md", "lg", "xl"],
986
- "values": {
987
- "width": ["16px", "20px", "24px", "32px"],
988
- "height": ["16px", "20px", "24px", "32px"]
989
- }
990
- },
991
-
992
- "theme": {
993
- "mode": "auto",
994
- "variables": {
995
- "primary": "currentColor",
996
- "secondary": "#6b7280",
997
- "accent": "#3b82f6",
998
- "background": "#ffffff",
999
- "foreground": "#000000"
1000
- }
1001
- },
1002
-
1003
- "animations": ["fadeIn", "slideIn", "bounce"],
1004
-
1005
- "plugins": [
1006
- {
1007
- "name": "svg-optimizer",
1008
- "options": {
1009
- "removeComments": true,
1010
- "removeMetadata": true
1011
- }
1012
- }
1013
- ],
1014
-
1015
- "errorHandling": {
1016
- "strategy": "continue",
1017
- "maxRetries": 3,
1018
- "timeout": 30000
1019
- },
1020
-
1021
- "performance": {
1022
- "optimization": "balanced",
1023
- "memoryLimit": 512,
1024
- "cacheTimeout": 3600000
1025
- },
1026
-
1027
- "outputConfig": {
1028
- "naming": "pascal",
1029
- "extension": "tsx",
1030
- "directory": "./src/components/icons"
1031
- },
1032
-
1033
- "react": {
1034
- "componentType": "functional",
1035
- "forwardRef": true,
1036
- "memo": false,
1037
- "propsInterface": "SVGProps",
1038
- "styledComponents": false,
1039
- "cssModules": false
1040
- },
1041
-
1042
- "vue": {
1043
- "api": "composition",
1044
- "setup": true,
1045
- "typescript": true,
1046
- "scoped": true,
1047
- "cssVariables": true
1048
- },
1049
-
1050
- "angular": {
1051
- "standalone": true,
1052
- "signals": true,
1053
- "changeDetection": "OnPush",
1054
- "encapsulation": "Emulated"
1055
- }
1056
- }
1057
- ```
1058
-
1059
- ### **2. Build Command**
1060
-
1061
- Convert SVG files to framework components with advanced processing.
1062
-
1063
- ```bash
1064
- svger-cli build [options]
1065
- ```
1066
-
1067
- **Core Options:**
1068
-
1069
- - `--src <path>` - Source directory containing SVG files
1070
- - `--out <path>` - Output directory for generated components
1071
- - `--framework <type>` - Target framework for component generation
1072
- - `--typescript` - Generate TypeScript components (default: true)
1073
- - `--clean` - Clean output directory before building
1074
-
1075
- **Performance Options:**
1076
-
1077
- - `--parallel` - Enable parallel processing (default: true)
1078
- - `--batch-size <number>` - Number of files per batch (default: 10)
1079
- - `--max-concurrency <number>` - Maximum concurrent processes (default: CPU cores)
1080
- - `--cache` - Enable processing cache for faster rebuilds
1081
- - `--performance` - Display performance metrics
1082
-
1083
- **Framework-Specific Options:**
1084
-
1085
- - `--composition` - Use Vue Composition API (Vue only)
1086
- - `--setup` - Use Vue script setup syntax (Vue only)
1087
- - `--standalone` - Generate Angular standalone components (Angular only)
1088
- - `--signals` - Use signals for state management (Solid/Angular)
1089
- - `--forward-ref` - Generate React forwardRef components (React only)
1090
-
1091
- **Styling Options:**
1092
-
1093
- - `--responsive` - Enable responsive design utilities
1094
- - `--theme <mode>` - Apply theme mode (light|dark|auto)
1095
- - `--styled-components` - Generate styled-components (React/Solid)
1096
- - `--css-modules` - Enable CSS Modules support
1097
-
1098
- **Examples:**
1099
-
1100
- ```bash
1101
- # Basic build
1102
- svger-cli build --src ./icons --out ./components
1103
-
1104
- # Advanced React build with styling
1105
- svger-cli build \
1106
- --src ./icons \
1107
- --out ./components \
1108
- --framework react \
1109
- --typescript \
1110
- --forward-ref \
1111
- --styled-components \
1112
- --responsive \
1113
- --theme dark
1114
-
1115
- # High-performance Vue build
1116
- svger-cli build \
1117
- --src ./icons \
1118
- --out ./components \
1119
- --framework vue \
1120
- --composition \
1121
- --setup \
1122
- --parallel \
1123
- --batch-size 20 \
1124
- --cache \
1125
- --performance
1126
-
1127
- # Angular standalone components
1128
- svger-cli build \
1129
- --src ./icons \
1130
- --out ./components \
1131
- --framework angular \
1132
- --standalone \
1133
- --typescript \
1134
- --signals
1135
-
1136
- # Vanilla TypeScript with optimization
1137
- svger-cli build \
1138
- --src ./icons \
1139
- --out ./components \
1140
- --framework vanilla \
1141
- --typescript \
1142
- --optimization maximum
1143
- ```
1144
-
1145
- ### **3. Watch Command**
1146
-
1147
- Monitor directories for SVG changes and auto-generate components.
1148
-
1149
- ```bash
1150
- svger-cli watch [options]
1151
- ```
1152
-
1153
- **Options:**
1154
-
1155
- - All `build` command options
1156
- - `--debounce <ms>` - Debounce time for file changes (default: 300ms)
1157
- - `--ignore <patterns>` - Ignore file patterns (glob syntax)
1158
- - `--verbose` - Detailed logging of file changes
1159
-
1160
- **Examples:**
1161
-
1162
- ```bash
1163
- # Basic watch mode
1164
- svger-cli watch --src ./icons --out ./components
1165
-
1166
- # Advanced watch with debouncing
1167
- svger-cli watch \
1168
- --src ./icons \
1169
- --out ./components \
1170
- --framework react \
1171
- --debounce 500 \
1172
- --ignore "**/*.tmp" \
1173
- --verbose
1174
-
1175
- # Production watch mode
1176
- svger-cli watch \
1177
- --src ./icons \
1178
- --out ./components \
1179
- --framework vue \
1180
- --composition \
1181
- --parallel \
1182
- --cache \
1183
- --performance
1184
- ```
1185
-
1186
- ### **4. Generate Command**
1187
-
1188
- Process specific SVG files with precise control.
1189
-
1190
- ```bash
1191
- svger-cli generate <input> [options]
1192
- ```
1193
-
1194
- **Arguments:**
1195
-
1196
- - `<input>` - SVG file path or glob pattern
1197
-
1198
- **Options:**
1199
-
1200
- - All `build` command options
1201
- - `--name <string>` - Override component name
1202
- - `--template <type>` - Component template (functional|class|forwardRef|memo)
1203
-
1204
- **Examples:**
1205
-
1206
- ```bash
1207
- # Generate single component
1208
- svger-cli generate ./icons/heart.svg --out ./components --name HeartIcon
1209
-
1210
- # Generate with custom template
1211
- svger-cli generate ./icons/star.svg \
1212
- --out ./components \
1213
- --framework react \
1214
- --template forwardRef \
1215
- --typescript
1216
-
1217
- # Generate multiple files with glob
1218
- svger-cli generate "./icons/social-*.svg" \
1219
- --out ./components/social \
1220
- --framework vue \
1221
- --composition
1222
-
1223
- # Generate with advanced styling
1224
- svger-cli generate ./icons/logo.svg \
1225
- --out ./components \
1226
- --name CompanyLogo \
1227
- --styled-components \
1228
- --responsive \
1229
- --theme dark
1230
- ```
1231
-
1232
- ### **5. Lock/Unlock Commands**
1233
-
1234
- Manage file protection during batch operations.
1235
-
1236
- ```bash
1237
- svger-cli lock <files...>
1238
- svger-cli unlock <files...>
1239
- ```
1240
-
1241
- **Examples:**
1242
-
1243
- ```bash
1244
- # Lock specific files
1245
- svger-cli lock ./icons/logo.svg ./icons/brand.svg
1246
-
1247
- # Lock pattern
1248
- svger-cli lock "./icons/brand-*.svg"
1249
-
1250
- # Unlock files
1251
- svger-cli unlock ./icons/logo.svg
1252
-
1253
- # Unlock all
1254
- svger-cli unlock --all
1255
- ```
1256
-
1257
- ### **6. Config Command**
1258
-
1259
- Manage project configuration dynamically.
1260
-
1261
- ```bash
1262
- svger-cli config [options]
1263
- ```
1264
-
1265
- **Options:**
1266
-
1267
- - `--show` - Display current configuration
1268
- - `--set <key=value>` - Set configuration value
1269
- - `--get <key>` - Get specific configuration value
1270
- - `--reset` - Reset to default configuration
1271
- - `--validate` - Validate current configuration
1272
-
1273
- **Examples:**
1274
-
1275
- ```bash
1276
- # Show current config
1277
- svger-cli config --show
1278
-
1279
- # Set configuration values
1280
- svger-cli config --set framework=vue
1281
- svger-cli config --set typescript=true
1282
- svger-cli config --set "defaultWidth=32"
1283
- svger-cli config --set "styleRules.fill=currentColor"
1284
-
1285
- # Get specific value
1286
- svger-cli config --get framework
1287
-
1288
- # Reset configuration
1289
- svger-cli config --reset
1290
-
1291
- # Validate configuration
1292
- svger-cli config --validate
1293
- ```
1294
-
1295
- ### **7. Clean Command**
1296
-
1297
- Remove generated components and clean workspace.
1298
-
1299
- ```bash
1300
- svger-cli clean [options]
1301
- ```
1302
-
1303
- **Options:**
1304
-
1305
- - `--out <path>` - Output directory to clean
1306
- - `--cache` - Clear processing cache
1307
- - `--logs` - Clear log files
1308
- - `--all` - Clean everything (components, cache, logs)
1309
- - `--dry-run` - Preview what would be cleaned
1310
-
1311
- **Examples:**
1312
-
1313
- ```bash
1314
- # Clean output directory
1315
- svger-cli clean --out ./components
1316
-
1317
- # Clean cache only
1318
- svger-cli clean --cache
1319
-
1320
- # Clean everything
1321
- svger-cli clean --all
1322
-
1323
- # Preview clean operation
1324
- svger-cli clean --all --dry-run
1325
- ```
1326
-
1327
- ### **8. Performance Command**
1328
-
1329
- Analyze and optimize processing performance.
1330
-
1331
- ```bash
1332
- svger-cli performance [options]
1333
- ```
1334
-
1335
- **Options:**
1336
-
1337
- - `--analyze` - Analyze current project performance
1338
- - `--benchmark` - Run performance benchmarks
1339
- - `--memory` - Display memory usage statistics
1340
- - `--cache-stats` - Show cache performance statistics
1341
- - `--optimize` - Apply performance optimizations
1342
-
1343
- **Examples:**
1344
-
1345
- ```bash
1346
- # Analyze performance
1347
- svger-cli performance --analyze
1348
-
1349
- # Run benchmarks
1350
- svger-cli performance --benchmark
1351
-
1352
- # Memory analysis
1353
- svger-cli performance --memory
1354
-
1355
- # Cache statistics
1356
- svger-cli performance --cache-stats
1357
-
1358
- # Apply optimizations
1359
- svger-cli performance --optimize
1360
- ```
1361
-
1362
- ---
1363
-
1364
- ## 💻 **Usage Examples: From Simple to Complex**
1365
-
1366
- ### **🔥 Example 1: Quick Start (Simplest)**
1367
-
1368
- Get started in 30 seconds:
1369
-
1370
- ```bash
1371
- # Install globally
1372
- npm install -g svger-cli
1373
-
1374
- # Convert SVGs to React components
1375
- svger-cli build ./my-icons ./components
1376
-
1377
- # Use the auto-generated exports
1378
- import { ArrowLeft, Home, User } from './components';
1379
-
1380
- function App() {
1381
- return (
1382
- <div>
1383
- <ArrowLeft />
1384
- <Home className="text-blue-500" />
1385
- <User size={32} style={{ color: 'red' }} />
1386
- </div>
1387
- );
1388
- }
1389
- ```
1390
-
1391
- **What happens:**
1392
-
1393
- - All SVGs in `./my-icons` converted to React components
1394
- - ✅ Auto-generated `index.ts` with clean exports
1395
- - ✅ Components support `className`, `style`, `size` props
1396
- - ✅ TypeScript interfaces automatically included
1397
-
1398
- ---
1399
-
1400
- ### **🚀 Example 2: Production Setup (Intermediate)**
1401
-
1402
- Professional setup with configuration and optimization:
1403
-
1404
- ```bash
1405
- # Initialize with custom configuration
1406
- svger-cli init --framework react --typescript --interactive
1407
-
1408
- # Generated .svgerconfig.json:
1409
- {
1410
- "source": "./src/assets/icons",
1411
- "output": "./src/components/icons",
1412
- "framework": "react",
1413
- "typescript": true,
1414
- "forwardRef": true,
1415
- "parallel": true,
1416
- "batchSize": 15,
1417
- "responsive": {
1418
- "breakpoints": ["sm", "md", "lg"],
1419
- "values": {
1420
- "width": ["16px", "24px", "32px"]
1421
- }
1422
- }
1423
- }
1424
-
1425
- # Build with optimizations
1426
- svger-cli build --performance --cache
1427
-
1428
- # Start development mode
1429
- svger-cli watch --debounce 500 --verbose
1430
- ```
1431
-
1432
- **Generated Components:**
1433
-
1434
- ```typescript
1435
- // Auto-generated: src/components/icons/ArrowLeft.tsx
1436
- import React from 'react';
1437
-
1438
- interface ArrowLeftProps extends React.SVGProps<SVGSVGElement> {
1439
- size?: number | 'sm' | 'md' | 'lg';
1440
- }
1441
-
1442
- const ArrowLeft = React.forwardRef<SVGSVGElement, ArrowLeftProps>(
1443
- ({ size = 24, className, style, ...props }, ref) => {
1444
- const sizeValue = typeof size === 'string'
1445
- ? { sm: 16, md: 24, lg: 32 }[size]
1446
- : size;
1447
-
1448
- return (
1449
- <svg
1450
- ref={ref}
1451
- width={sizeValue}
1452
- height={sizeValue}
1453
- viewBox="0 0 24 24"
1454
- fill="none"
1455
- className={className}
1456
- style={style}
1457
- {...props}
1458
- >
1459
- <path d="M19 12H5M12 19l-7-7 7-7" stroke="currentColor" strokeWidth="2"/>
1460
- </svg>
1461
- );
1462
- }
1463
- );
1464
-
1465
- ArrowLeft.displayName = 'ArrowLeft';
1466
- export default ArrowLeft;
1467
- ```
1468
-
1469
- **Auto-generated index.ts:**
1470
-
1471
- ```typescript
1472
- /**
1473
- * Auto-generated icon exports
1474
- * Import icons: import { ArrowLeft, Home } from './components/icons'
1475
- */
1476
- export { default as ArrowLeft } from './ArrowLeft';
1477
- export { default as Home } from './Home';
1478
- export { default as User } from './User';
1479
-
1480
- // Default export for flexible importing
1481
- export default {
1482
- ArrowLeft,
1483
- Home,
1484
- User,
1485
- };
1486
- ```
1487
-
1488
- **Usage in App:**
1489
-
1490
- ```typescript
1491
- import { ArrowLeft, Home, User } from './components/icons';
1492
-
1493
- function Navigation() {
1494
- return (
1495
- <nav className="flex items-center space-x-4">
1496
- <ArrowLeft
1497
- size="sm"
1498
- className="text-gray-600 hover:text-gray-900"
1499
- onClick={() => history.back()}
1500
- />
1501
- <Home
1502
- size={28}
1503
- style={{ color: 'var(--primary-color)' }}
1504
- />
1505
- <User
1506
- className="w-6 h-6 text-blue-500"
1507
- ref={userIconRef}
1508
- />
1509
- </nav>
1510
- );
1511
- }
1512
- ```
1513
-
1514
- ---
1515
-
1516
- ### **🏗️ Example 3: Enterprise Multi-Framework (Advanced)**
1517
-
1518
- Complete enterprise setup supporting multiple frameworks:
1519
-
1520
- ```bash
1521
- # Project structure
1522
- my-design-system/
1523
- ├── icons/ # Source SVG files
1524
- ├── react-components/ # React output
1525
- ├── vue-components/ # Vue output
1526
- ├── angular-components/ # Angular output
1527
- └── vanilla-components/ # Vanilla JS/TS output
1528
-
1529
- # Generate for React with full features
1530
- svger-cli build \
1531
- --src ./icons \
1532
- --out ./react-components \
1533
- --framework react \
1534
- --typescript \
1535
- --forward-ref \
1536
- --styled-components \
1537
- --responsive \
1538
- --theme dark \
1539
- --parallel \
1540
- --batch-size 20 \
1541
- --performance
1542
-
1543
- # Generate for Vue with Composition API
1544
- svger-cli build \
1545
- --src ./icons \
1546
- --out ./vue-components \
1547
- --framework vue \
1548
- --composition \
1549
- --setup \
1550
- --typescript \
1551
- --responsive
1552
-
1553
- # Generate for Angular with standalone components
1554
- svger-cli build \
1555
- --src ./icons \
1556
- --out ./angular-components \
1557
- --framework angular \
1558
- --standalone \
1559
- --signals \
1560
- --typescript
1561
-
1562
- # Generate vanilla TypeScript for maximum compatibility
1563
- svger-cli build \
1564
- --src ./icons \
1565
- --out ./vanilla-components \
1566
- --framework vanilla \
1567
- --typescript
1568
- ```
1569
-
1570
- **React Components with Styled Components:**
1571
-
1572
- ```typescript
1573
- // Generated: react-components/ArrowLeft.tsx
1574
- import React from 'react';
1575
- import styled, { css } from 'styled-components';
1576
-
1577
- interface ArrowLeftProps extends React.SVGProps<SVGSVGElement> {
1578
- size?: number | 'sm' | 'md' | 'lg' | 'xl';
1579
- variant?: 'primary' | 'secondary' | 'accent';
1580
- theme?: 'light' | 'dark';
1581
- }
1582
-
1583
- const StyledSVG = styled.svg<ArrowLeftProps>`
1584
- ${({ theme, variant }) => css`
1585
- color: ${theme === 'dark'
1586
- ? 'var(--icon-color-dark)'
1587
- : 'var(--icon-color-light)'};
1588
-
1589
- ${variant === 'primary' && css`
1590
- color: var(--primary-color);
1591
- `}
1592
-
1593
- ${variant === 'secondary' && css`
1594
- color: var(--secondary-color);
1595
- `}
1596
-
1597
- ${variant === 'accent' && css`
1598
- color: var(--accent-color);
1599
- `}
1600
-
1601
- transition: all 0.2s ease;
1602
-
1603
- &:hover {
1604
- transform: scale(1.1);
1605
- }
1606
- `}
1607
- `;
1608
-
1609
- const ArrowLeft = React.forwardRef<SVGSVGElement, ArrowLeftProps>(
1610
- ({ size = 'md', variant = 'primary', theme = 'light', ...props }, ref) => {
1611
- const sizeMap = {
1612
- sm: 16, md: 24, lg: 32, xl: 40
1613
- };
1614
-
1615
- const sizeValue = typeof size === 'string' ? sizeMap[size] : size;
1616
-
1617
- return (
1618
- <StyledSVG
1619
- ref={ref}
1620
- width={sizeValue}
1621
- height={sizeValue}
1622
- viewBox="0 0 24 24"
1623
- fill="none"
1624
- variant={variant}
1625
- theme={theme}
1626
- {...props}
1627
- >
1628
- <path
1629
- d="M19 12H5M12 19l-7-7 7-7"
1630
- stroke="currentColor"
1631
- strokeWidth="2"
1632
- />
1633
- </StyledSVG>
1634
- );
1635
- }
1636
- );
1637
-
1638
- ArrowLeft.displayName = 'ArrowLeft';
1639
- export default ArrowLeft;
1640
- ```
1641
-
1642
- **Vue Composition API Components:**
1643
-
1644
- ```vue
1645
- <!-- Generated: vue-components/ArrowLeft.vue -->
1646
- <script setup lang="ts">
1647
- interface Props {
1648
- size?: number | 'sm' | 'md' | 'lg';
1649
- className?: string;
1650
- style?: Record<string, any>;
1651
- }
1652
-
1653
- const props = withDefaults(defineProps<Props>(), {
1654
- size: 'md',
1655
- });
1656
-
1657
- const sizeValue = computed(() => {
1658
- if (typeof props.size === 'string') {
1659
- return { sm: 16, md: 24, lg: 32 }[props.size];
1660
- }
1661
- return props.size;
1662
- });
1663
- </script>
1664
-
1665
- <template>
1666
- <svg
1667
- :width="sizeValue"
1668
- :height="sizeValue"
1669
- viewBox="0 0 24 24"
1670
- fill="none"
1671
- :class="className"
1672
- :style="style"
1673
- v-bind="$attrs"
1674
- >
1675
- <path d="M19 12H5M12 19l-7-7 7-7" stroke="currentColor" stroke-width="2" />
1676
- </svg>
1677
- </template>
1678
-
1679
- <style scoped>
1680
- svg {
1681
- color: var(--icon-color, currentColor);
1682
- transition: all 0.2s ease;
1683
- }
1684
-
1685
- svg:hover {
1686
- transform: scale(1.05);
1687
- }
1688
- </style>
1689
- ```
1690
-
1691
- **Angular Standalone Components:**
1692
-
1693
- ```typescript
1694
- // Generated: angular-components/arrow-left.component.ts
1695
- import { Component, Input, signal } from '@angular/core';
1696
- import { CommonModule } from '@angular/common';
1697
-
1698
- @Component({
1699
- selector: 'app-arrow-left',
1700
- standalone: true,
1701
- imports: [CommonModule],
1702
- template: `
1703
- <svg
1704
- [attr.width]="computedSize()"
1705
- [attr.height]="computedSize()"
1706
- viewBox="0 0 24 24"
1707
- fill="none"
1708
- [class]="className"
1709
- [style]="style"
1710
- >
1711
- <path d="M19 12H5M12 19l-7-7 7-7" stroke="currentColor" stroke-width="2" />
1712
- </svg>
1713
- `,
1714
- styles: [
1715
- `
1716
- svg {
1717
- color: var(--icon-color, currentColor);
1718
- transition: all 0.2s ease;
1719
- }
1720
- svg:hover {
1721
- transform: scale(1.05);
1722
- }
1723
- `,
1724
- ],
1725
- })
1726
- export class ArrowLeftComponent {
1727
- @Input() size: number | 'sm' | 'md' | 'lg' = 'md';
1728
- @Input() className: string = '';
1729
- @Input() style: Record<string, any> = {};
1730
-
1731
- private sizeMap = { sm: 16, md: 24, lg: 32 };
1732
-
1733
- computedSize = signal(() => {
1734
- return typeof this.size === 'string' ? this.sizeMap[this.size] : this.size;
1735
- });
1736
- }
1737
- ```
1738
-
1739
- ---
1740
-
1741
- ### **🔒 Example 4: File Protection & Team Workflows (Advanced)**
1742
-
1743
- Protect critical files and manage team workflows:
1744
-
1745
- ```bash
1746
- # Lock critical brand assets
1747
- svger-cli lock ./icons/logo.svg
1748
- svger-cli lock ./icons/brand-mark.svg
1749
-
1750
- # Build process automatically skips locked files
1751
- svger-cli build ./icons ./components
1752
- # ⚠️ Warning: Skipped locked file: logo.svg
1753
- # ⚠️ Warning: Skipped locked file: brand-mark.svg
1754
- # Generated 23 components (2 files locked)
1755
-
1756
- # Watch mode respects locks
1757
- svger-cli watch ./icons ./components
1758
- # File changes to locked files are ignored
1759
-
1760
- # Team workflow: selective unlocking
1761
- svger-cli unlock ./icons/logo.svg --confirm
1762
- svger-cli build ./icons ./components --force-locked-update
1763
-
1764
- # List all locked files
1765
- svger-cli status --locked
1766
- ```
1767
-
1768
- **Team Configuration (.svgerconfig.json):**
1769
-
1770
- ```json
1771
- {
1772
- "source": "./src/assets/icons",
1773
- "output": "./src/components/icons",
1774
- "framework": "react",
1775
- "typescript": true,
1776
- "forwardRef": true,
1777
- "lockedFiles": ["./src/assets/icons/logo.svg", "./src/assets/icons/brand-mark.svg"],
1778
- "teamSettings": {
1779
- "requireConfirmation": true,
1780
- "lockByDefault": false,
1781
- "autoLockPatterns": ["**/brand-*", "**/logo-*"]
1782
- }
1783
- }
1784
- ```
1785
-
1786
- ---
1787
-
1788
- ### **⚡ Example 5: Performance Optimization (Expert)**
1789
-
1790
- Maximum performance setup for large-scale projects:
1791
-
1792
- ```bash
1793
- # Performance analysis
1794
- svger-cli performance --analyze
1795
- # 📊 Processing 1,247 SVG files
1796
- # 📊 Average file size: 3.2KB
1797
- # 📊 Estimated processing time: 2.1s
1798
- # 💡 Recommendations:
1799
- # - Increase batch size to 25
1800
- # - Enable caching for 40% improvement
1801
- # - Use parallel processing
1802
-
1803
- # Apply performance optimizations
1804
- svger-cli build \
1805
- --src ./massive-icon-library \
1806
- --out ./optimized-components \
1807
- --framework react \
1808
- --parallel \
1809
- --batch-size 25 \
1810
- --max-concurrency 8 \
1811
- --cache \
1812
- --performance \
1813
- --memory-limit 512
1814
-
1815
- # Monitor performance in real-time
1816
- svger-cli performance --monitor &
1817
- svger-cli watch ./icons ./components
1818
-
1819
- # Advanced caching strategy
1820
- svger-cli config set cache.strategy "aggressive"
1821
- svger-cli config set cache.ttl 3600000 # 1 hour
1822
- svger-cli config set cache.maxSize 1024 # 1GB
1823
-
1824
- # Benchmark against previous versions
1825
- svger-cli performance --benchmark --compare-with v1.5.0
1826
- ```
1827
-
1828
- **Performance Configuration:**
1829
-
1830
- ```json
1831
- {
1832
- "performance": {
1833
- "optimization": "maximum",
1834
- "parallel": true,
1835
- "batchSize": 25,
1836
- "maxConcurrency": 8,
1837
- "cache": {
1838
- "enabled": true,
1839
- "strategy": "aggressive",
1840
- "ttl": 3600000,
1841
- "maxSize": 1024
1842
- },
1843
- "memory": {
1844
- "limit": 512,
1845
- "gcInterval": 30000,
1846
- "heapWarning": 400
1847
- }
1848
- }
1849
- }
1850
- ```
1851
-
1852
- **Enterprise Usage Patterns:**
1853
-
1854
- ```typescript
1855
- // Large-scale import pattern
1856
- import IconLibrary from './components/icons';
1857
-
1858
- // Lazy loading for performance
1859
- const LazyIcon = React.lazy(() => import('./components/icons/SpecificIcon'));
1860
-
1861
- // Tree-shaking friendly imports
1862
- import {
1863
- ArrowLeft,
1864
- ArrowRight,
1865
- Home,
1866
- User,
1867
- Settings
1868
- } from './components/icons';
1869
-
1870
- // Dynamic icon loading
1871
- const DynamicIcon = ({ name, ...props }) => {
1872
- const IconComponent = IconLibrary[name];
1873
- return IconComponent ? <IconComponent {...props} /> : null;
1874
- };
1875
- ```
1876
-
1877
- ---
1878
-
1879
- ## 🎨 **Advanced Styling & Theming**
1880
-
1881
- ### **Responsive Design System**
1882
-
1883
- SVGER-CLI includes a comprehensive responsive design system:
1884
-
1885
- ```bash
1886
- # Enable responsive design
1887
- svger-cli build --responsive --src ./icons --out ./components
1888
- ```
1889
-
1890
- **Configuration:**
1891
-
1892
- ```json
1893
- {
1894
- "responsive": {
1895
- "breakpoints": ["sm", "md", "lg", "xl"],
1896
- "values": {
1897
- "width": ["16px", "20px", "24px", "32px"],
1898
- "height": ["16px", "20px", "24px", "32px"],
1899
- "strokeWidth": ["1", "1.5", "2", "2.5"]
1900
- }
1901
- }
1902
- }
1903
- ```
1904
-
1905
- **Generated React Component:**
1906
-
1907
- ```tsx
1908
- interface ResponsiveIconProps extends React.SVGProps<SVGSVGElement> {
1909
- size?: 'sm' | 'md' | 'lg' | 'xl';
1910
- }
1911
-
1912
- const ResponsiveIcon: React.FC<ResponsiveIconProps> = ({ size = 'md', ...props }) => {
1913
- const sizeMap = {
1914
- sm: { width: 16, height: 16 },
1915
- md: { width: 20, height: 20 },
1916
- lg: { width: 24, height: 24 },
1917
- xl: { width: 32, height: 32 },
1918
- };
1919
-
1920
- return (
1921
- <svg {...sizeMap[size]} {...props}>
1922
- ...
1923
- </svg>
1924
- );
1925
- };
1926
- ```
1927
-
1928
- ### **Theme System**
1929
-
1930
- Built-in dark/light theme support with CSS variables:
1931
-
1932
- ```bash
1933
- # Generate with theme support
1934
- svger-cli build --theme dark --src ./icons --out ./components
1935
- ```
1936
-
1937
- **Theme Configuration:**
1938
-
1939
- ```json
1940
- {
1941
- "theme": {
1942
- "mode": "dark",
1943
- "variables": {
1944
- "primary": "#ffffff",
1945
- "secondary": "#94a3b8",
1946
- "accent": "#3b82f6"
1947
- }
1948
- }
1949
- }
1950
- ```
1951
-
1952
- **Generated CSS Variables:**
1953
-
1954
- ```css
1955
- :root {
1956
- --icon-primary: #ffffff;
1957
- --icon-secondary: #94a3b8;
1958
- --icon-accent: #3b82f6;
1959
- }
1960
-
1961
- .icon {
1962
- fill: var(--icon-primary);
1963
- stroke: var(--icon-secondary);
1964
- }
1965
- ```
1966
-
1967
- ### **Animation System**
1968
-
1969
- Built-in animation utilities:
1970
-
1971
- ```bash
1972
- # Generate with animations
1973
- svger-cli build --animations hover,focus --src ./icons --out ./components
1974
- ```
1975
-
1976
- **Available Animations:**
1977
-
1978
- - `hover` - Hover state transitions
1979
- - `focus` - Focus state transitions
1980
- - `spin` - Continuous rotation
1981
- - `pulse` - Pulsing opacity
1982
- - `bounce` - Bouncing effect
1983
- - `scale` - Scale on interaction
1984
-
1985
- ---
1986
-
1987
- ## 💻 **Programmatic API**
1988
-
1989
- ### **Core API Usage**
1990
-
1991
- ```typescript
1992
- import { SVGER, svgProcessor, frameworkTemplateEngine } from 'svger-cli';
1993
-
1994
- // Quick processing
1995
- await SVGER.processFile('./icon.svg', './components/');
1996
- await SVGER.processBatch(files, { parallel: true, batchSize: 20 });
1997
-
1998
- // Framework-specific generation
1999
- await SVGER.generateFrameworkComponent('IconName', svgContent, {
2000
- framework: 'vue',
2001
- composition: true,
2002
- typescript: true,
2003
- });
2004
-
2005
- // Advanced processing
2006
- const result = await svgProcessor.processSVGFile('./icon.svg', './components/', {
2007
- framework: 'react',
2008
- typescript: true,
2009
- forwardRef: true,
2010
- responsive: true,
2011
- theme: 'dark',
2012
- });
2013
- ```
2014
-
2015
- ### **Performance Engine API**
2016
-
2017
- ```typescript
2018
- import { performanceEngine } from 'svger-cli';
2019
-
2020
- // Batch processing with performance optimization
2021
- const results = await performanceEngine.processBatch(files, {
2022
- batchSize: 15,
2023
- parallel: true,
2024
- maxConcurrency: 6,
2025
- });
2026
-
2027
- // Memory monitoring
2028
- const metrics = performanceEngine.monitorMemoryUsage();
2029
- console.log(`Memory usage: ${metrics.heapUsed}MB`);
2030
- console.log(`Recommendations:`, metrics.recommendations);
2031
-
2032
- // SVG optimization
2033
- const optimized = performanceEngine.optimizeSVGContent(svgContent, 'maximum');
2034
- ```
2035
-
2036
- ### **Style Compiler API**
2037
-
2038
- ```typescript
2039
- import { styleCompiler } from 'svger-cli';
2040
-
2041
- // Compile responsive styles
2042
- const styles = styleCompiler.compileStyles({
2043
- responsive: {
2044
- width: ['20px', '24px', '32px'],
2045
- height: ['20px', '24px', '32px'],
2046
- },
2047
- theme: 'dark',
2048
- animations: ['hover', 'focus'],
2049
- });
2050
-
2051
- // Generate CSS
2052
- const css = styleCompiler.generateCSS(styles);
2053
- ```
2054
-
2055
- ### **Plugin System API**
2056
-
2057
- ```typescript
2058
- import { pluginManager } from 'svger-cli';
2059
-
2060
- // Register custom plugin
2061
- pluginManager.registerPlugin({
2062
- name: 'custom-optimizer',
2063
- version: '1.0.0',
2064
- process: async (content: string, options?: any) => {
2065
- // Custom SVG processing logic
2066
- return processedContent;
2067
- },
2068
- validate: (options?: any) => true,
2069
- });
2070
-
2071
- // Enable plugin
2072
- pluginManager.enablePlugin('custom-optimizer', { level: 'maximum' });
2073
-
2074
- // Process with plugins
2075
- const processed = await pluginManager.processContent(svgContent, [
2076
- { name: 'svg-optimizer', options: { level: 'balanced' } },
2077
- { name: 'custom-optimizer', options: { level: 'maximum' } },
2078
- ]);
2079
- ```
2080
-
2081
- ---
2082
-
2083
- ## 🔧 **Configuration Reference**
2084
-
2085
- ### **Complete Configuration Schema**
2086
-
2087
- All configuration options are now fully implemented and tested:
2088
-
2089
- ```typescript
2090
- interface SVGConfig {
2091
- // Source & Output
2092
- source: string; // Input directory path
2093
- output: string; // Output directory path
2094
-
2095
- // Framework Configuration
2096
- framework: FrameworkType; // Target framework
2097
- typescript: boolean; // Generate TypeScript
2098
- componentType: ComponentType; // Component pattern
2099
-
2100
- // Processing Options
2101
- watch: boolean; // Enable file watching
2102
- parallel: boolean; // Enable parallel processing
2103
- batchSize: number; // Batch processing size
2104
- maxConcurrency: number; // Maximum concurrent processes
2105
- cache: boolean; // Enable processing cache
2106
-
2107
- // Default Properties
2108
- defaultWidth: number; // Default SVG width
2109
- defaultHeight: number; // Default SVG height
2110
- defaultFill: string; // Default fill color
2111
- defaultStroke: string; // Default stroke color
2112
- defaultStrokeWidth: number; // Default stroke width
2113
-
2114
- // Styling Configuration
2115
- styleRules: {
2116
- // CSS styling rules
2117
- [property: string]: string;
2118
- };
2119
-
2120
- responsive: {
2121
- // Responsive design
2122
- breakpoints: string[];
2123
- values: {
2124
- [property: string]: string[];
2125
- };
2126
- };
2127
-
2128
- theme: {
2129
- // Theme configuration
2130
- mode: 'light' | 'dark' | 'auto';
2131
- variables: {
2132
- [name: string]: string;
2133
- };
2134
- };
2135
-
2136
- animations: string[]; // Animation effects
2137
-
2138
- // Advanced Options
2139
- plugins: PluginConfig[]; // Plugin configurations
2140
- exclude: string[]; // Files to exclude
2141
- include: string[]; // Files to include (overrides exclude)
2142
-
2143
- // Error Handling
2144
- errorHandling: {
2145
- strategy: 'continue' | 'stop' | 'retry';
2146
- maxRetries: number;
2147
- timeout: number;
2148
- };
2149
-
2150
- // Performance Settings
2151
- performance: {
2152
- optimization: 'fast' | 'balanced' | 'maximum';
2153
- memoryLimit: number; // Memory limit in MB
2154
- cacheTimeout: number; // Cache timeout in ms
2155
- };
2156
-
2157
- // Output Customization
2158
- outputConfig: {
2159
- naming: 'kebab' | 'pascal' | 'camel';
2160
- extension: string; // File extension override
2161
- directory: string; // Output directory structure
2162
- };
2163
-
2164
- // Framework-specific configurations
2165
- react?: ReactConfig;
2166
- vue?: VueConfig;
2167
- angular?: AngularConfig;
2168
- }
2169
- ```
2170
-
2171
- **✅ All 28 configuration properties are fully implemented and tested**
2172
-
2173
- ### **Configuration Validation**
2174
-
2175
- SVGER-CLI includes comprehensive configuration validation to ensure all settings are correct:
2176
-
2177
- ```bash
2178
- # Validate current configuration
2179
- svger-cli config --validate
2180
-
2181
- # Show detailed configuration analysis
2182
- svger-cli config --show
2183
-
2184
- # Test configuration with sample files
2185
- svger-cli build --dry-run --src ./test-svg --out ./test-output
2186
- ```
2187
-
2188
- **Validation Features:**
2189
-
2190
- - ✅ **Type Safety**: All configuration options are type-checked
2191
- - **Framework Compatibility**: Validates framework-specific options
2192
- - **Performance Settings**: Ensures optimal performance configuration
2193
- - **Path Validation**: Verifies source and output directories
2194
- - ✅ **Plugin Validation**: Checks plugin compatibility and options
2195
-
2196
- ### **Example Configuration Files**
2197
-
2198
- A comprehensive example configuration is included with detailed explanations:
2199
-
2200
- ```bash
2201
- # Copy example configuration
2202
- cp .svgerconfig.example.json .svgerconfig.json
2203
-
2204
- # Initialize with interactive setup
2205
- svger-cli init --interactive
2206
- ```
2207
-
2208
- The example file includes all 28 configuration options with documentation and examples for React,
2209
- Vue, Angular, and other frameworks.
2210
-
2211
- ### **Framework-Specific Options**
2212
-
2213
- #### **React Configuration**
2214
-
2215
- ```json
2216
- {
2217
- "framework": "react",
2218
- "react": {
2219
- "componentType": "functional",
2220
- "forwardRef": true,
2221
- "memo": false,
2222
- "propsInterface": "SVGProps",
2223
- "styledComponents": true,
2224
- "cssModules": false
2225
- }
2226
- }
2227
- ```
2228
-
2229
- #### **Vue Configuration**
2230
-
2231
- ```json
2232
- {
2233
- "framework": "vue",
2234
- "vue": {
2235
- "api": "composition",
2236
- "setup": true,
2237
- "typescript": true,
2238
- "scoped": true,
2239
- "cssVariables": true
2240
- }
2241
- }
2242
- ```
2243
-
2244
- #### **Angular Configuration**
2245
-
2246
- ```json
2247
- {
2248
- "framework": "angular",
2249
- "angular": {
2250
- "standalone": true,
2251
- "signals": true,
2252
- "changeDetection": "OnPush",
2253
- "encapsulation": "Emulated"
2254
- }
2255
- }
2256
- ```
2257
-
2258
- ---
2259
-
2260
- ## 📊 **Performance Optimization**
2261
-
2262
- ### **Benchmarks vs Competitors**
2263
-
2264
- | **Operation** | **SVGER v2.0** | **SVGR** | **Improvement** |
2265
- | ----------------------- | -------------- | -------- | --------------- |
2266
- | Single file (100KB SVG) | 15ms | 25ms | **40% faster** |
2267
- | Batch (100 files) | 850ms | 1,450ms | **70% faster** |
2268
- | Memory (1000 files) | 45MB | 120MB | **62% less** |
2269
- | Bundle size | 2.1MB | 18.7MB | **89% smaller** |
2270
- | Startup time | 120ms | 340ms | **65% faster** |
2271
-
2272
- ### **Performance Best Practices**
2273
-
2274
- #### **Batch Processing Optimization**
2275
-
2276
- ```bash
2277
- # Optimal batch processing
2278
- svger-cli build \
2279
- --src ./icons \
2280
- --out ./components \
2281
- --parallel \
2282
- --batch-size 15 \
2283
- --max-concurrency 4 \
2284
- --cache \
2285
- --performance
2286
- ```
2287
-
2288
- #### **Memory Management**
2289
-
2290
- ```typescript
2291
- // Monitor memory usage
2292
- import { performanceEngine } from 'svger-cli';
2293
-
2294
- const monitor = setInterval(() => {
2295
- const usage = performanceEngine.monitorMemoryUsage();
2296
- if (usage.heapUsed > 500) {
2297
- console.warn('High memory usage detected');
2298
- performanceEngine.clearCache();
2299
- }
2300
- }, 5000);
2301
- ```
2302
-
2303
- #### **Cache Configuration**
2304
-
2305
- ```json
2306
- {
2307
- "performance": {
2308
- "cache": true,
2309
- "cacheTimeout": 300000,
2310
- "memoryLimit": 512
2311
- }
2312
- }
2313
- ```
2314
-
2315
- ---
2316
-
2317
- ## 🧪 **Testing & Quality Assurance**
2318
-
2319
- ### **Component Testing**
2320
-
2321
- Generated components include comprehensive testing utilities:
2322
-
2323
- ```typescript
2324
- // Generated React component test
2325
- import { render, screen } from '@testing-library/react';
2326
- import { IconName } from './IconName';
2327
-
2328
- describe('IconName', () => {
2329
- it('renders with default props', () => {
2330
- render(<IconName />);
2331
- const svg = screen.getByRole('img', { hidden: true });
2332
- expect(svg).toBeInTheDocument();
2333
- });
2334
-
2335
- it('accepts custom props', () => {
2336
- render(<IconName width={32} height={32} fill="red" />);
2337
- const svg = screen.getByRole('img', { hidden: true });
2338
- expect(svg).toHaveAttribute('width', '32');
2339
- expect(svg).toHaveAttribute('height', '32');
2340
- expect(svg).toHaveAttribute('fill', 'red');
2341
- });
2342
- });
2343
- ```
2344
-
2345
- ### **Integration Testing**
2346
-
2347
- ```bash
2348
- # Run integration tests
2349
- npm run test:integration
2350
-
2351
- # Test specific framework
2352
- npm run test:framework:react
2353
- npm run test:framework:vue
2354
- npm run test:framework:angular
2355
- ```
2356
-
2357
- ### **Performance Testing**
2358
-
2359
- ```bash
2360
- # Run performance benchmarks
2361
- svger-cli performance --benchmark
2362
-
2363
- # Memory leak testing
2364
- svger-cli performance --memory --duration 60s
2365
-
2366
- # Load testing
2367
- svger-cli performance --load --files 1000
2368
- ```
2369
-
2370
- ---
2371
-
2372
- ## 🚀 **Production Deployment**
2373
-
2374
- ### **CI/CD Integration**
2375
-
2376
- #### **GitHub Actions**
2377
-
2378
- ```yaml
2379
- name: SVG Component Generation
2380
- on:
2381
- push:
2382
- paths: ['src/assets/svg/**']
2383
-
2384
- jobs:
2385
- generate-components:
2386
- runs-on: ubuntu-latest
2387
- steps:
2388
- - uses: actions/checkout@v3
2389
- - uses: actions/setup-node@v3
2390
- with:
2391
- node-version: '18'
2392
-
2393
- - name: Install SVGER-CLI
2394
- run: npm install -g svger-cli@2.0.5
2395
-
2396
- - name: Generate Components
2397
- run: |
2398
- svger-cli build \
2399
- --src ./src/assets/svg \
2400
- --out ./src/components/icons \
2401
- --framework react \
2402
- --typescript \
2403
- --parallel \
2404
- --performance
2405
-
2406
- - name: Commit Generated Components
2407
- run: |
2408
- git config --local user.email "action@github.com"
2409
- git config --local user.name "GitHub Action"
2410
- git add src/components/icons/
2411
- git commit -m "🤖 Auto-generated SVG components" || exit 0
2412
- git push
2413
- ```
2414
-
2415
- #### **Jenkins Pipeline**
2416
-
2417
- ```groovy
2418
- pipeline {
2419
- agent any
2420
-
2421
- stages {
2422
- stage('Generate SVG Components') {
2423
- steps {
2424
- sh '''
2425
- npm install -g svger-cli@2.0.5
2426
- svger-cli build \
2427
- --src ./assets/svg \
2428
- --out ./components \
2429
- --framework vue \
2430
- --composition \
2431
- --typescript \
2432
- --cache \
2433
- --performance
2434
- '''
2435
- }
2436
- }
2437
- }
2438
- }
2439
- ```
2440
-
2441
- ### **Docker Integration**
2442
-
2443
- ```dockerfile
2444
- FROM node:18-alpine
2445
-
2446
- # Install SVGER-CLI globally
2447
- RUN npm install -g svger-cli@2.0.5
2448
-
2449
- # Set working directory
2450
- WORKDIR /app
2451
-
2452
- # Copy SVG files
2453
- COPY src/assets/svg ./src/assets/svg
2454
-
2455
- # Generate components
2456
- RUN svger-cli build \
2457
- --src ./src/assets/svg \
2458
- --out ./src/components/icons \
2459
- --framework react \
2460
- --typescript \
2461
- --parallel
2462
-
2463
- # Copy generated components
2464
- COPY src/components ./src/components
2465
- ```
2466
-
2467
- ---
2468
-
2469
- ## 🔌 **Plugin Development**
2470
-
2471
- ### **Creating Custom Plugins**
2472
-
2473
- ```typescript
2474
- import { Plugin } from 'svger-cli';
2475
-
2476
- const customOptimizer: Plugin = {
2477
- name: 'custom-svg-optimizer',
2478
- version: '1.0.0',
2479
-
2480
- process: async (content: string, options?: any) => {
2481
- // Custom SVG processing logic
2482
- const optimized = content
2483
- .replace(/fill="none"/g, '')
2484
- .replace(/stroke="currentColor"/g, 'stroke="inherit"');
2485
-
2486
- return optimized;
2487
- },
2488
-
2489
- validate: (options?: any) => {
2490
- return options && typeof options.level === 'string';
2491
- },
2492
- };
2493
-
2494
- // Register plugin
2495
- import { pluginManager } from 'svger-cli';
2496
- pluginManager.registerPlugin(customOptimizer);
2497
- ```
2498
-
2499
- ### **Plugin Configuration**
2500
-
2501
- ```json
2502
- {
2503
- "plugins": [
2504
- {
2505
- "name": "svg-optimizer",
2506
- "options": {
2507
- "level": "balanced"
2508
- }
2509
- },
2510
- {
2511
- "name": "custom-svg-optimizer",
2512
- "options": {
2513
- "level": "maximum"
2514
- }
2515
- }
2516
- ]
2517
- }
2518
- ```
2519
-
2520
- ---
2521
-
2522
- ## 🔍 **Troubleshooting & FAQ**
2523
-
2524
- ### **Common Issues**
2525
-
2526
- #### **Memory Issues**
2527
-
2528
- ```bash
2529
- # If experiencing memory issues with large batches
2530
- svger-cli build \
2531
- --batch-size 5 \
2532
- --max-concurrency 2 \
2533
- --src ./icons \
2534
- --out ./components
2535
- ```
2536
-
2537
- #### **Performance Issues**
2538
-
2539
- ```bash
2540
- # Enable performance monitoring
2541
- svger-cli performance --analyze
2542
-
2543
- # Clear cache if needed
2544
- svger-cli clean --cache
2545
-
2546
- # Optimize configuration
2547
- svger-cli performance --optimize
2548
- ```
2549
-
2550
- #### **TypeScript Errors**
2551
-
2552
- ```bash
2553
- # Validate configuration
2554
- svger-cli config --validate
2555
-
2556
- # Regenerate with strict TypeScript
2557
- svger-cli build --typescript --strict
2558
- ```
2559
-
2560
- ### **Debugging**
2561
-
2562
- ```bash
2563
- # Enable verbose logging
2564
- svger-cli build --verbose --src ./icons --out ./components
2565
-
2566
- # Debug specific framework
2567
- svger-cli build --framework vue --debug
2568
-
2569
- # Performance debugging
2570
- svger-cli build --performance --memory
2571
- ```
2572
-
2573
- ---
2574
-
2575
- ## 📚 **Migration Guide**
2576
-
2577
- ### **From SVGR**
2578
-
2579
- ```bash
2580
- # Install SVGER-CLI
2581
- npm uninstall @svgr/webpack @svgr/cli
2582
- npm install -g svger-cli@2.0.5
2583
-
2584
- # Migrate configuration
2585
- svger-cli init --framework react --typescript
2586
-
2587
- # Build components
2588
- svger-cli build --src ./assets --out ./components
2589
- ```
2590
-
2591
- ### **From v1.x**
2592
-
2593
- ```bash
2594
- # Upgrade to v2.0
2595
- npm install -g svger-cli@2.0.5
2596
-
2597
- # Migrate configuration
2598
- svger-cli config --migrate
2599
-
2600
- # Rebuild with new features
2601
- svger-cli build --framework react --responsive --theme dark
2602
- ```
2603
-
2604
- ---
2605
-
2606
- ## 🤝 **Contributing & Support**
2607
-
2608
- ### **Contributing**
2609
-
2610
- 1. Fork the repository
2611
- 2. Create your feature branch (`git checkout -b feature/amazing-feature`)
2612
- 3. Commit your changes (`git commit -m 'Add amazing feature'`)
2613
- 4. Push to the branch (`git push origin feature/amazing-feature`)
2614
- 5. Open a Pull Request
2615
-
2616
- ### **Support**
2617
-
2618
- - 📧 **Email**: navidrezadoost07@gmail.com
2619
- - 🐛 **Issues**: [GitHub Issues](https://github.com/faezemohades/svger-cli/issues)
2620
- - 📖 **Documentation**: [docs.svger-cli.com](https://docs.svger-cli.com)
2621
-
2622
- ---
2623
-
2624
- ## 📄 **License & Acknowledgements**
2625
-
2626
- ### **License**
2627
-
2628
- This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
2629
-
2630
- ### **Acknowledgements**
2631
-
2632
- This project was developed through the collaborative efforts of:
2633
-
2634
- - **🏗️ Architecture Design**: [ADR-001](./docs/ADR-SVG-INTRGRATION-METHODS-001.adr.md) authored by
2635
- **Engineer Navid Rezadoost**
2636
- - **📋 Technical Requirements**:
2637
- [TDR-001](https://docs.google.com/document/d/1b04_V01xOvLiSMzuPdaRynANlnt2wYdJ_vjs9MAqtn4/edit?tab=t.0)
2638
- prepared by **Ehsan Jafari**
2639
- - **💻 Implementation**: **Navid Rezadoost** - Faeze Mohades Lead developer and package maintainer
2640
- - **🏢 Enterprise Architecture**: SVGER Development Team
2641
-
2642
- Their guidance and documentation on SVG integration methods in React, Vue, and other frameworks were
2643
- instrumental in shaping the design and functionality of the SVGER-CLI v2.0.
2644
-
2645
- ### **Special Thanks**
2646
-
2647
- - The open-source community for inspiration and feedback
2648
- - Framework maintainers for excellent documentation
2649
- - Beta testers who provided valuable insights
2650
- - Enterprise customers who drove advanced feature requirements
2651
-
2652
- ---
2653
-
2654
- **© 2025 SVGER-CLI Development Team. Built with ❤️ for the developer community.**
1
+ # SVGER-CLI v2.0.7 - Enterprise SVG Processing Framework
2
+
3
+ [![npm version](https://badge.fury.io/js/svger-cli.svg)](https://badge.fury.io/js/svger-cli)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+ [![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue.svg)](https://www.typescriptlang.org/)
6
+ [![Zero Dependencies](https://img.shields.io/badge/Dependencies-Zero-green.svg)](https://www.npmjs.com/package/svger-cli)
7
+
8
+ > **The most advanced, zero-dependency SVG to component converter, now with first-class support for
9
+ > 9+ UI frameworks including React Native. Enjoy enterprise-grade performance, auto-generated
10
+ > exports, and a unified workflow for your entire design system.**
11
+
12
+ ---
13
+
14
+ ## 📖 **Table of Contents**
15
+
16
+ ### 🚀 **Getting Started**
17
+
18
+ - [📦 Installation](#-installation)
19
+ - [🚀 Quick Start: Your First Conversion](#-quick-start-your-first-conversion)
20
+ - [💡 Why SVGER-CLI?](#-why-svger-cli-the-zero-dependency-advantage)
21
+
22
+ ### 📚 **Core Documentation**
23
+
24
+ - [📊 Feature Comparison Matrix](#-feature-comparison-matrix)
25
+ - [🌐 Multi-Framework Usage Guide](#-multi-framework-usage-guide)
26
+ - [React](#react)
27
+ - [React Native](#react-native)
28
+ - [Vue 3](#vue-3)
29
+ - [Angular](#angular)
30
+ - [Svelte](#svelte)
31
+ - [Solid](#solid)
32
+ - [Lit](#lit)
33
+ - [Preact](#preact)
34
+ - [Vanilla JS/TS](#vanilla-jsts)
35
+ - [🔧 Comprehensive CLI Reference](#-comprehensive-cli-reference)
36
+
37
+ ### 🎨 **Advanced Features**
38
+
39
+ - [💻 Usage Examples: From Simple to Complex](#-usage-examples-from-simple-to-complex)
40
+ - [🎨 Advanced Styling & Theming](#-advanced-styling--theming)
41
+ - [Responsive Design System](#responsive-design-system)
42
+ - [Theme System](#theme-system)
43
+ - [Animation System](#animation-system)
44
+ - [💻 Programmatic API](#-programmatic-api)
45
+ - [🔧 Configuration Reference](#-configuration-reference)
46
+
47
+ ### **Performance & Deployment**
48
+
49
+ - [⚡ Performance Optimization](#-performance-optimization)
50
+ - [Benchmarks vs Competitors](#benchmarks-vs-competitors)
51
+ - [Performance Best Practices](#performance-best-practices)
52
+ - [🚀 Production Deployment](#-production-deployment)
53
+ - [CI/CD Integration](#cicd-integration)
54
+ - [Docker Integration](#docker-integration)
55
+
56
+ ### 🧪 **Testing & Quality**
57
+
58
+ - [🧪 Testing & Quality Assurance](#-testing--quality-assurance)
59
+ - [🔌 Plugin Development](#-plugin-development)
60
+
61
+ ### 🆘 **Support & Resources**
62
+
63
+ - [🔍 Troubleshooting & FAQ](#-troubleshooting--faq)
64
+ - [📚 Migration Guide](#-migration-guide)
65
+ - [🤝 Contributing & Support](#-contributing--support)
66
+
67
+ ---
68
+
69
+ ## **Quick Jump Navigation**
70
+
71
+ **Looking for something specific?**
72
+
73
+ | **I want to...** | **Go to section** |
74
+ | ------------------------------------- | --------------------------------------------------------------- |
75
+ | 🎯 Get started immediately | [Quick Start](#-quick-start-your-first-conversion) |
76
+ | 📦 Install the package | [Installation](#-installation) |
77
+ | 🤔 Understand why SVGER-CLI is better | [Why SVGER-CLI?](#-why-svger-cli-the-zero-dependency-advantage) |
78
+ | Compare features with competitors | [Feature Comparison](#-feature-comparison-matrix) |
79
+ | 🚀 Convert SVGs to React components | [React Guide](#react) |
80
+ | � Use with React Native | [React Native Guide](#react-native) |
81
+ | �💚 Use with Vue | [Vue Guide](#vue-3) |
82
+ | 🅰️ Use with Angular | [Angular Guide](#angular) |
83
+ | 🌪️ Use with Svelte | [Svelte Guide](#svelte) |
84
+ | 📖 Learn all CLI commands | [CLI Reference](#-comprehensive-cli-reference) |
85
+ | 💻 Use the programmatic API | [API Reference](#-programmatic-api) |
86
+ | 🎨 Configure styling & theming | [Styling Guide](#-advanced-styling--theming) |
87
+ | ⚡ Optimize performance | [Performance Guide](#-performance-optimization) |
88
+ | 🚀 Deploy to production | [Deployment Guide](#-production-deployment) |
89
+ | 🐳 Use with Docker | [Docker Setup](#docker-integration) |
90
+ | 🧪 Test my components | [Testing Guide](#-testing--quality-assurance) |
91
+ | 🔧 Configure everything | [Configuration Reference](#-configuration-reference) |
92
+ | 🔌 Create custom plugins | [Plugin Development](#-plugin-development) |
93
+ | 🐛 Fix issues | [Troubleshooting](#-troubleshooting--faq) |
94
+ | 📚 Migrate from another tool | [Migration Guide](#-migration-guide) |
95
+
96
+ ---
97
+
98
+ ---
99
+
100
+ ## 🌟 **Key Features Overview**
101
+
102
+ ### **✨ Auto-Generated index.ts Exports (Enhanced)**
103
+
104
+ Automatically generates clean index.ts files with a **single, consistent export pattern** that
105
+ avoids naming conflicts:
106
+
107
+ ```typescript
108
+ // Auto-generated in your output directory
109
+ // Re-exports with renamed defaults for tree-shaking
110
+ export { default as ArrowLeft } from './ArrowLeft';
111
+ export { default as ArrowRight } from './ArrowRight';
112
+ export { default as HomeIcon } from './HomeIcon';
113
+ export { default as UserProfile } from './UserProfile';
114
+
115
+ /**
116
+ * SVG Components Index
117
+ * Generated by svger-cli
118
+ *
119
+ * Import individual components:
120
+ * import { ArrowLeft } from './components';
121
+ *
122
+ * Import all components:
123
+ * import * as Icons from './components';
124
+ */
125
+ ```
126
+
127
+ **Import flexibility:**
128
+
129
+ ```typescript
130
+ // Named imports (recommended - tree-shaking friendly)
131
+ import { ArrowLeft, ArrowRight, HomeIcon } from './components';
132
+
133
+ // Namespace import (for accessing all icons)
134
+ import * as Icons from './components';
135
+ const ArrowIcon = Icons.ArrowLeft;
136
+
137
+ // Individual file imports (when you need just one component)
138
+ import ArrowLeft from './components/ArrowLeft';
139
+ ```
140
+
141
+ ### **🎯 Enhanced Props & Styling**
142
+
143
+ Components now support comprehensive prop interfaces with React.forwardRef:
144
+
145
+ ```typescript
146
+ <Icon className="custom-class" style={{ color: 'red' }} size={32} />
147
+ ```
148
+
149
+ ### **🔒 Comprehensive File Protection**
150
+
151
+ Lock files to prevent accidental modifications during builds:
152
+
153
+ ```bash
154
+ svger-cli lock ./icons/critical-logo.svg # Protects during all operations
155
+ ```
156
+
157
+ ---
158
+
159
+ ## 📊 **Feature Comparison Matrix**
160
+
161
+ > 📖 **For detailed technical analysis and documented benchmarks:**
162
+ > **[→ Read Complete Performance Deep Dive (COMPARISON.md)](./COMPARISON.md)**
163
+ > Includes: Benchmark methodology, dependency analysis, Webpack integration guide, and all 28
164
+ > configuration options explained.
165
+
166
+ | **Feature** | **SVGER-CLI v2.0.7** | **SVGR (React)** | **vite-svg-loader (Vue)** | **svelte-svg (Svelte)** | **SVGO** |
167
+ | -------------------------- | -------------------------- | ---------------- | ------------------------- | ----------------------- | ------------------- |
168
+ | **Dependencies** | ✅ **Zero** | ❌ 15+ deps | ❌ 9+ deps | ❌ 7+ deps | ❌ 8+ deps |
169
+ | **Auto-Generated Exports** | ✅ **Full Support** | ❌ Manual | ❌ Manual | ❌ Manual | ❌ N/A |
170
+ | **Framework Support** | ✅ **9+ Frameworks** | ❌ React only | ❌ Vue only | ❌ Svelte only | ❌ N/A |
171
+ | **React Native Support** | ✅ **Full Native** | None | ❌ None | ❌ None | ❌ N/A |
172
+ | **Advanced Props** | ✅ **Full Support** | ❌ Basic | ❌ Basic | ❌ Basic | ❌ N/A |
173
+ | **File Protection** | ✅ **Lock System** | ❌ None | ❌ None | ❌ None | ❌ None |
174
+ | **Performance** | ✅ **Up to 85% Faster** | Standard | Slow | Standard | Fast (Optimization) |
175
+ | **Bundle Size** | ✅ **~2MB** | ~18.7MB | ~14.2MB | ~11.8MB | ~12.3MB |
176
+ | **Enterprise Features** | ✅ **Full Suite** | ❌ Limited | ❌ None | ❌ None | ❌ None |
177
+ | **TypeScript** | ✅ **Native** | Plugin | Limited | Limited | None |
178
+ | **Batch Processing** | ✅ **Optimized** | Basic | None | None | None |
179
+ | **Plugin System** | **Extensible** | Limited | None | None | None |
180
+ | **Configuration Schema** | ✅ **28 Options** | ❌ 8 Options | ❌ 4 Options | ❌ 3 Options | ❌ N/A |
181
+ | **Responsive Design** | ✅ **Built-in** | ❌ Manual | ❌ None | ❌ None | ❌ None |
182
+ | **Theme System** | ✅ **Auto Dark/Light** | ❌ Manual | ❌ None | ❌ None | ❌ None |
183
+ | **Error Handling** | **Advanced Strategies** | Basic | Basic | Basic | Basic |
184
+
185
+ ---
186
+
187
+ ## � **Why SVGER-CLI? The Zero-Dependency Advantage**
188
+
189
+ In a landscape cluttered with heavy, single-framework tools, **SVGER-CLI** stands alone. It's
190
+ engineered from the ground up with a single philosophy: **native, zero-dependency performance**.
191
+
192
+ - **No `node_modules` bloat**: Drastically smaller footprint.
193
+ - **Faster installs**: Perfect for CI/CD and rapid development.
194
+ - **Unmatched security**: No third-party vulnerabilities.
195
+ - **Cross-framework consistency**: The same powerful engine for every framework.
196
+
197
+ This lean approach delivers up to **85% faster processing** and a **90% smaller bundle size**
198
+ compared to alternatives that rely on dozens of transitive dependencies.
199
+
200
+ > 📖 **Want to understand why it's faster?** Read the complete technical analysis with benchmarks,
201
+ > methodology, and measurements:
202
+ > **[→ View Performance Deep Dive & Benchmarks (COMPARISON.md)](./COMPARISON.md)**
203
+ >
204
+ > Learn about:
205
+ >
206
+ > - Detailed benchmark methodology and test environment
207
+ > - 4 architectural optimizations that deliver 85% improvement
208
+ > - Memory usage comparison (12MB vs 68MB)
209
+ > - Parallel processing performance (6.6x throughput)
210
+ > - Smart caching system (99% hit rate)
211
+ > - Real-world CI/CD impact and cost savings
212
+
213
+ ---
214
+
215
+ ## 📦 **Installation**
216
+
217
+ Install globally for access to the `svger-cli` command anywhere.
218
+
219
+ ```bash
220
+ npm install -g svger-cli
221
+ ```
222
+
223
+ Or add it to your project's dev dependencies:
224
+
225
+ ```bash
226
+ npm install --save-dev svger-cli
227
+ ```
228
+
229
+ ---
230
+
231
+ ## 🚀 **Quick Start: Your First Conversion**
232
+
233
+ 1. **Place your SVGs** in a directory (e.g., `./my-svgs`).
234
+ 2. **Run the build command**:
235
+
236
+ ```bash
237
+ # Convert all SVGs to React components (default)
238
+ svger-cli build ./my-svgs ./components
239
+ ```
240
+
241
+ 3. **Use your components**: An `index.ts` is auto-generated for easy imports.
242
+
243
+ ```tsx
244
+ // Your app's component
245
+ import { MyIcon, AnotherIcon } from './components';
246
+
247
+ function App() {
248
+ return (
249
+ <div>
250
+ <MyIcon className="text-blue-500" />
251
+ <AnotherIcon size={32} style={{ color: 'red' }} />
252
+ </div>
253
+ );
254
+ }
255
+ ```
256
+
257
+ ---
258
+
259
+ ## 🌐 **Multi-Framework Usage Guide**
260
+
261
+ SVGER-CLI brings a unified, powerful experience to every major framework. Select your target with
262
+ the `--framework` flag.
263
+
264
+ ### **React**
265
+
266
+ Generate optimized React components with `forwardRef`, `memo`, and TypeScript interfaces.
267
+
268
+ ```bash
269
+ svger-cli build ./my-svgs ./react-components --framework react
270
+ ```
271
+
272
+ **Generated React Component (`.tsx`):**
273
+
274
+ ```tsx
275
+ import * as React from 'react';
276
+
277
+ interface IconProps extends React.SVGProps<SVGSVGElement> {
278
+ size?: number;
279
+ }
280
+
281
+ const MyIcon: React.FC<IconProps> = React.memo(
282
+ React.forwardRef<SVGSVGElement, IconProps>(({ size = 24, ...props }, ref) => (
283
+ <svg ref={ref} width={size} height={size} viewBox="0 0 24 24" {...props}>
284
+ {/* SVG content */}
285
+ </svg>
286
+ ))
287
+ );
288
+
289
+ MyIcon.displayName = 'MyIcon';
290
+ export default MyIcon;
291
+ ```
292
+
293
+ ### **React Native**
294
+
295
+ Generate optimized React Native components with `react-native-svg` integration.
296
+
297
+ ```bash
298
+ svger-cli build ./my-svgs ./react-native-components --framework react-native
299
+ ```
300
+
301
+ **Generated React Native Component (`.tsx`):**
302
+
303
+ ```tsx
304
+ import React from 'react';
305
+ import Svg, {
306
+ Path,
307
+ Circle,
308
+ Rect,
309
+ Line,
310
+ Polygon,
311
+ Polyline,
312
+ Ellipse,
313
+ G,
314
+ Defs,
315
+ ClipPath,
316
+ LinearGradient,
317
+ RadialGradient,
318
+ Stop,
319
+ } from 'react-native-svg';
320
+ import type { SvgProps } from 'react-native-svg';
321
+
322
+ export interface MyIconProps extends SvgProps {
323
+ size?: number | string;
324
+ color?: string;
325
+ }
326
+
327
+ const MyIcon = React.forwardRef<Svg, MyIconProps>(({ size, color, ...props }, ref) => {
328
+ const dimensions = size
329
+ ? { width: size, height: size }
330
+ : {
331
+ width: props.width || 24,
332
+ height: props.height || 24,
333
+ };
334
+
335
+ return (
336
+ <Svg
337
+ ref={ref}
338
+ viewBox="0 0 24 24"
339
+ width={dimensions.width}
340
+ height={dimensions.height}
341
+ fill={color || props.fill || 'currentColor'}
342
+ {...props}
343
+ >
344
+ {/* SVG content automatically converted to React Native SVG components */}
345
+ <Path d="..." />
346
+ </Svg>
347
+ );
348
+ });
349
+
350
+ MyIcon.displayName = 'MyIcon';
351
+ export default MyIcon;
352
+ ```
353
+
354
+ **Key Features:**
355
+
356
+ - Automatic conversion of SVG elements to React Native SVG components
357
+ - Proper prop conversion (strokeWidth, strokeLinecap, fillRule, etc.)
358
+ - TypeScript support with SvgProps interface
359
+ - Size and color prop support
360
+ - ✅ ForwardRef implementation for advanced usage
361
+ - Compatible with `react-native-svg` package
362
+
363
+ **Installation Requirements:**
364
+
365
+ ```bash
366
+ npm install react-native-svg
367
+ ```
368
+
369
+ ### **Vue 3**
370
+
371
+ Choose between **Composition API** (`--composition`) or **Options API**.
372
+
373
+ ```bash
374
+ # Composition API with <script setup>
375
+ svger-cli build ./my-svgs ./vue-components --framework vue --composition
376
+
377
+ # Options API
378
+ svger-cli build ./my-svgs ./vue-components --framework vue
379
+ ```
380
+
381
+ **Generated Vue Component (`.vue`):**
382
+
383
+ ```vue
384
+ <script setup lang="ts">
385
+ import { computed } from 'vue';
386
+
387
+ interface Props {
388
+ size?: number | string;
389
+ }
390
+
391
+ const props = withDefaults(defineProps<Props>(), {
392
+ size: 24,
393
+ });
394
+
395
+ const sizeValue = computed(() => `${props.size}px`);
396
+ </script>
397
+
398
+ <template>
399
+ <svg :width="sizeValue" :height="sizeValue" viewBox="0 0 24 24" v-bind="$attrs">
400
+ {/* SVG content */}
401
+ </svg>
402
+ </template>
403
+ ```
404
+
405
+ ### **Angular**
406
+
407
+ Generate **standalone components** (`--standalone`) or traditional module-based components.
408
+
409
+ ```bash
410
+ # Standalone component (recommended)
411
+ svger-cli build ./my-svgs ./angular-components --framework angular --standalone
412
+
413
+ # Module-based component
414
+ svger-cli build ./my-svgs ./angular-components --framework angular
415
+ ```
416
+
417
+ **Generated Angular Component (`.component.ts`):**
418
+
419
+ ```typescript
420
+ import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
421
+
422
+ @Component({
423
+ selector: 'app-my-icon',
424
+ standalone: true,
425
+ template: `
426
+ <svg
427
+ [attr.width]="size"
428
+ [attr.height]="size"
429
+ viewBox="0 0 24 24"
430
+ >
431
+ {/* SVG content */}
432
+ </svg>
433
+ `,
434
+ changeDetection: ChangeDetectionStrategy.OnPush,
435
+ })
436
+ export class MyIconComponent {
437
+ @Input() size: number | string = 24;
438
+ }
439
+ ```
440
+
441
+ ### **Svelte**
442
+
443
+ Create native Svelte components with TypeScript props.
444
+
445
+ ```bash
446
+ svger-cli build ./my-svgs ./svelte-components --framework svelte
447
+ ```
448
+
449
+ **Generated Svelte Component (`.svelte`):**
450
+
451
+ ```html
452
+ <script lang="ts">
453
+ export let size: number | string = 24;
454
+ </script>
455
+
456
+ <svg width="{size}" height="{size}" viewBox="0 0 24 24" {...$$restProps}>{/* SVG content */}</svg>
457
+ ```
458
+
459
+ ### **Solid**
460
+
461
+ Generate efficient SolidJS components.
462
+
463
+ ```bash
464
+ svger-cli build ./my-svgs ./solid-components --framework solid
465
+ ```
466
+
467
+ **Generated Solid Component (`.tsx`):**
468
+
469
+ ```tsx
470
+ import type { Component, JSX } from 'solid-js';
471
+
472
+ interface IconProps extends JSX.SvgSVGAttributes<SVGSVGElement> {
473
+ size?: number | string;
474
+ }
475
+
476
+ const MyIcon: Component<IconProps> = props => {
477
+ return (
478
+ <svg width={props.size || 24} height={props.size || 24} viewBox="0 0 24 24" {...props}>
479
+ {/* SVG content */}
480
+ </svg>
481
+ );
482
+ };
483
+
484
+ export default MyIcon;
485
+ ```
486
+
487
+ ### **Lit**
488
+
489
+ Generate standard Web Components using the Lit library.
490
+
491
+ ```bash
492
+ svger-cli build ./my-svgs ./lit-components --framework lit
493
+ ```
494
+
495
+ **Generated Lit Component (`.ts`):**
496
+
497
+ ```ts
498
+ import { LitElement, html, svg } from 'lit';
499
+ import { customElement, property } from 'lit/decorators.js';
500
+
501
+ @customElement('my-icon')
502
+ export class MyIcon extends LitElement {
503
+ @property({ type: Number })
504
+ size = 24;
505
+
506
+ render() {
507
+ return html`
508
+ <svg width=${this.size} height=${this.size} viewBox="0 0 24 24">
509
+ ${svg`{/* SVG content */}`}
510
+ </svg>
511
+ `;
512
+ }
513
+ }
514
+ ```
515
+
516
+ ### **Preact**
517
+
518
+ Generate lightweight Preact components.
519
+
520
+ ```bash
521
+ svger-cli build ./my-svgs ./preact-components --framework preact
522
+ ```
523
+
524
+ **Generated Preact Component (`.tsx`):**
525
+
526
+ ```tsx
527
+ import { h } from 'preact';
528
+ import type { FunctionalComponent } from 'preact';
529
+
530
+ interface IconProps extends h.JSX.SVGAttributes<SVGSVGElement> {
531
+ size?: number | string;
532
+ }
533
+
534
+ const MyIcon: FunctionalComponent<IconProps> = ({ size = 24, ...props }) => {
535
+ return (
536
+ <svg width={size} height={size} viewBox="0 0 24 24" {...props}>
537
+ {/* SVG content */}
538
+ </svg>
539
+ );
540
+ };
541
+
542
+ export default MyIcon;
543
+ ```
544
+
545
+ ### **Vanilla JS/TS**
546
+
547
+ Generate framework-agnostic factory functions for use anywhere.
548
+
549
+ ```bash
550
+ svger-cli build ./my-svgs ./vanilla-components --framework vanilla
551
+ ```
552
+
553
+ **Generated Vanilla Component (`.ts`):**
554
+
555
+ ```ts
556
+ interface IconOptions {
557
+ size?: number | string;
558
+ [key: string]: any;
559
+ }
560
+
561
+ export function createMyIcon(options: IconOptions = {}): SVGSVGElement {
562
+ const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
563
+ const size = options.size || 24;
564
+
565
+ svg.setAttribute('width', String(size));
566
+ svg.setAttribute('height', String(size));
567
+ svg.setAttribute('viewBox', '0 0 24 24');
568
+
569
+ svg.innerHTML = `{/* SVG content */}`;
570
+ return svg;
571
+ }
572
+ ```
573
+
574
+ ---
575
+
576
+ ## 🔧 **Comprehensive CLI Reference**
577
+
578
+ ### **📋 CLI Commands Overview**
579
+
580
+ | Command | Purpose | Quick Link |
581
+ | ----------------------- | -------------------------- | -------------------------------------- |
582
+ | `svger-cli init` | Setup configuration | [Init](#1-initialize-command) |
583
+ | `svger-cli build` | Convert SVGs to components | [Build](#2-build-command) |
584
+ | `svger-cli watch` | Monitor & auto-generate | [Watch](#3-watch-command) |
585
+ | `svger-cli generate` | Process specific files | [Generate](#4-generate-command) |
586
+ | `svger-cli lock` | Protect files | [Lock/Unlock](#5-lockun lock-commands) |
587
+ | `svger-cli config` | Manage settings | [Config](#6-config-command) |
588
+ | `svger-cli clean` | Remove generated files | [Clean](#7-clean-command) |
589
+ | `svger-cli performance` | Analyze performance | [Performance](#8-performance-command) |
590
+
591
+ ---
592
+
593
+ ### **1️⃣ Initialize Command**
594
+
595
+ Set up SVGER-CLI configuration for your project.
596
+
597
+ ```bash
598
+ svger-cli init [options]
599
+ ```
600
+
601
+ **Options:**
602
+
603
+ - `--framework <type>` - Target framework (react|vue|svelte|angular|solid|preact|lit|vanilla)
604
+ - `--typescript` - Enable TypeScript generation (default: true)
605
+ - `--src <path>` - Source directory for SVG files (default: ./src/assets/svg)
606
+ - `--out <path>` - Output directory for components (default: ./src/components/icons)
607
+ - `--interactive` - Interactive configuration wizard
608
+
609
+ **Examples:**
610
+
611
+ ```bash
612
+ # Initialize with React + TypeScript
613
+ svger-cli init --framework react --typescript
614
+
615
+ # Initialize with Vue Composition API
616
+ svger-cli init --framework vue --composition --typescript
617
+
618
+ # Interactive setup
619
+ svger-cli init --interactive
620
+ ```
621
+
622
+ **Generated Configuration (`.svgerconfig.json`):**
623
+
624
+ ```json
625
+ {
626
+ "source": "./src/assets/svg",
627
+ "output": "./src/components/icons",
628
+ "framework": "react",
629
+ "typescript": true,
630
+ "componentType": "functional",
631
+
632
+ "watch": false,
633
+ "parallel": true,
634
+ "batchSize": 10,
635
+ "maxConcurrency": 4,
636
+ "cache": true,
637
+
638
+ "defaultWidth": 24,
639
+ "defaultHeight": 24,
640
+ "defaultFill": "currentColor",
641
+ "defaultStroke": "none",
642
+ "defaultStrokeWidth": 1,
643
+
644
+ "exclude": ["logo.svg"],
645
+ "include": ["icons/**", "illustrations/**"],
646
+
647
+ "styleRules": {
648
+ "fill": "inherit",
649
+ "stroke": "none",
650
+ "strokeWidth": "1",
651
+ "opacity": "1"
652
+ },
653
+
654
+ "responsive": {
655
+ "breakpoints": ["sm", "md", "lg", "xl"],
656
+ "values": {
657
+ "width": ["16px", "20px", "24px", "32px"],
658
+ "height": ["16px", "20px", "24px", "32px"]
659
+ }
660
+ },
661
+
662
+ "theme": {
663
+ "mode": "auto",
664
+ "variables": {
665
+ "primary": "currentColor",
666
+ "secondary": "#6b7280",
667
+ "accent": "#3b82f6",
668
+ "background": "#ffffff",
669
+ "foreground": "#000000"
670
+ }
671
+ },
672
+
673
+ "animations": ["fadeIn", "slideIn", "bounce"],
674
+
675
+ "plugins": [
676
+ {
677
+ "name": "svg-optimizer",
678
+ "options": {
679
+ "removeComments": true,
680
+ "removeMetadata": true
681
+ }
682
+ }
683
+ ],
684
+
685
+ "errorHandling": {
686
+ "strategy": "continue",
687
+ "maxRetries": 3,
688
+ "timeout": 30000
689
+ },
690
+
691
+ "performance": {
692
+ "optimization": "balanced",
693
+ "memoryLimit": 512,
694
+ "cacheTimeout": 3600000
695
+ },
696
+
697
+ "outputConfig": {
698
+ "naming": "pascal",
699
+ "extension": "tsx",
700
+ "directory": "./src/components/icons"
701
+ },
702
+
703
+ "react": {
704
+ "componentType": "functional",
705
+ "forwardRef": true,
706
+ "memo": false,
707
+ "propsInterface": "SVGProps",
708
+ "styledComponents": false,
709
+ "cssModules": false
710
+ },
711
+
712
+ "vue": {
713
+ "api": "composition",
714
+ "setup": true,
715
+ "typescript": true,
716
+ "scoped": true,
717
+ "cssVariables": true
718
+ },
719
+
720
+ "angular": {
721
+ "standalone": true,
722
+ "signals": true,
723
+ "changeDetection": "OnPush",
724
+ "encapsulation": "Emulated"
725
+ }
726
+ }
727
+ ```
728
+
729
+ ### **2️⃣ Build Command**
730
+
731
+ Convert SVG files to framework components with advanced processing.
732
+
733
+ ```bash
734
+ svger-cli build [options]
735
+ ```
736
+
737
+ **Core Options:**
738
+
739
+ - `--src <path>` - Source directory containing SVG files
740
+ - `--out <path>` - Output directory for generated components
741
+ - `--framework <type>` - Target framework for component generation
742
+ - `--typescript` - Generate TypeScript components (default: true)
743
+ - `--clean` - Clean output directory before building
744
+
745
+ **Performance Options:**
746
+
747
+ - `--parallel` - Enable parallel processing (default: true)
748
+ - `--batch-size <number>` - Number of files per batch (default: 10)
749
+ - `--max-concurrency <number>` - Maximum concurrent processes (default: CPU cores)
750
+ - `--cache` - Enable processing cache for faster rebuilds
751
+ - `--performance` - Display performance metrics
752
+
753
+ **Framework-Specific Options:**
754
+
755
+ - `--composition` - Use Vue Composition API (Vue only)
756
+ - `--setup` - Use Vue script setup syntax (Vue only)
757
+ - `--standalone` - Generate Angular standalone components (Angular only)
758
+ - `--signals` - Use signals for state management (Solid/Angular)
759
+ - `--forward-ref` - Generate React forwardRef components (React only)
760
+
761
+ **Styling Options:**
762
+
763
+ - `--responsive` - Enable responsive design utilities
764
+ - `--theme <mode>` - Apply theme mode (light|dark|auto)
765
+ - `--styled-components` - Generate styled-components (React/Solid)
766
+ - `--css-modules` - Enable CSS Modules support
767
+
768
+ **Examples:**
769
+
770
+ ```bash
771
+ # Basic build
772
+ svger-cli build --src ./icons --out ./components
773
+
774
+ # Advanced React build with styling
775
+ svger-cli build \
776
+ --src ./icons \
777
+ --out ./components \
778
+ --framework react \
779
+ --typescript \
780
+ --forward-ref \
781
+ --styled-components \
782
+ --responsive \
783
+ --theme dark
784
+
785
+ # High-performance Vue build
786
+ svger-cli build \
787
+ --src ./icons \
788
+ --out ./components \
789
+ --framework vue \
790
+ --composition \
791
+ --setup \
792
+ --parallel \
793
+ --batch-size 20 \
794
+ --cache \
795
+ --performance
796
+
797
+ # Angular standalone components
798
+ svger-cli build \
799
+ --src ./icons \
800
+ --out ./components \
801
+ --framework angular \
802
+ --standalone \
803
+ --typescript \
804
+ --signals
805
+
806
+ # Vanilla TypeScript with optimization
807
+ svger-cli build \
808
+ --src ./icons \
809
+ --out ./components \
810
+ --framework vanilla \
811
+ --typescript \
812
+ --optimization maximum
813
+ ```
814
+
815
+ ### **3️⃣ Watch Command**
816
+
817
+ Monitor directories for SVG changes and auto-generate components.
818
+
819
+ ```bash
820
+ svger-cli watch [options]
821
+ ```
822
+
823
+ **Options:**
824
+
825
+ - All `build` command options
826
+ - `--debounce <ms>` - Debounce time for file changes (default: 300ms)
827
+ - `--ignore <patterns>` - Ignore file patterns (glob syntax)
828
+ - `--verbose` - Detailed logging of file changes
829
+
830
+ **Examples:**
831
+
832
+ ```bash
833
+ # Basic watch mode
834
+ svger-cli watch --src ./icons --out ./components
835
+
836
+ # Advanced watch with debouncing
837
+ svger-cli watch \
838
+ --src ./icons \
839
+ --out ./components \
840
+ --framework react \
841
+ --debounce 500 \
842
+ --ignore "**/*.tmp" \
843
+ --verbose
844
+
845
+ # Production watch mode
846
+ svger-cli watch \
847
+ --src ./icons \
848
+ --out ./components \
849
+ --framework vue \
850
+ --composition \
851
+ --parallel \
852
+ --cache \
853
+ --performance
854
+ ```
855
+
856
+ ### **4️⃣ Generate Command**
857
+
858
+ Process specific SVG files with precise control.
859
+
860
+ ```bash
861
+ svger-cli generate <input> [options]
862
+ ```
863
+
864
+ **Arguments:**
865
+
866
+ - `<input>` - SVG file path or glob pattern
867
+
868
+ **Options:**
869
+
870
+ - All `build` command options
871
+ - `--name <string>` - Override component name
872
+ - `--template <type>` - Component template (functional|class|forwardRef|memo)
873
+
874
+ **Examples:**
875
+
876
+ ```bash
877
+ # Generate single component
878
+ svger-cli generate ./icons/heart.svg --out ./components --name HeartIcon
879
+
880
+ # Generate with custom template
881
+ svger-cli generate ./icons/star.svg \
882
+ --out ./components \
883
+ --framework react \
884
+ --template forwardRef \
885
+ --typescript
886
+
887
+ # Generate multiple files with glob
888
+ svger-cli generate "./icons/social-*.svg" \
889
+ --out ./components/social \
890
+ --framework vue \
891
+ --composition
892
+
893
+ # Generate with advanced styling
894
+ svger-cli generate ./icons/logo.svg \
895
+ --out ./components \
896
+ --name CompanyLogo \
897
+ --styled-components \
898
+ --responsive \
899
+ --theme dark
900
+ ```
901
+
902
+ ### **5️⃣ Lock/Unlock Commands**
903
+
904
+ Manage file protection during batch operations.
905
+
906
+ ```bash
907
+ svger-cli lock <files...>
908
+ svger-cli unlock <files...>
909
+ ```
910
+
911
+ **Examples:**
912
+
913
+ ```bash
914
+ # Lock specific files
915
+ svger-cli lock ./icons/logo.svg ./icons/brand.svg
916
+
917
+ # Lock pattern
918
+ svger-cli lock "./icons/brand-*.svg"
919
+
920
+ # Unlock files
921
+ svger-cli unlock ./icons/logo.svg
922
+
923
+ # Unlock all
924
+ svger-cli unlock --all
925
+ ```
926
+
927
+ ### **6️⃣ Config Command**
928
+
929
+ Manage project configuration dynamically.
930
+
931
+ ```bash
932
+ svger-cli config [options]
933
+ ```
934
+
935
+ **Options:**
936
+
937
+ - `--show` - Display current configuration
938
+ - `--set <key=value>` - Set configuration value
939
+ - `--get <key>` - Get specific configuration value
940
+ - `--reset` - Reset to default configuration
941
+ - `--validate` - Validate current configuration
942
+
943
+ **Examples:**
944
+
945
+ ```bash
946
+ # Show current config
947
+ svger-cli config --show
948
+
949
+ # Set configuration values
950
+ svger-cli config --set framework=vue
951
+ svger-cli config --set typescript=true
952
+ svger-cli config --set "defaultWidth=32"
953
+ svger-cli config --set "styleRules.fill=currentColor"
954
+
955
+ # Get specific value
956
+ svger-cli config --get framework
957
+
958
+ # Reset configuration
959
+ svger-cli config --reset
960
+
961
+ # Validate configuration
962
+ svger-cli config --validate
963
+ ```
964
+
965
+ ### **7️⃣ Clean Command**
966
+
967
+ Remove generated components and clean workspace.
968
+
969
+ ```bash
970
+ svger-cli clean [options]
971
+ ```
972
+
973
+ **Options:**
974
+
975
+ - `--out <path>` - Output directory to clean
976
+ - `--cache` - Clear processing cache
977
+ - `--logs` - Clear log files
978
+ - `--all` - Clean everything (components, cache, logs)
979
+ - `--dry-run` - Preview what would be cleaned
980
+
981
+ **Examples:**
982
+
983
+ ```bash
984
+ # Clean output directory
985
+ svger-cli clean --out ./components
986
+
987
+ # Clean cache only
988
+ svger-cli clean --cache
989
+
990
+ # Clean everything
991
+ svger-cli clean --all
992
+
993
+ # Preview clean operation
994
+ svger-cli clean --all --dry-run
995
+ ```
996
+
997
+ ### **8️⃣ Performance Command**
998
+
999
+ Analyze and optimize processing performance.
1000
+
1001
+ ```bash
1002
+ svger-cli performance [options]
1003
+ ```
1004
+
1005
+ **Options:**
1006
+
1007
+ - `--analyze` - Analyze current project performance
1008
+ - `--benchmark` - Run performance benchmarks
1009
+ - `--memory` - Display memory usage statistics
1010
+ - `--cache-stats` - Show cache performance statistics
1011
+ - `--optimize` - Apply performance optimizations
1012
+
1013
+ **Examples:**
1014
+
1015
+ ```bash
1016
+ # Analyze performance
1017
+ svger-cli performance --analyze
1018
+
1019
+ # Run benchmarks
1020
+ svger-cli performance --benchmark
1021
+
1022
+ # Memory analysis
1023
+ svger-cli performance --memory
1024
+
1025
+ # Cache statistics
1026
+ svger-cli performance --cache-stats
1027
+
1028
+ # Apply optimizations
1029
+ svger-cli performance --optimize
1030
+ ```
1031
+
1032
+ ---
1033
+
1034
+ ## 💻 **Usage Examples: From Simple to Complex**
1035
+
1036
+ ### **Example Types & Complexity Levels**
1037
+
1038
+ | Complexity | Example | Purpose | Best For |
1039
+ | --------------- | ----------------------------------------------------------------- | ---------------------- | --------------------- |
1040
+ | 🟢 Beginner | [Example 1](#-example-1-quick-start-simplest) | Basic SVG conversion | Getting started |
1041
+ | 🟡 Intermediate | [Example 2](#-example-2-production-setup-intermediate) | Production-ready setup | Small to medium teams |
1042
+ | 🔴 Advanced | [Example 3](#-example-3-enterprise-multi-framework-advanced) | Multi-framework setup | Enterprise projects |
1043
+ | � Expert | [Example 4](#-example-4-file-protection--team-workflows-advanced) | Team collaboration | Large teams |
1044
+ | ⚡ Performance | [Example 5](#-example-5-performance-optimization-expert) | Optimization | Large-scale projects |
1045
+
1046
+ ---
1047
+
1048
+ ### **🟢 Example 1: Quick Start (Simplest)**
1049
+
1050
+ Get started in 30 seconds:
1051
+
1052
+ ```bash
1053
+ # Install globally
1054
+ npm install -g svger-cli
1055
+
1056
+ # Convert SVGs to React components
1057
+ svger-cli build ./my-icons ./components
1058
+
1059
+ # Use the auto-generated exports
1060
+ import { ArrowLeft, Home, User } from './components';
1061
+
1062
+ function App() {
1063
+ return (
1064
+ <div>
1065
+ <ArrowLeft />
1066
+ <Home className="text-blue-500" />
1067
+ <User size={32} style={{ color: 'red' }} />
1068
+ </div>
1069
+ );
1070
+ }
1071
+ ```
1072
+
1073
+ **What happens:**
1074
+
1075
+ - ✅ All SVGs in `./my-icons` converted to React components
1076
+ - ✅ Auto-generated `index.ts` with clean exports
1077
+ - Components support `className`, `style`, `size` props
1078
+ - TypeScript interfaces automatically included
1079
+
1080
+ ---
1081
+
1082
+ ### **� Example 2: Production Setup (Intermediate)**
1083
+
1084
+ Professional setup with configuration and optimization:
1085
+
1086
+ ```bash
1087
+ # Initialize with custom configuration
1088
+ svger-cli init --framework react --typescript --interactive
1089
+
1090
+ # Generated .svgerconfig.json:
1091
+ {
1092
+ "source": "./src/assets/icons",
1093
+ "output": "./src/components/icons",
1094
+ "framework": "react",
1095
+ "typescript": true,
1096
+ "forwardRef": true,
1097
+ "parallel": true,
1098
+ "batchSize": 15,
1099
+ "responsive": {
1100
+ "breakpoints": ["sm", "md", "lg"],
1101
+ "values": {
1102
+ "width": ["16px", "24px", "32px"]
1103
+ }
1104
+ }
1105
+ }
1106
+
1107
+ # Build with optimizations
1108
+ svger-cli build --performance --cache
1109
+
1110
+ # Start development mode
1111
+ svger-cli watch --debounce 500 --verbose
1112
+ ```
1113
+
1114
+ **Generated Components:**
1115
+
1116
+ ```typescript
1117
+ // Auto-generated: src/components/icons/ArrowLeft.tsx
1118
+ import React from 'react';
1119
+
1120
+ interface ArrowLeftProps extends React.SVGProps<SVGSVGElement> {
1121
+ size?: number | 'sm' | 'md' | 'lg';
1122
+ }
1123
+
1124
+ const ArrowLeft = React.forwardRef<SVGSVGElement, ArrowLeftProps>(
1125
+ ({ size = 24, className, style, ...props }, ref) => {
1126
+ const sizeValue = typeof size === 'string'
1127
+ ? { sm: 16, md: 24, lg: 32 }[size]
1128
+ : size;
1129
+
1130
+ return (
1131
+ <svg
1132
+ ref={ref}
1133
+ width={sizeValue}
1134
+ height={sizeValue}
1135
+ viewBox="0 0 24 24"
1136
+ fill="none"
1137
+ className={className}
1138
+ style={style}
1139
+ {...props}
1140
+ >
1141
+ <path d="M19 12H5M12 19l-7-7 7-7" stroke="currentColor" strokeWidth="2"/>
1142
+ </svg>
1143
+ );
1144
+ }
1145
+ );
1146
+
1147
+ ArrowLeft.displayName = 'ArrowLeft';
1148
+ export default ArrowLeft;
1149
+ ```
1150
+
1151
+ **Auto-generated index.ts:**
1152
+
1153
+ ```typescript
1154
+ /**
1155
+ * Auto-generated icon exports
1156
+ * Import icons: import { ArrowLeft, Home } from './components/icons'
1157
+ */
1158
+ export { default as ArrowLeft } from './ArrowLeft';
1159
+ export { default as Home } from './Home';
1160
+ export { default as User } from './User';
1161
+
1162
+ // Default export for flexible importing
1163
+ export default {
1164
+ ArrowLeft,
1165
+ Home,
1166
+ User,
1167
+ };
1168
+ ```
1169
+
1170
+ **Usage in App:**
1171
+
1172
+ ```typescript
1173
+ import { ArrowLeft, Home, User } from './components/icons';
1174
+
1175
+ function Navigation() {
1176
+ return (
1177
+ <nav className="flex items-center space-x-4">
1178
+ <ArrowLeft
1179
+ size="sm"
1180
+ className="text-gray-600 hover:text-gray-900"
1181
+ onClick={() => history.back()}
1182
+ />
1183
+ <Home
1184
+ size={28}
1185
+ style={{ color: 'var(--primary-color)' }}
1186
+ />
1187
+ <User
1188
+ className="w-6 h-6 text-blue-500"
1189
+ ref={userIconRef}
1190
+ />
1191
+ </nav>
1192
+ );
1193
+ }
1194
+ ```
1195
+
1196
+ ---
1197
+
1198
+ ### **🔴 Example 3: Enterprise Multi-Framework (Advanced)**
1199
+
1200
+ Complete enterprise setup supporting multiple frameworks:
1201
+
1202
+ ```bash
1203
+ # Project structure
1204
+ my-design-system/
1205
+ ├── icons/ # Source SVG files
1206
+ ├── react-components/ # React output
1207
+ ├── vue-components/ # Vue output
1208
+ ├── angular-components/ # Angular output
1209
+ └── vanilla-components/ # Vanilla JS/TS output
1210
+
1211
+ # Generate for React with full features
1212
+ svger-cli build \
1213
+ --src ./icons \
1214
+ --out ./react-components \
1215
+ --framework react \
1216
+ --typescript \
1217
+ --forward-ref \
1218
+ --styled-components \
1219
+ --responsive \
1220
+ --theme dark \
1221
+ --parallel \
1222
+ --batch-size 20 \
1223
+ --performance
1224
+
1225
+ # Generate for Vue with Composition API
1226
+ svger-cli build \
1227
+ --src ./icons \
1228
+ --out ./vue-components \
1229
+ --framework vue \
1230
+ --composition \
1231
+ --setup \
1232
+ --typescript \
1233
+ --responsive
1234
+
1235
+ # Generate for Angular with standalone components
1236
+ svger-cli build \
1237
+ --src ./icons \
1238
+ --out ./angular-components \
1239
+ --framework angular \
1240
+ --standalone \
1241
+ --signals \
1242
+ --typescript
1243
+
1244
+ # Generate vanilla TypeScript for maximum compatibility
1245
+ svger-cli build \
1246
+ --src ./icons \
1247
+ --out ./vanilla-components \
1248
+ --framework vanilla \
1249
+ --typescript
1250
+ ```
1251
+
1252
+ **React Components with Styled Components:**
1253
+
1254
+ ```typescript
1255
+ // Generated: react-components/ArrowLeft.tsx
1256
+ import React from 'react';
1257
+ import styled, { css } from 'styled-components';
1258
+
1259
+ interface ArrowLeftProps extends React.SVGProps<SVGSVGElement> {
1260
+ size?: number | 'sm' | 'md' | 'lg' | 'xl';
1261
+ variant?: 'primary' | 'secondary' | 'accent';
1262
+ theme?: 'light' | 'dark';
1263
+ }
1264
+
1265
+ const StyledSVG = styled.svg<ArrowLeftProps>`
1266
+ ${({ theme, variant }) => css`
1267
+ color: ${theme === 'dark'
1268
+ ? 'var(--icon-color-dark)'
1269
+ : 'var(--icon-color-light)'};
1270
+
1271
+ ${variant === 'primary' && css`
1272
+ color: var(--primary-color);
1273
+ `}
1274
+
1275
+ ${variant === 'secondary' && css`
1276
+ color: var(--secondary-color);
1277
+ `}
1278
+
1279
+ ${variant === 'accent' && css`
1280
+ color: var(--accent-color);
1281
+ `}
1282
+
1283
+ transition: all 0.2s ease;
1284
+
1285
+ &:hover {
1286
+ transform: scale(1.1);
1287
+ }
1288
+ `}
1289
+ `;
1290
+
1291
+ const ArrowLeft = React.forwardRef<SVGSVGElement, ArrowLeftProps>(
1292
+ ({ size = 'md', variant = 'primary', theme = 'light', ...props }, ref) => {
1293
+ const sizeMap = {
1294
+ sm: 16, md: 24, lg: 32, xl: 40
1295
+ };
1296
+
1297
+ const sizeValue = typeof size === 'string' ? sizeMap[size] : size;
1298
+
1299
+ return (
1300
+ <StyledSVG
1301
+ ref={ref}
1302
+ width={sizeValue}
1303
+ height={sizeValue}
1304
+ viewBox="0 0 24 24"
1305
+ fill="none"
1306
+ variant={variant}
1307
+ theme={theme}
1308
+ {...props}
1309
+ >
1310
+ <path
1311
+ d="M19 12H5M12 19l-7-7 7-7"
1312
+ stroke="currentColor"
1313
+ strokeWidth="2"
1314
+ />
1315
+ </StyledSVG>
1316
+ );
1317
+ }
1318
+ );
1319
+
1320
+ ArrowLeft.displayName = 'ArrowLeft';
1321
+ export default ArrowLeft;
1322
+ ```
1323
+
1324
+ **Vue Composition API Components:**
1325
+
1326
+ ```vue
1327
+ <!-- Generated: vue-components/ArrowLeft.vue -->
1328
+ <script setup lang="ts">
1329
+ interface Props {
1330
+ size?: number | 'sm' | 'md' | 'lg';
1331
+ className?: string;
1332
+ style?: Record<string, any>;
1333
+ }
1334
+
1335
+ const props = withDefaults(defineProps<Props>(), {
1336
+ size: 'md',
1337
+ });
1338
+
1339
+ const sizeValue = computed(() => {
1340
+ if (typeof props.size === 'string') {
1341
+ return { sm: 16, md: 24, lg: 32 }[props.size];
1342
+ }
1343
+ return props.size;
1344
+ });
1345
+ </script>
1346
+
1347
+ <template>
1348
+ <svg
1349
+ :width="sizeValue"
1350
+ :height="sizeValue"
1351
+ viewBox="0 0 24 24"
1352
+ fill="none"
1353
+ :class="className"
1354
+ :style="style"
1355
+ v-bind="$attrs"
1356
+ >
1357
+ <path d="M19 12H5M12 19l-7-7 7-7" stroke="currentColor" stroke-width="2" />
1358
+ </svg>
1359
+ </template>
1360
+
1361
+ <style scoped>
1362
+ svg {
1363
+ color: var(--icon-color, currentColor);
1364
+ transition: all 0.2s ease;
1365
+ }
1366
+
1367
+ svg:hover {
1368
+ transform: scale(1.05);
1369
+ }
1370
+ </style>
1371
+ ```
1372
+
1373
+ **Angular Standalone Components:**
1374
+
1375
+ ```typescript
1376
+ // Generated: angular-components/arrow-left.component.ts
1377
+ import { Component, Input, signal } from '@angular/core';
1378
+ import { CommonModule } from '@angular/common';
1379
+
1380
+ @Component({
1381
+ selector: 'app-arrow-left',
1382
+ standalone: true,
1383
+ imports: [CommonModule],
1384
+ template: `
1385
+ <svg
1386
+ [attr.width]="computedSize()"
1387
+ [attr.height]="computedSize()"
1388
+ viewBox="0 0 24 24"
1389
+ fill="none"
1390
+ [class]="className"
1391
+ [style]="style"
1392
+ >
1393
+ <path d="M19 12H5M12 19l-7-7 7-7" stroke="currentColor" stroke-width="2" />
1394
+ </svg>
1395
+ `,
1396
+ styles: [
1397
+ `
1398
+ svg {
1399
+ color: var(--icon-color, currentColor);
1400
+ transition: all 0.2s ease;
1401
+ }
1402
+ svg:hover {
1403
+ transform: scale(1.05);
1404
+ }
1405
+ `,
1406
+ ],
1407
+ })
1408
+ export class ArrowLeftComponent {
1409
+ @Input() size: number | 'sm' | 'md' | 'lg' = 'md';
1410
+ @Input() className: string = '';
1411
+ @Input() style: Record<string, any> = {};
1412
+
1413
+ private sizeMap = { sm: 16, md: 24, lg: 32 };
1414
+
1415
+ computedSize = signal(() => {
1416
+ return typeof this.size === 'string' ? this.sizeMap[this.size] : this.size;
1417
+ });
1418
+ }
1419
+ ```
1420
+
1421
+ ---
1422
+
1423
+ ### **� Example 4: File Protection & Team Workflows (Advanced)**
1424
+
1425
+ Protect critical files and manage team workflows:
1426
+
1427
+ ```bash
1428
+ # Lock critical brand assets
1429
+ svger-cli lock ./icons/logo.svg
1430
+ svger-cli lock ./icons/brand-mark.svg
1431
+
1432
+ # Build process automatically skips locked files
1433
+ svger-cli build ./icons ./components
1434
+ # ⚠️ Warning: Skipped locked file: logo.svg
1435
+ # ⚠️ Warning: Skipped locked file: brand-mark.svg
1436
+ # Generated 23 components (2 files locked)
1437
+
1438
+ # Watch mode respects locks
1439
+ svger-cli watch ./icons ./components
1440
+ # File changes to locked files are ignored
1441
+
1442
+ # Team workflow: selective unlocking
1443
+ svger-cli unlock ./icons/logo.svg --confirm
1444
+ svger-cli build ./icons ./components --force-locked-update
1445
+
1446
+ # List all locked files
1447
+ svger-cli status --locked
1448
+ ```
1449
+
1450
+ **Team Configuration (.svgerconfig.json):**
1451
+
1452
+ ```json
1453
+ {
1454
+ "source": "./src/assets/icons",
1455
+ "output": "./src/components/icons",
1456
+ "framework": "react",
1457
+ "typescript": true,
1458
+ "forwardRef": true,
1459
+ "lockedFiles": ["./src/assets/icons/logo.svg", "./src/assets/icons/brand-mark.svg"],
1460
+ "teamSettings": {
1461
+ "requireConfirmation": true,
1462
+ "lockByDefault": false,
1463
+ "autoLockPatterns": ["**/brand-*", "**/logo-*"]
1464
+ }
1465
+ }
1466
+ ```
1467
+
1468
+ ---
1469
+
1470
+ ### **⚡ Example 5: Performance Optimization (Expert)**
1471
+
1472
+ Maximum performance setup for large-scale projects:
1473
+
1474
+ ```bash
1475
+ # Performance analysis
1476
+ svger-cli performance --analyze
1477
+ # 📊 Processing 1,247 SVG files
1478
+ # 📊 Average file size: 3.2KB
1479
+ # 📊 Estimated processing time: 2.1s
1480
+ # 💡 Recommendations:
1481
+ # - Increase batch size to 25
1482
+ # - Enable caching for 40% improvement
1483
+ # - Use parallel processing
1484
+
1485
+ # Apply performance optimizations
1486
+ svger-cli build \
1487
+ --src ./massive-icon-library \
1488
+ --out ./optimized-components \
1489
+ --framework react \
1490
+ --parallel \
1491
+ --batch-size 25 \
1492
+ --max-concurrency 8 \
1493
+ --cache \
1494
+ --performance \
1495
+ --memory-limit 512
1496
+
1497
+ # Monitor performance in real-time
1498
+ svger-cli performance --monitor &
1499
+ svger-cli watch ./icons ./components
1500
+
1501
+ # Advanced caching strategy
1502
+ svger-cli config set cache.strategy "aggressive"
1503
+ svger-cli config set cache.ttl 3600000 # 1 hour
1504
+ svger-cli config set cache.maxSize 1024 # 1GB
1505
+
1506
+ # Benchmark against previous versions
1507
+ svger-cli performance --benchmark --compare-with v1.5.0
1508
+ ```
1509
+
1510
+ **Performance Configuration:**
1511
+
1512
+ ```json
1513
+ {
1514
+ "performance": {
1515
+ "optimization": "maximum",
1516
+ "parallel": true,
1517
+ "batchSize": 25,
1518
+ "maxConcurrency": 8,
1519
+ "cache": {
1520
+ "enabled": true,
1521
+ "strategy": "aggressive",
1522
+ "ttl": 3600000,
1523
+ "maxSize": 1024
1524
+ },
1525
+ "memory": {
1526
+ "limit": 512,
1527
+ "gcInterval": 30000,
1528
+ "heapWarning": 400
1529
+ }
1530
+ }
1531
+ }
1532
+ ```
1533
+
1534
+ **Enterprise Usage Patterns:**
1535
+
1536
+ ```typescript
1537
+ // Large-scale import pattern
1538
+ import IconLibrary from './components/icons';
1539
+
1540
+ // Lazy loading for performance
1541
+ const LazyIcon = React.lazy(() => import('./components/icons/SpecificIcon'));
1542
+
1543
+ // Tree-shaking friendly imports
1544
+ import {
1545
+ ArrowLeft,
1546
+ ArrowRight,
1547
+ Home,
1548
+ User,
1549
+ Settings
1550
+ } from './components/icons';
1551
+
1552
+ // Dynamic icon loading
1553
+ const DynamicIcon = ({ name, ...props }) => {
1554
+ const IconComponent = IconLibrary[name];
1555
+ return IconComponent ? <IconComponent {...props} /> : null;
1556
+ };
1557
+ ```
1558
+
1559
+ ---
1560
+
1561
+ ## 🎨 **Advanced Styling & Theming**
1562
+
1563
+ ### **Responsive Design System**
1564
+
1565
+ SVGER-CLI includes a comprehensive responsive design system:
1566
+
1567
+ ```bash
1568
+ # Enable responsive design
1569
+ svger-cli build --responsive --src ./icons --out ./components
1570
+ ```
1571
+
1572
+ **Configuration:**
1573
+
1574
+ ```json
1575
+ {
1576
+ "responsive": {
1577
+ "breakpoints": ["sm", "md", "lg", "xl"],
1578
+ "values": {
1579
+ "width": ["16px", "20px", "24px", "32px"],
1580
+ "height": ["16px", "20px", "24px", "32px"],
1581
+ "strokeWidth": ["1", "1.5", "2", "2.5"]
1582
+ }
1583
+ }
1584
+ }
1585
+ ```
1586
+
1587
+ **Generated React Component:**
1588
+
1589
+ ```tsx
1590
+ interface ResponsiveIconProps extends React.SVGProps<SVGSVGElement> {
1591
+ size?: 'sm' | 'md' | 'lg' | 'xl';
1592
+ }
1593
+
1594
+ const ResponsiveIcon: React.FC<ResponsiveIconProps> = ({ size = 'md', ...props }) => {
1595
+ const sizeMap = {
1596
+ sm: { width: 16, height: 16 },
1597
+ md: { width: 20, height: 20 },
1598
+ lg: { width: 24, height: 24 },
1599
+ xl: { width: 32, height: 32 },
1600
+ };
1601
+
1602
+ return (
1603
+ <svg {...sizeMap[size]} {...props}>
1604
+ ...
1605
+ </svg>
1606
+ );
1607
+ };
1608
+ ```
1609
+
1610
+ ### **Theme System**
1611
+
1612
+ Built-in dark/light theme support with CSS variables:
1613
+
1614
+ ```bash
1615
+ # Generate with theme support
1616
+ svger-cli build --theme dark --src ./icons --out ./components
1617
+ ```
1618
+
1619
+ **Theme Configuration:**
1620
+
1621
+ ```json
1622
+ {
1623
+ "theme": {
1624
+ "mode": "dark",
1625
+ "variables": {
1626
+ "primary": "#ffffff",
1627
+ "secondary": "#94a3b8",
1628
+ "accent": "#3b82f6"
1629
+ }
1630
+ }
1631
+ }
1632
+ ```
1633
+
1634
+ **Generated CSS Variables:**
1635
+
1636
+ ```css
1637
+ :root {
1638
+ --icon-primary: #ffffff;
1639
+ --icon-secondary: #94a3b8;
1640
+ --icon-accent: #3b82f6;
1641
+ }
1642
+
1643
+ .icon {
1644
+ fill: var(--icon-primary);
1645
+ stroke: var(--icon-secondary);
1646
+ }
1647
+ ```
1648
+
1649
+ ### **Animation System**
1650
+
1651
+ Built-in animation utilities:
1652
+
1653
+ ```bash
1654
+ # Generate with animations
1655
+ svger-cli build --animations hover,focus --src ./icons --out ./components
1656
+ ```
1657
+
1658
+ **Available Animations:**
1659
+
1660
+ - `hover` - Hover state transitions
1661
+ - `focus` - Focus state transitions
1662
+ - `spin` - Continuous rotation
1663
+ - `pulse` - Pulsing opacity
1664
+ - `bounce` - Bouncing effect
1665
+ - `scale` - Scale on interaction
1666
+
1667
+ ---
1668
+
1669
+ ## 💻 **Programmatic API**
1670
+
1671
+ ### **📡 API Modules Overview**
1672
+
1673
+ | Module | Purpose | Use Case |
1674
+ | ------------------- | ------------------------ | ----------------------- |
1675
+ | `SVGER` | Main entry point | General operations |
1676
+ | `svgProcessor` | SVG file processing | Custom processing |
1677
+ | `performanceEngine` | Performance optimization | Batch operations |
1678
+ | `styleCompiler` | CSS generation | Styling |
1679
+ | `pluginManager` | Plugin system | Extending functionality |
1680
+
1681
+ ---
1682
+
1683
+ ### **🔌 Core API Usage**
1684
+
1685
+ ```typescript
1686
+ import { SVGER, svgProcessor, frameworkTemplateEngine } from 'svger-cli';
1687
+
1688
+ // Quick processing
1689
+ await SVGER.processFile('./icon.svg', './components/');
1690
+ await SVGER.processBatch(files, { parallel: true, batchSize: 20 });
1691
+
1692
+ // Framework-specific generation
1693
+ await SVGER.generateFrameworkComponent('IconName', svgContent, {
1694
+ framework: 'vue',
1695
+ composition: true,
1696
+ typescript: true,
1697
+ });
1698
+
1699
+ // Advanced processing
1700
+ const result = await svgProcessor.processSVGFile('./icon.svg', './components/', {
1701
+ framework: 'react',
1702
+ typescript: true,
1703
+ forwardRef: true,
1704
+ responsive: true,
1705
+ theme: 'dark',
1706
+ });
1707
+ ```
1708
+
1709
+ ### **⚡ Performance Engine API**
1710
+
1711
+ ```typescript
1712
+ import { performanceEngine } from 'svger-cli';
1713
+
1714
+ // Batch processing with performance optimization
1715
+ const results = await performanceEngine.processBatch(files, {
1716
+ batchSize: 15,
1717
+ parallel: true,
1718
+ maxConcurrency: 6,
1719
+ });
1720
+
1721
+ // Memory monitoring
1722
+ const metrics = performanceEngine.monitorMemoryUsage();
1723
+ console.log(`Memory usage: ${metrics.heapUsed}MB`);
1724
+ console.log(`Recommendations:`, metrics.recommendations);
1725
+
1726
+ // SVG optimization
1727
+ const optimized = performanceEngine.optimizeSVGContent(svgContent, 'maximum');
1728
+ ```
1729
+
1730
+ ### **🎨 Style Compiler API**
1731
+
1732
+ ```typescript
1733
+ import { styleCompiler } from 'svger-cli';
1734
+
1735
+ // Compile responsive styles
1736
+ const styles = styleCompiler.compileStyles({
1737
+ responsive: {
1738
+ width: ['20px', '24px', '32px'],
1739
+ height: ['20px', '24px', '32px'],
1740
+ },
1741
+ theme: 'dark',
1742
+ animations: ['hover', 'focus'],
1743
+ });
1744
+
1745
+ // Generate CSS
1746
+ const css = styleCompiler.generateCSS(styles);
1747
+ ```
1748
+
1749
+ ### **🔧 Plugin System API**
1750
+
1751
+ ```typescript
1752
+ import { pluginManager } from 'svger-cli';
1753
+
1754
+ // Register custom plugin
1755
+ pluginManager.registerPlugin({
1756
+ name: 'custom-optimizer',
1757
+ version: '1.0.0',
1758
+ process: async (content: string, options?: any) => {
1759
+ // Custom SVG processing logic
1760
+ return processedContent;
1761
+ },
1762
+ validate: (options?: any) => true,
1763
+ });
1764
+
1765
+ // Enable plugin
1766
+ pluginManager.enablePlugin('custom-optimizer', { level: 'maximum' });
1767
+
1768
+ // Process with plugins
1769
+ const processed = await pluginManager.processContent(svgContent, [
1770
+ { name: 'svg-optimizer', options: { level: 'balanced' } },
1771
+ { name: 'custom-optimizer', options: { level: 'maximum' } },
1772
+ ]);
1773
+ ```
1774
+
1775
+ ---
1776
+
1777
+ ## 🔧 **Configuration Reference**
1778
+
1779
+ ### **📝 Configuration Sections Quick Links**
1780
+
1781
+ | Section | Options | Purpose |
1782
+ | ------------------------------------------------- | ------------------------------- | ------------------ |
1783
+ | [Source & Output](#complete-configuration-schema) | `source`, `output` | Paths |
1784
+ | [Framework](#complete-configuration-schema) | `framework`, `typescript` | Framework choice |
1785
+ | [Processing](#complete-configuration-schema) | `parallel`, `batchSize` | Performance |
1786
+ | [Defaults](#complete-configuration-schema) | `defaultWidth`, `defaultHeight` | Defaults |
1787
+ | [Styling](#complete-configuration-schema) | `styleRules`, `responsive` | Styling |
1788
+ | [Theme](#complete-configuration-schema) | `theme`, `variables` | Theme system |
1789
+ | [Error Handling](#complete-configuration-schema) | `strategy`, `maxRetries` | Error handling |
1790
+ | [Performance](#complete-configuration-schema) | `optimization`, `memoryLimit` | Performance tuning |
1791
+ | [Output](#complete-configuration-schema) | `naming`, `extension` | Output format |
1792
+ | [Framework-Specific](#framework-specific-options) | `react`, `vue`, `angular` | Framework options |
1793
+
1794
+ ---
1795
+
1796
+ ### **Complete Configuration Schema**
1797
+
1798
+ All configuration options are now fully implemented and tested:
1799
+
1800
+ ```typescript
1801
+ interface SVGConfig {
1802
+ // Source & Output
1803
+ source: string; // Input directory path
1804
+ output: string; // Output directory path
1805
+
1806
+ // Framework Configuration
1807
+ framework: FrameworkType; // Target framework
1808
+ typescript: boolean; // Generate TypeScript
1809
+ componentType: ComponentType; // Component pattern
1810
+
1811
+ // Processing Options
1812
+ watch: boolean; // Enable file watching
1813
+ parallel: boolean; // Enable parallel processing
1814
+ batchSize: number; // Batch processing size
1815
+ maxConcurrency: number; // Maximum concurrent processes
1816
+ cache: boolean; // Enable processing cache
1817
+
1818
+ // Default Properties
1819
+ defaultWidth: number; // Default SVG width
1820
+ defaultHeight: number; // Default SVG height
1821
+ defaultFill: string; // Default fill color
1822
+ defaultStroke: string; // Default stroke color
1823
+ defaultStrokeWidth: number; // Default stroke width
1824
+
1825
+ // Styling Configuration
1826
+ styleRules: {
1827
+ // CSS styling rules
1828
+ [property: string]: string;
1829
+ };
1830
+
1831
+ responsive: {
1832
+ // Responsive design
1833
+ breakpoints: string[];
1834
+ values: {
1835
+ [property: string]: string[];
1836
+ };
1837
+ };
1838
+
1839
+ theme: {
1840
+ // Theme configuration
1841
+ mode: 'light' | 'dark' | 'auto';
1842
+ variables: {
1843
+ [name: string]: string;
1844
+ };
1845
+ };
1846
+
1847
+ animations: string[]; // Animation effects
1848
+
1849
+ // Advanced Options
1850
+ plugins: PluginConfig[]; // Plugin configurations
1851
+ exclude: string[]; // Files to exclude
1852
+ include: string[]; // Files to include (overrides exclude)
1853
+
1854
+ // Error Handling
1855
+ errorHandling: {
1856
+ strategy: 'continue' | 'stop' | 'retry';
1857
+ maxRetries: number;
1858
+ timeout: number;
1859
+ };
1860
+
1861
+ // Performance Settings
1862
+ performance: {
1863
+ optimization: 'fast' | 'balanced' | 'maximum';
1864
+ memoryLimit: number; // Memory limit in MB
1865
+ cacheTimeout: number; // Cache timeout in ms
1866
+ };
1867
+
1868
+ // Output Customization
1869
+ outputConfig: {
1870
+ naming: 'kebab' | 'pascal' | 'camel';
1871
+ extension: string; // File extension override
1872
+ directory: string; // Output directory structure
1873
+ };
1874
+
1875
+ // Framework-specific configurations
1876
+ react?: ReactConfig;
1877
+ vue?: VueConfig;
1878
+ angular?: AngularConfig;
1879
+ }
1880
+ ```
1881
+
1882
+ **✅ All 28 configuration properties are fully implemented and tested**
1883
+
1884
+ ### **Configuration Validation**
1885
+
1886
+ SVGER-CLI includes comprehensive configuration validation to ensure all settings are correct:
1887
+
1888
+ ```bash
1889
+ # Validate current configuration
1890
+ svger-cli config --validate
1891
+
1892
+ # Show detailed configuration analysis
1893
+ svger-cli config --show
1894
+
1895
+ # Test configuration with sample files
1896
+ svger-cli build --dry-run --src ./test-svg --out ./test-output
1897
+ ```
1898
+
1899
+ **Validation Features:**
1900
+
1901
+ - ✅ **Type Safety**: All configuration options are type-checked
1902
+ - ✅ **Framework Compatibility**: Validates framework-specific options
1903
+ - ✅ **Performance Settings**: Ensures optimal performance configuration
1904
+ - ✅ **Path Validation**: Verifies source and output directories
1905
+ - ✅ **Plugin Validation**: Checks plugin compatibility and options
1906
+
1907
+ ### **Example Configuration Files**
1908
+
1909
+ A comprehensive example configuration is included with detailed explanations:
1910
+
1911
+ ```bash
1912
+ # Copy example configuration
1913
+ cp .svgerconfig.example.json .svgerconfig.json
1914
+
1915
+ # Initialize with interactive setup
1916
+ svger-cli init --interactive
1917
+ ```
1918
+
1919
+ The example file includes all 28 configuration options with documentation and examples for React,
1920
+ Vue, Angular, and other frameworks.
1921
+
1922
+ ### **Framework-Specific Options**
1923
+
1924
+ #### **React Configuration**
1925
+
1926
+ ```json
1927
+ {
1928
+ "framework": "react",
1929
+ "react": {
1930
+ "componentType": "functional",
1931
+ "forwardRef": true,
1932
+ "memo": false,
1933
+ "propsInterface": "SVGProps",
1934
+ "styledComponents": true,
1935
+ "cssModules": false
1936
+ }
1937
+ }
1938
+ ```
1939
+
1940
+ #### **Vue Configuration**
1941
+
1942
+ ```json
1943
+ {
1944
+ "framework": "vue",
1945
+ "vue": {
1946
+ "api": "composition",
1947
+ "setup": true,
1948
+ "typescript": true,
1949
+ "scoped": true,
1950
+ "cssVariables": true
1951
+ }
1952
+ }
1953
+ ```
1954
+
1955
+ #### **Angular Configuration**
1956
+
1957
+ ```json
1958
+ {
1959
+ "framework": "angular",
1960
+ "angular": {
1961
+ "standalone": true,
1962
+ "signals": true,
1963
+ "changeDetection": "OnPush",
1964
+ "encapsulation": "Emulated"
1965
+ }
1966
+ }
1967
+ ```
1968
+
1969
+ ---
1970
+
1971
+ ## 📊 **Performance Optimization**
1972
+
1973
+ ### **Benchmarks vs Competitors**
1974
+
1975
+ | **Operation** | **SVGER v2.0** | **SVGR** | **Improvement** |
1976
+ | ----------------------- | -------------- | -------- | --------------- |
1977
+ | Single file (100KB SVG) | 15ms | 25ms | **40% faster** |
1978
+ | Batch (100 files) | 850ms | 1,450ms | **70% faster** |
1979
+ | Memory (1000 files) | 45MB | 120MB | **62% less** |
1980
+ | Bundle size | 2.1MB | 18.7MB | **89% smaller** |
1981
+ | Startup time | 120ms | 340ms | **65% faster** |
1982
+
1983
+ ### **Performance Best Practices**
1984
+
1985
+ #### **Batch Processing Optimization**
1986
+
1987
+ ```bash
1988
+ # Optimal batch processing
1989
+ svger-cli build \
1990
+ --src ./icons \
1991
+ --out ./components \
1992
+ --parallel \
1993
+ --batch-size 15 \
1994
+ --max-concurrency 4 \
1995
+ --cache \
1996
+ --performance
1997
+ ```
1998
+
1999
+ #### **Memory Management**
2000
+
2001
+ ```typescript
2002
+ // Monitor memory usage
2003
+ import { performanceEngine } from 'svger-cli';
2004
+
2005
+ const monitor = setInterval(() => {
2006
+ const usage = performanceEngine.monitorMemoryUsage();
2007
+ if (usage.heapUsed > 500) {
2008
+ console.warn('High memory usage detected');
2009
+ performanceEngine.clearCache();
2010
+ }
2011
+ }, 5000);
2012
+ ```
2013
+
2014
+ #### **Cache Configuration**
2015
+
2016
+ ```json
2017
+ {
2018
+ "performance": {
2019
+ "cache": true,
2020
+ "cacheTimeout": 300000,
2021
+ "memoryLimit": 512
2022
+ }
2023
+ }
2024
+ ```
2025
+
2026
+ ---
2027
+
2028
+ ## 🧪 **Testing & Quality Assurance**
2029
+
2030
+ ### **Component Testing**
2031
+
2032
+ Generated components include comprehensive testing utilities:
2033
+
2034
+ ```typescript
2035
+ // Generated React component test
2036
+ import { render, screen } from '@testing-library/react';
2037
+ import { IconName } from './IconName';
2038
+
2039
+ describe('IconName', () => {
2040
+ it('renders with default props', () => {
2041
+ render(<IconName />);
2042
+ const svg = screen.getByRole('img', { hidden: true });
2043
+ expect(svg).toBeInTheDocument();
2044
+ });
2045
+
2046
+ it('accepts custom props', () => {
2047
+ render(<IconName width={32} height={32} fill="red" />);
2048
+ const svg = screen.getByRole('img', { hidden: true });
2049
+ expect(svg).toHaveAttribute('width', '32');
2050
+ expect(svg).toHaveAttribute('height', '32');
2051
+ expect(svg).toHaveAttribute('fill', 'red');
2052
+ });
2053
+ });
2054
+ ```
2055
+
2056
+ ### **Integration Testing**
2057
+
2058
+ ```bash
2059
+ # Run integration tests
2060
+ npm run test:integration
2061
+
2062
+ # Test specific framework
2063
+ npm run test:framework:react
2064
+ npm run test:framework:vue
2065
+ npm run test:framework:angular
2066
+ ```
2067
+
2068
+ ### **Performance Testing**
2069
+
2070
+ ```bash
2071
+ # Run performance benchmarks
2072
+ svger-cli performance --benchmark
2073
+
2074
+ # Memory leak testing
2075
+ svger-cli performance --memory --duration 60s
2076
+
2077
+ # Load testing
2078
+ svger-cli performance --load --files 1000
2079
+ ```
2080
+
2081
+ ---
2082
+
2083
+ ## 🚀 **Production Deployment**
2084
+
2085
+ ### **CI/CD Integration**
2086
+
2087
+ #### **GitHub Actions**
2088
+
2089
+ ```yaml
2090
+ name: SVG Component Generation
2091
+ on:
2092
+ push:
2093
+ paths: ['src/assets/svg/**']
2094
+
2095
+ jobs:
2096
+ generate-components:
2097
+ runs-on: ubuntu-latest
2098
+ steps:
2099
+ - uses: actions/checkout@v3
2100
+ - uses: actions/setup-node@v3
2101
+ with:
2102
+ node-version: '18'
2103
+
2104
+ - name: Install SVGER-CLI
2105
+ run: npm install -g svger-cli@2.0.7
2106
+
2107
+ - name: Generate Components
2108
+ run: |
2109
+ svger-cli build \
2110
+ --src ./src/assets/svg \
2111
+ --out ./src/components/icons \
2112
+ --framework react \
2113
+ --typescript \
2114
+ --parallel \
2115
+ --performance
2116
+
2117
+ - name: Commit Generated Components
2118
+ run: |
2119
+ git config --local user.email "action@github.com"
2120
+ git config --local user.name "GitHub Action"
2121
+ git add src/components/icons/
2122
+ git commit -m "🤖 Auto-generated SVG components" || exit 0
2123
+ git push
2124
+ ```
2125
+
2126
+ #### **Jenkins Pipeline**
2127
+
2128
+ ```groovy
2129
+ pipeline {
2130
+ agent any
2131
+
2132
+ stages {
2133
+ stage('Generate SVG Components') {
2134
+ steps {
2135
+ sh '''
2136
+ npm install -g svger-cli@2.0.7
2137
+ svger-cli build \
2138
+ --src ./assets/svg \
2139
+ --out ./components \
2140
+ --framework vue \
2141
+ --composition \
2142
+ --typescript \
2143
+ --cache \
2144
+ --performance
2145
+ '''
2146
+ }
2147
+ }
2148
+ }
2149
+ }
2150
+ ```
2151
+
2152
+ ### **Docker Integration**
2153
+
2154
+ ```dockerfile
2155
+ FROM node:18-alpine
2156
+
2157
+ # Install SVGER-CLI globally
2158
+ RUN npm install -g svger-cli@2.0.7
2159
+
2160
+ # Set working directory
2161
+ WORKDIR /app
2162
+
2163
+ # Copy SVG files
2164
+ COPY src/assets/svg ./src/assets/svg
2165
+
2166
+ # Generate components
2167
+ RUN svger-cli build \
2168
+ --src ./src/assets/svg \
2169
+ --out ./src/components/icons \
2170
+ --framework react \
2171
+ --typescript \
2172
+ --parallel
2173
+
2174
+ # Copy generated components
2175
+ COPY src/components ./src/components
2176
+ ```
2177
+
2178
+ ---
2179
+
2180
+ ## 🔌 **Plugin Development**
2181
+
2182
+ ### **Creating Custom Plugins**
2183
+
2184
+ ```typescript
2185
+ import { Plugin } from 'svger-cli';
2186
+
2187
+ const customOptimizer: Plugin = {
2188
+ name: 'custom-svg-optimizer',
2189
+ version: '1.0.0',
2190
+
2191
+ process: async (content: string, options?: any) => {
2192
+ // Custom SVG processing logic
2193
+ const optimized = content
2194
+ .replace(/fill="none"/g, '')
2195
+ .replace(/stroke="currentColor"/g, 'stroke="inherit"');
2196
+
2197
+ return optimized;
2198
+ },
2199
+
2200
+ validate: (options?: any) => {
2201
+ return options && typeof options.level === 'string';
2202
+ },
2203
+ };
2204
+
2205
+ // Register plugin
2206
+ import { pluginManager } from 'svger-cli';
2207
+ pluginManager.registerPlugin(customOptimizer);
2208
+ ```
2209
+
2210
+ ### **Plugin Configuration**
2211
+
2212
+ ```json
2213
+ {
2214
+ "plugins": [
2215
+ {
2216
+ "name": "svg-optimizer",
2217
+ "options": {
2218
+ "level": "balanced"
2219
+ }
2220
+ },
2221
+ {
2222
+ "name": "custom-svg-optimizer",
2223
+ "options": {
2224
+ "level": "maximum"
2225
+ }
2226
+ }
2227
+ ]
2228
+ }
2229
+ ```
2230
+
2231
+ ---
2232
+
2233
+ ## 🔍 **Troubleshooting & FAQ**
2234
+
2235
+ ### **Common Issues**
2236
+
2237
+ #### **Memory Issues**
2238
+
2239
+ ```bash
2240
+ # If experiencing memory issues with large batches
2241
+ svger-cli build \
2242
+ --batch-size 5 \
2243
+ --max-concurrency 2 \
2244
+ --src ./icons \
2245
+ --out ./components
2246
+ ```
2247
+
2248
+ #### **Performance Issues**
2249
+
2250
+ ```bash
2251
+ # Enable performance monitoring
2252
+ svger-cli performance --analyze
2253
+
2254
+ # Clear cache if needed
2255
+ svger-cli clean --cache
2256
+
2257
+ # Optimize configuration
2258
+ svger-cli performance --optimize
2259
+ ```
2260
+
2261
+ #### **TypeScript Errors**
2262
+
2263
+ ```bash
2264
+ # Validate configuration
2265
+ svger-cli config --validate
2266
+
2267
+ # Regenerate with strict TypeScript
2268
+ svger-cli build --typescript --strict
2269
+ ```
2270
+
2271
+ ### **Debugging**
2272
+
2273
+ ```bash
2274
+ # Enable verbose logging
2275
+ svger-cli build --verbose --src ./icons --out ./components
2276
+
2277
+ # Debug specific framework
2278
+ svger-cli build --framework vue --debug
2279
+
2280
+ # Performance debugging
2281
+ svger-cli build --performance --memory
2282
+ ```
2283
+
2284
+ ---
2285
+
2286
+ ## 📚 **Migration Guide**
2287
+
2288
+ ### **From SVGR**
2289
+
2290
+ ```bash
2291
+ # Install SVGER-CLI
2292
+ npm uninstall @svgr/webpack @svgr/cli
2293
+ npm install -g svger-cli@2.0.7
2294
+
2295
+ # Migrate configuration
2296
+ svger-cli init --framework react --typescript
2297
+
2298
+ # Build components
2299
+ svger-cli build --src ./assets --out ./components
2300
+ ```
2301
+
2302
+ ### **From v1.x**
2303
+
2304
+ ```bash
2305
+ # Upgrade to v2.0
2306
+ npm install -g svger-cli@2.0.7
2307
+
2308
+ # Migrate configuration
2309
+ svger-cli config --migrate
2310
+
2311
+ # Rebuild with new features
2312
+ svger-cli build --framework react --responsive --theme dark
2313
+ ```
2314
+
2315
+ ---
2316
+
2317
+ ## 🤝 **Contributing & Support**
2318
+
2319
+ ### **Contributing**
2320
+
2321
+ 1. Fork the repository
2322
+ 2. Create your feature branch (`git checkout -b feature/amazing-feature`)
2323
+ 3. Commit your changes (`git commit -m 'Add amazing feature'`)
2324
+ 4. Push to the branch (`git push origin feature/amazing-feature`)
2325
+ 5. Open a Pull Request
2326
+
2327
+ ### **Support**
2328
+
2329
+ - 📧 **Email**: navidrezadoost07@gmail.com
2330
+ - 🐛 **Issues**: [GitHub Issues](https://github.com/faezemohades/svger-cli/issues)
2331
+ - 📖 **Documentation**: [docs.svger-cli.com](https://docs.svger-cli.com)
2332
+
2333
+ ---
2334
+
2335
+ ## 📄 **License & Acknowledgements**
2336
+
2337
+ ### **License**
2338
+
2339
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
2340
+
2341
+ ### **Acknowledgements**
2342
+
2343
+ This project was developed through the collaborative efforts of:
2344
+
2345
+ - **🏗️ Architecture Design**: [ADR-001](./docs/ADR-SVG-INTRGRATION-METHODS-001.adr.md) authored by
2346
+ **Engineer Navid Rezadoost**
2347
+ - **📋 Technical Requirements**:
2348
+ [TDR-001](https://docs.google.com/document/d/1b04_V01xOvLiSMzuPdaRynANlnt2wYdJ_vjs9MAqtn4/edit?tab=t.0)
2349
+ prepared by **Ehsan Jafari**
2350
+ - **💻 Implementation**: **Navid Rezadoost** - Faeze Mohades Lead developer and package maintainer
2351
+ - **🏢 Enterprise Architecture**: SVGER Development Team
2352
+
2353
+ Their guidance and documentation on SVG integration methods in React, Vue, and other frameworks were
2354
+ instrumental in shaping the design and functionality of the SVGER-CLI v2.0.
2355
+
2356
+ ### **Special Thanks**
2357
+
2358
+ - The open-source community for inspiration and feedback
2359
+ - Framework maintainers for excellent documentation
2360
+ - Beta testers who provided valuable insights
2361
+ - Enterprise customers who drove advanced feature requirements
2362
+
2363
+ ---
2364
+
2365
+ **© 2025 SVGER-CLI Development Team. Built with ❤️ for the developer community.**
2366
+
2367
+ ---
2368
+
2369
+ ## 📚 **Additional Documentation**
2370
+
2371
+ - **[📊 Complete Feature Comparison & Benchmarks](./COMPARISON.md)** - Detailed technical analysis
2372
+ with documented performance claims
2373
+ - Benchmark methodology and test environment
2374
+ - Detailed dependency tree analysis
2375
+ - Webpack integration guide
2376
+ - Complete configuration options breakdown
2377
+ - Real-world performance examples