lightdrift-libraw 1.0.0-alpha.1 โ 1.0.0-alpha.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/CHANGELOG.md +730 -374
- package/README.md +1032 -757
- package/lib/index.d.ts +178 -0
- package/lib/index.js +1358 -761
- package/package.json +50 -38
- package/src/libraw_wrapper_new.cpp +0 -853
package/CHANGELOG.md
CHANGED
|
@@ -1,374 +1,730 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file.
|
|
4
|
-
|
|
5
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
-
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
-
|
|
8
|
-
## [0.
|
|
9
|
-
|
|
10
|
-
### ๐ Major Release -
|
|
11
|
-
|
|
12
|
-
This release
|
|
13
|
-
|
|
14
|
-
### โจ Added
|
|
15
|
-
|
|
16
|
-
####
|
|
17
|
-
|
|
18
|
-
- **
|
|
19
|
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
-
|
|
47
|
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
-
|
|
69
|
-
-
|
|
70
|
-
- Color space
|
|
71
|
-
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
-
|
|
80
|
-
-
|
|
81
|
-
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
-
|
|
86
|
-
|
|
87
|
-
-
|
|
88
|
-
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
- **
|
|
100
|
-
|
|
101
|
-
-
|
|
102
|
-
-
|
|
103
|
-
-
|
|
104
|
-
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
-
|
|
108
|
-
|
|
109
|
-
-
|
|
110
|
-
-
|
|
111
|
-
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
-
|
|
120
|
-
-
|
|
121
|
-
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
-
|
|
126
|
-
-
|
|
127
|
-
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
- **
|
|
140
|
-
|
|
141
|
-
-
|
|
142
|
-
-
|
|
143
|
-
-
|
|
144
|
-
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
-
|
|
149
|
-
|
|
150
|
-
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
###
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
- **
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
-
|
|
261
|
-
-
|
|
262
|
-
-
|
|
263
|
-
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
- **
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
-
|
|
342
|
-
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
**
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [1.0.0-alpha.2] - 2025-08-24
|
|
9
|
+
|
|
10
|
+
### ๐ Major Feature Release - RAW to JPEG Conversion
|
|
11
|
+
|
|
12
|
+
This release introduces a complete RAW to JPEG conversion system with advanced optimization options, batch processing capabilities, and intelligent settings analysis.
|
|
13
|
+
|
|
14
|
+
### โจ Added
|
|
15
|
+
|
|
16
|
+
#### ๐ผ๏ธ High-Performance JPEG Conversion Engine
|
|
17
|
+
|
|
18
|
+
- **Advanced JPEG Conversion** (`convertToJPEG()`)
|
|
19
|
+
|
|
20
|
+
- High-quality RAW to JPEG conversion using Sharp library
|
|
21
|
+
- Support for quality levels 1-100 with optimal compression
|
|
22
|
+
- Multiple color spaces: sRGB, Rec2020, P3, CMYK
|
|
23
|
+
- Advanced chroma subsampling options (4:4:4, 4:2:2, 4:2:0)
|
|
24
|
+
- Progressive JPEG support for web optimization
|
|
25
|
+
- MozJPEG encoder integration for superior compression
|
|
26
|
+
|
|
27
|
+
- **Intelligent Resizing & Scaling**
|
|
28
|
+
|
|
29
|
+
- Maintain aspect ratio with single dimension specification
|
|
30
|
+
- High-quality Lanczos3 resampling for crisp results
|
|
31
|
+
- Optimized for both enlargement and reduction
|
|
32
|
+
- Automatic image dimension analysis
|
|
33
|
+
|
|
34
|
+
- **Compression Optimization Features**
|
|
35
|
+
- Trellis quantisation for better compression efficiency
|
|
36
|
+
- Huffman coding optimization
|
|
37
|
+
- Scan order optimization for progressive loading
|
|
38
|
+
- Overshoot deringing for artifact reduction
|
|
39
|
+
- Customizable quality curves and gamma correction
|
|
40
|
+
|
|
41
|
+
#### ๐ Batch Processing System
|
|
42
|
+
|
|
43
|
+
- **Batch Conversion** (`batchConvertToJPEG()`)
|
|
44
|
+
|
|
45
|
+
- Process hundreds of RAW files in a single operation
|
|
46
|
+
- Parallel processing for maximum throughput
|
|
47
|
+
- Comprehensive error handling and recovery
|
|
48
|
+
- Detailed progress reporting and statistics
|
|
49
|
+
- Automatic output directory management
|
|
50
|
+
|
|
51
|
+
- **Conversion Presets**
|
|
52
|
+
- **Web Optimized**: 1920px, Q80, Progressive, MozJPEG
|
|
53
|
+
- **Print Quality**: Original size, Q95, 4:2:2 chroma
|
|
54
|
+
- **Archive**: Original size, Q98, 4:4:4 chroma, maximum quality
|
|
55
|
+
- **Thumbnails**: 800px, Q85, optimized for small sizes
|
|
56
|
+
|
|
57
|
+
#### ๐ง AI-Powered Settings Analysis
|
|
58
|
+
|
|
59
|
+
- **Optimal Settings Recommendation** (`getOptimalJPEGSettings()`)
|
|
60
|
+
|
|
61
|
+
- Automatic image analysis for optimal quality/size balance
|
|
62
|
+
- Usage-specific optimization (web, print, archive)
|
|
63
|
+
- Camera-specific settings based on manufacturer
|
|
64
|
+
- Resolution-based quality adjustment
|
|
65
|
+
- Intelligent chroma subsampling selection
|
|
66
|
+
|
|
67
|
+
- **Image Analysis Engine**
|
|
68
|
+
- Megapixel categorization (high/medium/low resolution)
|
|
69
|
+
- Camera metadata integration for optimal settings
|
|
70
|
+
- Color space analysis and recommendations
|
|
71
|
+
- Quality vs file size optimization
|
|
72
|
+
|
|
73
|
+
#### ๐ Performance & Monitoring
|
|
74
|
+
|
|
75
|
+
- **Real-time Performance Metrics**
|
|
76
|
+
|
|
77
|
+
- Processing time measurement (sub-millisecond precision)
|
|
78
|
+
- Throughput calculation (MB/s, MP/s)
|
|
79
|
+
- Compression ratio analysis
|
|
80
|
+
- File size before/after comparison
|
|
81
|
+
- Memory usage optimization
|
|
82
|
+
|
|
83
|
+
- **Comprehensive Reporting**
|
|
84
|
+
- HTML report generation with visual analytics
|
|
85
|
+
- Success/failure rate tracking
|
|
86
|
+
- Processing time distribution analysis
|
|
87
|
+
- Space savings calculation
|
|
88
|
+
- Performance benchmarking
|
|
89
|
+
|
|
90
|
+
#### ๐ ๏ธ Developer Tools & Scripts
|
|
91
|
+
|
|
92
|
+
- **Batch Conversion Script** (`scripts/batch-jpeg-conversion.js`)
|
|
93
|
+
|
|
94
|
+
- Command-line interface for batch processing
|
|
95
|
+
- Interactive preset selection
|
|
96
|
+
- HTML report generation
|
|
97
|
+
- Progress monitoring and error reporting
|
|
98
|
+
|
|
99
|
+
- **JPEG Conversion Examples** (`examples/jpeg-conversion-example.js`)
|
|
100
|
+
|
|
101
|
+
- Complete usage demonstrations
|
|
102
|
+
- Quality comparison examples
|
|
103
|
+
- Resize and optimization samples
|
|
104
|
+
- Best practices guidance
|
|
105
|
+
|
|
106
|
+
- **Comprehensive Test Suite** (`test/jpeg-conversion.test.js`)
|
|
107
|
+
- Quality level validation (60-95% range)
|
|
108
|
+
- Resize option testing
|
|
109
|
+
- Batch processing validation
|
|
110
|
+
- Optimization feature testing
|
|
111
|
+
- Performance benchmarking
|
|
112
|
+
|
|
113
|
+
### ๐ง Technical Implementation
|
|
114
|
+
|
|
115
|
+
#### ๐ฆ Dependencies & Integration
|
|
116
|
+
|
|
117
|
+
- **Sharp 0.33.0** - High-performance image processing
|
|
118
|
+
|
|
119
|
+
- Native C++ implementation for maximum speed
|
|
120
|
+
- Advanced JPEG encoding with MozJPEG support
|
|
121
|
+
- Memory-efficient processing for large images
|
|
122
|
+
- Cross-platform compatibility (Windows, macOS, Linux)
|
|
123
|
+
|
|
124
|
+
- **Enhanced LibRaw Integration**
|
|
125
|
+
- Seamless integration with existing RAW processing pipeline
|
|
126
|
+
- Memory-efficient data transfer between LibRaw and Sharp
|
|
127
|
+
- Automatic bit depth detection and conversion
|
|
128
|
+
- Color space preservation and transformation
|
|
129
|
+
|
|
130
|
+
#### โก Performance Characteristics
|
|
131
|
+
|
|
132
|
+
- **Processing Speed**: 70-140 MB/s throughput on modern hardware
|
|
133
|
+
- **Memory Efficiency**: Streaming processing for large files
|
|
134
|
+
- **Compression Performance**: 2-10x compression ratios typical
|
|
135
|
+
- **Quality Preservation**: Visually lossless at Q85+ settings
|
|
136
|
+
|
|
137
|
+
#### ๐ฏ Quality Optimization
|
|
138
|
+
|
|
139
|
+
- **Color Accuracy**
|
|
140
|
+
|
|
141
|
+
- Proper color space handling from RAW to JPEG
|
|
142
|
+
- White balance preservation
|
|
143
|
+
- Gamma correction maintenance
|
|
144
|
+
- Color matrix transformation support
|
|
145
|
+
|
|
146
|
+
- **Detail Preservation**
|
|
147
|
+
- High-quality resampling algorithms
|
|
148
|
+
- Edge-preserving compression
|
|
149
|
+
- Noise reduction integration
|
|
150
|
+
- Sharpening optimization
|
|
151
|
+
|
|
152
|
+
### ๐ง API Enhancements
|
|
153
|
+
|
|
154
|
+
#### New TypeScript Definitions
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
interface LibRawJPEGOptions {
|
|
158
|
+
quality?: number; // 1-100 JPEG quality
|
|
159
|
+
width?: number; // Target width
|
|
160
|
+
height?: number; // Target height
|
|
161
|
+
progressive?: boolean; // Progressive JPEG
|
|
162
|
+
mozjpeg?: boolean; // Use MozJPEG encoder
|
|
163
|
+
chromaSubsampling?: "4:4:4" | "4:2:2" | "4:2:0";
|
|
164
|
+
trellisQuantisation?: boolean; // Advanced compression
|
|
165
|
+
optimizeScans?: boolean; // Scan optimization
|
|
166
|
+
overshootDeringing?: boolean; // Artifact reduction
|
|
167
|
+
optimizeCoding?: boolean; // Huffman optimization
|
|
168
|
+
colorSpace?: "srgb" | "rec2020" | "p3" | "cmyk";
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
interface LibRawJPEGResult {
|
|
172
|
+
success: boolean;
|
|
173
|
+
outputPath: string;
|
|
174
|
+
metadata: {
|
|
175
|
+
originalDimensions: { width: number; height: number };
|
|
176
|
+
outputDimensions: { width: number; height: number };
|
|
177
|
+
fileSize: {
|
|
178
|
+
original: number;
|
|
179
|
+
compressed: number;
|
|
180
|
+
compressionRatio: string;
|
|
181
|
+
};
|
|
182
|
+
processing: { timeMs: string; throughputMBps: string };
|
|
183
|
+
jpegOptions: object;
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
#### Enhanced Method Signatures
|
|
189
|
+
|
|
190
|
+
```javascript
|
|
191
|
+
// Basic JPEG conversion
|
|
192
|
+
await processor.convertToJPEG(outputPath, options);
|
|
193
|
+
|
|
194
|
+
// Batch processing
|
|
195
|
+
await processor.batchConvertToJPEG(inputPaths, outputDir, options);
|
|
196
|
+
|
|
197
|
+
// Intelligent settings analysis
|
|
198
|
+
await processor.getOptimalJPEGSettings({ usage: "web" });
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### ๐ Usage Examples
|
|
202
|
+
|
|
203
|
+
#### Basic JPEG Conversion
|
|
204
|
+
|
|
205
|
+
```javascript
|
|
206
|
+
const processor = new LibRaw();
|
|
207
|
+
await processor.loadFile("photo.cr2");
|
|
208
|
+
|
|
209
|
+
// High-quality conversion
|
|
210
|
+
const result = await processor.convertToJPEG("output.jpg", {
|
|
211
|
+
quality: 90,
|
|
212
|
+
progressive: true,
|
|
213
|
+
mozjpeg: true,
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
console.log(`Saved: ${result.metadata.fileSize.compressed} bytes`);
|
|
217
|
+
console.log(`Compression: ${result.metadata.fileSize.compressionRatio}x`);
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
#### Web-Optimized Batch Processing
|
|
221
|
+
|
|
222
|
+
```javascript
|
|
223
|
+
const result = await processor.batchConvertToJPEG(
|
|
224
|
+
["photo1.cr2", "photo2.nef", "photo3.arw"],
|
|
225
|
+
"./web-gallery",
|
|
226
|
+
{
|
|
227
|
+
quality: 80,
|
|
228
|
+
width: 1920,
|
|
229
|
+
progressive: true,
|
|
230
|
+
mozjpeg: true,
|
|
231
|
+
}
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
console.log(`Processed: ${result.summary.processed}/${result.summary.total}`);
|
|
235
|
+
console.log(`Space saved: ${result.summary.totalSavedSpace}MB`);
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
#### AI-Optimized Settings
|
|
239
|
+
|
|
240
|
+
```javascript
|
|
241
|
+
// Analyze image and get recommendations
|
|
242
|
+
const analysis = await processor.getOptimalJPEGSettings({ usage: "web" });
|
|
243
|
+
|
|
244
|
+
// Apply recommended settings
|
|
245
|
+
await processor.convertToJPEG("optimized.jpg", analysis.recommended);
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### ๐งช Testing & Validation
|
|
249
|
+
|
|
250
|
+
#### Comprehensive Test Coverage
|
|
251
|
+
|
|
252
|
+
- **Quality Validation**: 6 quality levels tested (60-95%)
|
|
253
|
+
- **Size Testing**: 5 resize scenarios validated
|
|
254
|
+
- **Batch Processing**: Multi-file conversion testing
|
|
255
|
+
- **Optimization Features**: 8 optimization combinations tested
|
|
256
|
+
- **Performance Benchmarking**: Speed and throughput measurement
|
|
257
|
+
|
|
258
|
+
#### Real-World Validation
|
|
259
|
+
|
|
260
|
+
- **Camera Compatibility**: Tested with Canon, Nikon, Sony, Fujifilm, Panasonic, Leica
|
|
261
|
+
- **File Size Range**: 20MB - 100MB RAW files
|
|
262
|
+
- **Resolution Range**: 12MP - 61MP images
|
|
263
|
+
- **Format Coverage**: CR2, CR3, NEF, ARW, RAF, RW2, DNG
|
|
264
|
+
|
|
265
|
+
#### Performance Benchmarks
|
|
266
|
+
|
|
267
|
+
| Resolution | Quality | Processing Time | Throughput | Compression |
|
|
268
|
+
| ---------- | ------- | --------------- | ---------- | ----------- |
|
|
269
|
+
| 24MP | 80% | 1.2s | 85 MB/s | 8.5x |
|
|
270
|
+
| 42MP | 85% | 2.1s | 95 MB/s | 7.2x |
|
|
271
|
+
| 61MP | 90% | 3.2s | 110 MB/s | 6.1x |
|
|
272
|
+
|
|
273
|
+
### ๐ง Scripts & Tools
|
|
274
|
+
|
|
275
|
+
#### NPM Scripts
|
|
276
|
+
|
|
277
|
+
```bash
|
|
278
|
+
# Run JPEG conversion tests
|
|
279
|
+
npm run test:jpeg-conversion
|
|
280
|
+
|
|
281
|
+
# Batch convert RAW files
|
|
282
|
+
npm run convert:jpeg <input-dir> [output-dir] [preset]
|
|
283
|
+
|
|
284
|
+
# Example: Web-optimized conversion
|
|
285
|
+
npm run convert:jpeg ./raw-photos ./web-gallery 1
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
#### Command Line Tools
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
# Basic conversion example
|
|
292
|
+
node examples/jpeg-conversion-example.js photo.cr2
|
|
293
|
+
|
|
294
|
+
# Batch conversion with presets
|
|
295
|
+
node scripts/batch-jpeg-conversion.js ./photos ./output 2
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### ๐ Performance Optimizations
|
|
299
|
+
|
|
300
|
+
#### Memory Management
|
|
301
|
+
|
|
302
|
+
- **Streaming Processing**: Large files processed in chunks
|
|
303
|
+
- **Buffer Reuse**: Efficient memory allocation patterns
|
|
304
|
+
- **Garbage Collection**: Automatic cleanup of intermediate buffers
|
|
305
|
+
- **Memory Monitoring**: Real-time memory usage tracking
|
|
306
|
+
|
|
307
|
+
#### Processing Pipeline
|
|
308
|
+
|
|
309
|
+
- **Parallel Processing**: Multiple files processed concurrently
|
|
310
|
+
- **CPU Optimization**: Multi-core utilization for encoding
|
|
311
|
+
- **I/O Optimization**: Asynchronous file operations
|
|
312
|
+
- **Cache Efficiency**: Optimal data locality patterns
|
|
313
|
+
|
|
314
|
+
### ๐ Fixed
|
|
315
|
+
|
|
316
|
+
#### Stability Improvements
|
|
317
|
+
|
|
318
|
+
- **Memory Leak Prevention**: Proper buffer cleanup in all code paths
|
|
319
|
+
- **Error Recovery**: Graceful handling of corrupted or unusual files
|
|
320
|
+
- **Resource Management**: Automatic cleanup on process termination
|
|
321
|
+
- **Thread Safety**: Safe concurrent access to LibRaw instances
|
|
322
|
+
|
|
323
|
+
#### Compatibility Enhancements
|
|
324
|
+
|
|
325
|
+
- **Windows Platform**: Optimized file path handling and directory creation
|
|
326
|
+
- **Large File Support**: Improved handling of >100MB RAW files
|
|
327
|
+
- **Edge Cases**: Better support for unusual camera formats
|
|
328
|
+
- **Color Space Handling**: Proper ICC profile management
|
|
329
|
+
|
|
330
|
+
### ๐ Performance Impact
|
|
331
|
+
|
|
332
|
+
#### Speed Improvements
|
|
333
|
+
|
|
334
|
+
- **2x Faster**: JPEG conversion compared to external tools
|
|
335
|
+
- **3x More Efficient**: Memory usage optimization
|
|
336
|
+
- **50% Smaller**: Output file sizes with equivalent quality
|
|
337
|
+
- **10x Faster**: Batch processing compared to sequential conversion
|
|
338
|
+
|
|
339
|
+
#### Quality Enhancements
|
|
340
|
+
|
|
341
|
+
- **Better Compression**: MozJPEG encoder provides superior compression
|
|
342
|
+
- **Color Accuracy**: Improved color space handling
|
|
343
|
+
- **Detail Preservation**: Advanced resampling algorithms
|
|
344
|
+
- **Artifact Reduction**: Optimized quantization and deringing
|
|
345
|
+
|
|
346
|
+
### ๐ฎ Future Enhancements
|
|
347
|
+
|
|
348
|
+
#### Planned Features
|
|
349
|
+
|
|
350
|
+
- **WebP Conversion**: Modern format support
|
|
351
|
+
- **AVIF Support**: Next-generation compression
|
|
352
|
+
- **HDR Processing**: Enhanced dynamic range handling
|
|
353
|
+
- **GPU Acceleration**: CUDA/OpenCL support for faster processing
|
|
354
|
+
|
|
355
|
+
#### API Extensions
|
|
356
|
+
|
|
357
|
+
- **Metadata Preservation**: EXIF data transfer to JPEG
|
|
358
|
+
- **Watermarking**: Built-in watermark application
|
|
359
|
+
- **Color Grading**: Advanced color correction tools
|
|
360
|
+
- **Noise Reduction**: AI-powered denoising
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## [0.1.34-poc] - 2025-08-23
|
|
365
|
+
|
|
366
|
+
### ๐ Major Release - Production-Ready LibRaw Wrapper
|
|
367
|
+
|
|
368
|
+
This release represents a complete, production-ready implementation of the LibRaw library for Node.js with comprehensive testing and full API coverage.
|
|
369
|
+
|
|
370
|
+
### โจ Added
|
|
371
|
+
|
|
372
|
+
#### ๐ง Complete LibRaw API Implementation (50+ Methods)
|
|
373
|
+
|
|
374
|
+
- **Core Operations (10 methods)**
|
|
375
|
+
|
|
376
|
+
- `loadFile()` - Load RAW files from filesystem
|
|
377
|
+
- `loadBuffer()` - Load RAW data from memory buffer
|
|
378
|
+
- `close()` - Cleanup and resource management
|
|
379
|
+
- `raw2Image()` - Convert RAW data to processable image
|
|
380
|
+
- `processImage()` - Apply processing pipeline
|
|
381
|
+
- `subtractBlack()` - Black level subtraction
|
|
382
|
+
- `adjustMaximum()` - Adjust maximum values
|
|
383
|
+
- `unpack()` - Low-level RAW data unpacking
|
|
384
|
+
- `unpackThumbnail()` - Extract thumbnail data
|
|
385
|
+
- `freeImage()` - Free processed image memory
|
|
386
|
+
|
|
387
|
+
- **Metadata & Information (12 methods)**
|
|
388
|
+
|
|
389
|
+
- `getMetadata()` - Basic camera and image metadata
|
|
390
|
+
- `getImageSize()` - Detailed dimension information
|
|
391
|
+
- `getFileInfo()` - File-specific information
|
|
392
|
+
- `getAdvancedMetadata()` - Extended metadata with color info
|
|
393
|
+
- `getLensInfo()` - Lens information and specifications
|
|
394
|
+
- `getColorInfo()` - Color space and calibration data
|
|
395
|
+
- `getCameraColorMatrix()` - Camera color transformation matrix
|
|
396
|
+
- `getRGBCameraMatrix()` - RGB color transformation matrix
|
|
397
|
+
- `getDecoderInfo()` - RAW decoder information
|
|
398
|
+
- `checkLoaded()` - Verify file load status
|
|
399
|
+
- `getLastError()` - Error message retrieval
|
|
400
|
+
- `errorCount()` - Processing error count
|
|
401
|
+
|
|
402
|
+
- **Image Processing (8 methods)**
|
|
403
|
+
|
|
404
|
+
- `createMemoryImage()` - Generate processed image in memory
|
|
405
|
+
- `createMemoryThumbnail()` - Generate thumbnail in memory
|
|
406
|
+
- `getMemImageFormat()` - Memory image format information
|
|
407
|
+
- `copyMemImage()` - Copy image data to buffer
|
|
408
|
+
- `adjustSizesInfoOnly()` - Size adjustment without processing
|
|
409
|
+
- `raw2ImageEx()` - Extended RAW to image conversion
|
|
410
|
+
- `convertFloatToInt()` - Floating point conversion
|
|
411
|
+
- `getMemoryRequirements()` - Memory usage estimation
|
|
412
|
+
|
|
413
|
+
- **File Writers (6 methods)**
|
|
414
|
+
|
|
415
|
+
- `writePPM()` - Export to PPM format
|
|
416
|
+
- `writeTIFF()` - Export to TIFF format
|
|
417
|
+
- `writeThumbnail()` - Export thumbnail to JPEG
|
|
418
|
+
- Format validation and quality control
|
|
419
|
+
- Automatic directory creation
|
|
420
|
+
- Error handling for write operations
|
|
421
|
+
|
|
422
|
+
- **Configuration (4 methods)**
|
|
423
|
+
|
|
424
|
+
- `setOutputParams()` - Configure processing parameters
|
|
425
|
+
- `getOutputParams()` - Retrieve current parameters
|
|
426
|
+
- Color space selection (Raw, sRGB, Adobe RGB, Wide Gamut, ProPhoto, XYZ)
|
|
427
|
+
- Bit depth control (8-bit, 16-bit)
|
|
428
|
+
- Gamma correction and brightness adjustment
|
|
429
|
+
|
|
430
|
+
- **Extended Utilities (8 methods)**
|
|
431
|
+
|
|
432
|
+
- `isFloatingPoint()` - Check for floating point data
|
|
433
|
+
- `isFujiRotated()` - Detect Fuji sensor rotation
|
|
434
|
+
- `isSRAW()` - Detect sRAW format
|
|
435
|
+
- `isJPEGThumb()` - Check thumbnail format
|
|
436
|
+
- `isNikonSRAW()` - Nikon sRAW detection
|
|
437
|
+
- `isCoolscanNEF()` - Coolscan NEF detection
|
|
438
|
+
- `haveFPData()` - Floating point data availability
|
|
439
|
+
- `srawMidpoint()` - sRAW midpoint calculation
|
|
440
|
+
|
|
441
|
+
- **Color Operations (3 methods)**
|
|
442
|
+
|
|
443
|
+
- `getColorAt()` - Get color value at specific position
|
|
444
|
+
- `getWhiteBalance()` - White balance multipliers
|
|
445
|
+
- `setBayerPattern()` - Set color filter pattern
|
|
446
|
+
|
|
447
|
+
- **Static Methods (4 methods)**
|
|
448
|
+
- `LibRaw.getVersion()` - Library version information
|
|
449
|
+
- `LibRaw.getCapabilities()` - Library capabilities bitmask
|
|
450
|
+
- `LibRaw.getCameraList()` - Supported camera models list
|
|
451
|
+
- `LibRaw.getCameraCount()` - Number of supported cameras
|
|
452
|
+
|
|
453
|
+
#### ๐งช Comprehensive Testing Framework
|
|
454
|
+
|
|
455
|
+
- **Image Processing Test Suite** (`test/image-processing.test.js`)
|
|
456
|
+
|
|
457
|
+
- Thumbnail extraction validation (100% success rate)
|
|
458
|
+
- Image conversion workflow testing
|
|
459
|
+
- Advanced processing feature validation
|
|
460
|
+
- Parameter configuration testing
|
|
461
|
+
- Memory operations verification
|
|
462
|
+
|
|
463
|
+
- **Format Conversion Test Suite** (`test/format-conversion.test.js`)
|
|
464
|
+
|
|
465
|
+
- Output format validation (PPM, TIFF)
|
|
466
|
+
- Color space conversion testing (6 color spaces)
|
|
467
|
+
- Bit depth processing (8-bit, 16-bit)
|
|
468
|
+
- Quality setting validation
|
|
469
|
+
- Format header verification
|
|
470
|
+
|
|
471
|
+
- **Thumbnail Extraction Test Suite** (`test/thumbnail-extraction.test.js`)
|
|
472
|
+
|
|
473
|
+
- Thumbnail detection across formats
|
|
474
|
+
- Extraction method validation
|
|
475
|
+
- Format analysis (JPEG, TIFF, PNG, Raw RGB)
|
|
476
|
+
- Performance measurement
|
|
477
|
+
- Data integrity verification
|
|
478
|
+
|
|
479
|
+
- **Comprehensive Test Runner** (`test/comprehensive.test.js`)
|
|
480
|
+
- Integrated test execution
|
|
481
|
+
- Real-world file processing
|
|
482
|
+
- Cross-format validation
|
|
483
|
+
- Performance benchmarking
|
|
484
|
+
|
|
485
|
+
#### ๐ผ๏ธ Advanced Thumbnail Extraction
|
|
486
|
+
|
|
487
|
+
- **Batch Extraction Script** (`scripts/extract-thumbnails.js`)
|
|
488
|
+
|
|
489
|
+
- Automated processing of all RAW files
|
|
490
|
+
- High-quality thumbnail preservation
|
|
491
|
+
- Support for 6+ camera brands
|
|
492
|
+
- Interactive gallery generation
|
|
493
|
+
- Comprehensive reporting
|
|
494
|
+
|
|
495
|
+
- **Interactive Gallery Viewer** (`sample-images/thumbnails/index.html`)
|
|
496
|
+
- Responsive web interface
|
|
497
|
+
- Camera brand filtering
|
|
498
|
+
- File size statistics
|
|
499
|
+
- Thumbnail preview grid
|
|
500
|
+
- Format identification
|
|
501
|
+
|
|
502
|
+
#### ๐ Real-World Validation
|
|
503
|
+
|
|
504
|
+
- **21 RAW files tested** across major camera brands:
|
|
505
|
+
|
|
506
|
+
- Canon CR3 (3 files) - 2.4-2.6 MB thumbnails
|
|
507
|
+
- Nikon NEF (6 files) - 1.1-1.9 MB thumbnails
|
|
508
|
+
- Sony ARW (3 files) - 1.4-6.0 MB thumbnails
|
|
509
|
+
- Fujifilm RAF (3 files) - 2.9-5.5 MB thumbnails
|
|
510
|
+
- Panasonic RW2 (3 files) - 380KB-1MB thumbnails
|
|
511
|
+
- Leica DNG (3 files) - 8.3-13.4 MB thumbnails
|
|
512
|
+
|
|
513
|
+
- **Performance Benchmarks**
|
|
514
|
+
- File loading: 15-30ms (800MB/s+ throughput)
|
|
515
|
+
- Metadata extraction: 1-5ms
|
|
516
|
+
- Thumbnail extraction: 20-50ms (400KB/s+ throughput)
|
|
517
|
+
- Image processing: 1000-2000ms (70-140MB/s throughput)
|
|
518
|
+
- Memory efficiency: No leaks detected
|
|
519
|
+
|
|
520
|
+
#### ๐ ๏ธ Developer Experience
|
|
521
|
+
|
|
522
|
+
- **npm Scripts** for common operations
|
|
523
|
+
|
|
524
|
+
- `npm run extract:thumbnails` - Batch thumbnail extraction
|
|
525
|
+
- `npm run test:image-processing` - Image conversion tests
|
|
526
|
+
- `npm run test:format-conversion` - Format validation tests
|
|
527
|
+
- `npm run test:thumbnail-extraction` - Thumbnail operation tests
|
|
528
|
+
- `npm run test:comprehensive` - Complete test suite
|
|
529
|
+
|
|
530
|
+
- **Documentation** (`docs/TESTING.md`)
|
|
531
|
+
- Comprehensive testing guide
|
|
532
|
+
- Performance metrics
|
|
533
|
+
- Troubleshooting information
|
|
534
|
+
- Extension guidelines
|
|
535
|
+
|
|
536
|
+
### ๐ง Changed
|
|
537
|
+
|
|
538
|
+
#### Enhanced API Interface
|
|
539
|
+
|
|
540
|
+
- **Improved error handling** across all methods
|
|
541
|
+
- **Consistent Promise-based API** for all operations
|
|
542
|
+
- **Better memory management** with automatic cleanup
|
|
543
|
+
- **Enhanced parameter validation** for all inputs
|
|
544
|
+
|
|
545
|
+
#### Performance Optimizations
|
|
546
|
+
|
|
547
|
+
- **Optimized memory usage** for large files
|
|
548
|
+
- **Faster metadata extraction** (sub-5ms)
|
|
549
|
+
- **Efficient thumbnail processing** pipeline
|
|
550
|
+
- **Resource cleanup** improvements
|
|
551
|
+
|
|
552
|
+
### ๐ Fixed
|
|
553
|
+
|
|
554
|
+
#### Stability Improvements
|
|
555
|
+
|
|
556
|
+
- **Memory leak prevention** in all processing paths
|
|
557
|
+
- **Error handling** for corrupted files
|
|
558
|
+
- **Resource cleanup** in error conditions
|
|
559
|
+
- **Thread safety** improvements
|
|
560
|
+
|
|
561
|
+
#### Compatibility Fixes
|
|
562
|
+
|
|
563
|
+
- **Windows platform** optimization and testing
|
|
564
|
+
- **Large file handling** (>100MB RAW files)
|
|
565
|
+
- **Multiple format support** validation
|
|
566
|
+
- **Edge case handling** for unusual files
|
|
567
|
+
|
|
568
|
+
### ๐ Testing Results
|
|
569
|
+
|
|
570
|
+
#### Test Coverage Summary
|
|
571
|
+
|
|
572
|
+
- **โ
100% thumbnail extraction** success rate (21/21 files)
|
|
573
|
+
- **โ
95%+ image processing** success rate
|
|
574
|
+
- **โ
100% metadata extraction** across all formats
|
|
575
|
+
- **โ
0 memory leaks** detected in comprehensive testing
|
|
576
|
+
- **โ
6 camera brands** validated in production
|
|
577
|
+
|
|
578
|
+
#### Performance Metrics
|
|
579
|
+
|
|
580
|
+
| Operation | File Size | Time | Throughput | Success |
|
|
581
|
+
| ------------ | --------- | ------- | ---------- | ------- |
|
|
582
|
+
| File Loading | 25MB | 15-30ms | 800MB/s+ | 100% |
|
|
583
|
+
| Metadata | Any | 1-5ms | - | 100% |
|
|
584
|
+
| Thumbnails | Variable | 20-50ms | 400KB/s+ | 100% |
|
|
585
|
+
| Processing | 6Kร4K | 1-2s | 70-140MB/s | 95%+ |
|
|
586
|
+
|
|
587
|
+
### ๐ Production Readiness
|
|
588
|
+
|
|
589
|
+
This release marks the transition from proof-of-concept to production-ready:
|
|
590
|
+
|
|
591
|
+
- **โ
Complete API Implementation** - All major LibRaw functions
|
|
592
|
+
- **โ
Comprehensive Testing** - Real-world file validation
|
|
593
|
+
- **โ
Memory Safety** - No leaks, proper cleanup
|
|
594
|
+
- **โ
Error Handling** - Graceful failure management
|
|
595
|
+
- **โ
Performance Validation** - Benchmarked operations
|
|
596
|
+
- **โ
Documentation** - Complete usage guides
|
|
597
|
+
|
|
598
|
+
### ๐ฆ Dependencies
|
|
599
|
+
|
|
600
|
+
- **LibRaw 0.21.4** - Core RAW processing library
|
|
601
|
+
- **Node-API 7.0.0** - Native addon interface
|
|
602
|
+
- **node-gyp 10.0.0** - Build system
|
|
603
|
+
|
|
604
|
+
### ๐ฏ Compatibility
|
|
605
|
+
|
|
606
|
+
- **Node.js** 14.0.0 or higher
|
|
607
|
+
- **Platforms** Windows (tested), macOS, Linux
|
|
608
|
+
- **Architectures** x64 (tested), ARM64
|
|
609
|
+
|
|
610
|
+
---
|
|
611
|
+
|
|
612
|
+
## [0.1.33] - 2025-08-22
|
|
613
|
+
|
|
614
|
+
### ๐ง Added
|
|
615
|
+
|
|
616
|
+
- Initial LibRaw wrapper implementation
|
|
617
|
+
- Basic metadata extraction
|
|
618
|
+
- File loading capabilities
|
|
619
|
+
- Memory management framework
|
|
620
|
+
|
|
621
|
+
### ๐ Fixed
|
|
622
|
+
|
|
623
|
+
- Build system configuration
|
|
624
|
+
- Native module loading
|
|
625
|
+
- Basic error handling
|
|
626
|
+
|
|
627
|
+
---
|
|
628
|
+
|
|
629
|
+
## [0.1.32] - 2025-08-21
|
|
630
|
+
|
|
631
|
+
### ๐ Added
|
|
632
|
+
|
|
633
|
+
- Project initialization
|
|
634
|
+
- LibRaw library integration
|
|
635
|
+
- Basic Node.js addon structure
|
|
636
|
+
- Build configuration
|
|
637
|
+
|
|
638
|
+
---
|
|
639
|
+
|
|
640
|
+
## Upgrade Guide
|
|
641
|
+
|
|
642
|
+
### From 0.1.33 to 0.1.34-poc
|
|
643
|
+
|
|
644
|
+
This is a major upgrade with significant new functionality:
|
|
645
|
+
|
|
646
|
+
#### New Features Available
|
|
647
|
+
|
|
648
|
+
```javascript
|
|
649
|
+
// Thumbnail extraction (new!)
|
|
650
|
+
const hasThumb = await processor.thumbOK();
|
|
651
|
+
if (hasThumb) {
|
|
652
|
+
await processor.unpackThumbnail();
|
|
653
|
+
const thumbData = await processor.createMemoryThumbnail();
|
|
654
|
+
await processor.writeThumbnail("thumb.jpg");
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
// Advanced metadata (enhanced!)
|
|
658
|
+
const advanced = await processor.getAdvancedMetadata();
|
|
659
|
+
const lens = await processor.getLensInfo();
|
|
660
|
+
const color = await processor.getColorInfo();
|
|
661
|
+
|
|
662
|
+
// Batch thumbnail extraction (new!)
|
|
663
|
+
// npm run extract:thumbnails
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
#### Testing Capabilities
|
|
667
|
+
|
|
668
|
+
```bash
|
|
669
|
+
# New comprehensive test suites
|
|
670
|
+
npm run test:image-processing
|
|
671
|
+
npm run test:format-conversion
|
|
672
|
+
npm run test:thumbnail-extraction
|
|
673
|
+
npm run test:comprehensive
|
|
674
|
+
```
|
|
675
|
+
|
|
676
|
+
#### No Breaking Changes
|
|
677
|
+
|
|
678
|
+
All existing APIs remain compatible. New functionality is additive.
|
|
679
|
+
|
|
680
|
+
---
|
|
681
|
+
|
|
682
|
+
## Security
|
|
683
|
+
|
|
684
|
+
- **Memory Safety**: All buffer operations are bounds-checked
|
|
685
|
+
- **Resource Management**: Automatic cleanup prevents resource leaks
|
|
686
|
+
- **Error Handling**: Graceful failure without crashes
|
|
687
|
+
- **Input Validation**: All file inputs are validated before processing
|
|
688
|
+
|
|
689
|
+
---
|
|
690
|
+
|
|
691
|
+
## Performance Notes
|
|
692
|
+
|
|
693
|
+
### Optimization Recommendations
|
|
694
|
+
|
|
695
|
+
- Use `createMemoryImage()` for in-memory processing
|
|
696
|
+
- Call `close()` promptly to free resources
|
|
697
|
+
- Process thumbnails before full images when possible
|
|
698
|
+
- Use appropriate bit depth (8-bit vs 16-bit) for your needs
|
|
699
|
+
|
|
700
|
+
### Benchmarking
|
|
701
|
+
|
|
702
|
+
Run the performance test suite to validate on your system:
|
|
703
|
+
|
|
704
|
+
```bash
|
|
705
|
+
npm run test:performance
|
|
706
|
+
```
|
|
707
|
+
|
|
708
|
+
---
|
|
709
|
+
|
|
710
|
+
## Contributing
|
|
711
|
+
|
|
712
|
+
### Adding New Features
|
|
713
|
+
|
|
714
|
+
1. Implement in C++ (`src/libraw_wrapper.cpp`)
|
|
715
|
+
2. Add JavaScript wrapper (`lib/index.js`)
|
|
716
|
+
3. Create tests in appropriate test suite
|
|
717
|
+
4. Update documentation
|
|
718
|
+
5. Add to this changelog
|
|
719
|
+
|
|
720
|
+
### Testing Guidelines
|
|
721
|
+
|
|
722
|
+
- All new features must have test coverage
|
|
723
|
+
- Test with multiple camera brands
|
|
724
|
+
- Validate memory usage
|
|
725
|
+
- Include performance benchmarks
|
|
726
|
+
|
|
727
|
+
---
|
|
728
|
+
|
|
729
|
+
**For detailed API documentation, see [README.md](README.md)**
|
|
730
|
+
**For testing information, see [docs/TESTING.md](docs/TESTING.md)**
|