diff --git a/android/app/build.gradle b/android/app/build.gradle index 42d471a2e..b0c15a0b0 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,7 +1,8 @@ apply plugin: 'com.android.application' android { - compileSdkVersion rootProject.ext.compileSdkVersion + namespace "io.scanbot.example.sdk.capacitor.ionic.react" + compileSdk rootProject.ext.compileSdkVersion defaultConfig { applicationId "io.scanbot.example.sdk.capacitor.ionic.react" minSdkVersion rootProject.ext.minSdkVersion diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle index de46aef08..fdbbccb9c 100644 --- a/android/app/capacitor.build.gradle +++ b/android/app/capacitor.build.gradle @@ -2,8 +2,8 @@ android { compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } } @@ -11,12 +11,14 @@ apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" dependencies { implementation project(':capacitor-app') implementation project(':capacitor-camera') + implementation project(':capacitor-filesystem') implementation project(':capacitor-haptics') implementation project(':capacitor-keyboard') implementation project(':capacitor-status-bar') + implementation project(':capacitor-plugin-scanbot-sdk') } -apply from: "../../node_modules/cordova-plugin-scanbot-sdk/src/android/build-extras-sb.gradle" + if (hasProperty('postBuildExtras')) { postBuildExtras() diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 31a4d076e..24a892187 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + + android:theme="@style/AppTheme" + android:largeHeap="true"> + - - diff --git a/android/app/src/main/assets/ocr_blobs/deu.traineddata b/android/app/src/main/assets/ocr_blobs/deu.traineddata index 97ed7b2b6..af9cc9166 100644 Binary files a/android/app/src/main/assets/ocr_blobs/deu.traineddata and b/android/app/src/main/assets/ocr_blobs/deu.traineddata differ diff --git a/android/app/src/main/assets/ocr_blobs/eng.traineddata b/android/app/src/main/assets/ocr_blobs/eng.traineddata old mode 100755 new mode 100644 index bbef46750..561883fac Binary files a/android/app/src/main/assets/ocr_blobs/eng.traineddata and b/android/app/src/main/assets/ocr_blobs/eng.traineddata differ diff --git a/android/app/src/main/assets/ocr_blobs/osd.traineddata b/android/app/src/main/assets/ocr_blobs/osd.traineddata old mode 100755 new mode 100644 diff --git a/android/build.gradle b/android/build.gradle index fe3625eca..85a5dda2d 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -7,8 +7,8 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.2.1' - classpath 'com.google.gms:google-services:4.3.13' + classpath 'com.android.tools.build:gradle:8.2.1' + classpath 'com.google.gms:google-services:4.4.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/android/capacitor.settings.gradle b/android/capacitor.settings.gradle index e968608a9..442318724 100644 --- a/android/capacitor.settings.gradle +++ b/android/capacitor.settings.gradle @@ -8,6 +8,9 @@ project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/ include ':capacitor-camera' project(':capacitor-camera').projectDir = new File('../node_modules/@capacitor/camera/android') +include ':capacitor-filesystem' +project(':capacitor-filesystem').projectDir = new File('../node_modules/@capacitor/filesystem/android') + include ':capacitor-haptics' project(':capacitor-haptics').projectDir = new File('../node_modules/@capacitor/haptics/android') @@ -16,3 +19,6 @@ project(':capacitor-keyboard').projectDir = new File('../node_modules/@capacitor include ':capacitor-status-bar' project(':capacitor-status-bar').projectDir = new File('../node_modules/@capacitor/status-bar/android') + +include ':capacitor-plugin-scanbot-sdk' +project(':capacitor-plugin-scanbot-sdk').projectDir = new File('../node_modules/capacitor-plugin-scanbot-sdk/android') diff --git a/android/gradle.properties b/android/gradle.properties index 0566c221d..2e87c52f8 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -20,5 +20,3 @@ org.gradle.jvmargs=-Xmx1536m # Android operating system, and which are packaged with your app's APK # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true -# Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar index 41d9927a4..033e24c4c 100644 Binary files a/android/gradle/wrapper/gradle-wrapper.jar and b/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 92f06b50f..c747538fb 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/android/gradlew b/android/gradlew index 1b6c78733..fcb6fca14 100755 --- a/android/gradlew +++ b/android/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +130,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,6 +197,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in @@ -205,6 +213,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/android/gradlew.bat b/android/gradlew.bat index 107acd32c..6689b85be 100644 --- a/android/gradlew.bat +++ b/android/gradlew.bat @@ -1,89 +1,92 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/variables.gradle b/android/variables.gradle index 777bd7e87..8ef305d0d 100644 --- a/android/variables.gradle +++ b/android/variables.gradle @@ -1,16 +1,16 @@ ext { minSdkVersion = 22 - compileSdkVersion = 32 - targetSdkVersion = 32 - androidxActivityVersion = '1.4.0' - androidxAppCompatVersion = '1.4.2' + compileSdkVersion = 34 + targetSdkVersion = 34 + androidxActivityVersion = '1.8.0' + androidxAppCompatVersion = '1.6.1' androidxCoordinatorLayoutVersion = '1.2.0' - androidxCoreVersion = '1.8.0' - androidxFragmentVersion = '1.4.1' - coreSplashScreenVersion = '1.0.0-rc01' - androidxWebkitVersion = '1.4.0' + androidxCoreVersion = '1.12.0' + androidxFragmentVersion = '1.6.2' + coreSplashScreenVersion = '1.0.1' + androidxWebkitVersion = '1.9.0' junitVersion = '4.13.2' - androidxJunitVersion = '1.1.3' - androidxEspressoCoreVersion = '3.4.0' + androidxJunitVersion = '1.1.5' + androidxEspressoCoreVersion = '3.5.1' cordovaAndroidVersion = '10.1.1' } \ No newline at end of file diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj index 56c3b8ae3..7cff489a7 100644 --- a/ios/App/App.xcodeproj/project.pbxproj +++ b/ios/App/App.xcodeproj/project.pbxproj @@ -109,7 +109,7 @@ 504EC3011FED79650016851F /* Frameworks */, 504EC3021FED79650016851F /* Resources */, 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */, - AE98080F240842D017FDE6C6 /* [CP] Copy Pods Resources */, + B5B63480957AB0D1C79CC4B7 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -205,7 +205,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - AE98080F240842D017FDE6C6 /* [CP] Copy Pods Resources */ = { + B5B63480957AB0D1C79CC4B7 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( diff --git a/ios/App/Podfile b/ios/App/Podfile index 4001b05ed..49e4ae961 100644 --- a/ios/App/Podfile +++ b/ios/App/Podfile @@ -13,10 +13,11 @@ def capacitor_pods pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app' pod 'CapacitorCamera', :path => '../../node_modules/@capacitor/camera' + pod 'CapacitorFilesystem', :path => '../../node_modules/@capacitor/filesystem' pod 'CapacitorHaptics', :path => '../../node_modules/@capacitor/haptics' pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard' pod 'CapacitorStatusBar', :path => '../../node_modules/@capacitor/status-bar' - pod 'CordovaPluginsStatic', :path => '../capacitor-cordova-ios-plugins' + pod 'CapacitorPluginScanbotSdk', :path => '../../node_modules/capacitor-plugin-scanbot-sdk' end target 'App' do diff --git a/package-lock.json b/package-lock.json index 23115a41c..2f19d9c08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,49 +9,50 @@ "version": "0.0.1", "dependencies": { "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@capacitor/android": "4.6.1", - "@capacitor/app": "4.1.1", - "@capacitor/camera": "^4.1.4", - "@capacitor/core": "4.6.1", - "@capacitor/haptics": "4.1.0", - "@capacitor/ios": "4.6.1", - "@capacitor/keyboard": "4.1.0", - "@capacitor/status-bar": "4.1.1", - "@ionic/react": "^6.0.0", - "@ionic/react-router": "^6.0.0", - "@testing-library/jest-dom": "^5.11.9", - "@testing-library/react": "^13.3.0", - "@testing-library/user-event": "^12.6.3", - "@types/jest": "^26.0.20", - "@types/node": "^12.19.15", - "@types/react": "^18.0.17", - "@types/react-dom": "^18.0.6", - "@types/react-router": "^5.1.11", - "@types/react-router-dom": "^5.1.7", - "cordova-plugin-scanbot-sdk": "^4.17.3", - "history": "^4.9.0", - "ionicons": "^6.0.3", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router": "^5.2.0", - "react-router-dom": "^5.2.0", - "typescript": "^4.1.3", - "web-vitals": "^0.2.4", - "workbox-background-sync": "^5.1.4", - "workbox-broadcast-update": "^5.1.4", - "workbox-cacheable-response": "^5.1.4", - "workbox-core": "^5.1.4", - "workbox-expiration": "^5.1.4", - "workbox-google-analytics": "^5.1.4", - "workbox-navigation-preload": "^5.1.4", - "workbox-precaching": "^5.1.4", - "workbox-range-requests": "^5.1.4", - "workbox-routing": "^5.1.4", - "workbox-strategies": "^5.1.4", - "workbox-streams": "^5.1.4" + "@capacitor/android": "6.1.2", + "@capacitor/app": "6.0.1", + "@capacitor/camera": "^6.0.2", + "@capacitor/core": "6.1.2", + "@capacitor/filesystem": "^6.0.1", + "@capacitor/haptics": "6.0.1", + "@capacitor/ios": "6.1.2", + "@capacitor/keyboard": "6.0.2", + "@capacitor/status-bar": "6.0.1", + "@ionic/react": "^8.2.7", + "@ionic/react-router": "^8.2.7", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", + "@testing-library/user-event": "^14.5.2", + "@types/jest": "^29.5.12", + "@types/node": "^22.5.1", + "@types/react": "^18.3.4", + "@types/react-dom": "^18.3.0", + "@types/react-router": "^5.1.20", + "@types/react-router-dom": "^5.3.3", + "capacitor-plugin-scanbot-sdk": "^5.1.0", + "history": "^5.3.0", + "ionicons": "^7.4.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router": "^5.0.1", + "react-router-dom": "^5.0.1", + "typescript": "^3.2.1", + "web-vitals": "^4.2.3", + "workbox-background-sync": "^7.1.0", + "workbox-broadcast-update": "^7.1.0", + "workbox-cacheable-response": "^7.1.0", + "workbox-core": "^7.1.0", + "workbox-expiration": "^7.1.0", + "workbox-google-analytics": "^7.1.0", + "workbox-navigation-preload": "^7.1.0", + "workbox-precaching": "^7.1.0", + "workbox-range-requests": "^7.1.0", + "workbox-routing": "^7.1.0", + "workbox-strategies": "^7.1.0", + "workbox-streams": "^7.1.0" }, "devDependencies": { - "@capacitor/cli": "4.6.1", + "@capacitor/cli": "6.1.2", "react-scripts": "5.0.1" } }, @@ -65,9 +66,9 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", - "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==" + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", + "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==" }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", @@ -2716,59 +2717,69 @@ "dev": true }, "node_modules/@capacitor/android": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-4.6.1.tgz", - "integrity": "sha512-Hnh1tmUr1SP67U6D6ry5I5BEBSN/1nkBAIjQIqf5tF82WNxKbpbC6GfkHE4hMJZinRTrCf36LkrdP8srh7SxoA==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-6.1.2.tgz", + "integrity": "sha512-Yh0gQDY1bgRrL25J6ecIlvvs2kF8iNSwIPXjyw6Yz9mnwYxBazF5KZbjpKtGPnJgicJhFkYGsqOkEtxrve0EoQ==", "peerDependencies": { - "@capacitor/core": "^4.6.0" + "@capacitor/core": "^6.1.0" } }, "node_modules/@capacitor/app": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-4.1.1.tgz", - "integrity": "sha512-SJcJA1rhFQyeH6eLfUEbdKkHzAwzahJNVPNXmU88fdmXpMgM2dJGzZj1vrm6e21aQq+Z4aBVLJ2RCdj92zD7wg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-6.0.1.tgz", + "integrity": "sha512-0kXbOl7LPPMFVcAii3u/7Ps0DvXlr7dtHT97r9J1faDlgdQLQUvtGp48tjvFm48gqHI0aOPRJnTBr5JXW4ETYg==", "peerDependencies": { - "@capacitor/core": "^4.0.0" + "@capacitor/core": "^6.0.0" } }, "node_modules/@capacitor/camera": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@capacitor/camera/-/camera-4.1.5.tgz", - "integrity": "sha512-E00IRsJiIr1kP3EkJa0OWp//TDFXOx3ifDfmLOmIkPxKt1FfuNheE0ipWBo5b44pKsx9pO64Rm9MkfUhgH5Rfg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@capacitor/camera/-/camera-6.0.2.tgz", + "integrity": "sha512-bC2xxCcNTyfKYuLNLbGIyLlK9fok2MDhF4v8s01jusYAxoBI7LaKWQMQoGBA1MY/Ec6x/2pjIr+7k89Kmdr74g==", "peerDependencies": { - "@capacitor/core": "^4.0.0" + "@capacitor/core": "^6.0.0" } }, "node_modules/@capacitor/cli": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-4.6.1.tgz", - "integrity": "sha512-iFMK83B67RXEQyWi1kOzQmRdCFc/pPD924mjAXG7yFLVyMvVRGAwwf8LzWFzHyQDoKK+auPMHycVfzm9T6Iyyg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-6.1.2.tgz", + "integrity": "sha512-HKCNGE0RP8U7aiEF2vg5wTivJROS8BVfu8a3yYJb1mRQvzv+czpmtHNsTWS/WukvwoxUjyjRmsNQSAACHfMTmQ==", "dev": true, "dependencies": { "@ionic/cli-framework-output": "^2.2.5", "@ionic/utils-fs": "^3.1.6", - "@ionic/utils-subprocess": "^2.1.11", + "@ionic/utils-process": "^2.1.11", + "@ionic/utils-subprocess": "2.1.11", "@ionic/utils-terminal": "^2.3.3", "commander": "^9.3.0", "debug": "^4.3.4", "env-paths": "^2.2.0", "kleur": "^4.1.4", - "native-run": "^1.6.0", + "native-run": "^2.0.0", "open": "^8.4.0", "plist": "^3.0.5", "prompts": "^2.4.2", - "rimraf": "^3.0.2", + "rimraf": "^4.4.1", "semver": "^7.3.7", "tar": "^6.1.11", "tslib": "^2.4.0", - "xml2js": "^0.4.23" + "xml2js": "^0.5.0" }, "bin": { "cap": "bin/capacitor", "capacitor": "bin/capacitor" }, "engines": { - "node": ">=12.4.0" + "node": ">=18.0.0" + } + }, + "node_modules/@capacitor/cli/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" } }, "node_modules/@capacitor/cli/node_modules/commander": { @@ -2780,6 +2791,24 @@ "node": "^12.20.0 || >=14" } }, + "node_modules/@capacitor/cli/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@capacitor/cli/node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -2789,44 +2818,94 @@ "node": ">=6" } }, + "node_modules/@capacitor/cli/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@capacitor/cli/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@capacitor/cli/node_modules/rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dev": true, + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@capacitor/core": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-4.6.1.tgz", - "integrity": "sha512-7A2IV9E8umgu9u0fChUTjQJq+Jp25GJZMmWxoQN/nVx/1rcpFJ4m1xo3NPBoIRs+aV7FR+BM17mPrnkKlA8N2g==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-6.1.2.tgz", + "integrity": "sha512-xFy1/4qLFLp5WCIzIhtwUuVNNoz36+V7/BzHmLqgVJcvotc4MMjswW/TshnPQaLLujEOaLkA4h8ZJ0uoK3ImGg==", "dependencies": { "tslib": "^2.1.0" } }, + "node_modules/@capacitor/filesystem": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/filesystem/-/filesystem-6.0.1.tgz", + "integrity": "sha512-eHhXm6tzBIQhErzFnfOE6eA1U+15DHc2212/COfzzGGRk/dyGympoVV3ct2YPVzvpTSxMEW3xFocORv/xD9gFg==", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, "node_modules/@capacitor/haptics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@capacitor/haptics/-/haptics-4.1.0.tgz", - "integrity": "sha512-gAIFy50e1VZPdokRFLkl8Y+yZYB3e4brd5yu9DRShbWbheruwU34TxtG5C1NANvq4mbXd3tMXzBi59Q5JFyTHA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/haptics/-/haptics-6.0.1.tgz", + "integrity": "sha512-Q8hedLwfwTSWEYc3eoATzkdKHBaIceYe5bd7FjxQCENNH0is5Ft0EjSRPz/xpTn39ebK0ooZBDBCwsyl6tjiTA==", "peerDependencies": { - "@capacitor/core": "^4.0.0" + "@capacitor/core": "^6.0.0" } }, "node_modules/@capacitor/ios": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-4.6.1.tgz", - "integrity": "sha512-kH1nPG2jCk7w6ASf2VX+tIxHoc2Z/c5+7d89yvtiKmEZXoPLuVyAv/Yx4PhJP2r7KSyl5S2gZZkzQrMdAjDVKg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-6.1.2.tgz", + "integrity": "sha512-HaeW68KisBd/7TmavzPDlL2bpoDK5AjR2ZYrqU4TlGwM88GtQfvduBCAlSCj20X0w/4+rWMkseD9dAAkacjiyQ==", "peerDependencies": { - "@capacitor/core": "^4.6.0" + "@capacitor/core": "^6.1.0" } }, "node_modules/@capacitor/keyboard": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-4.1.0.tgz", - "integrity": "sha512-5fanmJLdkXLEaro0oezkmpC15tBGlsLW4cp1jQTMPwyX6NLlPUFHdWUhMERzxL2QXHmHvtoFMJ4m15Eymgefuw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-6.0.2.tgz", + "integrity": "sha512-fOfO3rQ0ZXuTHpK03INVTwmBnpqMiH8EHPpNaHjwjKwdrVRWBvtgIFhuyHNXh53rdcXw+uHB+1RIiNabnCrITw==", "peerDependencies": { - "@capacitor/core": "^4.0.0" + "@capacitor/core": "^6.0.0" } }, "node_modules/@capacitor/status-bar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-4.1.1.tgz", - "integrity": "sha512-3wosxMD1XuIFz88+c2GdVEHSJV6u7suOeKQjyWf3zf9eFr622Sg+udZqDbC0dtTWXw97BWyCjv3r1EYJw7XnIA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-6.0.1.tgz", + "integrity": "sha512-Usd9hZZQVAqy+jJfL7jRcYI7dcsxN09Na1yttwdl+F1bk3Ztoukk7CGPDm5VgKUSs53ihQBOy1+sczCACxhNiw==", "peerDependencies": { - "@capacitor/core": "^4.0.0" + "@capacitor/core": "^6.0.0" } }, "node_modules/@csstools/normalize.css": { @@ -3274,22 +3353,22 @@ } }, "node_modules/@ionic/core": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.7.5.tgz", - "integrity": "sha512-zRkRn+h/Vs3xt/EVgBdShMKDyeGOM4RU31NPF2icfu3CUTH+VrMV569MUnNjYvd1Lu2xK90pYy4TaicSWmC1Pw==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.2.7.tgz", + "integrity": "sha512-pi7cGjgUcX3dMiku7mO/wh1mQ6yHsHZaUQKKor+fabmoL04YSRJCSJfqf9vImMwmegeon9xU6VPZuiJh2HV8YQ==", "dependencies": { - "@stencil/core": "^2.18.0", - "ionicons": "^6.1.3", + "@stencil/core": "^4.19.2", + "ionicons": "^7.2.2", "tslib": "^2.1.0" } }, "node_modules/@ionic/react": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-6.7.5.tgz", - "integrity": "sha512-BRJbG2IfwNepAlJWKxZzNnfMVH3f9zK+yTQ9OO+yTpV8XY/CyYtHUDwUVJoBNPc25rAEn5txzZlHh/jDGpl8LA==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.2.7.tgz", + "integrity": "sha512-f4ZI2rqImQgSb0n3irD7SRcs9xTCNbaUyo1mMoA6sX31zRjFlB0ryadaXL9GDubxaFLc1fxFt7MOBiWi911mlg==", "dependencies": { - "@ionic/core": "6.7.5", - "ionicons": "^6.1.3", + "@ionic/core": "8.2.7", + "ionicons": "^7.0.0", "tslib": "*" }, "peerDependencies": { @@ -3298,11 +3377,11 @@ } }, "node_modules/@ionic/react-router": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@ionic/react-router/-/react-router-6.7.5.tgz", - "integrity": "sha512-zh3i+d8cPnqcadqythTQwyhTL+V+hrEjWNNvtEnA1xAVx8Ol7dDu6V0aDlF6C2+e1q0Vf1fDSMNI4O0JcDutpA==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@ionic/react-router/-/react-router-8.2.7.tgz", + "integrity": "sha512-OfQGQUwHBSlvLpwrGzZUd6Ndj305TCxFMeUEtvxHK//bXDHOkaIoHgJYs9etqwgSk3meK9qXzzf9Nx9nvFeqXA==", "dependencies": { - "@ionic/react": "6.7.5", + "@ionic/react": "8.2.7", "tslib": "*" }, "peerDependencies": { @@ -3313,16 +3392,16 @@ } }, "node_modules/@ionic/utils-array": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", - "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.5.tgz", + "integrity": "sha512-HD72a71IQVBmQckDwmA8RxNVMTbxnaLbgFOl+dO5tbvW9CkkSFCv41h6fUuNsSEVgngfkn0i98HDuZC8mk+lTA==", "dev": true, "dependencies": { "debug": "^4.0.0", "tslib": "^2.0.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=10.3.0" } }, "node_modules/@ionic/utils-fs": { @@ -3369,13 +3448,13 @@ } }, "node_modules/@ionic/utils-process": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.11.tgz", - "integrity": "sha512-Uavxn+x8j3rDlZEk1X7YnaN6wCgbCwYQOeIjv/m94i1dzslqWhqIHEqxEyeE8HsT5Negboagg7GtQiABy+BLbA==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.12.tgz", + "integrity": "sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==", "dev": true, "dependencies": { "@ionic/utils-object": "2.1.6", - "@ionic/utils-terminal": "2.3.4", + "@ionic/utils-terminal": "2.3.5", "debug": "^4.0.0", "signal-exit": "^3.0.3", "tree-kill": "^1.2.2", @@ -3385,36 +3464,136 @@ "node": ">=16.0.0" } }, + "node_modules/@ionic/utils-process/node_modules/@ionic/utils-terminal": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", + "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", + "dev": true, + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@ionic/utils-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.6.tgz", - "integrity": "sha512-4+Kitey1lTA1yGtnigeYNhV/0tggI3lWBMjC7tBs1K9GXa/q7q4CtOISppdh8QgtOhrhAXS2Igp8rbko/Cj+lA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.5.tgz", + "integrity": "sha512-hkm46uHvEC05X/8PHgdJi4l4zv9VQDELZTM+Kz69odtO9zZYfnt8DkfXHJqJ+PxmtiE5mk/ehJWLnn/XAczTUw==", "dev": true, "dependencies": { "debug": "^4.0.0", "tslib": "^2.0.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=10.3.0" } }, "node_modules/@ionic/utils-subprocess": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.12.tgz", - "integrity": "sha512-N05Y+dIXBHofKWJTheCMzVqmgY9wFmZcRv/LdNnfXaaA/mxLTyGxQYeig8fvQXTtDafb/siZXcrTkmQ+y6n3Yg==", + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.11.tgz", + "integrity": "sha512-6zCDixNmZCbMCy5np8klSxOZF85kuDyzZSTTQKQP90ZtYNCcPYmuFSzaqDwApJT4r5L3MY3JrqK1gLkc6xiUPw==", "dev": true, "dependencies": { - "@ionic/utils-array": "2.1.6", - "@ionic/utils-fs": "3.1.7", - "@ionic/utils-process": "2.1.11", - "@ionic/utils-stream": "3.1.6", - "@ionic/utils-terminal": "2.3.4", + "@ionic/utils-array": "2.1.5", + "@ionic/utils-fs": "3.1.6", + "@ionic/utils-process": "2.1.10", + "@ionic/utils-stream": "3.1.5", + "@ionic/utils-terminal": "2.3.3", "cross-spawn": "^7.0.3", "debug": "^4.0.0", "tslib": "^2.0.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-fs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.6.tgz", + "integrity": "sha512-eikrNkK89CfGPmexjTfSWl4EYqsPSBh0Ka7by4F0PLc1hJZYtJxUZV3X4r5ecA8ikjicUmcbU7zJmAjmqutG/w==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^8.0.0", + "debug": "^4.0.0", + "fs-extra": "^9.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-object": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.5.tgz", + "integrity": "sha512-XnYNSwfewUqxq+yjER1hxTKggftpNjFLJH0s37jcrNDwbzmbpFTQTVAp4ikNK4rd9DOebX/jbeZb8jfD86IYxw==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-process": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.10.tgz", + "integrity": "sha512-mZ7JEowcuGQK+SKsJXi0liYTcXd2bNMR3nE0CyTROpMECUpJeAvvaBaPGZf5ERQUPeWBVuwqAqjUmIdxhz5bxw==", + "dev": true, + "dependencies": { + "@ionic/utils-object": "2.1.5", + "@ionic/utils-terminal": "2.3.3", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "tree-kill": "^1.2.2", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/@ionic/utils-terminal": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.3.tgz", + "integrity": "sha512-RnuSfNZ5fLEyX3R5mtcMY97cGD1A0NVBbarsSQ6yMMfRJ5YHU7hHVyUfvZeClbqkBC/pAqI/rYJuXKCT9YeMCQ==", + "dev": true, + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/@ionic/utils-terminal": { @@ -3734,6 +3913,17 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@jest/fake-timers": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", @@ -4124,20 +4314,37 @@ } }, "node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dependencies": { + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^15.0.0", + "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/types/node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, "node_modules/@jest/types/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4443,15 +4650,15 @@ } }, "node_modules/@stencil/core": { - "version": "2.22.3", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.22.3.tgz", - "integrity": "sha512-kmVA0M/HojwsfkeHsifvHVIYe4l5tin7J5+DLgtl8h6WWfiMClND5K3ifCXXI2ETDNKiEk21p6jql3Fx9o2rng==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.21.0.tgz", + "integrity": "sha512-v50lnVbzS8mpMSnEVxR+G75XpvxHKtkJaQrNPE8+/fF6Ppr5z4bcdcBhcP8LPfEW+4BZcic6VifMXRwTopc+kw==", "bin": { "stencil": "bin/stencil" }, "engines": { - "node": ">=12.10.0", - "npm": ">=6.0.0" + "node": ">=16.0.0", + "npm": ">=7.10.0" } }, "node_modules/@surma/rollup-plugin-off-main-thread": { @@ -4688,35 +4895,29 @@ } }, "node_modules/@testing-library/dom": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", - "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", + "aria-query": "5.3.0", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "pretty-format": "^27.0.2" }, "engines": { - "node": ">=12" - } - }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dependencies": { - "deep-equal": "^2.0.5" + "node": ">=18" } }, "node_modules/@testing-library/dom/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4732,6 +4933,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -4745,6 +4947,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "peer": true, "engines": { "node": ">=10" }, @@ -4753,52 +4956,61 @@ } }, "node_modules/@testing-library/jest-dom": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz", - "integrity": "sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", + "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", "dependencies": { - "@adobe/css-tools": "^4.0.1", - "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", + "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", "chalk": "^3.0.0", "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", "redent": "^3.0.0" }, "engines": { - "node": ">=8", + "node": ">=14", "npm": ">=6", "yarn": ">=1" } }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==" + }, "node_modules/@testing-library/react": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", - "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz", + "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==", "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.5.0", - "@types/react-dom": "^18.0.0" + "@babel/runtime": "^7.12.5" }, "engines": { - "node": ">=12" + "node": ">=18" }, "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", "react": "^18.0.0", "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, "node_modules/@testing-library/user-event": { - "version": "12.8.3", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", - "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", + "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", "engines": { - "node": ">=10", + "node": ">=12", "npm": ">=6" }, "peerDependencies": { @@ -4826,7 +5038,8 @@ "node_modules/@types/aria-query": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", - "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==" + "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "peer": true }, "node_modules/@types/babel__core": { "version": "7.20.1", @@ -4958,9 +5171,9 @@ } }, "node_modules/@types/fs-extra": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", - "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -5023,12 +5236,91 @@ } }, "node_modules/@types/jest": { - "version": "26.0.24", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", - "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@types/json-schema": { @@ -5050,9 +5342,12 @@ "dev": true }, "node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.1.tgz", + "integrity": "sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw==", + "dependencies": { + "undici-types": "~6.19.2" + } }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -5090,19 +5385,18 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz", - "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==", + "version": "18.3.4", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.4.tgz", + "integrity": "sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.2.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.6.tgz", - "integrity": "sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dependencies": { "@types/react": "*" } @@ -5141,11 +5435,6 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" - }, "node_modules/@types/semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", @@ -5200,16 +5489,7 @@ "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/testing-library__jest-dom": { - "version": "5.14.6", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.6.tgz", - "integrity": "sha512-FkHXCb+ikSoUP4Y4rOslzTdX5sqYwMxfefKh1GmZ8ce1GOkEHntSp6b5cGadmNfp5e4BMEWOMx+WSKd5/MqlDA==", - "dependencies": { - "@types/jest": "*" - } + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" }, "node_modules/@types/trusted-types": { "version": "2.0.3", @@ -5227,9 +5507,9 @@ } }, "node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dependencies": { "@types/yargs-parser": "*" } @@ -5614,6 +5894,15 @@ "@xtuc/long": "4.2.2" } }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -5728,14 +6017,6 @@ "node": ">=8.9" } }, - "node_modules/adm-zip": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.5.tgz", - "integrity": "sha512-IWwXKnCbirdbyXSfUDvCCrmYrOHANRZcc8NcRrvTlIApdl7PwE9oGcsYvNeJPAVY1M+70b4PxXGKIf8AEuiQ6w==", - "engines": { - "node": ">=6.0" - } - }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -5888,6 +6169,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" @@ -6043,22 +6325,6 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -6083,7 +6349,8 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "node_modules/at-least-node": { "version": "1.0.0", @@ -6135,6 +6402,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -6142,19 +6410,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, "node_modules/axe-core": { "version": "4.7.2", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", @@ -6508,14 +6763,6 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/bfj": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", @@ -6532,9 +6779,9 @@ } }, "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "dev": true, "engines": { "node": ">=0.6" @@ -6671,7 +6918,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -6765,6 +7011,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -6844,6 +7091,14 @@ } ] }, + "node_modules/capacitor-plugin-scanbot-sdk": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/capacitor-plugin-scanbot-sdk/-/capacitor-plugin-scanbot-sdk-5.1.0.tgz", + "integrity": "sha512-ZA93MHbg+ST1lKFYtlPmRL5H9KIJQrhHg9ahCmwyX8y9mNMFa5jcffCElNewrtUH7v5iruNCTeU2BV24OnvJEQ==", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", @@ -6853,11 +7108,6 @@ "node": ">=4" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, "node_modules/chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -6946,7 +7196,6 @@ "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true, "funding": [ { "type": "github", @@ -7119,6 +7368,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -7269,16 +7519,6 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, - "node_modules/cordova-plugin-scanbot-sdk": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/cordova-plugin-scanbot-sdk/-/cordova-plugin-scanbot-sdk-4.17.3.tgz", - "integrity": "sha512-4P5LliATz5x30BGXxr2PebKh6QmJCjjBA+0NAuzpS1FszdYWasJafQRnmFIX0h/q6/uJfA3nv6IwBD5Gqs2FXA==", - "dependencies": { - "adm-zip": "0.5.5", - "path": "0.12.7", - "request": "2.88.2" - } - }, "node_modules/core-js": { "version": "3.32.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz", @@ -7317,7 +7557,8 @@ "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true }, "node_modules/cosmiconfig": { "version": "7.1.0", @@ -7761,17 +8002,6 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -7814,34 +8044,6 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, - "node_modules/deep-equal": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", - "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.0", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -7882,6 +8084,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -7897,6 +8100,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -7982,11 +8186,11 @@ "dev": true }, "node_modules/diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/dir-glob": { @@ -8040,7 +8244,8 @@ "node_modules/dom-accessibility-api": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "peer": true }, "node_modules/dom-converter": { "version": "0.2.0", @@ -8168,15 +8373,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -8384,25 +8580,6 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-module-lexer": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", @@ -9346,23 +9523,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-glob": { "version": "3.3.1", @@ -9395,7 +9560,8 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -9517,7 +9683,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -9634,18 +9799,11 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, "dependencies": { "is-callable": "^1.1.3" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", @@ -9790,19 +9948,6 @@ "node": ">=6" } }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -9907,7 +10052,8 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -9931,6 +10077,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9956,6 +10103,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -10009,14 +10157,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -10140,6 +10280,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -10150,8 +10291,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", @@ -10180,47 +10320,6 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/har-validator/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, "node_modules/harmony-reflect": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", @@ -10231,6 +10330,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -10242,6 +10342,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10258,6 +10359,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -10269,6 +10371,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -10280,6 +10383,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -10291,6 +10395,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -10311,16 +10416,11 @@ } }, "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" + "@babel/runtime": "^7.7.6" } }, "node_modules/hoist-non-react-statics": { @@ -10616,20 +10716,6 @@ } } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -10679,8 +10765,7 @@ "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "dev": true + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" }, "node_modules/identity-obj-proxy": { "version": "3.0.0", @@ -10778,7 +10863,8 @@ "node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true }, "node_modules/ini": { "version": "1.3.8", @@ -10790,6 +10876,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, "dependencies": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", @@ -10800,11 +10887,11 @@ } }, "node_modules/ionicons": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.1.3.tgz", - "integrity": "sha512-ptzz38dd/Yq+PgjhXegh7yhb/SLIk1bvL9vQDtLv1aoSc7alO6mX2DIMgcKYzt9vrNWkRu1f9Jr78zIFFyOXqw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.4.0.tgz", + "integrity": "sha512-ZK94MMqgzMCPPMhmk8Ouu6goyVHFIlw/ACP6oe3FrikcI0N7CX0xcwVaEbUc0G/v3W0shI93vo+9ve/KpvcNhQ==", "dependencies": { - "@stencil/core": "^2.18.0" + "@stencil/core": "^4.0.3" } }, "node_modules/ipaddr.js": { @@ -10816,25 +10903,11 @@ "node": ">= 10" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -10854,6 +10927,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, "dependencies": { "has-bigints": "^1.0.1" }, @@ -10877,6 +10951,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -10892,6 +10967,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -10915,6 +10991,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -10979,14 +11056,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -11009,7 +11078,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -11018,6 +11086,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -11068,6 +11137,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -11097,18 +11167,11 @@ "node": ">=6" } }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -11132,6 +11195,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -11146,6 +11210,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -11160,6 +11225,7 @@ "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -11177,15 +11243,8 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true }, "node_modules/is-weakref": { "version": "1.0.2", @@ -11199,18 +11258,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -11226,7 +11273,8 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true }, "node_modules/isexe": { "version": "2.0.0", @@ -11234,11 +11282,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -11669,17 +11712,17 @@ } }, "node_modules/jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-diff/node_modules/chalk": { @@ -11919,11 +11962,11 @@ } }, "node_modules/jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { @@ -13042,15 +13085,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-watch-typeahead/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/jest-watch-typeahead/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -13465,11 +13499,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, "node_modules/jsdom": { "version": "16.7.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", @@ -13574,7 +13603,8 @@ "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true }, "node_modules/json-schema-traverse": { "version": "1.0.0", @@ -13588,11 +13618,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -13625,20 +13650,6 @@ "node": ">=0.10.0" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -13848,6 +13859,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -13955,7 +13967,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -13980,6 +13991,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -13988,6 +14000,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -14189,37 +14202,37 @@ } }, "node_modules/native-run": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/native-run/-/native-run-1.7.2.tgz", - "integrity": "sha512-2aahC8iXIO8BcvEukVMrYwL5sXurkuIGyQgfSGBto832W6ejV+cB5Ww+2/CRxmyozhbxARJ2OMpEGPV8sTqsrQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.1.tgz", + "integrity": "sha512-XfG1FBZLM50J10xH9361whJRC9SHZ0Bub4iNRhhI61C8Jv0e1ud19muex6sNKB51ibQNUJNuYn25MuYET/rE6w==", "dev": true, "dependencies": { - "@ionic/utils-fs": "^3.1.6", - "@ionic/utils-terminal": "^2.3.3", + "@ionic/utils-fs": "^3.1.7", + "@ionic/utils-terminal": "^2.3.4", "bplist-parser": "^0.3.2", "debug": "^4.3.4", "elementtree": "^0.1.7", - "ini": "^3.0.1", - "plist": "^3.0.6", - "split2": "^4.1.0", + "ini": "^4.1.1", + "plist": "^3.1.0", + "split2": "^4.2.0", "through2": "^4.0.2", - "tslib": "^2.4.0", + "tslib": "^2.6.2", "yauzl": "^2.10.0" }, "bin": { "native-run": "bin/native-run" }, "engines": { - "node": ">=12.13.0" + "node": ">=16.0.0" } }, "node_modules/native-run/node_modules/ini": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", - "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/natural-compare": { @@ -14336,14 +14349,6 @@ "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -14365,21 +14370,7 @@ "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14388,6 +14379,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, "engines": { "node": ">= 0.4" } @@ -14396,6 +14388,7 @@ "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -14703,15 +14696,6 @@ "tslib": "^2.0.3" } }, - "node_modules/path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", - "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -14745,6 +14729,28 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, "node_modules/path-to-regexp": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", @@ -14776,7 +14782,8 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true }, "node_modules/picocolors": { "version": "1.0.0", @@ -14787,7 +14794,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -14951,16 +14957,17 @@ } }, "node_modules/plist": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz", - "integrity": "sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "dependencies": { + "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" }, "engines": { - "node": ">=6" + "node": ">=10.4.0" } }, "node_modules/postcss": { @@ -16322,27 +16329,50 @@ } }, "node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">= 10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/pretty-format/node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "engines": { - "node": ">= 0.6.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -16411,12 +16441,14 @@ "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, "engines": { "node": ">=6" } @@ -16431,14 +16463,6 @@ "teleport": ">=0.2.0" } }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -16517,9 +16541,9 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -16617,15 +16641,15 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-error-overlay": { @@ -16684,6 +16708,32 @@ "react": ">=15" } }, + "node_modules/react-router-dom/node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/react-router/node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, "node_modules/react-router/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -16863,6 +16913,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -17015,37 +17066,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -17324,6 +17344,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -17356,7 +17377,8 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "node_modules/sanitize.css": { "version": "13.0.0", @@ -17421,9 +17443,9 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } @@ -17709,6 +17731,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -17734,7 +17757,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -17904,30 +17926,6 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -17939,7 +17937,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -17951,7 +17948,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, "engines": { "node": ">=8" } @@ -17971,17 +17967,6 @@ "node": ">= 0.8" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -18681,7 +18666,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -18698,18 +18682,6 @@ "node": ">=0.6" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tr46": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", @@ -18768,9 +18740,9 @@ } }, "node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -18793,22 +18765,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -18930,9 +18886,9 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -18956,6 +18912,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -19084,6 +19045,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -19098,14 +19060,6 @@ "requires-port": "^1.0.0" } }, - "node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dependencies": { - "inherits": "2.0.3" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -19142,15 +19096,6 @@ "node": ">= 0.4.0" } }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/v8-to-istanbul": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", @@ -19179,19 +19124,6 @@ "node": ">= 0.8" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -19246,9 +19178,9 @@ } }, "node_modules/web-vitals": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-0.2.4.tgz", - "integrity": "sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.3.tgz", + "integrity": "sha512-/CFAm1mNxSmOj6i0Co+iGFJ58OS4NRGVP+AWS/l509uIK5a1bSoIVaHz/ZumpHTfHSZBpgrJ+wjfpAOrTHok5Q==" }, "node_modules/webidl-conversions": { "version": "6.1.0", @@ -19617,6 +19549,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -19628,53 +19561,21 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/workbox-background-sync": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", - "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.1.0.tgz", + "integrity": "sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==", "dependencies": { - "workbox-core": "^5.1.4" + "idb": "^7.0.1", + "workbox-core": "7.1.0" } }, "node_modules/workbox-broadcast-update": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", - "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.1.0.tgz", + "integrity": "sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==", "dependencies": { - "workbox-core": "^5.1.4" + "workbox-core": "7.1.0" } }, "node_modules/workbox-build": { @@ -19893,59 +19794,62 @@ } }, "node_modules/workbox-cacheable-response": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", - "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.1.0.tgz", + "integrity": "sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==", "dependencies": { - "workbox-core": "^5.1.4" + "workbox-core": "7.1.0" } }, "node_modules/workbox-core": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", - "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==" + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz", + "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==" }, "node_modules/workbox-expiration": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", - "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.1.0.tgz", + "integrity": "sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==", "dependencies": { - "workbox-core": "^5.1.4" + "idb": "^7.0.1", + "workbox-core": "7.1.0" } }, "node_modules/workbox-google-analytics": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", - "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.1.0.tgz", + "integrity": "sha512-FvE53kBQHfVTcZyczeBVRexhh7JTkyQ8HAvbVY6mXd2n2A7Oyz/9fIwnY406ZcDhvE4NFfKGjW56N4gBiqkrew==", "dependencies": { - "workbox-background-sync": "^5.1.4", - "workbox-core": "^5.1.4", - "workbox-routing": "^5.1.4", - "workbox-strategies": "^5.1.4" + "workbox-background-sync": "7.1.0", + "workbox-core": "7.1.0", + "workbox-routing": "7.1.0", + "workbox-strategies": "7.1.0" } }, "node_modules/workbox-navigation-preload": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", - "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.1.0.tgz", + "integrity": "sha512-4wyAbo0vNI/X0uWNJhCMKxnPanNyhybsReMGN9QUpaePLTiDpKxPqFxl4oUmBNddPwIXug01eTSLVIFXimRG/A==", "dependencies": { - "workbox-core": "^5.1.4" + "workbox-core": "7.1.0" } }, "node_modules/workbox-precaching": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", - "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.1.0.tgz", + "integrity": "sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==", "dependencies": { - "workbox-core": "^5.1.4" + "workbox-core": "7.1.0", + "workbox-routing": "7.1.0", + "workbox-strategies": "7.1.0" } }, "node_modules/workbox-range-requests": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", - "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.1.0.tgz", + "integrity": "sha512-m7+O4EHolNs5yb/79CrnwPR/g/PRzMFYEdo01LqwixVnc/sbzNSvKz0d04OE3aMRel1CwAAZQheRsqGDwATgPQ==", "dependencies": { - "workbox-core": "^5.1.4" + "workbox-core": "7.1.0" } }, "node_modules/workbox-recipes": { @@ -20018,29 +19922,28 @@ } }, "node_modules/workbox-routing": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", - "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.1.0.tgz", + "integrity": "sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==", "dependencies": { - "workbox-core": "^5.1.4" + "workbox-core": "7.1.0" } }, "node_modules/workbox-strategies": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", - "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.1.0.tgz", + "integrity": "sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==", "dependencies": { - "workbox-core": "^5.1.4", - "workbox-routing": "^5.1.4" + "workbox-core": "7.1.0" } }, "node_modules/workbox-streams": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", - "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.1.0.tgz", + "integrity": "sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==", "dependencies": { - "workbox-core": "^5.1.4", - "workbox-routing": "^5.1.4" + "workbox-core": "7.1.0", + "workbox-routing": "7.1.0" } }, "node_modules/workbox-sw": { @@ -20166,9 +20069,9 @@ "dev": true }, "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "dev": true, "dependencies": { "sax": ">=0.6.0", diff --git a/package.json b/package.json index 4fc1a1ce1..841ef728f 100644 --- a/package.json +++ b/package.json @@ -4,46 +4,47 @@ "private": true, "dependencies": { "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@capacitor/android": "4.6.1", - "@capacitor/app": "4.1.1", - "@capacitor/camera": "^4.1.4", - "@capacitor/core": "4.6.1", - "@capacitor/haptics": "4.1.0", - "@capacitor/ios": "4.6.1", - "@capacitor/keyboard": "4.1.0", - "@capacitor/status-bar": "4.1.1", - "@ionic/react": "^6.0.0", - "@ionic/react-router": "^6.0.0", - "@testing-library/jest-dom": "^5.11.9", - "@testing-library/react": "^13.3.0", - "@testing-library/user-event": "^12.6.3", - "@types/jest": "^26.0.20", - "@types/node": "^12.19.15", - "@types/react": "^18.0.17", - "@types/react-dom": "^18.0.6", - "@types/react-router": "^5.1.11", - "@types/react-router-dom": "^5.1.7", - "cordova-plugin-scanbot-sdk": "^4.17.3", - "history": "^4.9.0", - "ionicons": "^6.0.3", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router": "^5.2.0", - "react-router-dom": "^5.2.0", - "typescript": "^4.1.3", - "web-vitals": "^0.2.4", - "workbox-background-sync": "^5.1.4", - "workbox-broadcast-update": "^5.1.4", - "workbox-cacheable-response": "^5.1.4", - "workbox-core": "^5.1.4", - "workbox-expiration": "^5.1.4", - "workbox-google-analytics": "^5.1.4", - "workbox-navigation-preload": "^5.1.4", - "workbox-precaching": "^5.1.4", - "workbox-range-requests": "^5.1.4", - "workbox-routing": "^5.1.4", - "workbox-strategies": "^5.1.4", - "workbox-streams": "^5.1.4" + "@capacitor/android": "6.1.2", + "@capacitor/app": "6.0.1", + "@capacitor/camera": "^6.0.2", + "@capacitor/core": "6.1.2", + "@capacitor/filesystem": "^6.0.1", + "@capacitor/haptics": "6.0.1", + "@capacitor/ios": "6.1.2", + "@capacitor/keyboard": "6.0.2", + "@capacitor/status-bar": "6.0.1", + "@ionic/react": "^8.2.7", + "@ionic/react-router": "^8.2.7", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", + "@testing-library/user-event": "^14.5.2", + "@types/jest": "^29.5.12", + "@types/node": "^22.5.1", + "@types/react": "^18.3.4", + "@types/react-dom": "^18.3.0", + "@types/react-router": "^5.1.20", + "@types/react-router-dom": "^5.3.3", + "capacitor-plugin-scanbot-sdk": "^5.1.0", + "history": "^5.3.0", + "ionicons": "^7.4.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router": "^5.0.1", + "react-router-dom": "^5.0.1", + "typescript": "^3.2.1", + "web-vitals": "^4.2.3", + "workbox-background-sync": "^7.1.0", + "workbox-broadcast-update": "^7.1.0", + "workbox-cacheable-response": "^7.1.0", + "workbox-core": "^7.1.0", + "workbox-expiration": "^7.1.0", + "workbox-google-analytics": "^7.1.0", + "workbox-navigation-preload": "^7.1.0", + "workbox-precaching": "^7.1.0", + "workbox-range-requests": "^7.1.0", + "workbox-routing": "^7.1.0", + "workbox-strategies": "^7.1.0", + "workbox-streams": "^7.1.0" }, "scripts": { "start": "react-scripts start", @@ -70,7 +71,7 @@ ] }, "devDependencies": { - "@capacitor/cli": "4.6.1", + "@capacitor/cli": "6.1.2", "react-scripts": "5.0.1" }, "description": "An Ionic project" diff --git a/src/App.tsx b/src/App.tsx index 03b649ec8..29ed87e8b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -24,45 +24,23 @@ import '@ionic/react/css/display.css'; /* Theme variables */ import './theme/variables.css'; -/* Scanbot SDK */ -import { ScanbotSDKConfiguration } from 'cordova-plugin-scanbot-sdk'; - -/* Scanbot SDK Service */ -import { ScanbotSDKService } from './services/ScanbotSDKService'; import React from "react"; -import BarcodeListView from "./pages/BarcodeListView"; +import DocumentScannerPage from './pages/features/document_detectors/DocumentScannerPage'; +import BarcodeScannerPage from './pages/features/barcode_detectors/BarcodeScannerPage'; +import DataDetectorPage from './pages/features/data_detectors/DataDetectorPage'; +import ScanbotService from './services/scanbot_service'; +import BarcodeResultPage from './pages/features/barcode_detectors/BarcodeResultPage'; +import MRZResultPage from './pages/features/data_detectors/MRZResultPage'; +import EHICResultPage from './pages/features/data_detectors/EHICResultPage'; +import CheckResultPage from './pages/features/data_detectors/CheckResultPage'; +import MedicalCertificateResultPage from './pages/features/data_detectors/MedicalCertificateResultPage'; +import MoreFeaturePage from './pages/features/other_api_features/MoreFeaturePage'; setupIonicReact(); -/* - * TODO add the license key here. - * Please note: The Scanbot SDK will run without a license key for one minute per session! - * After the trial period has expired all Scanbot SDK functions as well as the UI components will stop working - * or may be terminated. You can get a free "no-strings-attached" trial license key. - * Please submit the trial license form (https://scanbot.io/trial/) on our website by using - * the app identifier "io.scanbot.example.sdk.capacitor.ionic.react" of this example app. - */ -const SDK_LICENSE_KEY = ''; - -// initialize Scanbot SDK -const initializeSdk = async () => { - const config: ScanbotSDKConfiguration = { - loggingEnabled: true, - licenseKey: SDK_LICENSE_KEY, - }; - try { - await ScanbotSDKService.SDK.initializeSdk(config) - .then(result => console.log(JSON.stringify(result))) - .catch(err => console.error('Scanbot SDK initialization error: ' + JSON.stringify(err))); - } - catch (e) { - console.error('Scanbot SDK initialization error: ' + JSON.stringify(e)); - } -} - const App: React.FC = () => { - initializeSdk().then(); + ScanbotService.initSdk(); return ( @@ -74,14 +52,30 @@ const App: React.FC = () => { - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - @@ -89,4 +83,4 @@ const App: React.FC = () => { ); } -export default App; +export default App; \ No newline at end of file diff --git a/src/enums/core_feature_enum.ts b/src/enums/core_feature_enum.ts new file mode 100644 index 000000000..d3ab8fe3e --- /dev/null +++ b/src/enums/core_feature_enum.ts @@ -0,0 +1,21 @@ +export enum CoreFeatureEnum { + Document, + FinderDocument, + ImageResult, + SingleBarcode, + MultiBarcode, + MultiARBarcode, + ImportBarcodeImage, + ImportBarcodeImages, + MRZ, + EHIC, + Check, + ImportCheckOnImage, + LicensePlate, + TextData, + MedicalCertificate, + GenericDocument, + LicenseInfo, + OCRInfo, + LearnMore, +} \ No newline at end of file diff --git a/src/enums/core_feature_id_enum.ts b/src/enums/core_feature_id_enum.ts new file mode 100644 index 000000000..a04b6769c --- /dev/null +++ b/src/enums/core_feature_id_enum.ts @@ -0,0 +1,6 @@ +export enum CoreFeatureIdEnum { + DocumentDetector, + BarcodeDetactor, + DataDetactor, + Other +} \ No newline at end of file diff --git a/src/enums/pdf_page_size_enum.ts b/src/enums/pdf_page_size_enum.ts new file mode 100644 index 000000000..f1a489f3d --- /dev/null +++ b/src/enums/pdf_page_size_enum.ts @@ -0,0 +1,15 @@ +export enum PDFPageSizeEnum { + A3, + A4, + A5, + B4, + B5, + COMM10, + CUSTOM, + EXECUTIVE, + LEGAL, + LETTER, + US4x6, + US4x8, + US5x7 +} \ No newline at end of file diff --git a/src/enums/tiff_option_enum.ts b/src/enums/tiff_option_enum.ts new file mode 100644 index 000000000..354f177dc --- /dev/null +++ b/src/enums/tiff_option_enum.ts @@ -0,0 +1,4 @@ +export enum TiffOptionsEnum { + Binarized, + Color +} \ No newline at end of file diff --git a/src/models/core_feature_model.ts b/src/models/core_feature_model.ts new file mode 100644 index 000000000..198ced4f8 --- /dev/null +++ b/src/models/core_feature_model.ts @@ -0,0 +1,16 @@ +import { CoreFeatureIdEnum } from "../enums/core_feature_id_enum"; +import { CoreFeatureEnum } from "../enums/core_feature_enum"; + +export class CoreFeatureModel { + id: CoreFeatureIdEnum; + title: string; + description: string; + items: { key: CoreFeatureEnum; value: string; }[]; + + constructor(id: CoreFeatureIdEnum, title: string, description: string, items: { key: CoreFeatureEnum; value: string; }[]) { + this.id = id, + this.title = title, + this.description = description, + this.items = items + } +}; \ No newline at end of file diff --git a/src/pages/BarcodeListView.tsx b/src/pages/BarcodeListView.tsx deleted file mode 100644 index 291f41ca0..000000000 --- a/src/pages/BarcodeListView.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import React from "react"; -import { - IonContent, - IonHeader, - IonPage, - IonTitle, - IonToolbar, - IonBackButton, - IonButtons, - IonList, - IonItem, - IonLabel, - } from '@ionic/react'; - -import {BarcodeRepository} from "../utils/BarcodeRepository"; - -const BarcodeListView: React.FC = () => { - let barcodes = BarcodeRepository.getBarcodes(); - - return ( - - - - - - - Display Barcodes - - - - - - {barcodes.map((barcode) => ( - - -

