From 9d81e582ebbc5f8bf6d7b227479b2fe6214b1ba3 Mon Sep 17 00:00:00 2001 From: Alexander Ivchenko <47615361+TravellerOnTheRun@users.noreply.github.com> Date: Thu, 10 Nov 2022 15:08:49 +0400 Subject: [PATCH] US-1146 QR code scanner replacement (#335) * chore: add react-native-vision-camera package * chore: add react-native-reanimated package * refactor: change rn-camera to rn-vision-camera Co-authored-by: Alexander Evchenko Co-authored-by: Jesse Clark --- babel.config.js | 8 ++ ios/Podfile.lock | 129 +++++++++++++++++++++++++ ios/sWallet.xcodeproj/project.pbxproj | 3 +- ios/sWallet/Info.plist | 2 +- package.json | 5 +- src/components/QRCodeScanner/index.tsx | 75 ++++++++------ src/components/qrScanner/index.tsx | 48 --------- yarn.lock | 42 +++++++- 8 files changed, 231 insertions(+), 81 deletions(-) delete mode 100644 src/components/qrScanner/index.tsx diff --git a/babel.config.js b/babel.config.js index cf1f9fbbc..1c0ced2fc 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,3 +1,11 @@ module.exports = { presets: ['module:metro-react-native-babel-preset'], + plugins: [ + [ + 'react-native-reanimated/plugin', + { + globals: ['__scanCodes'], + }, + ], + ], } diff --git a/ios/Podfile.lock b/ios/Podfile.lock index a294bd2c7..eb2986a9c 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -75,14 +75,71 @@ PODS: - FlipperKit/FlipperKitNetworkPlugin - fmt (6.2.1) - glog (0.3.5) + - GoogleDataTransport (9.2.0): + - GoogleUtilities/Environment (~> 7.7) + - nanopb (< 2.30910.0, >= 2.30908.0) + - PromisesObjC (< 3.0, >= 1.2) + - GoogleMLKit/BarcodeScanning (3.2.0): + - GoogleMLKit/MLKitCore + - MLKitBarcodeScanning (~> 2.2.0) + - GoogleMLKit/MLKitCore (3.2.0): + - MLKitCommon (~> 8.0.0) + - GoogleToolboxForMac/DebugUtils (2.3.2): + - GoogleToolboxForMac/Defines (= 2.3.2) + - GoogleToolboxForMac/Defines (2.3.2) + - GoogleToolboxForMac/Logger (2.3.2): + - GoogleToolboxForMac/Defines (= 2.3.2) + - "GoogleToolboxForMac/NSData+zlib (2.3.2)": + - GoogleToolboxForMac/Defines (= 2.3.2) + - "GoogleToolboxForMac/NSDictionary+URLArguments (2.3.2)": + - GoogleToolboxForMac/DebugUtils (= 2.3.2) + - GoogleToolboxForMac/Defines (= 2.3.2) + - "GoogleToolboxForMac/NSString+URLArguments (= 2.3.2)" + - "GoogleToolboxForMac/NSString+URLArguments (2.3.2)" + - GoogleUtilities/Environment (7.8.0): + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.8.0): + - GoogleUtilities/Environment + - GoogleUtilities/UserDefaults (7.8.0): + - GoogleUtilities/Logger + - GoogleUtilitiesComponents (1.1.0): + - GoogleUtilities/Logger + - GTMSessionFetcher/Core (1.7.2) - hermes-engine (0.70.3) - jail-monkey (2.7.0): - React-Core - libevent (2.1.12) + - MLImage (1.0.0-beta3) + - MLKitBarcodeScanning (2.2.0): + - MLKitCommon (~> 8.0) + - MLKitVision (~> 4.2) + - MLKitCommon (8.0.0): + - GoogleDataTransport (~> 9.0) + - GoogleToolboxForMac/Logger (~> 2.1) + - "GoogleToolboxForMac/NSData+zlib (~> 2.1)" + - "GoogleToolboxForMac/NSDictionary+URLArguments (~> 2.1)" + - GoogleUtilities/UserDefaults (~> 7.0) + - GoogleUtilitiesComponents (~> 1.0) + - GTMSessionFetcher/Core (~> 1.1) + - Protobuf (~> 3.12) + - MLKitVision (4.2.0): + - GoogleToolboxForMac/Logger (~> 2.1) + - "GoogleToolboxForMac/NSData+zlib (~> 2.1)" + - GTMSessionFetcher/Core (~> 1.1) + - MLImage (= 1.0.0-beta3) + - MLKitCommon (~> 8.0) + - Protobuf (~> 3.12) - MMKV (1.2.14): - MMKVCore (~> 1.2.14) - MMKVCore (1.2.14) + - nanopb (2.30909.0): + - nanopb/decode (= 2.30909.0) + - nanopb/encode (= 2.30909.0) + - nanopb/decode (2.30909.0) + - nanopb/encode (2.30909.0) - OpenSSL-Universal (1.1.1100) + - PromisesObjC (2.1.1) + - Protobuf (3.21.9) - RCT-Folly (2021.07.22.00): - boost - DoubleConversion @@ -400,11 +457,45 @@ PODS: - React-Core - RNGestureHandler (2.8.0): - React-Core + - RNReanimated (2.12.0): + - DoubleConversion + - FBLazyVector + - FBReactNativeSpec + - glog + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-callinvoker + - React-Core + - React-Core/DevSupport + - React-Core/RCTWebSocket + - React-CoreModules + - React-cxxreact + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-RCTActionSheet + - React-RCTAnimation + - React-RCTBlob + - React-RCTImage + - React-RCTLinking + - React-RCTNetwork + - React-RCTSettings + - React-RCTText + - ReactCommon/turbomodule/core + - Yoga - RNSVG (12.4.3): - React-Core - RNVectorIcons (9.2.0): - React-Core - SocketRocket (0.6.0) + - vision-camera-code-scanner (0.2.0): + - GoogleMLKit/BarcodeScanning + - React-Core + - VisionCamera (2.15.2): + - React + - React-callinvoker + - React-Core - Yoga (1.14.0) - YogaKit (1.18.1): - Yoga (~> 1.14) @@ -479,8 +570,11 @@ DEPENDENCIES: - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" - "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)" - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) + - RNReanimated (from `../node_modules/react-native-reanimated`) - RNSVG (from `../node_modules/react-native-svg`) - RNVectorIcons (from `../node_modules/react-native-vector-icons`) + - vision-camera-code-scanner (from `../node_modules/vision-camera-code-scanner`) + - VisionCamera (from `../node_modules/react-native-vision-camera`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: @@ -496,10 +590,23 @@ SPEC REPOS: - Flipper-RSocket - FlipperKit - fmt + - GoogleDataTransport + - GoogleMLKit + - GoogleToolboxForMac + - GoogleUtilities + - GoogleUtilitiesComponents + - GTMSessionFetcher - libevent + - MLImage + - MLKitBarcodeScanning + - MLKitCommon + - MLKitVision - MMKV - MMKVCore + - nanopb - OpenSSL-Universal + - PromisesObjC + - Protobuf - SocketRocket - YogaKit @@ -592,10 +699,16 @@ EXTERNAL SOURCES: :path: "../node_modules/@react-native-community/clipboard" RNGestureHandler: :path: "../node_modules/react-native-gesture-handler" + RNReanimated: + :path: "../node_modules/react-native-reanimated" RNSVG: :path: "../node_modules/react-native-svg" RNVectorIcons: :path: "../node_modules/react-native-vector-icons" + vision-camera-code-scanner: + :path: "../node_modules/vision-camera-code-scanner" + VisionCamera: + :path: "../node_modules/react-native-vision-camera" Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" @@ -617,12 +730,25 @@ SPEC CHECKSUMS: FlipperKit: cbdee19bdd4e7f05472a66ce290f1b729ba3cb86 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b + GoogleDataTransport: 1c8145da7117bd68bbbed00cf304edb6a24de00f + GoogleMLKit: 0017a6a8372e1a182139b9def4d89be5d87ca5a7 + GoogleToolboxForMac: 8bef7c7c5cf7291c687cf5354f39f9db6399ad34 + GoogleUtilities: 1d20a6ad97ef46f67bbdec158ce00563a671ebb7 + GoogleUtilitiesComponents: 679b2c881db3b615a2777504623df6122dd20afe + GTMSessionFetcher: 5595ec75acf5be50814f81e9189490412bad82ba hermes-engine: bb344d89a0d14c2c91ad357480a79698bb80e186 jail-monkey: de7eab0c9cbe4e7cdd2f80d04f812337ae94b2e0 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 + MLImage: 489dfec109f21da8621b28d476401aaf7a0d4ff4 + MLKitBarcodeScanning: d92fe1911001ec36870162c5a0eb206f612b7169 + MLKitCommon: f6da6c5659618c070b50a80db01248ebe2964175 + MLKitVision: 96c96571190b7f63eddf4a12068ce8a8689e0d2c MMKV: 9c4663aa7ca255d478ff10f2f5cb7d17c1651ccd MMKVCore: 89f5c8a66bba2dcd551779dea4d412eeec8ff5bb + nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431 OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c + PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb + Protobuf: 02524ec14183fe08fb259741659e79683788158b RCT-Folly: 0080d0a6ebf2577475bda044aa59e2ca1f909cda RCTRequired: 5cf7e7d2f12699724b59f90350257a422eaa9492 RCTTypeSafety: 3f3ead9673d1ab8bb1aea85b0894ab3220f8f06e @@ -659,9 +785,12 @@ SPEC CHECKSUMS: RNCAsyncStorage: d81ee5c3db1060afd49ea7045ad460eff82d2b7d RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495 RNGestureHandler: 62232ba8f562f7dea5ba1b3383494eb5bf97a4d3 + RNReanimated: 2a91e85fcd343f8af3c58d3425b99fdd285590a5 RNSVG: f3b60aeeaa81960e2e0536c3a9eef50b667ef3a9 RNVectorIcons: fcc2f6cb32f5735b586e66d14103a74ce6ad61f8 SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608 + vision-camera-code-scanner: dda884a7f3ec8243a2a6d6489b91860648371bca + VisionCamera: 4cfd685b1e671fea4aa0400905ab397f0e972210 Yoga: 2ed968a4f060a92834227c036279f2736de0fce3 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a diff --git a/ios/sWallet.xcodeproj/project.pbxproj b/ios/sWallet.xcodeproj/project.pbxproj index 716617707..8ba059b17 100644 --- a/ios/sWallet.xcodeproj/project.pbxproj +++ b/ios/sWallet.xcodeproj/project.pbxproj @@ -509,7 +509,7 @@ DEVELOPMENT_TEAM = 3YDAH8ZR7C; ENABLE_BITCODE = YES; EXCLUDED_ARCHS = ""; - "EXCLUDED_ARCHS[sdk=*]" = arm64; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; INFOPLIST_FILE = sWallet/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = ( @@ -538,6 +538,7 @@ CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 3YDAH8ZR7C; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; INFOPLIST_FILE = sWallet/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = ( diff --git a/ios/sWallet/Info.plist b/ios/sWallet/Info.plist index b47ee5447..3e612120a 100644 --- a/ios/sWallet/Info.plist +++ b/ios/sWallet/Info.plist @@ -36,7 +36,7 @@ NSCameraUsageDescription - The app will use the camera to operate with Wallet Connect + $PRODUCT_NAME will use the camera to operate with Wallet Connect NSLocationWhenInUseUsageDescription NSPhotoLibraryUsageDescription diff --git a/package.json b/package.json index 6fc86122d..9d0eb5c9c 100644 --- a/package.json +++ b/package.json @@ -65,19 +65,22 @@ "react-native-modal": "^13.0.1", "react-native-progress": "^5.0.0", "react-native-randombytes": "^3.0.0", + "react-native-reanimated": "^2.12.0", "react-native-safe-area-context": "^4.4.1", "react-native-snap-carousel": "^3.9.1", "react-native-svg": "^12.1.1", "react-native-swipe-modal-up-down": "^1.1.0", "react-native-uuid": "^2.0.1", "react-native-vector-icons": "^9.1.0", + "react-native-vision-camera": "^2.15.2", "react-native-webview": "^11.14.3", "react-qr-code": "^2.0.2", "react-redux": "^8.0.5", "readable-stream": "1.0.33", "socket.io-client": "^4.4.1", "stream-browserify": "^1.0.0", - "url-parse": "^1.5.9" + "url-parse": "^1.5.9", + "vision-camera-code-scanner": "^0.2.0" }, "devDependencies": { "@babel/core": "^7.12.9", diff --git a/src/components/QRCodeScanner/index.tsx b/src/components/QRCodeScanner/index.tsx index c1b84bfc9..3e26c4c49 100644 --- a/src/components/QRCodeScanner/index.tsx +++ b/src/components/QRCodeScanner/index.tsx @@ -1,40 +1,59 @@ -import React from 'react' -import { Modal, StyleSheet } from 'react-native' -// import BarcodeMask from 'react-native-barcode-mask' -// import { BarCodeReadEvent, RNCamera } from 'react-native-camera' -// import Icon from 'react-native-vector-icons/Ionicons' -// import { colors } from '../../styles' +import React, { useCallback, useEffect } from 'react' +import { + ActivityIndicator, + Linking, + Modal, + StyleSheet, + View, +} from 'react-native' +import BarcodeMask from 'react-native-barcode-mask' +import { Camera, useCameraDevices } from 'react-native-vision-camera' +import { useScanBarcodes, BarcodeFormat } from 'vision-camera-code-scanner' +import Icon from 'react-native-vector-icons/Ionicons' +import { colors } from '../../styles' interface QRCodeScannerProps { onClose: () => void onCodeRead: (data: string) => void } -export const QRCodeScanner = (_: QRCodeScannerProps) => { - // const cameraRef = useRef(null) +export const QRCodeScanner = ({ onClose, onCodeRead }: QRCodeScannerProps) => { + const device = useCameraDevices('wide-angle-camera').back + const [frameProcessor, barcodes] = useScanBarcodes([BarcodeFormat.QR_CODE], { + checkInverted: true, + }) - // const onBarCodeRead = (event: BarCodeReadEvent) => { - // // @ts-ignore - // if (event.type === 'QR_CODE') { - // onCodeRead(decodeURIComponent(event.data)) - // } - // } + const permissionHandler = useCallback(async () => { + const cameraPermission = await Camera.getCameraPermissionStatus() + if (cameraPermission === 'not-determined') { + await Camera.requestCameraPermission() + } else if (cameraPermission === 'denied') { + Linking.openSettings() + } + }, []) + + useEffect(() => { + permissionHandler() + }, []) + + useEffect(() => { + if (barcodes && barcodes[0] && barcodes[0].rawValue) { + onCodeRead(barcodes[0].rawValue) + } + }, [barcodes]) + + if (device == null) { + return + } return ( - {/* + { borderRadius={40} /> - */} + ) } diff --git a/src/components/qrScanner/index.tsx b/src/components/qrScanner/index.tsx deleted file mode 100644 index 4371dfde1..000000000 --- a/src/components/qrScanner/index.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import React from 'react' -import { Dimensions, StyleSheet } from 'react-native' - -import { BarCodeReadEvent, RNCamera } from 'react-native-camera' - -type Props = { - onBarCodeRead: (event: BarCodeReadEvent) => Promise | void -} - -const QRScanner = ({ onBarCodeRead }: Props) => { - const cameraRef = React.useRef(null) - - const windowWidth = Dimensions.get('window').width - const qrCodeSize = windowWidth * 0.9 - - return ( - - ) -} - -const styles = StyleSheet.create({ - preview: { - flex: 1, - justifyContent: 'flex-end', - alignItems: 'center', - }, -}) - -export default QRScanner diff --git a/yarn.lock b/yarn.lock index 2588e0088..4e13b12a7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -713,7 +713,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.19.0" "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-transform-object-assign@^7.0.0": +"@babel/plugin-transform-object-assign@^7.0.0", "@babel/plugin-transform-object-assign@^7.16.7": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.18.6.tgz#7830b4b6f83e1374a5afb9f6111bcfaea872cdd2" integrity sha512-mQisZ3JfqWh2gVXvfqYCAAyRs6+7oev+myBsTwW5RnPhYXOTuCEw2oe3YgxlXMViXUS53lG8koulI7mJ+8JE+A== @@ -849,7 +849,7 @@ "@babel/helper-validator-option" "^7.18.6" "@babel/plugin-transform-flow-strip-types" "^7.18.6" -"@babel/preset-typescript@^7.1.0", "@babel/preset-typescript@^7.13.0": +"@babel/preset-typescript@^7.1.0", "@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.16.7": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== @@ -2271,6 +2271,11 @@ "@types/react" "*" hoist-non-react-statics "^3.3.0" +"@types/invariant@^2.2.35": + version "2.2.35" + resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.35.tgz#cd3ebf581a6557452735688d8daba6cf0bd5a3be" + integrity sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg== + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" @@ -6704,6 +6709,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -8185,6 +8195,19 @@ react-native-randombytes@^3.0.0: buffer "^4.9.1" sjcl "^1.0.3" +react-native-reanimated@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-2.12.0.tgz#5821eecfb1769b1617a67a2d4dec12fdeedb2b6e" + integrity sha512-nrlPyw+Hx9u4iJhZk9PoTvDo/QmVAd+bo7OK9Tv3hveNEF9++5oig/g3Uv9V93shy9avTYGsUprUvAEt/xdzeQ== + dependencies: + "@babel/plugin-transform-object-assign" "^7.16.7" + "@babel/preset-typescript" "^7.16.7" + "@types/invariant" "^2.2.35" + invariant "^2.2.4" + lodash.isequal "^4.5.0" + setimmediate "^1.0.5" + string-hash-64 "^1.0.3" + react-native-safe-area-context@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.4.1.tgz#239c60b8a9a80eac70a38a822b04c0f1d15ffc01" @@ -8224,6 +8247,11 @@ react-native-vector-icons@^9.1.0: prop-types "^15.7.2" yargs "^16.1.1" +react-native-vision-camera@^2.15.2: + version "2.15.2" + resolved "https://registry.yarnpkg.com/react-native-vision-camera/-/react-native-vision-camera-2.15.2.tgz#96a17c8b4e557df317734897853a861e0cfbc3ed" + integrity sha512-pkVj0r2nbZaj3+bB9CGPNistCUyoCgS2SmawzugrZs5oMlFWlgZYuJj+6s3Q98xTGgV/8/ST0njohB6soDi0VA== + react-native-webview@^11.14.3: version "11.23.0" resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-11.23.0.tgz#603a584236da2e993906e6a094f165dcac3a1fdb" @@ -9106,6 +9134,11 @@ strict-uri-encode@^2.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== +string-hash-64@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string-hash-64/-/string-hash-64-1.0.3.tgz#0deb56df58678640db5c479ccbbb597aaa0de322" + integrity sha512-D5OKWKvDhyVWWn2x5Y9b+37NUllks34q1dCDhk/vYcso9fmhs+Tl3KR/gE4v5UNj2UA35cnX4KdVVGkG1deKqw== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -9606,6 +9639,11 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +vision-camera-code-scanner@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/vision-camera-code-scanner/-/vision-camera-code-scanner-0.2.0.tgz#8adc0694319a17f6a95f6dfacc02ab7ac29b4742" + integrity sha512-H5hVkXfbIcGdg9YlhuS8Y/xDX5e32Vo6eK5FyDQsE9AGVjlqEHMmSLHZg7BX8UUm4ADmiAZc8wzc4n8TUqGr0g== + vlq@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468"