@mleonard9/vin-scanner 0.1.1
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 +110 -0
- package/android/build.gradle +102 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +8 -0
- package/android/src/main/AndroidManifestNew.xml +2 -0
- package/android/src/main/java/com/visioncamerabarcodescanner/VisionCameraBarcodeScannerModule.kt +93 -0
- package/android/src/main/java/com/visioncamerabarcodescanner/VisionCameraBarcodeScannerPackage.kt +27 -0
- package/android/src/main/java/com/visioncameratextrecognition/VisionCameraTextRecognitionModule.kt +130 -0
- package/ios/VisionCameraBarcodeScanner.m +175 -0
- package/ios/VisionCameraTextRecognition.m +114 -0
- package/lib/commonjs/index.js +87 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/scanBarcodes.js +46 -0
- package/lib/commonjs/scanBarcodes.js.map +1 -0
- package/lib/commonjs/scanText.js +29 -0
- package/lib/commonjs/scanText.js.map +1 -0
- package/lib/commonjs/types.js +6 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/vinUtils.js +240 -0
- package/lib/commonjs/vinUtils.js.map +1 -0
- package/lib/module/index.js +80 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/scanBarcodes.js +40 -0
- package/lib/module/scanBarcodes.js.map +1 -0
- package/lib/module/scanText.js +23 -0
- package/lib/module/scanText.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/vinUtils.js +230 -0
- package/lib/module/vinUtils.js.map +1 -0
- package/lib/typescript/src/index.d.ts +6 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/scanBarcodes.d.ts +3 -0
- package/lib/typescript/src/scanBarcodes.d.ts.map +1 -0
- package/lib/typescript/src/scanText.d.ts +3 -0
- package/lib/typescript/src/scanText.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +104 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/vinUtils.d.ts +19 -0
- package/lib/typescript/src/vinUtils.d.ts.map +1 -0
- package/package.json +168 -0
- package/src/index.tsx +131 -0
- package/src/scanBarcodes.ts +76 -0
- package/src/scanText.ts +36 -0
- package/src/types.ts +145 -0
- package/src/vinUtils.ts +368 -0
- package/vin-scanner.podspec +28 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#import <MLKitTextRecognition/MLKitTextRecognition.h>
|
|
2
|
+
#import <MLKitTextRecognitionChinese/MLKitTextRecognitionChinese.h>
|
|
3
|
+
#import <MLKitTextRecognitionDevanagari/MLKitTextRecognitionDevanagari.h>
|
|
4
|
+
#import <MLKitTextRecognitionJapanese/MLKitTextRecognitionJapanese.h>
|
|
5
|
+
#import <MLKitTextRecognitionKorean/MLKitTextRecognitionKorean.h>
|
|
6
|
+
#import <MLKitTextRecognitionCommon/MLKitTextRecognitionCommon.h>
|
|
7
|
+
#import <VisionCamera/FrameProcessorPlugin.h>
|
|
8
|
+
#import <VisionCamera/FrameProcessorPluginRegistry.h>
|
|
9
|
+
#import <VisionCamera/VisionCameraProxyHolder.h>
|
|
10
|
+
#import <VisionCamera/Frame.h>
|
|
11
|
+
@import MLKitVision;
|
|
12
|
+
|
|
13
|
+
@interface VisionCameraTextRecognitionPlugin : FrameProcessorPlugin
|
|
14
|
+
|
|
15
|
+
@property(nonatomic, strong) MLKTextRecognizer *textRecognizer;
|
|
16
|
+
|
|
17
|
+
@end
|
|
18
|
+
|
|
19
|
+
@implementation VisionCameraTextRecognitionPlugin
|
|
20
|
+
|
|
21
|
+
- (instancetype)initWithProxy:(VisionCameraProxyHolder*)proxy
|
|
22
|
+
withOptions:(NSDictionary* _Nullable)options {
|
|
23
|
+
self = [super initWithProxy:proxy withOptions:options];
|
|
24
|
+
if (self) {
|
|
25
|
+
NSString *language = options[@"language"];
|
|
26
|
+
|
|
27
|
+
if ([language isEqualToString:@"latin"]) {
|
|
28
|
+
MLKTextRecognizerOptions *options = [[MLKTextRecognizerOptions alloc] init];
|
|
29
|
+
_textRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options];
|
|
30
|
+
} else if ([language isEqualToString:@"chinese"]) {
|
|
31
|
+
MLKChineseTextRecognizerOptions *chineseOptions = [[MLKChineseTextRecognizerOptions alloc] init];
|
|
32
|
+
_textRecognizer = [MLKTextRecognizer textRecognizerWithOptions:chineseOptions];
|
|
33
|
+
}else if ([language isEqualToString:@"devanagari"]) {
|
|
34
|
+
MLKDevanagariTextRecognizerOptions *devanagariOptions = [[MLKDevanagariTextRecognizerOptions alloc] init];
|
|
35
|
+
_textRecognizer = [MLKTextRecognizer textRecognizerWithOptions:devanagariOptions];
|
|
36
|
+
}
|
|
37
|
+
else if ([language isEqualToString:@"japanese"]) {
|
|
38
|
+
MLKJapaneseTextRecognizerOptions *japaneseOptions = [[MLKJapaneseTextRecognizerOptions alloc] init];
|
|
39
|
+
_textRecognizer = [MLKTextRecognizer textRecognizerWithOptions:japaneseOptions];
|
|
40
|
+
}
|
|
41
|
+
else if ([language isEqualToString:@"korean"]) {
|
|
42
|
+
MLKKoreanTextRecognizerOptions *koreanOptions = [[MLKKoreanTextRecognizerOptions alloc] init];
|
|
43
|
+
_textRecognizer = [MLKTextRecognizer textRecognizerWithOptions:koreanOptions];
|
|
44
|
+
}else {
|
|
45
|
+
MLKTextRecognizerOptions *defaultOptions = [[MLKTextRecognizerOptions alloc] init];
|
|
46
|
+
_textRecognizer = [MLKTextRecognizer textRecognizerWithOptions:defaultOptions]; }
|
|
47
|
+
|
|
48
|
+
}
|
|
49
|
+
return self;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
- (id _Nullable)callback:(Frame* _Nonnull)frame
|
|
53
|
+
withArguments:(NSDictionary* _Nullable)arguments {
|
|
54
|
+
CMSampleBufferRef buffer = frame.buffer;
|
|
55
|
+
UIImageOrientation orientation = frame.orientation;
|
|
56
|
+
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:buffer];
|
|
57
|
+
image.orientation = orientation;
|
|
58
|
+
NSMutableArray *data = [NSMutableArray array];
|
|
59
|
+
dispatch_group_t dispatchGroup = dispatch_group_create();
|
|
60
|
+
dispatch_group_enter(dispatchGroup);
|
|
61
|
+
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
|
|
62
|
+
[self.textRecognizer processImage:image
|
|
63
|
+
completion:^(MLKText *_Nullable result,
|
|
64
|
+
NSError *_Nullable error) {
|
|
65
|
+
if (error || !result ) {
|
|
66
|
+
dispatch_group_leave(dispatchGroup);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
for (MLKTextBlock *block in result.blocks) {
|
|
70
|
+
NSMutableDictionary *objData = [[NSMutableDictionary alloc] init];
|
|
71
|
+
NSString *resultText = result.text;
|
|
72
|
+
objData[@"resultText"] = resultText;
|
|
73
|
+
NSString *blockText = block.text;
|
|
74
|
+
objData[@"blockText"] = blockText;
|
|
75
|
+
CGRect blockFrame = block.frame;
|
|
76
|
+
objData[@"blockFrameLeft"] = @(CGRectGetMinX(blockFrame));
|
|
77
|
+
objData[@"blockFrameTop"] = @(CGRectGetMinY(blockFrame));
|
|
78
|
+
objData[@"blockFrameRight"] = @(CGRectGetMaxX(blockFrame));
|
|
79
|
+
objData[@"blockFrameBottom"] = @(CGRectGetMaxY(blockFrame));
|
|
80
|
+
objData[@"size"] = @(blockFrame.size.height);
|
|
81
|
+
for (MLKTextLine *line in block.lines) {
|
|
82
|
+
NSString *lineText = line.text;
|
|
83
|
+
objData[@"lineText"] = lineText;
|
|
84
|
+
CGRect lineFrame = line.frame;
|
|
85
|
+
objData[@"lineFrameLeft"] = @(CGRectGetMinX(lineFrame));
|
|
86
|
+
objData[@"lineFrameTop"] = @(CGRectGetMinY(lineFrame));
|
|
87
|
+
objData[@"lineFrameRight"] = @(CGRectGetMaxX(lineFrame));
|
|
88
|
+
objData[@"lineFrameBottom"] = @(CGRectGetMaxY(lineFrame));
|
|
89
|
+
objData[@"size"] = @(lineFrame.size.height);
|
|
90
|
+
for (MLKTextElement *element in line.elements) {
|
|
91
|
+
NSString *elementText = element.text;
|
|
92
|
+
CGRect elementFrame = element.frame;
|
|
93
|
+
objData[@"elementText"] = elementText;
|
|
94
|
+
objData[@"elementFrameLeft"] = @(CGRectGetMinX(elementFrame));
|
|
95
|
+
objData[@"elementFrameTop"] = @(CGRectGetMinY(elementFrame));
|
|
96
|
+
objData[@"elementFrameRight"] = @(CGRectGetMaxX(elementFrame));
|
|
97
|
+
objData[@"elementFrameBottom"] = @(CGRectGetMaxY(elementFrame));
|
|
98
|
+
objData[@"size"] = @(elementFrame.size.height);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
[data addObject:objData];
|
|
102
|
+
}
|
|
103
|
+
dispatch_group_leave(dispatchGroup);
|
|
104
|
+
}];
|
|
105
|
+
|
|
106
|
+
});
|
|
107
|
+
dispatch_group_wait(dispatchGroup, DISPATCH_TIME_FOREVER);
|
|
108
|
+
return data;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
VISION_EXPORT_FRAME_PROCESSOR(VisionCameraTextRecognitionPlugin, scanText)
|
|
112
|
+
|
|
113
|
+
@end
|
|
114
|
+
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Camera = void 0;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _reactNativeVisionCamera = require("react-native-vision-camera");
|
|
9
|
+
var _reactNativeWorkletsCore = require("react-native-worklets-core");
|
|
10
|
+
var _scanBarcodes = require("./scanBarcodes");
|
|
11
|
+
var _scanText = require("./scanText");
|
|
12
|
+
var _vinUtils = require("./vinUtils");
|
|
13
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
14
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
15
|
+
const Camera = exports.Camera = /*#__PURE__*/(0, _react.forwardRef)(function Camera(props, ref) {
|
|
16
|
+
const {
|
|
17
|
+
device,
|
|
18
|
+
callback,
|
|
19
|
+
options,
|
|
20
|
+
...rest
|
|
21
|
+
} = props;
|
|
22
|
+
const resolvedOptions = (0, _react.useMemo)(() => (0, _vinUtils.resolveOptions)(options), [options]);
|
|
23
|
+
const barcodeScanner = useBarcodeScanner(resolvedOptions.barcode);
|
|
24
|
+
const textScanner = useTextScanner(resolvedOptions.text);
|
|
25
|
+
const lastEmissionRef = (0, _react.useRef)(undefined);
|
|
26
|
+
const handleDetections = (0, _reactNativeWorkletsCore.useRunOnJS)(payload => {
|
|
27
|
+
const candidates = (0, _vinUtils.buildVinCandidates)(payload, resolvedOptions);
|
|
28
|
+
const best = (0, _vinUtils.pickBestCandidate)(candidates, resolvedOptions);
|
|
29
|
+
const mode = resolvedOptions.detection.resultMode;
|
|
30
|
+
const filteredCandidates = mode === 'all' ? candidates : best ? [best] : [];
|
|
31
|
+
const fingerprint = mode === 'all' ? filteredCandidates.map(candidate => candidate.value).join('|') || null : (best === null || best === void 0 ? void 0 : best.value) ?? null;
|
|
32
|
+
if (!resolvedOptions.detection.emitDuplicates) {
|
|
33
|
+
if (lastEmissionRef.current !== undefined && fingerprint === lastEmissionRef.current) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
lastEmissionRef.current = fingerprint;
|
|
37
|
+
}
|
|
38
|
+
callback({
|
|
39
|
+
mode,
|
|
40
|
+
timestamp: payload.timestamp,
|
|
41
|
+
candidates: filteredCandidates,
|
|
42
|
+
best: best ?? null,
|
|
43
|
+
raw: {
|
|
44
|
+
barcodes: payload.barcodes ?? [],
|
|
45
|
+
textBlocks: payload.textBlocks ?? []
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}, [callback, resolvedOptions]);
|
|
49
|
+
const scanBarcodes = barcodeScanner === null || barcodeScanner === void 0 ? void 0 : barcodeScanner.scanBarcodes;
|
|
50
|
+
const scanText = textScanner === null || textScanner === void 0 ? void 0 : textScanner.scanText;
|
|
51
|
+
const frameProcessor = (0, _reactNativeVisionCamera.useFrameProcessor)(frame => {
|
|
52
|
+
'worklet';
|
|
53
|
+
|
|
54
|
+
const barcodes = scanBarcodes ? scanBarcodes(frame) : [];
|
|
55
|
+
const textBlocks = scanText ? scanText(frame) : [];
|
|
56
|
+
handleDetections({
|
|
57
|
+
barcodes: barcodes ?? [],
|
|
58
|
+
textBlocks: textBlocks ?? [],
|
|
59
|
+
timestamp: typeof (frame === null || frame === void 0 ? void 0 : frame.timestamp) === 'number' ? frame.timestamp : Date.now()
|
|
60
|
+
});
|
|
61
|
+
}, [scanBarcodes, scanText, handleDetections]);
|
|
62
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, !!device && /*#__PURE__*/_react.default.createElement(_reactNativeVisionCamera.Camera, _extends({
|
|
63
|
+
pixelFormat: "yuv",
|
|
64
|
+
ref: ref,
|
|
65
|
+
frameProcessor: frameProcessor,
|
|
66
|
+
device: device
|
|
67
|
+
}, rest)));
|
|
68
|
+
});
|
|
69
|
+
function useBarcodeScanner(options) {
|
|
70
|
+
return (0, _react.useMemo)(() => {
|
|
71
|
+
if (!options.enabled) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
return (0, _scanBarcodes.createBarcodeScannerPlugin)(options.formats);
|
|
75
|
+
}, [options.enabled, options.formats]);
|
|
76
|
+
}
|
|
77
|
+
function useTextScanner(options) {
|
|
78
|
+
return (0, _react.useMemo)(() => {
|
|
79
|
+
if (!options.enabled) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
return (0, _scanText.createTextRecognitionPlugin)({
|
|
83
|
+
language: options.language
|
|
84
|
+
});
|
|
85
|
+
}, [options.enabled, options.language]);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNativeVisionCamera","_reactNativeWorkletsCore","_scanBarcodes","_scanText","_vinUtils","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","Camera","exports","forwardRef","props","ref","device","callback","options","rest","resolvedOptions","useMemo","resolveOptions","barcodeScanner","useBarcodeScanner","barcode","textScanner","useTextScanner","text","lastEmissionRef","useRef","undefined","handleDetections","useRunOnJS","payload","candidates","buildVinCandidates","best","pickBestCandidate","mode","detection","resultMode","filteredCandidates","fingerprint","map","candidate","value","join","emitDuplicates","current","timestamp","raw","barcodes","textBlocks","scanBarcodes","scanText","frameProcessor","useFrameProcessor","frame","Date","now","createElement","Fragment","pixelFormat","enabled","createBarcodeScannerPlugin","formats","createTextRecognitionPlugin","language"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createBarcodeScannerPlugin = createBarcodeScannerPlugin;
|
|
7
|
+
var _reactNative = require("react-native");
|
|
8
|
+
var _reactNativeVisionCamera = require("react-native-vision-camera");
|
|
9
|
+
const LINKING_ERROR = `The package '@mleonard9/vin-scanner' doesn't seem to be linked. Make sure: \n\n` + _reactNative.Platform.select({
|
|
10
|
+
ios: "- You have run 'pod install'\n",
|
|
11
|
+
default: ''
|
|
12
|
+
}) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
|
|
13
|
+
const DEFAULT_FORMATS = ['all'];
|
|
14
|
+
const KNOWN_FORMATS = ['all', 'aztec', 'code-128', 'code-39', 'code-93', 'codabar', 'data-matrix', 'ean-13', 'ean-8', 'itf', 'pdf-417', 'qr', 'upc-a', 'upc-e'];
|
|
15
|
+
const toNativeBarcodeOptions = formats => {
|
|
16
|
+
const sanitized = formats && formats.length > 0 ? formats : DEFAULT_FORMATS;
|
|
17
|
+
if (sanitized.includes('all')) {
|
|
18
|
+
return {
|
|
19
|
+
all: true
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return sanitized.reduce((acc, format) => {
|
|
23
|
+
if (KNOWN_FORMATS.includes(format)) {
|
|
24
|
+
acc[format] = true;
|
|
25
|
+
}
|
|
26
|
+
return acc;
|
|
27
|
+
}, {});
|
|
28
|
+
};
|
|
29
|
+
function createBarcodeScannerPlugin(formats) {
|
|
30
|
+
const pluginOptions = toNativeBarcodeOptions(formats);
|
|
31
|
+
const plugin = _reactNativeVisionCamera.VisionCameraProxy.initFrameProcessorPlugin('scanBarcodes', {
|
|
32
|
+
...pluginOptions
|
|
33
|
+
});
|
|
34
|
+
if (!plugin) {
|
|
35
|
+
throw new Error(LINKING_ERROR);
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
scanBarcodes: frame => {
|
|
39
|
+
'worklet';
|
|
40
|
+
|
|
41
|
+
const result = plugin.call(frame);
|
|
42
|
+
return Array.isArray(result) ? result : [];
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=scanBarcodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_reactNativeVisionCamera","LINKING_ERROR","Platform","select","ios","default","DEFAULT_FORMATS","KNOWN_FORMATS","toNativeBarcodeOptions","formats","sanitized","length","includes","all","reduce","acc","format","createBarcodeScannerPlugin","pluginOptions","plugin","VisionCameraProxy","initFrameProcessorPlugin","Error","scanBarcodes","frame","result","call","Array","isArray"],"sourceRoot":"../../src","sources":["scanBarcodes.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,wBAAA,GAAAD,OAAA;AAYA,MAAME,aAAqB,GACzB,iFAAiF,GACjFC,qBAAQ,CAACC,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,eAAmC,GAAG,CAAC,KAAK,CAAC;AAEnD,MAAMC,aAA8B,GAAG,CACrC,KAAK,EACL,OAAO,EACP,UAAU,EACV,SAAS,EACT,SAAS,EACT,SAAS,EACT,aAAa,EACb,QAAQ,EACR,OAAO,EACP,KAAK,EACL,SAAS,EACT,IAAI,EACJ,OAAO,EACP,OAAO,CACR;AAID,MAAMC,sBAAsB,GAC1BC,OAA4B,IACD;EAC3B,MAAMC,SAAS,GAAGD,OAAO,IAAIA,OAAO,CAACE,MAAM,GAAG,CAAC,GAAGF,OAAO,GAAGH,eAAe;EAC3E,IAAII,SAAS,CAACE,QAAQ,CAAC,KAAK,CAAC,EAAE;IAC7B,OAAO;MAAEC,GAAG,EAAE;IAAK,CAAC;EACtB;EACA,OAAOH,SAAS,CAACI,MAAM,CAAyB,CAACC,GAAG,EAAEC,MAAM,KAAK;IAC/D,IAAKT,aAAa,CAAcK,QAAQ,CAACI,MAAM,CAAC,EAAE;MAChDD,GAAG,CAACC,MAAM,CAAkB,GAAG,IAAI;IACrC;IACA,OAAOD,GAAG;EACZ,CAAC,EAAE,CAAC,CAAC,CAAC;AACR,CAAC;AAEM,SAASE,0BAA0BA,CACxCR,OAA2B,EACL;EACtB,MAAMS,aAAa,GAAGV,sBAAsB,CAACC,OAAO,CAAC;EACrD,MAAMU,MAAwC,GAC5CC,0CAAiB,CAACC,wBAAwB,CAAC,cAAc,EAAE;IACzD,GAAGH;EACL,CAAC,CAAC;EACJ,IAAI,CAACC,MAAM,EAAE;IACX,MAAM,IAAIG,KAAK,CAACrB,aAAa,CAAC;EAChC;EACA,OAAO;IACLsB,YAAY,EAAGC,KAAY,IAAyB;MAClD,SAAS;;MACT,MAAMC,MAAM,GAAGN,MAAM,CAACO,IAAI,CAACF,KAAK,CAAC;MACjC,OAAQG,KAAK,CAACC,OAAO,CAACH,MAAM,CAAC,GACzBA,MAAM,GACN,EAAE;IACR;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createTextRecognitionPlugin = createTextRecognitionPlugin;
|
|
7
|
+
var _reactNative = require("react-native");
|
|
8
|
+
var _reactNativeVisionCamera = require("react-native-vision-camera");
|
|
9
|
+
const LINKING_ERROR = `The package '@mleonard9/vin-scanner' doesn't seem to be linked. Make sure: \n\n` + _reactNative.Platform.select({
|
|
10
|
+
ios: "- You have run 'pod install'\n",
|
|
11
|
+
default: ''
|
|
12
|
+
}) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
|
|
13
|
+
function createTextRecognitionPlugin(options) {
|
|
14
|
+
const plugin = _reactNativeVisionCamera.VisionCameraProxy.initFrameProcessorPlugin('scanText', {
|
|
15
|
+
...options
|
|
16
|
+
});
|
|
17
|
+
if (!plugin) {
|
|
18
|
+
throw new Error(LINKING_ERROR);
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
scanText: frame => {
|
|
22
|
+
'worklet';
|
|
23
|
+
|
|
24
|
+
const result = plugin.call(frame);
|
|
25
|
+
return Array.isArray(result) ? result : [];
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=scanText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_reactNativeVisionCamera","LINKING_ERROR","Platform","select","ios","default","createTextRecognitionPlugin","options","plugin","VisionCameraProxy","initFrameProcessorPlugin","Error","scanText","frame","result","call","Array","isArray"],"sourceRoot":"../../src","sources":["scanText.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,wBAAA,GAAAD,OAAA;AAWA,MAAME,aAAqB,GACzB,iFAAiF,GACjFC,qBAAQ,CAACC,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAE1B,SAASC,2BAA2BA,CACzCC,OAA+B,EACR;EACvB,MAAMC,MAAwC,GAC5CC,0CAAiB,CAACC,wBAAwB,CAAC,UAAU,EAAE;IACrD,GAAGH;EACL,CAAC,CAAC;EACJ,IAAI,CAACC,MAAM,EAAE;IACX,MAAM,IAAIG,KAAK,CAACV,aAAa,CAAC;EAChC;EACA,OAAO;IACLW,QAAQ,EAAGC,KAAY,IAAsB;MAC3C,SAAS;;MACT,MAAMC,MAAM,GAAGN,MAAM,CAACO,IAAI,CAACF,KAAK,CAAC;MACjC,OAAQG,KAAK,CAACC,OAAO,CAACH,MAAM,CAAC,GAAGA,MAAM,GAAG,EAAE;IAC7C;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.resolveOptions = exports.pickBestCandidate = exports.isValidVin = exports.buildVinCandidates = void 0;
|
|
7
|
+
const DEFAULT_RESOLVED_OPTIONS = {
|
|
8
|
+
barcode: {
|
|
9
|
+
enabled: true,
|
|
10
|
+
formats: ['all']
|
|
11
|
+
},
|
|
12
|
+
text: {
|
|
13
|
+
enabled: true,
|
|
14
|
+
language: 'latin'
|
|
15
|
+
},
|
|
16
|
+
detection: {
|
|
17
|
+
resultMode: 'best',
|
|
18
|
+
preferBarcode: true,
|
|
19
|
+
validateChecksum: true,
|
|
20
|
+
emitDuplicates: false
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const resolveOptions = options => {
|
|
24
|
+
var _options$detection, _options$detection2, _options$barcode, _options$barcode2, _options$text, _options$text2, _options$detection3, _options$detection4;
|
|
25
|
+
const resultMode = (options === null || options === void 0 || (_options$detection = options.detection) === null || _options$detection === void 0 ? void 0 : _options$detection.resultMode) ?? DEFAULT_RESOLVED_OPTIONS.detection.resultMode;
|
|
26
|
+
const emitDuplicates = (options === null || options === void 0 || (_options$detection2 = options.detection) === null || _options$detection2 === void 0 ? void 0 : _options$detection2.emitDuplicates) ?? (resultMode === 'all' ? true : DEFAULT_RESOLVED_OPTIONS.detection.emitDuplicates);
|
|
27
|
+
return {
|
|
28
|
+
barcode: {
|
|
29
|
+
enabled: (options === null || options === void 0 || (_options$barcode = options.barcode) === null || _options$barcode === void 0 ? void 0 : _options$barcode.enabled) ?? DEFAULT_RESOLVED_OPTIONS.barcode.enabled,
|
|
30
|
+
formats: options !== null && options !== void 0 && (_options$barcode2 = options.barcode) !== null && _options$barcode2 !== void 0 && (_options$barcode2 = _options$barcode2.formats) !== null && _options$barcode2 !== void 0 && _options$barcode2.length ? [...options.barcode.formats] : [...DEFAULT_RESOLVED_OPTIONS.barcode.formats]
|
|
31
|
+
},
|
|
32
|
+
text: {
|
|
33
|
+
enabled: (options === null || options === void 0 || (_options$text = options.text) === null || _options$text === void 0 ? void 0 : _options$text.enabled) ?? DEFAULT_RESOLVED_OPTIONS.text.enabled,
|
|
34
|
+
language: (options === null || options === void 0 || (_options$text2 = options.text) === null || _options$text2 === void 0 ? void 0 : _options$text2.language) ?? DEFAULT_RESOLVED_OPTIONS.text.language
|
|
35
|
+
},
|
|
36
|
+
detection: {
|
|
37
|
+
resultMode,
|
|
38
|
+
preferBarcode: (options === null || options === void 0 || (_options$detection3 = options.detection) === null || _options$detection3 === void 0 ? void 0 : _options$detection3.preferBarcode) ?? DEFAULT_RESOLVED_OPTIONS.detection.preferBarcode,
|
|
39
|
+
validateChecksum: (options === null || options === void 0 || (_options$detection4 = options.detection) === null || _options$detection4 === void 0 ? void 0 : _options$detection4.validateChecksum) ?? DEFAULT_RESOLVED_OPTIONS.detection.validateChecksum,
|
|
40
|
+
emitDuplicates
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
exports.resolveOptions = resolveOptions;
|
|
45
|
+
const VIN_PATTERN = /^[A-HJ-NPR-Z0-9]{17}$/;
|
|
46
|
+
const transliteration = {
|
|
47
|
+
A: 1,
|
|
48
|
+
B: 2,
|
|
49
|
+
C: 3,
|
|
50
|
+
D: 4,
|
|
51
|
+
E: 5,
|
|
52
|
+
F: 6,
|
|
53
|
+
G: 7,
|
|
54
|
+
H: 8,
|
|
55
|
+
J: 1,
|
|
56
|
+
K: 2,
|
|
57
|
+
L: 3,
|
|
58
|
+
M: 4,
|
|
59
|
+
N: 5,
|
|
60
|
+
P: 7,
|
|
61
|
+
R: 9,
|
|
62
|
+
S: 2,
|
|
63
|
+
T: 3,
|
|
64
|
+
U: 4,
|
|
65
|
+
V: 5,
|
|
66
|
+
W: 6,
|
|
67
|
+
X: 7,
|
|
68
|
+
Y: 8,
|
|
69
|
+
Z: 9
|
|
70
|
+
};
|
|
71
|
+
const weights = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2];
|
|
72
|
+
const tokenizeCandidate = value => {
|
|
73
|
+
if (!value) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
const normalized = value.toUpperCase();
|
|
77
|
+
const cleaned = normalized.replace(/[^A-Z0-9]/g, ' ');
|
|
78
|
+
const tokens = cleaned.split(/\s+/).filter(token => token.length > 0);
|
|
79
|
+
const matches = new Set();
|
|
80
|
+
tokens.forEach(token => {
|
|
81
|
+
if (token.length < 17) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
for (let i = 0; i <= token.length - 17; i += 1) {
|
|
85
|
+
const candidate = token.slice(i, i + 17);
|
|
86
|
+
if (VIN_PATTERN.test(candidate)) {
|
|
87
|
+
matches.add(candidate);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
return Array.from(matches);
|
|
92
|
+
};
|
|
93
|
+
const isValidVin = value => {
|
|
94
|
+
if (!VIN_PATTERN.test(value)) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
const chars = value.split('');
|
|
98
|
+
let sum = 0;
|
|
99
|
+
for (let i = 0; i < chars.length; i += 1) {
|
|
100
|
+
const char = chars[i];
|
|
101
|
+
if (!char) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
const numeric = /^[0-9]$/.test(char) ? Number.parseInt(char, 10) : transliteration[char];
|
|
105
|
+
if (numeric === undefined) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
const weight = weights[i] ?? 0;
|
|
109
|
+
sum += numeric * weight;
|
|
110
|
+
}
|
|
111
|
+
const remainder = sum % 11;
|
|
112
|
+
const expected = remainder === 10 ? 'X' : remainder.toString();
|
|
113
|
+
const checkDigit = chars[8];
|
|
114
|
+
if (!checkDigit) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
return checkDigit === expected;
|
|
118
|
+
};
|
|
119
|
+
exports.isValidVin = isValidVin;
|
|
120
|
+
const toBoundingBox = (candidate, preferred) => {
|
|
121
|
+
if (!candidate) {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
if (preferred === 'barcode') {
|
|
125
|
+
const maybe = candidate;
|
|
126
|
+
if (typeof maybe.top === 'number' && typeof maybe.bottom === 'number' && typeof maybe.left === 'number' && typeof maybe.right === 'number') {
|
|
127
|
+
return {
|
|
128
|
+
top: maybe.top,
|
|
129
|
+
bottom: maybe.bottom,
|
|
130
|
+
left: maybe.left,
|
|
131
|
+
right: maybe.right,
|
|
132
|
+
width: maybe.width,
|
|
133
|
+
height: maybe.height
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const block = candidate;
|
|
138
|
+
const blockBox = typeof block.blockFrameTop === 'number' && typeof block.blockFrameBottom === 'number' && typeof block.blockFrameLeft === 'number' && typeof block.blockFrameRight === 'number' ? {
|
|
139
|
+
top: block.blockFrameTop,
|
|
140
|
+
bottom: block.blockFrameBottom,
|
|
141
|
+
left: block.blockFrameLeft,
|
|
142
|
+
right: block.blockFrameRight
|
|
143
|
+
} : undefined;
|
|
144
|
+
const lineBox = typeof block.lineFrameTop === 'number' && typeof block.lineFrameBottom === 'number' && typeof block.lineFrameLeft === 'number' && typeof block.lineFrameRight === 'number' ? {
|
|
145
|
+
top: block.lineFrameTop,
|
|
146
|
+
bottom: block.lineFrameBottom,
|
|
147
|
+
left: block.lineFrameLeft,
|
|
148
|
+
right: block.lineFrameRight
|
|
149
|
+
} : undefined;
|
|
150
|
+
const elementBox = typeof block.elementFrameTop === 'number' && typeof block.elementFrameBottom === 'number' && typeof block.elementFrameLeft === 'number' && typeof block.elementFrameRight === 'number' ? {
|
|
151
|
+
top: block.elementFrameTop,
|
|
152
|
+
bottom: block.elementFrameBottom,
|
|
153
|
+
left: block.elementFrameLeft,
|
|
154
|
+
right: block.elementFrameRight
|
|
155
|
+
} : undefined;
|
|
156
|
+
if (preferred === 'element' && elementBox) {
|
|
157
|
+
return elementBox;
|
|
158
|
+
}
|
|
159
|
+
if (preferred === 'line' && lineBox) {
|
|
160
|
+
return lineBox;
|
|
161
|
+
}
|
|
162
|
+
return blockBox || lineBox || elementBox;
|
|
163
|
+
};
|
|
164
|
+
const candidateFromBarcode = (detection, validateChecksum) => {
|
|
165
|
+
const values = new Set();
|
|
166
|
+
tokenizeCandidate(detection.rawValue ?? '').forEach(value => values.add(value));
|
|
167
|
+
tokenizeCandidate(detection.displayValue ?? '').forEach(value => values.add(value));
|
|
168
|
+
const boundingBox = toBoundingBox(detection, 'barcode');
|
|
169
|
+
return Array.from(values).map(value => {
|
|
170
|
+
const checksumValid = !validateChecksum || isValidVin(value);
|
|
171
|
+
return {
|
|
172
|
+
value,
|
|
173
|
+
source: 'barcode',
|
|
174
|
+
confidence: checksumValid ? 0.95 : 0.8,
|
|
175
|
+
boundingBox,
|
|
176
|
+
origin: detection.displayValue ? 'displayValue' : 'rawValue',
|
|
177
|
+
rawPayload: detection
|
|
178
|
+
};
|
|
179
|
+
});
|
|
180
|
+
};
|
|
181
|
+
const candidateFromText = (detection, validateChecksum) => {
|
|
182
|
+
const values = new Set();
|
|
183
|
+
[detection.lineText, detection.elementText, detection.blockText, detection.resultText].forEach(value => tokenizeCandidate(value ?? '').forEach(v => values.add(v)));
|
|
184
|
+
const boundingBox = toBoundingBox(detection, 'line') ?? toBoundingBox(detection, 'element') ?? toBoundingBox(detection, 'block');
|
|
185
|
+
return Array.from(values).map(value => {
|
|
186
|
+
const checksumValid = !validateChecksum || isValidVin(value);
|
|
187
|
+
return {
|
|
188
|
+
value,
|
|
189
|
+
source: 'text',
|
|
190
|
+
confidence: checksumValid ? 0.8 : 0.6,
|
|
191
|
+
boundingBox,
|
|
192
|
+
origin: detection.elementText ? 'element' : detection.lineText ? 'line' : 'block',
|
|
193
|
+
rawPayload: detection
|
|
194
|
+
};
|
|
195
|
+
});
|
|
196
|
+
};
|
|
197
|
+
const dedupeCandidates = candidates => {
|
|
198
|
+
const map = new Map();
|
|
199
|
+
candidates.forEach(candidate => {
|
|
200
|
+
var _candidate$boundingBo, _candidate$boundingBo2;
|
|
201
|
+
const key = [candidate.value, candidate.source, ((_candidate$boundingBo = candidate.boundingBox) === null || _candidate$boundingBo === void 0 ? void 0 : _candidate$boundingBo.top) ?? 'x', ((_candidate$boundingBo2 = candidate.boundingBox) === null || _candidate$boundingBo2 === void 0 ? void 0 : _candidate$boundingBo2.left) ?? 'y'].join(':');
|
|
202
|
+
const existing = map.get(key);
|
|
203
|
+
if (!existing || existing.confidence < candidate.confidence) {
|
|
204
|
+
map.set(key, candidate);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
return Array.from(map.values());
|
|
208
|
+
};
|
|
209
|
+
const buildVinCandidates = (payload, options) => {
|
|
210
|
+
const list = [];
|
|
211
|
+
if (options.barcode.enabled) {
|
|
212
|
+
(payload.barcodes ?? []).forEach(barcode => {
|
|
213
|
+
list.push(...candidateFromBarcode(barcode, options.detection.validateChecksum));
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
if (options.text.enabled) {
|
|
217
|
+
(payload.textBlocks ?? []).forEach(textBlock => {
|
|
218
|
+
list.push(...candidateFromText(textBlock, options.detection.validateChecksum));
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
return dedupeCandidates(list);
|
|
222
|
+
};
|
|
223
|
+
exports.buildVinCandidates = buildVinCandidates;
|
|
224
|
+
const pickBestCandidate = (candidates, options) => {
|
|
225
|
+
if (!candidates.length) {
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
const sorted = [...candidates].sort((a, b) => {
|
|
229
|
+
if (a.confidence !== b.confidence) {
|
|
230
|
+
return b.confidence - a.confidence;
|
|
231
|
+
}
|
|
232
|
+
if (options.detection.preferBarcode && a.source !== b.source) {
|
|
233
|
+
return a.source === 'barcode' ? -1 : 1;
|
|
234
|
+
}
|
|
235
|
+
return 0;
|
|
236
|
+
});
|
|
237
|
+
return sorted[0] ?? null;
|
|
238
|
+
};
|
|
239
|
+
exports.pickBestCandidate = pickBestCandidate;
|
|
240
|
+
//# sourceMappingURL=vinUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["DEFAULT_RESOLVED_OPTIONS","barcode","enabled","formats","text","language","detection","resultMode","preferBarcode","validateChecksum","emitDuplicates","resolveOptions","options","_options$detection","_options$detection2","_options$barcode","_options$barcode2","_options$text","_options$text2","_options$detection3","_options$detection4","length","exports","VIN_PATTERN","transliteration","A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z","weights","tokenizeCandidate","value","normalized","toUpperCase","cleaned","replace","tokens","split","filter","token","matches","Set","forEach","i","candidate","slice","test","add","Array","from","isValidVin","chars","sum","char","numeric","Number","parseInt","undefined","weight","remainder","expected","toString","checkDigit","toBoundingBox","preferred","maybe","top","bottom","left","right","width","height","block","blockBox","blockFrameTop","blockFrameBottom","blockFrameLeft","blockFrameRight","lineBox","lineFrameTop","lineFrameBottom","lineFrameLeft","lineFrameRight","elementBox","elementFrameTop","elementFrameBottom","elementFrameLeft","elementFrameRight","candidateFromBarcode","values","rawValue","displayValue","boundingBox","map","checksumValid","source","confidence","origin","rawPayload","candidateFromText","lineText","elementText","blockText","resultText","v","dedupeCandidates","candidates","Map","_candidate$boundingBo","_candidate$boundingBo2","key","join","existing","get","set","buildVinCandidates","payload","list","barcodes","push","textBlocks","textBlock","pickBestCandidate","sorted","sort","a","b"],"sourceRoot":"../../src","sources":["vinUtils.ts"],"mappings":"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","ignoreList":[]}
|