@souscheflabs/ml-vision 0.1.0 → 0.1.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.
Files changed (149) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/LICENSE +15 -0
  3. package/README.md +50 -5
  4. package/dist/{components → cjs/components}/DetectionOverlay.js +1 -0
  5. package/dist/cjs/components/DetectionOverlay.js.map +1 -0
  6. package/dist/{components → cjs/components}/index.js +1 -0
  7. package/dist/cjs/components/index.js.map +1 -0
  8. package/dist/{core → cjs/core}/CacheManager.js +1 -0
  9. package/dist/cjs/core/CacheManager.js.map +1 -0
  10. package/dist/{core → cjs/core}/MLVisionProvider.js +4 -2
  11. package/dist/cjs/core/MLVisionProvider.js.map +1 -0
  12. package/dist/{core → cjs/core}/ServerClient.js +33 -13
  13. package/dist/cjs/core/ServerClient.js.map +1 -0
  14. package/dist/{core → cjs/core}/index.js +1 -0
  15. package/dist/cjs/core/index.js.map +1 -0
  16. package/dist/{hooks → cjs/hooks}/classLabels.js +1 -0
  17. package/dist/cjs/hooks/classLabels.js.map +1 -0
  18. package/dist/{hooks → cjs/hooks}/classLabelsCoco.js +1 -0
  19. package/dist/cjs/hooks/classLabelsCoco.js.map +1 -0
  20. package/dist/{hooks → cjs/hooks}/index.js +1 -0
  21. package/dist/cjs/hooks/index.js.map +1 -0
  22. package/dist/{hooks → cjs/hooks}/useMultiBarcodeScanner.js +6 -3
  23. package/dist/cjs/hooks/useMultiBarcodeScanner.js.map +1 -0
  24. package/dist/{hooks → cjs/hooks}/useProductDetector.js +161 -90
  25. package/dist/cjs/hooks/useProductDetector.js.map +1 -0
  26. package/dist/{hooks → cjs/hooks}/useReceiptScanner.js +60 -52
  27. package/dist/cjs/hooks/useReceiptScanner.js.map +1 -0
  28. package/dist/{hooks → cjs/hooks}/useVideoScanner.js +8 -5
  29. package/dist/cjs/hooks/useVideoScanner.js.map +1 -0
  30. package/dist/{index.js → cjs/index.js} +8 -4
  31. package/dist/cjs/index.js.map +1 -0
  32. package/dist/{processors → cjs/processors}/detectionProcessor.js +1 -0
  33. package/dist/cjs/processors/detectionProcessor.js.map +1 -0
  34. package/dist/{processors → cjs/processors}/index.js +1 -0
  35. package/dist/cjs/processors/index.js.map +1 -0
  36. package/dist/{processors → cjs/processors}/tfliteFrameProcessor.js +108 -25
  37. package/dist/cjs/processors/tfliteFrameProcessor.js.map +1 -0
  38. package/dist/{types → cjs/types}/barcode.js +1 -0
  39. package/dist/cjs/types/barcode.js.map +1 -0
  40. package/dist/{types → cjs/types}/detection.js +1 -0
  41. package/dist/cjs/types/detection.js.map +1 -0
  42. package/dist/{types → cjs/types}/index.js +1 -0
  43. package/dist/cjs/types/index.js.map +1 -0
  44. package/dist/{types → cjs/types}/ocr.js +1 -0
  45. package/dist/cjs/types/ocr.js.map +1 -0
  46. package/dist/{utils → cjs/utils}/imagePreprocessor.js +30 -25
  47. package/dist/cjs/utils/imagePreprocessor.js.map +1 -0
  48. package/dist/cjs/utils/logger.js +99 -0
  49. package/dist/cjs/utils/logger.js.map +1 -0
  50. package/dist/{utils → cjs/utils}/yoloProcessor.js +1 -0
  51. package/dist/cjs/utils/yoloProcessor.js.map +1 -0
  52. package/dist/esm/components/DetectionOverlay.js +130 -0
  53. package/dist/esm/components/DetectionOverlay.js.map +1 -0
  54. package/dist/esm/components/index.js +5 -0
  55. package/dist/esm/components/index.js.map +1 -0
  56. package/dist/esm/core/CacheManager.js +327 -0
  57. package/dist/esm/core/CacheManager.js.map +1 -0
  58. package/dist/esm/core/MLVisionProvider.js +185 -0
  59. package/dist/esm/core/MLVisionProvider.js.map +1 -0
  60. package/dist/esm/core/ServerClient.js +305 -0
  61. package/dist/esm/core/ServerClient.js.map +1 -0
  62. package/dist/esm/core/index.js +7 -0
  63. package/dist/esm/core/index.js.map +1 -0
  64. package/dist/esm/hooks/classLabels.js +436 -0
  65. package/dist/esm/hooks/classLabels.js.map +1 -0
  66. package/dist/esm/hooks/classLabelsCoco.js +98 -0
  67. package/dist/esm/hooks/classLabelsCoco.js.map +1 -0
  68. package/dist/esm/hooks/index.js +9 -0
  69. package/dist/esm/hooks/index.js.map +1 -0
  70. package/dist/esm/hooks/useMultiBarcodeScanner.js +290 -0
  71. package/dist/esm/hooks/useMultiBarcodeScanner.js.map +1 -0
  72. package/dist/esm/hooks/useProductDetector.js +714 -0
  73. package/dist/esm/hooks/useProductDetector.js.map +1 -0
  74. package/dist/esm/hooks/useReceiptScanner.js +407 -0
  75. package/dist/esm/hooks/useReceiptScanner.js.map +1 -0
  76. package/dist/esm/hooks/useVideoScanner.js +383 -0
  77. package/dist/esm/hooks/useVideoScanner.js.map +1 -0
  78. package/dist/esm/index.js +93 -0
  79. package/dist/esm/index.js.map +1 -0
  80. package/dist/esm/processors/detectionProcessor.js +121 -0
  81. package/dist/esm/processors/detectionProcessor.js.map +1 -0
  82. package/dist/esm/processors/index.js +7 -0
  83. package/dist/esm/processors/index.js.map +1 -0
  84. package/dist/esm/processors/tfliteFrameProcessor.js +292 -0
  85. package/dist/esm/processors/tfliteFrameProcessor.js.map +1 -0
  86. package/dist/esm/types/barcode.js +17 -0
  87. package/dist/esm/types/barcode.js.map +1 -0
  88. package/dist/esm/types/detection.js +8 -0
  89. package/dist/esm/types/detection.js.map +1 -0
  90. package/dist/esm/types/index.js +10 -0
  91. package/dist/esm/types/index.js.map +1 -0
  92. package/dist/esm/types/ocr.js +8 -0
  93. package/dist/esm/types/ocr.js.map +1 -0
  94. package/dist/esm/utils/imagePreprocessor.js +268 -0
  95. package/dist/esm/utils/imagePreprocessor.js.map +1 -0
  96. package/dist/esm/utils/logger.js +94 -0
  97. package/dist/esm/utils/logger.js.map +1 -0
  98. package/dist/esm/utils/yoloProcessor.js +151 -0
  99. package/dist/esm/utils/yoloProcessor.js.map +1 -0
  100. package/dist/{components → types/components}/DetectionOverlay.d.ts +1 -0
  101. package/dist/types/components/DetectionOverlay.d.ts.map +1 -0
  102. package/dist/{components → types/components}/index.d.ts +1 -0
  103. package/dist/types/components/index.d.ts.map +1 -0
  104. package/dist/{core → types/core}/CacheManager.d.ts +1 -0
  105. package/dist/types/core/CacheManager.d.ts.map +1 -0
  106. package/dist/{core → types/core}/MLVisionProvider.d.ts +1 -0
  107. package/dist/types/core/MLVisionProvider.d.ts.map +1 -0
  108. package/dist/{core → types/core}/ServerClient.d.ts +1 -0
  109. package/dist/types/core/ServerClient.d.ts.map +1 -0
  110. package/dist/{core → types/core}/index.d.ts +1 -0
  111. package/dist/types/core/index.d.ts.map +1 -0
  112. package/dist/{hooks → types/hooks}/classLabels.d.ts +1 -0
  113. package/dist/types/hooks/classLabels.d.ts.map +1 -0
  114. package/dist/{hooks → types/hooks}/classLabelsCoco.d.ts +1 -0
  115. package/dist/types/hooks/classLabelsCoco.d.ts.map +1 -0
  116. package/dist/{hooks → types/hooks}/index.d.ts +1 -0
  117. package/dist/types/hooks/index.d.ts.map +1 -0
  118. package/dist/{hooks → types/hooks}/useMultiBarcodeScanner.d.ts +1 -0
  119. package/dist/types/hooks/useMultiBarcodeScanner.d.ts.map +1 -0
  120. package/dist/{hooks → types/hooks}/useProductDetector.d.ts +1 -0
  121. package/dist/types/hooks/useProductDetector.d.ts.map +1 -0
  122. package/dist/{hooks → types/hooks}/useReceiptScanner.d.ts +2 -1
  123. package/dist/types/hooks/useReceiptScanner.d.ts.map +1 -0
  124. package/dist/{hooks → types/hooks}/useVideoScanner.d.ts +1 -0
  125. package/dist/types/hooks/useVideoScanner.d.ts.map +1 -0
  126. package/dist/types/index.d.ts +58 -124
  127. package/dist/types/index.d.ts.map +1 -0
  128. package/dist/{processors → types/processors}/detectionProcessor.d.ts +1 -0
  129. package/dist/types/processors/detectionProcessor.d.ts.map +1 -0
  130. package/dist/{processors → types/processors}/index.d.ts +1 -0
  131. package/dist/types/processors/index.d.ts.map +1 -0
  132. package/dist/{processors → types/processors}/tfliteFrameProcessor.d.ts +5 -4
  133. package/dist/types/processors/tfliteFrameProcessor.d.ts.map +1 -0
  134. package/dist/types/{barcode.d.ts → types/barcode.d.ts} +1 -0
  135. package/dist/types/types/barcode.d.ts.map +1 -0
  136. package/dist/types/{detection.d.ts → types/detection.d.ts} +1 -0
  137. package/dist/types/types/detection.d.ts.map +1 -0
  138. package/dist/types/types/index.d.ts +127 -0
  139. package/dist/types/types/index.d.ts.map +1 -0
  140. package/dist/types/{ocr.d.ts → types/ocr.d.ts} +1 -0
  141. package/dist/types/types/ocr.d.ts.map +1 -0
  142. package/dist/{utils → types/utils}/imagePreprocessor.d.ts +1 -0
  143. package/dist/types/utils/imagePreprocessor.d.ts.map +1 -0
  144. package/dist/types/utils/logger.d.ts +52 -0
  145. package/dist/types/utils/logger.d.ts.map +1 -0
  146. package/dist/{utils → types/utils}/yoloProcessor.d.ts +1 -0
  147. package/dist/types/utils/yoloProcessor.d.ts.map +1 -0
  148. package/package.json +62 -21
  149. package/dist/index.d.ts +0 -58