{barcode.text}

-

{barcode.type}

-
-
- ))} -
-
-
- ); -}; - -export default BarcodeListView; \ No newline at end of file diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index ad4976a67..38d63fc53 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -4,534 +4,40 @@ import { IonHeader, IonPage, IonToolbar, - IonItemGroup, - IonItemDivider, - IonItem, - IonLabel, - useIonAlert, - useIonLoading, - isPlatform, IonTitle, + IonCard, + IonCardHeader, + IonCardTitle, + IonCardContent, } from '@ionic/react'; -import { Camera, CameraResultType, CameraSource } from '@capacitor/camera'; - import { useHistory } from 'react-router'; -import { ImageResultsRepository } from '../utils/ImageRepository'; -import { BarcodeRepository } from '../utils/BarcodeRepository'; - -/* Scanbot SDK Service */ -import { ScanbotSDKService } from '../services/ScanbotSDKService'; - -import { - DocumentScannerConfiguration, - BarcodeScannerConfiguration, - BatchBarcodeScannerConfiguration, - MrzScannerConfiguration, - CheckRecognizerConfiguration, - HealthInsuranceCardScannerConfiguration, - TextDataScannerStep, - DataScannerConfiguration, - LicensePlateScannerConfiguration, - GenericDocumentRecognizerConfiguration, - BarcodeResultField, - FinderDocumentScannerConfiguration, -} from 'cordova-plugin-scanbot-sdk'; +import { CORE_FEATURES } from '../utils/data_util'; +import { CoreFeatureIdEnum } from '../enums/core_feature_id_enum'; const Home: React.FC = () => { const history = useHistory(); - const [presentAlert] = useIonAlert(); - const [present, dismiss] = useIonLoading(); - - // ----------------- - // Document Scanner - // ----------------- - const startDocumentScanner = async () => { - if (!(await ScanbotSDKService.checkLicense())) { return; } - - const configs: DocumentScannerConfiguration = { - cameraPreviewMode: 'FIT_IN', - interfaceOrientation: 'PORTRAIT', - pageCounterButtonTitle: '%d Page(s)', - multiPageEnabled: true, - ignoreBadAspectRatio: true, - topBarBackgroundColor: '#c8193c', - bottomBarBackgroundColor: '#c8193c', - // see further configs ... - }; - try { - const documentScannerResults = await ScanbotSDKService.SDK.UI.startDocumentScanner({ uiConfigs: configs }); - if (documentScannerResults.status === 'CANCELED') { - await presentAlert({ - header: 'Information', - message: 'Document scanner has been canceled.', - buttons: ['OK'], - }); - return; - } - await ImageResultsRepository.INSTANCE.addPages(documentScannerResults.pages); - history.push("/imagepreview"); - } - catch (error) { - console.error(error); - } - } - - // ------------------------ - // Finder Document Scanner - // ------------------------ - const startFinderDocumentScanner = async () => { - if (!(await ScanbotSDKService.checkLicense())) { return; } - - const configs: FinderDocumentScannerConfiguration = { - // Customize colors, text resources, behavior, etc.. - cameraPreviewMode: 'FILL_IN', - interfaceOrientation: 'PORTRAIT', - ignoreBadAspectRatio: true, - topBarBackgroundColor: '#c8193c', - finderEnabled: true, - finderAspectRatio: { width: 4, height: 3 } - // see further configs ... - }; - try { - const finderDocumentScannerResults = await ScanbotSDKService.SDK.UI.startFinderDocumentScanner({ uiConfigs: configs }); - if (finderDocumentScannerResults.status === 'CANCELED') { - await presentAlert({ - header: 'Information', - message: 'Document scanner has been canceled.', - buttons: ['OK'], - }); - return; - } - - await ImageResultsRepository.INSTANCE.addPages([finderDocumentScannerResults.page]); - history.push("/imagepreview"); - } - catch (error) { - console.error(error); - } - } - - // __________________ - // Barcode Scanner - // __________________ - const startBarcodeScanner = async () => { - if (!(await ScanbotSDKService.checkLicense())) { return; } - - const configs: BarcodeScannerConfiguration = { - // Customize colors, text resources, behavior, etc.. - finderTextHint: 'Please align the barcode or QR code in the frame above to scan it.', - interfaceOrientation: 'PORTRAIT', - finderLineColor: '#0000ff', - barcodeFormats: BarcodeRepository.getAcceptedTypes(), // optional filter for specific barcode types - // see further configs ... - }; - try { - const barcodeScannerResults = await ScanbotSDKService.SDK.UI.startBarcodeScanner({ uiConfigs: configs }); - if (barcodeScannerResults.status === 'CANCELED') { - await presentAlert({ - header: 'Information', - message: 'Barcode scanner has been canceled.', - buttons: ['OK'], - }) - return; - } - let barcodeString: string = ''; - barcodeScannerResults.barcodes!.forEach(barcode => { - barcodeString += (barcode.type + ' : ' + barcode.text + '\r\n'); - }); - await presentAlert({ - header: 'Barcode Results', - message: barcodeString, - buttons: ['OK'], - }) - } - catch (error) { - console.error(error); - } - } - - // --------------------- - // BatchBarcode Scanner - // --------------------- - const startBatchBarcodeScanner = async () => { - if (!(await ScanbotSDKService.checkLicense())) { return; } - - const configs: BatchBarcodeScannerConfiguration = { - // Customize colors, text resources, behavior, etc.. - finderTextHint: 'Please align the barcode or QR code in the frame above to scan it.', - interfaceOrientation: 'PORTRAIT', - finderLineColor: '#0000ff', - barcodeFormats: BarcodeRepository.getAcceptedTypes(), // optional filter for specific barcode types - // see further configs ... - }; - try { - const batchBarcodeScannerResults = await ScanbotSDKService.SDK.UI.startBatchBarcodeScanner({ uiConfigs: configs }); - if (batchBarcodeScannerResults.status === 'CANCELED') { - await presentAlert({ - header: 'Information', - message: 'BatchBarcode scanner has been canceled.', - buttons: ['OK'], - }); - return; - } - await BarcodeRepository.addBarcodes(batchBarcodeScannerResults.barcodes!); - history.push("/barcoderesultview"); - } - catch (error) { - console.error(error); - } - } - - // ------------------------------ - // Detect barcodes from an image - // ------------------------------ - const detectBarcodeFromImage = async () => { - if (!(await ScanbotSDKService.checkLicense())) { return; } - - try { - const image = await Camera.getPhoto({ - resultType: CameraResultType.Uri, - source: CameraSource.Photos, - }); - - const originalImageFileUri = image.path!; - await present({ - message: 'Detecting barcodes...', - spinner: 'circles' - }); - const result = await ScanbotSDKService.SDK.detectBarcodesOnImage({ imageFileUri: originalImageFileUri }); - - if (result.status === 'CANCELED') { - await dismiss(); - await presentAlert({ - header: 'Information', - message: 'Barcode detection process canceled.', - buttons: ['OK'], - }); - return; - } - else if (result.barcodes?.length === 0) { - await dismiss(); - await presentAlert({ - header: 'Information', - message: 'No barcodes detected.', - buttons: ['OK'], - }); - return; - } - await dismiss(); - await BarcodeRepository.addBarcodes(result.barcodes!); - history.push("/barcoderesultview"); - } - catch (error) { - console.error(error); - } - } - - // ------------------------------------- - // Detect barcodes from multiple images - // ------------------------------------- - const detectBarcodeFromImages = async () => { - if (!(await ScanbotSDKService.checkLicense())) { return; } - - try { - const barcodes: BarcodeResultField[] = []; - const originalImageFileUrls: string[] = []; - const pickedImageResults = await Camera.pickImages({ - quality: 80, - }); - - pickedImageResults.photos.forEach(photo => { - originalImageFileUrls.push(photo.path!); - }); - await present({ - message: 'Detecting barcodes...', - spinner: 'circles' - }); - const response = await ScanbotSDKService.SDK.detectBarcodesOnImages({ imageFilesUris: originalImageFileUrls }); - if (response.status === 'CANCELED') { - await dismiss(); - await presentAlert({ - header: 'Information', - message: 'Barcode detection process canceled.', - buttons: ['OK'], - }); - return; - } - response.results!.forEach(element => { - element.barcodeResults.forEach(barcode => { - barcodes.push(barcode); - }); - }); - if (barcodes?.length === 0) { - await dismiss(); - await presentAlert({ - header: 'Information', - message: 'No barcodes detected.', - buttons: ['OK'], - }); - return; - } - await BarcodeRepository.addBarcodes(barcodes); - await dismiss(); - history.push("/barcoderesultview"); - } - catch (error) { - console.error(error); - } - } - - // ------------- - // MRZ scanner - // ------------- - const startMRZScanner = async () => { - if (!(await ScanbotSDKService.checkLicense())) { return; } - - try { - const configs: MrzScannerConfiguration = { - // Customize colors, text resources, behavior, etc.. - finderTextHint: 'Please hold your phone over the 2- or 3-line MRZ code at the front of your passport.', - interfaceOrientation: 'PORTRAIT', - // see further configs ... - }; - - if (isPlatform('ios')) { - const widthPx = window.screen.width; - configs.finderWidth = widthPx * 0.9; - configs.finderHeight = widthPx * 0.18; - } - const result = await ScanbotSDKService.SDK.UI.startMrzScanner({ uiConfigs: configs }); - if (result.status === 'CANCELED') { - await presentAlert({ - header: 'Information', - message: 'MRZ scanner canceled.', - buttons: ['OK'], - }); - return; - } - let mrzResultString: string = ''; - result.mrzResult?.fields.forEach(element => { - mrzResultString += (element.name + " : " + element.value + "\r\n"); - }); - await presentAlert({ - header: 'MRZ Results', - message: mrzResultString, - buttons: ['OK'], - }); - } - catch (error) { - console.error(error); - } - } - - // -------------- - // Check Scanner - // -------------- - const startCheckScanner = async () => { - if (!(await ScanbotSDKService.checkLicense())) { return; } - - try { - const configs: CheckRecognizerConfiguration = { - // Customize colors, text resources, behavior, etc.. - enableCameraButtonTitle: 'Enable Camera', - interfaceOrientation: 'PORTRAIT', - finderLineColor: '#0000ff', - // see further configs ... - }; - const checkResult = await ScanbotSDKService.SDK.UI.startCheckRecognizer({ uiConfigs: configs }); - if (checkResult.status === 'CANCELED') { - await presentAlert({ - header: 'Information', - message: 'Check scanner canceled.', - buttons: ['OK'], - }); - return; - } - await presentAlert({ - header: 'Check Result', - message: JSON.stringify(checkResult), - buttons: ['OK'], - }); - } - catch (error) { - console.error(error); - } - } - - // ------------------ - // EHIC Card Scanner - // ------------------ - const startEHICCardScanner = async () => { - if (!(await ScanbotSDKService.checkLicense())) { return; } - - try { - const configs: HealthInsuranceCardScannerConfiguration = { - // Customize colors, text resources, behavior, etc.. - finderTextHint: 'Please hold your phone over the back of your Health Insurance Card.', - interfaceOrientation: 'PORTRAIT', - // see further configs ... - }; - const ehicResult = await ScanbotSDKService.SDK.UI.startEHICScanner({ uiConfigs: configs }); - if (ehicResult.status === 'CANCELED') { - await presentAlert({ - header: 'Information', - message: 'EHIC Scanner canceled.', - buttons: ['OK'], - }); - return; - } - await presentAlert({ - header: 'EHIC Results', - message: JSON.stringify(ehicResult), - buttons: ['OK'], - }); - } - catch (error) { - console.error(error); - } - } - // ------------- - // Data Scanner - // ------------- - const startDataScanner = async () => { - if (!(await ScanbotSDKService.checkLicense())) { return; } - - try { - const uiConfigs: DataScannerConfiguration = { - // Customize colors, text resources, behavior, etc.. - cancelButtonTitle: 'Cancel', - topBarBackgroundColor: '#c8193c', - topBarButtonsColor: '#ffffff', - finderLineColor: '#c8193c', - interfaceOrientation: 'PORTRAIT', - // see further configs... - }; - const scannerStep: TextDataScannerStep = { - textFilterStrategy: 'DOCUMENT', - guidanceText: 'Place the text line in the frame to scan it', - // an optional pattern can be used to validate scanned text and get better OCR results - // '?' for any character, '#' for any digit, all other characters represent themselves. - //pattern: '', - }; - const dataScannerResult = await ScanbotSDKService.SDK.UI.startDataScanner({ uiConfigs, scannerStep }); - if (dataScannerResult.status === 'CANCELED') { - await presentAlert({ - header: 'Information', - message: 'Data scanner canceled.', - buttons: ['OK'], - }); - return; - } - await presentAlert({ - header: 'Data Scanner Results', - message: JSON.stringify(dataScannerResult), - buttons: ['OK'], - }); - } - catch (error) { - console.error(error); + const itemOnClick = async (selectedItem: CoreFeatureIdEnum) => { + switch (selectedItem) { + case CoreFeatureIdEnum.DocumentDetector: + await history.push("/document_scanner/" + selectedItem); + break; + case CoreFeatureIdEnum.BarcodeDetactor: + await history.push("/barcode_scanner/" + selectedItem); + break; + case CoreFeatureIdEnum.DataDetactor: + await history.push("/data_detector/" + selectedItem); + break; + case CoreFeatureIdEnum.Other: + await history.push("/more_api_feature/" + selectedItem); + break; + default: + break; } } - // ---------------------- - // License Plate Scanner - // ---------------------- - const startLicensePlateScanner = async () => { - if (!(await ScanbotSDKService.checkLicense())) { return; } - - try { - const config: LicensePlateScannerConfiguration = { - // Customize colors, text resources, behavior, etc.. - detectorMode: 'ML_BASED', - topBarBackgroundColor: '#c8193c', - topBarButtonsColor: '#ffffff', - cancelButtonTitle: 'Cancel', - finderLineColor: '#c8193c', - finderLineWidth: 5, - guidanceText: 'Place the whole license plate in the frame to scan it', - interfaceOrientation: 'PORTRAIT', - confirmationDialogConfirmButtonFilled: true, - // see further configs... - }; - const licensePlateScannerResult = await ScanbotSDKService.SDK.UI.startLicensePlateScanner({ uiConfigs: config }); - if (licensePlateScannerResult.status === 'CANCELED') { - await presentAlert({ - header: 'Information', - message: 'License plate scanner canceled.', - buttons: ['OK'], - }); - return; - } - await presentAlert({ - header: 'License Plate Results', - message: JSON.stringify(licensePlateScannerResult), - buttons: ['OK'], - }); - } - catch (error) { - console.error(error); - } - } - - // ------------------------- - // Generic Document Scanner - // ------------------------- - const startGenericDocumentScanner = async () => { - if (!(await ScanbotSDKService.checkLicense())) { return; } - - try { - const config: GenericDocumentRecognizerConfiguration = { - // Customize colors, text resources, behavior, etc.. - shouldSavePhotoImageInStorage: true, - // see further configs... - }; - const genericDocumentRecognizerResult = await ScanbotSDKService.SDK.UI.startGenericDocumentRecognizer({ uiConfigs: config }); - if (genericDocumentRecognizerResult.status === 'CANCELED') { - await presentAlert({ - header: 'Information', - message: 'Generic document scanner canceled.', - buttons: ['OK'], - }); - return; - } - await presentAlert({ - header: 'Scanner Results', - message: JSON.stringify(genericDocumentRecognizerResult), - buttons: ['OK'], - }); - } - catch (error) { - console.error(error); - } - } - - // ------------------------- - // SDK License Information - // ------------------------- - const viewLicenseInfo = async () => { - const result = await ScanbotSDKService.SDK.getLicenseInfo(); - await presentAlert({ - header: 'License Info', - message: JSON.stringify(result), - buttons: ['OK'], - }); - } - - // ------------------------- - // OCR Confoguaration - // ------------------------- - const viewOcrConfigs = async () => { - const result = await ScanbotSDKService.SDK.getOcrConfigs(); - await presentAlert({ - header: 'OCR Configs', - message: JSON.stringify(result), - buttons: ['OK'], - }); - } - return ( @@ -541,92 +47,17 @@ const Home: React.FC = () => { - - - Document Scanner - - - { await startDocumentScanner(); }}> - Scan Document - - { await startFinderDocumentScanner(); }}> - Finder Document Scanner - - { history.push("/imagepreview"); }}> - View Image Results - - - - - - Barcode Scanner & Detector - - - { await startBarcodeScanner() }}> - Scan QR-/Barcode - - - { await startBatchBarcodeScanner() }}> - Scan Batch of Barcodes - - - { await detectBarcodeFromImage() }}> - Import Image & Detect Barcodes - - - { await detectBarcodeFromImages() }}> - Import Images & Detect Barcodes - - - - - - - Data Detectors - - { await startMRZScanner() }}> - Scan MRZ - - - { await startEHICCardScanner() }}> - Scan Health Insurance Card - - - { await startCheckScanner() }}> - Scan Checks - - - { await startLicensePlateScanner() }}> - Scan License Plate - - - { await startDataScanner() }}> - Scan Data - - - { await startGenericDocumentScanner() }}> - Scan Generic Documents - - - - - - Test Other SDK API Methods - - - { await viewLicenseInfo(); }}> - View License Info - - { await viewOcrConfigs(); }}> - View OCR Configs - - - - Learn More About the Scanbot SDK - - - - + { + CORE_FEATURES.map((item) => ( + itemOnClick(item.id)}> + + {item.title} + + + {item.description} + + )) + } ); diff --git a/src/pages/ImageEditView.tsx b/src/pages/ImageEditView.tsx index 54d7dbe55..64497d20e 100644 --- a/src/pages/ImageEditView.tsx +++ b/src/pages/ImageEditView.tsx @@ -9,56 +9,31 @@ import { IonButtons, IonBackButton, IonImg, - useIonAlert, - IonModal, - IonList, - IonItem, - IonLabel, - useIonLoading, - useIonViewWillEnter + useIonViewWillEnter, + IonCard, } from '@ionic/react'; -import './styles/ImageEditView.css'; - -import React, { useState, useRef } from 'react'; import { RouteComponentProps } from 'react-router'; +import { modalController } from '@ionic/core'; import { ImageResultsRepository } from '../utils/ImageRepository'; - -/* Scanbot SDK Service */ -import { ScanbotSDKService } from '../services/ScanbotSDKService'; - -import { ImageFilter, Page } from 'cordova-plugin-scanbot-sdk'; +import ScanbotService from '../services/scanbot_service'; +import CommonModalView from './common_components/CommonModalView'; +import { FilterOptions } from '../utils/data_util'; +import { Page, ParametricFilter } from 'capacitor-plugin-scanbot-sdk'; +import { useState } from 'react'; interface ImageEditViewIdProps extends RouteComponentProps<{ pageId: string; }> { } const ImageEditView: React.FC = ({ match }) => { - const imageFilterList: ImageFilter[] = [ - 'NONE', - 'COLOR_ENHANCED', - 'GRAYSCALE', - 'BINARIZED', - 'COLOR_DOCUMENT', - 'PURE_BINARIZED', - 'BACKGROUND_CLEAN', - 'BLACK_AND_WHITE', - 'OTSU_BINARIZATION', - 'DEEP_BINARIZATION', - 'EDGE_HIGHLIGHT', - 'LOW_LIGHT_BINARIZATION', - 'LOW_LIGHT_BINARIZATION_2', - 'SENSITIVE_BINARIZATION' - ]; - const filterModal = useRef(null); - const [present, dismiss] = useIonLoading(); - const [presentAlert] = useIonAlert(); + const [imageData, setImageData] = useState(''); const [selectedPage, setSelectedPage] = useState( ImageResultsRepository.INSTANCE.getPageById(match.params.pageId)! ); - useIonViewWillEnter(async () => { - await loadImageData(); + useIonViewWillEnter(() => { + loadImageData(); }); async function updatePage(page: Page) { @@ -67,44 +42,12 @@ const ImageEditView: React.FC = ({ match }) => { await loadImageData(); } - /* Crop Image */ - async function openCroppingUi() { - if (!(await ScanbotSDKService.checkLicense())) { return; } - - try { - const croppingResult = await ScanbotSDKService.SDK.UI.startCroppingScreen({ - page: selectedPage, - uiConfigs: { - doneButtonTitle: 'Save', - interfaceOrientation: 'PORTRAIT', - topBarBackgroundColor: '#c8193c', - bottomBarBackgroundColor: '#c8193c', - hintTitle: 'Custom hint:\nDrag the dots to the document edges.', - hintTitleColor: '#0000ff' - } - }); - - if (croppingResult.status === "CANCELED") { - await presentAlert({ - header: 'Information', - message: 'Cropping screen cancelled.', - buttons: ['OK'], - }); - return; - } - await updatePage(croppingResult.page!); - } - catch (error) { - console.log(error); - } - } - /* load image data */ async function loadImageData() { - if (!(await ScanbotSDKService.checkLicense())) { return; } + if (!(await ScanbotService.validateLicense())) { return; } try { - const imgData = await ScanbotSDKService.fetchDataFromUri( + const imgData = await ScanbotService.fetchDataFromUri( selectedPage.documentPreviewImageFileUri as string ); setImageData(imgData); @@ -114,36 +57,46 @@ const ImageEditView: React.FC = ({ match }) => { } } - /* Filter Image */ - async function applyFilter(selectedFilter: ImageFilter) { - filterModal.current?.dismiss(); + /* Start the cropping screen */ + const startCroppingScreen = async () => { + if (!(await ScanbotService.validateLicense())) { return; } - if (!(await ScanbotSDKService.checkLicense())) { return; } + try { + const croppingResult = await ScanbotService.startCroppingScreen(selectedPage); + if (croppingResult.status === 'CANCELED') { + alert('Cropping screen has been cancelled.'); + return; + }; + await updatePage(croppingResult.page!); + } + catch (error) { + console.log('Start cropping screen Failed: ', JSON.stringify(error)); + } + } + + /* Apply filter to the image */ + const onFilterSelected = async (selectedFilterItem: ParametricFilter) => { + if (!(await ScanbotService.validateLicense())) { + modalController.dismiss(); + return; + } try { - filterModal.current?.dismiss(); - await present({ - message: 'Loading...', - spinner: 'circles' - }); - const filteredImageResult = await ScanbotSDKService.SDK.applyImageFilterOnPage({ - page: selectedPage, - imageFilter: selectedFilter - }); - await dismiss(); - if (filteredImageResult.status === "CANCELED") { - await presentAlert({ - header: 'Information', - message: 'Image filtering process cancelled.', - buttons: ['OK'], - }); + const filteredResult = await ScanbotService.applyImageFilterOnPage( + selectedPage, + selectedFilterItem + ); + if (filteredResult!.status === 'CANCELED') { + alert('Image filtering process has been cancelled.'); return; - } - await updatePage(filteredImageResult.page); + }; + + await updatePage(filteredResult); + modalController.dismiss(); } catch (error) { - await dismiss(); - console.error(error); + modalController.dismiss(); + console.log('Image filtering process Failed: ' + JSON.stringify(error)); } } @@ -158,31 +111,25 @@ const ImageEditView: React.FC = ({ match }) => { - - + + + + - openCroppingUi()}>Crop + Crop - - Filter - - -
-

Filter Formats

- - {imageFilterList.map((item) => ( - applyFilter(item)}> - {item} - - ))} - -
-
+
diff --git a/src/pages/ImagePreview.tsx b/src/pages/ImagePreview.tsx index c252a6108..12ff8c739 100644 --- a/src/pages/ImagePreview.tsx +++ b/src/pages/ImagePreview.tsx @@ -1,71 +1,46 @@ -import { +import { IonContent, - IonHeader, + IonHeader, IonFooter, - IonPage, - IonTitle, - IonToolbar, - IonBackButton, + IonPage, + IonTitle, + IonToolbar, + IonBackButton, IonButtons, IonButton, - IonImg, - useIonAlert, + IonImg, useIonViewWillEnter, IonGrid, IonRow, IonCol, - IonModal, - IonList, - IonItem, - IonLabel, - useIonLoading, } from '@ionic/react'; +} from '@ionic/react'; import { useHistory } from 'react-router'; -import React, {useState, useRef } from 'react'; +import React, { useState, useRef } from 'react'; +import { modalController } from '@ionic/core'; -import { Page, PDFPageSize } from 'cordova-plugin-scanbot-sdk'; import { ImageResultsRepository } from '../utils/ImageRepository'; - -/* Scanbot SDK Service */ -import { ScanbotSDKService } from '../services/ScanbotSDKService'; +import ScanbotService from '../services/scanbot_service'; +import CommonModalView from './common_components/CommonModalView'; +import { PDFPageSizeList, TiffOptions } from '../utils/data_util'; +import { PDFPageSizeEnum } from '../enums/pdf_page_size_enum'; +import { TiffOptionsEnum } from '../enums/tiff_option_enum'; +import { Page, PageSize } from 'capacitor-plugin-scanbot-sdk'; const ImagePreview: React.FC = () => { - const pdfPageSizeList: PDFPageSize[] = [ - "FROM_IMAGE", - "A4", - "FIXED_A4", - "US_LETTER", - "FIXED_US_LETTER", - "AUTO_LOCALE", - "AUTO" - ]; - const tiffOptions = [ - { - label: "Binarized Images (1-bit)", - binarized: true - }, - { - label: "Color Images", - binarized: false - }, - ]; - - const [presentAlert] = useIonAlert(); - const pdfModal = useRef(null); - const tiffModal = useRef(null); - const [present, dismiss] = useIonLoading(); + const history = useHistory(); - const initialState = useState([]); - const [imageData, setImageData] = initialState; - const pages: Page[] = ImageResultsRepository.INSTANCE.getPages(); + const [imageData, setImageData] = useState([]); - useIonViewWillEnter(async () => { - await reloadPages(); + let pages = useRef([]); + + useIonViewWillEnter(() => { + reloadPages(); }); function hasScannedPages(): boolean { - if (!pages || pages.length === 0) { + if (!pages || pages.current.length === 0) { alert('No scanned images were found. Please scan at least one page.'); return false; } @@ -74,16 +49,20 @@ const ImagePreview: React.FC = () => { /* load scanned documents */ async function reloadPages() { - if (!(await ScanbotSDKService.checkLicense())) { return; } - if (!hasScannedPages()) { return; } + if (!(await ScanbotService.validateLicense())) { return; } + setImageData([]); try { - for (const page of pages) { + pages.current = ImageResultsRepository.INSTANCE.getPages(); + + if (!hasScannedPages()) { return; } + + for (const page of pages.current) { const url = page.documentPreviewImageFileUri as string; - const imageURL = await ScanbotSDKService.fetchDataFromUri(url); - if(imageURL === '' || imageURL === undefined) break; + const imageURL = await ScanbotService.fetchDataFromUri(url); + if (imageURL === '' || imageURL === undefined) break; - setImageData((imageData: any) => [...imageData, {id: page.pageId, url: imageURL}]); + setImageData((imageData: any) => [...imageData, { id: page.pageId, url: imageURL }]); } } catch (error) { @@ -94,123 +73,86 @@ const ImagePreview: React.FC = () => { /* Navigate to cropping page */ function navigateToCroppingPage(pageId: string): void { history.push("/imageeditview/" + pageId); - setImageData(() => initialState) + setImageData([]); } - /* Create PDF */ - async function createPDF(pageSize: PDFPageSize) { - pdfModal.current?.dismiss(); - - if (!(await ScanbotSDKService.checkLicense())) { return; } - if (!hasScannedPages()) { return; } + /* Scan Document */ + const startDocumentScanner = async () => { + if (!(await ScanbotService.validateLicense())) { return; } try { - await present({ - message: 'Loading...', - spinner: 'circles' - }) - const result = await ScanbotSDKService.SDK.createPdf({ - images: pages.map(p => p.documentImageFileUri!), - pageSize: pageSize - }); - await dismiss(); - if (result.status === "CANCELED") { - await presentAlert({ - header: 'Information', - message: result.message, - buttons: ['OK'], - }); + const documentResult = await ScanbotService.startDocumentScanner(); + + if (documentResult!.status === 'CANCELED') { + alert('Document scanner has been canceled.'); return; - } - await presentAlert({ - header: 'Success', - message: result.pdfFileUri, - buttons: ['OK'], - }); + }; + await ImageResultsRepository.INSTANCE.addPages(documentResult!.pages); + await reloadPages(); } catch (error) { - await dismiss(); - console.error(error); + console.log('Scan Document Failed: ' + JSON.stringify(error)); } } - /* Create TIFF */ - async function createTIFF(binarized: boolean) { - tiffModal.current?.dismiss(); - - if (!(await ScanbotSDKService.checkLicense())) { return; } - if (!hasScannedPages()) { return; } + /* Create PDF from scanned image urls */ + const createPDF = async (selectedItem: PDFPageSizeEnum) => { + if (!(await ScanbotService.validateLicense())) { + modalController.dismiss(); + return; + } try { - await present({ - message: 'Loading...', - spinner: 'circles' - }); - const result = await ScanbotSDKService.SDK.writeTiff({ - images: pages.map(p => p.documentImageFileUri!), - oneBitEncoded: binarized, - dpi: 300, - compression: binarized ? 'CCITT_T6' : 'ADOBE_DEFLATE', - }); - await dismiss(); - if (result.status !== "CANCELED") { - await presentAlert({ - header: 'Success', - message: result.tiffFileUri, - buttons: ['OK'], - }); - } - else { - await presentAlert({ - header: 'Information', - message: result.message, - buttons: ['OK'], - }); + const imageUrls = pages.current.map(p => p.originalImageFileUri!); + const pdfPageSize = PDFPageSizeList[selectedItem].value as PageSize; + + const result = await ScanbotService.createPDF(imageUrls, pdfPageSize); + modalController.dismiss(); + if (result!.status === 'CANCELED') { + alert('PDF Creation has been canceled.'); return; - } + }; + alert(JSON.stringify(result)); } catch (error) { - await dismiss(); - console.error(error); + modalController.dismiss(); + console.log('PDF Creation Failed: ' + JSON.stringify(error)); } } - /* Perform OCR, read text from images */ - async function runOCR() { - if (!(await ScanbotSDKService.checkLicense())) { return; } - if (!hasScannedPages()) { return; } + /* Create TIFF from scanned image urls */ + const writeTIFF = async (selectedItem: TiffOptionsEnum) => { + if (!(await ScanbotService.validateLicense())) { + modalController.dismiss(); + return; + } try { - await present({ - message: 'Processing...', - spinner: 'circles' - }); - const ocrResult = await ScanbotSDKService.SDK.performOcr({ - images: pages.map(p => p.documentImageFileUri!), - languages: ['en', 'de'], - outputFormat: 'FULL_OCR_RESULT', - }); - await dismiss(); - if (ocrResult.status === 'CANCELED') { - await presentAlert({ - header: 'Information', - message: 'OCR process canceled.', - buttons: ['OK'], - }); + const imageUrls = pages.current.map(p => p.documentImageFileUri!); + const binarized = selectedItem === TiffOptionsEnum.Binarized; + + const result = await ScanbotService.writeTIFF(imageUrls, binarized); + + if (result!.status == 'CANCELED') { + alert('TIFF Creation has been canceled.'); return; - } - await presentAlert({ - header: 'OCR Results', - message: JSON.stringify(ocrResult), - buttons: ['OK'], - }); + }; + modalController.dismiss(); + alert(JSON.stringify(result)); } catch (error) { - await dismiss(); - console.error(error); + modalController.dismiss(); + console.log('TIFF Creation Failed: ' + JSON.stringify(error)); } } + const deleteAll = async () => { + await ImageResultsRepository.INSTANCE.removeAllPages(); + pages.current = []; + setImageData([]); + await ScanbotService.cleanUp(); + } + return ( @@ -218,55 +160,48 @@ const ImagePreview: React.FC = () => { - Display Images + Image Preview - - {imageData.map((page: any) => ( - - navigateToCroppingPage(page.id)} src={page.url} /> - - ))} - + + {imageData.map((page: any) => ( + + navigateToCroppingPage(page.id)} src={page.url} /> + + ))} + - Create PDF - -
-

Page Size

- - {pdfPageSizeList.map((item) => ( - createPDF(item)}> - {item} - - ))} - -
-
- runOCR()}>Run OCR + + Add + + + + +
- Create TIFF - -
-

Image Type

- - {tiffOptions.map((item) => ( - createTIFF(item.binarized)}> - {item.label} - - ))} - -
-
+ Delete
diff --git a/src/pages/common_components/CommonEmptyView.tsx b/src/pages/common_components/CommonEmptyView.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/src/pages/common_components/CommonModalView.tsx b/src/pages/common_components/CommonModalView.tsx new file mode 100644 index 000000000..ef8a31f0f --- /dev/null +++ b/src/pages/common_components/CommonModalView.tsx @@ -0,0 +1,52 @@ +import { IonButton, IonContent, IonHeader, IonItem, IonLabel, IonList, IonModal, IonTitle, IonToolbar } from "@ionic/react"; +import { useRef } from "react"; + +type Props = { + id: string, + modalTitle: string, + buttonTitle: string, + initialBreakPoint: number, + optionList: { key: any; value: string; }[], + onItemClick: Function +}; + +const CommonModalView: React.FC = (props: Props) => { + + const modal = useRef(null); + + async function dismiss() { + await modal.current?.dismiss(); + } + + return ( + <> + + {props.buttonTitle} + + + + + + {props.modalTitle} + + Cancel + + + + + + { + props.optionList.map((item) => ( + props.onItemClick(item.key)}> + {item.value} + + )) + } + + + + + ); +} + +export default CommonModalView; \ No newline at end of file diff --git a/src/pages/common_components/CoreFeatureItemsView.tsx b/src/pages/common_components/CoreFeatureItemsView.tsx new file mode 100644 index 000000000..6a10d6a43 --- /dev/null +++ b/src/pages/common_components/CoreFeatureItemsView.tsx @@ -0,0 +1,37 @@ +import { IonBackButton, IonButtons, IonContent, IonHeader, IonItem, IonLabel, IonList, IonPage, IonTitle, IonToolbar } from "@ionic/react"; +import { CoreFeatureEnum } from "../../enums/core_feature_enum"; + +type Props = { + title: string, + dataList: { key: CoreFeatureEnum; value: string; }[], + onItemClick: Function +}; + +const CoreFeatureItemsView: React.FC = (props: Props) => { + return ( + + + + + + + {props.title} + + + + + + { + props.dataList.map((item) => ( + props.onItemClick(item.key)}> + {item.value} + + )) + } + + + + ); +} + +export default CoreFeatureItemsView; \ No newline at end of file diff --git a/src/pages/features/barcode_detectors/BarcodeResultPage.tsx b/src/pages/features/barcode_detectors/BarcodeResultPage.tsx new file mode 100644 index 000000000..c813d2af5 --- /dev/null +++ b/src/pages/features/barcode_detectors/BarcodeResultPage.tsx @@ -0,0 +1,44 @@ +import { IonBackButton, IonButtons, IonContent, IonHeader, IonItem, IonLabel, IonList, IonPage, IonTitle, IonToolbar, useIonViewWillEnter } from "@ionic/react"; +import { useState } from "react"; +import { BarcodeRepository } from "../../../utils/BarcodeRepository"; +import { BarcodeResultField } from "capacitor-plugin-scanbot-sdk"; + +const BarcodeResultPage: React.FC = () => { + + const [barcodeList, setBarcodeList] = useState([]); + + useIonViewWillEnter(() => { + var barcodes = BarcodeRepository.getBarcodes(); + setBarcodeList(barcodes); + }) + + return ( + + + + + + + Barcode Result + + + + + + { + barcodeList.map((barcode) => ( + + +

{barcode.textWithExtension}

+

{barcode.type}

+
+
+ )) + } +
+
+
+ ); +} + +export default BarcodeResultPage; \ No newline at end of file diff --git a/src/pages/features/barcode_detectors/BarcodeScannerPage.tsx b/src/pages/features/barcode_detectors/BarcodeScannerPage.tsx new file mode 100644 index 000000000..50e827dfe --- /dev/null +++ b/src/pages/features/barcode_detectors/BarcodeScannerPage.tsx @@ -0,0 +1,138 @@ +import { useIonViewWillEnter } from "@ionic/react"; +import { RouteComponentProps, useHistory } from "react-router"; +import { CoreFeatureEnum } from "../../../enums/core_feature_enum"; +import { GetItemList } from "../../../utils/data_util"; +import { CoreFeatureIdEnum } from "../../../enums/core_feature_id_enum"; +import { useState } from "react"; +import CoreFeatureItemsView from "../../common_components/CoreFeatureItemsView"; +import ScanbotService from "../../../services/scanbot_service"; +import { BarcodeRepository } from "../../../utils/BarcodeRepository"; +import { PickImage } from "../../../utils/camera_util"; + +interface BarcodeScannerProps extends RouteComponentProps<{ selectedItem: string; }> { } + +let itemList: { key: CoreFeatureEnum; value: string; }[] = []; + +const BarcodeScannerPage: React.FC = ({ match }) => { + + const history = useHistory(); + + const [dataList, setDataList] = useState(itemList); + + const selectedItem = match.params.selectedItem as unknown as CoreFeatureIdEnum; + + useIonViewWillEnter(() => { + let coreItems = GetItemList(selectedItem); + setDataList(coreItems); + }); + + /** Start RTU UI Single Scanner */ + const startSingleBarcodeScanner = async () => { + if (!(await ScanbotService.validateLicense())) { return; } + + try { + const barcodeResult = await ScanbotService.startSingleBarcodeScanner(); + if (barcodeResult!.status === 'CANCELED') { + alert('Single Barcode Scanner has been cancelled.'); + return; + }; + + await navigateToBarcodeResultPage(barcodeResult.items!); + } + catch (error) { + console.log('Scan Barcodes Failed: ' + JSON.stringify(error)); + } + } + + /** Start RTU UI Multi Scanner */ + const startMultiBarcodeScanner = async () => { + if (!(await ScanbotService.validateLicense())) { return; } + + try { + const batchBarcodeResult = await ScanbotService.startMultiBarcodeScanner(); + if (batchBarcodeResult!.status === 'CANCELED') { + alert('Multi Barcode Scanner has been cancelled.'); + return; + }; + await navigateToBarcodeResultPage(batchBarcodeResult.items!); + } + catch (error) { + console.log('Scan Barcodes Failed: ' + JSON.stringify(error)); + } + } + + /** Start RTU UI Multi with AR Scanner */ + const startMultiARBarcodeScanner = async () => { + if (!(await ScanbotService.validateLicense())) { return; } + + try { + const batchBarcodeResult = await ScanbotService.startMultiARBarcodeScanner(); + if (batchBarcodeResult!.status === 'CANCELED') { + alert('Multi Barcode Scanner has been cancelled.'); + return; + }; + await navigateToBarcodeResultPage(batchBarcodeResult.items!); + } + catch (error) { + console.log('Scan Barcodes Failed: ' + JSON.stringify(error)); + } + } + + /** Detect barcodes from a imported image */ + const detectBarcodesFromImage = async () => { + if (!(await ScanbotService.validateLicense())) { return; } + + try { + const originalImageFileUri = await PickImage(); + const detectedBarcodesResult = await ScanbotService.detectBarcodesOnImage(originalImageFileUri); + if (detectedBarcodesResult!.status === 'CANCELED') { + alert('Barcode detector has been cancelled.'); + return; + }; + await navigateToBarcodeResultPage(detectedBarcodesResult!.barcodes); + } + catch (error) { + console.log('Detect Barcodes Failed: ' + JSON.stringify(error)); + } + } + + /** Navigate to barcode result page */ + const navigateToBarcodeResultPage = async (barcodes: any) => { + try { + await BarcodeRepository.addBarcodes(barcodes); + await history.push('/barcode_result'); + } + catch (error) { + console.log('Navigate to barcode result page failed: ' + JSON.stringify(error)); + } + } + + // ----------------- + // Item Click Event + // ----------------- + const onItemClick = async (selectedItem: CoreFeatureEnum) => { + switch (selectedItem) { + case CoreFeatureEnum.SingleBarcode: + await startSingleBarcodeScanner(); + break; + case CoreFeatureEnum.MultiBarcode: + await startMultiBarcodeScanner(); + break; + case CoreFeatureEnum.MultiARBarcode: + await startMultiARBarcodeScanner(); + break; + case CoreFeatureEnum.ImportBarcodeImage: + await detectBarcodesFromImage(); + break; + default: + alert('Please try again!'); + break; + } + } + + return ( + + ); +} + +export default BarcodeScannerPage; \ No newline at end of file diff --git a/src/pages/features/data_detectors/CheckResultPage.tsx b/src/pages/features/data_detectors/CheckResultPage.tsx new file mode 100644 index 000000000..73dc769a8 --- /dev/null +++ b/src/pages/features/data_detectors/CheckResultPage.tsx @@ -0,0 +1,19 @@ +import { useIonViewWillEnter } from "@ionic/react"; +import { useState } from "react"; +import { DataDetectorRepository } from "../../../utils/data_detector_repository"; +import CommonDataDetectorResultView from "./CommonDataDetectorResultView"; + +const CheckResultPage: React.FC = () => { + var itemList: { name: string; value: string; }[] = []; + const [dataList, setDataList] = useState(itemList); + + useIonViewWillEnter(() => { + setDataList(DataDetectorRepository.CheckResult) + }); + + return ( + + ); +} + +export default CheckResultPage; \ No newline at end of file diff --git a/src/pages/features/data_detectors/CommonDataDetectorResultView.tsx b/src/pages/features/data_detectors/CommonDataDetectorResultView.tsx new file mode 100644 index 000000000..6e2f14a8f --- /dev/null +++ b/src/pages/features/data_detectors/CommonDataDetectorResultView.tsx @@ -0,0 +1,39 @@ +import { IonBackButton, IonButtons, IonContent, IonHeader, IonItem, IonLabel, IonList, IonPage, IonTitle, IonToolbar } from "@ionic/react"; + +type Props = { + title: string, + dataList: { name: any; value: string; }[], +}; + +const CommonDataDetectorResultView: React.FC = (props: Props) => { + + return ( + + + + + + + {props.title} + + + + + + { + props.dataList.map((item) => ( + + +

{item.name}

+

{item.value}

+
+
+ )) + } +
+
+
+ ); +} + +export default CommonDataDetectorResultView; \ No newline at end of file diff --git a/src/pages/features/data_detectors/DataDetectorPage.tsx b/src/pages/features/data_detectors/DataDetectorPage.tsx new file mode 100644 index 000000000..4a6258fae --- /dev/null +++ b/src/pages/features/data_detectors/DataDetectorPage.tsx @@ -0,0 +1,213 @@ +import { useIonViewWillEnter } from "@ionic/react"; +import { RouteComponentProps, useHistory } from "react-router"; +import { CoreFeatureEnum } from "../../../enums/core_feature_enum"; +import { GetItemList } from "../../../utils/data_util"; +import { CoreFeatureIdEnum } from "../../../enums/core_feature_id_enum"; +import { useState } from "react"; +import CoreFeatureItemsView from "../../common_components/CoreFeatureItemsView"; +import ScanbotService from "../../../services/scanbot_service"; +import { DataDetectorRepository } from "../../../utils/data_detector_repository"; +import { PickImage } from "../../../utils/camera_util"; + +interface DataDetectorPageProps extends RouteComponentProps<{ selectedItem: string; }> { } + +let itemList: { key: CoreFeatureEnum; value: string; }[] = []; + +const DataDetectorPage: React.FC = ({ match }) => { + + const history = useHistory(); + + const [dataList, setDataList] = useState(itemList); + + const selectedItem = match.params.selectedItem as unknown as CoreFeatureIdEnum; + + useIonViewWillEnter(() => { + let coreItems = GetItemList(selectedItem); + setDataList(coreItems); + }); + + /** Detect MRZ data */ + const startMRZScanner = async () => { + if (!(await ScanbotService.validateLicense())) { return; } + + try { + const mrzResult = await ScanbotService.startMrzScanner(); + if (mrzResult!.status === 'CANCELED') { + alert('MRZ detector has been cancelled.'); + return; + }; + DataDetectorRepository.GeneratMRZResult(mrzResult); + await history.push('/mrz_result'); + } + catch (error) { + console.log('Detect MRZ data Failed: ' + JSON.stringify(error)); + } + } + + /** Detect EHIC data */ + const startEHICScanner = async () => { + if (!(await ScanbotService.validateLicense())) { return; } + + try { + const ehicResult = await ScanbotService.startEHICScanner(); + if (ehicResult!.status === 'CANCELED') { + alert('EHIC detector has been cancelled.'); + return; + }; + DataDetectorRepository.GeneratEHICResult(ehicResult!); + await history.push('/ehic_result'); + } + catch (error) { + console.log('Detect EHIC data Failed: ' + JSON.stringify(error)); + } + } + + /** Datect data from a check */ + const startCheckScanner = async () => { + if (!(await ScanbotService.validateLicense())) { return; } + + try { + const checkResult = await ScanbotService.startCheckRecognizer(); + if (checkResult!.status === 'CANCELED') { + alert('Check data detector has been cancelled.'); + return; + }; + DataDetectorRepository.GenerateCheckResult(checkResult!); + await history.push('/check_result'); + } + catch (error) { + console.log('Detect Check data Failed:' + JSON.stringify(error)); + } + } + + /** Detect check data from imported image */ + const detectCheckFromImage = async () => { + if (!(await ScanbotService.validateLicense())) { return; } + + try { + const originalImageFileUri = await PickImage(); + + const checkResult = await ScanbotService.recognizeCheck(originalImageFileUri); + if (checkResult!.status === 'CANCELED') { + alert('Check data detector has been cancelled.'); + return; + }; + DataDetectorRepository.GenerateCheckResult(checkResult!); + await history.push('/check_result'); + } + catch (error) { + console.log('Detect Check data Failed: ' + JSON.stringify(error)); + } + } + + /** Detect license plate data */ + const startLicensePlateScaner = async () => { + if (!(await ScanbotService.validateLicense())) { return; } + + try { + const licensePlateResult = await ScanbotService.startLicensePlateScanner(); + if (licensePlateResult!.status === 'CANCELED') { + alert('License plate data detector has been cancelled.'); + return; + }; + alert(JSON.stringify(licensePlateResult)); + } + catch (error) { + console.log('Detect license plate data Failed: ' + JSON.stringify(error)); + } + } + + /** Detect medical certificate data */ + const startMedicalCertificateScanner = async () => { + if (!(await ScanbotService.validateLicense())) { return; } + + try { + const medicalCertificateResult = await ScanbotService.startMedicalCertificateRecognizer(); + console.log(JSON.stringify(medicalCertificateResult)); + if (medicalCertificateResult!.status === 'CANCELED') { + alert('Medicle certificate data detector has been cancelled.'); + return; + }; + DataDetectorRepository.GenerateMedData(medicalCertificateResult); + await history.push('/medical_certificate_result'); + } + catch (error) { + console.log('Detect Medical data Failed: ' + JSON.stringify(error)); + } + } + + /** Detect text data */ + const startScanTextDataScaner = async () => { + if (!(await ScanbotService.validateLicense())) { return; } + + try { + const textResult = await ScanbotService.startTextDataScanner(); + if (textResult!.status == 'CANCELED') { + alert('Text data detector has been cancelled.'); + return; + }; + alert(JSON.stringify(textResult)); + } + catch (error) { + console.log('Detect text data Failed: ' + JSON.stringify(error)); + } + } + + /** Open generic document scanner */ + const startGenericDocumentScaner = async () => { + if (!(await ScanbotService.validateLicense())) { return; } + + try { + const genericDocumentResult = await ScanbotService.startGenericDocumentRecognizer(); + if (genericDocumentResult!.status == 'CANCELED') { + alert('Generic document scanner has been cancelled.'); + return; + }; + alert(JSON.stringify(genericDocumentResult)); + } + catch (error) { + console.log('Generic document scanner Failed: ' + JSON.stringify(error)); + } + } + + // ----------------- + // Item Click Event + // ----------------- + const onItemClick = async (selectedItem: CoreFeatureEnum) => { + switch (selectedItem) { + case CoreFeatureEnum.MRZ: + await startMRZScanner(); + break; + case CoreFeatureEnum.EHIC: + await startEHICScanner(); + break; + case CoreFeatureEnum.Check: + await startCheckScanner(); + break; + case CoreFeatureEnum.ImportCheckOnImage: + await detectCheckFromImage(); + break; + case CoreFeatureEnum.LicensePlate: + await startLicensePlateScaner(); + break; + case CoreFeatureEnum.MedicalCertificate: + await startMedicalCertificateScanner(); + break; + case CoreFeatureEnum.TextData: + await startScanTextDataScaner(); + break; + case CoreFeatureEnum.GenericDocument: + await startGenericDocumentScaner(); + break; + default: + alert('Please try again!'); + break; + } + } + + return ( + + ); +}; + +export default DataDetectorPage; \ No newline at end of file diff --git a/src/pages/features/data_detectors/EHICResultPage.tsx b/src/pages/features/data_detectors/EHICResultPage.tsx new file mode 100644 index 000000000..4eee86734 --- /dev/null +++ b/src/pages/features/data_detectors/EHICResultPage.tsx @@ -0,0 +1,19 @@ +import { useIonViewWillEnter } from "@ionic/react"; +import { useState } from "react"; +import { DataDetectorRepository } from "../../../utils/data_detector_repository"; +import CommonDataDetectorResultView from "./CommonDataDetectorResultView"; + +const EHICResultPage: React.FC = () => { + var itemList: { name: string; value: string; }[] = []; + const [dataList, setDataList] = useState(itemList); + + useIonViewWillEnter(() => { + setDataList(DataDetectorRepository.EHICResult) + }); + + return ( + + ); +} + +export default EHICResultPage; \ No newline at end of file diff --git a/src/pages/features/data_detectors/MRZResultPage.tsx b/src/pages/features/data_detectors/MRZResultPage.tsx new file mode 100644 index 000000000..92d62564e --- /dev/null +++ b/src/pages/features/data_detectors/MRZResultPage.tsx @@ -0,0 +1,19 @@ +import { useIonViewWillEnter } from "@ionic/react"; +import { useState } from "react"; +import { DataDetectorRepository } from "../../../utils/data_detector_repository"; +import CommonDataDetectorResultView from "./CommonDataDetectorResultView"; + +const MRZResultPage: React.FC = () => { + var itemList: { name: string; value: string; }[] = []; + const [dataList, setDataList] = useState(itemList); + + useIonViewWillEnter(() => { + setDataList(DataDetectorRepository.MrzResult); + }); + + return ( + + ); +} + +export default MRZResultPage; \ No newline at end of file diff --git a/src/pages/features/data_detectors/MedicalCertificateResultPage.tsx b/src/pages/features/data_detectors/MedicalCertificateResultPage.tsx new file mode 100644 index 000000000..c93a5a9dc --- /dev/null +++ b/src/pages/features/data_detectors/MedicalCertificateResultPage.tsx @@ -0,0 +1,53 @@ +import { IonBackButton, IonButtons, IonContent, IonHeader, IonItem, IonItemDivider, IonItemGroup, IonLabel, IonList, IonPage, IonTitle, IonToolbar, useIonViewWillEnter } from "@ionic/react"; +import { useState } from "react"; +import { DataDetectorRepository } from "../../../utils/data_detector_repository"; + +const MedicalCertificateResultPage: React.FC = () => { + + var itemList: { title: string; items: { key: string; value: string; }[]; }[] = []; + const [dataList, setDataList] = useState(itemList); + + useIonViewWillEnter(() => { + setDataList(DataDetectorRepository.MedicalCertifacteResult) + }); + + return ( + + + + + + + Med Result + + + + + + { + dataList.map((medItem, index) => ( + + + {medItem.title} + + + { + medItem.items.map((item, index) => ( + + +

{item.key}

+

{item.value}

+
+
+ )) + } +
+ )) + } +
+
+
+ ); +} + +export default MedicalCertificateResultPage; \ No newline at end of file diff --git a/src/pages/features/document_detectors/DocumentScannerPage.tsx b/src/pages/features/document_detectors/DocumentScannerPage.tsx new file mode 100644 index 000000000..b13c7cdf2 --- /dev/null +++ b/src/pages/features/document_detectors/DocumentScannerPage.tsx @@ -0,0 +1,93 @@ +import { useIonViewWillEnter } from "@ionic/react"; +import { RouteComponentProps, useHistory } from "react-router"; +import { CoreFeatureEnum } from "../../../enums/core_feature_enum"; +import { GetItemList } from "../../../utils/data_util"; +import { CoreFeatureIdEnum } from "../../../enums/core_feature_id_enum"; +import { useState } from "react"; +import CoreFeatureItemsView from "../../common_components/CoreFeatureItemsView"; +import ScanbotService from "../../../services/scanbot_service"; +import { ImageResultsRepository } from "../../../utils/ImageRepository"; + +interface DocumentScannerProps extends RouteComponentProps<{ selectedItem: string; }> { } + +let itemList: { key: CoreFeatureEnum; value: string; }[] = []; + +const DocumentScannerPage: React.FC = ({ match }) => { + const history = useHistory(); + + const [dataList, setDataList] = useState(itemList); + + const selectedItem = match.params.selectedItem as unknown as CoreFeatureIdEnum; + + useIonViewWillEnter(() => { + let coreItems = GetItemList(selectedItem); + setDataList(coreItems); + }); + + /** Start document scanner for capture documents */ + const startDocumentScanner = async () => { + if (!(await ScanbotService.validateLicense())) { return; } + + try { + const documentResult = await ScanbotService.startDocumentScanner(); + if (documentResult.status === 'CANCELED') { + alert('Document scanner has been canceled.'); + return; + } + await ImageResultsRepository.INSTANCE.addPages(documentResult.pages); + history.push("/imagepreview"); + } + catch (error) { + console.log(JSON.stringify(error)); + } + } + + /** Start finder socument scanner for capture documents */ + const startFinderDocumentScanner = async () => { + if (!await ScanbotService.validateLicense()) return; + + try { + const finderDocumentResult = await ScanbotService.startFinderDocumentScanner(); + if (finderDocumentResult!.status === 'CANCELED') { + alert('Finder Document scanner has been canceled.'); + return; + }; + await ImageResultsRepository.INSTANCE.addPages(finderDocumentResult!.pages); + await history.push('/imagepreview'); + } + catch (error) { + console.log('Scan Document Failed: ' + JSON.stringify(error)); + } + } + + // ----------------- + // Item Click Event + // ----------------- + const onItemClick = async (selectedItem: CoreFeatureEnum) => { + switch (selectedItem) { + case CoreFeatureEnum.Document: { + await startDocumentScanner(); + break; + } + case CoreFeatureEnum.FinderDocument: { + await startFinderDocumentScanner(); + break; + } + case CoreFeatureEnum.ImageResult: { + if (!await ScanbotService.validateLicense()) return; + await history.push('/imagepreview'); + break; + } + default: { + alert('Please try again!'); + break; + } + } + } + + return ( + + ); +}; + +export default DocumentScannerPage; \ No newline at end of file diff --git a/src/pages/features/other_api_features/MoreFeaturePage.tsx b/src/pages/features/other_api_features/MoreFeaturePage.tsx new file mode 100644 index 000000000..4da893de9 --- /dev/null +++ b/src/pages/features/other_api_features/MoreFeaturePage.tsx @@ -0,0 +1,74 @@ +import { useIonViewWillEnter } from "@ionic/react"; +import { RouteComponentProps, useHistory } from "react-router"; +import { CoreFeatureEnum } from "../../../enums/core_feature_enum"; +import { GetItemList } from "../../../utils/data_util"; +import { CoreFeatureIdEnum } from "../../../enums/core_feature_id_enum"; +import { useState } from "react"; +import CoreFeatureItemsView from "../../common_components/CoreFeatureItemsView"; +import ScanbotService from "../../../services/scanbot_service"; + +interface MoreFeaturePageProps extends RouteComponentProps<{ selectedItem: string; }> { } + +let itemList: { key: CoreFeatureEnum; value: string; }[] = []; + +const MoreFeaturePage: React.FC = ({ match }) => { + + const [dataList, setDataList] = useState(itemList); + + const selectedItem = match.params.selectedItem as unknown as CoreFeatureIdEnum; + + useIonViewWillEnter(() => { + let coreItems = GetItemList(selectedItem); + setDataList(coreItems); + }); + + // get license info + const getLicenseInfo = async () => { + try { + const licenseInfo = await ScanbotService.viewLicenseInfo(); + alert(JSON.stringify(licenseInfo)); + } catch (error) { + console.log('Failed: ' + JSON.stringify(error)); + } + } + + // get ocr info + const getOCRInfo = async () => { + try { + const ocrInfo = await ScanbotService.viewOcrConfigs(); + alert(JSON.stringify(ocrInfo)); + } catch (error) { + console.log('Failed: ', JSON.stringify(error)); + } + } + + // ----------------- + // Item Click Event + // ----------------- + const onItemClick = async (selectedItem: CoreFeatureEnum) => { + switch (selectedItem) { + case CoreFeatureEnum.LicenseInfo: { + await getLicenseInfo(); + break; + } + case CoreFeatureEnum.OCRInfo: { + await getOCRInfo(); + break; + } + case CoreFeatureEnum.LearnMore: { + window.location.href = String('https://scanbot.io'); + break; + } + default: { + alert('Please try again!'); + break; + } + } + } + + return ( + + ); +}; + +export default MoreFeaturePage; \ No newline at end of file diff --git a/src/services/ScanbotSDKService.tsx b/src/services/ScanbotSDKService.tsx deleted file mode 100644 index d839af723..000000000 --- a/src/services/ScanbotSDKService.tsx +++ /dev/null @@ -1,24 +0,0 @@ -/* Scanbot SDK */ -import ScanbotSdk from 'cordova-plugin-scanbot-sdk'; - -export class ScanbotSDKService { - public static SDK = ScanbotSdk.promisify!(); - private static ImageExtension: String = 'JPG'; - - public static async checkLicense() { - const result = await this.SDK.getLicenseInfo(); - if (result.info.isLicenseValid) { - // OK - we have a trial session, a valid trial license or valid production license. - return true; - } - console.log(JSON.stringify(result)); - alert('Scanbot SDK (trial) license has expired!'); - return false; - } - - public static async fetchDataFromUri(path: string): Promise { - const result = await this.SDK.getImageData({ imageFileUri: path }); - // ScanbotSDK return the raw base64 data. Add prefix to convert it to a dataUri - return `data:image/${(ScanbotSDKService.ImageExtension)};base64,` + result.base64ImageData; - } -} \ No newline at end of file diff --git a/src/services/scanbot_service.ts b/src/services/scanbot_service.ts new file mode 100644 index 000000000..421ab0271 --- /dev/null +++ b/src/services/scanbot_service.ts @@ -0,0 +1,488 @@ +import { Directory, Filesystem } from "@capacitor/filesystem"; + +import { + ScanbotSDK, + ScanbotSdkConfiguration, + DocumentScannerConfiguration, + MrzScannerConfiguration, + HealthInsuranceCardScannerConfiguration, + CheckRecognizerConfiguration, + TextDataScannerConfiguration, + LicensePlateScannerConfiguration, + MedicalCertificateRecognizerConfiguration, + CroppingConfiguration, + Page, + FinderDocumentScannerConfiguration, + ParametricFilter, + PageSize, + ScanbotBinarizationFilter, + GenericDocumentRecognizerConfiguration, +} from "capacitor-plugin-scanbot-sdk"; + +import { startBarcodeScanner, BarcodeScannerConfiguration, SingleScanningMode, MultipleScanningMode, BarcodeMappedData } from 'capacitor-plugin-scanbot-sdk/ui_v2'; + +export default class ScanbotService { + + /* + * TODO add the license key here. + * Please note: The Scanbot SDK will run without a license key for one minute per session! + * After the trial period has expired, all SDK functions and UI components will stop working. + * You can get a free "no-strings-attached" trial license. + * Please submit the trial license form (https://scanbot.io/trial/) on our website using + * the app identifier "io.scanbot.example.sdk.capacitor.ionic.vuejs" of this example app + * or of your app (see capacitor.config.ts). + */ + private static readonly LICENSE_KEY = ""; + + // If true, a custom storage base directory will be set. + private static readonly USE_CUSTOM_STORAGE = false; + + // If USE_CUSTOM_STORAGE is true, this will be the name of the base directory. + private static readonly CUSTOM_STORAGE_NAME = "my-demo-custom-storage"; + + private static ImageExtension: String = 'JPG'; + + // ------------------------- + // Initialize Scanbot SDK + // ------------------------- + public static initSdk = async () => { + const configuration: ScanbotSdkConfiguration = { + allowGpuAcceleration: true, + allowXnnpackAcceleration: true, + licenseKey: this.LICENSE_KEY, + }; + + if (this.USE_CUSTOM_STORAGE) { + configuration.storageBaseDirectory = await this.getStorageBaseDirectory(); + console.log("Changed Storage Base Directory to " + configuration.storageBaseDirectory); + } + try { + const result = await ScanbotSDK.initializeSDK(configuration); + console.log(JSON.stringify(result)); + } catch (error) { + console.log('Initialization Failed: ' + JSON.stringify(error)); + } + } + + // ------------------------- + // Get system storage path + // ------------------------- + private static getStorageBaseDirectory = async () => { + return (await Filesystem.getUri({ path: this.CUSTOM_STORAGE_NAME, directory: Directory.External })).uri; + } + + // ------------------------- + // Validate license + // ------------------------- + public static validateLicense = async () => { + try { + const result = await ScanbotSDK.getLicenseInfo(); + if (result?.isLicenseValid) { + // OK - we have a trial session, a valid trial license or valid production license. + return true; + } + alert('Scanbot SDK (trial) license has expired!'); + return false; + } + catch (error) { + console.log('License Validation Failed: ' + JSON.stringify(error)); + return false; + } + } + + // ----------------- + // Document Scanner + // ----------------- + public static startDocumentScanner = async () => { + const configs: DocumentScannerConfiguration = { + cameraPreviewMode: 'FILL_IN', + orientationLockMode: 'PORTRAIT', + pageCounterButtonTitle: '%d Page(s)', + multiPageEnabled: true, + ignoreBadAspectRatio: true, + topBarBackgroundColor: '#c8193c', + bottomBarBackgroundColor: '#c8193c', + // see further configs ... + }; + return await ScanbotSDK.startDocumentScanner(configs); + } + + // ------------------------ + // Finder Document Scanner + // ------------------------ + public static startFinderDocumentScanner = async () => { + const configs: FinderDocumentScannerConfiguration = { + // Customize colors, text resources, behavior, etc.. + cameraPreviewMode: 'FILL_IN', + orientationLockMode: 'PORTRAIT', + ignoreBadAspectRatio: true, + topBarBackgroundColor: '#c8193c', + finderEnabled: true, + // see further configs ... + }; + return await ScanbotSDK.startFinderDocumentScanner(configs); + } + + public static async fetchDataFromUri(path: string): Promise { + const result = await ScanbotSDK.getImageData({ imageFileUri: path }); + // ScanbotSDK return the raw base64 data. Add prefix to convert it to a dataUri + return `data:image/${(this.ImageExtension)};base64,` + result.base64ImageData; + } + + // ---------------- + // Cropping Screen + // ---------------- + public static startCroppingScreen = async (page: Page) => { + const configuration: CroppingConfiguration = { + // Pass your scanned page here: + //page: scannedPage, + // Customize colors, text resources, behavior, etc.. + doneButtonTitle: "Save", + orientationLockMode: "PORTRAIT", + topBarBackgroundColor: "#c8193c", + // see further configs ... + }; + return await ScanbotSDK.startCroppingScreen({ + page: page, + configuration: configuration, + }); + } + + // // ---------------- + // // Single Barcode Scanner + // // ---------------- + public static startSingleBarcodeScanner = async () => { + // Create the default configuration object. + const config = new BarcodeScannerConfiguration(); + + // Initialize the use case for single scanning. + config.useCase = new SingleScanningMode(); + + // Enable and configure the confirmation sheet. + config.useCase.confirmationSheetEnabled = true; + config.useCase.sheetColor = '#FFFFFF'; + + // Hide/unhide the barcode image. + config.useCase.barcodeImageVisible = true; + + // Configure the barcode title of the confirmation sheet. + config.useCase.barcodeTitle.visible = true; + config.useCase.barcodeTitle.color = '#000000'; + + // Configure the barcode subtitle of the confirmation sheet. + config.useCase.barcodeSubtitle.visible = true; + config.useCase.barcodeSubtitle.color = '#000000'; + + // Configure the cancel button of the confirmation sheet. + config.useCase.cancelButton.text = 'Close'; + config.useCase.cancelButton.foreground.color = '#C8193C'; + config.useCase.cancelButton.background.fillColor = '#00000000'; + + // Configure the submit button of the confirmation sheet. + config.useCase.submitButton.text = 'Submit'; + config.useCase.submitButton.foreground.color = '#FFFFFF'; + config.useCase.submitButton.background.fillColor = '#C8193C'; + + // Configure other parameters, pertaining to single-scanning mode as needed. + + return await startBarcodeScanner(config); + } + + // ---------------------- + // Multi Barcode Scanner + // ---------------------- + public static startMultiBarcodeScanner = async () => { + // Create the default configuration object. + const config = new BarcodeScannerConfiguration(); + + // Initialize the use case for multiple scanning. + config.useCase = new MultipleScanningMode(); + + // Set the counting mode. + config.useCase.mode = 'COUNTING'; + + // Set the sheet mode for the barcodes preview. + config.useCase.sheet.mode = 'COLLAPSED_SHEET'; + + // Set the height for the collapsed sheet. + config.useCase.sheet.collapsedVisibleHeight = 'LARGE'; + + // Enable manual count change. + config.useCase.sheetContent.manualCountChangeEnabled = true; + + // Set the delay before same barcode counting repeat. + config.useCase.countingRepeatDelay = 1000; + + // Configure the submit button. + config.useCase.sheetContent.submitButton.text = 'Submit'; + config.useCase.sheetContent.submitButton.foreground.color = '#000000'; + + // Implement mapping for the barcode item information + config.useCase.barcodeInfoMapping.barcodeItemMapper = ( + barcodeItem, + onResult, + onError + ) => { + /** TODO: process scan result as needed to get your mapped data, + * e.g. query your server to get product image, title and subtitle. + * See example below. + */ + const title = `Some product ${barcodeItem.textWithExtension}`; + const subtitle = barcodeItem.type ?? 'Unknown'; + + // If image from URL is used, on Android platform INTERNET permission is required. + const image = + 'https://avatars.githubusercontent.com/u/1454920'; + // To show captured barcode image use BarcodeMappedData.barcodeImageKey + // const image = BarcodeMappedData.barcodeImageKey; + + /** Call onError() in case of error during obtaining mapped data. */ + if (barcodeItem.textWithExtension == 'Error occurred!') { + onError(); + } else { + onResult( + new BarcodeMappedData({ + title: title, + subtitle: subtitle, + barcodeImage: image, + }) + ); + } + }; + return await startBarcodeScanner(config); + } + + // ---------------------- + // Multi AR Barcode Scanner + // ---------------------- + public static startMultiARBarcodeScanner = async () => { + // Create the default configuration object. + const config = new BarcodeScannerConfiguration(); + + // Configure the usecase. + config.useCase = new MultipleScanningMode(); + config.useCase.mode = 'UNIQUE'; + config.useCase.sheet.mode = 'COLLAPSED_SHEET'; + config.useCase.sheet.collapsedVisibleHeight = 'SMALL'; + // Configure AR Overlay. + config.useCase.arOverlay.visible = true; + config.useCase.arOverlay.automaticSelectionEnabled = false; + // Configure other parameters, pertaining to use case as needed. + + // Configure other parameters as needed. + + return await startBarcodeScanner(config); + } + + // -------------------------------------- + // Detect barcodes from a imported image + // -------------------------------------- + public static detectBarcodesOnImage = async (imageFileUri: string) => { + return await ScanbotSDK.detectBarcodesOnImage({ + imageFileUri: imageFileUri, + //barcodeFormats: ['QR_CODE', 'EAN_13', ...], // optional filter for specific barcode types + // see further args... + }); + } + + // ---------------- + // Detect MRZ data + // ---------------- + public static startMrzScanner = async () => { + const configuration: MrzScannerConfiguration = { + // Customize colors, text resources, behavior, etc.. + finderTextHint: + "Please hold your phone over the 2- or 3-line MRZ code at the front of your passport.", + orientationLockMode: "PORTRAIT", + // see further configs ... + }; + return await ScanbotSDK.startMrzScanner(configuration); + } + + // ----------------- + // Detect EHIC data + // ----------------- + public static startEHICScanner = async () => { + const configuration: HealthInsuranceCardScannerConfiguration = { + // Customize colors, text resources, behavior, etc.. + finderTextHint: + "Please hold your phone over the back of your Health Insurance Card.", + orientationLockMode: "PORTRAIT", + // see further configs ... + }; + return await ScanbotSDK.startEHICScanner(configuration); + } + + // ------------------------- + // Detect data from a check + // ------------------------- + public static startCheckRecognizer = async () => { + const configuration: CheckRecognizerConfiguration = { + // Customize colors, text resources, behavior, etc.. + enableCameraButtonTitle: "Enable Camera", + orientationLockMode: "PORTRAIT", + finderLineColor: "#0000ff", + // see further configs ... + }; + return await ScanbotSDK.startCheckRecognizer(configuration); + } + + // -------------------------------------- + // Detect check data from imported image + // -------------------------------------- + public static recognizeCheck = async (imageUrl: string) => { + return await ScanbotSDK.recognizeCheck({ + imageFileUri: imageUrl, + }); + } + + // -------------------------- + // Detect license plate data + // -------------------------- + public static startLicensePlateScanner = async () => { + const configuration: LicensePlateScannerConfiguration = { + // Customize colors, text resources, behavior, etc.. + scanStrategy: "ML_BASED", + topBarBackgroundColor: "#c8193c", + cancelButtonTitle: "Cancel", + finderLineColor: "#c8193c", + finderLineWidth: 5, + orientationLockMode: "PORTRAIT", + finderTextHint: 'Place the whole license plate in the frame to scan it', + confirmationDialogConfirmButtonFilled: true, + // see further configs... + }; + return await ScanbotSDK.startLicensePlateScanner(configuration); + } + + // -------------------------------- + // Detect medical certificate data + // -------------------------------- + public static startMedicalCertificateRecognizer = async () => { + const configuration: MedicalCertificateRecognizerConfiguration = { + // Customize colors, text resources, behavior, etc.. + topBarBackgroundColor: "#c8193c", + cancelButtonTitle: "Cancel", + finderLineColor: "#c8193c", + finderLineWidth: 5, + orientationLockMode: "PORTRAIT", + // see further configs... + }; + return await ScanbotSDK.startMedicalCertificateRecognizer( + configuration + ); + } + + // ----------------- + // Detect text data + // ----------------- + public static startTextDataScanner = async () => { + const configuration: TextDataScannerConfiguration = { + textDataScannerStep: { + allowedSymbols: "", + aspectRatio: { + height: 1.0, + width: 5.0, + }, + guidanceText: "Place the text in the frame to scan it", + pattern: "", + preferredZoom: 2.0, + shouldMatchSubstring: false, + significantShakeDelay: -1, + unzoomedFinderHeight: 40, + }, + // Other UI configs... + }; + return await ScanbotSDK.startTextDataScanner(configuration); + } + + // ------------------------- + // Generic Document Scanner + // ------------------------- + public static startGenericDocumentRecognizer = async () => { + const configuration: GenericDocumentRecognizerConfiguration = { + startScanningTitle: "Scan a German ID Card or Driver's License", + // Customize colors, text resources, behavior, etc.. + //shouldSavePhotoImageInStorage: true, + acceptedDocumentTypes: [ + "DE_DRIVER_LICENSE_BACK", + "DE_DRIVER_LICENSE_FRONT", + "DE_ID_CARD_BACK", + "DE_ID_CARD_FRONT", + "DE_PASSPORT", + "DE_RESIDENCE_PERMIT_BACK", + "DE_RESIDENCE_PERMIT_FRONT", + ] + // see further configs... + }; + return await ScanbotSDK.startGenericDocumentRecognizer(configuration); + } + + // ---------------------------------- + // Apply filter for a selected image + // ---------------------------------- + public static applyImageFilterOnPage = async (scannedPage: Page, pageFilter: ParametricFilter) => { + return await ScanbotSDK.applyImageFiltersOnPage({ + page: scannedPage, + filters: [pageFilter], + }); + } + + // --------------------- + // PDF Create Feature + // --------------------- + public static async createPDF(urls: string[], pageSize: PageSize) { + return await ScanbotSDK.createPDF({ + imageFileUris: urls, + options: { + pageSize: pageSize + } + }); + } + + // --------------------- + // TIFF Create Feature + // --------------------- + public static async writeTIFF(urls: string[], binarized: boolean) { + return await ScanbotSDK.writeTIFF({ + imageFileUris: urls, + options: { + binarizationFilter: binarized ? new ScanbotBinarizationFilter() : undefined, + dpi: 300, + compression: binarized ? 'CCITT_T6' : 'ADOBE_DEFLATE', + }, + }); + } + + // ------------------------- + // SDK License Information + // ------------------------- + public static viewLicenseInfo = async () => { + const licenseInfo = await ScanbotSDK.getLicenseInfo(); + return licenseInfo; + } + + // ------------------------- + // OCR Confoguaration + // ------------------------- + public static viewOcrConfigs = async () => { + try { + const ocrInfo = await ScanbotSDK.getOCRConfigs(); + return ocrInfo; + } catch (error) { + alert(JSON.stringify(error)); + } + } + + + // ---------------------------- + // Clean all data from storage + // ---------------------------- + public static cleanUp = async () => { + try { + await ScanbotSDK.cleanup(); + } catch (error) { + alert(JSON.stringify(error)); + } + } +} \ No newline at end of file diff --git a/src/theme/variables.css b/src/theme/variables.css index ef36ff405..e3324ad69 100644 --- a/src/theme/variables.css +++ b/src/theme/variables.css @@ -84,65 +84,65 @@ http://ionicframework.com/docs/theming/ */ body { --ion-color-primary: #428cff; - --ion-color-primary-rgb: 66,140,255; + --ion-color-primary-rgb: 66, 140, 255; --ion-color-primary-contrast: #ffffff; - --ion-color-primary-contrast-rgb: 255,255,255; + --ion-color-primary-contrast-rgb: 255, 255, 255; --ion-color-primary-shade: #3a7be0; --ion-color-primary-tint: #5598ff; --ion-color-secondary: #50c8ff; - --ion-color-secondary-rgb: 80,200,255; + --ion-color-secondary-rgb: 80, 200, 255; --ion-color-secondary-contrast: #ffffff; - --ion-color-secondary-contrast-rgb: 255,255,255; + --ion-color-secondary-contrast-rgb: 255, 255, 255; --ion-color-secondary-shade: #46b0e0; --ion-color-secondary-tint: #62ceff; --ion-color-tertiary: #6a64ff; - --ion-color-tertiary-rgb: 106,100,255; + --ion-color-tertiary-rgb: 106, 100, 255; --ion-color-tertiary-contrast: #ffffff; - --ion-color-tertiary-contrast-rgb: 255,255,255; + --ion-color-tertiary-contrast-rgb: 255, 255, 255; --ion-color-tertiary-shade: #5d58e0; --ion-color-tertiary-tint: #7974ff; --ion-color-success: #2fdf75; - --ion-color-success-rgb: 47,223,117; + --ion-color-success-rgb: 47, 223, 117; --ion-color-success-contrast: #000000; - --ion-color-success-contrast-rgb: 0,0,0; + --ion-color-success-contrast-rgb: 0, 0, 0; --ion-color-success-shade: #29c467; --ion-color-success-tint: #44e283; --ion-color-warning: #ffd534; - --ion-color-warning-rgb: 255,213,52; + --ion-color-warning-rgb: 255, 213, 52; --ion-color-warning-contrast: #000000; - --ion-color-warning-contrast-rgb: 0,0,0; + --ion-color-warning-contrast-rgb: 0, 0, 0; --ion-color-warning-shade: #e0bb2e; --ion-color-warning-tint: #ffd948; --ion-color-danger: #ff4961; - --ion-color-danger-rgb: 255,73,97; + --ion-color-danger-rgb: 255, 73, 97; --ion-color-danger-contrast: #ffffff; - --ion-color-danger-contrast-rgb: 255,255,255; + --ion-color-danger-contrast-rgb: 255, 255, 255; --ion-color-danger-shade: #e04055; --ion-color-danger-tint: #ff5b71; --ion-color-dark: #f4f5f8; - --ion-color-dark-rgb: 244,245,248; + --ion-color-dark-rgb: 244, 245, 248; --ion-color-dark-contrast: #000000; - --ion-color-dark-contrast-rgb: 0,0,0; + --ion-color-dark-contrast-rgb: 0, 0, 0; --ion-color-dark-shade: #d7d8da; --ion-color-dark-tint: #f5f6f9; --ion-color-medium: #989aa2; - --ion-color-medium-rgb: 152,154,162; + --ion-color-medium-rgb: 152, 154, 162; --ion-color-medium-contrast: #000000; - --ion-color-medium-contrast-rgb: 0,0,0; + --ion-color-medium-contrast-rgb: 0, 0, 0; --ion-color-medium-shade: #86888f; --ion-color-medium-tint: #a2a4ab; --ion-color-light: #222428; - --ion-color-light-rgb: 34,36,40; + --ion-color-light-rgb: 34, 36, 40; --ion-color-light-contrast: #ffffff; - --ion-color-light-contrast-rgb: 255,255,255; + --ion-color-light-contrast-rgb: 255, 255, 255; --ion-color-light-shade: #1e2023; --ion-color-light-tint: #383a3e; } @@ -154,10 +154,10 @@ http://ionicframework.com/docs/theming/ */ .ios body { --ion-background-color: #000000; - --ion-background-color-rgb: 0,0,0; + --ion-background-color-rgb: 0, 0, 0; --ion-text-color: #ffffff; - --ion-text-color-rgb: 255,255,255; + --ion-text-color-rgb: 255, 255, 255; --ion-color-step-50: #0d0d0d; --ion-color-step-100: #1a1a1a; @@ -197,10 +197,10 @@ http://ionicframework.com/docs/theming/ */ .md body { --ion-background-color: #121212; - --ion-background-color-rgb: 18,18,18; + --ion-background-color-rgb: 18, 18, 18; --ion-text-color: #ffffff; - --ion-text-color-rgb: 255,255,255; + --ion-text-color-rgb: 255, 255, 255; --ion-border-color: #222222; diff --git a/src/utils/BarcodeRepository.tsx b/src/utils/BarcodeRepository.tsx index f50f6fda7..81d8fdeae 100644 --- a/src/utils/BarcodeRepository.tsx +++ b/src/utils/BarcodeRepository.tsx @@ -1,41 +1,10 @@ -import {BarcodeFormat, BarcodeResultField} from "cordova-plugin-scanbot-sdk"; +import { BarcodeResultField } from "capacitor-plugin-scanbot-sdk"; -export class BarcodeRepository{ +export class BarcodeRepository { private static barcodes: BarcodeResultField[] = []; - public static barcodeFormatList = [ - { key: 'AZTEC', value: true }, - { key: 'CODABAR', value: true }, - { key: 'CODE_39', value: true }, - { key: 'CODE_93', value: true }, - { key: 'CODE_128', value: true }, - { key: 'DATA_MATRIX', value: true }, - { key: 'EAN_8', value: true }, - { key: 'EAN_13', value: true }, - { key: 'ITF', value: true }, - { key: 'PDF_417', value: true }, - { key: 'QR_CODE', value: true }, - { key: 'RSS_14', value: true }, - { key: 'RSS_EXPANDED', value: true }, - { key: 'UPC_A', value: true }, - { key: 'UPC_E', value: true }, - { key: 'MSI_PLESSEY', value: false } - ]; - - public static getAcceptedTypes() { - const result:BarcodeFormat[] = []; - - for (let i = 0; i < BarcodeRepository.barcodeFormatList.length; i++) { - if (BarcodeRepository.barcodeFormatList[i].value) { - result.push(BarcodeRepository.barcodeFormatList[i].key as BarcodeFormat); - } - } - - return result; - } - public static async addBarcodes(barcodes: BarcodeResultField[]) { - if(this.barcodes.length > 0) this.barcodes = []; + if (this.barcodes.length > 0) this.barcodes = []; this.barcodes = this.barcodes.concat(barcodes); } diff --git a/src/utils/ImageRepository.tsx b/src/utils/ImageRepository.tsx index 36b706908..29bb8e243 100644 --- a/src/utils/ImageRepository.tsx +++ b/src/utils/ImageRepository.tsx @@ -1,4 +1,4 @@ -import { Page } from 'cordova-plugin-scanbot-sdk'; +import { Page } from "capacitor-plugin-scanbot-sdk"; export class ImageResultsRepository { diff --git a/src/utils/camera_util.tsx b/src/utils/camera_util.tsx new file mode 100644 index 000000000..7c9a83beb --- /dev/null +++ b/src/utils/camera_util.tsx @@ -0,0 +1,16 @@ +import { Camera, CameraResultType, CameraSource } from "@capacitor/camera"; + +export const PickImage = async () => { + const image = await Camera.getPhoto({ + resultType: CameraResultType.Uri, + source: CameraSource.Photos, + }); + return image.path!; +} + +export const PickImages = async () => { + const pickedImageResults = await Camera.pickImages({ + quality: 80, + }); + return pickedImageResults.photos; +} \ No newline at end of file diff --git a/src/utils/data_detector_repository.ts b/src/utils/data_detector_repository.ts new file mode 100644 index 000000000..639c2f266 --- /dev/null +++ b/src/utils/data_detector_repository.ts @@ -0,0 +1,136 @@ +import { CheckRecognizerResult, HealthInsuranceCardScannerResult, MedicalCertificateScannerResult, MrzScannerResult } from "capacitor-plugin-scanbot-sdk"; + +export class DataDetectorRepository { + public static MrzResult: { name: string; value: string; }[] = []; + + public static EHICResult: { name: string; value: string; }[] = []; + + public static CheckResult: { name: string; value: string; }[] = []; + + public static MedicalCertifacteResult: { title: string; items: { key: string; value: string; }[]; }[] = []; + + /** Generate readable data from MRZ results */ + public static GeneratMRZResult = (mrzResult: MrzScannerResult) => { + var mrzData = [ + { name: 'Successful Recognition', value: mrzResult.recognitionSuccessful ? 'YES' : 'NO' }, + { name: 'Document Type', value: mrzResult.documentType }, + { name: 'Raw MRZ String', value: mrzResult.rawString }, + { name: 'Check digits count', value: mrzResult.checkDigitsCount.toString() }, + { name: 'Valid check digits count', value: mrzResult.validCheckDigitsCount.toString() } + ]; + + this.MrzResult = mrzData; + } + + /** Generate readable data from check results */ + public static GenerateCheckResult = (result: CheckRecognizerResult) => { + const newFields: { name: any, value: any }[] = [] + result.check.fields.map(item => { + if (item.value === null || item.value.text === "" || item.value.text === null) return; + + newFields.push({ + name: item.type.name, + value: item.value?.text + }); + }); + this.CheckResult = newFields; + } + + /** Generate readable data from ehic results */ + public static GeneratEHICResult = (result: HealthInsuranceCardScannerResult) => { + const newFields: { name: string, value: string }[] = [] + result.fields.map(item => { + newFields.push({ + name: item.type, + value: item.value + }); + }); + DataDetectorRepository.EHICResult = newFields; + } + + /** check the provided object is null */ + private static isObjectEmpty = (objectName: any) => { + return ( + objectName && + Object.keys(objectName).length === 0 && + objectName.constructor === Object + ); + }; + + /** Arrange med data to a readable format */ + public static GenerateMedData = async (medData: MedicalCertificateScannerResult) => { + try { + this.MedicalCertifacteResult = []; + if (medData === undefined || medData === null) { + return; + } + + if (!this.isObjectEmpty(medData.formType)) { + this.MedicalCertifacteResult.push( + { + title: 'General Information', + items: [ + { key: 'FormType', value: medData.formType }, + { key: 'Captured Image', value: medData.imageFileUri! } + ] + } + ) + } + if (!this.isObjectEmpty(medData.patientData)) { + this.MedicalCertifacteResult.push( + { + title: 'Patient Data', + items: [ + { key: 'Insuarance Provider', value: medData.patientData.insuranceProvider?.value! ?? "Not Provided" }, + { key: 'Full Name', value: (medData.patientData.firstName?.value! + medData.patientData.lastName?.value!) ?? "Not Provided" }, + { key: 'Address', value: (medData.patientData.address1?.value! + medData.patientData.address2?.value!) ?? "Not Provided" }, + { key: 'Diagnose', value: medData.patientData.diagnose?.value! ?? "Not Provided" }, + { key: 'Doctor Number', value: medData.patientData.doctorNumber?.value! ?? "Not Provided" }, + { key: 'Health Insurance Number', value: medData.patientData.healthInsuranceNumber?.value! ?? "Not Provided" }, + { key: 'Insured Person Number', value: medData.patientData.insuredPersonNumber?.value! ?? "Not Provided" }, + { key: 'Place Of Operation Number', value: medData.patientData.placeOfOperationNumber?.value! ?? "Not Provided" }, + ] + } + ) + } + if (!this.isObjectEmpty(medData.dates)) { + this.MedicalCertifacteResult.push( + { + title: 'Dates', + items: [ + { key: 'Date of Birth', value: medData.dates.birthDate?.dateString! ?? "Not Provided" }, + { key: 'Diagnose On', value: medData.dates.diagnosedOn?.dateString! ?? "Not Provided" }, + { key: 'Document Date', value: medData.dates.documentDate?.dateString! ?? "Not Provided" }, + { key: 'Incapable of work since', value: medData.dates.incapableOfWorkSince?.dateString! ?? "Not Provided" }, + { key: 'Incapable of work until', value: medData.dates.incapableOfWorkUntil?.dateString! ?? "Not Provided" }, + { key: 'Child Needs Care From', value: medData.dates.childNeedsCareFrom?.dateString! ?? "Not Provided" }, + { key: 'Child Needs Care Until', value: medData.dates.childNeedsCareUntil?.dateString! ?? "Not Provided" }, + ] + } + ) + } + if (!this.isObjectEmpty(medData.checkboxes)) { + this.MedicalCertifacteResult.push( + { + title: 'CheckBoxes', + items: [ + { key: 'Accident Number', value: medData.checkboxes.accidentNo?.isChecked ? 'True' : 'False' }, + { key: 'Accident', value: medData.checkboxes.accidentNo?.isChecked ? 'True' : 'False' }, + { key: 'Assigned to Doctor', value: medData.checkboxes.assignedToAccidentInsuranceDoctor?.isChecked ? 'True' : 'False' }, + { key: 'Work Accident', value: medData.checkboxes.workAccident?.isChecked ? 'True' : 'False' }, + { key: 'Insured Pay Case', value: medData.checkboxes.insuredPayCase?.isChecked ? 'True' : 'False' }, + { key: 'Final Certificate', value: medData.checkboxes.finalCertificate?.isChecked ? 'True' : 'False' }, + { key: 'Initial Certificate', value: medData.checkboxes.initialCertificate?.isChecked ? 'True' : 'False' }, + { key: 'Other Accident', value: medData.checkboxes.otherAccident?.isChecked ? 'True' : 'False' }, + { key: 'Renewed Certificate', value: medData.checkboxes.renewedCertificate?.isChecked ? 'True' : 'False' }, + { key: 'Requires Care No', value: medData.checkboxes.requiresCareNo?.isChecked ? 'True' : 'False' }, + ] + } + ) + } + } catch (error) { + console.log('Medicle certificate data mapping error.'); + } + + } +} diff --git a/src/utils/data_util.ts b/src/utils/data_util.ts new file mode 100644 index 000000000..c8e1d62dc --- /dev/null +++ b/src/utils/data_util.ts @@ -0,0 +1,89 @@ +import { BrightnessFilter, ColorDocumentFilter, ContrastFilter, CustomBinarizationFilter, GrayscaleFilter, ScanbotBinarizationFilter, WhiteBlackPointFilter } from "capacitor-plugin-scanbot-sdk"; +import { CoreFeatureEnum } from "../enums/core_feature_enum"; +import { CoreFeatureIdEnum } from "../enums/core_feature_id_enum"; +import { PDFPageSizeEnum } from "../enums/pdf_page_size_enum"; +import { TiffOptionsEnum } from "../enums/tiff_option_enum"; +import { CoreFeatureModel } from "../models/core_feature_model"; + +export const CORE_FEATURES: CoreFeatureModel[] = [ + { + id: CoreFeatureIdEnum.DocumentDetector, + title: "Document Scanner", + description: "The Scanbot SDK provides a Ready-To-Use UI screen component for document scanning.", + items: [ + { key: CoreFeatureEnum.Document, value: "Scan Document" }, + { key: CoreFeatureEnum.FinderDocument, value: "Finder Document Scanner" }, + { key: CoreFeatureEnum.ImageResult, value: "View Image Results" }, + ], + }, + { + id: CoreFeatureIdEnum.BarcodeDetactor, + title: "Barcode Scanner & Detector", + description: "The Scanbot SDK provides a Ready-To-Use UI screen component for Barcode and QR-Code scanning.", + items: [ + { key: CoreFeatureEnum.SingleBarcode, value: "RTU UI Single Scanning" }, + { key: CoreFeatureEnum.MultiBarcode, value: "RTU UI Multi Scanning" }, + { key: CoreFeatureEnum.MultiARBarcode, value: "RTU UI Multi AR Scanning" }, + { key: CoreFeatureEnum.ImportBarcodeImage, value: "Import Image & Detect Barcodes" }, + ], + }, + { + id: CoreFeatureIdEnum.DataDetactor, + title: "Data Detectors", + description: "The Scanbot SDK provides a Ready-To-Use UI screen component for detect data from MRZ, ID CARDS, EHIC, etc... ", + items: [ + { key: CoreFeatureEnum.MRZ, value: "Scan MRZ" }, + { key: CoreFeatureEnum.EHIC, value: "Scan Health Insurance Card" }, + { key: CoreFeatureEnum.Check, value: "Scan Checks" }, + { key: CoreFeatureEnum.ImportCheckOnImage, value: "Import Image & Detect Check" }, + { key: CoreFeatureEnum.LicensePlate, value: "Scan License Plate" }, + { key: CoreFeatureEnum.MedicalCertificate, value: "Scan Medical Certificate" }, + { key: CoreFeatureEnum.TextData, value: "Scan Text Data" }, + { key: CoreFeatureEnum.GenericDocument, value: "Scan Generic Documents" }, + ], + }, + { + id: CoreFeatureIdEnum.Other, + title: "Test Other SDK API Methods", + description: "The Scanbot SDK provides more API methods.", + items: [ + { key: CoreFeatureEnum.LicenseInfo, value: "View License Info" }, + { key: CoreFeatureEnum.OCRInfo, value: "View OCR Info" }, + { key: CoreFeatureEnum.LearnMore, value: "Learn More About the Scanbot SDK" }, + ], + }, +]; + +export const GetItemList = (selectedItemId: CoreFeatureIdEnum) => { + return CORE_FEATURES.find(item => item.id == selectedItemId)?.items!; +} + +export const PDFPageSizeList = [ + { key: PDFPageSizeEnum.A3, value: "A3" }, + { key: PDFPageSizeEnum.A4, value: "A4" }, + { key: PDFPageSizeEnum.A5, value: "A5" }, + { key: PDFPageSizeEnum.B4, value: "B4" }, + { key: PDFPageSizeEnum.B5, value: "B5" }, + { key: PDFPageSizeEnum.COMM10, value: "COMM10" }, + { key: PDFPageSizeEnum.CUSTOM, value: "CUSTOM" }, + { key: PDFPageSizeEnum.EXECUTIVE, value: "EXECUTIVE" }, + { key: PDFPageSizeEnum.LEGAL, value: "LEGAL" }, + { key: PDFPageSizeEnum.LETTER, value: "LETTER" }, + { key: PDFPageSizeEnum.US4x6, value: "US4x6" }, + { key: PDFPageSizeEnum.US4x8, value: "US4x8" }, +]; + +export const TiffOptions = [ + { key: TiffOptionsEnum.Binarized, value: "Binarized Images (1-bit)" }, + { key: TiffOptionsEnum.Color, value: "Color Images" }, +]; + +export const FilterOptions = [ + { key: new ScanbotBinarizationFilter(), value: 'Scanbot Binarization Filter' }, + { key: new CustomBinarizationFilter({ preset: 'PRESET_1' }), value: 'Custom Binarization Filter' }, + { key: new ColorDocumentFilter(), value: 'Color Document Filter' }, + { key: new BrightnessFilter({ brightness: 0.2 }), value: 'Brightness Filter' }, + { key: new ContrastFilter({ contrast: 2 }), value: 'Contrast Filter' }, + { key: new GrayscaleFilter(), value: 'Grayscale Filter' }, + { key: new WhiteBlackPointFilter({ blackPoint: 0.2, whitePoint: 0.8 }), value: 'White Black Point Filter' }, +];