@arela/uploader 0.2.1 โ 0.2.2
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/package.json +1 -1
- package/src/document-type-shared.js +22 -8
- package/src/document-types/pedimento-simplificado.js +11 -29
- package/src/file-detection.js +43 -28
- package/src/index.js +375 -199
- package/OPTIMIZATION_SUMMARY.md +0 -154
- package/PERFORMANCE_OPTIMIZATIONS.md +0 -270
package/OPTIMIZATION_SUMMARY.md
DELETED
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
# File System Optimization Summary
|
|
2
|
-
|
|
3
|
-
## ๐ fs.statSync Call Optimizations
|
|
4
|
-
|
|
5
|
-
### Before Optimization
|
|
6
|
-
The code had multiple redundant `fs.statSync` calls that could cause performance bottlenecks:
|
|
7
|
-
|
|
8
|
-
1. **Line 423**: `insertStatsToUploaderTable` - called `fs.statSync` for each file
|
|
9
|
-
2. **Line 530**: `insertStatsOnlyToUploaderTable` - called `fs.statSync` for each file
|
|
10
|
-
3. **Line 1254**: `uploadFilesByRfc` - called both `fs.statSync` and `fs.readFileSync`
|
|
11
|
-
4. **Line 1743**: Source path checking (necessary - kept as is)
|
|
12
|
-
|
|
13
|
-
### After Optimization
|
|
14
|
-
|
|
15
|
-
#### 1. **Eliminated Redundant fs.statSync in RFC Upload** ๐
|
|
16
|
-
**Location**: `uploadFilesByRfc` function (Line ~1254)
|
|
17
|
-
```javascript
|
|
18
|
-
// Before: Two separate I/O calls
|
|
19
|
-
const fileStats = fs.statSync(originalPath);
|
|
20
|
-
const fileBuffer = fs.readFileSync(originalPath);
|
|
21
|
-
size: fileStats.size,
|
|
22
|
-
|
|
23
|
-
// After: Single I/O call, get size from buffer
|
|
24
|
-
const fileBuffer = fs.readFileSync(originalPath);
|
|
25
|
-
size: fileBuffer.length, // Get size from buffer instead of fs.statSync
|
|
26
|
-
```
|
|
27
|
-
**Performance Gain**: ~50% reduction in I/O calls for RFC uploads
|
|
28
|
-
|
|
29
|
-
#### 2. **Pre-computed Stats Pattern** ๐
|
|
30
|
-
**Location**: `insertStatsToUploaderTable` and `insertStatsOnlyToUploaderTable`
|
|
31
|
-
```javascript
|
|
32
|
-
// Before: Always called fs.statSync
|
|
33
|
-
const stats = fs.statSync(file.path);
|
|
34
|
-
|
|
35
|
-
// After: Use pre-computed stats when available
|
|
36
|
-
const stats = file.stats || fs.statSync(file.path);
|
|
37
|
-
```
|
|
38
|
-
**Performance Gain**: Enables stats caching and batch optimization
|
|
39
|
-
|
|
40
|
-
#### 3. **Batch File Stats Reading** โก
|
|
41
|
-
**Location**: New `batchReadFileStats` utility function
|
|
42
|
-
```javascript
|
|
43
|
-
// New optimized batch function
|
|
44
|
-
const batchReadFileStats = (filePaths) => {
|
|
45
|
-
const results = [];
|
|
46
|
-
for (const filePath of filePaths) {
|
|
47
|
-
try {
|
|
48
|
-
const stats = fs.statSync(filePath);
|
|
49
|
-
results.push({ path: filePath, stats, error: null });
|
|
50
|
-
} catch (error) {
|
|
51
|
-
results.push({ path: filePath, stats: null, error: error.message });
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
return results;
|
|
55
|
-
};
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
#### 4. **Optimized Stats-Only Processing** ๐
|
|
59
|
-
**Location**: `processFilesInBatches` function (stats-only mode)
|
|
60
|
-
```javascript
|
|
61
|
-
// Before: Individual fs.statSync calls within insertStatsOnlyToUploaderTable
|
|
62
|
-
const statsFiles = batch.map((file) => ({ path: file, originalName: ... }));
|
|
63
|
-
|
|
64
|
-
// After: Batch read stats once, pass to function
|
|
65
|
-
const fileStatsResults = batchReadFileStats(batch);
|
|
66
|
-
const statsFiles = fileStatsResults
|
|
67
|
-
.filter(result => result.stats !== null)
|
|
68
|
-
.map(result => ({
|
|
69
|
-
path: result.path,
|
|
70
|
-
originalName: path.basename(result.path),
|
|
71
|
-
stats: result.stats, // Pre-computed stats
|
|
72
|
-
}));
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
### Performance Benefits
|
|
76
|
-
|
|
77
|
-
#### **Quantified Improvements**:
|
|
78
|
-
|
|
79
|
-
1. **RFC Upload Mode**:
|
|
80
|
-
- **Before**: 2 I/O calls per file (fs.statSync + fs.readFileSync)
|
|
81
|
-
- **After**: 1 I/O call per file (fs.readFileSync only)
|
|
82
|
-
- **Improvement**: 50% reduction in I/O operations
|
|
83
|
-
|
|
84
|
-
2. **Stats-Only Mode**:
|
|
85
|
-
- **Before**: fs.statSync called twice per file (once in batch prep, once in insert function)
|
|
86
|
-
- **After**: fs.statSync called once per file with stats caching
|
|
87
|
-
- **Improvement**: 50% reduction in fs.statSync calls
|
|
88
|
-
|
|
89
|
-
3. **Error Handling**:
|
|
90
|
-
- **Before**: Crashes on file access errors
|
|
91
|
-
- **After**: Graceful error handling with detailed logging
|
|
92
|
-
- **Improvement**: Better reliability and debugging
|
|
93
|
-
|
|
94
|
-
#### **Expected Performance Gains**:
|
|
95
|
-
|
|
96
|
-
- **Small datasets (< 1K files)**: 15-25% faster processing
|
|
97
|
-
- **Medium datasets (1K-10K files)**: 25-40% faster processing
|
|
98
|
-
- **Large datasets (> 10K files)**: 40-60% faster processing
|
|
99
|
-
- **Network file systems**: Even greater improvements due to reduced I/O latency
|
|
100
|
-
|
|
101
|
-
### Implementation Details
|
|
102
|
-
|
|
103
|
-
#### **Error Handling Improvements**:
|
|
104
|
-
- Added graceful handling of file access errors
|
|
105
|
-
- Failed file reads are logged and counted separately
|
|
106
|
-
- Progress bars account for failed operations
|
|
107
|
-
- Detailed error reporting for debugging
|
|
108
|
-
|
|
109
|
-
#### **Memory Efficiency**:
|
|
110
|
-
- Stats are computed once and reused
|
|
111
|
-
- Buffer sizes used instead of separate stat calls
|
|
112
|
-
- Batch processing prevents memory overflow
|
|
113
|
-
|
|
114
|
-
#### **Backward Compatibility**:
|
|
115
|
-
- All existing function signatures maintained
|
|
116
|
-
- New optimizations are opt-in through pre-computed stats
|
|
117
|
-
- Fallback to original behavior when stats not provided
|
|
118
|
-
|
|
119
|
-
### Usage Examples
|
|
120
|
-
|
|
121
|
-
#### **Phase 1 (Stats Only) - Optimized**:
|
|
122
|
-
```bash
|
|
123
|
-
# Now 50% faster due to eliminated redundant fs.statSync calls
|
|
124
|
-
arela --stats-only --batch-size 1000
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
#### **Phase 4 (RFC Upload) - Optimized**:
|
|
128
|
-
```bash
|
|
129
|
-
# Now 50% faster due to eliminated fs.statSync calls in file size detection
|
|
130
|
-
arela --upload-by-rfc --batch-size 10
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
#### **Combined Workflow - Optimized**:
|
|
134
|
-
```bash
|
|
135
|
-
# All phases benefit from reduced I/O operations
|
|
136
|
-
arela --run-all-phases --batch-size 20
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
### Future Optimization Opportunities
|
|
140
|
-
|
|
141
|
-
1. **Async File Operations**: Consider using `fs.promises.stat()` for non-blocking I/O
|
|
142
|
-
2. **Worker Threads**: Parallelize file stats reading across multiple threads
|
|
143
|
-
3. **File Stats Caching**: Implement LRU cache for frequently accessed files
|
|
144
|
-
4. **Memory Mapping**: Use memory-mapped files for very large file processing
|
|
145
|
-
|
|
146
|
-
### Monitoring & Debugging
|
|
147
|
-
|
|
148
|
-
The optimizations include enhanced logging to monitor performance:
|
|
149
|
-
- File read error counts and details
|
|
150
|
-
- Batch processing statistics
|
|
151
|
-
- I/O operation timing (can be added with `--show-stats`)
|
|
152
|
-
- Memory usage patterns
|
|
153
|
-
|
|
154
|
-
This optimization significantly improves the tool's performance, especially for large file collections, while maintaining full backward compatibility and adding better error handling.
|
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
# Performance Optimizations Summary
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
This document outlines the comprehensive performance optimizations implemented in the arela-uploader CLI tool, focusing on the `--stats-only` mode and overall file processing efficiency.
|
|
5
|
-
|
|
6
|
-
## ๐ Major Optimizations Implemented
|
|
7
|
-
|
|
8
|
-
### 1. File System I/O Optimization (50% Reduction)
|
|
9
|
-
**Problem:** Multiple redundant `fs.statSync` calls for the same files across different functions.
|
|
10
|
-
|
|
11
|
-
**Solution:** Implemented `batchReadFileStats` utility function with Map-based caching.
|
|
12
|
-
|
|
13
|
-
**Impact:**
|
|
14
|
-
- โ
Eliminated 50% of file system I/O operations
|
|
15
|
-
- โ
Significant performance improvement in large directory processing
|
|
16
|
-
- โ
Memory-efficient caching with automatic cleanup
|
|
17
|
-
|
|
18
|
-
**Code Changes:**
|
|
19
|
-
```javascript
|
|
20
|
-
// Before: Multiple individual fs.statSync calls
|
|
21
|
-
const stats = fs.statSync(filePath);
|
|
22
|
-
|
|
23
|
-
// After: Batch processing with caching
|
|
24
|
-
const statsMap = batchReadFileStats(allFilePaths);
|
|
25
|
-
const stats = statsMap.get(filePath);
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### 2. Path Detection Caching (Eliminates Redundant Processing)
|
|
29
|
-
**Problem:** `extractYearAndPedimentoFromPath` was called multiple times for the same file paths.
|
|
30
|
-
|
|
31
|
-
**Solution:** Implemented `pathDetectionCache` Map with `getCachedPathDetection` wrapper function.
|
|
32
|
-
|
|
33
|
-
**Impact:**
|
|
34
|
-
- โ
Eliminates redundant path parsing operations
|
|
35
|
-
- โ
Significant CPU time savings for large file collections
|
|
36
|
-
- โ
Memory-efficient caching with String keys
|
|
37
|
-
|
|
38
|
-
**Code Changes:**
|
|
39
|
-
```javascript
|
|
40
|
-
// Before: Direct function calls
|
|
41
|
-
const detection = extractYearAndPedimentoFromPath(filePath, basePath);
|
|
42
|
-
|
|
43
|
-
// After: Cached function calls
|
|
44
|
-
const detection = getCachedPathDetection(filePath, basePath);
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### 3. Four-Phase Workflow Implementation
|
|
48
|
-
**Problem:** Monolithic processing approach with mixed concerns.
|
|
49
|
-
|
|
50
|
-
**Solution:** Separated processing into distinct phases for better resource management.
|
|
51
|
-
|
|
52
|
-
**Phases:**
|
|
53
|
-
1. **Stats Collection:** Fast metadata gathering
|
|
54
|
-
2. **File Detection:** Pattern matching and classification
|
|
55
|
-
3. **Data Propagation:** Database updates and synchronization
|
|
56
|
-
4. **Upload Processing:** File transfers and API interactions
|
|
57
|
-
|
|
58
|
-
**Impact:**
|
|
59
|
-
- โ
Better resource utilization
|
|
60
|
-
- โ
Improved error handling and recovery
|
|
61
|
-
- โ
Enhanced monitoring and debugging capabilities
|
|
62
|
-
- โ
Parallel processing opportunities
|
|
63
|
-
|
|
64
|
-
### 4. Database Query Optimization (Eliminates Unnecessary SELECT)
|
|
65
|
-
**Problem:** Using `.select()` after `.upsert()` to retrieve inserted records, causing unnecessary data transfer.
|
|
66
|
-
|
|
67
|
-
**Solution:** Modified `insertStatsOnlyToUploaderTable` to return computed statistics instead of full records.
|
|
68
|
-
|
|
69
|
-
**Impact:**
|
|
70
|
-
- โ
Eliminates unnecessary SELECT operations after INSERT/UPSERT
|
|
71
|
-
- โ
Reduces network data transfer significantly
|
|
72
|
-
- โ
Faster database operations with `count: 'exact'` option
|
|
73
|
-
- โ
Improved memory efficiency by not storing large result sets
|
|
74
|
-
|
|
75
|
-
**Code Changes:**
|
|
76
|
-
```javascript
|
|
77
|
-
// Before: SELECT after UPSERT with full record retrieval
|
|
78
|
-
const { data, error } = await supabase
|
|
79
|
-
.from('uploader')
|
|
80
|
-
.upsert(batch, { onConflict: 'original_path' })
|
|
81
|
-
.select('id, original_path, status');
|
|
82
|
-
|
|
83
|
-
// After: COUNT-only with computed statistics
|
|
84
|
-
const { error, count } = await supabase
|
|
85
|
-
.from('uploader')
|
|
86
|
-
.upsert(batch, {
|
|
87
|
-
onConflict: 'original_path',
|
|
88
|
-
count: 'exact'
|
|
89
|
-
});
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### 6. Log File I/O Optimization (Eliminates Blocking Operations)
|
|
93
|
-
**Problem:** Synchronous `fs.appendFileSync` calls for every log entry, causing I/O blocking.
|
|
94
|
-
|
|
95
|
-
**Solution:** Implemented buffered logging with automatic flushing based on buffer size and time intervals.
|
|
96
|
-
|
|
97
|
-
**Impact:**
|
|
98
|
-
- โ
Eliminates blocking I/O operations during logging
|
|
99
|
-
- โ
Reduces file system calls by up to 90%
|
|
100
|
-
- โ
Automatic buffer flushing ensures no log loss
|
|
101
|
-
- โ
Graceful shutdown handling with process exit listeners
|
|
102
|
-
|
|
103
|
-
**Code Changes:**
|
|
104
|
-
```javascript
|
|
105
|
-
// Before: Synchronous logging per message
|
|
106
|
-
fs.appendFileSync(logFilePath, `[${timestamp}] ${message}\n`);
|
|
107
|
-
|
|
108
|
-
// After: Buffered logging with batch flushing
|
|
109
|
-
logBuffer.push(`[${timestamp}] ${message}`);
|
|
110
|
-
if (logBuffer.length >= LOG_BUFFER_SIZE || timeExpired) {
|
|
111
|
-
flushLogBuffer();
|
|
112
|
-
}
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
### 7. Verbose Logging Control (Reduces Console Overhead)
|
|
116
|
-
**Problem:** Excessive console.log calls for path structure logging impacting performance.
|
|
117
|
-
|
|
118
|
-
**Solution:** Implemented conditional verbose logging controlled by environment variable.
|
|
119
|
-
|
|
120
|
-
**Impact:**
|
|
121
|
-
- โ
Reduces console output overhead by 70%
|
|
122
|
-
- โ
Configurable verbosity levels
|
|
123
|
-
- โ
Maintains important logging while reducing noise
|
|
124
|
-
- โ
Better performance in production environments
|
|
125
|
-
|
|
126
|
-
**Environment Variables:**
|
|
127
|
-
- `VERBOSE_LOGGING=true` - Enable detailed logging
|
|
128
|
-
- `BATCH_DELAY=50` - Configurable delay between batches (default: 100ms)
|
|
129
|
-
- `PROGRESS_UPDATE_INTERVAL=10` - Progress bar update frequency
|
|
130
|
-
|
|
131
|
-
### 8. Processed Paths Caching (Eliminates Redundant File Reads)
|
|
132
|
-
**Problem:** Reading and parsing entire log file on every `getProcessedPaths()` call.
|
|
133
|
-
|
|
134
|
-
**Solution:** Implemented file modification time-based caching with efficient regex parsing.
|
|
135
|
-
|
|
136
|
-
**Impact:**
|
|
137
|
-
- โ
Eliminates redundant log file reading
|
|
138
|
-
- โ
90% faster processed path detection
|
|
139
|
-
- โ
Memory-efficient caching with automatic invalidation
|
|
140
|
-
- โ
More efficient regex parsing with global flag
|
|
141
|
-
|
|
142
|
-
### 9. Configurable Delays and Performance Tuning
|
|
143
|
-
**Problem:** Fixed delays between batches may be too conservative or aggressive for different environments.
|
|
144
|
-
|
|
145
|
-
**Solution:** Made batch delays and update intervals configurable via environment variables.
|
|
146
|
-
|
|
147
|
-
**Impact:**
|
|
148
|
-
- โ
Adaptable performance tuning for different environments
|
|
149
|
-
- โ
Reduced default delays for faster processing
|
|
150
|
-
- โ
Configurable progress update frequency
|
|
151
|
-
- โ
Better resource utilization control
|
|
152
|
-
|
|
153
|
-
### 10. Batch Processing Optimization
|
|
154
|
-
**Problem:** Sequential file processing causing performance bottlenecks.
|
|
155
|
-
|
|
156
|
-
**Solution:** Implemented configurable batch processing for API operations.
|
|
157
|
-
|
|
158
|
-
**Features:**
|
|
159
|
-
- Configurable batch sizes (default: 50 files)
|
|
160
|
-
- Progress tracking with visual indicators
|
|
161
|
-
- Error handling with automatic retries
|
|
162
|
-
- Memory-efficient streaming processing
|
|
163
|
-
|
|
164
|
-
**Impact:**
|
|
165
|
-
- โ
Improved throughput for large file collections
|
|
166
|
-
- โ
Better error isolation and recovery
|
|
167
|
-
- โ
Reduced memory footprint
|
|
168
|
-
|
|
169
|
-
## ๐ Performance Monitoring
|
|
170
|
-
|
|
171
|
-
### Cache Statistics
|
|
172
|
-
The application now provides detailed cache performance statistics when using the `--show-stats` flag:
|
|
173
|
-
|
|
174
|
-
```bash
|
|
175
|
-
๐ Performance Statistics:
|
|
176
|
-
๐๏ธ Sanitization cache entries: 1,250
|
|
177
|
-
๐ Path detection cache entries: 3,200
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
### Progress Tracking
|
|
181
|
-
Enhanced progress indicators for all phases:
|
|
182
|
-
- Real-time file processing counters
|
|
183
|
-
- Estimated time remaining
|
|
184
|
-
- Success/failure rates
|
|
185
|
-
- Batch completion status
|
|
186
|
-
|
|
187
|
-
## ๐ง Technical Implementation Details
|
|
188
|
-
|
|
189
|
-
### Caching Strategy
|
|
190
|
-
- **Memory Usage:** Map-based caches with String keys for optimal performance
|
|
191
|
-
- **Cache Keys:** Composite keys using file paths and base paths
|
|
192
|
-
- **Lifecycle:** Automatic cleanup between processing sessions
|
|
193
|
-
- **Thread Safety:** Single-threaded design ensures cache consistency
|
|
194
|
-
|
|
195
|
-
### Error Handling
|
|
196
|
-
- Graceful degradation when cache operations fail
|
|
197
|
-
- Detailed error logging with context information
|
|
198
|
-
- Automatic fallback to non-cached operations when necessary
|
|
199
|
-
|
|
200
|
-
### Backward Compatibility
|
|
201
|
-
- All optimizations maintain existing function signatures
|
|
202
|
-
- No breaking changes to CLI interface
|
|
203
|
-
- Existing scripts and integrations continue to work unchanged
|
|
204
|
-
|
|
205
|
-
## ๐ฏ Usage Recommendations
|
|
206
|
-
|
|
207
|
-
### For Large File Collections (1000+ files)
|
|
208
|
-
```bash
|
|
209
|
-
# Use stats-only mode for initial analysis
|
|
210
|
-
arela --stats-only --show-stats /path/to/files
|
|
211
|
-
|
|
212
|
-
# Use batch processing for uploads
|
|
213
|
-
arela --batch-size 100 /path/to/files
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
### For Development and Testing
|
|
217
|
-
```bash
|
|
218
|
-
# Enable detailed statistics
|
|
219
|
-
arela --show-stats --verbose /path/to/files
|
|
220
|
-
|
|
221
|
-
# Use smaller batches for debugging
|
|
222
|
-
arela --batch-size 10 --show-stats /path/to/files
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
## ๐ Expected Performance Improvements
|
|
226
|
-
|
|
227
|
-
Based on the optimizations implemented:
|
|
228
|
-
|
|
229
|
-
1. **I/O Operations:** 80% reduction in file system calls (50% from batching + 30% from buffering)
|
|
230
|
-
2. **CPU Usage:** 60% reduction in path parsing overhead and console operations
|
|
231
|
-
3. **Memory Usage:** More efficient with multiple caching strategies
|
|
232
|
-
4. **Processing Time:** 40-70% improvement for large file collections
|
|
233
|
-
5. **Resource Utilization:** Better CPU and memory distribution across phases
|
|
234
|
-
6. **Log Performance:** 90% reduction in log I/O blocking operations
|
|
235
|
-
7. **Console Overhead:** 70% reduction in verbose logging output
|
|
236
|
-
|
|
237
|
-
## ๐๏ธ Performance Tuning Environment Variables
|
|
238
|
-
|
|
239
|
-
```bash
|
|
240
|
-
# Logging and Verbosity
|
|
241
|
-
VERBOSE_LOGGING=false # Disable verbose path logging for better performance
|
|
242
|
-
BATCH_DELAY=50 # Reduce delay between batches (default: 100ms)
|
|
243
|
-
PROGRESS_UPDATE_INTERVAL=20 # Update progress every 20 items (default: 10)
|
|
244
|
-
|
|
245
|
-
# Log Buffering
|
|
246
|
-
LOG_BUFFER_SIZE=200 # Increase buffer size for fewer I/O ops (default: 100)
|
|
247
|
-
LOG_FLUSH_INTERVAL=3000 # Flush logs every 3 seconds (default: 5000ms)
|
|
248
|
-
|
|
249
|
-
# Example for maximum performance
|
|
250
|
-
VERBOSE_LOGGING=false BATCH_DELAY=25 LOG_BUFFER_SIZE=500 arela --stats-only /path/to/files
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
## ๐ Future Optimization Opportunities
|
|
254
|
-
|
|
255
|
-
1. **Parallel Processing:** Implement worker threads for CPU-intensive operations
|
|
256
|
-
2. **Database Optimization:** Batch database operations for better throughput
|
|
257
|
-
3. **Network Optimization:** HTTP/2 and connection pooling for API requests
|
|
258
|
-
4. **Memory Optimization:** Streaming JSON processing for large responses
|
|
259
|
-
5. **Disk I/O:** Asynchronous file operations with promise-based APIs
|
|
260
|
-
|
|
261
|
-
## ๐งช Testing and Validation
|
|
262
|
-
|
|
263
|
-
All optimizations have been designed to:
|
|
264
|
-
- Maintain backward compatibility
|
|
265
|
-
- Preserve existing functionality
|
|
266
|
-
- Provide measurable performance improvements
|
|
267
|
-
- Handle edge cases gracefully
|
|
268
|
-
- Support existing error handling patterns
|
|
269
|
-
|
|
270
|
-
For comprehensive testing, use the provided sample data structure with the `--stats-only` flag to verify optimizations work correctly across different file patterns and directory structures.
|