@@ -0,0 +1,290 @@
1
+ /**
2
+ * useMultiBarcodeScanner Hook
3
+ *
4
+ * React hook for scanning multiple barcodes in a single frame or photo.
5
+ * Uses VisionCamera's built-in MLKit barcode scanning.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { useMultiBarcodeScanner } from '@souschef/ml-vision';
10
+ *
11
+ * function GroceryScanner() {
12
+ * const {
13
+ * isScanning,
14
+ * results,
15
+ * startScanning,
16
+ * stopScanning,
17
+ * scanPhoto,
18
+ * } = useMultiBarcodeScanner({
19
+ * formats: ['ean-13', 'upc-a'],
20
+ * onDetected: (barcodes) => console.log('Found:', barcodes),
21
+ * });
22
+ *
23
+ * return (
24
+ * // Your camera UI
25
+ * );
26
+ * }
27
+ * ```
28
+ */
29
+ import { useState, useCallback, useRef, useMemo } from 'react';
30
+ import { GROCERY_BARCODE_FORMATS } from '../types/barcode';
31
+ import { useMLVisionContext } from '../core/MLVisionProvider';
32
+ import { logger } from '../utils/logger';
33
+ // ============================================================================
34
+ // Constants
35
+ // ============================================================================
36
+ /** Default scan interval in milliseconds */
37
+ const DEFAULT_SCAN_INTERVAL = 100;
38
+ /** Maximum barcodes to detect per scan */
39
+ const DEFAULT_MAX_BARCODES = 20;
40
+ // ============================================================================
41
+ // Hook Implementation
42
+ // ============================================================================
43
+ /**
44
+ * Hook for multi-barcode scanning
45
+ */
46
+ export function useMultiBarcodeScanner(options = {}) {
47
+ const { formats = GROCERY_BARCODE_FORMATS, maxBarcodes = DEFAULT_MAX_BARCODES, scanInterval = DEFAULT_SCAN_INTERVAL, onDetected, onError, hapticFeedback = true, deduplicate = true, } = options;
48
+ // Context
49
+ const { cacheManager } = useMLVisionContext();
50
+ // State
51
+ // MLKit barcode scanning is always ready once the app loads
52
+ const isReady = true;
53
+ const [isScanning, setIsScanning] = useState(false);
54
+ const [results, setResults] = useState([]);
55
+ const [error, setError] = useState(null);
56
+ // Refs
57
+ const seenBarcodesRef = useRef(new Set());
58
+ const lastScanTimeRef = useRef(0);
59
+ // ============================================================================
60
+ // Barcode Processing
61
+ // ============================================================================
62
+ /**
63
+ * Process detected barcodes from VisionCamera
64
+ */
65
+ const processDetectedBarcodes = useCallback((codes) => {
66
+ const now = Date.now();
67
+ // Throttle processing
68
+ if (now - lastScanTimeRef.current < scanInterval) {
69
+ return;
70
+ }
71
+ lastScanTimeRef.current = now;
72
+ // Convert to our format
73
+ const detections = codes
74
+ .slice(0, maxBarcodes)
75
+ .map((code) => {
76
+ const format = mapCodeType(code.type);
77
+ const barcodeData = {
78
+ format,
79
+ value: code.value,
80
+ displayValue: formatBarcodeDisplay(code.value, format),
81
+ };
82
+ return {
83
+ id: `barcode_${now}_${Math.random().toString(36).substr(2, 9)}`,
84
+ type: 'barcode',
85
+ confidence: 1.0, // MLKit doesn't provide confidence
86
+ data: barcodeData,
87
+ source: 'on_device',
88
+ processingTimeMs: 0,
89
+ timestamp: now,
90
+ };
91
+ })
92
+ .filter((det) => formats.includes(det.data.format));
93
+ // Deduplicate if enabled
94
+ let newDetections = detections;
95
+ if (deduplicate) {
96
+ newDetections = detections.filter((det) => {
97
+ const key = `${det.data.format}:${det.data.value}`;
98
+ if (seenBarcodesRef.current.has(key)) {
99
+ return false;
100
+ }
101
+ seenBarcodesRef.current.add(key);
102
+ return true;
103
+ });
104
+ }
105
+ if (newDetections.length === 0)
106
+ return;
107
+ // Update results
108
+ setResults((prev) => [...prev, ...newDetections]);
109
+ // Cache barcodes
110
+ if (cacheManager) {
111
+ for (const det of newDetections) {
112
+ cacheManager.setBarcode(det.data.value, {
113
+ barcode: det.data.value,
114
+ format: det.data.format,
115
+ found: true,
116
+ });
117
+ }
118
+ }
119
+ // Callback
120
+ onDetected?.(newDetections);
121
+ // Haptic feedback
122
+ if (hapticFeedback && newDetections.length > 0) {
123
+ // Trigger haptic - implement based on your haptic service
124
+ // HapticService.light();
125
+ }
126
+ }, [
127
+ formats,
128
+ maxBarcodes,
129
+ scanInterval,
130
+ deduplicate,
131
+ cacheManager,
132
+ onDetected,
133
+ hapticFeedback,
134
+ ]);
135
+ // ============================================================================
136
+ // Actions
137
+ // ============================================================================
138
+ /**
139
+ * Start continuous scanning
140
+ */
141
+ const startScanning = useCallback(() => {
142
+ setIsScanning(true);
143
+ setError(null);
144
+ }, []);
145
+ /**
146
+ * Stop scanning
147
+ */
148
+ const stopScanning = useCallback(() => {
149
+ setIsScanning(false);
150
+ }, []);
151
+ /**
152
+ * Scan a photo for barcodes
153
+ */
154
+ const scanPhoto = useCallback(async (_uri) => {
155
+ try {
156
+ setError(null);
157
+ // Note: Photo scanning requires native module integration
158
+ // This is a placeholder that would use MLKit's image labeling
159
+ // In practice, you'd use a native module or server endpoint
160
+ logger.debug('[BarcodeScanner] Photo scanning not yet implemented natively');
161
+ logger.debug('[BarcodeScanner] Use real-time camera scanning instead');
162
+ // Return empty for now - implement with native module
163
+ return [];
164
+ }
165
+ catch (err) {
166
+ const scanError = err instanceof Error ? err : new Error('Scan failed');
167
+ setError(scanError);
168
+ onError?.(scanError);
169
+ return [];
170
+ }
171
+ }, [onError]);
172
+ /**
173
+ * Clear all results
174
+ */
175
+ const clearResults = useCallback(() => {
176
+ setResults([]);
177
+ }, []);
178
+ /**
179
+ * Reset scanner state
180
+ */
181
+ const reset = useCallback(() => {
182
+ setResults([]);
183
+ setError(null);
184
+ seenBarcodesRef.current.clear();
185
+ setIsScanning(false);
186
+ }, []);
187
+ // ============================================================================
188
+ // Frame Processor Configuration
189
+ // ============================================================================
190
+ /**
191
+ * VisionCamera code scanner configuration
192
+ * Use this with VisionCamera's codeScanner prop
193
+ */
194
+ const codeScannerConfig = useMemo(() => ({
195
+ codeTypes: formats.map(mapFormatToCodeType),
196
+ onCodeScanned: processDetectedBarcodes,
197
+ }), [formats, processDetectedBarcodes]);
198
+ // Frame processor is the code scanner config for VisionCamera
199
+ const frameProcessor = useMemo(() => {
200
+ if (!isScanning)
201
+ return null;
202
+ return codeScannerConfig;
203
+ }, [isScanning, codeScannerConfig]);
204
+ // ============================================================================
205
+ // Return
206
+ // ============================================================================
207
+ return {
208
+ // State
209
+ isReady,
210
+ isScanning,
211
+ results,
212
+ error,
213
+ // Actions
214
+ startScanning,
215
+ stopScanning,
216
+ scanPhoto,
217
+ clearResults,
218
+ reset,
219
+ // Frame processor
220
+ frameProcessor,
221
+ };
222
+ }
223
+ // ============================================================================
224
+ // Helper Functions
225
+ // ============================================================================
226
+ /**
227
+ * Map VisionCamera code type to our BarcodeFormat
228
+ */
229
+ function mapCodeType(codeType) {
230
+ const mapping = {
231
+ 'ean-13': 'ean-13',
232
+ 'ean-8': 'ean-8',
233
+ 'upc-a': 'upc-a',
234
+ 'upc-e': 'upc-e',
235
+ 'code-128': 'code-128',
236
+ 'code-39': 'code-39',
237
+ 'code-93': 'code-93',
238
+ 'itf': 'itf',
239
+ 'codabar': 'codabar',
240
+ 'qr': 'qr',
241
+ 'data-matrix': 'data-matrix',
242
+ 'pdf-417': 'pdf-417',
243
+ 'aztec': 'aztec',
244
+ // Handle variations
245
+ EAN_13: 'ean-13',
246
+ EAN_8: 'ean-8',
247
+ UPC_A: 'upc-a',
248
+ UPC_E: 'upc-e',
249
+ CODE_128: 'code-128',
250
+ CODE_39: 'code-39',
251
+ CODE_93: 'code-93',
252
+ ITF: 'itf',
253
+ CODABAR: 'codabar',
254
+ QR_CODE: 'qr',
255
+ DATA_MATRIX: 'data-matrix',
256
+ PDF_417: 'pdf-417',
257
+ AZTEC: 'aztec',
258
+ };
259
+ return mapping[codeType] || 'code-128';
260
+ }
261
+ /**
262
+ * Map our BarcodeFormat to VisionCamera code type
263
+ */
264
+ function mapFormatToCodeType(format) {
265
+ // VisionCamera uses the same format names
266
+ return format;
267
+ }
268
+ /**
269
+ * Format barcode value for display
270
+ */
271
+ function formatBarcodeDisplay(value, format) {
272
+ switch (format) {
273
+ case 'ean-13':
274
+ // Format: X-XXXXXX-XXXXX-X
275
+ if (value.length === 13) {
276
+ return `${value[0]}-${value.slice(1, 7)}-${value.slice(7, 12)}-${value[12]}`;
277
+ }
278
+ return value;
279
+ case 'upc-a':
280
+ // Format: X-XXXXX-XXXXX-X
281
+ if (value.length === 12) {
282
+ return `${value[0]}-${value.slice(1, 6)}-${value.slice(6, 11)}-${value[11]}`;
283
+ }
284
+ return value;
285
+ default:
286
+ return value;
287
+ }
288
+ }
289
+ export default useMultiBarcodeScanner;
290
+ //# sourceMappingURL=useMultiBarcodeScanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMultiBarcodeScanner.js","sourceRoot":"","sources":["../../../src/hooks/useMultiBarcodeScanner.ts"],"names":[],"mappings":"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"}