diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f4f6a90ae6db..1446f1e4d851 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -94,7 +94,7 @@ This is a checklist for PR authors. Please make sure to complete all tasks and c - [ ] I followed the guidelines as stated in the [Review Guidelines](https://github.com/Expensify/App/blob/main/contributingGuides/PR_REVIEW_GUIDELINES.md) - [ ] I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like `Avatar`, I verified the components using `Avatar` are working as expected) - [ ] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests) -- [ ] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such +- [ ] I verified any variables that can be defined as constants (ie. in CONST.ts or at the top of the file that uses the constant) are defined as such - [ ] I verified that if a function's arguments changed that all usages have also been updated correctly - [ ] If any new file was added I verified that: - [ ] The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory @@ -109,6 +109,7 @@ This is a checklist for PR authors. Please make sure to complete all tasks and c - [ ] I verified that all the inputs inside a form are aligned with each other. - [ ] I added `Design` label and/or tagged `@Expensify/design` so the design team can review the changes. - [ ] If a new page is added, I verified it's using the `ScrollView` component to make it scrollable when more elements are added to the page. +- [ ] I added [unit tests](https://github.com/Expensify/App/blob/main/tests/README.md) for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow. - [ ] If the `main` branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the `Test` steps. ### Screenshots/Videos diff --git a/.github/actions/javascript/postTestBuildComment/action.yml b/.github/actions/javascript/postTestBuildComment/action.yml index 00c826badf9f..d6c3391f3c26 100644 --- a/.github/actions/javascript/postTestBuildComment/action.yml +++ b/.github/actions/javascript/postTestBuildComment/action.yml @@ -3,22 +3,22 @@ description: "Mark pull requests as deployed on production or staging" inputs: PR_NUMBER: description: "Pull request number" - required: true + required: false GITHUB_TOKEN: description: "Github token for authentication" default: "${{ github.token }}" ANDROID: description: "Android job result ('success', 'failure', 'cancelled', or 'skipped')" - required: true + required: false DESKTOP: description: "Desktop job result ('success', 'failure', 'cancelled', or 'skipped')" - required: true + required: false IOS: description: "iOS job result ('success', 'failure', 'cancelled', or 'skipped')" - required: true + required: false WEB: description: "Web job result ('success', 'failure', 'cancelled', or 'skipped')" - required: true + required: false ANDROID_LINK: description: "Link for the Android build" required: false diff --git a/.github/actions/javascript/postTestBuildComment/index.js b/.github/actions/javascript/postTestBuildComment/index.js index aa0d0ec802b7..8906bb597d63 100644 --- a/.github/actions/javascript/postTestBuildComment/index.js +++ b/.github/actions/javascript/postTestBuildComment/index.js @@ -11502,31 +11502,38 @@ const github_1 = __nccwpck_require__(5438); const CONST_1 = __importDefault(__nccwpck_require__(9873)); const GithubUtils_1 = __importDefault(__nccwpck_require__(9296)); function getTestBuildMessage() { - console.log('Input for android', core.getInput('ANDROID', { required: true })); - const androidSuccess = core.getInput('ANDROID', { required: true }) === 'success'; - const desktopSuccess = core.getInput('DESKTOP', { required: true }) === 'success'; - const iOSSuccess = core.getInput('IOS', { required: true }) === 'success'; - const webSuccess = core.getInput('WEB', { required: true }) === 'success'; - const androidLink = androidSuccess ? core.getInput('ANDROID_LINK') : '❌ FAILED ❌'; - const desktopLink = desktopSuccess ? core.getInput('DESKTOP_LINK') : '❌ FAILED ❌'; - const iOSLink = iOSSuccess ? core.getInput('IOS_LINK') : '❌ FAILED ❌'; - const webLink = webSuccess ? core.getInput('WEB_LINK') : '❌ FAILED ❌'; - const androidQRCode = androidSuccess - ? `![Android](https://api.qrserver.com/v1/create-qr-code/?size=120x120&data=${androidLink})` - : "The QR code can't be generated, because the android build failed"; - const desktopQRCode = desktopSuccess - ? `![Desktop](https://api.qrserver.com/v1/create-qr-code/?size=120x120&data=${desktopLink})` - : "The QR code can't be generated, because the Desktop build failed"; - const iOSQRCode = iOSSuccess ? `![iOS](https://api.qrserver.com/v1/create-qr-code/?size=120x120&data=${iOSLink})` : "The QR code can't be generated, because the iOS build failed"; - const webQRCode = webSuccess ? `![Web](https://api.qrserver.com/v1/create-qr-code/?size=120x120&data=${webLink})` : "The QR code can't be generated, because the web build failed"; + const inputs = ['ANDROID', 'DESKTOP', 'IOS', 'WEB']; + const names = { + [inputs[0]]: 'Android', + [inputs[1]]: 'Desktop', + [inputs[2]]: 'iOS', + [inputs[3]]: 'Web', + }; + const result = inputs.reduce((acc, platform) => { + const input = core.getInput(platform, { required: false }); + if (!input) { + acc[platform] = { link: 'N/A', qrCode: 'N/A' }; + return acc; + } + const isSuccess = input === 'success'; + const link = isSuccess ? core.getInput(`${platform}_LINK`) : '❌ FAILED ❌'; + const qrCode = isSuccess + ? `![${names[platform]}](https://api.qrserver.com/v1/create-qr-code/?size=120x120&data=${link})` + : `The QR code can't be generated, because the ${names[platform]} build failed`; + acc[platform] = { + link, + qrCode, + }; + return acc; + }, {}); const message = `:test_tube::test_tube: Use the links below to test this adhoc build on Android, iOS, Desktop, and Web. Happy testing! :test_tube::test_tube: | Android :robot: | iOS :apple: | | ------------- | ------------- | -| ${androidLink} | ${iOSLink} | -| ${androidQRCode} | ${iOSQRCode} | +| ${result.ANDROID.link} | ${result.IOS.link} | +| ${result.ANDROID.qrCode} | ${result.IOS.qrCode} | | Desktop :computer: | Web :spider_web: | -| ${desktopLink} | ${webLink} | -| ${desktopQRCode} | ${webQRCode} | +| ${result.DESKTOP.link} | ${result.WEB.link} | +| ${result.DESKTOP.qrCode} | ${result.WEB.qrCode} | --- diff --git a/.github/actions/javascript/postTestBuildComment/postTestBuildComment.ts b/.github/actions/javascript/postTestBuildComment/postTestBuildComment.ts index 4fba1a6cb2ad..813665f2dff5 100644 --- a/.github/actions/javascript/postTestBuildComment/postTestBuildComment.ts +++ b/.github/actions/javascript/postTestBuildComment/postTestBuildComment.ts @@ -1,37 +1,48 @@ import * as core from '@actions/core'; import {context} from '@actions/github'; +import type {TupleToUnion} from 'type-fest'; import CONST from '@github/libs/CONST'; import GithubUtils from '@github/libs/GithubUtils'; function getTestBuildMessage(): string { - console.log('Input for android', core.getInput('ANDROID', {required: true})); - const androidSuccess = core.getInput('ANDROID', {required: true}) === 'success'; - const desktopSuccess = core.getInput('DESKTOP', {required: true}) === 'success'; - const iOSSuccess = core.getInput('IOS', {required: true}) === 'success'; - const webSuccess = core.getInput('WEB', {required: true}) === 'success'; + const inputs = ['ANDROID', 'DESKTOP', 'IOS', 'WEB'] as const; + const names = { + [inputs[0]]: 'Android', + [inputs[1]]: 'Desktop', + [inputs[2]]: 'iOS', + [inputs[3]]: 'Web', + }; - const androidLink = androidSuccess ? core.getInput('ANDROID_LINK') : '❌ FAILED ❌'; - const desktopLink = desktopSuccess ? core.getInput('DESKTOP_LINK') : '❌ FAILED ❌'; - const iOSLink = iOSSuccess ? core.getInput('IOS_LINK') : '❌ FAILED ❌'; - const webLink = webSuccess ? core.getInput('WEB_LINK') : '❌ FAILED ❌'; + const result = inputs.reduce((acc, platform) => { + const input = core.getInput(platform, {required: false}); - const androidQRCode = androidSuccess - ? `![Android](https://api.qrserver.com/v1/create-qr-code/?size=120x120&data=${androidLink})` - : "The QR code can't be generated, because the android build failed"; - const desktopQRCode = desktopSuccess - ? `![Desktop](https://api.qrserver.com/v1/create-qr-code/?size=120x120&data=${desktopLink})` - : "The QR code can't be generated, because the Desktop build failed"; - const iOSQRCode = iOSSuccess ? `![iOS](https://api.qrserver.com/v1/create-qr-code/?size=120x120&data=${iOSLink})` : "The QR code can't be generated, because the iOS build failed"; - const webQRCode = webSuccess ? `![Web](https://api.qrserver.com/v1/create-qr-code/?size=120x120&data=${webLink})` : "The QR code can't be generated, because the web build failed"; + if (!input) { + acc[platform] = {link: 'N/A', qrCode: 'N/A'}; + return acc; + } + + const isSuccess = input === 'success'; + + const link = isSuccess ? core.getInput(`${platform}_LINK`) : '❌ FAILED ❌'; + const qrCode = isSuccess + ? `![${names[platform]}](https://api.qrserver.com/v1/create-qr-code/?size=120x120&data=${link})` + : `The QR code can't be generated, because the ${names[platform]} build failed`; + + acc[platform] = { + link, + qrCode, + }; + return acc; + }, {} as Record, {link: string; qrCode: string}>); const message = `:test_tube::test_tube: Use the links below to test this adhoc build on Android, iOS, Desktop, and Web. Happy testing! :test_tube::test_tube: | Android :robot: | iOS :apple: | | ------------- | ------------- | -| ${androidLink} | ${iOSLink} | -| ${androidQRCode} | ${iOSQRCode} | +| ${result.ANDROID.link} | ${result.IOS.link} | +| ${result.ANDROID.qrCode} | ${result.IOS.qrCode} | | Desktop :computer: | Web :spider_web: | -| ${desktopLink} | ${webLink} | -| ${desktopQRCode} | ${webQRCode} | +| ${result.DESKTOP.link} | ${result.WEB.link} | +| ${result.DESKTOP.qrCode} | ${result.WEB.qrCode} | --- diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 2cacdf557560..3ce3114d6ab0 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -114,6 +114,51 @@ jobs: env: BROWSERSTACK: ${{ secrets.BROWSERSTACK }} + submitAndroid: + name: Submit Android app for production review + needs: prep + if: ${{ github.ref == 'refs/heads/production' }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Ruby + uses: ruby/setup-ruby@v1.190.0 + with: + bundler-cache: true + + - name: Get Android native version + id: getAndroidVersion + run: echo "VERSION_CODE=$(grep -o 'versionCode\s\+[0-9]\+' android/app/build.gradle | awk '{ print $2 }')" >> "$GITHUB_OUTPUT" + + - name: Decrypt json w/ Google Play credentials + run: gpg --batch --yes --decrypt --passphrase="${{ secrets.LARGE_SECRET_PASSPHRASE }}" --output android-fastlane-json-key.json android-fastlane-json-key.json.gpg + working-directory: android/app + + - name: Submit Android build for review + run: bundle exec fastlane android upload_google_play_production + env: + VERSION: ${{ steps.getAndroidVersion.outputs.VERSION_CODE }} + + - name: Warn deployers if Android production deploy failed + if: ${{ failure() }} + uses: 8398a7/action-slack@v3 + with: + status: custom + custom_payload: | + { + channel: '#deployer', + attachments: [{ + color: "#DB4545", + pretext: ``, + text: `💥 Android production deploy failed. Please manually submit ${{ needs.prep.outputs.APP_VERSION }} in the . 💥`, + }] + } + env: + GITHUB_TOKEN: ${{ github.token }} + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} + android_hybrid: name: Build and deploy Android HybridApp needs: prep @@ -386,6 +431,12 @@ jobs: APPLE_DEMO_EMAIL: ${{ secrets.APPLE_DEMO_EMAIL }} APPLE_DEMO_PASSWORD: ${{ secrets.APPLE_DEMO_PASSWORD }} + - name: Submit build for App Store review + if: ${{ fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} + run: bundle exec fastlane ios submit_for_review + env: + VERSION: ${{ steps.getIOSVersion.outputs.IOS_VERSION }} + - name: Upload iOS build to Browser Stack if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} run: curl -u "$BROWSERSTACK" -X POST "https://api-cloud.browserstack.com/app-live/upload" -F "file=@/Users/runner/work/App/App/New Expensify.ipa" @@ -503,6 +554,7 @@ jobs: run: | op document get --output ./OldApp_AppStore.mobileprovision OldApp_AppStore op document get --output ./OldApp_AppStore_Share_Extension.mobileprovision OldApp_AppStore_Share_Extension + op document get --output ./OldApp_AppStore_Notification_Service.mobileprovision OldApp_AppStore_Notification_Service - name: Decrypt AppStore profile run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AppStore.mobileprovision NewApp_AppStore.mobileprovision.gpg @@ -679,7 +731,7 @@ jobs: name: Post a Slack message when any platform fails to build or deploy runs-on: ubuntu-latest if: ${{ failure() }} - needs: [buildAndroid, uploadAndroid, android_hybrid, desktop, iOS, iOS_hybrid, web] + needs: [buildAndroid, uploadAndroid, submitAndroid, android_hybrid, desktop, iOS, iOS_hybrid, web] steps: - name: Checkout uses: actions/checkout@v4 @@ -694,15 +746,21 @@ jobs: outputs: IS_AT_LEAST_ONE_PLATFORM_DEPLOYED: ${{ steps.checkDeploymentSuccessOnAtLeastOnePlatform.outputs.IS_AT_LEAST_ONE_PLATFORM_DEPLOYED }} IS_ALL_PLATFORMS_DEPLOYED: ${{ steps.checkDeploymentSuccessOnAllPlatforms.outputs.IS_ALL_PLATFORMS_DEPLOYED }} - needs: [buildAndroid, uploadAndroid, android_hybrid, desktop, iOS, iOS_hybrid, web] + needs: [buildAndroid, uploadAndroid, submitAndroid, android_hybrid, desktop, iOS, iOS_hybrid, web] if: ${{ always() }} steps: - name: Check deployment success on at least one platform id: checkDeploymentSuccessOnAtLeastOnePlatform run: | isAtLeastOnePlatformDeployed="false" - if [ "${{ needs.uploadAndroid.result }}" == "success" ]; then - isAtLeastOnePlatformDeployed="true" + if [ ${{ github.ref }} == 'refs/heads/production' ]; then + if [ "${{ needs.submitAndroid.result }}" == "success" ]; then + isAtLeastOnePlatformDeployed="true" + fi + else + if [ "${{ needs.uploadAndroid.result }}" == "success" ]; then + isAtLeastOnePlatformDeployed="true" + fi fi if [ "${{ needs.iOS.result }}" == "success" ] || \ @@ -727,8 +785,14 @@ jobs: isAllPlatformsDeployed="true" fi - if [ "${{ needs.uploadAndroid.result }}" != "success" ]; then - isAllPlatformsDeployed="false" + if [ ${{ github.ref }} == 'refs/heads/production' ]; then + if [ "${{ needs.submitAndroid.result }}" != "success" ]; then + isAllPlatformsDeployed="false" + fi + else + if [ "${{ needs.uploadAndroid.result }}" != "success" ]; then + isAllPlatformsDeployed="false" + fi fi echo "IS_ALL_PLATFORMS_DEPLOYED=$isAllPlatformsDeployed" >> "$GITHUB_OUTPUT" @@ -876,7 +940,7 @@ jobs: name: Post a Slack message when all platforms deploy successfully runs-on: ubuntu-latest if: ${{ always() && fromJSON(needs.checkDeploymentSuccess.outputs.IS_ALL_PLATFORMS_DEPLOYED) }} - needs: [prep, buildAndroid, uploadAndroid, android_hybrid, desktop, iOS, iOS_hybrid, web, checkDeploymentSuccess, createPrerelease, finalizeRelease] + needs: [prep, buildAndroid, uploadAndroid, submitAndroid, android_hybrid, desktop, iOS, iOS_hybrid, web, checkDeploymentSuccess, createPrerelease, finalizeRelease] steps: - name: 'Announces the deploy in the #announce Slack room' uses: 8398a7/action-slack@v3 @@ -930,11 +994,11 @@ jobs: postGithubComments: uses: ./.github/workflows/postDeployComments.yml if: ${{ always() && fromJSON(needs.checkDeploymentSuccess.outputs.IS_AT_LEAST_ONE_PLATFORM_DEPLOYED) }} - needs: [prep, buildAndroid, uploadAndroid, android_hybrid, desktop, iOS, iOS_hybrid, web, checkDeploymentSuccess, createPrerelease, finalizeRelease] + needs: [prep, buildAndroid, uploadAndroid, submitAndroid, android_hybrid, desktop, iOS, iOS_hybrid, web, checkDeploymentSuccess, createPrerelease, finalizeRelease] with: version: ${{ needs.prep.outputs.APP_VERSION }} env: ${{ github.ref == 'refs/heads/production' && 'production' || 'staging' }} - android: ${{ github.ref == 'refs/heads/production' && needs.uploadAndroid.result }} + android: ${{ github.ref == 'refs/heads/production' && needs.submitAndroid.result || needs.uploadAndroid.result }} android_hybrid: ${{ needs.android_hybrid.result }} ios: ${{ needs.iOS.result }} ios_hybrid: ${{ needs.iOS_hybrid.result }} diff --git a/.github/workflows/testBuildHybrid.yml b/.github/workflows/testBuildHybrid.yml new file mode 100644 index 000000000000..c84fe41fddae --- /dev/null +++ b/.github/workflows/testBuildHybrid.yml @@ -0,0 +1,221 @@ +name: Build and deploy hybird apps for testing + +on: + workflow_dispatch: + inputs: + PULL_REQUEST_NUMBER: + description: Pull Request number for correct placement of apps + required: true + pull_request_target: + types: [opened, synchronize, labeled] + branches: ['*ci-test/**'] + +env: + PULL_REQUEST_NUMBER: ${{ github.event.number || github.event.inputs.PULL_REQUEST_NUMBER }} + +jobs: + validateActor: + runs-on: ubuntu-latest + outputs: + READY_TO_BUILD: ${{ fromJSON(steps.isExpensifyEmployee.outputs.IS_EXPENSIFY_EMPLOYEE) && fromJSON(steps.hasReadyToBuildLabel.outputs.HAS_READY_TO_BUILD_LABEL) }} + steps: + - name: Is Expensify employee + id: isExpensifyEmployee + run: | + if gh api /orgs/Expensify/teams/expensify-expensify/memberships/${{ github.actor }} --silent; then + echo "IS_EXPENSIFY_EMPLOYEE=true" >> "$GITHUB_OUTPUT" + else + echo "IS_EXPENSIFY_EMPLOYEE=false" >> "$GITHUB_OUTPUT" + fi + env: + GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} + + - id: hasReadyToBuildLabel + name: Set HAS_READY_TO_BUILD_LABEL flag + run: | + echo "HAS_READY_TO_BUILD_LABEL=$(gh pr view "${{ env.PULL_REQUEST_NUMBER }}" --repo Expensify/App --json labels --jq '.labels[].name' | grep -q 'Ready To Build' && echo 'true')" >> "$GITHUB_OUTPUT" + if [[ "$HAS_READY_TO_BUILD_LABEL" != 'true' ]]; then + echo "The 'Ready to Build' label is not attached to the PR #${{ env.PULL_REQUEST_NUMBER }}" + fi + env: + GITHUB_TOKEN: ${{ github.token }} + + getBranchRef: + runs-on: ubuntu-latest + needs: validateActor + if: ${{ fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} + outputs: + REF: ${{ steps.getHeadRef.outputs.REF }} + steps: + - name: Checkout + if: ${{ github.event_name == 'workflow_dispatch' }} + uses: actions/checkout@v4 + + - name: Check if pull request number is correct + if: ${{ github.event_name == 'workflow_dispatch' }} + id: getHeadRef + run: | + set -e + echo "REF=$(gh pr view ${{ github.event.inputs.PULL_REQUEST_NUMBER }} --json headRefOid --jq '.headRefOid')" >> "$GITHUB_OUTPUT" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + postGitHubCommentBuildStarted: + runs-on: ubuntu-latest + needs: [validateActor, getBranchRef] + if: ${{ fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} + steps: + - name: Add build start comment + uses: actions/github-script@v7 + with: + github-token: ${{ github.token }} + script: | + const workflowURL = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`; + github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: process.env.PULL_REQUEST_NUMBER, + body: `🚧 @${{ github.actor }} has triggered a test hybrid app build. You can view the [workflow run here](${workflowURL}).` + }); + + androidHybrid: + name: Build Android HybridApp + needs: [validateActor, getBranchRef] + runs-on: ubuntu-latest-xl + defaults: + run: + working-directory: Mobile-Expensify/react-native + outputs: + S3_APK_PATH: ${{ steps.exportAndroidS3Path.outputs.S3_APK_PATH }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + repository: 'Expensify/Mobile-Expensify' + submodules: true + path: 'Mobile-Expensify' + token: ${{ secrets.OS_BOTIFY_TOKEN }} + # fetch-depth: 0 is required in order to fetch the correct submodule branch + fetch-depth: 0 + + - name: Update submodule + run: | + git submodule update --init + git fetch + git checkout ${{ github.event.pull_request.head.sha || needs.getBranchRef.outputs.REF }} + + - name: Configure MapBox SDK + run: ./scripts/setup-mapbox-sdk.sh ${{ secrets.MAPBOX_SDK_DOWNLOAD_TOKEN }} + + - uses: actions/setup-node@v4 + with: + node-version-file: 'Mobile-Expensify/react-native/.nvmrc' + cache: npm + cache-dependency-path: 'Mobile-Expensify/react-native' + + - name: Setup dotenv + run: | + cp .env.staging .env.adhoc + sed -i 's/ENVIRONMENT=staging/ENVIRONMENT=adhoc/' .env.adhoc + echo "PULL_REQUEST_NUMBER=${{ inputs.pull_request_number }}" >> .env.adhoc + + - name: Install node modules + run: | + npm install + cd .. && npm install + + # Fixes https://github.com/Expensify/App/issues/51682 + npm run grunt:build:shared + + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: 'oracle' + java-version: '17' + + - name: Setup Ruby + uses: ruby/setup-ruby@v1.190.0 + with: + bundler-cache: true + working-directory: 'Mobile-Expensify/react-native' + + - name: Install 1Password CLI + uses: 1password/install-cli-action@v1 + + - name: Load files from 1Password + env: + OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }} + run: | + op document get --output ./upload-key.keystore upload-key.keystore + op document get --output ./android-fastlane-json-key.json android-fastlane-json-key.json + # Copy the keystore to the Android directory for Fullstory + cp ./upload-key.keystore ../Android + + - name: Load Android upload keystore credentials from 1Password + id: load-credentials + uses: 1password/load-secrets-action@v2 + with: + export-env: false + env: + OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }} + ANDROID_UPLOAD_KEYSTORE_PASSWORD: op://Mobile-Deploy-CI/Repository-Secrets/ANDROID_UPLOAD_KEYSTORE_PASSWORD + ANDROID_UPLOAD_KEYSTORE_ALIAS: op://Mobile-Deploy-CI/Repository-Secrets/ANDROID_UPLOAD_KEYSTORE_ALIAS + ANDROID_UPLOAD_KEY_PASSWORD: op://Mobile-Deploy-CI/Repository-Secrets/ANDROID_UPLOAD_KEY_PASSWORD + + - name: Get Android native version + id: getAndroidVersion + run: echo "VERSION_CODE=$(grep -o 'versionCode\s\+[0-9]\+' android/app/build.gradle | awk '{ print $2 }')" >> "$GITHUB_OUTPUT" + + - name: Build Android app + id: build + env: + ANDROID_UPLOAD_KEYSTORE_PASSWORD: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEYSTORE_PASSWORD }} + ANDROID_UPLOAD_KEYSTORE_ALIAS: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEYSTORE_ALIAS }} + ANDROID_UPLOAD_KEY_PASSWORD: ${{ steps.load-credentials.outputs.ANDROID_UPLOAD_KEY_PASSWORD }} + run: bundle exec fastlane android build_adhoc_hybrid + + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-east-1 + + - name: Upload Android AdHoc build to S3 + run: bundle exec fastlane android upload_s3 + env: + S3_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY_ID }} + S3_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + S3_BUCKET: ad-hoc-expensify-cash + S3_REGION: us-east-1 + + - name: Export S3 path + id: exportAndroidS3Path + run: | + # $s3APKPath is set from within the Fastfile, android upload_s3 lane + echo "S3_APK_PATH=$s3APKPath" >> "$GITHUB_OUTPUT" + + postGithubComment: + runs-on: ubuntu-latest + name: Post a GitHub comment with app download links for testing + needs: [validateActor, getBranchRef, androidHybrid] + if: ${{ always() }} + steps: + - name: Checkout + uses: actions/checkout@v4 + if: ${{ fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} + with: + ref: ${{ github.event.pull_request.head.sha || needs.getBranchRef.outputs.REF }} + + - name: Download Artifact + uses: actions/download-artifact@v4 + if: ${{ fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} + + - name: Publish links to apps for download + if: ${{ fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} + uses: ./.github/actions/javascript/postTestBuildComment + with: + PR_NUMBER: ${{ env.PULL_REQUEST_NUMBER }} + GITHUB_TOKEN: ${{ github.token }} + ANDROID: ${{ needs.androidHybrid.result }} + ANDROID_LINK: ${{ needs.androidHybrid.outputs.S3_APK_PATH }} \ No newline at end of file diff --git a/.storybook/webpack.config.ts b/.storybook/webpack.config.ts index 92cea8666bc2..1c22608160cf 100644 --- a/.storybook/webpack.config.ts +++ b/.storybook/webpack.config.ts @@ -95,7 +95,7 @@ const webpackConfig = ({config}: {config: Configuration}) => { }); config.module.rules?.push({ - test: /pdf\.worker\.mjs$/, + test: /pdf\.worker\.min\.mjs$/, type: 'asset/source', }); diff --git a/android/app/build.gradle b/android/app/build.gradle index 672776f6ecb4..dd056d0c20a6 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -110,8 +110,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1009006607 - versionName "9.0.66-7" + versionCode 1009007200 + versionName "9.0.72-0" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" @@ -199,7 +199,7 @@ afterEvaluate { def hermesCTask = gradle.includedBuild("react-native").task(":packages:react-native:ReactAndroid:hermes-engine:buildHermesC") android.applicationVariants.configureEach { variant -> - if (variant.buildType.name == "release") { + if (variant.buildType.name == "release" || variant.buildType.name == "adhoc") { def variantName = variant.name.capitalize() def bundleTask = tasks.named("createBundle${variantName}JsAndAssets").getOrNull() diff --git a/assets/images/receipt-placeholder-plus.svg b/assets/images/receipt-placeholder-plus.svg new file mode 100644 index 000000000000..3ebc08b40b06 --- /dev/null +++ b/assets/images/receipt-placeholder-plus.svg @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/config/webpack/webpack.common.ts b/config/webpack/webpack.common.ts index 8aa8f5aa566c..c60670c72324 100644 --- a/config/webpack/webpack.common.ts +++ b/config/webpack/webpack.common.ts @@ -175,7 +175,7 @@ const getCommonConfiguration = ({file = '.env', platform = 'web'}: Environment): // We are importing this worker as a string by using asset/source otherwise it will default to loading via an HTTPS request later. // This causes issues if we have gone offline before the pdfjs web worker is set up as we won't be able to load it from the server. { - test: new RegExp('node_modules/pdfjs-dist/legacy/build/pdf.worker.mjs'), + test: new RegExp('node_modules/pdfjs-dist/legacy/build/pdf.worker.min.mjs'), type: 'asset/source', }, diff --git a/contributingGuides/BUGZERO_CHECKLIST.md b/contributingGuides/BUGZERO_CHECKLIST.md index 96fb1c29432e..1aeff6053eca 100644 --- a/contributingGuides/BUGZERO_CHECKLIST.md +++ b/contributingGuides/BUGZERO_CHECKLIST.md @@ -13,9 +13,8 @@ Source of bug: - [ ] 1z. Other: Where bug was reported: - - [ ] 2a. Reported on production - - [ ] 2b. Reported on staging (deploy blocker) - - [ ] 2c. Reported on both staging and production + - [ ] 2a. Reported on production (eg. bug slipped through the normal regression and PR testing process on staging) + - [ ] 2b. Reported on staging (eg. found during regression or PR testing) - [ ] 2d. Reported on a PR - [ ] 2z. Other: diff --git a/contributingGuides/FORMS.md b/contributingGuides/FORMS.md index e53be6f6b269..2cfd24f13ab7 100644 --- a/contributingGuides/FORMS.md +++ b/contributingGuides/FORMS.md @@ -320,14 +320,17 @@ An example of this can be seen in the [ACHContractStep](https://github.com/Expen ### Safe Area Padding -Any `FormProvider.js` that has a button will also add safe area padding by default. If the `` is inside a ``, we will want to disable the default safe area padding applied there e.g. +Any `FormProvider.tsx` that has a button at the bottom. If the `` is inside a ``, the bottom safe area inset is handled automatically (`includeSafeAreaPaddingBottom` needs to be set to `true`, but its the default). +If you have custom requirements and can't use ``, you can use the `useStyledSafeAreaInsets()` hook: ```jsx - +const { paddingTop, paddingBottom, safeAreaPaddingBottomStyle } = useStyledSafeAreaInsets(); + + {...} - + ``` ### Handling nested Pickers in Form diff --git a/contributingGuides/PROPOSAL_TEMPLATE.md b/contributingGuides/PROPOSAL_TEMPLATE.md index 8c9fa7968fe2..d5ab0bf4a864 100644 --- a/contributingGuides/PROPOSAL_TEMPLATE.md +++ b/contributingGuides/PROPOSAL_TEMPLATE.md @@ -7,6 +7,9 @@ ### What changes do you think we should make in order to solve the problem? +### What specific scenarios should we cover in automated tests to prevent reintroducing this issue in the future? + + ### What alternative solutions did you explore? (Optional) **Reminder:** Please use plain English, be brief and avoid jargon. Feel free to use images, charts or pseudo-code if necessary. Do not post large multi-line diffs or write walls of text. Do not create PRs unless you have been hired for this job. diff --git a/contributingGuides/REVIEWER_CHECKLIST.md b/contributingGuides/REVIEWER_CHECKLIST.md index 5fc14328f3b4..545c79a95af1 100644 --- a/contributingGuides/REVIEWER_CHECKLIST.md +++ b/contributingGuides/REVIEWER_CHECKLIST.md @@ -30,7 +30,7 @@ - [ ] I verified that this PR follows the guidelines as stated in the [Review Guidelines](https://github.com/Expensify/App/blob/main/contributingGuides/PR_REVIEW_GUIDELINES.md) - [ ] I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like `Avatar`, I verified the components using `Avatar` have been tested & I retested again) - [ ] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests) -- [ ] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such +- [ ] I verified any variables that can be defined as constants (ie. in CONST.ts or at the top of the file that uses the constant) are defined as such - [ ] If a new component is created I verified that: - [ ] A similar component doesn't exist in the codebase - [ ] All props are defined accurately and each prop has a `/** comment above it */` @@ -54,6 +54,7 @@ - [ ] I verified that all the inputs inside a form are aligned with each other. - [ ] I added `Design` label and/or tagged `@Expensify/design` so the design team can review the changes. - [ ] If a new page is added, I verified it's using the `ScrollView` component to make it scrollable when more elements are added to the page. +- [ ] For any bug fix or new feature in this PR, I verified that sufficient [unit tests](https://github.com/Expensify/App/blob/main/tests/README.md) are included to prevent regressions in this flow. - [ ] If the `main` branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the `Test` steps. - [ ] I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR. diff --git a/docs/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-Bank-Account.md b/docs/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-Bank-Account.md index a7b7ed1c4f4f..b77f4c88605e 100644 --- a/docs/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-Bank-Account.md +++ b/docs/articles/expensify-classic/bank-accounts-and-payments/bank-accounts/Connect-Personal-Bank-Account.md @@ -10,7 +10,7 @@ To connect a deposit-only account, 1. Hover over **Settings**, then click **Account**. 2. Click the **Payments** tab on the left. -3. Click **Add Deposit-Only Bank Account**, then click **Connect to your bank**. +3. Click **Add Deposit-Only Bank Account**, then click **Connect to your bank**. 4. Click **Continue**. 5. Search for your bank account in the list of banks and follow the prompts to sign in to your bank account. - If your bank doesn’t appear, click the X in the right corner of the Plaid pop-up window, then click **Connect Manually**. You’ll then manually enter your account information and click **Save & Continue**. @@ -19,6 +19,10 @@ To connect a deposit-only account, You’ll now receive reimbursements for your expense reports and invoices directly to this bank account. +{% include info.html %} +If your organization has global reimbursement enabled and you want to add a bank account outside of the US, you can do so by following the steps above. However, after clicking on **Add Deposit-Only Bank Account**, look for a button that says **Switch Country**. This will allow you to add a deposit account from a supported country and receive reimbursements in your local currency. +{% include end-info.html %} + {% include faq-begin.md %} **I connected my deposit-only bank account. Why haven’t I received my reimbursement?** diff --git a/docs/articles/expensify-classic/connect-credit-cards/company-cards/Commercial-Card-Feeds.md b/docs/articles/expensify-classic/connect-credit-cards/company-cards/Commercial-Card-Feeds.md index f46c1a1442c2..e5d80b80017d 100644 --- a/docs/articles/expensify-classic/connect-credit-cards/company-cards/Commercial-Card-Feeds.md +++ b/docs/articles/expensify-classic/connect-credit-cards/company-cards/Commercial-Card-Feeds.md @@ -82,7 +82,7 @@ Any transactions that were posted prior to this date will not be imported into E Click the Assign button Once assigned, you will see each cardholder associated with their card as well as the start date listed. -If you're using a connected accounting system such as NetSuite, Xero, Intacct, Quickbooks Desktop, or QuickBooks Online, you can also connect the card to export to a specific credit card GL account. +If you're using a connected accounting system such as NetSuite, Xero, Intacct, QuickBooks Desktop, or QuickBooks Online, you can also connect the card to export to a specific credit card GL account. Go to Settings > Domains > [Domain name] > Company Cards Click Edit Exports on the right-hand side of the card table and select the GL account you want to export expenses to. diff --git a/docs/articles/expensify-classic/connect-credit-cards/company-cards/Company-Card-Settings.md b/docs/articles/expensify-classic/connect-credit-cards/company-cards/Company-Card-Settings.md index 553171d73dde..7492d705c2ef 100644 --- a/docs/articles/expensify-classic/connect-credit-cards/company-cards/Company-Card-Settings.md +++ b/docs/articles/expensify-classic/connect-credit-cards/company-cards/Company-Card-Settings.md @@ -49,7 +49,7 @@ If Scheduled Submit is disabled on the group workspace level (or set to a manual # How to connect company cards to an accounting integration -If you're using a connected accounting system such as NetSuite, Xero, Intacct, Quickbooks Desktop, or QuickBooks Online, you can also connect the card to export to a specific credit card GL account. First, connect the card itself, and once completed, follow the steps below: +If you're using a connected accounting system such as NetSuite, Xero, Intacct, QuickBooks Desktop, or QuickBooks Online, you can also connect the card to export to a specific credit card GL account. First, connect the card itself, and once completed, follow the steps below: Go to Settings > Domains > Domain name > Company Cards Click Edit Exports on the right-hand side of the card table and select the GL account you want to export expenses to You're all done. After the account is set, exported expenses will be mapped to the specific account selected when exported by a Domain Admin. diff --git a/docs/articles/expensify-classic/connect-credit-cards/company-cards/Direct-Bank-Connections.md b/docs/articles/expensify-classic/connect-credit-cards/company-cards/Direct-Bank-Connections.md index c9720177a8fc..f790309fbefa 100644 --- a/docs/articles/expensify-classic/connect-credit-cards/company-cards/Direct-Bank-Connections.md +++ b/docs/articles/expensify-classic/connect-credit-cards/company-cards/Direct-Bank-Connections.md @@ -56,7 +56,7 @@ To completely remove the card connection, unassign every card from the list and # Deep Dive ## Configure card settings Once you’ve imported your company cards, the next step is configuring the cards’ settings. -If you're using a connected accounting system such as NetSuite, Xero, Sage Intacct, Quickbooks Desktop, or QuickBooks Online. In that case, you can connect the card to export to a specific credit card GL account. +If you're using a connected accounting system such as NetSuite, Xero, Sage Intacct, QuickBooks Desktop, or QuickBooks Online. In that case, you can connect the card to export to a specific credit card GL account. 1. Go to **Settings > Domains > _Domain Name_ > Company Cards** 2. Click **Edit Exports** on the right-hand side of the card table and select the GL account you want to export expenses to 3. You're all done. After the account is set, exported expenses will be mapped to the specific account selected when exported by a Domain Admin. diff --git a/docs/articles/expensify-classic/connections/quickbooks-desktop/Configure-Quickbooks-Desktop.md b/docs/articles/expensify-classic/connections/quickbooks-desktop/Configure-Quickbooks-Desktop.md index dd913af1c497..90d3970cbc94 100644 --- a/docs/articles/expensify-classic/connections/quickbooks-desktop/Configure-Quickbooks-Desktop.md +++ b/docs/articles/expensify-classic/connections/quickbooks-desktop/Configure-Quickbooks-Desktop.md @@ -1,6 +1,6 @@ --- -title: Configure Quickbooks Desktop -description: Configure Quickbooks Desktop +title: Configure QuickBooks Desktop +description: Configure QuickBooks Desktop --- Our new QuickBooks Desktop integration allows you to automate the import and export process with Expensify. @@ -28,11 +28,11 @@ The following steps will determine how data will be exported from Expensify to Q # Step 2: Configure coding/import settings -The following steps help you determine how data will be imported from QuickBooks Online to Expensify: +The following steps help you determine how data will be imported from QuickBooks Desktop to Expensify: ![Expensify coding settings page for the QuickBooks Desktop integration](https://help.expensify.com/assets/images/quickbooks-desktop-coding-settings.png){:width="100%"} -1. Click Import under the QuickBooks Online connection. +1. Click Import under the QuickBooks Desktop connection. 2. Review each of the following import settings: - **Chart of Accounts**: The Chart of Accounts is automatically imported from QuickBooks Desktop as categories. This cannot be amended. - **Classes**: Choose whether to import classes, which will be shown in Expensify as tags for expense-level coding. @@ -67,15 +67,15 @@ To manually sync your connection: For manual syncing, we recommend completing this process at least once a week and/or after making changes in QuickBooks Desktop that could impact how reports export from Expensify. Changes may include adjustments to your chart of accounts, vendors, employees, customers/jobs, or items. Remember: Both the Web Connector and QuickBooks Desktop need to be running for syncing or exporting to work. {% include end-info.html %} -## **Can I sync Expensify and QuickBooks Desktop (QBD) and use the platforms at the same time?** +## **Can I sync Expensify and QuickBooks Desktop and use the platforms at the same time?** When syncing Expensify to QuickBooks Desktop, we recommend waiting until the sync finishes to access either Expensify and/or QuickBooks Desktop, as performance may vary during this process. You cannot open an instance of QuickBooks Desktop while a program is syncing - this may cause QuickBooks Desktop to behave unexpectedly. -## **What are the different types of accounts that can be imported from Quickbooks Desktop?** +## **What are the different types of accounts that can be imported from QuickBooks Desktop?** Here is the list of accounts from QuickBooks Desktop and how they are pulled into Expensify: -| QBD account type | How it imports to Expensify | +| QuickBooks Desktop account type | How it imports to Expensify | | ------------- | ------------- | | Accounts payable | Vendor bill or journal entry export options | | Accounts receivable | Do not import | diff --git a/docs/articles/expensify-classic/connections/quickbooks-online/Configure-Quickbooks-Online.md b/docs/articles/expensify-classic/connections/quickbooks-online/Configure-Quickbooks-Online.md index 3fd1df0c0a1c..d9b4d846110e 100644 --- a/docs/articles/expensify-classic/connections/quickbooks-online/Configure-Quickbooks-Online.md +++ b/docs/articles/expensify-classic/connections/quickbooks-online/Configure-Quickbooks-Online.md @@ -1,6 +1,6 @@ --- -title: Configure Quickbooks Online -description: Configure Quickbooks Online +title: Configure QuickBooks Online +description: Configure QuickBooks Online --- # Best Practices Using QuickBooks Online @@ -88,7 +88,7 @@ The following steps help you determine the advanced settings for your connection - _Automatically Create Entities_: If you export reimbursable expenses as Vendor Bills or Journal Entries, Expensify will automatically create a vendor in QuickBooks (If one does not already exist). Expensify will also automatically create a customer when exporting Invoices. - _Sync Reimbursed Reports_: Enabling will mark the Vendor Bill as paid in QuickBooks Online if you reimburse a report via ACH direct deposit in Expensify. If you reimburse outside of Expensify, then marking the Vendor Bill as paid in QuickBooks Online will automatically mark the report as reimbursed in Expensify. - _QuickBooks Account_: Select the bank account your reimbursements are coming out of, and we'll create the payment in QuickBooks. - - _Collection Account_: When exporting invoices from Expensify to Quickbooks Online, the invoice will appear against the Collection Account once marked as Paid. + - _Collection Account_: When exporting invoices from Expensify to QuickBooks Online, the invoice will appear against the Collection Account once marked as Paid. {% include faq-begin.md %} diff --git a/docs/articles/expensify-classic/connections/quickbooks-online/Quickbooks-Online-Troubleshooting.md b/docs/articles/expensify-classic/connections/quickbooks-online/Quickbooks-Online-Troubleshooting.md index a397e34accb0..66cf4df2788f 100644 --- a/docs/articles/expensify-classic/connections/quickbooks-online/Quickbooks-Online-Troubleshooting.md +++ b/docs/articles/expensify-classic/connections/quickbooks-online/Quickbooks-Online-Troubleshooting.md @@ -1,6 +1,6 @@ --- -title: Quickbooks Online Troubleshooting -description: Quickbooks Online Troubleshooting +title: QuickBooks Online Troubleshooting +description: QuickBooks Online Troubleshooting --- # ExpensiError QBO022: When exporting billable expenses, please make sure the account in QuickBooks Online has been marked as billable. diff --git a/docs/articles/expensify-classic/connections/sage-intacct/Configure-Sage-Intacct.md b/docs/articles/expensify-classic/connections/sage-intacct/Configure-Sage-Intacct.md index 1f0be2f4571a..0c9e6c87f9ab 100644 --- a/docs/articles/expensify-classic/connections/sage-intacct/Configure-Sage-Intacct.md +++ b/docs/articles/expensify-classic/connections/sage-intacct/Configure-Sage-Intacct.md @@ -11,6 +11,8 @@ There are several options for exporting Expensify reports to Sage Intacct. Let's To access these settings, go to **Settings > Workspace > Group > Connections** and select the **Configure** button. +![Highlighting the Configure button for the Sage Intacct Integration]({{site.url}}/assets/images/SageConfigureIntegrationConfigureButton.png){:width="100%"} + ## Export Options ### Preferred Exporter @@ -95,6 +97,8 @@ To find the Integration Name in Sage Intacct: 1. Go to **Platform Services > Objects > List** 2. Set "filter by application" to "user-defined dimensions." +![Image of Sage Intacct Objects filtered by User Defined Dimension]({{site.url}}/assets/images/SageConfigureUserDefinedDimensionsFilter.png){:width="100%"} + Now, in Expensify, navigate to **Settings > Workspaces > Group > [Workspace Name] > Connections**, and click **Configure** under Sage Intacct. On the Coding tab, enable the toggle next to User Defined Dimensions. Enter the "Integration name" and choose whether to import it into Expensify as an expense-level Tag or as a Report Field, then click **Save**. You'll now see the values for your custom segment available under Tags settings or Report Fields settings in Expensify. diff --git a/docs/articles/expensify-classic/connections/sage-intacct/Connect-To-Sage-Intacct.md b/docs/articles/expensify-classic/connections/sage-intacct/Connect-To-Sage-Intacct.md index 76851a35ce4c..a01464cd0740 100644 --- a/docs/articles/expensify-classic/connections/sage-intacct/Connect-To-Sage-Intacct.md +++ b/docs/articles/expensify-classic/connections/sage-intacct/Connect-To-Sage-Intacct.md @@ -5,7 +5,7 @@ order: 1 --- # Overview -Expensify’s seamless integration with Sage Intacct allows you to connect using either Role-based permissions or User-based permissions. +Expensify’s seamless integration with Sage Intacct allows you to connect using either Role-based permissions or User-based permissions. Once connected to Intacct you’re able to automate report exports, customize your coding preferences, and utilize Sage Intacct’s advanced features. When you’ve configured these settings in Expensify correctly, you can use the integration's settings to automate many tasks, streamlining your workflow for increased efficiency. @@ -53,7 +53,12 @@ Setup the user using these configurations: - **User Type:** "Business" - **Admin Privileges:** "Full" - **Status:** "Active" -Once you've created the user, you'll need to set the correct permissions. To set those, go to the **subscription** link for this user in the user list, **click on the checkbox** next to the Application/Module and then click on the **Permissions** link to modify those. + +![Image of Sage Intacct Web Services User setup]({{site.url}}/assets/images/SageConnectSettingUpWebServicesUser.png){:width="100%"} + +Once you've created the user, you'll need to set the correct permissions. To set those, go to the **subscription** link for this user in the user list, **click on the checkbox** next to the Application/Module and then click on the **Permissions** link to modify those. + +![Image showing the Application/Module checkbox to click]({{site.url}}/assets/images/SageConnectSubscriptionSettings.png){:width="100%"} These are the permissions required for a user to export reimbursable expenses as Expense Reports: - **Administration (All)** @@ -64,8 +69,7 @@ These are the permissions required for a user to export reimbursable expenses as - **Projects (Read-only)** (only needed if using Projects and Customers) - **Accounts Payable (All)** (only needed for exporting non-reimbursable expenses as vendor bills) -**Note:** you can set permissions for each Application/Module by selecting the radio button next to the desired Permission and clicking **Save**. - +**Note:** You can set permissions for each Application/Module by selecting the radio button next to the desired Permission and clicking **Save**. ### Step 2: Enable the Time & Expenses Module (Only required if exporting reimbursable expenses as Expense Reports) The Time & Expenses (T&E) module is often included in your Sage Intacct instance, but if it wasn't part of your initial Sage Intacct setup, you may need to enable it. **Enabling the T&E module is a paid subscription through Sage Intacct. For information on the costs of enabling this module, please contact your Sage Intacct account manager**. It's necessary for our integration and only takes a few minutes to configure. @@ -76,7 +80,9 @@ The Time & Expenses (T&E) module is often included in your Sage Intacct instance - **Expense Report:** EXP - **Employee:** EMP - **Duplicate Numbers:** Select “Do not allow creation” - + + ![Image of Sage Intacct Time and Expense Auto-numbering Sequences Settings]({{site.url}}/assets/images/SageConnectTimeandExpenseSequenceNumbers.png){:width="100%"} + - To create the EXP sequence, **click on the down arrow on the expense report line and select **Add**: - **Sequence ID:** EXP - **Print Title:** EXPENSE REPORT @@ -99,7 +105,7 @@ To set up Employees in Sage Intacct, follow these steps: - **Primary contact name** - **Email address** - In the **Primary contact name** field, click the dropdown arrow. - - Select the employee if they've already been created. + - Select the employee if they've already been created. - Otherwise, click **+ Add** to create a new employee. - Fill in their **Primary Email Address** along with any other required information. @@ -126,8 +132,14 @@ To enable Customization Services go to **Company > Subscriptions > Customization ### Step 6: Create a Test Workspace in Expensify and Download the [Expensify Package](https://www.expensify.com/tools/integrations/downloadPackage) Creating a test workspace in Expensify allows you to have a sandbox environment for testing before implementing the integration live. If you are already using Expensify, creating a test workspace ensures that your existing group workspace rules and approval workflows remain intact. Here's how to set it up: 1. Go to **expensify.com > Settings > Workspaces > New Workspace**. + + ![Image of creating a new Workspace in Expensify]({{site.url}}/assets/images/SageConnectCreatingWorkspace.png){:width="100%"} + 2. Name the workspace something like "Sage Intacct Test Workspace." 3. Go to **Connections > Sage Intacct > Connect to Sage Intacct**. + + ![Image of selecting the Sage Intacct integration in Expensify]({{site.url}}/assets/images/SageConnectEnableSage.png){:width="100%"} + 4. Select **Download Package** (You only need to download the file; we'll upload it from your Downloads folder later). @@ -150,6 +162,7 @@ If you use **Platform Services**: 1. Go to **Company > Company Info > Security** in Intacct and click **Edit**. 2. Scroll down to **Web Services Authorizations** and add "expensify" (all lower case) as a Sender ID. +![Image of Web Services Authorizations in Sage Intacct]({{site.url}}/assets/images/SageConnectWebServicesAuthorizations.png){:width="100%"} ### Step 9: Enter Credentials and Connect Expensify and Sage Intacct @@ -158,6 +171,8 @@ If you use **Platform Services**: 2. Click **Connect to Sage Intacct** and enter the credentials you've set for your web services user. 3. Click **Send** once you're done. +![Image of Sage Intacct credentials being entered in Expensify to connect the integration]({{site.url}}/assets/images/SageConnectEnterCredentials.png){:width="100%"} + Next, you’ll configure the Export, Coding, and Advanced tabs of the connection configuration in Expensify. diff --git a/docs/articles/expensify-classic/domains/Add-Domain-Members-and-Admins.md b/docs/articles/expensify-classic/domains/Add-Domain-Members-and-Admins.md index 14b5225801d0..71993956f4f4 100644 --- a/docs/articles/expensify-classic/domains/Add-Domain-Members-and-Admins.md +++ b/docs/articles/expensify-classic/domains/Add-Domain-Members-and-Admins.md @@ -1,6 +1,6 @@ --- -title: Add Domain Members and Admins -description: Add members and admins to a domain +title: Add and remove Domain Members and Admins +description: Add and remove members and admins to a domain ---
@@ -34,7 +34,19 @@ Once the member verifies their email address, all Domain Admins will be notified 1. Hover over Settings, then click **Domains**. 2. Click the name of the domain. 3. Click the **Domain Members** tab on the left. -4. Under the Domain Members section, enter the first part of the member’s email address and click **Invite**. +4. Under the Domain Members section, enter the first part of the member’s email address and click **Invite**. + +# Close a Domain Member’s account + +1. Hover over Settings, then click **Domains**. +2. Click the name of the domain. +3. Click the **Domain Members** tab on the left. +4. Find the user account you’d like to close, and select it +5. Click **Close** to close the account + +{% include info.html %} +Any closed account can be reopened at any time, by reinviting the user via the Domain Member page +{% include end-info.html %} # Add Domain Admin @@ -47,4 +59,12 @@ Once the member verifies their email address, all Domain Admins will be notified This can be any email address—it does not have to be an email address under the domain. {% include end-info.html %} +# Remove Domain Admin + +1. Hover over Settings, then click **Domains**. +2. Click the name of the domain. +3. Click the **Domain Admins** tab on the left. +4. Under the Domain Admins section, click the red trash can button next to the Domain Admin you’d like to remove +
+ diff --git a/docs/articles/expensify-classic/expenses/Apply-Tax.md b/docs/articles/expensify-classic/expenses/Apply-Tax.md index c89176bcc0e8..9360962cb2ba 100644 --- a/docs/articles/expensify-classic/expenses/Apply-Tax.md +++ b/docs/articles/expensify-classic/expenses/Apply-Tax.md @@ -28,6 +28,21 @@ To handle these, you can create a single tax that combines both taxes into a sin From the Reports page, you can select Reports and then click **Export To > Tax Report** to generate a CSV containing all the expense information, including the split-out taxes. +## Why is the tax amount different than I expect? + +In Expensify, tax is *inclusive*, meaning it's already part of the total amount shown. + +To determine the inclusive tax from a total price that already includes tax, you can use the following formula: + +### **Tax amount = (Total price x Tax rate) ÷ (1 + Tax Rate)** + +For example, if an item costs $100 and the tax rate is 20%: +Tax amount = (**$100** x .20) ÷ (1 + .**20**) = **$16.67** +This means the tax amount $16.67 is included in the total. + +If you are simply trying to calculate the price before tax, you can use the formula: + +### **Price before tax = (Total price) ÷ (1 + Tax rate)** # Deep Dive diff --git a/docs/articles/expensify-classic/expenses/Create-Expense-Rules.md b/docs/articles/expensify-classic/expenses/Create-Expense-Rules.md new file mode 100644 index 000000000000..e83640403ce4 --- /dev/null +++ b/docs/articles/expensify-classic/expenses/Create-Expense-Rules.md @@ -0,0 +1,61 @@ +--- +title: Create Expense Rules +description: Automatically categorize, tag, and report expenses based on the merchant's name +--- + +Expense rules allow you to automatically categorize, tag, and report expenses based on the merchant’s name. + +# Create expense rules + +1. Hover over **Settings** and click **Account**. +2. Click **Expense Rules**. +2. Click **New Rule**. +3. Add what the merchant name should contain in order for the rule to be applied. *Note: If you enter just a period, the rule will apply to all expenses regardless of the merchant name. Universal Rules will always take precedence over all other expense rules.* +4. Choose from the following rules: +- **Merchant:** Updates the merchant name (e.g., “Starbucks #238” could be changed to “Starbucks”) +- **Category:** Applies a workspace category to the expense +- **Tag:** Applies a tag to the expense (e.g., a Department or Location) +- **Description:** Adds a description to the description field on the expense +- **Reimbursability:** Determines whether the expense will be marked as reimbursable or non-reimbursable +- **Billable**: Determines whether the expense is billable +- **Add to a report named:** Adds the expense to a report with the name you type into the field. If no report with that name exists, a new report will be created if the "Create report if necessary" checkbox is selected. + +![Fields to create a new expense rule, including the characters a merchant's name should contain for the rule to apply, as well as what changes should be applied to the expense including the merchant name, category, tag, description, reimbursability, whether it is billable, and what report it will be added to.](https://help.expensify.com/assets/images/ExpensifyHelp_ExpenseRules_01.png){:width="100%"} + +{:start="6"} +6. (Optional) To apply the rule to previously entered expenses, select the **Apply to existing matching expenses** checkbox. You can also click **Preview Matching Expenses** to see if your rule matches the intended expenses. + +# How rules are applied + +In general, your expense rules will be applied in order, from **top to bottom**, (i.e., from the first rule). However, other settings can impact how expense rules are applied. Here is the hierarchy that determines how these are applied: + +1. A Universal Rule will **always** be applied over any other expense category rules. Rules that would otherwise change the expense category will **not** override the Universal Rule. +2. If Scheduled Submit and the setting “Enforce Default Report Title” are enabled on the workspace, this will take precedence over any rules trying to add the expense to a report. +3. If the expense is from a company card that is forced to a workspace with strict rule enforcement, those rules will take precedence over individual expense rules. +4. If you belong to a workspace that is tied to an accounting integration, the configuration settings for this connection may update your expense details upon export, even if the expense rules were successfully applied to the expense. + +# Create an expense rule from changes made to an expense + +If you open an expense and change it, you can then create an expense rule based on those changes by selecting the “Create a rule based on your changes" checkbox. *Note: The expense must be saved, reopened, and edited for this option to appear.* + +![The "Create a rule based on your changes" checkbox is located in the bottom right corner of the popup window, to the left of the Save button.](https://help.expensify.com/assets/images/ExpensifyHelp_ExpenseRules_02.png){:width="100%"} + +# Delete an expense rule + +To delete an expense rule, + +1. Hover over **Settings** and click **Account**. +2. Click **Expense Rules**. +3. Scroll down to the rule you’d like to remove and click the trash can icon. + +![The Trash icon to delete an expense rule is located at the top right of the box containing the expense rule, to the left of the Edit icon.](https://help.expensify.com/assets/images/ExpensifyHelp_ExpenseRules_03.png){:width="100%"} + +{% include faq-begin.md %} + +## How can I use expense rules to vendor match when exporting to an accounting package? + +When exporting non-reimbursable expenses to your connected accounting package, the payee field will list "Credit Card Misc." if the merchant name on the expense in Expensify is not an exact match to a vendor in the accounting package. When an exact match is unavailable, "Credit Card Misc." prevents multiple variations of the same vendor (e.g., Starbucks and Starbucks #1234, as is often seen in credit card statements) from being created in your accounting package. + +For repeated expenses, the best practice is to use Expense Rules, which will automatically update the merchant name without having to do it manually each time. This only works for connections to QuickBooks Online, Desktop, and Xero. Vendor matching cannot be performed in this manner for NetSuite or Sage Intacct due to limitations in the API of the accounting package. + +{% include faq-end.md %} diff --git a/docs/articles/expensify-classic/expenses/Expense-Rules.md b/docs/articles/expensify-classic/expenses/Expense-Rules.md deleted file mode 100644 index 295aa8d00cc9..000000000000 --- a/docs/articles/expensify-classic/expenses/Expense-Rules.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: Expense Rules -description: Expense rules allow you to automatically categorize, tag, and report expenses based on the merchant's name. - ---- -# Overview -Expense rules allow you to automatically categorize, tag, and report expenses based on the merchant’s name. - -# How to use Expense Rules -**To create an expense rule, follow these steps:** -1. Navigate to **Settings > Account > Expense Rules** -2. Click on **New Rule** -3. Fill in the required information to set up your rule - -When creating an expense rule, you will be able to apply the following rules to expenses: - -![Insert alt text for accessibility here](https://help.expensify.com/assets/images/ExpensifyHelp_ExpenseRules_01.png){:width="100%"} - -- **Merchant:** Updates the merchant name, e.g., “Starbucks #238” could be changed to “Starbucks” -- **Category:** Applies a workspace category to the expense -- **Tag:** Applies a tag to the expense, e.g., a Department or Location -- **Description:** Adds a description to the description field on the expense -- **Reimbursability:** Determines whether the expense will be marked as reimbursable or non-reimbursable -- **Billable**: Determines whether the expense is billable -- **Add to a report named:** Adds the expense to a report with the name you type into the field. If no report with that name exists, a new report will be created - -## Tips on using Expense Rules -- If you'd like to apply a rule to all expenses (“Universal Rule”) rather than just one merchant, simply enter a period [.] and nothing else into the **“When the merchant name contains:”** field. **Note:** Universal Rules will always take precedence over all other rules for category (more on this below). -- You can apply a rule to previously entered expenses by checking the **Apply to existing matching expenses** checkbox. Click “Preview Matching Expenses” to see if your rule matches the intended expenses. -- You can create expense rules while editing an expense. To do this, simply check the box **“Create a rule based on your changes"** at the time of editing. Note that the expense must be saved, reopened, and edited for this option to appear. - - -![Insert alt text for accessibility here](https://help.expensify.com/assets/images/ExpensifyHelp_ExpenseRules_02.png){:width="100%"} - - -To delete an expense rule, go to **Settings > Account > Expense Rules**, scroll down to the rule you’d like to remove, and then click the trash can icon in the upper right corner of the rule: - -![Insert alt text for accessibility here](https://help.expensify.com/assets/images/ExpensifyHelp_ExpenseRules_03.png){:width="100%"} - -# Deep Dive -In general, your expense rules will be applied in order, from **top to bottom**, i.e., from the first rule. However, other settings can impact how expense rules are applied. Here is the hierarchy that determines how these are applied: -1. A Universal Rule will **always** precede over any other expense category rules. Rules that would otherwise change the expense category will **not** override the Universal Rule. -2. If Scheduled Submit and the setting “Enforce Default Report Title” are enabled on the workspace, this will take precedence over any rules trying to add the expense to a report. -3. If the expense is from a Company Card that is forced to a workspace with strict rule enforcement, those rules will take precedence over individual expense rules. -4. If you belong to a workspace that is tied to an accounting integration, the configuration settings for this connection may update your expense details upon export, even if the expense rules were successfully applied to the expense. - - -{% include faq-begin.md %} -## How can I use Expense Rules to vendor match when exporting to an accounting package? -When exporting non-reimbursable expenses to your connected accounting package, the payee field will list "Credit Card Misc." if the merchant name on the expense in Expensify is not an exact match to a vendor in the accounting package. -When an exact match is unavailable, "Credit Card Misc." prevents multiple variations of the same vendor (e.g., Starbucks and Starbucks #1234, as is often seen in credit card statements) from being created in your accounting package. -For repeated expenses, the best practice is to use Expense Rules, which will automatically update the merchant name without having to do it manually each time. -This only works for connections to QuickBooks Online, Desktop, and Xero. Vendor matching cannot be performed in this manner for NetSuite or Sage Intacct due to limitations in the API of the accounting package. - -{% include faq-end.md %} diff --git a/docs/articles/expensify-classic/expensify-card/Expensify-Card-Reconciliation.md b/docs/articles/expensify-classic/expensify-card/Expensify-Card-Reconciliation.md index 81eae56fa774..82156470a825 100644 --- a/docs/articles/expensify-classic/expensify-card/Expensify-Card-Reconciliation.md +++ b/docs/articles/expensify-classic/expensify-card/Expensify-Card-Reconciliation.md @@ -95,13 +95,17 @@ The sum of the expenses should equal the balance in your Expensify Clearing or L {% include faq-begin.md %} -**Why is the amount in my Expensify report so different from the amount in my accounting system?** +## Why is the amount in my Expensify report so different from the amount in my accounting system? If the Expensify report shows an amount that is significantly different to your accounting system, there are a few ways to identify the issues: - Double check that the expenses posted to the GL are within the correct month. Filter out these expenses to see if they now match those in the CSV report. - Use the process outlined above to export a report of all the transactions from your Clearing (for Daily Settlement) or Liability (for monthly settlement) account, then create a pivot table to group the transactions into expenses and settlements. - Run the settlements report in the “settlements” view of the Reconciliation Dashboard to confirm that the numbers match. - - Compare “Approved” activity to your posted activity within your accounting system to confirm the numbers match. + - Compare “Approved” activity to your posted activity within your accounting system to confirm the numbers match. + +## What if Auto-Reconciliation is disabled for my company’s Expensify Cards? + +If Auto-Reconciliation is disabled for your company’s Expensify Cards, a Domain Admin can set an export account for individual cards via Settings > Domains > Domain Name > Company Cards > Edit Exports. {% include faq-end.md %} diff --git a/docs/articles/expensify-classic/settings/Close-or-reopen-account.md b/docs/articles/expensify-classic/settings/Close-or-reopen-account.md index 7ef7da7137c5..3d288da54a73 100644 --- a/docs/articles/expensify-classic/settings/Close-or-reopen-account.md +++ b/docs/articles/expensify-classic/settings/Close-or-reopen-account.md @@ -56,6 +56,18 @@ Your account is now reopened. You can recreate any necessary workspaces, adjust Any data or reports that weren’t shared were permanently deleted when the account was closed. {% include end-info.html %} +# Close a Domain Member’s account as a Domain Admin + +1. Hover over Settings, then click **Domains**. +2. Click the name of the domain. +3. Click the **Domain Members** tab on the left. +4. Find the user account you’d like to close, and select it +5. Click **Close** to close the account + +{% include info.html %} +Any closed account can be reopened at any time, by reinviting the user via the Domain Member page +{% include end-info.html %} + # FAQs **I’m unable to close my account.** diff --git a/docs/articles/expensify-classic/settings/Set-Notifications.md b/docs/articles/expensify-classic/settings/Email-Notifications.md similarity index 61% rename from docs/articles/expensify-classic/settings/Set-Notifications.md rename to docs/articles/expensify-classic/settings/Email-Notifications.md index da55dafb833c..ec87aac95229 100644 --- a/docs/articles/expensify-classic/settings/Set-Notifications.md +++ b/docs/articles/expensify-classic/settings/Email-Notifications.md @@ -1,10 +1,9 @@ --- -title: Set notifications -description: This article is about how to troubleshoot notifications from Expensify. +title: Expensify Email notifications +description: Troubleshooting steps for receiving emails and notifications from Expensify. --- -# Overview -Sometimes members may have trouble receiving important email notifications from Expensify, such as Expensify Magic Code emails, account validation emails, secondary login validations, integration emails, or report action notifications (rejections, approvals, etc.). +Occasionally, members may have trouble receiving email notifications from Expensify, such as Expensify Magic Code emails, account validation emails, secondary login validations, integration emails, or report action notifications. # Troubleshooting missing Expensify notifications @@ -12,17 +11,17 @@ Sometimes members may have trouble receiving important email notifications from Emails can sometimes be delayed and could take up to 30-60 minutes to arrive in your inbox. If you're expecting a notification that still hasn't arrived after waiting: - Check your **Email Preferences** on the web via **Settings > Account > Preferences**. In the **Contact Preferences** section, ensure that the relevant boxes are checked for the email type you're missing. - Check your email spam and trash folders, as Expensify messages might end up there inadvertently. - - Check to make sure you haven't unintentionally blocked Expensify emails. Allowlist the domain expensify.com with your email provider. + - Check to make sure you haven't unintentionally blocked Expensify emails. allowlist the domain expensify.com with your email provider. ## Issue: A banner that says “We’re having trouble emailing you” shows the top of your screen. -Confirm the email address on your Expensify account is a deliverable email address, and then click the link in the banner that says "here". If successful, you will see a confirmation that your email was unblocked. +Confirm that the email address on your Expensify account is deliverable, and then click the link in the banner that says "here." If successful, you will see a confirmation that your email was unblocked. ![ExpensifyHelp_EmailError]({{site.url}}/assets/images/ExpensifyHelp_EmailError.png){:width="100%"} **If unsuccessful, you will see another error:** - If the new error or SMTP message includes a URL, navigate to that URL for further instructions. - If the new error or SMTP message includes "mimecast.com", consult with your company's IT team. - - If the new error or SMTP message includes "blacklist", it means your company has configured their email servers to use a third-party email reputation or blocklisting service. Consult with your company's IT team. + - If the new error or SMTP message includes "blacklist," it means your company has configured its email servers to use a third-party email reputation or blocklisting service. Consult with your company's IT team. ![ExpensifyHelp_SMTPError]({{site.url}}/assets/images/ExpensifyHelp_SMTPError.png){:width="100%"} @@ -31,21 +30,24 @@ Confirm the email address on your Expensify account is a deliverable email addre If you are still not receiving Expensify notifications and have an email address on a public domain such as gmail.com or yahoo.com, you may need to add Expensify's domain expensify.com to your email's allowlist by taking the following steps: - Search for messages from expensify.com in your spam folder, open them, and click “Not Spam” at the top of each message. - - Configure an email filter that identifies Expensify's email domain expensify.com and directs all incoming messages to your inbox, to avoid messages going to spam. - - Add specific known Expensify email addresses such as concierge@expensify.com to your email contacts list. + Configure an email filter that identifies Expensify's email domain as expensify.com and directs all incoming messages to your inbox to prevent messages from going to spam. + - Add specific known Expensify email addresses, such as concierge@expensify.com, to your email contacts list. # Further troubleshooting for private domains If your organization uses a private domain, Expensify emails may be blocked at the server level. This can sometimes happen unexpectedly due to broader changes in email provider's handling or filtering of incoming messages. Consult your internal IT team to assist with the following: - - Ensure that the domain expensify.com is allowlisted on domain email servers. This domains is the sources of various notification emails, so it's important it is allowlisted. - - Confirm there is no server-level email blocking and that spam filters are not blocking Expensify emails. Even if you have received messages from our Concierge support in the past, ensure that expensify.com is allowlisted. + - Ensure that the domain expensify.com is allowlisted on the domain email servers. This domain is the source of various notification emails, so it's important it's recognized by your company's servers. + - Confirm there is no server-level email blocking + - Make sure spam filters are not blocking Expensify emails. + +Even if you have received messages from our Concierge support in the past, ensure that expensify.com is allowlisted. ## Companies using Outlook - Add Expensify to your personal Safe Senders list by following these steps: [Outlook email client](https://support.microsoft.com/en-us/office/add-recipients-of-my-email-messages-to-the-safe-senders-list-be1baea0-beab-4a30-b968-9004332336ce) / [Outlook.com](https://support.microsoft.com/en-us/office/safe-senders-in-outlook-com-470d4ee6-e3b6-402b-8cd9-a6f00eda7339) - **Company IT administrators:** Add Expensify to your domain's Safe Sender list by following the steps here: [Create safe sender lists in EOP](https://learn.microsoft.com/en-us/defender-office-365/create-safe-sender-lists-in-office-365) -- **Company IT administrators:** Add expensify.com to the domain's explicit allowlist. You may need to contact Outlook support for specific instructions, as each company's setup varies. +**Company IT administrators:** Add expensify.com to the domain's explicit allowlist. As each company's setup varies, you may need to contact Outlook support for specific instructions. - **Company administrators:** Contact Outlook support to see if there are additional steps to take based on your domain's email configuration. ## Companies using Google Workspaces: @@ -60,10 +62,10 @@ Expensify's emails are SPF and DKIM-signed, meaning they are cryptographically s ## Why do legitimate emails from Expensify sometimes end up marked as spam? -The problem typically arises when our domain or one of our sending IP addresses gets erroneously flagged by a 3rd party domain or IP reputation services. Many IT departments use lists published by such services to filter email for the entire company. +The problem typically arises when a third-party domain or IP reputation service erroneously flags our domain or one of our sending IP addresses. Many IT departments use lists published by such services to filter email for the entire company. ## What is the best way to ensure emails are not accidentally marked as Spam? -For server-level spam detection, the safest approach to allowlisting email from Expensify is to verify DKIM and SPF, rather than solely relying on the third-party reputation of the sending IP address. +For server-level spam detection, the safest approach to allow emails from Expensify is to verify DKIM and SPF, rather than solely relying on the third-party reputation of the sending IP address. {% include faq-end.md %} diff --git a/docs/articles/new-expensify/billing-and-subscriptions/Billing-Overview.md b/docs/articles/new-expensify/billing-and-subscriptions/Billing-Overview.md new file mode 100644 index 000000000000..3a1193857d42 --- /dev/null +++ b/docs/articles/new-expensify/billing-and-subscriptions/Billing-Overview.md @@ -0,0 +1,48 @@ +--- +title: Billing and Subscriptions +description: Billing Page Overview +--- + +# Expensify Billing Overview + +At the beginning of each month, the Billing Owner for the workspace will be billed for the previous month’s activity. +Your Expensify bill is determined by: +- The number of active members in your workspace +- Whether you have a Collect or Control plan +- Whether you’re on pay-per-use or an annual subscription +- Whether you’re using the Expensify Visa® Commercial Card + +An active member is anyone who creates, submits, approves, reimburses, or exports a report in Expensify in any given month. This includes Copilots and automatic actions by Concierge. + +Your billing receipts can be viewed under **Settings** > **Account** > **Payments** > **Billing History**. We recommend appointing a single billing owner for each Group Workspace. + +# Save Money on Your Expensify Bill + +## Annual Subscription + Expensify Card + +Save the most money on Expensify by pairing an annual subscription with the Expensify Visa® Commercial Card. Then, if at least 50% of your total settled US spend in a given month is on the Expensify Card, you’ll pay the best possible price for Expensify: + +- **Collect Plan:** $5 per active member per month +- **Control Plan:** $9 per active member per month + +**You also get cash back!** Earn 1% cash back on all Expensify Card purchases or 2% if card spending reaches $250,000 or more monthly (for U.S. purchases only). Cash back first applies to your Expensify bill, with any remainder deposited directly into your bank account. + +Use Expensify’s [savings calculator](https://use.expensify.com/resource-center/tools/savings-calculator) to see your potential savings with the Expensify Card. + +## Annual Subscription vs Pay-per-use + +**Annual Subscription** + +You get a 50% discount with an annual subscription: + +- **Collect Plan:** $10 per active member per month +- **Control Plan:** $18 per active member per month + +If your active members exceed your subscription size, additional members are billed at the pay-per-use rate for that month. You can increase your subscription size at any time (extending your annual term) but can only reduce it once your current subscription period ends. + +**Pay-per-use** + +Rates for pay-per-use plans are applied at full price: + +- **Collect plan:** $20 per active member per month +- **Control plan:** $36 per active member per month diff --git a/docs/articles/new-expensify/billing-and-subscriptions/Billing-page.md b/docs/articles/new-expensify/billing-and-subscriptions/Billing-page.md deleted file mode 100644 index f945840d65da..000000000000 --- a/docs/articles/new-expensify/billing-and-subscriptions/Billing-page.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Billing and Subscriptions -description: An overview of how billing works in Expensify. ---- - -# Coming Soon diff --git a/docs/articles/new-expensify/connections/quickbooks-online/Configure-Quickbooks-Online.md b/docs/articles/new-expensify/connections/quickbooks-online/Configure-Quickbooks-Online.md index 73e3340d41a2..19e30196e023 100644 --- a/docs/articles/new-expensify/connections/quickbooks-online/Configure-Quickbooks-Online.md +++ b/docs/articles/new-expensify/connections/quickbooks-online/Configure-Quickbooks-Online.md @@ -1,5 +1,5 @@ --- -title: Configure Quickbooks Online +title: Configure QuickBooks Online description: Configure your QuickBooks Online connection with Expensify --- diff --git a/docs/articles/new-expensify/connections/quickbooks-online/Quickbooks-Online-Troubleshooting.md b/docs/articles/new-expensify/connections/quickbooks-online/Quickbooks-Online-Troubleshooting.md index ff1b9bfab9fb..497c618442b1 100644 --- a/docs/articles/new-expensify/connections/quickbooks-online/Quickbooks-Online-Troubleshooting.md +++ b/docs/articles/new-expensify/connections/quickbooks-online/Quickbooks-Online-Troubleshooting.md @@ -1,5 +1,5 @@ --- -title: Quickbooks Online Troubleshooting +title: QuickBooks Online Troubleshooting description: A list of common QuickBooks Online errors and how to resolve them --- diff --git a/docs/articles/new-expensify/expenses-&-payments/Create-an-expense.md b/docs/articles/new-expensify/expenses-&-payments/Create-an-expense.md index 2ae14e822a12..ea058df9c1b1 100644 --- a/docs/articles/new-expensify/expenses-&-payments/Create-an-expense.md +++ b/docs/articles/new-expensify/expenses-&-payments/Create-an-expense.md @@ -168,6 +168,24 @@ Yes, you can edit an expense until it is paid. When an expense is submitted, the In Expensify, expense reports group expenses in a batch to be paid or reconciled. When a draft report is open, all new expenses are added to it. Once a report is submitted, you can track the status from the **Search** section. Click the **View** button for a specific expense or expense report. The status is displayed at the top of the expense or report. + +**How can I enable camera permission for a website on mobile browsers?** + +**Google Chrome:** +1. Open Chrome. +2. To the right of the address bar, tap More icon > **Settings**. +3. Tap **Site settings** > **Camera**. +4. Tap to turn the microphone or camera on or off. + - If you find the site you want to use under **Blocked**, tap the site > **Allow**. +5. Refresh the site. + +**Safari:** +1. Open Safari. +2. To the left of the address bar, tap More icon > **Site settings** > **Camera**. +3. Tap **Allow** to grant permission. +4. Tap **Done**. +5. Refresh the site. + {% include faq-end.md %} diff --git a/docs/assets/images/ExpensifyHelp-Postman-Request-data.png b/docs/assets/images/ExpensifyHelp-Postman-Request-data.png new file mode 100644 index 000000000000..f8dec44a101d Binary files /dev/null and b/docs/assets/images/ExpensifyHelp-Postman-Request-data.png differ diff --git a/docs/assets/images/ExpensifyHelp-Postman-Successful-dryrun-response.png b/docs/assets/images/ExpensifyHelp-Postman-Successful-dryrun-response.png new file mode 100644 index 000000000000..484c7b0d9e33 Binary files /dev/null and b/docs/assets/images/ExpensifyHelp-Postman-Successful-dryrun-response.png differ diff --git a/docs/assets/images/ExpensifyHelp-Postman-userID-userSecret-request.png b/docs/assets/images/ExpensifyHelp-Postman-userID-userSecret-request.png new file mode 100644 index 000000000000..e5dfe89d7eb8 Binary files /dev/null and b/docs/assets/images/ExpensifyHelp-Postman-userID-userSecret-request.png differ diff --git a/docs/assets/images/search-download.png b/docs/assets/images/search-download.png new file mode 100644 index 000000000000..eb8591dea110 Binary files /dev/null and b/docs/assets/images/search-download.png differ diff --git a/docs/redirects.csv b/docs/redirects.csv index e1c0e12eb070..ca73543098d2 100644 --- a/docs/redirects.csv +++ b/docs/redirects.csv @@ -591,6 +591,8 @@ https://help.expensify.com/articles/expensify-classic/articles/expensify-classic https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/payments/Pay-Bills,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/payments/Create-and-Pay-Bills https://help.expensify.com/articles/new-expensify/billing-and-subscriptions/add-a-payment-card-and-view-your-subscription,https://help.expensify.com/articles/new-expensify/billing-and-subscriptions/Add-a-payment-card-and-view-your-subscription https://help.expensify.com/articles/new-expensify/billing-and-subscriptions/Billing-page-coming-soon,https://help.expensify.com/articles/new-expensify/billing-and-subscriptions/Billing-page +https://help.expensify.com/articles/new-expensify/billing-and-subscriptions/Billing-page,https://help.expensify.com/articles/new-expensify/billing-and-subscriptions/Billing-Overview +https://help.expensify.com/articles/expensify-classic/expenses/Expense-Rules,https://help.expensify.com/articles/expensify-classic/expenses/Create-Expense-Rules https://help.expensify.com/articles/expensify-classic/expenses/The-Expenses-Page,https://help.expensify.com/articles/expensify-classic/expenses/Navigate-the-Expenses-Page https://help.expensify.com/articles/expensify-classic/expenses/Add-expenses-in-bulk,https://help.expensify.com/articles/expensify-classic/expenses/Add-an-expense https://help.expensify.com/articles/expensify-classic/expenses/Track-group-expenses,https://help.expensify.com/articles/expensify-classic/expenses/Add-an-expense @@ -604,3 +606,4 @@ https://help.expensify.com/articles/expensify-classic/spending-insights/Default- https://help.expensify.com/articles/expensify-classic/spending-insights/Other-Export-Options,https://help.expensify.com/articles/expensify-classic/spending-insights/Export-Expenses-And-Reports/ https://help.expensify.com/articles/expensify-classic/travel/Edit-or-cancel-travel-arrangements,https://help.expensify.com/articles/expensify-classic/travel/Book-with-Expensify-Travel https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/payments/Create-and-Pay-Bills,https://help.expensify.com/articles/expensify-classic/bank-accounts-and-payments/payments/Receive-and-Pay-Bills +https://help.expensify.com/articles/expensify-classic/settings/Set-Notifications,https://help.expensify.com/articles/expensify-classic/settings/Email-Notifications diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 54084367040c..20c85f494c80 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -86,6 +86,22 @@ platform :android do setGradleOutputsInEnv() end + desc "Generate AdHoc HybridApp apk" + lane :build_adhoc_hybrid do + ENV["ENVFILE"]="../.env.adhoc.hybridapp" + gradle( + project_dir: '../Android', + task: 'assembleAdhoc', + properties: { + "android.injected.signing.store.file" => './upload-key.keystore', + "android.injected.signing.store.password" => ENV["ANDROID_UPLOAD_KEYSTORE_PASSWORD"], + "android.injected.signing.key.alias" => ENV["ANDROID_UPLOAD_KEYSTORE_ALIAS"], + "android.injected.signing.key.password" => ENV["ANDROID_UPLOAD_KEY_PASSWORD"], + } + ) + setGradleOutputsInEnv() + end + desc "Generate a new local APK" lane :build_local do ENV["ENVFILE"]=".env.production" @@ -373,6 +389,10 @@ platform :ios do path: "./OldApp_AppStore_Share_Extension.mobileprovision" ) + install_provisioning_profile( + path: "./OldApp_AppStore_Notification_Service.mobileprovision" + ) + build_app( workspace: "../iOS/Expensify.xcworkspace", scheme: "Expensify", @@ -382,7 +402,8 @@ platform :ios do manageAppVersionAndBuildNumber: false, provisioningProfiles: { "com.expensify.expensifylite" => "(OldApp) AppStore", - "com.expensify.expensifylite.SmartScanExtension" => "(OldApp) AppStore: Share Extension" + "com.expensify.expensifylite.SmartScanExtension" => "(OldApp) AppStore: Share Extension", + "com.expensify.expensifylite.NotificationServiceExtension" => "(OldApp) AppStore: Notification Service", } } ) diff --git a/help/map.md b/help/map.md index eb218e67dcc0..73940652ff22 100644 --- a/help/map.md +++ b/help/map.md @@ -254,8 +254,8 @@ Lost in the app? Let this map guide you! * Delete * Accounting * Connections list - * Quickbooks Online Connect - * Quickbooks Desktop Connect + * QuickBooks Online Connect + * QuickBooks Desktop Connect * Xero * NetSuite * Sage Intacct diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 45fe3eb36805..368b6b05117b 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -19,7 +19,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 9.0.66 + 9.0.72 CFBundleSignature ???? CFBundleURLTypes @@ -40,7 +40,7 @@ CFBundleVersion - 9.0.66.7 + 9.0.72.0 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 05f70824981c..13fe4a5f4783 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 9.0.66 + 9.0.72 CFBundleSignature ???? CFBundleVersion - 9.0.66.7 + 9.0.72.0 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index eb799cfd6323..55181724d308 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -11,9 +11,9 @@ CFBundleName $(PRODUCT_NAME) CFBundleShortVersionString - 9.0.66 + 9.0.72 CFBundleVersion - 9.0.66.7 + 9.0.72.0 NSExtension NSExtensionPointIdentifier diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 21633b432c12..c8e92768eb9a 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1766,7 +1766,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - react-native-pager-view (6.5.0): + - react-native-pager-view (6.5.1): - DoubleConversion - glog - hermes-engine @@ -1779,7 +1779,7 @@ PODS: - React-featureflags - React-graphics - React-ImageManager - - react-native-pager-view/common (= 6.5.0) + - react-native-pager-view/common (= 6.5.1) - React-NativeModulesApple - React-RCTFabric - React-rendererdebug @@ -1788,7 +1788,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - react-native-pager-view/common (6.5.0): + - react-native-pager-view/common (6.5.1): - DoubleConversion - glog - hermes-engine @@ -2266,7 +2266,7 @@ PODS: - React-utils (= 0.75.2) - RNAppleAuthentication (2.2.2): - React-Core - - RNCClipboard (1.14.0): + - RNCClipboard (1.15.0): - DoubleConversion - glog - hermes-engine @@ -2503,7 +2503,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNReanimated (3.16.1): + - RNReanimated (3.16.3): - DoubleConversion - glog - hermes-engine @@ -2523,10 +2523,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated (= 3.16.1) - - RNReanimated/worklets (= 3.16.1) + - RNReanimated/reanimated (= 3.16.3) + - RNReanimated/worklets (= 3.16.3) - Yoga - - RNReanimated/reanimated (3.16.1): + - RNReanimated/reanimated (3.16.3): - DoubleConversion - glog - hermes-engine @@ -2546,9 +2546,9 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated/apple (= 3.16.1) + - RNReanimated/reanimated/apple (= 3.16.3) - Yoga - - RNReanimated/reanimated/apple (3.16.1): + - RNReanimated/reanimated/apple (3.16.3): - DoubleConversion - glog - hermes-engine @@ -2569,7 +2569,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNReanimated/worklets (3.16.1): + - RNReanimated/worklets (3.16.3): - DoubleConversion - glog - hermes-engine @@ -2717,27 +2717,12 @@ PODS: - SDWebImage/Core (~> 5.17) - SocketRocket (0.7.0) - Turf (2.8.0) - - VisionCamera (4.0.0-beta.13): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety + - VisionCamera (4.6.1): + - VisionCamera/Core (= 4.6.1) + - VisionCamera/React (= 4.6.1) + - VisionCamera/Core (4.6.1) + - VisionCamera/React (4.6.1): - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - Yoga (0.0.0) DEPENDENCIES: @@ -3239,7 +3224,7 @@ SPEC CHECKSUMS: react-native-keyboard-controller: 97bb7b48fa427c7455afdc8870c2978efd9bfa3a react-native-launch-arguments: 5f41e0abf88a15e3c5309b8875d6fd5ac43df49d react-native-netinfo: fb5112b1fa754975485884ae85a3fb6a684f49d5 - react-native-pager-view: c64a744211a46202619a77509f802765d1659dba + react-native-pager-view: abc5ef92699233eb726442c7f452cac82f73d0cb react-native-pdf: dd6ae39a93607a80919bef9f3499e840c693989d react-native-performance: 3c608307be10964f8a97d3af462f37125b6d8fa5 react-native-plaid-link-sdk: f91a22b45b7c3d4cd6c47273200dc57df35068b0 @@ -3275,7 +3260,7 @@ SPEC CHECKSUMS: ReactCodegen: 60973d382704c793c605b9be0fc7f31cb279442f ReactCommon: 6ef348087d250257c44c0204461c03f036650e9b RNAppleAuthentication: 0571c08da8c327ae2afc0261b48b4a515b0286a6 - RNCClipboard: c84275d07e3f73ff296b17e6c27e9ccdc194a0bb + RNCClipboard: 8212ca9e8370d0e23bfb7f5a591380da5a63456d RNCPicker: 21ae0659666767a5c1253aef985ee5b7c527e345 RNDeviceInfo: 130237d8e97a89b68f2202d5dd18ac6bb68e7648 RNFBAnalytics: f76bfa164ac235b00505deb9fc1776634056898c @@ -3291,7 +3276,7 @@ SPEC CHECKSUMS: rnmapbox-maps: 460d6ff97ae49c7d5708c3212c6521697c36a0c4 RNPermissions: 0b1429b55af59d1d08b75a8be2459f65a8ac3f28 RNReactNativeHapticFeedback: 73756a3477a5a622fa16862a3ab0d0fc5e5edff5 - RNReanimated: 2d728bad3a69119be89c3431ee0ccda026ecffdc + RNReanimated: 03ba2447d5a7789e2843df2ee05108d93b6441d6 RNScreens: de6e57426ba0e6cbc3fb5b4f496e7f08cb2773c2 RNShare: bd4fe9b95d1ee89a200778cc0753ebe650154bb0 RNSound: 6c156f925295bdc83e8e422e7d8b38d33bc71852 @@ -3302,7 +3287,7 @@ SPEC CHECKSUMS: SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d Turf: aa2ede4298009639d10db36aba1a7ebaad072a5e - VisionCamera: c6c8aa4b028501fc87644550fbc35a537d4da3fb + VisionCamera: c95a8ad535f527562be1fb05fb2fd324578e769c Yoga: a1d7895431387402a674fd0d1c04ec85e87909b8 PODFILE CHECKSUM: 15e2f095b9c80d658459723edf84005a6867debf diff --git a/package-lock.json b/package-lock.json index 8749de85e87f..eac11f379ce9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "9.0.66-7", + "version": "9.0.72-0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "9.0.66-7", + "version": "9.0.72-0", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -26,7 +26,7 @@ "@invertase/react-native-apple-authentication": "^2.2.2", "@onfido/react-native-sdk": "10.6.0", "@react-native-camera-roll/camera-roll": "7.4.0", - "@react-native-clipboard/clipboard": "^1.13.2", + "@react-native-clipboard/clipboard": "^1.15.0", "@react-native-community/geolocation": "3.3.0", "@react-native-community/netinfo": "11.2.1", "@react-native-firebase/analytics": "^12.3.0", @@ -73,7 +73,7 @@ "react-content-loader": "^7.0.0", "react-dom": "18.3.1", "react-error-boundary": "^4.0.11", - "react-fast-pdf": "1.0.15", + "react-fast-pdf": "1.0.20", "react-map-gl": "^7.1.3", "react-native": "0.75.2", "react-native-android-location-enabler": "^2.0.1", @@ -95,8 +95,8 @@ "react-native-launch-arguments": "^4.0.2", "react-native-localize": "^2.2.6", "react-native-modal": "^13.0.0", - "react-native-onyx": "2.0.81", - "react-native-pager-view": "6.5.0", + "react-native-onyx": "2.0.82", + "react-native-pager-view": "6.5.1", "react-native-pdf": "6.7.3", "react-native-performance": "^5.1.0", "react-native-permissions": "^3.10.0", @@ -104,7 +104,7 @@ "react-native-plaid-link-sdk": "11.11.0", "react-native-qrcode-svg": "6.3.11", "react-native-quick-sqlite": "git+https://github.com/margelo/react-native-nitro-sqlite#99f34ebefa91698945f3ed26622e002bd79489e0", - "react-native-reanimated": "3.16.1", + "react-native-reanimated": "3.16.3", "react-native-release-profiler": "^0.2.1", "react-native-render-html": "6.3.1", "react-native-safe-area-context": "4.10.9", @@ -115,7 +115,7 @@ "react-native-tab-view": "^3.5.2", "react-native-url-polyfill": "^2.0.0", "react-native-view-shot": "3.8.0", - "react-native-vision-camera": "4.0.0-beta.13", + "react-native-vision-camera": "^4.6.1", "react-native-web": "0.19.13", "react-native-webview": "13.8.6", "react-plaid-link": "3.3.2", @@ -396,135 +396,6 @@ "node": ">=6.0.0" } }, - "node_modules/@azure/abort-controller": { - "version": "2.1.2", - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-auth": { - "version": "1.7.2", - "license": "MIT", - "peer": true, - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-util": "^1.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-rest-pipeline": { - "version": "1.10.1", - "license": "MIT", - "peer": true, - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.4.0", - "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.0.0", - "@azure/logger": "^1.0.0", - "form-data": "^4.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "tslib": "^2.2.0", - "uuid": "^8.3.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/core-rest-pipeline/node_modules/@azure/abort-controller": { - "version": "1.1.0", - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@azure/core-rest-pipeline/node_modules/form-data": { - "version": "4.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@azure/core-tracing": { - "version": "1.1.2", - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-util": { - "version": "1.2.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/core-util/node_modules/@azure/abort-controller": { - "version": "1.1.0", - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@azure/logger": { - "version": "1.1.2", - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/opentelemetry-instrumentation-azure-sdk": { - "version": "1.0.0-beta.5", - "license": "MIT", - "peer": true, - "dependencies": { - "@azure/core-tracing": "^1.0.0", - "@azure/logger": "^1.0.0", - "@opentelemetry/api": "^1.4.1", - "@opentelemetry/core": "^1.15.2", - "@opentelemetry/instrumentation": "^0.41.2", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.24.7", "license": "MIT", @@ -4148,26 +4019,6 @@ "node": ">= 4.0.0" } }, - "node_modules/@expo/cli/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@expo/code-signing-certificates": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", @@ -6942,11 +6793,6 @@ "react": ">=16" } }, - "node_modules/@microsoft/applicationinsights-web-snippet": { - "version": "1.1.2", - "license": "MIT", - "peer": true - }, "node_modules/@native-html/css-processor": { "version": "1.11.0", "license": "MIT", @@ -7239,85 +7085,6 @@ "react-native": ">=0.70.0 <1.0.x" } }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/core": { - "version": "1.25.1", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.41.2", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/shimmer": "^1.0.2", - "import-in-the-middle": "1.4.2", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.1", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@peggyjs/from-mem": { "version": "1.3.0", "dev": true, @@ -7825,13 +7592,26 @@ } }, "node_modules/@react-native-clipboard/clipboard": { - "version": "1.14.0", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@react-native-clipboard/clipboard/-/clipboard-1.15.0.tgz", + "integrity": "sha512-YDMC3E956jn9zE11uKGcQDKS1SO9q72iNHxZyrKY5y9XYwZcA9vo3Xk74+zRnf7cM48drDO0s9lyAPUlOvyhrw==", "license": "MIT", + "workspaces": [ + "example" + ], "peerDependencies": { - "react": "18.2.0", - "react-native": "^0.73.0", - "react-native-macos": "^0.73.0", - "react-native-windows": "^0.73.0" + "react": ">= 16.9.0", + "react-native": ">= 0.61.5", + "react-native-macos": ">= 0.61.0", + "react-native-windows": ">= 0.61.0" + }, + "peerDependenciesMeta": { + "react-native-macos": { + "optional": true + }, + "react-native-windows": { + "optional": true + } } }, "node_modules/@react-native-community/cli": { @@ -8105,9 +7885,10 @@ } }, "node_modules/@react-native-community/cli-debugger-ui": { - "version": "12.3.6", + "version": "14.0.0-alpha.11", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-14.0.0-alpha.11.tgz", + "integrity": "sha512-0wCNQxhCniyjyMXgR1qXliY180y/2QbvoiYpp2MleGQADr5M1b8lgI4GoyADh5kE+kX3VL0ssjgyxpmbpCD86A==", "license": "MIT", - "peer": true, "dependencies": { "serve-static": "^1.13.1" } @@ -8448,31 +8229,28 @@ "@react-native-community/cli-platform-apple": "14.0.0" } }, - "node_modules/@react-native-community/cli-plugin-metro": { - "version": "12.3.6", - "license": "MIT", - "peer": true - }, "node_modules/@react-native-community/cli-server-api": { - "version": "12.3.6", + "version": "14.0.0-alpha.11", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-14.0.0-alpha.11.tgz", + "integrity": "sha512-I7YeYI7S5wSxnQAqeG8LNqhT99FojiGIk87DU0vTp6U8hIMLcA90fUuBAyJY38AuQZ12ZJpGa8ObkhIhWzGkvg==", "license": "MIT", - "peer": true, "dependencies": { - "@react-native-community/cli-debugger-ui": "12.3.6", - "@react-native-community/cli-tools": "12.3.6", + "@react-native-community/cli-debugger-ui": "14.0.0-alpha.11", + "@react-native-community/cli-tools": "14.0.0-alpha.11", "compression": "^1.7.1", "connect": "^3.6.5", "errorhandler": "^1.5.1", "nocache": "^3.0.1", "pretty-format": "^26.6.2", "serve-static": "^1.13.1", - "ws": "^7.5.1" + "ws": "^6.2.3" } }, "node_modules/@react-native-community/cli-server-api/node_modules/@jest/types": { "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -8486,24 +8264,27 @@ }, "node_modules/@react-native-community/cli-server-api/node_modules/@types/yargs": { "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", "license": "MIT", - "peer": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@react-native-community/cli-server-api/node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } }, "node_modules/@react-native-community/cli-server-api/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8516,8 +8297,9 @@ }, "node_modules/@react-native-community/cli-server-api/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8531,8 +8313,9 @@ }, "node_modules/@react-native-community/cli-server-api/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -8542,21 +8325,24 @@ }, "node_modules/@react-native-community/cli-server-api/node_modules/color-name": { "version": "1.1.4", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, "node_modules/@react-native-community/cli-server-api/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } }, "node_modules/@react-native-community/cli-server-api/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==", "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", @@ -8569,13 +8355,15 @@ }, "node_modules/@react-native-community/cli-server-api/node_modules/react-is": { "version": "17.0.2", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" }, "node_modules/@react-native-community/cli-server-api/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8583,37 +8371,17 @@ "node": ">=8" } }, - "node_modules/@react-native-community/cli-server-api/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "peer": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@react-native-community/cli-tools": { - "version": "12.3.6", + "version": "14.0.0-alpha.11", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-14.0.0-alpha.11.tgz", + "integrity": "sha512-HQCfVnX9aqRdKdLxmQy4fUAUo+YhNGlBV7ZjOayPbuEGWJ4RN+vSy0Cawk7epo7hXd6vKzc7P7y3HlU6Kxs7+w==", "license": "MIT", - "peer": true, "dependencies": { "appdirsjs": "^1.2.4", "chalk": "^4.1.2", + "execa": "^5.0.0", "find-up": "^5.0.0", "mime": "^2.4.1", - "node-fetch": "^2.6.0", "open": "^6.2.0", "ora": "^5.4.1", "semver": "^7.5.2", @@ -8623,8 +8391,9 @@ }, "node_modules/@react-native-community/cli-tools/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8637,8 +8406,9 @@ }, "node_modules/@react-native-community/cli-tools/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8652,8 +8422,9 @@ }, "node_modules/@react-native-community/cli-tools/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -8663,29 +8434,33 @@ }, "node_modules/@react-native-community/cli-tools/node_modules/color-name": { "version": "1.1.4", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, "node_modules/@react-native-community/cli-tools/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } }, "node_modules/@react-native-community/cli-tools/node_modules/is-wsl": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, "node_modules/@react-native-community/cli-tools/node_modules/open": { "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", "license": "MIT", - "peer": true, "dependencies": { "is-wsl": "^1.1.0" }, @@ -8695,8 +8470,9 @@ }, "node_modules/@react-native-community/cli-tools/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8902,26 +8678,6 @@ "node": ">= 4.0.0" } }, - "node_modules/@react-native-community/cli/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@react-native-community/eslint-config": { "version": "3.2.0", "dev": true, @@ -9224,67 +8980,194 @@ } } }, - "node_modules/@react-native-mac/virtualized-lists": { - "version": "0.73.3", + "node_modules/@react-native-picker/picker": { + "version": "2.7.6", "license": "MIT", - "peer": true, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/@react-native/assets-registry": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.75.2.tgz", + "integrity": "sha512-P1dLHjpUeC0AIkDHRYcx0qLMr+p92IPWL3pmczzo6T76Qa9XzruQOYy0jittxyBK91Csn6HHQ/eit8TeXW8MVw==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/babel-plugin-codegen": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.75.2.tgz", + "integrity": "sha512-BIKVh2ZJPkzluUGgCNgpoh6NTHgX8j04FCS0Z/rTmRJ66hir/EUBl8frMFKrOy/6i4VvZEltOWB5eWfHe1AYgw==", "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" + "@react-native/codegen": "0.75.2" }, "engines": { "node": ">=18" - }, - "peerDependencies": { - "react-native": "*" } }, - "node_modules/@react-native-picker/picker": { - "version": "2.7.6", - "license": "MIT", + "node_modules/@react-native/babel-preset": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.75.2.tgz", + "integrity": "sha512-mprpsas+WdCEMjQZnbDiAC4KKRmmLbMB+o/v4mDqKlH4Mcm7RdtP5t80MZGOVCHlceNp1uEIpXywx69DNwgbgg==", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.18.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.20.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.20.0", + "@babel/plugin-transform-flow-strip-types": "^7.20.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.5", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.5", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.20.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "@react-native/babel-plugin-codegen": "0.75.2", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">=18" + }, "peerDependencies": { - "react": "*", - "react-native": "*" + "@babel/core": "*" } }, - "node_modules/@react-native-windows/cli": { - "version": "0.73.2", - "license": "MIT", - "peer": true, + "node_modules/@react-native/codegen": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.75.2.tgz", + "integrity": "sha512-OkWdbtO2jTkfOXfj3ibIL27rM6LoaEuApOByU2G8X+HS6v9U87uJVJlMIRWBDmnxODzazuHwNVA2/wAmSbucaw==", "dependencies": { - "@react-native-windows/codegen": "0.73.0", - "@react-native-windows/fs": "0.73.0", - "@react-native-windows/package-utils": "0.73.0", - "@react-native-windows/telemetry": "0.73.1", - "@xmldom/xmldom": "^0.7.7", - "chalk": "^4.1.0", - "cli-spinners": "^2.2.0", - "envinfo": "^7.5.0", - "find-up": "^4.1.0", + "@babel/parser": "^7.20.0", "glob": "^7.1.1", - "lodash": "^4.17.15", - "mustache": "^4.0.1", - "ora": "^3.4.0", - "prompts": "^2.4.1", - "semver": "^7.3.2", - "shelljs": "^0.8.4", - "username": "^5.1.0", - "uuid": "^3.3.2", - "xml-formatter": "^2.4.0", - "xml-parser": "^1.2.1", - "xpath": "^0.0.27" + "hermes-parser": "0.22.0", + "invariant": "^2.2.4", + "jscodeshift": "^0.14.0", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" }, "engines": { - "node": ">= 18" + "node": ">=18" }, "peerDependencies": { - "react-native": "*" + "@babel/preset-env": "^7.1.6" + } + }, + "node_modules/@react-native/codegen/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@react-native/community-cli-plugin": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.75.2.tgz", + "integrity": "sha512-/tz0bzVja4FU0aAimzzQ7iYR43peaD6pzksArdrrGhlm8OvFYAQPOYSNeIQVMSarwnkNeg1naFKaeYf1o3++yA==", + "dependencies": { + "@react-native-community/cli-server-api": "14.0.0-alpha.11", + "@react-native-community/cli-tools": "14.0.0-alpha.11", + "@react-native/dev-middleware": "0.75.2", + "@react-native/metro-babel-transformer": "0.75.2", + "chalk": "^4.0.0", + "execa": "^5.1.1", + "metro": "^0.80.3", + "metro-config": "^0.80.3", + "metro-core": "^0.80.3", + "node-fetch": "^2.2.0", + "querystring": "^0.2.1", + "readline": "^1.3.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-frontend": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.75.2.tgz", + "integrity": "sha512-qIC6mrlG8RQOPaYLZQiJwqnPchAVGnHWcVDeQxPMPLkM/D5+PC8tuKWYOwgLcEau3RZlgz7QQNk31Qj2/OJG6Q==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.75.2.tgz", + "integrity": "sha512-fTC5m2uVjYp1XPaIJBFgscnQjPdGVsl96z/RfLgXDq0HBffyqbg29ttx6yTCx7lIa9Gdvf6nKQom+e+Oa4izSw==", + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.75.2", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^0.2.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "node-fetch": "^2.2.0", + "nullthrows": "^1.1.1", + "open": "^7.0.3", + "selfsigned": "^2.4.1", + "serve-static": "^1.13.1", + "ws": "^6.2.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native-windows/cli/node_modules/ansi-styles": { + "node_modules/@react-native/community-cli-plugin/node_modules/ansi-styles": { "version": "4.3.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, @@ -9295,10 +9178,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@react-native-windows/cli/node_modules/chalk": { + "node_modules/@react-native/community-cli-plugin/node_modules/chalk": { "version": "4.1.2", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9310,21 +9193,23 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@react-native-windows/cli/node_modules/cli-cursor": { - "version": "2.1.0", - "license": "MIT", - "peer": true, + "node_modules/@react-native/community-cli-plugin/node_modules/chromium-edge-launcher": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", + "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0", + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" } }, - "node_modules/@react-native-windows/cli/node_modules/color-convert": { + "node_modules/@react-native/community-cli-plugin/node_modules/color-convert": { "version": "2.0.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { "color-name": "~1.1.4" }, @@ -9332,827 +9217,935 @@ "node": ">=7.0.0" } }, - "node_modules/@react-native-windows/cli/node_modules/color-name": { + "node_modules/@react-native/community-cli-plugin/node_modules/color-name": { "version": "1.1.4", - "license": "MIT", - "peer": true - }, - "node_modules/@react-native-windows/cli/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.0" - } + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/@react-native-windows/cli/node_modules/find-up": { - "version": "4.1.0", - "license": "MIT", - "peer": true, + "node_modules/@react-native/community-cli-plugin/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" + "ms": "2.0.0" } }, - "node_modules/@react-native-windows/cli/node_modules/has-flag": { + "node_modules/@react-native/community-cli-plugin/node_modules/has-flag": { "version": "4.0.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { "node": ">=8" } }, - "node_modules/@react-native-windows/cli/node_modules/locate-path": { - "version": "5.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, + "node_modules/@react-native/community-cli-plugin/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/@react-native/community-cli-plugin/node_modules/querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "engines": { - "node": ">=8" + "node": ">=0.4.x" } }, - "node_modules/@react-native-windows/cli/node_modules/log-symbols": { - "version": "2.2.0", - "license": "MIT", - "peer": true, + "node_modules/@react-native/community-cli-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "chalk": "^2.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/@react-native-windows/cli/node_modules/log-symbols/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, + "node_modules/@react-native/debugger-frontend": { + "version": "0.74.85", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.74.85.tgz", + "integrity": "sha512-gUIhhpsYLUTYWlWw4vGztyHaX/kNlgVspSvKe2XaPA7o3jYKUoNLc3Ov7u70u/MBWfKdcEffWq44eSe3j3s5JQ==", "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/@react-native-windows/cli/node_modules/log-symbols/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "peer": true, + "node_modules/@react-native/dev-middleware": { + "version": "0.74.85", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.74.85.tgz", + "integrity": "sha512-BRmgCK5vnMmHaKRO+h8PKJmHHH3E6JFuerrcfE3wG2eZ1bcSr+QTu8DAlpxsDWvJvHpCi8tRJGauxd+Ssj/c7w==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.74.85", + "@rnx-kit/chromium-edge-launcher": "^1.0.0", + "chrome-launcher": "^0.15.2", + "connect": "^3.6.5", + "debug": "^2.2.0", + "node-fetch": "^2.2.0", + "nullthrows": "^1.1.1", + "open": "^7.0.3", + "selfsigned": "^2.4.1", + "serve-static": "^1.13.1", + "temp-dir": "^2.0.0", + "ws": "^6.2.2" }, "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/@react-native-windows/cli/node_modules/log-symbols/node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "peer": true, + "node_modules/@react-native/dev-middleware/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "color-name": "1.1.3" + "ms": "2.0.0" } }, - "node_modules/@react-native-windows/cli/node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.3", - "license": "MIT", - "peer": true + "node_modules/@react-native/dev-middleware/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/@react-native-windows/cli/node_modules/log-symbols/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "peer": true, + "node_modules/@react-native/dev-middleware/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native-windows/cli/node_modules/log-symbols/node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, + "node_modules/@react-native/gradle-plugin": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.75.2.tgz", + "integrity": "sha512-AELeAOCZi3B2vE6SeN+mjpZjjqzqa76yfFBB3L3f3NWiu4dm/YClTGOj+5IVRRgbt8LDuRImhDoaj7ukheXr4Q==", "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/@react-native-windows/cli/node_modules/mimic-fn": { - "version": "1.2.0", - "license": "MIT", - "peer": true, + "node_modules/@react-native/js-polyfills": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.75.2.tgz", + "integrity": "sha512-AtLd3mbiE+FXK2Ru3l2NFOXDhUvzdUsCP4qspUw0haVaO/9xzV97RVD2zz0lur2f/LmZqQ2+KXyYzr7048b5iw==", "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/@react-native-windows/cli/node_modules/onetime": { - "version": "2.0.1", - "license": "MIT", - "peer": true, + "node_modules/@react-native/metro-babel-transformer": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.75.2.tgz", + "integrity": "sha512-EygglCCuOub2sZ00CSIiEekCXoGL2XbOC6ssOB47M55QKvhdPG/0WBQXvmOmiN42uZgJK99Lj749v4rB0PlPIQ==", "dependencies": { - "mimic-fn": "^1.0.0" + "@babel/core": "^7.20.0", + "@react-native/babel-preset": "0.75.2", + "hermes-parser": "0.22.0", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" } }, - "node_modules/@react-native-windows/cli/node_modules/ora": { - "version": "3.4.0", - "license": "MIT", - "peer": true, + "node_modules/@react-native/metro-config": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.75.2.tgz", + "integrity": "sha512-LBcNF0csApOirPVmRhIAAb4ovAXDhn0Dbli5LMaLCosgQwJuhb05z7s1weavcAylPPUS7DuICUQpMoRU6hZzeQ==", + "dev": true, "dependencies": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" + "@react-native/js-polyfills": "0.75.2", + "@react-native/metro-babel-transformer": "0.75.2", + "metro-config": "^0.80.3", + "metro-runtime": "^0.80.3" }, "engines": { - "node": ">=6" + "node": ">=18" } }, - "node_modules/@react-native-windows/cli/node_modules/ora/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "peer": true, + "node_modules/@react-native/normalize-color": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/@react-native/normalize-colors": { + "version": "0.74.85", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.85.tgz", + "integrity": "sha512-pcE4i0X7y3hsAE0SpIl7t6dUc0B0NZLd1yv7ssm4FrLhWG+CGyIq4eFDXpmPU1XHmL5PPySxTAjEMiwv6tAmOw==" + }, + "node_modules/@react-native/virtualized-lists": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.75.2.tgz", + "integrity": "sha512-pD5SVCjxc8k+JdoyQ+IlulBTEqJc3S4KUKsmv5zqbNCyETB0ZUvd4Su7bp+lLF6ALxx6KKmbGk8E3LaWEjUFFQ==", "dependencies": { - "color-convert": "^1.9.0" + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "peerDependencies": { + "@types/react": "^18.2.6", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@react-native-windows/cli/node_modules/ora/node_modules/chalk": { - "version": "2.4.2", + "node_modules/@react-navigation/core": { + "version": "6.4.11", "license": "MIT", - "peer": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@react-navigation/routers": "^6.1.9", + "escape-string-regexp": "^4.0.0", + "nanoid": "^3.1.23", + "query-string": "^7.1.3", + "react-is": "^16.13.0", + "use-latest-callback": "^0.1.7" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "react": "*" } }, - "node_modules/@react-native-windows/cli/node_modules/ora/node_modules/color-convert": { - "version": "1.9.3", + "node_modules/@react-navigation/core/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/@react-navigation/devtools": { + "version": "6.0.10", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "color-name": "1.1.3" + "deep-equal": "^2.0.5", + "nanoid": "^3.1.23", + "stacktrace-parser": "^0.1.10" + }, + "peerDependencies": { + "react": "*" } }, - "node_modules/@react-native-windows/cli/node_modules/ora/node_modules/color-name": { - "version": "1.1.3", - "license": "MIT", - "peer": true - }, - "node_modules/@react-native-windows/cli/node_modules/ora/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" + "node_modules/@react-navigation/elements": { + "version": "1.3.31", + "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.31.tgz", + "integrity": "sha512-bUzP4Awlljx5RKEExw8WYtif8EuQni2glDaieYROKTnaxsu9kEIA515sXQgUDZU4Ob12VoL7+z70uO3qrlfXcQ==", + "peerDependencies": { + "@react-navigation/native": "^6.0.0", + "react": "*", + "react-native": "*", + "react-native-safe-area-context": ">= 3.0.0" } }, - "node_modules/@react-native-windows/cli/node_modules/ora/node_modules/supports-color": { - "version": "5.5.0", + "node_modules/@react-navigation/material-top-tabs": { + "version": "6.6.3", "license": "MIT", - "peer": true, "dependencies": { - "has-flag": "^3.0.0" + "color": "^4.2.3", + "warn-once": "^0.1.0" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@react-navigation/native": "^6.0.0", + "react": "*", + "react-native": "*", + "react-native-pager-view": ">= 4.0.0", + "react-native-tab-view": ">= 3.0.0" } }, - "node_modules/@react-native-windows/cli/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/@react-navigation/native": { + "version": "6.1.12", "license": "MIT", - "peer": true, "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" + "@react-navigation/core": "^6.4.11", + "escape-string-regexp": "^4.0.0", + "fast-deep-equal": "^3.1.3", + "nanoid": "^3.1.23" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "node_modules/@react-native-windows/cli/node_modules/p-locate": { - "version": "4.1.0", - "license": "MIT", - "peer": true, + "node_modules/@react-navigation/native-stack": { + "version": "6.9.26", + "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-6.9.26.tgz", + "integrity": "sha512-++dueQ+FDj2XkZ902DVrK79ub1vp19nSdAZWxKRgd6+Bc0Niiesua6rMCqymYOVaYh+dagwkA9r00bpt/U5WLw==", "dependencies": { - "p-limit": "^2.2.0" + "@react-navigation/elements": "^1.3.30", + "warn-once": "^0.1.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@react-navigation/native": "^6.0.0", + "react": "*", + "react-native": "*", + "react-native-safe-area-context": ">= 3.0.0", + "react-native-screens": ">= 3.0.0" } }, - "node_modules/@react-native-windows/cli/node_modules/path-exists": { - "version": "4.0.0", + "node_modules/@react-navigation/routers": { + "version": "6.1.9", "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" + "dependencies": { + "nanoid": "^3.1.23" } }, - "node_modules/@react-native-windows/cli/node_modules/restore-cursor": { - "version": "2.0.0", + "node_modules/@react-navigation/stack": { + "version": "6.3.29", "license": "MIT", - "peer": true, "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "@react-navigation/elements": "^1.3.30", + "color": "^4.2.3", + "warn-once": "^0.1.0" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@react-navigation/native": "^6.0.0", + "react": "*", + "react-native": "*", + "react-native-gesture-handler": ">= 1.0.0", + "react-native-safe-area-context": ">= 3.0.0", + "react-native-screens": ">= 3.0.0" } }, - "node_modules/@react-native-windows/cli/node_modules/strip-ansi": { - "version": "5.2.0", - "license": "MIT", - "peer": true, + "node_modules/@react-ng/bounds-observer": { + "version": "0.2.1", + "license": "Apache-2.0", "dependencies": { - "ansi-regex": "^4.1.0" + "@html-ng/bounding-client-rect-observer": "^0.1.3", + "@types/react": "^18.0.31", + "@types/react-dom": "^18.0.11", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@rnmapbox/maps": { + "version": "10.1.30", + "resolved": "https://registry.npmjs.org/@rnmapbox/maps/-/maps-10.1.30.tgz", + "integrity": "sha512-3yl043+mpBldIHxTMMBU6Rdka6IjSww3kaIngltsUBTtnQI9NE1Yv3msC1X10E5bcfLHrhLxkiMSRhckCKBkPA==", + "dependencies": { + "@turf/along": "6.5.0", + "@turf/distance": "6.5.0", + "@turf/helpers": "6.5.0", + "@turf/length": "6.5.0", + "@turf/nearest-point-on-line": "6.5.0", + "@types/geojson": "^7946.0.7", + "debounce": "^1.2.0" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "expo": ">=47.0.0", + "mapbox-gl": "^2.9.0", + "react": ">=16.6.1", + "react-dom": ">= 17.0.0", + "react-native": ">=0.59.9" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "mapbox-gl": { + "optional": true + }, + "react-dom": { + "optional": true + } } }, - "node_modules/@react-native-windows/cli/node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "peer": true, + "node_modules/@rnx-kit/chromium-edge-launcher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rnx-kit/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz", + "integrity": "sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==", "dependencies": { - "has-flag": "^4.0.0" + "@types/node": "^18.0.0", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0", + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=14.15" } }, - "node_modules/@react-native-windows/cli/node_modules/uuid": { - "version": "3.4.0", - "license": "MIT", - "peer": true, - "bin": { - "uuid": "bin/uuid" + "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/@types/node": { + "version": "18.19.47", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.47.tgz", + "integrity": "sha512-1f7dB3BL/bpd9tnDJrrHb66Y+cVrhxSOTGorRNdHwYTUlTay3HuTDPKo9a/4vX9pMQkhYBcAbL4jQdNlhCFP9A==", + "dependencies": { + "undici-types": "~5.26.4" } }, - "node_modules/@react-native-windows/codegen": { - "version": "0.73.0", - "license": "MIT", - "peer": true, + "node_modules/@segment/loosely-validate-event": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", + "integrity": "sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==", "dependencies": { - "@react-native-windows/fs": "0.73.0", - "chalk": "^4.1.0", - "globby": "^11.0.4", - "mustache": "^4.0.1", - "source-map-support": "^0.5.19", - "yargs": "^16.2.0" - }, - "bin": { - "react-native-windows-codegen": "bin.js" - }, - "engines": { - "node": ">= 18" + "component-type": "^1.2.1", + "join-component": "^1.1.0" + } + }, + "node_modules/@shopify/flash-list": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@shopify/flash-list/-/flash-list-1.7.1.tgz", + "integrity": "sha512-sUYl7h8ydJutufA26E42Hj7cLvaBTpkMIyNJiFrxUspkcANb6jnFiLt9rEwAuDjvGk/C0lHau+WyT6ZOxqVPwg==", + "dependencies": { + "recyclerlistview": "4.2.1", + "tslib": "2.6.3" }, "peerDependencies": { + "@babel/runtime": "*", + "react": "*", "react-native": "*" } }, - "node_modules/@react-native-windows/codegen/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "peer": true, + "node_modules/@sideway/address": { + "version": "4.1.5", + "license": "BSD-3-Clause", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "@hapi/hoek": "^9.0.0" } }, - "node_modules/@react-native-windows/codegen/node_modules/chalk": { - "version": "4.1.2", + "node_modules/@sideway/formula": { + "version": "3.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@react-native-windows/codegen/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native-windows/codegen/node_modules/color-name": { - "version": "1.1.4", - "license": "MIT", - "peer": true + "node_modules/@sinonjs/commons": { + "version": "2.0.0", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } }, - "node_modules/@react-native-windows/codegen/node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" + "node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^2.0.0" } }, - "node_modules/@react-native-windows/codegen/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/@storybook/addon-a11y": { + "version": "8.1.10", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "@storybook/addon-highlight": "8.1.10", + "axe-core": "^4.2.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-windows/find-repo-root": { - "version": "0.73.0", + "node_modules/@storybook/addon-actions": { + "version": "8.1.10", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@react-native-windows/fs": "0.73.0", - "find-up": "^4.1.0" + "@storybook/core-events": "8.1.10", + "@storybook/global": "^5.0.0", + "@types/uuid": "^9.0.1", + "dequal": "^2.0.2", + "polished": "^4.2.2", + "uuid": "^9.0.0" }, - "engines": { - "node": ">= 18" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-windows/find-repo-root/node_modules/find-up": { - "version": "4.1.0", + "node_modules/@storybook/addon-actions/node_modules/@storybook/core-events": { + "version": "8.1.10", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@storybook/csf": "^0.1.7", + "ts-dedent": "^2.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-windows/find-repo-root/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/@storybook/addon-actions/node_modules/uuid": { + "version": "9.0.1", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@react-native-windows/find-repo-root/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/@storybook/addon-backgrounds": { + "version": "8.1.10", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3", + "ts-dedent": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-windows/find-repo-root/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/@storybook/addon-controls": { + "version": "8.1.10", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "p-limit": "^2.2.0" + "@storybook/blocks": "8.1.10", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "ts-dedent": "^2.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-windows/find-repo-root/node_modules/path-exists": { - "version": "4.0.0", + "node_modules/@storybook/addon-docs": { + "version": "8.1.10", + "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" + "dependencies": { + "@babel/core": "^7.24.4", + "@mdx-js/react": "^3.0.0", + "@storybook/blocks": "8.1.10", + "@storybook/client-logger": "8.1.10", + "@storybook/components": "8.1.10", + "@storybook/csf-plugin": "8.1.10", + "@storybook/csf-tools": "8.1.10", + "@storybook/global": "^5.0.0", + "@storybook/node-logger": "8.1.10", + "@storybook/preview-api": "8.1.10", + "@storybook/react-dom-shim": "8.1.10", + "@storybook/theming": "8.1.10", + "@storybook/types": "8.1.10", + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "fs-extra": "^11.1.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "rehype-external-links": "^3.0.0", + "rehype-slug": "^6.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-windows/fs": { - "version": "0.73.0", + "node_modules/@storybook/addon-docs/node_modules/@babel/traverse": { + "version": "7.24.7", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "graceful-fs": "^4.2.8" + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { - "node": ">= 18" + "node": ">=6.9.0" } }, - "node_modules/@react-native-windows/package-utils": { - "version": "0.73.0", + "node_modules/@storybook/addon-docs/node_modules/@storybook/channels": { + "version": "8.1.10", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@react-native-windows/find-repo-root": "0.73.0", - "@react-native-windows/fs": "0.73.0", - "get-monorepo-packages": "^1.2.0", - "lodash": "^4.17.15" + "@storybook/client-logger": "8.1.10", + "@storybook/core-events": "8.1.10", + "@storybook/global": "^5.0.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" }, - "engines": { - "node": ">= 18" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-windows/telemetry": { - "version": "0.73.1", + "node_modules/@storybook/addon-docs/node_modules/@storybook/client-logger": { + "version": "8.1.10", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@react-native-windows/fs": "0.73.0", - "@xmldom/xmldom": "^0.7.7", - "applicationinsights": "2.7.3", - "ci-info": "^3.2.0", - "envinfo": "^7.8.1", - "lodash": "^4.17.21", - "os-locale": "^5.0.0", - "xpath": "^0.0.27" + "@storybook/global": "^5.0.0" }, - "engines": { - "node": ">= 18" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-windows/telemetry/node_modules/execa": { - "version": "4.1.0", + "node_modules/@storybook/addon-docs/node_modules/@storybook/core-events": { + "version": "8.1.10", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" + "@storybook/csf": "^0.1.7", + "ts-dedent": "^2.0.0" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-windows/telemetry/node_modules/get-stream": { - "version": "5.2.0", + "node_modules/@storybook/addon-docs/node_modules/@storybook/csf-tools": { + "version": "8.1.10", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" + "@babel/generator": "^7.24.4", + "@babel/parser": "^7.24.4", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "@storybook/csf": "^0.1.7", + "@storybook/types": "8.1.10", + "fs-extra": "^11.1.0", + "recast": "^0.23.5", + "ts-dedent": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-windows/telemetry/node_modules/human-signals": { - "version": "1.1.1", - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=8.12.0" + "node_modules/@storybook/addon-docs/node_modules/@storybook/node-logger": { + "version": "8.1.10", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-windows/telemetry/node_modules/invert-kv": { - "version": "3.0.1", + "node_modules/@storybook/addon-docs/node_modules/@storybook/preview-api": { + "version": "8.1.10", + "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" + "dependencies": { + "@storybook/channels": "8.1.10", + "@storybook/client-logger": "8.1.10", + "@storybook/core-events": "8.1.10", + "@storybook/csf": "^0.1.7", + "@storybook/global": "^5.0.0", + "@storybook/types": "8.1.10", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "tiny-invariant": "^1.3.1", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" }, "funding": { - "url": "https://github.com/sindresorhus/invert-kv?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-windows/telemetry/node_modules/lcid": { - "version": "3.1.1", + "node_modules/@storybook/addon-docs/node_modules/@storybook/types": { + "version": "8.1.10", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "invert-kv": "^3.0.0" + "@storybook/channels": "8.1.10", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-windows/telemetry/node_modules/mem": { - "version": "5.1.1", + "node_modules/@storybook/addon-docs/node_modules/fs-extra": { + "version": "11.2.0", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^2.1.0", - "p-is-promise": "^2.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.14" } }, - "node_modules/@react-native-windows/telemetry/node_modules/os-locale": { - "version": "5.0.0", + "node_modules/@storybook/addon-docs/node_modules/recast": { + "version": "0.23.9", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "execa": "^4.0.0", - "lcid": "^3.0.0", - "mem": "^5.0.0" + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4" } }, - "node_modules/@react-native/assets-registry": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.75.2.tgz", - "integrity": "sha512-P1dLHjpUeC0AIkDHRYcx0qLMr+p92IPWL3pmczzo6T76Qa9XzruQOYy0jittxyBK91Csn6HHQ/eit8TeXW8MVw==", + "node_modules/@storybook/addon-docs/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=18" + "node": ">=0.10.0" } }, - "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.75.2.tgz", - "integrity": "sha512-BIKVh2ZJPkzluUGgCNgpoh6NTHgX8j04FCS0Z/rTmRJ66hir/EUBl8frMFKrOy/6i4VvZEltOWB5eWfHe1AYgw==", + "node_modules/@storybook/addon-essentials": { + "version": "8.1.10", + "dev": true, + "license": "MIT", "dependencies": { - "@react-native/codegen": "0.75.2" + "@storybook/addon-actions": "8.1.10", + "@storybook/addon-backgrounds": "8.1.10", + "@storybook/addon-controls": "8.1.10", + "@storybook/addon-docs": "8.1.10", + "@storybook/addon-highlight": "8.1.10", + "@storybook/addon-measure": "8.1.10", + "@storybook/addon-outline": "8.1.10", + "@storybook/addon-toolbars": "8.1.10", + "@storybook/addon-viewport": "8.1.10", + "@storybook/core-common": "8.1.10", + "@storybook/manager-api": "8.1.10", + "@storybook/node-logger": "8.1.10", + "@storybook/preview-api": "8.1.10", + "ts-dedent": "^2.0.0" }, - "engines": { - "node": ">=18" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native/babel-preset": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.75.2.tgz", - "integrity": "sha512-mprpsas+WdCEMjQZnbDiAC4KKRmmLbMB+o/v4mDqKlH4Mcm7RdtP5t80MZGOVCHlceNp1uEIpXywx69DNwgbgg==", + "node_modules/@storybook/addon-essentials/node_modules/@babel/traverse": { + "version": "7.24.7", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.5", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.5", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-regenerator": "^7.20.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "@react-native/babel-plugin-codegen": "0.75.2", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" + "node": ">=6.9.0" } }, - "node_modules/@react-native/codegen": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.75.2.tgz", - "integrity": "sha512-OkWdbtO2jTkfOXfj3ibIL27rM6LoaEuApOByU2G8X+HS6v9U87uJVJlMIRWBDmnxODzazuHwNVA2/wAmSbucaw==", + "node_modules/@storybook/addon-essentials/node_modules/@storybook/channels": { + "version": "8.1.10", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.20.0", - "glob": "^7.1.1", - "hermes-parser": "0.22.0", - "invariant": "^2.2.4", - "jscodeshift": "^0.14.0", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" - }, - "engines": { - "node": ">=18" + "@storybook/client-logger": "8.1.10", + "@storybook/core-events": "8.1.10", + "@storybook/global": "^5.0.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native/codegen/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/@storybook/addon-essentials/node_modules/@storybook/client-logger": { + "version": "8.1.10", + "dev": true, + "license": "MIT", "dependencies": { - "minimist": "^1.2.6" + "@storybook/global": "^5.0.0" }, - "bin": { - "mkdirp": "bin/cmd.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native/community-cli-plugin": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.75.2.tgz", - "integrity": "sha512-/tz0bzVja4FU0aAimzzQ7iYR43peaD6pzksArdrrGhlm8OvFYAQPOYSNeIQVMSarwnkNeg1naFKaeYf1o3++yA==", + "node_modules/@storybook/addon-essentials/node_modules/@storybook/core-common": { + "version": "8.1.10", + "dev": true, + "license": "MIT", "dependencies": { - "@react-native-community/cli-server-api": "14.0.0-alpha.11", - "@react-native-community/cli-tools": "14.0.0-alpha.11", - "@react-native/dev-middleware": "0.75.2", - "@react-native/metro-babel-transformer": "0.75.2", - "chalk": "^4.0.0", - "execa": "^5.1.1", - "metro": "^0.80.3", - "metro-config": "^0.80.3", - "metro-core": "^0.80.3", - "node-fetch": "^2.2.0", - "querystring": "^0.2.1", - "readline": "^1.3.0" + "@storybook/core-events": "8.1.10", + "@storybook/csf-tools": "8.1.10", + "@storybook/node-logger": "8.1.10", + "@storybook/types": "8.1.10", + "@yarnpkg/fslib": "2.10.3", + "@yarnpkg/libzip": "2.3.0", + "chalk": "^4.1.0", + "cross-spawn": "^7.0.3", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0", + "esbuild-register": "^3.5.0", + "execa": "^5.0.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "glob": "^10.0.0", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "prettier-fallback": "npm:prettier@^3", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "semver": "^7.3.7", + "tempy": "^3.1.0", + "tiny-invariant": "^1.3.1", + "ts-dedent": "^2.0.0", + "util": "^0.12.4" }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native-community/cli-debugger-ui": { - "version": "14.0.0-alpha.11", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-14.0.0-alpha.11.tgz", - "integrity": "sha512-0wCNQxhCniyjyMXgR1qXliY180y/2QbvoiYpp2MleGQADr5M1b8lgI4GoyADh5kE+kX3VL0ssjgyxpmbpCD86A==", - "dependencies": { - "serve-static": "^1.13.1" + "peerDependencies": { + "prettier": "^2 || ^3" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } } }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native-community/cli-server-api": { - "version": "14.0.0-alpha.11", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-14.0.0-alpha.11.tgz", - "integrity": "sha512-I7YeYI7S5wSxnQAqeG8LNqhT99FojiGIk87DU0vTp6U8hIMLcA90fUuBAyJY38AuQZ12ZJpGa8ObkhIhWzGkvg==", + "node_modules/@storybook/addon-essentials/node_modules/@storybook/core-events": { + "version": "8.1.10", + "dev": true, + "license": "MIT", "dependencies": { - "@react-native-community/cli-debugger-ui": "14.0.0-alpha.11", - "@react-native-community/cli-tools": "14.0.0-alpha.11", - "compression": "^1.7.1", - "connect": "^3.6.5", - "errorhandler": "^1.5.1", - "nocache": "^3.0.1", - "pretty-format": "^26.6.2", - "serve-static": "^1.13.1", - "ws": "^6.2.3" + "@storybook/csf": "^0.1.7", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native-community/cli-tools": { - "version": "14.0.0-alpha.11", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-14.0.0-alpha.11.tgz", - "integrity": "sha512-HQCfVnX9aqRdKdLxmQy4fUAUo+YhNGlBV7ZjOayPbuEGWJ4RN+vSy0Cawk7epo7hXd6vKzc7P7y3HlU6Kxs7+w==", + "node_modules/@storybook/addon-essentials/node_modules/@storybook/csf-tools": { + "version": "8.1.10", + "dev": true, + "license": "MIT", "dependencies": { - "appdirsjs": "^1.2.4", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "find-up": "^5.0.0", - "mime": "^2.4.1", - "open": "^6.2.0", - "ora": "^5.4.1", - "semver": "^7.5.2", - "shell-quote": "^1.7.3", - "sudo-prompt": "^9.0.0" + "@babel/generator": "^7.24.4", + "@babel/parser": "^7.24.4", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "@storybook/csf": "^0.1.7", + "@storybook/types": "8.1.10", + "fs-extra": "^11.1.0", + "recast": "^0.23.5", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-frontend": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.75.2.tgz", - "integrity": "sha512-qIC6mrlG8RQOPaYLZQiJwqnPchAVGnHWcVDeQxPMPLkM/D5+PC8tuKWYOwgLcEau3RZlgz7QQNk31Qj2/OJG6Q==", - "engines": { - "node": ">=18" + "node_modules/@storybook/addon-essentials/node_modules/@storybook/node-logger": { + "version": "8.1.10", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.75.2.tgz", - "integrity": "sha512-fTC5m2uVjYp1XPaIJBFgscnQjPdGVsl96z/RfLgXDq0HBffyqbg29ttx6yTCx7lIa9Gdvf6nKQom+e+Oa4izSw==", + "node_modules/@storybook/addon-essentials/node_modules/@storybook/preview-api": { + "version": "8.1.10", + "dev": true, + "license": "MIT", "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.75.2", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "node-fetch": "^2.2.0", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "selfsigned": "^2.4.1", - "serve-static": "^1.13.1", - "ws": "^6.2.2" + "@storybook/channels": "8.1.10", + "@storybook/client-logger": "8.1.10", + "@storybook/core-events": "8.1.10", + "@storybook/csf": "^0.1.7", + "@storybook/global": "^5.0.0", + "@storybook/types": "8.1.10", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "tiny-invariant": "^1.3.1", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" }, - "engines": { - "node": ">=18" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "node_modules/@storybook/addon-essentials/node_modules/@storybook/types": { + "version": "8.1.10", + "dev": true, + "license": "MIT", "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" + "@storybook/channels": "8.1.10", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/@types/yargs": { - "version": "15.0.19", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/ansi-styles": { + "node_modules/@storybook/addon-essentials/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -10163,10 +10156,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/chalk": { + "node_modules/@storybook/addon-essentials/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@storybook/addon-essentials/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10178,23 +10179,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/chromium-edge-launcher": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", - "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/color-convert": { + "node_modules/@storybook/addon-essentials/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -10202,589 +10190,361 @@ "node": ">=7.0.0" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/color-name": { + "node_modules/@storybook/addon-essentials/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@react-native/community-cli-plugin/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } + "dev": true, + "license": "MIT" }, - "node_modules/@react-native/community-cli-plugin/node_modules/has-flag": { + "node_modules/@storybook/addon-essentials/node_modules/crypto-random-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/@react-native/community-cli-plugin/node_modules/open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "license": "MIT", "dependencies": { - "is-wsl": "^1.1.0" + "type-fest": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/open/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "node_modules/@storybook/addon-essentials/node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native/community-cli-plugin/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==", + "node_modules/@storybook/addon-essentials/node_modules/find-cache-dir": { + "version": "3.3.2", + "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "engines": { - "node": ">= 10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/querystring": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "node_modules/@storybook/addon-essentials/node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=0.4.x" + "node": ">=8" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/@react-native/community-cli-plugin/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@storybook/addon-essentials/node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "find-up": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@react-native/debugger-frontend": { - "version": "0.74.85", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.74.85.tgz", - "integrity": "sha512-gUIhhpsYLUTYWlWw4vGztyHaX/kNlgVspSvKe2XaPA7o3jYKUoNLc3Ov7u70u/MBWfKdcEffWq44eSe3j3s5JQ==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/dev-middleware": { - "version": "0.74.85", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.74.85.tgz", - "integrity": "sha512-BRmgCK5vnMmHaKRO+h8PKJmHHH3E6JFuerrcfE3wG2eZ1bcSr+QTu8DAlpxsDWvJvHpCi8tRJGauxd+Ssj/c7w==", + "node_modules/@storybook/addon-essentials/node_modules/fs-extra": { + "version": "11.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.74.85", - "@rnx-kit/chromium-edge-launcher": "^1.0.0", - "chrome-launcher": "^0.15.2", - "connect": "^3.6.5", - "debug": "^2.2.0", - "node-fetch": "^2.2.0", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "selfsigned": "^2.4.1", - "serve-static": "^1.13.1", - "temp-dir": "^2.0.0", - "ws": "^6.2.2" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node": ">=14.14" } }, - "node_modules/@react-native/dev-middleware/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/@react-native/dev-middleware/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "node_modules/@storybook/addon-essentials/node_modules/glob": { + "version": "10.4.2", + "dev": true, + "license": "ISC", "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">=8" + "bin": { + "glob": "dist/esm/bin.mjs" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "node": ">=16 || 14 >=14.18" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@react-native/gradle-plugin": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.75.2.tgz", - "integrity": "sha512-AELeAOCZi3B2vE6SeN+mjpZjjqzqa76yfFBB3L3f3NWiu4dm/YClTGOj+5IVRRgbt8LDuRImhDoaj7ukheXr4Q==", + "node_modules/@storybook/addon-essentials/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/@react-native/js-polyfills": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.75.2.tgz", - "integrity": "sha512-AtLd3mbiE+FXK2Ru3l2NFOXDhUvzdUsCP4qspUw0haVaO/9xzV97RVD2zz0lur2f/LmZqQ2+KXyYzr7048b5iw==", + "node_modules/@storybook/addon-essentials/node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native/metro-babel-transformer": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.75.2.tgz", - "integrity": "sha512-EygglCCuOub2sZ00CSIiEekCXoGL2XbOC6ssOB47M55QKvhdPG/0WBQXvmOmiN42uZgJK99Lj749v4rB0PlPIQ==", + "node_modules/@storybook/addon-essentials/node_modules/jackspeak": { + "version": "3.4.0", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@babel/core": "^7.20.0", - "@react-native/babel-preset": "0.75.2", - "hermes-parser": "0.22.0", - "nullthrows": "^1.1.1" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=18" + "node": ">=14" }, - "peerDependencies": { - "@babel/core": "*" + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/@react-native/metro-config": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.75.2.tgz", - "integrity": "sha512-LBcNF0csApOirPVmRhIAAb4ovAXDhn0Dbli5LMaLCosgQwJuhb05z7s1weavcAylPPUS7DuICUQpMoRU6hZzeQ==", + "node_modules/@storybook/addon-essentials/node_modules/locate-path": { + "version": "5.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@react-native/js-polyfills": "0.75.2", - "@react-native/metro-babel-transformer": "0.75.2", - "metro-config": "^0.80.3", - "metro-runtime": "^0.80.3" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/@react-native/normalize-color": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/@react-native/normalize-colors": { - "version": "0.74.85", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.85.tgz", - "integrity": "sha512-pcE4i0X7y3hsAE0SpIl7t6dUc0B0NZLd1yv7ssm4FrLhWG+CGyIq4eFDXpmPU1XHmL5PPySxTAjEMiwv6tAmOw==" - }, - "node_modules/@react-native/virtualized-lists": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.75.2.tgz", - "integrity": "sha512-pD5SVCjxc8k+JdoyQ+IlulBTEqJc3S4KUKsmv5zqbNCyETB0ZUvd4Su7bp+lLF6ALxx6KKmbGk8E3LaWEjUFFQ==", + "node_modules/@storybook/addon-essentials/node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" + "semver": "^6.0.0" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^18.2.6", - "react": "*", - "react-native": "*" + "node": ">=8" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-navigation/core": { - "version": "6.4.11", - "license": "MIT", - "dependencies": { - "@react-navigation/routers": "^6.1.9", - "escape-string-regexp": "^4.0.0", - "nanoid": "^3.1.23", - "query-string": "^7.1.3", - "react-is": "^16.13.0", - "use-latest-callback": "^0.1.7" - }, - "peerDependencies": { - "react": "*" + "node_modules/@storybook/addon-essentials/node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@react-navigation/core/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/@react-navigation/devtools": { - "version": "6.0.10", + "node_modules/@storybook/addon-essentials/node_modules/minimatch": { + "version": "9.0.4", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "deep-equal": "^2.0.5", - "nanoid": "^3.1.23", - "stacktrace-parser": "^0.1.10" + "brace-expansion": "^2.0.1" }, - "peerDependencies": { - "react": "*" + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@react-navigation/elements": { - "version": "1.3.31", - "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.31.tgz", - "integrity": "sha512-bUzP4Awlljx5RKEExw8WYtif8EuQni2glDaieYROKTnaxsu9kEIA515sXQgUDZU4Ob12VoL7+z70uO3qrlfXcQ==", - "peerDependencies": { - "@react-navigation/native": "^6.0.0", - "react": "*", - "react-native": "*", - "react-native-safe-area-context": ">= 3.0.0" + "node_modules/@storybook/addon-essentials/node_modules/minipass": { + "version": "7.1.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/@react-navigation/material-top-tabs": { - "version": "6.6.3", + "node_modules/@storybook/addon-essentials/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, "license": "MIT", "dependencies": { - "color": "^4.2.3", - "warn-once": "^0.1.0" + "p-try": "^2.0.0" }, - "peerDependencies": { - "@react-navigation/native": "^6.0.0", - "react": "*", - "react-native": "*", - "react-native-pager-view": ">= 4.0.0", - "react-native-tab-view": ">= 3.0.0" - } - }, - "node_modules/@react-navigation/native": { - "version": "6.1.12", - "license": "MIT", - "dependencies": { - "@react-navigation/core": "^6.4.11", - "escape-string-regexp": "^4.0.0", - "fast-deep-equal": "^3.1.3", - "nanoid": "^3.1.23" + "engines": { + "node": ">=6" }, - "peerDependencies": { - "react": "*", - "react-native": "*" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-navigation/native-stack": { - "version": "6.9.26", - "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-6.9.26.tgz", - "integrity": "sha512-++dueQ+FDj2XkZ902DVrK79ub1vp19nSdAZWxKRgd6+Bc0Niiesua6rMCqymYOVaYh+dagwkA9r00bpt/U5WLw==", + "node_modules/@storybook/addon-essentials/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "@react-navigation/elements": "^1.3.30", - "warn-once": "^0.1.0" + "p-limit": "^2.2.0" }, - "peerDependencies": { - "@react-navigation/native": "^6.0.0", - "react": "*", - "react-native": "*", - "react-native-safe-area-context": ">= 3.0.0", - "react-native-screens": ">= 3.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/@react-navigation/routers": { - "version": "6.1.9", + "node_modules/@storybook/addon-essentials/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "nanoid": "^3.1.23" + "engines": { + "node": ">=8" } }, - "node_modules/@react-navigation/stack": { - "version": "6.3.29", + "node_modules/@storybook/addon-essentials/node_modules/recast": { + "version": "0.23.9", + "dev": true, "license": "MIT", "dependencies": { - "@react-navigation/elements": "^1.3.30", - "color": "^4.2.3", - "warn-once": "^0.1.0" + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" }, - "peerDependencies": { - "@react-navigation/native": "^6.0.0", - "react": "*", - "react-native": "*", - "react-native-gesture-handler": ">= 1.0.0", - "react-native-safe-area-context": ">= 3.0.0", - "react-native-screens": ">= 3.0.0" - } - }, - "node_modules/@react-ng/bounds-observer": { - "version": "0.2.1", - "license": "Apache-2.0", - "dependencies": { - "@html-ng/bounding-client-rect-observer": "^0.1.3", - "@types/react": "^18.0.31", - "@types/react-dom": "^18.0.11", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "engines": { + "node": ">= 4" } }, - "node_modules/@rnmapbox/maps": { - "version": "10.1.30", - "resolved": "https://registry.npmjs.org/@rnmapbox/maps/-/maps-10.1.30.tgz", - "integrity": "sha512-3yl043+mpBldIHxTMMBU6Rdka6IjSww3kaIngltsUBTtnQI9NE1Yv3msC1X10E5bcfLHrhLxkiMSRhckCKBkPA==", - "dependencies": { - "@turf/along": "6.5.0", - "@turf/distance": "6.5.0", - "@turf/helpers": "6.5.0", - "@turf/length": "6.5.0", - "@turf/nearest-point-on-line": "6.5.0", - "@types/geojson": "^7946.0.7", - "debounce": "^1.2.0" - }, - "peerDependencies": { - "expo": ">=47.0.0", - "mapbox-gl": "^2.9.0", - "react": ">=16.6.1", - "react-dom": ">= 17.0.0", - "react-native": ">=0.59.9" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - }, - "mapbox-gl": { - "optional": true - }, - "react-dom": { - "optional": true - } + "node_modules/@storybook/addon-essentials/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@rnx-kit/chromium-edge-launcher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rnx-kit/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz", - "integrity": "sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==", + "node_modules/@storybook/addon-essentials/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "^18.0.0", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=14.15" - } - }, - "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/@types/node": { - "version": "18.19.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.47.tgz", - "integrity": "sha512-1f7dB3BL/bpd9tnDJrrHb66Y+cVrhxSOTGorRNdHwYTUlTay3HuTDPKo9a/4vX9pMQkhYBcAbL4jQdNlhCFP9A==", - "dependencies": { - "undici-types": "~5.26.4" + "node": ">=8" } }, - "node_modules/@segment/loosely-validate-event": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", - "integrity": "sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==", - "dependencies": { - "component-type": "^1.2.1", - "join-component": "^1.1.0" + "node_modules/@storybook/addon-essentials/node_modules/temp-dir": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" } }, - "node_modules/@shopify/flash-list": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@shopify/flash-list/-/flash-list-1.7.1.tgz", - "integrity": "sha512-sUYl7h8ydJutufA26E42Hj7cLvaBTpkMIyNJiFrxUspkcANb6jnFiLt9rEwAuDjvGk/C0lHau+WyT6ZOxqVPwg==", + "node_modules/@storybook/addon-essentials/node_modules/tempy": { + "version": "3.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "recyclerlistview": "4.2.1", - "tslib": "2.6.3" + "is-stream": "^3.0.0", + "temp-dir": "^3.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" }, - "peerDependencies": { - "@babel/runtime": "*", - "react": "*", - "react-native": "*" - } - }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "license": "BSD-3-Clause" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "license": "BSD-3-Clause" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "license": "MIT" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", + "node_modules/@storybook/addon-essentials/node_modules/type-fest": { + "version": "2.19.0", "dev": true, - "license": "MIT", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "node_modules/@storybook/addon-essentials/node_modules/unique-string": { + "version": "3.0.0", "dev": true, "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "license": "BSD-3-Clause", + "node_modules/@storybook/addon-essentials/node_modules/util": { + "version": "0.12.5", + "dev": true, + "license": "MIT", "dependencies": { - "@sinonjs/commons": "^2.0.0" + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, - "node_modules/@storybook/addon-a11y": { + "node_modules/@storybook/addon-highlight": { "version": "8.1.10", "dev": true, "license": "MIT", "dependencies": { - "@storybook/addon-highlight": "8.1.10", - "axe-core": "^4.2.0" + "@storybook/global": "^5.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-actions": { + "node_modules/@storybook/addon-measure": { "version": "8.1.10", "dev": true, "license": "MIT", "dependencies": { - "@storybook/core-events": "8.1.10", "@storybook/global": "^5.0.0", - "@types/uuid": "^9.0.1", - "dequal": "^2.0.2", - "polished": "^4.2.2", - "uuid": "^9.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-actions/node_modules/@storybook/core-events": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/csf": "^0.1.7", - "ts-dedent": "^2.0.0" + "tiny-invariant": "^1.3.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-actions/node_modules/uuid": { - "version": "9.0.1", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@storybook/addon-backgrounds": { + "node_modules/@storybook/addon-outline": { "version": "8.1.10", "dev": true, "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", - "memoizerific": "^1.11.3", "ts-dedent": "^2.0.0" }, "funding": { @@ -10792,243 +10552,87 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-controls": { + "node_modules/@storybook/addon-toolbars": { "version": "8.1.10", "dev": true, "license": "MIT", - "dependencies": { - "@storybook/blocks": "8.1.10", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "ts-dedent": "^2.0.0" - }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-docs": { + "node_modules/@storybook/addon-viewport": { "version": "8.1.10", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.24.4", - "@mdx-js/react": "^3.0.0", - "@storybook/blocks": "8.1.10", - "@storybook/client-logger": "8.1.10", - "@storybook/components": "8.1.10", - "@storybook/csf-plugin": "8.1.10", - "@storybook/csf-tools": "8.1.10", - "@storybook/global": "^5.0.0", - "@storybook/node-logger": "8.1.10", - "@storybook/preview-api": "8.1.10", - "@storybook/react-dom-shim": "8.1.10", - "@storybook/theming": "8.1.10", - "@storybook/types": "8.1.10", - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "fs-extra": "^11.1.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "rehype-external-links": "^3.0.0", - "rehype-slug": "^6.0.0", - "ts-dedent": "^2.0.0" + "memoizerific": "^1.11.3" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-docs/node_modules/@babel/traverse": { - "version": "7.24.7", + "node_modules/@storybook/addon-webpack5-compiler-babel": { + "version": "3.0.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/core": "^7.23.7", + "babel-loader": "^9.1.3" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@storybook/addon-docs/node_modules/@storybook/channels": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/client-logger": "8.1.10", - "@storybook/core-events": "8.1.10", - "@storybook/global": "^5.0.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-docs/node_modules/@storybook/client-logger": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-docs/node_modules/@storybook/core-events": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/csf": "^0.1.7", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-docs/node_modules/@storybook/csf-tools": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/generator": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "@storybook/csf": "^0.1.7", - "@storybook/types": "8.1.10", - "fs-extra": "^11.1.0", - "recast": "^0.23.5", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-docs/node_modules/@storybook/node-logger": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "node": ">=18" } }, - "node_modules/@storybook/addon-docs/node_modules/@storybook/preview-api": { + "node_modules/@storybook/blocks": { "version": "8.1.10", "dev": true, "license": "MIT", "dependencies": { "@storybook/channels": "8.1.10", "@storybook/client-logger": "8.1.10", + "@storybook/components": "8.1.10", "@storybook/core-events": "8.1.10", "@storybook/csf": "^0.1.7", + "@storybook/docs-tools": "8.1.10", "@storybook/global": "^5.0.0", + "@storybook/icons": "^1.2.5", + "@storybook/manager-api": "8.1.10", + "@storybook/preview-api": "8.1.10", + "@storybook/theming": "8.1.10", "@storybook/types": "8.1.10", - "@types/qs": "^6.9.5", + "@types/lodash": "^4.14.167", + "color-convert": "^2.0.1", "dequal": "^2.0.2", "lodash": "^4.17.21", + "markdown-to-jsx": "7.3.2", "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "tiny-invariant": "^1.3.1", + "polished": "^4.2.2", + "react-colorful": "^5.1.2", + "telejson": "^7.2.0", + "tocbot": "^4.20.1", "ts-dedent": "^2.0.0", "util-deprecate": "^1.0.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-docs/node_modules/@storybook/types": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "8.1.10", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-docs/node_modules/fs-extra": { - "version": "11.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/addon-docs/node_modules/recast": { - "version": "0.23.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tiny-invariant": "^1.3.3", - "tslib": "^2.0.1" }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@storybook/addon-docs/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/addon-essentials": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/addon-actions": "8.1.10", - "@storybook/addon-backgrounds": "8.1.10", - "@storybook/addon-controls": "8.1.10", - "@storybook/addon-docs": "8.1.10", - "@storybook/addon-highlight": "8.1.10", - "@storybook/addon-measure": "8.1.10", - "@storybook/addon-outline": "8.1.10", - "@storybook/addon-toolbars": "8.1.10", - "@storybook/addon-viewport": "8.1.10", - "@storybook/core-common": "8.1.10", - "@storybook/manager-api": "8.1.10", - "@storybook/node-logger": "8.1.10", - "@storybook/preview-api": "8.1.10", - "ts-dedent": "^2.0.0" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } } }, - "node_modules/@storybook/addon-essentials/node_modules/@babel/traverse": { + "node_modules/@storybook/blocks/node_modules/@babel/traverse": { "version": "7.24.7", "dev": true, "license": "MIT", @@ -11048,7 +10652,7 @@ "node": ">=6.9.0" } }, - "node_modules/@storybook/addon-essentials/node_modules/@storybook/channels": { + "node_modules/@storybook/blocks/node_modules/@storybook/channels": { "version": "8.1.10", "dev": true, "license": "MIT", @@ -11064,7 +10668,7 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-essentials/node_modules/@storybook/client-logger": { + "node_modules/@storybook/blocks/node_modules/@storybook/client-logger": { "version": "8.1.10", "dev": true, "license": "MIT", @@ -11076,7 +10680,7 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-essentials/node_modules/@storybook/core-common": { + "node_modules/@storybook/blocks/node_modules/@storybook/core-common": { "version": "8.1.10", "dev": true, "license": "MIT", @@ -11124,7 +10728,7 @@ } } }, - "node_modules/@storybook/addon-essentials/node_modules/@storybook/core-events": { + "node_modules/@storybook/blocks/node_modules/@storybook/core-events": { "version": "8.1.10", "dev": true, "license": "MIT", @@ -11137,7 +10741,7 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-essentials/node_modules/@storybook/csf-tools": { + "node_modules/@storybook/blocks/node_modules/@storybook/csf-tools": { "version": "8.1.10", "dev": true, "license": "MIT", @@ -11157,7 +10761,26 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-essentials/node_modules/@storybook/node-logger": { + "node_modules/@storybook/blocks/node_modules/@storybook/docs-tools": { + "version": "8.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/core-common": "8.1.10", + "@storybook/core-events": "8.1.10", + "@storybook/preview-api": "8.1.10", + "@storybook/types": "8.1.10", + "@types/doctrine": "^0.0.3", + "assert": "^2.1.0", + "doctrine": "^3.0.0", + "lodash": "^4.17.21" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks/node_modules/@storybook/node-logger": { "version": "8.1.10", "dev": true, "license": "MIT", @@ -11166,7 +10789,7 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-essentials/node_modules/@storybook/preview-api": { + "node_modules/@storybook/blocks/node_modules/@storybook/preview-api": { "version": "8.1.10", "dev": true, "license": "MIT", @@ -11191,7 +10814,7 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-essentials/node_modules/@storybook/types": { + "node_modules/@storybook/blocks/node_modules/@storybook/types": { "version": "8.1.10", "dev": true, "license": "MIT", @@ -11205,7 +10828,7 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-essentials/node_modules/ansi-styles": { + "node_modules/@storybook/blocks/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", @@ -11219,7 +10842,19 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@storybook/addon-essentials/node_modules/brace-expansion": { + "node_modules/@storybook/blocks/node_modules/assert": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/@storybook/blocks/node_modules/brace-expansion": { "version": "2.0.1", "dev": true, "license": "MIT", @@ -11227,7 +10862,7 @@ "balanced-match": "^1.0.0" } }, - "node_modules/@storybook/addon-essentials/node_modules/chalk": { + "node_modules/@storybook/blocks/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", @@ -11242,7 +10877,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@storybook/addon-essentials/node_modules/color-convert": { + "node_modules/@storybook/blocks/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", @@ -11253,12 +10888,12 @@ "node": ">=7.0.0" } }, - "node_modules/@storybook/addon-essentials/node_modules/color-name": { + "node_modules/@storybook/blocks/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, - "node_modules/@storybook/addon-essentials/node_modules/crypto-random-string": { + "node_modules/@storybook/blocks/node_modules/crypto-random-string": { "version": "4.0.0", "dev": true, "license": "MIT", @@ -11272,7 +10907,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/addon-essentials/node_modules/crypto-random-string/node_modules/type-fest": { + "node_modules/@storybook/blocks/node_modules/crypto-random-string/node_modules/type-fest": { "version": "1.4.0", "dev": true, "license": "(MIT OR CC0-1.0)", @@ -11283,7 +10918,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/addon-essentials/node_modules/find-cache-dir": { + "node_modules/@storybook/blocks/node_modules/find-cache-dir": { "version": "3.3.2", "dev": true, "license": "MIT", @@ -11299,7 +10934,7 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/@storybook/addon-essentials/node_modules/find-cache-dir/node_modules/find-up": { + "node_modules/@storybook/blocks/node_modules/find-cache-dir/node_modules/find-up": { "version": "4.1.0", "dev": true, "license": "MIT", @@ -11311,7 +10946,7 @@ "node": ">=8" } }, - "node_modules/@storybook/addon-essentials/node_modules/find-cache-dir/node_modules/pkg-dir": { + "node_modules/@storybook/blocks/node_modules/find-cache-dir/node_modules/pkg-dir": { "version": "4.2.0", "dev": true, "license": "MIT", @@ -11322,7 +10957,7 @@ "node": ">=8" } }, - "node_modules/@storybook/addon-essentials/node_modules/fs-extra": { + "node_modules/@storybook/blocks/node_modules/fs-extra": { "version": "11.2.0", "dev": true, "license": "MIT", @@ -11335,7 +10970,7 @@ "node": ">=14.14" } }, - "node_modules/@storybook/addon-essentials/node_modules/glob": { + "node_modules/@storybook/blocks/node_modules/glob": { "version": "10.4.2", "dev": true, "license": "ISC", @@ -11357,7 +10992,7 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@storybook/addon-essentials/node_modules/has-flag": { + "node_modules/@storybook/blocks/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", @@ -11365,7 +11000,7 @@ "node": ">=8" } }, - "node_modules/@storybook/addon-essentials/node_modules/is-stream": { + "node_modules/@storybook/blocks/node_modules/is-stream": { "version": "3.0.0", "dev": true, "license": "MIT", @@ -11376,7 +11011,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/addon-essentials/node_modules/jackspeak": { + "node_modules/@storybook/blocks/node_modules/jackspeak": { "version": "3.4.0", "dev": true, "license": "BlueOak-1.0.0", @@ -11393,7 +11028,7 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/@storybook/addon-essentials/node_modules/locate-path": { + "node_modules/@storybook/blocks/node_modules/locate-path": { "version": "5.0.0", "dev": true, "license": "MIT", @@ -11404,7 +11039,7 @@ "node": ">=8" } }, - "node_modules/@storybook/addon-essentials/node_modules/make-dir": { + "node_modules/@storybook/blocks/node_modules/make-dir": { "version": "3.1.0", "dev": true, "license": "MIT", @@ -11418,7 +11053,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/addon-essentials/node_modules/make-dir/node_modules/semver": { + "node_modules/@storybook/blocks/node_modules/make-dir/node_modules/semver": { "version": "6.3.1", "dev": true, "license": "ISC", @@ -11426,7 +11061,7 @@ "semver": "bin/semver.js" } }, - "node_modules/@storybook/addon-essentials/node_modules/minimatch": { + "node_modules/@storybook/blocks/node_modules/minimatch": { "version": "9.0.4", "dev": true, "license": "ISC", @@ -11440,7 +11075,7 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@storybook/addon-essentials/node_modules/minipass": { + "node_modules/@storybook/blocks/node_modules/minipass": { "version": "7.1.2", "dev": true, "license": "ISC", @@ -11448,7 +11083,7 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/@storybook/addon-essentials/node_modules/p-limit": { + "node_modules/@storybook/blocks/node_modules/p-limit": { "version": "2.3.0", "dev": true, "license": "MIT", @@ -11462,7 +11097,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/addon-essentials/node_modules/p-locate": { + "node_modules/@storybook/blocks/node_modules/p-locate": { "version": "4.1.0", "dev": true, "license": "MIT", @@ -11473,7 +11108,7 @@ "node": ">=8" } }, - "node_modules/@storybook/addon-essentials/node_modules/path-exists": { + "node_modules/@storybook/blocks/node_modules/path-exists": { "version": "4.0.0", "dev": true, "license": "MIT", @@ -11481,7 +11116,7 @@ "node": ">=8" } }, - "node_modules/@storybook/addon-essentials/node_modules/recast": { + "node_modules/@storybook/blocks/node_modules/recast": { "version": "0.23.9", "dev": true, "license": "MIT", @@ -11496,7 +11131,7 @@ "node": ">= 4" } }, - "node_modules/@storybook/addon-essentials/node_modules/source-map": { + "node_modules/@storybook/blocks/node_modules/source-map": { "version": "0.6.1", "dev": true, "license": "BSD-3-Clause", @@ -11504,7 +11139,7 @@ "node": ">=0.10.0" } }, - "node_modules/@storybook/addon-essentials/node_modules/supports-color": { + "node_modules/@storybook/blocks/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", @@ -11515,7 +11150,7 @@ "node": ">=8" } }, - "node_modules/@storybook/addon-essentials/node_modules/temp-dir": { + "node_modules/@storybook/blocks/node_modules/temp-dir": { "version": "3.0.0", "dev": true, "license": "MIT", @@ -11523,7 +11158,7 @@ "node": ">=14.16" } }, - "node_modules/@storybook/addon-essentials/node_modules/tempy": { + "node_modules/@storybook/blocks/node_modules/tempy": { "version": "3.1.0", "dev": true, "license": "MIT", @@ -11540,7 +11175,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/addon-essentials/node_modules/type-fest": { + "node_modules/@storybook/blocks/node_modules/type-fest": { "version": "2.19.0", "dev": true, "license": "(MIT OR CC0-1.0)", @@ -11551,7 +11186,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/addon-essentials/node_modules/unique-string": { + "node_modules/@storybook/blocks/node_modules/unique-string": { "version": "3.0.0", "dev": true, "license": "MIT", @@ -11565,7 +11200,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/addon-essentials/node_modules/util": { + "node_modules/@storybook/blocks/node_modules/util": { "version": "0.12.5", "dev": true, "license": "MIT", @@ -11577,322 +11212,167 @@ "which-typed-array": "^1.1.2" } }, - "node_modules/@storybook/addon-highlight": { - "version": "8.1.10", + "node_modules/@storybook/builder-webpack5": { + "version": "8.1.6", "dev": true, "license": "MIT", "dependencies": { - "@storybook/global": "^5.0.0" + "@storybook/channels": "8.1.6", + "@storybook/client-logger": "8.1.6", + "@storybook/core-common": "8.1.6", + "@storybook/core-events": "8.1.6", + "@storybook/core-webpack": "8.1.6", + "@storybook/node-logger": "8.1.6", + "@storybook/preview": "8.1.6", + "@storybook/preview-api": "8.1.6", + "@types/node": "^18.0.0", + "@types/semver": "^7.3.4", + "browser-assert": "^1.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "cjs-module-lexer": "^1.2.3", + "constants-browserify": "^1.0.0", + "css-loader": "^6.7.1", + "es-module-lexer": "^1.5.0", + "express": "^4.17.3", + "fork-ts-checker-webpack-plugin": "^8.0.0", + "fs-extra": "^11.1.0", + "html-webpack-plugin": "^5.5.0", + "magic-string": "^0.30.5", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "semver": "^7.3.7", + "style-loader": "^3.3.1", + "terser-webpack-plugin": "^5.3.1", + "ts-dedent": "^2.0.0", + "url": "^0.11.0", + "util": "^0.12.4", + "util-deprecate": "^1.0.2", + "webpack": "5", + "webpack-dev-middleware": "^6.1.2", + "webpack-hot-middleware": "^2.25.1", + "webpack-virtual-modules": "^0.5.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@storybook/addon-measure": { - "version": "8.1.10", + "node_modules/@storybook/builder-webpack5/node_modules/@types/node": { + "version": "18.19.34", "dev": true, "license": "MIT", "dependencies": { - "@storybook/global": "^5.0.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "undici-types": "~5.26.4" } }, - "node_modules/@storybook/addon-outline": { - "version": "8.1.10", + "node_modules/@storybook/builder-webpack5/node_modules/fs-extra": { + "version": "11.2.0", "dev": true, "license": "MIT", "dependencies": { - "@storybook/global": "^5.0.0", - "ts-dedent": "^2.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "engines": { + "node": ">=14.14" } }, - "node_modules/@storybook/addon-toolbars": { - "version": "8.1.10", + "node_modules/@storybook/builder-webpack5/node_modules/path-browserify": { + "version": "1.0.1", "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } + "license": "MIT" }, - "node_modules/@storybook/addon-viewport": { - "version": "8.1.10", + "node_modules/@storybook/builder-webpack5/node_modules/style-loader": { + "version": "3.3.4", "dev": true, "license": "MIT", - "dependencies": { - "memoizerific": "^1.11.3" + "engines": { + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/storybook" + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "node_modules/@storybook/addon-webpack5-compiler-babel": { - "version": "3.0.3", + "node_modules/@storybook/builder-webpack5/node_modules/util": { + "version": "0.12.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.23.7", - "babel-loader": "^9.1.3" - }, - "engines": { - "node": ">=18" + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, - "node_modules/@storybook/blocks": { - "version": "8.1.10", + "node_modules/@storybook/channels": { + "version": "8.1.6", "dev": true, "license": "MIT", "dependencies": { - "@storybook/channels": "8.1.10", - "@storybook/client-logger": "8.1.10", - "@storybook/components": "8.1.10", - "@storybook/core-events": "8.1.10", - "@storybook/csf": "^0.1.7", - "@storybook/docs-tools": "8.1.10", + "@storybook/client-logger": "8.1.6", + "@storybook/core-events": "8.1.6", "@storybook/global": "^5.0.0", - "@storybook/icons": "^1.2.5", - "@storybook/manager-api": "8.1.10", - "@storybook/preview-api": "8.1.10", - "@storybook/theming": "8.1.10", - "@storybook/types": "8.1.10", - "@types/lodash": "^4.14.167", - "color-convert": "^2.0.1", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "markdown-to-jsx": "7.3.2", - "memoizerific": "^1.11.3", - "polished": "^4.2.2", - "react-colorful": "^5.1.2", "telejson": "^7.2.0", - "tocbot": "^4.20.1", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" + "tiny-invariant": "^1.3.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } } }, - "node_modules/@storybook/blocks/node_modules/@babel/traverse": { - "version": "7.24.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@storybook/blocks/node_modules/@storybook/channels": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/client-logger": "8.1.10", - "@storybook/core-events": "8.1.10", - "@storybook/global": "^5.0.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/blocks/node_modules/@storybook/client-logger": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/blocks/node_modules/@storybook/core-common": { - "version": "8.1.10", + "node_modules/@storybook/cli": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-8.3.0.tgz", + "integrity": "sha512-kR2x43BU/keIUPr+jHXK16BkhUXk+t4I6DgYgKyjYfFpjX2+tNYZ2b1f7RW+TjjUy4V6cf9FXl5N+GFmih8oiQ==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/core-events": "8.1.10", - "@storybook/csf-tools": "8.1.10", - "@storybook/node-logger": "8.1.10", - "@storybook/types": "8.1.10", - "@yarnpkg/fslib": "2.10.3", - "@yarnpkg/libzip": "2.3.0", + "@babel/core": "^7.24.4", + "@babel/types": "^7.24.0", + "@storybook/codemod": "8.3.0", + "@types/semver": "^7.3.4", "chalk": "^4.1.0", + "commander": "^12.1.0", + "create-storybook": "8.3.0", "cross-spawn": "^7.0.3", - "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0", - "esbuild-register": "^3.5.0", - "execa": "^5.0.0", - "file-system-cache": "2.3.0", - "find-cache-dir": "^3.0.0", + "envinfo": "^7.7.3", + "fd-package-json": "^1.2.0", "find-up": "^5.0.0", "fs-extra": "^11.1.0", + "giget": "^1.0.0", "glob": "^10.0.0", - "handlebars": "^4.7.7", - "lazy-universal-dotenv": "^4.0.0", - "node-fetch": "^2.0.0", - "picomatch": "^2.3.0", - "pkg-dir": "^5.0.0", - "prettier-fallback": "npm:prettier@^3", - "pretty-hrtime": "^1.0.3", - "resolve-from": "^5.0.0", + "globby": "^14.0.1", + "jscodeshift": "^0.15.1", + "leven": "^3.1.0", + "prompts": "^2.4.0", "semver": "^7.3.7", - "tempy": "^3.1.0", + "storybook": "8.3.0", "tiny-invariant": "^1.3.1", - "ts-dedent": "^2.0.0", - "util": "^0.12.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "prettier": "^2 || ^3" - }, - "peerDependenciesMeta": { - "prettier": { - "optional": true - } - } - }, - "node_modules/@storybook/blocks/node_modules/@storybook/core-events": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/csf": "^0.1.7", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/blocks/node_modules/@storybook/csf-tools": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/generator": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "@storybook/csf": "^0.1.7", - "@storybook/types": "8.1.10", - "fs-extra": "^11.1.0", - "recast": "^0.23.5", "ts-dedent": "^2.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/blocks/node_modules/@storybook/docs-tools": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/core-common": "8.1.10", - "@storybook/core-events": "8.1.10", - "@storybook/preview-api": "8.1.10", - "@storybook/types": "8.1.10", - "@types/doctrine": "^0.0.3", - "assert": "^2.1.0", - "doctrine": "^3.0.0", - "lodash": "^4.17.21" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/blocks/node_modules/@storybook/node-logger": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/blocks/node_modules/@storybook/preview-api": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "8.1.10", - "@storybook/client-logger": "8.1.10", - "@storybook/core-events": "8.1.10", - "@storybook/csf": "^0.1.7", - "@storybook/global": "^5.0.0", - "@storybook/types": "8.1.10", - "@types/qs": "^6.9.5", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "tiny-invariant": "^1.3.1", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/blocks/node_modules/@storybook/types": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "8.1.10", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" + "bin": { + "cli": "bin/index.cjs" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/blocks/node_modules/ansi-styles": { + "node_modules/@storybook/cli/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -11905,28 +11385,20 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@storybook/blocks/node_modules/assert": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, - "node_modules/@storybook/blocks/node_modules/brace-expansion": { + "node_modules/@storybook/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, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, - "node_modules/@storybook/blocks/node_modules/chalk": { + "node_modules/@storybook/cli/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -11940,8 +11412,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@storybook/blocks/node_modules/color-convert": { + "node_modules/@storybook/cli/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11951,77 +11425,17 @@ "node": ">=7.0.0" } }, - "node_modules/@storybook/blocks/node_modules/color-name": { + "node_modules/@storybook/cli/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, - "node_modules/@storybook/blocks/node_modules/crypto-random-string": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/blocks/node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/blocks/node_modules/find-cache-dir": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/@storybook/blocks/node_modules/find-cache-dir/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/blocks/node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/blocks/node_modules/fs-extra": { + "node_modules/@storybook/cli/node_modules/fs-extra": { "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "license": "MIT", "dependencies": { @@ -12033,8 +11447,10 @@ "node": ">=14.14" } }, - "node_modules/@storybook/blocks/node_modules/glob": { - "version": "10.4.2", + "node_modules/@storybook/cli/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "license": "ISC", "dependencies": { @@ -12048,42 +11464,50 @@ "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@storybook/blocks/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/@storybook/cli/node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/blocks/node_modules/is-stream": { - "version": "3.0.0", + "node_modules/@storybook/cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/@storybook/blocks/node_modules/jackspeak": { - "version": "3.4.0", + "node_modules/@storybook/cli/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -12091,41 +11515,50 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/@storybook/blocks/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/@storybook/cli/node_modules/jscodeshift": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz", + "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "@babel/core": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/preset-flow": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@babel/register": "^7.22.15", + "babel-core": "^7.0.0-bridge.0", + "chalk": "^4.1.2", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "neo-async": "^2.5.0", + "node-dir": "^0.1.17", + "recast": "^0.23.3", + "temp": "^0.8.4", + "write-file-atomic": "^2.3.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/blocks/node_modules/make-dir": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" + "bin": { + "jscodeshift": "bin/jscodeshift.js" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/preset-env": "^7.1.6" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/blocks/node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "peerDependenciesMeta": { + "@babel/preset-env": { + "optional": true + } } }, - "node_modules/@storybook/blocks/node_modules/minimatch": { - "version": "9.0.4", + "node_modules/@storybook/cli/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -12138,49 +11571,33 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@storybook/blocks/node_modules/minipass": { + "node_modules/@storybook/cli/node_modules/minipass": { "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, - "node_modules/@storybook/blocks/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/@storybook/cli/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "dev": true, "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/blocks/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/blocks/node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/blocks/node_modules/recast": { + "node_modules/@storybook/cli/node_modules/recast": { "version": "0.23.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", + "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -12194,16 +11611,33 @@ "node": ">= 4" } }, - "node_modules/@storybook/blocks/node_modules/source-map": { + "node_modules/@storybook/cli/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/cli/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/@storybook/blocks/node_modules/supports-color": { + "node_modules/@storybook/cli/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -12213,545 +11647,48 @@ "node": ">=8" } }, - "node_modules/@storybook/blocks/node_modules/temp-dir": { - "version": "3.0.0", + "node_modules/@storybook/client-logger": { + "version": "8.1.6", "dev": true, "license": "MIT", - "engines": { - "node": ">=14.16" + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/blocks/node_modules/tempy": { - "version": "3.1.0", + "node_modules/@storybook/codemod": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-8.3.0.tgz", + "integrity": "sha512-WwHgQLJw02eflkAzkUfuNP8Hu7Z12E6diUN2AWDXVYZJXyJjYhivGzONt2inrHhT3LTB9iSNVo0WsDE9AZU9RA==", "dev": true, "license": "MIT", "dependencies": { - "is-stream": "^3.0.0", - "temp-dir": "^3.0.0", - "type-fest": "^2.12.2", - "unique-string": "^3.0.0" - }, - "engines": { - "node": ">=14.16" + "@babel/core": "^7.24.4", + "@babel/preset-env": "^7.24.4", + "@babel/types": "^7.24.0", + "@storybook/core": "8.3.0", + "@storybook/csf": "^0.1.11", + "@types/cross-spawn": "^6.0.2", + "cross-spawn": "^7.0.3", + "globby": "^14.0.1", + "jscodeshift": "^0.15.1", + "lodash": "^4.17.21", + "prettier": "^3.1.1", + "recast": "^0.23.5", + "tiny-invariant": "^1.3.1" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/blocks/node_modules/type-fest": { - "version": "2.19.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/blocks/node_modules/unique-string": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/blocks/node_modules/util": { - "version": "0.12.5", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/@storybook/builder-webpack5": { - "version": "8.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "8.1.6", - "@storybook/client-logger": "8.1.6", - "@storybook/core-common": "8.1.6", - "@storybook/core-events": "8.1.6", - "@storybook/core-webpack": "8.1.6", - "@storybook/node-logger": "8.1.6", - "@storybook/preview": "8.1.6", - "@storybook/preview-api": "8.1.6", - "@types/node": "^18.0.0", - "@types/semver": "^7.3.4", - "browser-assert": "^1.2.1", - "case-sensitive-paths-webpack-plugin": "^2.4.0", - "cjs-module-lexer": "^1.2.3", - "constants-browserify": "^1.0.0", - "css-loader": "^6.7.1", - "es-module-lexer": "^1.5.0", - "express": "^4.17.3", - "fork-ts-checker-webpack-plugin": "^8.0.0", - "fs-extra": "^11.1.0", - "html-webpack-plugin": "^5.5.0", - "magic-string": "^0.30.5", - "path-browserify": "^1.0.1", - "process": "^0.11.10", - "semver": "^7.3.7", - "style-loader": "^3.3.1", - "terser-webpack-plugin": "^5.3.1", - "ts-dedent": "^2.0.0", - "url": "^0.11.0", - "util": "^0.12.4", - "util-deprecate": "^1.0.2", - "webpack": "5", - "webpack-dev-middleware": "^6.1.2", - "webpack-hot-middleware": "^2.25.1", - "webpack-virtual-modules": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@types/node": { - "version": "18.19.34", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/fs-extra": { - "version": "11.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/path-browserify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/builder-webpack5/node_modules/style-loader": { - "version": "3.3.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/util": { - "version": "0.12.5", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/@storybook/channels": { - "version": "8.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/client-logger": "8.1.6", - "@storybook/core-events": "8.1.6", - "@storybook/global": "^5.0.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/cli": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-8.3.0.tgz", - "integrity": "sha512-kR2x43BU/keIUPr+jHXK16BkhUXk+t4I6DgYgKyjYfFpjX2+tNYZ2b1f7RW+TjjUy4V6cf9FXl5N+GFmih8oiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.4", - "@babel/types": "^7.24.0", - "@storybook/codemod": "8.3.0", - "@types/semver": "^7.3.4", - "chalk": "^4.1.0", - "commander": "^12.1.0", - "create-storybook": "8.3.0", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fd-package-json": "^1.2.0", - "find-up": "^5.0.0", - "fs-extra": "^11.1.0", - "giget": "^1.0.0", - "glob": "^10.0.0", - "globby": "^14.0.1", - "jscodeshift": "^0.15.1", - "leven": "^3.1.0", - "prompts": "^2.4.0", - "semver": "^7.3.7", - "storybook": "8.3.0", - "tiny-invariant": "^1.3.1", - "ts-dedent": "^2.0.0" - }, - "bin": { - "cli": "bin/index.cjs" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@storybook/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, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@storybook/cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@storybook/cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@storybook/cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/cli/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/cli/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/cli/node_modules/globby": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/cli/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/@storybook/cli/node_modules/jscodeshift": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz", - "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/preset-flow": "^7.22.15", - "@babel/preset-typescript": "^7.23.0", - "@babel/register": "^7.22.15", - "babel-core": "^7.0.0-bridge.0", - "chalk": "^4.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.23.3", - "temp": "^0.8.4", - "write-file-atomic": "^2.3.0" - }, - "bin": { - "jscodeshift": "bin/jscodeshift.js" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - }, - "peerDependenciesMeta": { - "@babel/preset-env": { - "optional": true - } - } - }, - "node_modules/@storybook/cli/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/cli/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@storybook/cli/node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/cli/node_modules/recast": { - "version": "0.23.9", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", - "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tiny-invariant": "^1.3.3", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@storybook/cli/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/cli/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/client-logger": { - "version": "8.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/codemod": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-8.3.0.tgz", - "integrity": "sha512-WwHgQLJw02eflkAzkUfuNP8Hu7Z12E6diUN2AWDXVYZJXyJjYhivGzONt2inrHhT3LTB9iSNVo0WsDE9AZU9RA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.4", - "@babel/preset-env": "^7.24.4", - "@babel/types": "^7.24.0", - "@storybook/core": "8.3.0", - "@storybook/csf": "^0.1.11", - "@types/cross-spawn": "^6.0.2", - "cross-spawn": "^7.0.3", - "globby": "^14.0.1", - "jscodeshift": "^0.15.1", - "lodash": "^4.17.21", - "prettier": "^3.1.1", - "recast": "^0.23.5", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/codemod/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@storybook/codemod/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -13527,27 +12464,6 @@ "which-typed-array": "^1.1.2" } }, - "node_modules/@storybook/core/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@storybook/csf": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz", @@ -15422,6 +14338,7 @@ }, "node_modules/@tootallnate/once": { "version": "2.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 10" @@ -16239,11 +15156,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/shimmer": { - "version": "1.0.5", - "license": "MIT", - "peer": true - }, "node_modules/@types/sockjs": { "version": "0.3.36", "dev": true, @@ -17623,37 +16535,6 @@ "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.1.tgz", "integrity": "sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==" }, - "node_modules/applicationinsights": { - "version": "2.7.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@azure/core-auth": "^1.5.0", - "@azure/core-rest-pipeline": "1.10.1", - "@azure/core-util": "1.2.0", - "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.5", - "@microsoft/applicationinsights-web-snippet": "^1.0.1", - "@opentelemetry/api": "^1.4.1", - "@opentelemetry/core": "^1.15.2", - "@opentelemetry/sdk-trace-base": "^1.15.2", - "@opentelemetry/semantic-conventions": "^1.15.2", - "cls-hooked": "^4.2.2", - "continuation-local-storage": "^3.2.1", - "diagnostic-channel": "1.1.1", - "diagnostic-channel-publishers": "1.0.7" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "applicationinsights-native-metrics": "*" - }, - "peerDependenciesMeta": { - "applicationinsights-native-metrics": { - "optional": true - } - } - }, "node_modules/aproba": { "version": "1.2.0", "devOptional": true, @@ -17829,6 +16710,7 @@ }, "node_modules/array-uniq": { "version": "1.0.3", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -17980,37 +16862,6 @@ "node": ">=0.12.0" } }, - "node_modules/async-hook-jl": { - "version": "1.7.6", - "license": "MIT", - "peer": true, - "dependencies": { - "stack-chain": "^1.3.7" - }, - "engines": { - "node": "^4.7 || >=6.9 || >=7.3" - } - }, - "node_modules/async-listener": { - "version": "0.6.10", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "semver": "^5.3.0", - "shimmer": "^1.1.0" - }, - "engines": { - "node": "<=0.11.8 || >0.11.10" - } - }, - "node_modules/async-listener/node_modules/semver": { - "version": "5.7.2", - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/asynciterator.prototype": { "version": "1.0.0", "dev": true, @@ -19907,19 +18758,6 @@ "node": ">=6.0" } }, - "node_modules/chromium-edge-launcher": { - "version": "1.0.0", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, "node_modules/chromium-pickle-js": { "version": "0.2.0", "dev": true, @@ -19950,6 +18788,7 @@ }, "node_modules/cjs-module-lexer": { "version": "1.2.3", + "dev": true, "license": "MIT" }, "node_modules/classnames": { @@ -20096,27 +18935,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cls-hooked": { - "version": "4.2.2", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "async-hook-jl": "^1.7.6", - "emitter-listener": "^1.0.1", - "semver": "^5.4.1" - }, - "engines": { - "node": "^4.7 || >=6.9 || >=7.3 || >=8.2.1" - } - }, - "node_modules/cls-hooked/node_modules/semver": { - "version": "5.7.2", - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/clsx": { "version": "2.0.0", "license": "MIT", @@ -20671,15 +19489,6 @@ "node": ">= 0.6" } }, - "node_modules/continuation-local-storage": { - "version": "3.2.1", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "async-listener": "^0.6.0", - "emitter-listener": "^1.1.1" - } - }, "node_modules/convert-source-map": { "version": "2.0.0", "license": "MIT" @@ -21360,7 +20169,8 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/csv-writer/-/csv-writer-1.6.0.tgz", "integrity": "sha512-NOx7YDFWEsM/fTRAJjRpPp8t+MKRVvniAg9wQlUKx20MFrPs73WLJhFf5iteqrxNYnsy924K3Iroh3yNHeYd2g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/dag-map": { "version": "1.0.2", @@ -21806,34 +20616,6 @@ "dev": true, "license": "MIT" }, - "node_modules/diagnostic-channel": { - "version": "1.1.1", - "license": "MIT", - "peer": true, - "dependencies": { - "semver": "^7.5.3" - } - }, - "node_modules/diagnostic-channel-publishers": { - "version": "1.0.7", - "license": "MIT", - "peer": true, - "peerDependencies": { - "diagnostic-channel": "*" - } - }, - "node_modules/diagnostic-channel/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/diff": { "version": "4.0.2", "dev": true, @@ -22384,14 +21166,6 @@ "version": "1.4.723", "license": "ISC" }, - "node_modules/emitter-listener": { - "version": "1.1.2", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "shimmer": "^1.2.0" - } - }, "node_modules/emittery": { "version": "0.13.1", "dev": true, @@ -25613,119 +24387,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-monorepo-packages": { - "version": "1.2.0", - "license": "MIT", - "peer": true, - "dependencies": { - "globby": "^7.1.1", - "load-json-file": "^4.0.0" - } - }, - "node_modules/get-monorepo-packages/node_modules/array-union": { - "version": "1.0.2", - "license": "MIT", - "peer": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-monorepo-packages/node_modules/dir-glob": { - "version": "2.2.2", - "license": "MIT", - "peer": true, - "dependencies": { - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-monorepo-packages/node_modules/globby": { - "version": "7.1.1", - "license": "MIT", - "peer": true, - "dependencies": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-monorepo-packages/node_modules/ignore": { - "version": "3.3.10", - "license": "MIT", - "peer": true - }, - "node_modules/get-monorepo-packages/node_modules/load-json-file": { - "version": "4.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-monorepo-packages/node_modules/parse-json": { - "version": "4.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-monorepo-packages/node_modules/path-type": { - "version": "3.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-monorepo-packages/node_modules/pify": { - "version": "3.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-monorepo-packages/node_modules/slash": { - "version": "1.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-monorepo-packages/node_modules/strip-bom": { - "version": "3.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/get-nonce": { "version": "1.0.1", "dev": true, @@ -26248,17 +24909,6 @@ "hermes-estree": "0.22.0" } }, - "node_modules/hermes-profile-transformer": { - "version": "0.0.6", - "license": "MIT", - "peer": true, - "dependencies": { - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "license": "BSD-3-Clause", @@ -26470,6 +25120,7 @@ }, "node_modules/http-proxy-agent": { "version": "5.0.0", + "dev": true, "license": "MIT", "dependencies": { "@tootallnate/once": "2", @@ -26769,36 +25420,6 @@ "node": ">=4" } }, - "node_modules/import-in-the-middle": { - "version": "1.4.2", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "acorn": "^8.8.2", - "acorn-import-assertions": "^1.9.0", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/import-in-the-middle/node_modules/acorn": { - "version": "8.11.3", - "license": "MIT", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/import-in-the-middle/node_modules/acorn-import-assertions": { - "version": "1.9.0", - "license": "MIT", - "peer": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/import-local": { "version": "3.1.0", "dev": true, @@ -28725,27 +27346,6 @@ "node": ">=12" } }, - "node_modules/jest-environment-jsdom/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/jest-environment-jsdom/node_modules/xml-name-validator": { "version": "4.0.0", "dev": true, @@ -31213,17 +29813,6 @@ "tmpl": "1.0.5" } }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "license": "MIT", - "peer": true, - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/map-or-similar": { "version": "1.5.0", "dev": true, @@ -31359,19 +29948,6 @@ "node": ">= 0.6" } }, - "node_modules/mem": { - "version": "4.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/memfs": { "version": "4.6.0", "dev": true, @@ -31954,26 +30530,6 @@ "node": ">=8" } }, - "node_modules/metro/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -32206,11 +30762,6 @@ "node": ">=0.4.0" } }, - "node_modules/module-details-from-path": { - "version": "1.0.3", - "license": "MIT", - "peer": true - }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -32240,14 +30791,6 @@ "version": "1.0.0", "license": "MIT" }, - "node_modules/mustache": { - "version": "4.2.0", - "license": "MIT", - "peer": true, - "bin": { - "mustache": "bin/mustache" - } - }, "node_modules/mz": { "version": "2.7.0", "license": "MIT", @@ -33190,14 +31733,6 @@ "node": ">=8" } }, - "node_modules/p-defer": { - "version": "1.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/p-finally": { "version": "1.0.0", "license": "MIT", @@ -33205,14 +31740,6 @@ "node": ">=4" } }, - "node_modules/p-is-promise": { - "version": "2.1.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/p-limit": { "version": "3.1.0", "license": "MIT", @@ -33774,1842 +32301,442 @@ "dependencies": { "p-limit": "^2.0.0" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/plist": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/plist/node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/plist/node_modules/xmlbuilder": { - "version": "15.1.1", - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/pngjs": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/polished": { - "version": "4.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.17.8" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/portfinder": { - "version": "1.0.32", - "dev": true, - "license": "MIT", - "dependencies": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/async": { - "version": "2.6.4", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/portfinder/node_modules/mkdirp": { - "version": "0.5.6", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.38", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/potpack": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-fallback": { - "name": "prettier", - "version": "3.3.2", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/process": { - "version": "0.11.10", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/progress": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise": { - "version": "7.3.1", - "license": "MIT", - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/promise-retry/node_modules/retry": { - "version": "0.12.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/propagate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/protocol-buffers-schema": { - "version": "3.6.0", - "license": "MIT" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "dev": true, - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "6.0.4", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/pusher-js": { - "version": "8.3.0", - "license": "MIT", - "dependencies": { - "tweetnacl": "^1.0.3" - } - }, - "node_modules/pusher-js-mock": { - "version": "0.3.8", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.2.4" - } - }, - "node_modules/qrcode": { - "version": "1.5.3", - "license": "MIT", - "dependencies": { - "dijkstrajs": "^1.0.1", - "encode-utf8": "^1.0.3", - "pngjs": "^5.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "qrcode": "bin/qrcode" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/qrcode-terminal": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", - "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/query-string": { - "version": "7.1.3", - "license": "MIT", - "dependencies": { - "decode-uri-component": "^0.2.2", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/queue": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/quickselect": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/quill-delta": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-diff": "^1.3.0", - "lodash.clonedeep": "^4.5.0", - "lodash.isequal": "^4.5.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/raf-schd": { - "version": "4.0.3", - "license": "MIT" - }, - "node_modules/ramda": { - "version": "0.29.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rbush": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "quickselect": "^2.0.0" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-beautiful-dnd": { - "version": "13.1.1", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.9.2", - "css-box-model": "^1.2.0", - "memoize-one": "^5.1.1", - "raf-schd": "^4.0.2", - "react-redux": "^7.2.0", - "redux": "^4.0.4", - "use-memo-one": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.5 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-collapse": { - "version": "5.1.1", - "license": "MIT", - "peerDependencies": { - "react": ">=16.3.0" - } - }, - "node_modules/react-colorful": { - "version": "5.6.1", - "dev": true, - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/react-compiler-healthcheck": { - "version": "19.0.0-beta-8a03594-20241020", - "resolved": "https://registry.npmjs.org/react-compiler-healthcheck/-/react-compiler-healthcheck-19.0.0-beta-8a03594-20241020.tgz", - "integrity": "sha512-wupgZ4fASQ+oRI88V6QIERKCHZUo6322LXlH8EotsWQDc8c4EXgPdkZHO/zH+zDh4Np4qZM36bFbZgHPXtI0FA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.24.4", - "@babel/parser": "^7.24.4", - "chalk": "4", - "fast-glob": "^3.3.2", - "ora": "5.4.1", - "yargs": "^17.7.2", - "zod": "^3.22.4", - "zod-validation-error": "^3.0.3" - }, - "bin": { - "react-compiler-healthcheck": "dist/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.0.0 || >= 18.0.0" - } - }, - "node_modules/react-compiler-healthcheck/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/react-compiler-healthcheck/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/react-compiler-healthcheck/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/react-compiler-healthcheck/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/react-compiler-healthcheck/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-compiler-healthcheck/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-compiler-runtime": { - "version": "19.0.0-beta-8a03594-20241020", - "resolved": "https://registry.npmjs.org/react-compiler-runtime/-/react-compiler-runtime-19.0.0-beta-8a03594-20241020.tgz", - "integrity": "sha512-YWl8SjxsWGU1dpxHvWS0vxTkpeLXTZ/Y7IVzwZGj6yAfXOEie1MduuAR0TFiGeV0RxFLp5jKUIWl+ZglN4dMQw==", - "dev": true, - "peerDependencies": { - "react": "^18.2.0 || ^19.0.0" - } - }, - "node_modules/react-content-loader": { - "version": "7.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, - "node_modules/react-docgen": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.18.9", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9", - "@types/babel__core": "^7.18.0", - "@types/babel__traverse": "^7.18.0", - "@types/doctrine": "^0.0.9", - "@types/resolve": "^1.20.2", - "doctrine": "^3.0.0", - "resolve": "^1.22.1", - "strip-indent": "^4.0.0" - }, - "engines": { - "node": ">=16.14.0" - } - }, - "node_modules/react-docgen-typescript": { - "version": "2.2.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "typescript": ">= 4.3.x" - } - }, - "node_modules/react-docgen/node_modules/@types/doctrine": { - "version": "0.0.9", - "dev": true, - "license": "MIT" - }, - "node_modules/react-docgen/node_modules/strip-indent": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.23.2", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/react-element-to-jsx-string": { - "version": "15.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@base2/pretty-print-object": "1.0.1", - "is-plain-object": "5.0.0", - "react-is": "18.1.0" - }, - "peerDependencies": { - "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", - "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0" - } - }, - "node_modules/react-element-to-jsx-string/node_modules/react-is": { - "version": "18.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/react-error-boundary": { - "version": "4.0.11", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "peerDependencies": { - "react": ">=16.13.1" - } - }, - "node_modules/react-fast-pdf": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/react-fast-pdf/-/react-fast-pdf-1.0.15.tgz", - "integrity": "sha512-xXrwIfRUD3KSRrBdfAeGnLZTf0kYUa+d6GGee1Hu0PFAv5QPBeF3tcV+DU+Cm/JMjSuR7s5g0KK9bePQ/xiQ+w==", - "dependencies": { - "react-pdf": "^9.1.1", - "react-window": "^1.8.10" - }, - "engines": { - "node": ">=20.10.0", - "npm": ">=10.2.3" - }, - "peerDependencies": { - "lodash": "4.x", - "pdfjs-dist": "4.x", - "react": "18.x", - "react-dom": "18.x" - } - }, - "node_modules/react-freeze": { - "version": "1.0.3", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": ">=17.0.0" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "license": "MIT" - }, - "node_modules/react-map-gl": { - "version": "7.1.3", - "license": "MIT", - "dependencies": { - "@maplibre/maplibre-gl-style-spec": "^19.2.1", - "@types/mapbox-gl": ">=1.0.0" - }, - "peerDependencies": { - "mapbox-gl": ">=1.13.0", - "maplibre-gl": ">=1.13.0", - "react": ">=16.3.0", - "react-dom": ">=16.3.0" - }, - "peerDependenciesMeta": { - "mapbox-gl": { - "optional": true - }, - "maplibre-gl": { - "optional": true - } - } - }, - "node_modules/react-native": { - "version": "0.75.2", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.75.2.tgz", - "integrity": "sha512-pP+Yswd/EurzAlKizytRrid9LJaPJzuNldc+o5t01md2VLHym8V7FWH2z9omFKtFTer8ERg0fAhG1fpd0Qq6bQ==", - "dependencies": { - "@jest/create-cache-key-function": "^29.6.3", - "@react-native-community/cli": "14.0.0", - "@react-native-community/cli-platform-android": "14.0.0", - "@react-native-community/cli-platform-ios": "14.0.0", - "@react-native/assets-registry": "0.75.2", - "@react-native/codegen": "0.75.2", - "@react-native/community-cli-plugin": "0.75.2", - "@react-native/gradle-plugin": "0.75.2", - "@react-native/js-polyfills": "0.75.2", - "@react-native/normalize-colors": "0.75.2", - "@react-native/virtualized-lists": "0.75.2", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "base64-js": "^1.5.1", - "chalk": "^4.0.0", - "event-target-shim": "^5.0.1", - "flow-enums-runtime": "^0.0.6", - "glob": "^7.1.1", - "invariant": "^2.2.4", - "jest-environment-node": "^29.6.3", - "jsc-android": "^250231.0.0", - "memoize-one": "^5.0.0", - "metro-runtime": "^0.80.3", - "metro-source-map": "^0.80.3", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1", - "pretty-format": "^26.5.2", - "promise": "^8.3.0", - "react-devtools-core": "^5.3.1", - "react-refresh": "^0.14.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.24.0-canary-efb381bbf-20230505", - "semver": "^7.1.3", - "stacktrace-parser": "^0.1.10", - "whatwg-fetch": "^3.0.0", - "ws": "^6.2.2", - "yargs": "^17.6.2" - }, - "bin": { - "react-native": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^18.2.6", - "react": "^18.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-native-android-location-enabler": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">= 16.0.0" - }, - "peerDependencies": { - "react": ">= 18.2.0", - "react-native": ">= 0.71.0" - } - }, - "node_modules/react-native-animatable": { - "version": "1.3.3", - "license": "MIT", - "dependencies": { - "prop-types": "^15.7.2" - } - }, - "node_modules/react-native-app-logs": { - "version": "0.3.1", - "resolved": "git+ssh://git@github.com/margelo/react-native-app-logs.git#7e9c311bffdc6a9eeb69d90d30ead47e01c3552a", - "integrity": "sha512-GFZFbUe9bUIbuH2zTAS7JAXCAIYnyf4cTnsz6pSzYCl3F+nF+O3fRa5ZM8P7zr+wTG7fZoVs0b6XFfcFUcxY2A==", - "workspaces": [ - "example" - ], - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-blob-util": { - "version": "0.19.4", - "license": "MIT", - "dependencies": { - "base-64": "0.1.0", - "glob": "^7.2.3" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-blob-util/node_modules/glob": { - "version": "7.2.3", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/react-native-clean-project": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "bin": { - "react-native-clean-project": "source/index.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/react-native-collapsible": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/react-native-collapsible/-/react-native-collapsible-1.6.2.tgz", - "integrity": "sha512-MCOBVJWqHNjnDaGkvxX997VONmJeebh6wyJxnHEgg0L1PrlcXU1e/bo6eK+CDVFuMrCafw8Qh4DOv/C4V/+Iew==", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-config": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/react-native-config/-/react-native-config-1.5.3.tgz", - "integrity": "sha512-3D05Abgk5DfDw9w258EzXvX5AkU7eqj3u9H0H0L4gUga4nYg/zuupcrpGbpF4QeXBcJ84jjs6g8JaEP6VBT7Pg==", - "peerDependencies": { - "react-native-windows": ">=0.61" - }, - "peerDependenciesMeta": { - "react-native-windows": { - "optional": true - } - } - }, - "node_modules/react-native-device-info": { - "version": "10.3.1", - "license": "MIT", - "peerDependencies": { - "react-native": "*" - } - }, - "node_modules/react-native-document-picker": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/react-native-document-picker/-/react-native-document-picker-9.3.1.tgz", - "integrity": "sha512-Vcofv9wfB0j67zawFjfq9WQPMMzXxOZL9kBmvWDpjVuEcVK73ndRmlXHlkeFl5ZHVsv4Zb6oZYhqm9u5omJOPA==", - "dependencies": { - "invariant": "^2.2.4" - }, - "peerDependencies": { - "react": "*", - "react-native": "*", - "react-native-windows": "*" - }, - "peerDependenciesMeta": { - "react-native-windows": { - "optional": true - } - } - }, - "node_modules/react-native-draggable-flatlist": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "@babel/preset-typescript": "^7.17.12" - }, - "peerDependencies": { - "react-native": ">=0.64.0", - "react-native-gesture-handler": ">=2.0.0", - "react-native-reanimated": ">=2.8.0" - } - }, - "node_modules/react-native-fs": { - "version": "2.20.0", - "license": "MIT", - "dependencies": { - "base-64": "^0.1.0", - "utf8": "^3.0.0" - }, - "peerDependencies": { - "react-native": "*", - "react-native-windows": "*" - }, - "peerDependenciesMeta": { - "react-native-windows": { - "optional": true - } - } - }, - "node_modules/react-native-gesture-handler": { - "version": "2.18.0", - "license": "MIT", - "dependencies": { - "@egjs/hammerjs": "^2.0.17", - "hoist-non-react-statics": "^3.3.0", - "invariant": "^2.2.4", - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-google-places-autocomplete": { - "version": "2.5.6", - "license": "MIT", - "dependencies": { - "lodash.debounce": "^4.0.8", - "prop-types": "^15.7.2", - "qs": "~6.9.1" - }, - "peerDependencies": { - "react-native": ">= 0.59" - } - }, - "node_modules/react-native-google-places-autocomplete/node_modules/qs": { - "version": "6.9.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/react-native-haptic-feedback": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/react-native-haptic-feedback/-/react-native-haptic-feedback-2.3.3.tgz", - "integrity": "sha512-svS4D5PxfNv8o68m9ahWfwje5NqukM3qLS48+WTdhbDkNUkOhP9rDfDSRHzlhk4zq+ISjyw95EhLeh8NkKX5vQ==", - "workspaces": [ - "example" - ], - "peerDependencies": { - "react-native": ">=0.60.0" - } - }, - "node_modules/react-native-image-picker": { - "version": "7.0.3", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-image-size": { - "version": "1.1.3", - "resolved": "git+ssh://git@github.com/Expensify/react-native-image-size.git#cb392140db4953a283590d7cf93b4d0461baa2a9", - "integrity": "sha512-kF/8fGsKoOnjPZceipRUaM9Xg9a/aKXU2Vm5eHYEKHrRt8FP39oCbaELPTb/vUKRTu1HmEGffDFzRT02BcdzYQ==" - }, - "node_modules/react-native-is-edge-to-edge": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.1.6.tgz", - "integrity": "sha512-1pHnFTlBahins6UAajXUqeCOHew9l9C2C8tErnpGC3IyLJzvxD+TpYAixnCbrVS52f7+NvMttbiSI290XfwN0w==", - "license": "MIT", - "peerDependencies": { - "react": ">=18.2.0", - "react-native": ">=0.73.0" - } - }, - "node_modules/react-native-key-command": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.1", - "underscore": "^1.13.4" - }, - "peerDependencies": { - "react": "^18.1.0", - "react-dom": "18.1.0", - "react-native": "^0.70.4", - "react-native-web": "^0.19.7" - } - }, - "node_modules/react-native-key-command/node_modules/eventemitter3": { - "version": "5.0.1", - "license": "MIT" - }, - "node_modules/react-native-keyboard-controller": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/react-native-keyboard-controller/-/react-native-keyboard-controller-1.14.4.tgz", - "integrity": "sha512-hVt9KhK2dxBNtk4xHTnKLeO9Jv7v5h2TZlIeCQkbBLMd5NIJa4ll0GxIpbuutjP1ctPdhXUVpCfQzgXXJOYlzw==", - "license": "MIT", - "dependencies": { - "react-native-is-edge-to-edge": "^1.1.6" - }, - "peerDependencies": { - "react": "*", - "react-native": "*", - "react-native-reanimated": ">=3.0.0" - } - }, - "node_modules/react-native-launch-arguments": { - "version": "4.0.2", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.1", - "react-native": ">=0.60.0-rc.0 <1.0.x" - } - }, - "node_modules/react-native-localize": { - "version": "2.2.6", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.6", - "react-native": ">=0.60.0", - "react-native-macos": ">=0.64.0", - "react-native-windows": ">=0.62.0" - }, - "peerDependenciesMeta": { - "react-native-macos": { - "optional": true - }, - "react-native-windows": { - "optional": true - } - } - }, - "node_modules/react-native-macos": { - "version": "0.73.24", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/create-cache-key-function": "^29.6.3", - "@react-native-community/cli": "12.3.6", - "@react-native-community/cli-platform-android": "12.3.6", - "@react-native-community/cli-platform-ios": "12.3.6", - "@react-native-mac/virtualized-lists": "^0.73.3", - "@react-native/assets-registry": "0.73.1", - "@react-native/codegen": "0.73.3", - "@react-native/community-cli-plugin": "0.73.17", - "@react-native/gradle-plugin": "0.73.4", - "@react-native/js-polyfills": "0.73.1", - "@react-native/normalize-colors": "0.73.2", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "base64-js": "^1.5.1", - "chalk": "^4.0.0", - "deprecated-react-native-prop-types": "^5.0.0", - "event-target-shim": "^5.0.1", - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "jest-environment-node": "^29.6.3", - "jsc-android": "^250231.0.0", - "memoize-one": "^5.0.0", - "metro-runtime": "^0.80.3", - "metro-source-map": "^0.80.3", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1", - "pretty-format": "^26.5.2", - "promise": "^8.3.0", - "react-devtools-core": "^4.27.7", - "react-refresh": "^0.14.0", - "react-shallow-renderer": "^16.15.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.24.0-canary-efb381bbf-20230505", - "stacktrace-parser": "^0.1.10", - "whatwg-fetch": "^3.0.0", - "ws": "^6.2.2", - "yargs": "^17.6.2" - }, - "bin": { - "react-native-macos": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "18.2.0" + "engines": { + "node": ">=6" } }, - "node_modules/react-native-macos/node_modules/@jest/types": { - "version": "26.6.2", + "node_modules/plist": { + "version": "3.1.0", "license": "MIT", - "peer": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" }, "engines": { - "node": ">= 10.14.2" + "node": ">=10.4.0" } }, - "node_modules/react-native-macos/node_modules/@react-native-community/cli": { - "version": "12.3.6", + "node_modules/plist/node_modules/@xmldom/xmldom": { + "version": "0.8.10", "license": "MIT", - "peer": true, - "dependencies": { - "@react-native-community/cli-clean": "12.3.6", - "@react-native-community/cli-config": "12.3.6", - "@react-native-community/cli-debugger-ui": "12.3.6", - "@react-native-community/cli-doctor": "12.3.6", - "@react-native-community/cli-hermes": "12.3.6", - "@react-native-community/cli-plugin-metro": "12.3.6", - "@react-native-community/cli-server-api": "12.3.6", - "@react-native-community/cli-tools": "12.3.6", - "@react-native-community/cli-types": "12.3.6", - "chalk": "^4.1.2", - "commander": "^9.4.1", - "deepmerge": "^4.3.0", - "execa": "^5.0.0", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0", - "graceful-fs": "^4.1.3", - "prompts": "^2.4.2", - "semver": "^7.5.2" - }, - "bin": { - "react-native": "build/bin.js" - }, "engines": { - "node": ">=18" + "node": ">=10.0.0" } }, - "node_modules/react-native-macos/node_modules/@react-native-community/cli-clean": { - "version": "12.3.6", + "node_modules/plist/node_modules/xmlbuilder": { + "version": "15.1.1", "license": "MIT", - "peer": true, - "dependencies": { - "@react-native-community/cli-tools": "12.3.6", - "chalk": "^4.1.2", - "execa": "^5.0.0" + "engines": { + "node": ">=8.0" } }, - "node_modules/react-native-macos/node_modules/@react-native-community/cli-config": { - "version": "12.3.6", + "node_modules/pngjs": { + "version": "5.0.0", "license": "MIT", - "peer": true, - "dependencies": { - "@react-native-community/cli-tools": "12.3.6", - "chalk": "^4.1.2", - "cosmiconfig": "^5.1.0", - "deepmerge": "^4.3.0", - "glob": "^7.1.3", - "joi": "^17.2.1" + "engines": { + "node": ">=10.13.0" } }, - "node_modules/react-native-macos/node_modules/@react-native-community/cli-doctor": { - "version": "12.3.6", + "node_modules/polished": { + "version": "4.3.1", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@react-native-community/cli-config": "12.3.6", - "@react-native-community/cli-platform-android": "12.3.6", - "@react-native-community/cli-platform-ios": "12.3.6", - "@react-native-community/cli-tools": "12.3.6", - "chalk": "^4.1.2", - "command-exists": "^1.2.8", - "deepmerge": "^4.3.0", - "envinfo": "^7.10.0", - "execa": "^5.0.0", - "hermes-profile-transformer": "^0.0.6", - "node-stream-zip": "^1.9.1", - "ora": "^5.4.1", - "semver": "^7.5.2", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1", - "yaml": "^2.2.1" + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" } }, - "node_modules/react-native-macos/node_modules/@react-native-community/cli-hermes": { - "version": "12.3.6", + "node_modules/portfinder": { + "version": "1.0.32", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@react-native-community/cli-platform-android": "12.3.6", - "@react-native-community/cli-tools": "12.3.6", - "chalk": "^4.1.2", - "hermes-profile-transformer": "^0.0.6" + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" } }, - "node_modules/react-native-macos/node_modules/@react-native-community/cli-platform-android": { - "version": "12.3.6", + "node_modules/portfinder/node_modules/async": { + "version": "2.6.4", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@react-native-community/cli-tools": "12.3.6", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-xml-parser": "^4.2.4", - "glob": "^7.1.3", - "logkitty": "^0.7.1" + "lodash": "^4.17.14" } }, - "node_modules/react-native-macos/node_modules/@react-native-community/cli-platform-ios": { - "version": "12.3.6", + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@react-native-community/cli-tools": "12.3.6", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-xml-parser": "^4.0.12", - "glob": "^7.1.3", - "ora": "^5.4.1" + "ms": "^2.1.1" } }, - "node_modules/react-native-macos/node_modules/@react-native-community/cli-types": { - "version": "12.3.6", + "node_modules/portfinder/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "joi": "^17.2.1" + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/react-native-macos/node_modules/@react-native/assets-registry": { - "version": "0.73.1", + "node_modules/possible-typed-array-names": { + "version": "1.0.0", "license": "MIT", - "peer": true, "engines": { - "node": ">=18" + "node": ">= 0.4" } }, - "node_modules/react-native-macos/node_modules/@react-native/babel-plugin-codegen": { - "version": "0.73.4", + "node_modules/postcss": { + "version": "8.4.38", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "peer": true, "dependencies": { - "@react-native/codegen": "0.73.3" + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" }, "engines": { - "node": ">=18" + "node": "^10 || ^12 || >=14" } }, - "node_modules/react-native-macos/node_modules/@react-native/babel-preset": { - "version": "0.73.21", + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-async-generator-functions": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.18.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", - "@babel/plugin-proposal-numeric-separator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.20.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "@react-native/babel-plugin-codegen": "0.73.4", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" + "node": ">=4" } }, - "node_modules/react-native-macos/node_modules/@react-native/codegen": { - "version": "0.73.3", + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/potpack": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@babel/parser": "^7.20.0", - "flow-parser": "^0.206.0", - "glob": "^7.1.1", - "invariant": "^2.2.4", - "jscodeshift": "^0.14.0", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1" - }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" + "node": ">= 0.8.0" } }, - "node_modules/react-native-macos/node_modules/@react-native/community-cli-plugin": { - "version": "0.73.17", + "node_modules/prettier": { + "version": "2.8.8", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@react-native-community/cli-server-api": "12.3.6", - "@react-native-community/cli-tools": "12.3.6", - "@react-native/dev-middleware": "0.73.8", - "@react-native/metro-babel-transformer": "0.73.15", - "chalk": "^4.0.0", - "execa": "^5.1.1", - "metro": "^0.80.3", - "metro-config": "^0.80.3", - "metro-core": "^0.80.3", - "node-fetch": "^2.2.0", - "readline": "^1.3.0" + "bin": { + "prettier": "bin-prettier.js" }, "engines": { - "node": ">=18" + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/react-native-macos/node_modules/@react-native/debugger-frontend": { - "version": "0.73.3", - "license": "BSD-3-Clause", - "peer": true, + "node_modules/prettier-fallback": { + "name": "prettier", + "version": "3.3.2", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, "engines": { - "node": ">=18" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/react-native-macos/node_modules/@react-native/dev-middleware": { - "version": "0.73.8", + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.73.3", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^1.0.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "node-fetch": "^2.2.0", - "open": "^7.0.3", - "serve-static": "^1.13.1", - "temp-dir": "^2.0.0", - "ws": "^6.2.2" + "fast-diff": "^1.1.2" }, "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/react-native-macos/node_modules/@react-native/gradle-plugin": { - "version": "0.73.4", - "license": "MIT", - "peer": true, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "engines": { - "node": ">=18" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-native-macos/node_modules/@react-native/js-polyfills": { - "version": "0.73.1", + "node_modules/pretty-error": { + "version": "4.0.0", + "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" } }, - "node_modules/react-native-macos/node_modules/@react-native/metro-babel-transformer": { - "version": "0.73.15", + "node_modules/pretty-format": { + "version": "29.7.0", "license": "MIT", - "peer": true, "dependencies": { - "@babel/core": "^7.20.0", - "@react-native/babel-preset": "0.73.21", - "hermes-parser": "0.15.0", - "nullthrows": "^1.1.1" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/react-native-macos/node_modules/@react-native/normalize-colors": { - "version": "0.73.2", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", "license": "MIT", - "peer": true + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "node_modules/react-native-macos/node_modules/@types/yargs": { - "version": "15.0.19", + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" + "engines": { + "node": ">= 0.8" } }, - "node_modules/react-native-macos/node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/process": { + "version": "0.11.10", "license": "MIT", - "peer": true, "engines": { - "node": ">=8" + "node": ">= 0.6.0" } }, - "node_modules/react-native-macos/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=0.4.0" } }, - "node_modules/react-native-macos/node_modules/chalk": { - "version": "4.1.2", + "node_modules/promise": { + "version": "7.3.1", "license": "MIT", - "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "asap": "~2.0.3" } }, - "node_modules/react-native-macos/node_modules/color-convert": { + "node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { "version": "2.0.1", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "color-name": "~1.1.4" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=10" } }, - "node_modules/react-native-macos/node_modules/color-name": { - "version": "1.1.4", - "license": "MIT", - "peer": true - }, - "node_modules/react-native-macos/node_modules/commander": { - "version": "9.5.0", + "node_modules/promise-retry/node_modules/retry": { + "version": "0.12.0", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": "^12.20.0 || >=14" + "node": ">= 4" } }, - "node_modules/react-native-macos/node_modules/cosmiconfig": { - "version": "5.2.1", + "node_modules/prompts": { + "version": "2.4.2", "license": "MIT", - "peer": true, "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/react-native-macos/node_modules/debug": { - "version": "2.6.9", + "node_modules/prop-types": { + "version": "15.8.1", "license": "MIT", - "peer": true, "dependencies": { - "ms": "2.0.0" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "node_modules/react-native-macos/node_modules/deprecated-react-native-prop-types": { - "version": "5.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-native/normalize-colors": "^0.73.0", - "invariant": "^2.2.4", - "prop-types": "^15.8.1" - }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true, "engines": { - "node": ">=18" + "node": ">= 8" } }, - "node_modules/react-native-macos/node_modules/find-up": { - "version": "4.1.0", + "node_modules/protocol-buffers-schema": { + "version": "3.6.0", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">=8" + "node": ">= 0.10" } }, - "node_modules/react-native-macos/node_modules/flow-parser": { - "version": "0.206.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.4.0" - } + "node_modules/psl": { + "version": "1.9.0", + "dev": true, + "license": "MIT" }, - "node_modules/react-native-macos/node_modules/fs-extra": { - "version": "8.1.0", + "node_modules/pump": { + "version": "3.0.0", "license": "MIT", - "peer": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/react-native-macos/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/punycode": { + "version": "2.3.1", "license": "MIT", - "peer": true, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/react-native-macos/node_modules/hermes-estree": { - "version": "0.15.0", - "license": "MIT", - "peer": true + "node_modules/pure-rand": { + "version": "6.0.4", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" }, - "node_modules/react-native-macos/node_modules/hermes-parser": { - "version": "0.15.0", + "node_modules/pusher-js": { + "version": "8.3.0", "license": "MIT", - "peer": true, "dependencies": { - "hermes-estree": "0.15.0" + "tweetnacl": "^1.0.3" } }, - "node_modules/react-native-macos/node_modules/import-fresh": { - "version": "2.0.0", + "node_modules/pusher-js-mock": { + "version": "0.3.8", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, "engines": { - "node": ">=4" - } - }, - "node_modules/react-native-macos/node_modules/jsonfile": { - "version": "4.0.0", - "license": "MIT", - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node": ">=4.2.4" } }, - "node_modules/react-native-macos/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/qrcode": { + "version": "1.5.3", "license": "MIT", - "peer": true, "dependencies": { - "p-locate": "^4.1.0" + "dijkstrajs": "^1.0.1", + "encode-utf8": "^1.0.3", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" }, "engines": { - "node": ">=8" + "node": ">=10.13.0" } }, - "node_modules/react-native-macos/node_modules/mkdirp": { - "version": "0.5.6", - "license": "MIT", - "peer": true, - "dependencies": { - "minimist": "^1.2.6" - }, + "node_modules/qrcode-terminal": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", + "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", "bin": { - "mkdirp": "bin/cmd.js" + "qrcode-terminal": "bin/qrcode-terminal.js" } }, - "node_modules/react-native-macos/node_modules/ms": { - "version": "2.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/react-native-macos/node_modules/open": { - "version": "7.4.2", - "license": "MIT", - "peer": true, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "side-channel": "^1.0.6" }, "engines": { - "node": ">=8" + "node": ">=0.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-native-macos/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/query-string": { + "version": "7.1.3", "license": "MIT", - "peer": true, "dependencies": { - "p-try": "^2.0.0" + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" }, "engines": { "node": ">=6" @@ -35618,549 +32745,489 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-native-macos/node_modules/p-locate": { - "version": "4.1.0", - "license": "MIT", - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, + "node_modules/querystring": { + "version": "0.2.0", + "dev": true, "engines": { - "node": ">=8" + "node": ">=0.4.x" } }, - "node_modules/react-native-macos/node_modules/parse-json": { - "version": "4.0.0", + "node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/queue": { + "version": "6.0.2", "license": "MIT", - "peer": true, "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" + "inherits": "~2.0.3" } }, - "node_modules/react-native-macos/node_modules/path-exists": { - "version": "4.0.0", + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-native-macos/node_modules/pretty-format": { - "version": "26.6.2", + "node_modules/quickselect": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/quill-delta": { + "version": "5.1.0", + "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" + "fast-diff": "^1.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" }, "engines": { - "node": ">= 10" + "node": ">= 12.0.0" } }, - "node_modules/react-native-macos/node_modules/promise": { - "version": "8.3.0", + "node_modules/raf-schd": { + "version": "4.0.3", + "license": "MIT" + }, + "node_modules/ramda": { + "version": "0.29.0", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "asap": "~2.0.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" } }, - "node_modules/react-native-macos/node_modules/react-devtools-core": { - "version": "4.28.5", + "node_modules/randombytes": { + "version": "2.1.0", "license": "MIT", - "peer": true, "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" + "safe-buffer": "^5.1.0" } }, - "node_modules/react-native-macos/node_modules/react-is": { - "version": "17.0.2", - "license": "MIT", - "peer": true - }, - "node_modules/react-native-macos/node_modules/resolve-from": { - "version": "3.0.0", + "node_modules/range-parser": { + "version": "1.2.1", "license": "MIT", - "peer": true, "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/react-native-macos/node_modules/strip-ansi": { - "version": "5.2.0", + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "ansi-regex": "^4.1.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/react-native-macos/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "4.1.1", + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/react-native-macos/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/react-native-macos/node_modules/universalify": { - "version": "0.1.2", + "node_modules/rbush": { + "version": "3.0.1", "license": "MIT", - "peer": true, - "engines": { - "node": ">= 4.0.0" + "dependencies": { + "quickselect": "^2.0.0" } }, - "node_modules/react-native-macos/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "peer": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "bin": { + "rc": "cli.js" } }, - "node_modules/react-native-modal": { - "version": "13.0.1", - "license": "MIT", - "dependencies": { - "prop-types": "^15.6.2", - "react-native-animatable": "1.3.3" - }, - "peerDependencies": { - "react": "*", - "react-native": ">=0.65.0" + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/react-native-onyx": { - "version": "2.0.81", - "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-2.0.81.tgz", - "integrity": "sha512-EwBqruX4lLnlk3KyZp4bst/voekLJFus7UhtvKmDuqR2Iz/FremwE04JW6YxGyc7C6KpbQrCFdWg/oF9ptRAtg==", + "node_modules/react": { + "version": "18.3.1", "license": "MIT", "dependencies": { - "ascii-table": "0.0.9", - "fast-equals": "^4.0.3", - "lodash.bindall": "^4.4.0", - "lodash.clone": "^4.5.0", - "lodash.pick": "^4.4.0", - "lodash.transform": "^4.6.0", - "underscore": "^1.13.6" + "loose-envify": "^1.1.0" }, "engines": { - "node": ">=20.18.0", - "npm": ">=10.8.2" - }, - "peerDependencies": { - "idb-keyval": "^6.2.1", - "react": ">=18.1.0", - "react-dom": ">=18.1.0", - "react-native-device-info": "^10.3.0", - "react-native-performance": "^5.1.0", - "react-native-quick-sqlite": "^8.0.0-beta.2" - }, - "peerDependenciesMeta": { - "idb-keyval": { - "optional": true - }, - "react-native-device-info": { - "optional": true - }, - "react-native-performance": { - "optional": true - }, - "react-native-quick-sqlite": { - "optional": true - } - } - }, - "node_modules/react-native-pager-view": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-6.5.0.tgz", - "integrity": "sha512-Buqc5mjCgIem7aIQU/seMKqhQr98YvBqRNilnoBb8hNGhCaQTE2yvYDwUhOytowyOkjCstLv7Fap2jcLm/k3Bw==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" + "node": ">=0.10.0" } }, - "node_modules/react-native-pdf": { - "version": "6.7.3", - "license": "MIT", + "node_modules/react-beautiful-dnd": { + "version": "13.1.1", + "license": "Apache-2.0", "dependencies": { - "crypto-js": "4.2.0", - "deprecated-react-native-prop-types": "^2.3.0" + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" }, "peerDependencies": { - "react": "*", - "react-native": "*", - "react-native-blob-util": ">=0.13.7" + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" } }, - "node_modules/react-native-performance": { - "version": "5.1.0", + "node_modules/react-collapse": { + "version": "5.1.1", "license": "MIT", "peerDependencies": { - "react-native": "*" + "react": ">=16.3.0" } }, - "node_modules/react-native-permissions": { - "version": "3.10.1", + "node_modules/react-colorful": { + "version": "5.6.1", + "dev": true, "license": "MIT", "peerDependencies": { - "react": ">=16.13.1", - "react-native": ">=0.63.3", - "react-native-windows": ">=0.62.0" - }, - "peerDependenciesMeta": { - "react-native-windows": { - "optional": true - } + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/react-native-picker-select": { - "version": "8.1.0", - "resolved": "git+ssh://git@github.com/Expensify/react-native-picker-select.git#da50d2c5c54e268499047f9cc98b8df4196c1ddf", - "integrity": "sha512-iASqj8cXSQY+P3ZhfW1eoVcK0UB+TRTddrNSQ3lmIH0a4lYO3m4XJC+cnoCjjPl/sTzUaShpOnpBfqMueR6UMA==", + "node_modules/react-compiler-healthcheck": { + "version": "19.0.0-beta-8a03594-20241020", + "resolved": "https://registry.npmjs.org/react-compiler-healthcheck/-/react-compiler-healthcheck-19.0.0-beta-8a03594-20241020.tgz", + "integrity": "sha512-wupgZ4fASQ+oRI88V6QIERKCHZUo6322LXlH8EotsWQDc8c4EXgPdkZHO/zH+zDh4Np4qZM36bFbZgHPXtI0FA==", + "dev": true, "dependencies": { - "lodash.isequal": "^4.5.0" + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "chalk": "4", + "fast-glob": "^3.3.2", + "ora": "5.4.1", + "yargs": "^17.7.2", + "zod": "^3.22.4", + "zod-validation-error": "^3.0.3" }, - "peerDependencies": { - "@react-native-picker/picker": ">=2.1.0" + "bin": { + "react-compiler-healthcheck": "dist/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.0.0 || >= 18.0.0" } }, - "node_modules/react-native-plaid-link-sdk": { - "version": "11.11.0", + "node_modules/react-compiler-healthcheck/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-qrcode-svg": { - "version": "6.3.11", - "resolved": "https://registry.npmjs.org/react-native-qrcode-svg/-/react-native-qrcode-svg-6.3.11.tgz", - "integrity": "sha512-bhjh4KT8NTQjJyu/tGaplR53OIqtvUJcWZ713H++GLKRpldNDyywwLVW+HdlGZ3N7jk3TxCchQMDMzndLlV4sA==", "dependencies": { - "prop-types": "^15.8.0", - "qrcode": "^1.5.1", - "text-encoding": "^0.7.0" + "color-convert": "^2.0.1" }, - "peerDependencies": { - "react": "*", - "react-native": ">=0.63.4", - "react-native-svg": ">=13.2.0" - } - }, - "node_modules/react-native-quick-sqlite": { - "version": "8.1.0", - "resolved": "git+ssh://git@github.com/margelo/react-native-nitro-sqlite.git#99f34ebefa91698945f3ed26622e002bd79489e0", - "integrity": "sha512-7uuHmOEnc6SOAVoAdvkQhvaYhUZMORM75qo+v6PZoH6Qk21j5CmrcxJE3gNh0FhMfxK73hQ3ZtugC/NI2jVhrw==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/react-native-reanimated": { - "version": "3.16.1", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.16.1.tgz", - "integrity": "sha512-Wnbo7toHZ6kPLAD8JWKoKCTfNoqYOMW5vUEP76Rr4RBmJCrdXj6oauYP0aZnZq8NCbiP5bwwu7+RECcWtoetnQ==", + "node_modules/react-compiler-healthcheck/node_modules/chalk": { + "version": "4.1.2", + "dev": true, "license": "MIT", "dependencies": { - "@babel/plugin-transform-arrow-functions": "^7.0.0-0", - "@babel/plugin-transform-class-properties": "^7.0.0-0", - "@babel/plugin-transform-classes": "^7.0.0-0", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.0.0-0", - "@babel/plugin-transform-optional-chaining": "^7.0.0-0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", - "@babel/plugin-transform-template-literals": "^7.0.0-0", - "@babel/plugin-transform-unicode-regex": "^7.0.0-0", - "@babel/preset-typescript": "^7.16.7", - "convert-source-map": "^2.0.0", - "invariant": "^2.2.4" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0", - "react": "*", - "react-native": "*" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/react-native-release-profiler": { - "version": "0.2.1", + "node_modules/react-compiler-healthcheck/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, "license": "MIT", - "workspaces": [ - "example" - ], "dependencies": { - "commander": "^11.1.0", - "hermes-profile-transformer": "^0.0.9" - }, - "bin": { - "react-native-release-profiler": "lib/commonjs/cli.js" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 18.0.0" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" + "node": ">=7.0.0" } }, - "node_modules/react-native-release-profiler/node_modules/commander": { - "version": "11.1.0", + "node_modules/react-compiler-healthcheck/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/react-compiler-healthcheck/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=16" + "node": ">=8" } }, - "node_modules/react-native-release-profiler/node_modules/hermes-profile-transformer": { - "version": "0.0.9", + "node_modules/react-compiler-healthcheck/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, "license": "MIT", "dependencies": { - "source-map": "^0.7.3" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/react-native-render-html": { - "version": "6.3.1", - "license": "BSD-2-Clause", - "dependencies": { - "@jsamr/counter-style": "^2.0.1", - "@jsamr/react-native-li": "^2.3.0", - "@native-html/transient-render-engine": "11.2.2", - "@types/ramda": "^0.27.40", - "@types/urijs": "^1.19.15", - "prop-types": "^15.5.7", - "ramda": "^0.27.1", - "stringify-entities": "^3.1.0", - "urijs": "^1.19.6" - }, + "node_modules/react-compiler-runtime": { + "version": "19.0.0-beta-8a03594-20241020", + "resolved": "https://registry.npmjs.org/react-compiler-runtime/-/react-compiler-runtime-19.0.0-beta-8a03594-20241020.tgz", + "integrity": "sha512-YWl8SjxsWGU1dpxHvWS0vxTkpeLXTZ/Y7IVzwZGj6yAfXOEie1MduuAR0TFiGeV0RxFLp5jKUIWl+ZglN4dMQw==", + "dev": true, "peerDependencies": { - "react": "*", - "react-native": "*" + "react": "^18.2.0 || ^19.0.0" } }, - "node_modules/react-native-render-html/node_modules/@native-html/transient-render-engine": { - "version": "11.2.2", + "node_modules/react-content-loader": { + "version": "7.0.0", "license": "MIT", - "dependencies": { - "@native-html/css-processor": "1.11.0", - "@types/ramda": "^0.27.44", - "csstype": "^3.0.9", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.2", - "domutils": "^2.8.0", - "htmlparser2": "^7.1.2", - "ramda": "^0.27.1" + "engines": { + "node": ">=10" }, "peerDependencies": { - "@types/react-native": "*", - "react-native": "^*" - } - }, - "node_modules/react-native-render-html/node_modules/ramda": { - "version": "0.27.2", - "license": "MIT" - }, - "node_modules/react-native-safe-area-context": { - "version": "4.10.9", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" + "react": ">=16.0.0" } }, - "node_modules/react-native-screens": { - "version": "3.34.0", + "node_modules/react-docgen": { + "version": "7.0.3", + "dev": true, "license": "MIT", "dependencies": { - "react-freeze": "^1.0.0", - "warn-once": "^0.1.0" + "@babel/core": "^7.18.9", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", + "@types/babel__core": "^7.18.0", + "@types/babel__traverse": "^7.18.0", + "@types/doctrine": "^0.0.9", + "@types/resolve": "^1.20.2", + "doctrine": "^3.0.0", + "resolve": "^1.22.1", + "strip-indent": "^4.0.0" }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-share": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-11.0.2.tgz", - "integrity": "sha512-7W7sb9qd8RjVEIMhbYc3MU//qGUNxf1XAqd3SlO/ivz89ed1jP1yUwYOcUK2Kf1NDY/kwWbPCkEKa6ZGVlcsOQ==", "engines": { - "node": ">=16" + "node": ">=16.14.0" } }, - "node_modules/react-native-sound": { - "version": "0.11.2", + "node_modules/react-docgen-typescript": { + "version": "2.2.2", + "dev": true, "license": "MIT", "peerDependencies": { - "react-native": ">=0.8.0" + "typescript": ">= 4.3.x" } }, - "node_modules/react-native-svg": { - "version": "15.9.0", - "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.9.0.tgz", - "integrity": "sha512-pwo7hteAM0P8jNpPGQtiSd0SnbBhE8tNd94LT8AcZcbnH5AJdXBIcXU4+tWYYeGUjiNAH2E5d0T5XIfnvaz1gA==", + "node_modules/react-docgen/node_modules/@types/doctrine": { + "version": "0.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/react-docgen/node_modules/strip-indent": { + "version": "4.0.0", + "dev": true, "license": "MIT", "dependencies": { - "css-select": "^5.1.0", - "css-tree": "^1.1.3", - "warn-once": "0.1.1" + "min-indent": "^1.0.1" }, - "peerDependencies": { - "react": "*", - "react-native": "*" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-native-tab-view": { - "version": "3.5.2", + "node_modules/react-dom": { + "version": "18.3.1", "license": "MIT", "dependencies": { - "use-latest-callback": "^0.1.5" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "*", - "react-native": "*", - "react-native-pager-view": "*" + "react": "^18.3.1" } }, - "node_modules/react-native-url-polyfill": { - "version": "2.0.0", + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.23.2", "license": "MIT", "dependencies": { - "whatwg-url-without-unicode": "8.0.0-3" + "loose-envify": "^1.1.0" + } + }, + "node_modules/react-element-to-jsx-string": { + "version": "15.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@base2/pretty-print-object": "1.0.1", + "is-plain-object": "5.0.0", + "react-is": "18.1.0" }, "peerDependencies": { - "react-native": "*" + "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", + "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0" } }, - "node_modules/react-native-view-shot": { - "version": "3.8.0", + "node_modules/react-element-to-jsx-string/node_modules/react-is": { + "version": "18.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/react-error-boundary": { + "version": "4.0.11", "license": "MIT", "dependencies": { - "html2canvas": "^1.4.1" + "@babel/runtime": "^7.12.5" }, "peerDependencies": { - "react": "*", - "react-native": "*" + "react": ">=16.13.1" } }, - "node_modules/react-native-vision-camera": { - "version": "4.0.0-beta.13", + "node_modules/react-fast-pdf": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/react-fast-pdf/-/react-fast-pdf-1.0.20.tgz", + "integrity": "sha512-E2PJOO5oEqi6eNPllNOlQ8y0DiLZ3AW8t+MCN7AgJPp5pY04SeDveXHWvPN0nPU4X5sRBZ7CejeYce2QMMQDyg==", "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*", - "react-native-worklets-core": "*" + "dependencies": { + "react-pdf": "^9.1.1", + "react-window": "^1.8.10" }, - "peerDependenciesMeta": { - "react-native-worklets-core": { - "optional": true - } + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + }, + "peerDependencies": { + "lodash": "4.x", + "pdfjs-dist": "4.x", + "react": "18.x", + "react-dom": "18.x" } }, - "node_modules/react-native-web": { - "version": "0.19.13", - "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.19.13.tgz", - "integrity": "sha512-etv3bN8rJglrRCp/uL4p7l8QvUNUC++QwDbdZ8CB7BvZiMvsxfFIRM1j04vxNldG3uo2puRd6OSWR3ibtmc29A==", - "dependencies": { - "@babel/runtime": "^7.18.6", - "@react-native/normalize-colors": "^0.74.1", - "fbjs": "^3.0.4", - "inline-style-prefixer": "^6.0.1", - "memoize-one": "^6.0.0", - "nullthrows": "^1.1.1", - "postcss-value-parser": "^4.2.0", - "styleq": "^0.1.3" + "node_modules/react-freeze": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">=10" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": ">=17.0.0" } }, - "node_modules/react-native-web/node_modules/memoize-one": { - "version": "6.0.0", + "node_modules/react-is": { + "version": "18.3.1", "license": "MIT" }, - "node_modules/react-native-webview": { - "version": "13.8.6", + "node_modules/react-map-gl": { + "version": "7.1.3", "license": "MIT", "dependencies": { - "escape-string-regexp": "2.0.0", - "invariant": "2.2.4" + "@maplibre/maplibre-gl-style-spec": "^19.2.1", + "@types/mapbox-gl": ">=1.0.0" }, "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-webview/node_modules/escape-string-regexp": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=8" + "mapbox-gl": ">=1.13.0", + "maplibre-gl": ">=1.13.0", + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + }, + "peerDependenciesMeta": { + "mapbox-gl": { + "optional": true + }, + "maplibre-gl": { + "optional": true + } } }, - "node_modules/react-native-windows": { - "version": "0.73.11", - "license": "MIT", - "peer": true, + "node_modules/react-native": { + "version": "0.75.2", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.75.2.tgz", + "integrity": "sha512-pP+Yswd/EurzAlKizytRrid9LJaPJzuNldc+o5t01md2VLHym8V7FWH2z9omFKtFTer8ERg0fAhG1fpd0Qq6bQ==", "dependencies": { - "@babel/runtime": "^7.0.0", "@jest/create-cache-key-function": "^29.6.3", - "@react-native-community/cli": "12.3.6", - "@react-native-community/cli-platform-android": "12.3.6", - "@react-native-community/cli-platform-ios": "12.3.6", - "@react-native-windows/cli": "0.73.2", - "@react-native/assets-registry": "0.73.1", - "@react-native/codegen": "0.73.3", - "@react-native/community-cli-plugin": "0.73.17", - "@react-native/gradle-plugin": "0.73.4", - "@react-native/js-polyfills": "0.73.1", - "@react-native/normalize-colors": "0.73.2", - "@react-native/virtualized-lists": "0.73.4", + "@react-native-community/cli": "14.0.0", + "@react-native-community/cli-platform-android": "14.0.0", + "@react-native-community/cli-platform-ios": "14.0.0", + "@react-native/assets-registry": "0.75.2", + "@react-native/codegen": "0.75.2", + "@react-native/community-cli-plugin": "0.75.2", + "@react-native/gradle-plugin": "0.75.2", + "@react-native/js-polyfills": "0.75.2", + "@react-native/normalize-colors": "0.75.2", + "@react-native/virtualized-lists": "0.75.2", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "base64-js": "^1.5.1", "chalk": "^4.0.0", - "deprecated-react-native-prop-types": "^5.0.0", "event-target-shim": "^5.0.1", "flow-enums-runtime": "^0.0.6", + "glob": "^7.1.1", "invariant": "^2.2.4", "jest-environment-node": "^29.6.3", "jsc-android": "^250231.0.0", @@ -36171,725 +33238,698 @@ "nullthrows": "^1.1.1", "pretty-format": "^26.5.2", "promise": "^8.3.0", - "react-devtools-core": "^4.27.7", + "react-devtools-core": "^5.3.1", "react-refresh": "^0.14.0", - "react-shallow-renderer": "^16.15.0", "regenerator-runtime": "^0.13.2", "scheduler": "0.24.0-canary-efb381bbf-20230505", - "source-map-support": "^0.5.19", + "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0", "ws": "^6.2.2", "yargs": "^17.6.2" }, + "bin": { + "react-native": "cli.js" + }, "engines": { - "node": ">= 18" + "node": ">=18" }, "peerDependencies": { - "react": "18.2.0", - "react-native": "^0.73.0" + "@types/react": "^18.2.6", + "react": "^18.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/react-native-windows/node_modules/@jest/types": { - "version": "26.6.2", + "node_modules/react-native-android-location-enabler": { + "version": "2.0.1", "license": "MIT", - "peer": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, "engines": { - "node": ">= 10.14.2" + "node": ">= 16.0.0" + }, + "peerDependencies": { + "react": ">= 18.2.0", + "react-native": ">= 0.71.0" } }, - "node_modules/react-native-windows/node_modules/@react-native-community/cli": { - "version": "12.3.6", + "node_modules/react-native-animatable": { + "version": "1.3.3", "license": "MIT", - "peer": true, "dependencies": { - "@react-native-community/cli-clean": "12.3.6", - "@react-native-community/cli-config": "12.3.6", - "@react-native-community/cli-debugger-ui": "12.3.6", - "@react-native-community/cli-doctor": "12.3.6", - "@react-native-community/cli-hermes": "12.3.6", - "@react-native-community/cli-plugin-metro": "12.3.6", - "@react-native-community/cli-server-api": "12.3.6", - "@react-native-community/cli-tools": "12.3.6", - "@react-native-community/cli-types": "12.3.6", - "chalk": "^4.1.2", - "commander": "^9.4.1", - "deepmerge": "^4.3.0", - "execa": "^5.0.0", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0", - "graceful-fs": "^4.1.3", - "prompts": "^2.4.2", - "semver": "^7.5.2" - }, - "bin": { - "react-native": "build/bin.js" - }, - "engines": { - "node": ">=18" + "prop-types": "^15.7.2" } }, - "node_modules/react-native-windows/node_modules/@react-native-community/cli-clean": { - "version": "12.3.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-native-community/cli-tools": "12.3.6", - "chalk": "^4.1.2", - "execa": "^5.0.0" + "node_modules/react-native-app-logs": { + "version": "0.3.1", + "resolved": "git+ssh://git@github.com/margelo/react-native-app-logs.git#7e9c311bffdc6a9eeb69d90d30ead47e01c3552a", + "integrity": "sha512-GFZFbUe9bUIbuH2zTAS7JAXCAIYnyf4cTnsz6pSzYCl3F+nF+O3fRa5ZM8P7zr+wTG7fZoVs0b6XFfcFUcxY2A==", + "workspaces": [ + "example" + ], + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/@react-native-community/cli-config": { - "version": "12.3.6", + "node_modules/react-native-blob-util": { + "version": "0.19.4", "license": "MIT", - "peer": true, "dependencies": { - "@react-native-community/cli-tools": "12.3.6", - "chalk": "^4.1.2", - "cosmiconfig": "^5.1.0", - "deepmerge": "^4.3.0", - "glob": "^7.1.3", - "joi": "^17.2.1" + "base-64": "0.1.0", + "glob": "^7.2.3" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/@react-native-community/cli-doctor": { - "version": "12.3.6", - "license": "MIT", - "peer": true, + "node_modules/react-native-blob-util/node_modules/glob": { + "version": "7.2.3", + "license": "ISC", "dependencies": { - "@react-native-community/cli-config": "12.3.6", - "@react-native-community/cli-platform-android": "12.3.6", - "@react-native-community/cli-platform-ios": "12.3.6", - "@react-native-community/cli-tools": "12.3.6", - "chalk": "^4.1.2", - "command-exists": "^1.2.8", - "deepmerge": "^4.3.0", - "envinfo": "^7.10.0", - "execa": "^5.0.0", - "hermes-profile-transformer": "^0.0.6", - "node-stream-zip": "^1.9.1", - "ora": "^5.4.1", - "semver": "^7.5.2", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1", - "yaml": "^2.2.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/react-native-windows/node_modules/@react-native-community/cli-hermes": { - "version": "12.3.6", + "node_modules/react-native-clean-project": { + "version": "4.0.1", + "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@react-native-community/cli-platform-android": "12.3.6", - "@react-native-community/cli-tools": "12.3.6", - "chalk": "^4.1.2", - "hermes-profile-transformer": "^0.0.6" + "bin": { + "react-native-clean-project": "source/index.js" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/react-native-windows/node_modules/@react-native-community/cli-platform-android": { - "version": "12.3.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-native-community/cli-tools": "12.3.6", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-xml-parser": "^4.2.4", - "glob": "^7.1.3", - "logkitty": "^0.7.1" + "node_modules/react-native-collapsible": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/react-native-collapsible/-/react-native-collapsible-1.6.2.tgz", + "integrity": "sha512-MCOBVJWqHNjnDaGkvxX997VONmJeebh6wyJxnHEgg0L1PrlcXU1e/bo6eK+CDVFuMrCafw8Qh4DOv/C4V/+Iew==", + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/@react-native-community/cli-platform-ios": { - "version": "12.3.6", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-native-community/cli-tools": "12.3.6", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-xml-parser": "^4.0.12", - "glob": "^7.1.3", - "ora": "^5.4.1" + "node_modules/react-native-config": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/react-native-config/-/react-native-config-1.5.3.tgz", + "integrity": "sha512-3D05Abgk5DfDw9w258EzXvX5AkU7eqj3u9H0H0L4gUga4nYg/zuupcrpGbpF4QeXBcJ84jjs6g8JaEP6VBT7Pg==", + "peerDependencies": { + "react-native-windows": ">=0.61" + }, + "peerDependenciesMeta": { + "react-native-windows": { + "optional": true + } } }, - "node_modules/react-native-windows/node_modules/@react-native-community/cli-types": { - "version": "12.3.6", + "node_modules/react-native-device-info": { + "version": "10.3.1", "license": "MIT", - "peer": true, - "dependencies": { - "joi": "^17.2.1" + "peerDependencies": { + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/@react-native/assets-registry": { - "version": "0.73.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" + "node_modules/react-native-document-picker": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/react-native-document-picker/-/react-native-document-picker-9.3.1.tgz", + "integrity": "sha512-Vcofv9wfB0j67zawFjfq9WQPMMzXxOZL9kBmvWDpjVuEcVK73ndRmlXHlkeFl5ZHVsv4Zb6oZYhqm9u5omJOPA==", + "dependencies": { + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*", + "react-native-windows": "*" + }, + "peerDependenciesMeta": { + "react-native-windows": { + "optional": true + } } }, - "node_modules/react-native-windows/node_modules/@react-native/babel-plugin-codegen": { - "version": "0.73.4", + "node_modules/react-native-draggable-flatlist": { + "version": "4.0.1", "license": "MIT", - "peer": true, "dependencies": { - "@react-native/codegen": "0.73.3" + "@babel/preset-typescript": "^7.17.12" }, - "engines": { - "node": ">=18" + "peerDependencies": { + "react-native": ">=0.64.0", + "react-native-gesture-handler": ">=2.0.0", + "react-native-reanimated": ">=2.8.0" } }, - "node_modules/react-native-windows/node_modules/@react-native/babel-preset": { - "version": "0.73.21", + "node_modules/react-native-fs": { + "version": "2.20.0", "license": "MIT", - "peer": true, "dependencies": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-async-generator-functions": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.18.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", - "@babel/plugin-proposal-numeric-separator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.20.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "@react-native/babel-plugin-codegen": "0.73.4", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": ">=18" + "base-64": "^0.1.0", + "utf8": "^3.0.0" }, "peerDependencies": { - "@babel/core": "*" + "react-native": "*", + "react-native-windows": "*" + }, + "peerDependenciesMeta": { + "react-native-windows": { + "optional": true + } } }, - "node_modules/react-native-windows/node_modules/@react-native/codegen": { - "version": "0.73.3", + "node_modules/react-native-gesture-handler": { + "version": "2.18.0", "license": "MIT", - "peer": true, "dependencies": { - "@babel/parser": "^7.20.0", - "flow-parser": "^0.206.0", - "glob": "^7.1.1", + "@egjs/hammerjs": "^2.0.17", + "hoist-non-react-statics": "^3.3.0", "invariant": "^2.2.4", - "jscodeshift": "^0.14.0", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" + "prop-types": "^15.7.2" }, "peerDependencies": { - "@babel/preset-env": "^7.1.6" + "react": "*", + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/@react-native/community-cli-plugin": { - "version": "0.73.17", + "node_modules/react-native-google-places-autocomplete": { + "version": "2.5.6", "license": "MIT", - "peer": true, "dependencies": { - "@react-native-community/cli-server-api": "12.3.6", - "@react-native-community/cli-tools": "12.3.6", - "@react-native/dev-middleware": "0.73.8", - "@react-native/metro-babel-transformer": "0.73.15", - "chalk": "^4.0.0", - "execa": "^5.1.1", - "metro": "^0.80.3", - "metro-config": "^0.80.3", - "metro-core": "^0.80.3", - "node-fetch": "^2.2.0", - "readline": "^1.3.0" + "lodash.debounce": "^4.0.8", + "prop-types": "^15.7.2", + "qs": "~6.9.1" }, - "engines": { - "node": ">=18" + "peerDependencies": { + "react-native": ">= 0.59" } }, - "node_modules/react-native-windows/node_modules/@react-native/debugger-frontend": { - "version": "0.73.3", + "node_modules/react-native-google-places-autocomplete/node_modules/qs": { + "version": "6.9.7", "license": "BSD-3-Clause", - "peer": true, "engines": { - "node": ">=18" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-native-windows/node_modules/@react-native/dev-middleware": { - "version": "0.73.8", - "license": "MIT", - "peer": true, - "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.73.3", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^1.0.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "node-fetch": "^2.2.0", - "open": "^7.0.3", - "serve-static": "^1.13.1", - "temp-dir": "^2.0.0", - "ws": "^6.2.2" - }, - "engines": { - "node": ">=18" + "node_modules/react-native-haptic-feedback": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/react-native-haptic-feedback/-/react-native-haptic-feedback-2.3.3.tgz", + "integrity": "sha512-svS4D5PxfNv8o68m9ahWfwje5NqukM3qLS48+WTdhbDkNUkOhP9rDfDSRHzlhk4zq+ISjyw95EhLeh8NkKX5vQ==", + "workspaces": [ + "example" + ], + "peerDependencies": { + "react-native": ">=0.60.0" } }, - "node_modules/react-native-windows/node_modules/@react-native/gradle-plugin": { - "version": "0.73.4", + "node_modules/react-native-image-picker": { + "version": "7.0.3", "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/@react-native/js-polyfills": { - "version": "0.73.1", + "node_modules/react-native-image-size": { + "version": "1.1.3", + "resolved": "git+ssh://git@github.com/Expensify/react-native-image-size.git#cb392140db4953a283590d7cf93b4d0461baa2a9", + "integrity": "sha512-kF/8fGsKoOnjPZceipRUaM9Xg9a/aKXU2Vm5eHYEKHrRt8FP39oCbaELPTb/vUKRTu1HmEGffDFzRT02BcdzYQ==" + }, + "node_modules/react-native-is-edge-to-edge": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.1.6.tgz", + "integrity": "sha512-1pHnFTlBahins6UAajXUqeCOHew9l9C2C8tErnpGC3IyLJzvxD+TpYAixnCbrVS52f7+NvMttbiSI290XfwN0w==", "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" + "peerDependencies": { + "react": ">=18.2.0", + "react-native": ">=0.73.0" } }, - "node_modules/react-native-windows/node_modules/@react-native/metro-babel-transformer": { - "version": "0.73.15", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.20.0", - "@react-native/babel-preset": "0.73.21", - "hermes-parser": "0.15.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" + "node_modules/react-native-key-command": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "underscore": "^1.13.4" }, "peerDependencies": { - "@babel/core": "*" + "react": "^18.1.0", + "react-dom": "18.1.0", + "react-native": "^0.70.4", + "react-native-web": "^0.19.7" } }, - "node_modules/react-native-windows/node_modules/@react-native/normalize-colors": { - "version": "0.73.2", - "license": "MIT", - "peer": true + "node_modules/react-native-key-command/node_modules/eventemitter3": { + "version": "5.0.1", + "license": "MIT" }, - "node_modules/react-native-windows/node_modules/@react-native/virtualized-lists": { - "version": "0.73.4", + "node_modules/react-native-keyboard-controller": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/react-native-keyboard-controller/-/react-native-keyboard-controller-1.14.4.tgz", + "integrity": "sha512-hVt9KhK2dxBNtk4xHTnKLeO9Jv7v5h2TZlIeCQkbBLMd5NIJa4ll0GxIpbuutjP1ctPdhXUVpCfQzgXXJOYlzw==", "license": "MIT", - "peer": true, "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" + "react-native-is-edge-to-edge": "^1.1.6" }, "peerDependencies": { - "react-native": "*" + "react": "*", + "react-native": "*", + "react-native-reanimated": ">=3.0.0" } }, - "node_modules/react-native-windows/node_modules/@types/yargs": { - "version": "15.0.19", + "node_modules/react-native-launch-arguments": { + "version": "4.0.2", "license": "MIT", - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" + "peerDependencies": { + "react": ">=16.8.1", + "react-native": ">=0.60.0-rc.0 <1.0.x" } }, - "node_modules/react-native-windows/node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/react-native-localize": { + "version": "2.2.6", "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" + "peerDependencies": { + "react": ">=16.8.6", + "react-native": ">=0.60.0", + "react-native-macos": ">=0.64.0", + "react-native-windows": ">=0.62.0" + }, + "peerDependenciesMeta": { + "react-native-macos": { + "optional": true + }, + "react-native-windows": { + "optional": true + } } }, - "node_modules/react-native-windows/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/react-native-modal": { + "version": "13.0.1", "license": "MIT", - "peer": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "prop-types": "^15.6.2", + "react-native-animatable": "1.3.3" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "react": "*", + "react-native": ">=0.65.0" } }, - "node_modules/react-native-windows/node_modules/chalk": { - "version": "4.1.2", + "node_modules/react-native-onyx": { + "version": "2.0.82", + "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-2.0.82.tgz", + "integrity": "sha512-12+NgkC4fOeGu2J6s985NKUuLHP4aijBhpE6Us5IfVL+9dwxr/KqUVgV00OzXtYAABcWcpMC5PrvESqe8T5Iyw==", "license": "MIT", - "peer": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ascii-table": "0.0.9", + "fast-equals": "^4.0.3", + "lodash.bindall": "^4.4.0", + "lodash.clone": "^4.5.0", + "lodash.pick": "^4.4.0", + "lodash.transform": "^4.6.0", + "underscore": "^1.13.6" }, "engines": { - "node": ">=10" + "node": ">=20.18.0", + "npm": ">=10.8.2" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/react-native-windows/node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" + "peerDependencies": { + "idb-keyval": "^6.2.1", + "react": ">=18.1.0", + "react-dom": ">=18.1.0", + "react-native-device-info": "^10.3.0", + "react-native-performance": "^5.1.0", + "react-native-quick-sqlite": "^8.0.0-beta.2" }, - "engines": { - "node": ">=7.0.0" + "peerDependenciesMeta": { + "idb-keyval": { + "optional": true + }, + "react-native-device-info": { + "optional": true + }, + "react-native-performance": { + "optional": true + }, + "react-native-quick-sqlite": { + "optional": true + } } }, - "node_modules/react-native-windows/node_modules/color-name": { - "version": "1.1.4", - "license": "MIT", - "peer": true - }, - "node_modules/react-native-windows/node_modules/commander": { - "version": "9.5.0", + "node_modules/react-native-pager-view": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-6.5.1.tgz", + "integrity": "sha512-YdX7bP+rPYvATMU7HzlMq9JaG3ui/+cVRbFZFGW+QshDULANFg9ECR1BA7H7JTIcO/ZgWCwF+1aVmYG5yBA9Og==", "license": "MIT", - "peer": true, - "engines": { - "node": "^12.20.0 || >=14" + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/cosmiconfig": { - "version": "5.2.1", + "node_modules/react-native-pdf": { + "version": "6.7.3", "license": "MIT", - "peer": true, "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "crypto-js": "4.2.0", + "deprecated-react-native-prop-types": "^2.3.0" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "react": "*", + "react-native": "*", + "react-native-blob-util": ">=0.13.7" } }, - "node_modules/react-native-windows/node_modules/debug": { - "version": "2.6.9", + "node_modules/react-native-performance": { + "version": "5.1.0", "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.0.0" + "peerDependencies": { + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/deprecated-react-native-prop-types": { - "version": "5.0.0", + "node_modules/react-native-permissions": { + "version": "3.10.1", "license": "MIT", - "peer": true, - "dependencies": { - "@react-native/normalize-colors": "^0.73.0", - "invariant": "^2.2.4", - "prop-types": "^15.8.1" + "peerDependencies": { + "react": ">=16.13.1", + "react-native": ">=0.63.3", + "react-native-windows": ">=0.62.0" }, - "engines": { - "node": ">=18" + "peerDependenciesMeta": { + "react-native-windows": { + "optional": true + } } }, - "node_modules/react-native-windows/node_modules/find-up": { - "version": "4.1.0", - "license": "MIT", - "peer": true, + "node_modules/react-native-picker-select": { + "version": "8.1.0", + "resolved": "git+ssh://git@github.com/Expensify/react-native-picker-select.git#da50d2c5c54e268499047f9cc98b8df4196c1ddf", + "integrity": "sha512-iASqj8cXSQY+P3ZhfW1eoVcK0UB+TRTddrNSQ3lmIH0a4lYO3m4XJC+cnoCjjPl/sTzUaShpOnpBfqMueR6UMA==", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "lodash.isequal": "^4.5.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@react-native-picker/picker": ">=2.1.0" } }, - "node_modules/react-native-windows/node_modules/flow-parser": { - "version": "0.206.0", + "node_modules/react-native-plaid-link-sdk": { + "version": "11.11.0", "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.4.0" + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/fs-extra": { - "version": "8.1.0", - "license": "MIT", - "peer": true, + "node_modules/react-native-qrcode-svg": { + "version": "6.3.11", + "resolved": "https://registry.npmjs.org/react-native-qrcode-svg/-/react-native-qrcode-svg-6.3.11.tgz", + "integrity": "sha512-bhjh4KT8NTQjJyu/tGaplR53OIqtvUJcWZ713H++GLKRpldNDyywwLVW+HdlGZ3N7jk3TxCchQMDMzndLlV4sA==", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "prop-types": "^15.8.0", + "qrcode": "^1.5.1", + "text-encoding": "^0.7.0" }, - "engines": { - "node": ">=6 <7 || >=8" + "peerDependencies": { + "react": "*", + "react-native": ">=0.63.4", + "react-native-svg": ">=13.2.0" } }, - "node_modules/react-native-windows/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/react-native-quick-sqlite": { + "version": "8.1.0", + "resolved": "git+ssh://git@github.com/margelo/react-native-nitro-sqlite.git#99f34ebefa91698945f3ed26622e002bd79489e0", + "integrity": "sha512-7uuHmOEnc6SOAVoAdvkQhvaYhUZMORM75qo+v6PZoH6Qk21j5CmrcxJE3gNh0FhMfxK73hQ3ZtugC/NI2jVhrw==", "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/hermes-estree": { - "version": "0.15.0", - "license": "MIT", - "peer": true - }, - "node_modules/react-native-windows/node_modules/hermes-parser": { - "version": "0.15.0", + "node_modules/react-native-reanimated": { + "version": "3.16.3", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.16.3.tgz", + "integrity": "sha512-OWlA6e1oHhytTpc7WiSZ7Tmb8OYwLKYZz29Sz6d6WAg60Hm5GuAiKIWUG7Ako7FLcYhFkA0pEQ2xPMEYUo9vlw==", "license": "MIT", - "peer": true, "dependencies": { - "hermes-estree": "0.15.0" + "@babel/plugin-transform-arrow-functions": "^7.0.0-0", + "@babel/plugin-transform-class-properties": "^7.0.0-0", + "@babel/plugin-transform-classes": "^7.0.0-0", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.0.0-0", + "@babel/plugin-transform-optional-chaining": "^7.0.0-0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", + "@babel/plugin-transform-template-literals": "^7.0.0-0", + "@babel/plugin-transform-unicode-regex": "^7.0.0-0", + "@babel/preset-typescript": "^7.16.7", + "convert-source-map": "^2.0.0", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "react": "*", + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/import-fresh": { - "version": "2.0.0", + "node_modules/react-native-release-profiler": { + "version": "0.2.1", "license": "MIT", - "peer": true, + "workspaces": [ + "example" + ], "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "commander": "^11.1.0", + "hermes-profile-transformer": "^0.0.9" + }, + "bin": { + "react-native-release-profiler": "lib/commonjs/cli.js" }, "engines": { - "node": ">=4" + "node": ">= 18.0.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/jsonfile": { - "version": "4.0.0", + "node_modules/react-native-release-profiler/node_modules/commander": { + "version": "11.1.0", "license": "MIT", - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=16" } }, - "node_modules/react-native-windows/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/react-native-release-profiler/node_modules/hermes-profile-transformer": { + "version": "0.0.9", "license": "MIT", - "peer": true, "dependencies": { - "p-locate": "^4.1.0" + "source-map": "^0.7.3" }, "engines": { "node": ">=8" } }, - "node_modules/react-native-windows/node_modules/mkdirp": { - "version": "0.5.6", - "license": "MIT", - "peer": true, + "node_modules/react-native-render-html": { + "version": "6.3.1", + "license": "BSD-2-Clause", "dependencies": { - "minimist": "^1.2.6" + "@jsamr/counter-style": "^2.0.1", + "@jsamr/react-native-li": "^2.3.0", + "@native-html/transient-render-engine": "11.2.2", + "@types/ramda": "^0.27.40", + "@types/urijs": "^1.19.15", + "prop-types": "^15.5.7", + "ramda": "^0.27.1", + "stringify-entities": "^3.1.0", + "urijs": "^1.19.6" }, - "bin": { - "mkdirp": "bin/cmd.js" + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/ms": { - "version": "2.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/react-native-windows/node_modules/open": { - "version": "7.4.2", + "node_modules/react-native-render-html/node_modules/@native-html/transient-render-engine": { + "version": "11.2.2", "license": "MIT", - "peer": true, "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" + "@native-html/css-processor": "1.11.0", + "@types/ramda": "^0.27.44", + "csstype": "^3.0.9", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "htmlparser2": "^7.1.2", + "ramda": "^0.27.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/react-native": "*", + "react-native": "^*" } }, - "node_modules/react-native-windows/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/react-native-render-html/node_modules/ramda": { + "version": "0.27.2", + "license": "MIT" + }, + "node_modules/react-native-safe-area-context": { + "version": "4.10.9", "license": "MIT", - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/react-native-screens": { + "version": "3.34.0", "license": "MIT", - "peer": true, "dependencies": { - "p-limit": "^2.2.0" + "react-freeze": "^1.0.0", + "warn-once": "^0.1.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/parse-json": { - "version": "4.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, + "node_modules/react-native-share": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/react-native-share/-/react-native-share-11.0.2.tgz", + "integrity": "sha512-7W7sb9qd8RjVEIMhbYc3MU//qGUNxf1XAqd3SlO/ivz89ed1jP1yUwYOcUK2Kf1NDY/kwWbPCkEKa6ZGVlcsOQ==", "engines": { - "node": ">=4" + "node": ">=16" } }, - "node_modules/react-native-windows/node_modules/path-exists": { - "version": "4.0.0", + "node_modules/react-native-sound": { + "version": "0.11.2", "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" + "peerDependencies": { + "react-native": ">=0.8.0" } }, - "node_modules/react-native-windows/node_modules/pretty-format": { - "version": "26.6.2", + "node_modules/react-native-svg": { + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.9.0.tgz", + "integrity": "sha512-pwo7hteAM0P8jNpPGQtiSd0SnbBhE8tNd94LT8AcZcbnH5AJdXBIcXU4+tWYYeGUjiNAH2E5d0T5XIfnvaz1gA==", "license": "MIT", - "peer": true, "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" + "css-select": "^5.1.0", + "css-tree": "^1.1.3", + "warn-once": "0.1.1" }, - "engines": { - "node": ">= 10" + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/promise": { - "version": "8.3.0", + "node_modules/react-native-tab-view": { + "version": "3.5.2", "license": "MIT", - "peer": true, "dependencies": { - "asap": "~2.0.6" + "use-latest-callback": "^0.1.5" + }, + "peerDependencies": { + "react": "*", + "react-native": "*", + "react-native-pager-view": "*" } }, - "node_modules/react-native-windows/node_modules/react-devtools-core": { - "version": "4.28.5", + "node_modules/react-native-url-polyfill": { + "version": "2.0.0", "license": "MIT", - "peer": true, "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" + "whatwg-url-without-unicode": "8.0.0-3" + }, + "peerDependencies": { + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/react-is": { - "version": "17.0.2", + "node_modules/react-native-view-shot": { + "version": "3.8.0", "license": "MIT", - "peer": true + "dependencies": { + "html2canvas": "^1.4.1" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } }, - "node_modules/react-native-windows/node_modules/resolve-from": { - "version": "3.0.0", + "node_modules/react-native-vision-camera": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/react-native-vision-camera/-/react-native-vision-camera-4.6.1.tgz", + "integrity": "sha512-USp7g+Q/H7nzIS2XBJTWVdzZArxgZu+IFafgswVzxdmr0iSpLjLUtoUp+SUWxZ+nLhJriYYvqg8hfZrJtnpnlw==", "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" + "peerDependencies": { + "@shopify/react-native-skia": "*", + "react": "*", + "react-native": "*", + "react-native-reanimated": "*", + "react-native-worklets-core": "*" + }, + "peerDependenciesMeta": { + "@shopify/react-native-skia": { + "optional": true + }, + "react-native-reanimated": { + "optional": true + }, + "react-native-worklets-core": { + "optional": true + } } }, - "node_modules/react-native-windows/node_modules/strip-ansi": { - "version": "5.2.0", - "license": "MIT", - "peer": true, + "node_modules/react-native-web": { + "version": "0.19.13", + "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.19.13.tgz", + "integrity": "sha512-etv3bN8rJglrRCp/uL4p7l8QvUNUC++QwDbdZ8CB7BvZiMvsxfFIRM1j04vxNldG3uo2puRd6OSWR3ibtmc29A==", "dependencies": { - "ansi-regex": "^4.1.0" + "@babel/runtime": "^7.18.6", + "@react-native/normalize-colors": "^0.74.1", + "fbjs": "^3.0.4", + "inline-style-prefixer": "^6.0.1", + "memoize-one": "^6.0.0", + "nullthrows": "^1.1.1", + "postcss-value-parser": "^4.2.0", + "styleq": "^0.1.3" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/react-native-windows/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } + "node_modules/react-native-web/node_modules/memoize-one": { + "version": "6.0.0", + "license": "MIT" }, - "node_modules/react-native-windows/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/react-native-webview": { + "version": "13.8.6", "license": "MIT", - "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "escape-string-regexp": "2.0.0", + "invariant": "2.2.4" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "node_modules/react-native-windows/node_modules/universalify": { - "version": "0.1.2", + "node_modules/react-native-webview/node_modules/escape-string-regexp": { + "version": "2.0.0", "license": "MIT", - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/react-native-windows/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "peer": true, "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">=8" } }, "node_modules/react-native/node_modules/@jest/types": { @@ -37025,26 +34065,6 @@ "node": ">=8" } }, - "node_modules/react-native/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/react-pdf": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-9.1.1.tgz", @@ -37175,6 +34195,7 @@ }, "node_modules/react-shallow-renderer": { "version": "16.15.0", + "dev": true, "license": "MIT", "dependencies": { "object-assign": "^4.1.1", @@ -37695,19 +34716,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-in-the-middle": { - "version": "7.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.1.1", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/requireg": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", @@ -38381,45 +35389,6 @@ "shellcheck": "shellcheck-stable/shellcheck" } }, - "node_modules/shelljs": { - "version": "0.8.5", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shelljs/node_modules/interpret": { - "version": "1.4.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/shelljs/node_modules/rechoir": { - "version": "0.6.2", - "peer": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/shimmer": { - "version": "1.2.1", - "license": "BSD-2-Clause", - "peer": true - }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", @@ -38894,11 +35863,6 @@ "dev": true, "license": "MIT" }, - "node_modules/stack-chain": { - "version": "1.3.7", - "license": "MIT", - "peer": true - }, "node_modules/stack-generator": { "version": "2.0.10", "license": "MIT", @@ -40842,126 +37806,6 @@ } } }, - "node_modules/username": { - "version": "5.1.0", - "license": "MIT", - "peer": true, - "dependencies": { - "execa": "^1.0.0", - "mem": "^4.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/username/node_modules/cross-spawn": { - "version": "6.0.5", - "license": "MIT", - "peer": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/username/node_modules/execa": { - "version": "1.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/username/node_modules/get-stream": { - "version": "4.1.0", - "license": "MIT", - "peer": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/username/node_modules/is-stream": { - "version": "1.1.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/username/node_modules/npm-run-path": { - "version": "2.0.2", - "license": "MIT", - "peer": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/username/node_modules/path-key": { - "version": "2.0.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/username/node_modules/semver": { - "version": "5.7.2", - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/username/node_modules/shebang-command": { - "version": "1.2.0", - "license": "MIT", - "peer": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/username/node_modules/shebang-regex": { - "version": "1.0.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/username/node_modules/which": { - "version": "1.3.1", - "license": "ISC", - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/utf8": { "version": "3.0.0", "license": "MIT" @@ -41259,27 +38103,6 @@ "node": ">= 10" } }, - "node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/webpack-cli": { "version": "5.1.4", "dev": true, @@ -41647,27 +38470,6 @@ } } }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/webpack-hot-middleware": { "version": "2.26.1", "dev": true, @@ -42016,6 +38818,27 @@ "signal-exit": "^3.0.2" } }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xcode": { "version": "3.0.1", "license": "Apache-2.0", @@ -42046,46 +38869,6 @@ "node": ">=0.8" } }, - "node_modules/xml-formatter": { - "version": "2.6.1", - "license": "MIT", - "peer": true, - "dependencies": { - "xml-parser-xo": "^3.2.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/xml-parser": { - "version": "1.2.1", - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^2.2.0" - } - }, - "node_modules/xml-parser-xo": { - "version": "3.2.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/xml-parser/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/xml-parser/node_modules/ms": { - "version": "2.0.0", - "license": "MIT", - "peer": true - }, "node_modules/xml2js": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", @@ -42118,14 +38901,6 @@ "dev": true, "license": "MIT" }, - "node_modules/xpath": { - "version": "0.0.27", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/xtend": { "version": "4.0.2", "license": "MIT", diff --git a/package.json b/package.json index 60f04d59605a..1dbb7c54a335 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "9.0.66-7", + "version": "9.0.72-0", "author": "Expensify, Inc.", "homepage": "https://new.expensify.com", "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", @@ -83,7 +83,7 @@ "@invertase/react-native-apple-authentication": "^2.2.2", "@onfido/react-native-sdk": "10.6.0", "@react-native-camera-roll/camera-roll": "7.4.0", - "@react-native-clipboard/clipboard": "^1.13.2", + "@react-native-clipboard/clipboard": "^1.15.0", "@react-native-community/geolocation": "3.3.0", "@react-native-community/netinfo": "11.2.1", "@react-native-firebase/analytics": "^12.3.0", @@ -130,7 +130,7 @@ "react-content-loader": "^7.0.0", "react-dom": "18.3.1", "react-error-boundary": "^4.0.11", - "react-fast-pdf": "1.0.15", + "react-fast-pdf": "1.0.20", "react-map-gl": "^7.1.3", "react-native": "0.75.2", "react-native-android-location-enabler": "^2.0.1", @@ -152,8 +152,8 @@ "react-native-launch-arguments": "^4.0.2", "react-native-localize": "^2.2.6", "react-native-modal": "^13.0.0", - "react-native-onyx": "2.0.81", - "react-native-pager-view": "6.5.0", + "react-native-onyx": "2.0.82", + "react-native-pager-view": "6.5.1", "react-native-pdf": "6.7.3", "react-native-performance": "^5.1.0", "react-native-permissions": "^3.10.0", @@ -161,7 +161,7 @@ "react-native-plaid-link-sdk": "11.11.0", "react-native-qrcode-svg": "6.3.11", "react-native-quick-sqlite": "git+https://github.com/margelo/react-native-nitro-sqlite#99f34ebefa91698945f3ed26622e002bd79489e0", - "react-native-reanimated": "3.16.1", + "react-native-reanimated": "3.16.3", "react-native-release-profiler": "^0.2.1", "react-native-render-html": "6.3.1", "react-native-safe-area-context": "4.10.9", @@ -172,7 +172,7 @@ "react-native-tab-view": "^3.5.2", "react-native-url-polyfill": "^2.0.0", "react-native-view-shot": "3.8.0", - "react-native-vision-camera": "4.0.0-beta.13", + "react-native-vision-camera": "^4.6.1", "react-native-web": "0.19.13", "react-native-webview": "13.8.6", "react-plaid-link": "3.3.2", diff --git a/patches/react-native+0.75.2+024+measureText-full-width-if-wraps.patch b/patches/react-native+0.75.2+024+measureText-full-width-if-wraps.patch new file mode 100644 index 000000000000..fb4c857e13b2 --- /dev/null +++ b/patches/react-native+0.75.2+024+measureText-full-width-if-wraps.patch @@ -0,0 +1,53 @@ +diff --git a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java +index 2921f84..93da34c 100644 +--- a/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java ++++ b/node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java +@@ -579,6 +579,10 @@ public class TextLayoutManager { + for (int lineIndex = 0; lineIndex < calculatedLineCount; lineIndex++) { + boolean endsWithNewLine = + text.length() > 0 && text.charAt(layout.getLineEnd(lineIndex) - 1) == '\n'; ++ if (!endsWithNewLine && lineIndex + 1 < layout.getLineCount()) { ++ calculatedWidth = width; ++ break; ++ } + float lineWidth = + endsWithNewLine ? layout.getLineMax(lineIndex) : layout.getLineWidth(lineIndex); + if (lineWidth > calculatedWidth) { +diff --git a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm +index b4a7033..499e12e 100644 +--- a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm ++++ b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm +@@ -285,8 +285,33 @@ static NSLineBreakMode RCTNSLineBreakModeFromEllipsizeMode(EllipsizeMode ellipsi + NSTextContainer *textContainer = layoutManager.textContainers.firstObject; + [layoutManager ensureLayoutForTextContainer:textContainer]; + ++ NSRange glyphRange = [layoutManager glyphRangeForTextContainer:textContainer]; ++ __block BOOL textDidWrap = NO; ++ [layoutManager ++ enumerateLineFragmentsForGlyphRange:glyphRange ++ usingBlock:^( ++ CGRect overallRect, ++ CGRect usedRect, ++ NSTextContainer *_Nonnull usedTextContainer, ++ NSRange lineGlyphRange, ++ BOOL *_Nonnull stop) { ++ NSRange range = [layoutManager characterRangeForGlyphRange:lineGlyphRange ++ actualGlyphRange:nil]; ++ NSUInteger lastCharacterIndex = range.location + range.length - 1; ++ BOOL endsWithNewLine = ++ [textStorage.string characterAtIndex:lastCharacterIndex] == '\n'; ++ if (!endsWithNewLine && textStorage.string.length > lastCharacterIndex + 1) { ++ textDidWrap = YES; ++ *stop = YES; ++ } ++ }]; ++ + CGSize size = [layoutManager usedRectForTextContainer:textContainer].size; + ++ if (textDidWrap) { ++ size.width = textContainer.size.width; ++ } ++ + size = (CGSize){RCTCeilPixelValue(size.width), RCTCeilPixelValue(size.height)}; + + __block auto attachments = TextMeasurement::Attachments{}; diff --git a/patches/react-native-pager-view+6.5.0.patch b/patches/react-native-pager-view+6.5.1+001+initial.patch similarity index 100% rename from patches/react-native-pager-view+6.5.0.patch rename to patches/react-native-pager-view+6.5.1+001+initial.patch diff --git a/patches/react-native-reanimated+3.16.1+003+include-missing-header.patch b/patches/react-native-reanimated+3.16.1+003+include-missing-header.patch deleted file mode 100644 index 80244991a890..000000000000 --- a/patches/react-native-reanimated+3.16.1+003+include-missing-header.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/node_modules/react-native-reanimated/Common/cpp/reanimated/NativeModules/NativeReanimatedModule.cpp b/node_modules/react-native-reanimated/Common/cpp/reanimated/NativeModules/NativeReanimatedModule.cpp -index 475ec7a..832fb06 100644 ---- a/node_modules/react-native-reanimated/Common/cpp/reanimated/NativeModules/NativeReanimatedModule.cpp -+++ b/node_modules/react-native-reanimated/Common/cpp/reanimated/NativeModules/NativeReanimatedModule.cpp -@@ -32,6 +32,8 @@ - - #ifdef RCT_NEW_ARCH_ENABLED - #include -+#include -+#include - #endif // RCT_NEW_ARCH_ENABLED - - // Standard `__cplusplus` macro reference: \ No newline at end of file diff --git a/patches/react-native-reanimated+3.16.1+001+hybrid-app.patch b/patches/react-native-reanimated+3.16.3+001+hybrid-app.patch similarity index 100% rename from patches/react-native-reanimated+3.16.1+001+hybrid-app.patch rename to patches/react-native-reanimated+3.16.3+001+hybrid-app.patch diff --git a/patches/react-native-reanimated+3.16.1+002+dontWhitelistTextProp.patch b/patches/react-native-reanimated+3.16.3+002+dontWhitelistTextProp.patch similarity index 100% rename from patches/react-native-reanimated+3.16.1+002+dontWhitelistTextProp.patch rename to patches/react-native-reanimated+3.16.3+002+dontWhitelistTextProp.patch diff --git a/patches/react-native-screens+3.34.0+003+fabric-flat-list-fix.patch b/patches/react-native-screens+3.34.0+003+fabric-flat-list-fix.patch new file mode 100644 index 000000000000..3327ed477893 --- /dev/null +++ b/patches/react-native-screens+3.34.0+003+fabric-flat-list-fix.patch @@ -0,0 +1,57 @@ +diff --git a/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/Screen.kt b/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/Screen.kt +index 9d08d39..146b9c2 100644 +--- a/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/Screen.kt ++++ b/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/Screen.kt +@@ -18,6 +18,7 @@ import com.facebook.react.uimanager.PixelUtil + import com.facebook.react.uimanager.UIManagerHelper + import com.facebook.react.uimanager.UIManagerModule + import com.swmansion.rnscreens.events.HeaderHeightChangeEvent ++import com.swmansion.rnscreens.ext.isInsideScrollViewWithRemoveClippedSubviews + + @SuppressLint("ViewConstructor") // Only we construct this view, it is never inflated. + class Screen( +@@ -310,6 +311,16 @@ class Screen( + startTransitionRecursive(child.toolbar) + } + if (child is ViewGroup) { ++ // a combination of https://github.com/software-mansion/react-native-screens/pull/2307/files and https://github.com/software-mansion/react-native-screens/pull/2383/files ++ // The children are miscounted when there's a FlatList with ++ // removeClippedSubviews set to true (default). ++ // We add a simple view for each item in the list to make it work as expected. ++ // See https://github.com/software-mansion/react-native-screens/issues/2282 ++ if (child.isInsideScrollViewWithRemoveClippedSubviews()) { ++ for (j in 0 until child.childCount) { ++ child.addView(View(context)) ++ } ++ } + startTransitionRecursive(child) + } + } +diff --git a/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ext/ViewExt.kt b/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ext/ViewExt.kt +new file mode 100644 +index 0000000..9d9fbfd +--- /dev/null ++++ b/node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ext/ViewExt.kt +@@ -0,0 +1,21 @@ ++package com.swmansion.rnscreens.ext ++ ++import android.view.View ++import android.view.ViewGroup ++import com.facebook.react.views.scroll.ReactHorizontalScrollView ++import com.facebook.react.views.scroll.ReactScrollView ++import com.swmansion.rnscreens.ScreenStack ++ ++internal fun View.isInsideScrollViewWithRemoveClippedSubviews(): Boolean { ++ if (this is ReactHorizontalScrollView || this is ReactScrollView) { ++ return false ++ } ++ var parentView = this.parent ++ while (parentView is ViewGroup && parentView !is ScreenStack) { ++ if (parentView is ReactScrollView) { ++ return parentView.removeClippedSubviews ++ } ++ parentView = parentView.parent ++ } ++ return false ++} +\ No newline at end of file diff --git a/patches/react-native-screens+3.34.0+004+ios-custom-animations-native-transitions.patch b/patches/react-native-screens+3.34.0+004+ios-custom-animations-native-transitions.patch new file mode 100644 index 000000000000..62cbf68f458d --- /dev/null +++ b/patches/react-native-screens+3.34.0+004+ios-custom-animations-native-transitions.patch @@ -0,0 +1,156 @@ +diff --git a/node_modules/react-native-screens/ios/RNSScreenStackAnimator.mm b/node_modules/react-native-screens/ios/RNSScreenStackAnimator.mm +index abb2cf6..fb81d52 100644 +--- a/node_modules/react-native-screens/ios/RNSScreenStackAnimator.mm ++++ b/node_modules/react-native-screens/ios/RNSScreenStackAnimator.mm +@@ -5,13 +5,14 @@ + + // proportions to default transition duration + static const float RNSSlideOpenTransitionDurationProportion = 1; +-static const float RNSFadeOpenTransitionDurationProportion = 0.2 / 0.35; +-static const float RNSSlideCloseTransitionDurationProportion = 0.25 / 0.35; +-static const float RNSFadeCloseTransitionDurationProportion = 0.15 / 0.35; +-static const float RNSFadeCloseDelayTransitionDurationProportion = 0.1 / 0.35; ++static const float RNSFadeOpenTransitionDurationProportion = 0.2 / 0.5; ++static const float RNSSlideCloseTransitionDurationProportion = 0.25 / 0.5; ++static const float RNSFadeCloseTransitionDurationProportion = 0.15 / 0.5; ++static const float RNSFadeCloseDelayTransitionDurationProportion = 0.1 / 0.5; + // same value is used in other projects using similar approach for transistions + // and it looks the most similar to the value used by Apple + static constexpr float RNSShadowViewMaxAlpha = 0.1; ++static const int UIViewAnimationOptionCurveDefaultTransition = 7 << 16; + + @implementation RNSScreenStackAnimator { + UINavigationControllerOperation _operation; +@@ -22,7 +23,7 @@ - (instancetype)initWithOperation:(UINavigationControllerOperation)operation + { + if (self = [super init]) { + _operation = operation; +- _transitionDuration = 0.35; // default duration in seconds ++ _transitionDuration = 0.5; // default duration in seconds + } + return self; + } +@@ -129,6 +130,8 @@ - (void)animateSimplePushWithShadowEnabled:(BOOL)shadowEnabled + } + + [UIView animateWithDuration:[self transitionDuration:transitionContext] ++ delay:0 ++ options:UIViewAnimationOptionCurveDefaultTransition + animations:^{ + fromViewController.view.transform = leftTransform; + toViewController.view.transform = CGAffineTransformIdentity; +@@ -170,6 +173,8 @@ - (void)animateSimplePushWithShadowEnabled:(BOOL)shadowEnabled + + if (!transitionContext.isInteractive) { + [UIView animateWithDuration:[self transitionDuration:transitionContext] ++ delay:0 ++ options:UIViewAnimationOptionCurveDefaultTransition + animations:animationBlock + completion:completionBlock]; + } else { +@@ -203,6 +208,8 @@ - (void)animateSlideFromLeftWithTransitionContext:(id; + stackAnimation?: WithDefault; +- transitionDuration?: WithDefault; ++ transitionDuration?: WithDefault; + replaceAnimation?: WithDefault; + swipeDirection?: WithDefault; + hideKeyboardOnSwipe?: boolean; +diff --git a/node_modules/react-native-screens/lib/typescript/fabric/ScreenNativeComponent.d.ts b/node_modules/react-native-screens/lib/typescript/fabric/ScreenNativeComponent.d.ts +index 11ed190..f676e08 100644 +--- a/node_modules/react-native-screens/lib/typescript/fabric/ScreenNativeComponent.d.ts ++++ b/node_modules/react-native-screens/lib/typescript/fabric/ScreenNativeComponent.d.ts +@@ -55,7 +55,7 @@ export interface NativeProps extends ViewProps { + gestureResponseDistance?: GestureResponseDistanceType; + stackPresentation?: WithDefault; + stackAnimation?: WithDefault; +- transitionDuration?: WithDefault; ++ transitionDuration?: WithDefault; + replaceAnimation?: WithDefault; + swipeDirection?: WithDefault; + hideKeyboardOnSwipe?: boolean; +diff --git a/node_modules/react-native-screens/src/fabric/ModalScreenNativeComponent.ts b/node_modules/react-native-screens/src/fabric/ModalScreenNativeComponent.ts +index bb59c4c..d4c14ee 100644 +--- a/node_modules/react-native-screens/src/fabric/ModalScreenNativeComponent.ts ++++ b/node_modules/react-native-screens/src/fabric/ModalScreenNativeComponent.ts +@@ -90,7 +90,7 @@ export interface NativeProps extends ViewProps { + gestureResponseDistance?: GestureResponseDistanceType; + stackPresentation?: WithDefault; + stackAnimation?: WithDefault; +- transitionDuration?: WithDefault; ++ transitionDuration?: WithDefault; + replaceAnimation?: WithDefault; + swipeDirection?: WithDefault; + hideKeyboardOnSwipe?: boolean; +diff --git a/node_modules/react-native-screens/src/fabric/ScreenNativeComponent.ts b/node_modules/react-native-screens/src/fabric/ScreenNativeComponent.ts +index 4e39336..ab0b313 100644 +--- a/node_modules/react-native-screens/src/fabric/ScreenNativeComponent.ts ++++ b/node_modules/react-native-screens/src/fabric/ScreenNativeComponent.ts +@@ -92,7 +92,7 @@ export interface NativeProps extends ViewProps { + gestureResponseDistance?: GestureResponseDistanceType; + stackPresentation?: WithDefault; + stackAnimation?: WithDefault; +- transitionDuration?: WithDefault; ++ transitionDuration?: WithDefault; + replaceAnimation?: WithDefault; + swipeDirection?: WithDefault; + hideKeyboardOnSwipe?: boolean; \ No newline at end of file diff --git a/patches/react-native-screens+3.34.0+005+fix-screen-flicker-on-modal-unmount.patch b/patches/react-native-screens+3.34.0+005+fix-screen-flicker-on-modal-unmount.patch new file mode 100644 index 000000000000..bbeedbc57873 --- /dev/null +++ b/patches/react-native-screens+3.34.0+005+fix-screen-flicker-on-modal-unmount.patch @@ -0,0 +1,22 @@ +diff --git a/node_modules/react-native-screens/ios/RNSScreenStack.mm b/node_modules/react-native-screens/ios/RNSScreenStack.mm +index ea27b03..8f1d005 100644 +--- a/node_modules/react-native-screens/ios/RNSScreenStack.mm ++++ b/node_modules/react-native-screens/ios/RNSScreenStack.mm +@@ -1121,16 +1121,7 @@ - (void)mountChildComponentView:(UIView *)childCompone + - (void)unmountChildComponentView:(UIView *)childComponentView index:(NSInteger)index + { + RNSScreenView *screenChildComponent = (RNSScreenView *)childComponentView; +- +- // We should only do a snapshot of a screen that is on the top. +- // We also check `_presentedModals` since if you push 2 modals, second one is not a "child" of _controller. +- // Also, when dissmised with a gesture, the screen already is not under the window, so we don't need to apply +- // snapshot. +- if (screenChildComponent.window != nil && +- ((screenChildComponent == _controller.visibleViewController.view && _presentedModals.count < 2) || +- screenChildComponent == [_presentedModals.lastObject view])) { +- [screenChildComponent.controller setViewToSnapshot]; +- } ++ [screenChildComponent.controller setViewToSnapshot]; + + RCTAssert( + screenChildComponent.reactSuperview == self, diff --git a/patches/react-native-vision-camera+4.0.0-beta.13+001+rn75-compatibility.patch b/patches/react-native-vision-camera+4.0.0-beta.13+001+rn75-compatibility.patch deleted file mode 100644 index 7c585ddf9f27..000000000000 --- a/patches/react-native-vision-camera+4.0.0-beta.13+001+rn75-compatibility.patch +++ /dev/null @@ -1,2274 +0,0 @@ -diff --git a/node_modules/react-native-vision-camera/VisionCamera.podspec b/node_modules/react-native-vision-camera/VisionCamera.podspec -index 3a0e313..83ab343 100644 ---- a/node_modules/react-native-vision-camera/VisionCamera.podspec -+++ b/node_modules/react-native-vision-camera/VisionCamera.podspec -@@ -2,7 +2,13 @@ require "json" - - package = JSON.parse(File.read(File.join(__dir__, "package.json"))) - --nodeModules = File.join(File.dirname(`cd "#{Pod::Config.instance.installation_root.to_s}" && node --print "require.resolve('react-native/package.json')"`), '..') -+pkgJsonPath = ENV['REACT_NATIVE_DIR'] ? '../react-native/package.json' : 'react-native/package.json' -+nodeModules = File.join(File.dirname(`cd "#{Pod::Config.instance.installation_root.to_s}" && node --print "require.resolve('#{pkgJsonPath}')"`), '..') -+ -+frameworks_flags = { -+ "OTHER_CFLAGS" => "$(inherited) -DUSE_FRAMEWORKS", -+ "OTHER_CPLUSPLUSFLAGS" => "$(inherited) -DUSE_FRAMEWORKS", -+} - - forceDisableFrameProcessors = false - if defined?($VCDisableFrameProcessors) -@@ -15,6 +21,13 @@ workletsPath = File.join(nodeModules, "react-native-worklets-core") - hasWorklets = File.exist?(workletsPath) && !forceDisableFrameProcessors - Pod::UI.puts("[VisionCamera] react-native-worklets-core #{hasWorklets ? "found" : "not found"}, Frame Processors #{hasWorklets ? "enabled" : "disabled"}!") - -+default_config = { -+ "GCC_PREPROCESSOR_DEFINITIONS" => "$(inherited) SK_METAL=1 SK_GANESH=1 VISION_CAMERA_ENABLE_FRAME_PROCESSORS=#{hasWorklets}", -+ "OTHER_SWIFT_FLAGS" => "$(inherited) -DRCT_NEW_ARCH_ENABLED #{hasWorklets ? "-D VISION_CAMERA_ENABLE_FRAME_PROCESSORS" : ""}", -+ "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", -+ "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/cpp/\"/** " -+} -+ - Pod::Spec.new do |s| - s.name = "VisionCamera" - s.version = package["version"] -@@ -27,19 +40,13 @@ Pod::Spec.new do |s| - s.platforms = { :ios => "12.4" } - s.source = { :git => "https://github.com/mrousavy/react-native-vision-camera.git", :tag => "#{s.version}" } - -- s.pod_target_xcconfig = { -- "GCC_PREPROCESSOR_DEFINITIONS" => "$(inherited) SK_METAL=1 SK_GANESH=1 VISION_CAMERA_ENABLE_FRAME_PROCESSORS=#{hasWorklets}", -- "OTHER_SWIFT_FLAGS" => "$(inherited) #{hasWorklets ? "-D VISION_CAMERA_ENABLE_FRAME_PROCESSORS" : ""}", -- "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", -- "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/cpp/\"/** " -- } -- - s.requires_arc = true - - # All source files that should be publicly visible - # Note how this does not include headers, since those can nameclash. - s.source_files = [ - # Core -+ "ios/VisionCamera.h", - "ios/*.{m,mm,swift}", - "ios/Core/*.{m,mm,swift}", - "ios/Extensions/*.{m,mm,swift}", -@@ -47,6 +54,7 @@ Pod::Spec.new do |s| - "ios/React Utils/*.{m,mm,swift}", - "ios/Types/*.{m,mm,swift}", - "ios/CameraBridge.h", -+ "ios/RNCameraView.h", - - # Frame Processors - hasWorklets ? "ios/Frame Processor/*.{m,mm,swift}" : "", -@@ -66,9 +74,12 @@ Pod::Spec.new do |s| - "ios/**/*.h" - ] - -- s.dependency "React" -- s.dependency "React-Core" -- s.dependency "React-callinvoker" -+ if ENV['USE_FRAMEWORKS'] == '1' -+ s.pod_target_xcconfig = default_config.merge(frameworks_flags) -+ else -+ s.pod_target_xcconfig = default_config -+ end -+ install_modules_dependencies(s) - - if hasWorklets - s.dependency "react-native-worklets-core" -diff --git a/node_modules/react-native-vision-camera/android/.editorconfig b/node_modules/react-native-vision-camera/android/.editorconfig -new file mode 100644 -index 0000000..2f08d6d ---- /dev/null -+++ b/node_modules/react-native-vision-camera/android/.editorconfig -@@ -0,0 +1,15 @@ -+[*.{kt,kts}] -+indent_style=space -+indent_size=2 -+continuation_indent_size=4 -+insert_final_newline=true -+max_line_length=140 -+ktlint_code_style=android_studio -+ktlint_standard=enabled -+ktlint_experimental=enabled -+ktlint_standard_filename=disabled # dont require PascalCase filenames -+ktlint_standard_no-wildcard-imports=disabled # allow .* imports -+ktlint_function_signature_rule_force_multiline_when_parameter_count_greater_or_equal_than=5 -+ktlint_function_signature_body_expression_wrapping=multiline -+ij_kotlin_allow_trailing_comma_on_call_site=false -+ij_kotlin_allow_trailing_comma=false -diff --git a/node_modules/react-native-vision-camera/android/.project b/node_modules/react-native-vision-camera/android/.project -new file mode 100644 -index 0000000..0e0a1ba ---- /dev/null -+++ b/node_modules/react-native-vision-camera/android/.project -@@ -0,0 +1,17 @@ -+ -+ -+ android_ -+ Project android_ created by Buildship. -+ -+ -+ -+ -+ org.eclipse.buildship.core.gradleprojectbuilder -+ -+ -+ -+ -+ -+ org.eclipse.buildship.core.gradleprojectnature -+ -+ -diff --git a/node_modules/react-native-vision-camera/android/build.gradle b/node_modules/react-native-vision-camera/android/build.gradle -index 86e6290..eb59c56 100644 ---- a/node_modules/react-native-vision-camera/android/build.gradle -+++ b/node_modules/react-native-vision-camera/android/build.gradle -@@ -129,6 +129,12 @@ android { - sourceSets { - main { - manifest.srcFile androidManifestPath -+ -+ java { -+ if (!isNewArchitectureEnabled()) { -+ srcDirs += 'oldarch/src/main/java' -+ } -+ } - } - } - -diff --git a/node_modules/react-native-vision-camera/android/gradlew b/node_modules/react-native-vision-camera/android/gradlew -new file mode 100755 -index 0000000..1b6c787 ---- /dev/null -+++ b/node_modules/react-native-vision-camera/android/gradlew -@@ -0,0 +1,234 @@ -+#!/bin/sh -+ -+# -+# Copyright © 2015-2021 the original authors. -+# -+# Licensed under the Apache License, Version 2.0 (the "License"); -+# you may not use this file except in compliance with the License. -+# You may obtain a copy of the License at -+# -+# https://www.apache.org/licenses/LICENSE-2.0 -+# -+# Unless required by applicable law or agreed to in writing, software -+# distributed under the License is distributed on an "AS IS" BASIS, -+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+# See the License for the specific language governing permissions and -+# limitations under the License. -+# -+ -+############################################################################## -+# -+# Gradle start up script for POSIX generated by Gradle. -+# -+# Important for running: -+# -+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -+# noncompliant, but you have some other compliant shell such as ksh or -+# bash, then to run this script, type that shell name before the whole -+# command line, like: -+# -+# ksh Gradle -+# -+# Busybox and similar reduced shells will NOT work, because this script -+# requires all of these POSIX shell features: -+# * functions; -+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -+# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -+# * compound commands having a testable exit status, especially «case»; -+# * various built-in commands including «command», «set», and «ulimit». -+# -+# Important for patching: -+# -+# (2) This script targets any POSIX shell, so it avoids extensions provided -+# by Bash, Ksh, etc; in particular arrays are avoided. -+# -+# The "traditional" practice of packing multiple parameters into a -+# space-separated string is a well documented source of bugs and security -+# problems, so this is (mostly) avoided, by progressively accumulating -+# options in "$@", and eventually passing that to Java. -+# -+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -+# see the in-line comments for details. -+# -+# There are tweaks for specific operating systems such as AIX, CygWin, -+# 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 -+# within the Gradle project. -+# -+# You can find Gradle at https://github.com/gradle/gradle/. -+# -+############################################################################## -+ -+# Attempt to set APP_HOME -+ -+# Resolve links: $0 may be a link -+app_path=$0 -+ -+# Need this for daisy-chained symlinks. -+while -+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path -+ [ -h "$app_path" ] -+do -+ ls=$( ls -ld "$app_path" ) -+ link=${ls#*' -> '} -+ case $link in #( -+ /*) app_path=$link ;; #( -+ *) app_path=$APP_HOME$link ;; -+ esac -+done -+ -+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit -+ -+APP_NAME="Gradle" -+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"' -+ -+# Use the maximum available, or set MAX_FD != -1 to use that value. -+MAX_FD=maximum -+ -+warn () { -+ echo "$*" -+} >&2 -+ -+die () { -+ echo -+ echo "$*" -+ echo -+ exit 1 -+} >&2 -+ -+# OS specific support (must be 'true' or 'false'). -+cygwin=false -+msys=false -+darwin=false -+nonstop=false -+case "$( uname )" in #( -+ CYGWIN* ) cygwin=true ;; #( -+ Darwin* ) darwin=true ;; #( -+ MSYS* | MINGW* ) msys=true ;; #( -+ NONSTOP* ) nonstop=true ;; -+esac -+ -+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar -+ -+ -+# Determine the Java command to use to start the JVM. -+if [ -n "$JAVA_HOME" ] ; then -+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then -+ # IBM's JDK on AIX uses strange locations for the executables -+ JAVACMD=$JAVA_HOME/jre/sh/java -+ else -+ JAVACMD=$JAVA_HOME/bin/java -+ fi -+ if [ ! -x "$JAVACMD" ] ; then -+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME -+ -+Please set the JAVA_HOME variable in your environment to match the -+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. -+ -+Please set the JAVA_HOME variable in your environment to match the -+location of your Java installation." -+fi -+ -+# Increase the maximum file descriptors if we can. -+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then -+ case $MAX_FD in #( -+ max*) -+ MAX_FD=$( ulimit -H -n ) || -+ warn "Could not query maximum file descriptor limit" -+ esac -+ case $MAX_FD in #( -+ '' | soft) :;; #( -+ *) -+ ulimit -n "$MAX_FD" || -+ warn "Could not set maximum file descriptor limit to $MAX_FD" -+ esac -+fi -+ -+# Collect all arguments for the java command, stacking in reverse order: -+# * args from the command line -+# * the main class name -+# * -classpath -+# * -D...appname settings -+# * --module-path (only if needed) -+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -+ -+# For Cygwin or MSYS, switch paths to Windows format before running java -+if "$cygwin" || "$msys" ; then -+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) -+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) -+ -+ JAVACMD=$( cygpath --unix "$JAVACMD" ) -+ -+ # Now convert the arguments - kludge to limit ourselves to /bin/sh -+ for arg do -+ if -+ case $arg in #( -+ -*) false ;; # don't mess with options #( -+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath -+ [ -e "$t" ] ;; #( -+ *) false ;; -+ esac -+ then -+ arg=$( cygpath --path --ignore --mixed "$arg" ) -+ fi -+ # Roll the args list around exactly as many times as the number of -+ # args, so each arg winds up back in the position where it started, but -+ # possibly modified. -+ # -+ # NB: a `for` loop captures its iteration list before it begins, so -+ # changing the positional parameters here affects neither the number of -+ # iterations, nor the values presented in `arg`. -+ shift # remove old arg -+ set -- "$@" "$arg" # push replacement arg -+ done -+fi -+ -+# 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 -+# double quotes to make sure that they get re-expanded; and -+# * put everything else in single quotes, so that it's not re-expanded. -+ -+set -- \ -+ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -+ -classpath "$CLASSPATH" \ -+ org.gradle.wrapper.GradleWrapperMain \ -+ "$@" -+ -+# Use "xargs" to parse quoted args. -+# -+# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -+# -+# In Bash we could simply go: -+# -+# readarray ARGS < <( xargs -n1 <<<"$var" ) && -+# set -- "${ARGS[@]}" "$@" -+# -+# but POSIX shell has neither arrays nor command substitution, so instead we -+# post-process each arg (as a line of input to sed) to backslash-escape any -+# character that might be a shell metacharacter, then use eval to reverse -+# that process (while maintaining the separation between arguments), and wrap -+# the whole thing up as a single "set" statement. -+# -+# This will of course break if any of these variables contains a newline or -+# an unmatched quote. -+# -+ -+eval "set -- $( -+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | -+ xargs -n1 | -+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | -+ tr '\n' ' ' -+ )" '"$@"' -+ -+exec "$JAVACMD" "$@" -diff --git a/node_modules/react-native-vision-camera/android/gradlew.bat b/node_modules/react-native-vision-camera/android/gradlew.bat -new file mode 100644 -index 0000000..107acd3 ---- /dev/null -+++ b/node_modules/react-native-vision-camera/android/gradlew.bat -@@ -0,0 +1,89 @@ -+@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 -diff --git a/node_modules/react-native-vision-camera/android/oldarch/src/main/java/com/facebook/react/viewmanagers/CameraViewManagerDelegate.java b/node_modules/react-native-vision-camera/android/oldarch/src/main/java/com/facebook/react/viewmanagers/CameraViewManagerDelegate.java -new file mode 100644 -index 0000000..afafa8a ---- /dev/null -+++ b/node_modules/react-native-vision-camera/android/oldarch/src/main/java/com/facebook/react/viewmanagers/CameraViewManagerDelegate.java -@@ -0,0 +1,113 @@ -+/** -+* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+* -+* Do not edit this file as changes may cause incorrect behavior and will be lost -+* once the code is regenerated. -+* -+* @generated by codegen project: GeneratePropsJavaDelegate.js -+*/ -+ -+package com.facebook.react.viewmanagers; -+ -+import android.view.View; -+import androidx.annotation.Nullable; -+import com.facebook.react.bridge.ReadableMap; -+import com.facebook.react.uimanager.BaseViewManagerDelegate; -+import com.facebook.react.uimanager.BaseViewManagerInterface; -+ -+public class CameraViewManagerDelegate & CameraViewManagerInterface> extends BaseViewManagerDelegate { -+ public CameraViewManagerDelegate(U viewManager) { -+ super(viewManager); -+ } -+ @Override -+ public void setProperty(T view, String propName, @Nullable Object value) { -+ switch (propName) { -+ case "enableGpuBuffers": -+ mViewManager.setEnableGpuBuffers(view, value == null ? false : (boolean) value); -+ break; -+ case "androidPreviewViewType": -+ mViewManager.setAndroidPreviewViewType(view, value == null ? null : (String) value); -+ break; -+ case "codeScannerOptions": -+ mViewManager.setCodeScannerOptions(view, (ReadableMap) value); -+ break; -+ case "cameraId": -+ mViewManager.setCameraId(view, value == null ? null : (String) value); -+ break; -+ case "enableFrameProcessor": -+ mViewManager.setEnableFrameProcessor(view, value == null ? false : (boolean) value); -+ break; -+ case "enableLocation": -+ mViewManager.setEnableLocation(view, value == null ? false : (boolean) value); -+ break; -+ case "enableBufferCompression": -+ mViewManager.setEnableBufferCompression(view, value == null ? false : (boolean) value); -+ break; -+ case "photoQualityBalance": -+ mViewManager.setPhotoQualityBalance(view, value == null ? null : (String) value); -+ break; -+ case "isActive": -+ mViewManager.setIsActive(view, value == null ? false : (boolean) value); -+ break; -+ case "photo": -+ mViewManager.setPhoto(view, value == null ? false : (boolean) value); -+ break; -+ case "video": -+ mViewManager.setVideo(view, value == null ? false : (boolean) value); -+ break; -+ case "audio": -+ mViewManager.setAudio(view, value == null ? false : (boolean) value); -+ break; -+ case "torch": -+ mViewManager.setTorch(view, value == null ? null : (String) value); -+ break; -+ case "zoom": -+ mViewManager.setZoom(view, value == null ? 0f : ((Double) value).doubleValue()); -+ break; -+ case "exposure": -+ mViewManager.setExposure(view, value == null ? 0f : ((Double) value).doubleValue()); -+ break; -+ case "enableZoomGesture": -+ mViewManager.setEnableZoomGesture(view, value == null ? false : (boolean) value); -+ break; -+ case "enableFpsGraph": -+ mViewManager.setEnableFpsGraph(view, value == null ? false : (boolean) value); -+ break; -+ case "resizeMode": -+ mViewManager.setResizeMode(view, value == null ? null : (String) value); -+ break; -+ case "format": -+ mViewManager.setFormat(view, (ReadableMap) value); -+ break; -+ case "pixelFormat": -+ mViewManager.setPixelFormat(view, value == null ? null : (String) value); -+ break; -+ case "fps": -+ mViewManager.setFps(view, value == null ? 0 : ((Double) value).intValue()); -+ break; -+ case "videoHdr": -+ mViewManager.setVideoHdr(view, value == null ? false : (boolean) value); -+ break; -+ case "photoHdr": -+ mViewManager.setPhotoHdr(view, value == null ? false : (boolean) value); -+ break; -+ case "lowLightBoost": -+ mViewManager.setLowLightBoost(view, value == null ? false : (boolean) value); -+ break; -+ case "videoStabilizationMode": -+ mViewManager.setVideoStabilizationMode(view, value == null ? null : (String) value); -+ break; -+ case "enableDepthData": -+ mViewManager.setEnableDepthData(view, value == null ? false : (boolean) value); -+ break; -+ case "enablePortraitEffectsMatteDelivery": -+ mViewManager.setEnablePortraitEffectsMatteDelivery(view, value == null ? false : (boolean) value); -+ break; -+ case "orientation": -+ mViewManager.setOrientation(view, value == null ? null : (String) value); -+ break; -+ default: -+ super.setProperty(view, propName, value); -+ } -+ } -+} -diff --git a/node_modules/react-native-vision-camera/android/oldarch/src/main/java/com/facebook/react/viewmanagers/CameraViewManagerInterface.java b/node_modules/react-native-vision-camera/android/oldarch/src/main/java/com/facebook/react/viewmanagers/CameraViewManagerInterface.java -new file mode 100644 -index 0000000..94079b2 ---- /dev/null -+++ b/node_modules/react-native-vision-camera/android/oldarch/src/main/java/com/facebook/react/viewmanagers/CameraViewManagerInterface.java -@@ -0,0 +1,45 @@ -+/** -+* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). -+* -+* Do not edit this file as changes may cause incorrect behavior and will be lost -+* once the code is regenerated. -+* -+* @generated by codegen project: GeneratePropsJavaInterface.js -+*/ -+ -+package com.facebook.react.viewmanagers; -+ -+import android.view.View; -+import androidx.annotation.Nullable; -+import com.facebook.react.bridge.ReadableMap; -+ -+public interface CameraViewManagerInterface { -+ void setEnableGpuBuffers(T view, boolean value); -+ void setAndroidPreviewViewType(T view, @Nullable String value); -+ void setCodeScannerOptions(T view, @Nullable ReadableMap value); -+ void setCameraId(T view, @Nullable String value); -+ void setEnableFrameProcessor(T view, boolean value); -+ void setEnableLocation(T view, boolean value); -+ void setEnableBufferCompression(T view, boolean value); -+ void setPhotoQualityBalance(T view, @Nullable String value); -+ void setIsActive(T view, boolean value); -+ void setPhoto(T view, boolean value); -+ void setVideo(T view, boolean value); -+ void setAudio(T view, boolean value); -+ void setTorch(T view, @Nullable String value); -+ void setZoom(T view, double value); -+ void setExposure(T view, double value); -+ void setEnableZoomGesture(T view, boolean value); -+ void setEnableFpsGraph(T view, boolean value); -+ void setResizeMode(T view, @Nullable String value); -+ void setFormat(T view, @Nullable ReadableMap value); -+ void setPixelFormat(T view, @Nullable String value); -+ void setFps(T view, int value); -+ void setVideoHdr(T view, boolean value); -+ void setPhotoHdr(T view, boolean value); -+ void setLowLightBoost(T view, boolean value); -+ void setVideoStabilizationMode(T view, @Nullable String value); -+ void setEnableDepthData(T view, boolean value); -+ void setEnablePortraitEffectsMatteDelivery(T view, boolean value); -+ void setOrientation(T view, @Nullable String value); -+} -diff --git a/node_modules/react-native-vision-camera/android/settings.gradle b/node_modules/react-native-vision-camera/android/settings.gradle -new file mode 100644 -index 0000000..56a6c3d ---- /dev/null -+++ b/node_modules/react-native-vision-camera/android/settings.gradle -@@ -0,0 +1,3 @@ -+rootProject.name = 'VisionCamera' -+ -+include ':VisionCamera' -diff --git a/node_modules/react-native-vision-camera/android/src/main/.DS_Store b/node_modules/react-native-vision-camera/android/src/main/.DS_Store -new file mode 100644 -index 0000000..e69de29 -diff --git a/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/CameraDevicesManager.kt b/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/CameraDevicesManager.kt -index a7c8358..a935ef6 100644 ---- a/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/CameraDevicesManager.kt -+++ b/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/CameraDevicesManager.kt -@@ -20,7 +20,7 @@ import kotlinx.coroutines.launch - - class CameraDevicesManager(private val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) { - companion object { -- private const val TAG = "CameraDevices" -+ public const val TAG = "CameraDevices" - } - private val executor = CameraQueues.cameraExecutor - private val coroutineScope = CoroutineScope(executor.asCoroutineDispatcher()) -diff --git a/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/CameraPackage.kt b/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/CameraPackage.kt -index 25e1f55..33b9dd3 100644 ---- a/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/CameraPackage.kt -+++ b/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/CameraPackage.kt -@@ -1,11 +1,14 @@ - package com.mrousavy.camera - --import com.facebook.react.ReactPackage -+import com.facebook.react.TurboReactPackage - import com.facebook.react.bridge.NativeModule - import com.facebook.react.bridge.ReactApplicationContext -+import com.facebook.react.module.model.ReactModuleInfo -+import com.facebook.react.module.model.ReactModuleInfoProvider - import com.facebook.react.uimanager.ViewManager - --class CameraPackage : ReactPackage { -+ -+class CameraPackage : TurboReactPackage() { - override fun createNativeModules(reactContext: ReactApplicationContext): List = - listOf( - CameraViewModule(reactContext), -@@ -13,4 +16,39 @@ class CameraPackage : ReactPackage { - ) - - override fun createViewManagers(reactContext: ReactApplicationContext): List> = listOf(CameraViewManager()) -+ -+ override fun getModule(name: String, context: ReactApplicationContext): NativeModule? { -+ return when (name) { -+ CameraViewModule.TAG -> CameraViewModule(context) -+ CameraDevicesManager.TAG -> CameraDevicesManager(context) -+ else -> null -+ } -+ } -+ -+ override fun getReactModuleInfoProvider(): ReactModuleInfoProvider { -+ return ReactModuleInfoProvider { -+ val moduleInfos: MutableMap = HashMap() -+ -+ moduleInfos[CameraViewModule.TAG] = ReactModuleInfo( -+ CameraViewModule.TAG, -+ CameraViewModule.TAG, -+ false, // canOverrideExistingModule -+ true, // needsEagerInit -+ true, // hasConstants -+ false, // isCxxModule -+ false // isTurboModule -+ ) -+ -+ moduleInfos[CameraDevicesManager.TAG] = ReactModuleInfo( -+ CameraDevicesManager.TAG, -+ CameraDevicesManager.TAG, -+ false, // canOverrideExistingModule -+ true, // needsEagerInit -+ true, // hasConstants -+ false, // isCxxModule -+ false // isTurboModule -+ ) -+ moduleInfos -+ } -+ } - } -diff --git a/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt b/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt -index f2b284c..4bb2ebc 100644 ---- a/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt -+++ b/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/CameraViewManager.kt -@@ -4,8 +4,18 @@ import com.facebook.react.bridge.ReadableMap - import com.facebook.react.common.MapBuilder - import com.facebook.react.uimanager.ThemedReactContext - import com.facebook.react.uimanager.ViewGroupManager -+import com.facebook.react.uimanager.ViewManagerDelegate - import com.facebook.react.uimanager.annotations.ReactProp -+import com.facebook.react.viewmanagers.CameraViewManagerDelegate -+import com.facebook.react.viewmanagers.CameraViewManagerInterface -+import com.mrousavy.camera.types.CameraCodeScannedEvent - import com.mrousavy.camera.types.CameraDeviceFormat -+import com.mrousavy.camera.types.CameraErrorEvent -+import com.mrousavy.camera.types.CameraInitializedEvent -+import com.mrousavy.camera.types.CameraShutterEvent -+import com.mrousavy.camera.types.CameraStartedEvent -+import com.mrousavy.camera.types.CameraStoppedEvent -+import com.mrousavy.camera.types.CameraViewReadyEvent - import com.mrousavy.camera.types.CodeScannerOptions - import com.mrousavy.camera.types.Orientation - import com.mrousavy.camera.types.PixelFormat -@@ -16,10 +26,19 @@ import com.mrousavy.camera.types.Torch - import com.mrousavy.camera.types.VideoStabilizationMode - - @Suppress("unused") --class CameraViewManager : ViewGroupManager() { -+class CameraViewManager : ViewGroupManager(), CameraViewManagerInterface { - companion object { - const val TAG = "CameraView" - } -+ -+ private val mDelegate: ViewManagerDelegate -+ -+ init { -+ mDelegate = CameraViewManagerDelegate(this) -+ } -+ -+ override fun getDelegate() = mDelegate -+ - public override fun createViewInstance(context: ThemedReactContext): CameraView = CameraView(context) - - override fun onAfterUpdateTransaction(view: CameraView) { -@@ -29,13 +48,13 @@ class CameraViewManager : ViewGroupManager() { - - override fun getExportedCustomDirectEventTypeConstants(): MutableMap? = - MapBuilder.builder() -- .put("cameraViewReady", MapBuilder.of("registrationName", "onViewReady")) -- .put("cameraInitialized", MapBuilder.of("registrationName", "onInitialized")) -- .put("cameraStarted", MapBuilder.of("registrationName", "onStarted")) -- .put("cameraStopped", MapBuilder.of("registrationName", "onStopped")) -- .put("cameraShutter", MapBuilder.of("registrationName", "onShutter")) -- .put("cameraError", MapBuilder.of("registrationName", "onError")) -- .put("cameraCodeScanned", MapBuilder.of("registrationName", "onCodeScanned")) -+ .put(CameraViewReadyEvent.EVENT_NAME, MapBuilder.of("registrationName", "onViewReady")) -+ .put(CameraInitializedEvent.EVENT_NAME, MapBuilder.of("registrationName", "onInitialized")) -+ .put(CameraStartedEvent.EVENT_NAME, MapBuilder.of("registrationName", "onStarted")) -+ .put(CameraStoppedEvent.EVENT_NAME, MapBuilder.of("registrationName", "onStopped")) -+ .put(CameraShutterEvent.EVENT_NAME, MapBuilder.of("registrationName", "onShutter")) -+ .put(CameraErrorEvent.EVENT_NAME, MapBuilder.of("registrationName", "onError")) -+ .put(CameraCodeScannedEvent.EVENT_NAME, MapBuilder.of("registrationName", "onCodeScanned")) - .build() - - override fun getName(): String = TAG -@@ -46,37 +65,37 @@ class CameraViewManager : ViewGroupManager() { - } - - @ReactProp(name = "cameraId") -- fun setCameraId(view: CameraView, cameraId: String) { -+ override fun setCameraId(view: CameraView, cameraId: String?) { - view.cameraId = cameraId - } - - @ReactProp(name = "photo") -- fun setPhoto(view: CameraView, photo: Boolean) { -+ override fun setPhoto(view: CameraView, photo: Boolean) { - view.photo = photo - } - - @ReactProp(name = "video") -- fun setVideo(view: CameraView, video: Boolean) { -+ override fun setVideo(view: CameraView, video: Boolean) { - view.video = video - } - - @ReactProp(name = "audio") -- fun setAudio(view: CameraView, audio: Boolean) { -+ override fun setAudio(view: CameraView, audio: Boolean) { - view.audio = audio - } - - @ReactProp(name = "enableLocation") -- fun setEnableLocation(view: CameraView, enableLocation: Boolean) { -+ override fun setEnableLocation(view: CameraView, enableLocation: Boolean) { - view.enableLocation = enableLocation - } - - @ReactProp(name = "enableFrameProcessor") -- fun setEnableFrameProcessor(view: CameraView, enableFrameProcessor: Boolean) { -+ override fun setEnableFrameProcessor(view: CameraView, enableFrameProcessor: Boolean) { - view.enableFrameProcessor = enableFrameProcessor - } - - @ReactProp(name = "pixelFormat") -- fun setPixelFormat(view: CameraView, pixelFormat: String?) { -+ override fun setPixelFormat(view: CameraView, pixelFormat: String?) { - if (pixelFormat != null) { - val newPixelFormat = PixelFormat.fromUnionValue(pixelFormat) - view.pixelFormat = newPixelFormat -@@ -86,27 +105,27 @@ class CameraViewManager : ViewGroupManager() { - } - - @ReactProp(name = "enableDepthData") -- fun setEnableDepthData(view: CameraView, enableDepthData: Boolean) { -+ override fun setEnableDepthData(view: CameraView, enableDepthData: Boolean) { - view.enableDepthData = enableDepthData - } - - @ReactProp(name = "enableZoomGesture") -- fun setEnableZoomGesture(view: CameraView, enableZoomGesture: Boolean) { -+ override fun setEnableZoomGesture(view: CameraView, enableZoomGesture: Boolean) { - view.enableZoomGesture = enableZoomGesture - } - - @ReactProp(name = "enableFpsGraph") -- fun setEnableFpsGraph(view: CameraView, enableFpsGraph: Boolean) { -+ override fun setEnableFpsGraph(view: CameraView, enableFpsGraph: Boolean) { - view.enableFpsGraph = enableFpsGraph - } - - @ReactProp(name = "enableGpuBuffers") -- fun setEnableGpuBuffers(view: CameraView, enableGpuBuffers: Boolean) { -+ override fun setEnableGpuBuffers(view: CameraView, enableGpuBuffers: Boolean) { - view.enableGpuBuffers = enableGpuBuffers - } - - @ReactProp(name = "videoStabilizationMode") -- fun setVideoStabilizationMode(view: CameraView, videoStabilizationMode: String?) { -+ override fun setVideoStabilizationMode(view: CameraView, videoStabilizationMode: String?) { - if (videoStabilizationMode != null) { - val newMode = VideoStabilizationMode.fromUnionValue(videoStabilizationMode) - view.videoStabilizationMode = newMode -@@ -116,12 +135,12 @@ class CameraViewManager : ViewGroupManager() { - } - - @ReactProp(name = "enablePortraitEffectsMatteDelivery") -- fun setEnablePortraitEffectsMatteDelivery(view: CameraView, enablePortraitEffectsMatteDelivery: Boolean) { -+ override fun setEnablePortraitEffectsMatteDelivery(view: CameraView, enablePortraitEffectsMatteDelivery: Boolean) { - view.enablePortraitEffectsMatteDelivery = enablePortraitEffectsMatteDelivery - } - - @ReactProp(name = "format") -- fun setFormat(view: CameraView, format: ReadableMap?) { -+ override fun setFormat(view: CameraView, format: ReadableMap?) { - if (format != null) { - val newFormat = CameraDeviceFormat.fromJSValue(format) - view.format = newFormat -@@ -131,7 +150,7 @@ class CameraViewManager : ViewGroupManager() { - } - - @ReactProp(name = "resizeMode") -- fun setResizeMode(view: CameraView, resizeMode: String?) { -+ override fun setResizeMode(view: CameraView, resizeMode: String?) { - if (resizeMode != null) { - val newMode = ResizeMode.fromUnionValue(resizeMode) - view.resizeMode = newMode -@@ -141,7 +160,7 @@ class CameraViewManager : ViewGroupManager() { - } - - @ReactProp(name = "androidPreviewViewType") -- fun setAndroidPreviewViewType(view: CameraView, androidPreviewViewType: String?) { -+ override fun setAndroidPreviewViewType(view: CameraView, androidPreviewViewType: String?) { - if (androidPreviewViewType != null) { - val newMode = PreviewViewType.fromUnionValue(androidPreviewViewType) - view.androidPreviewViewType = newMode -@@ -154,17 +173,17 @@ class CameraViewManager : ViewGroupManager() { - // We're treating -1 as "null" here, because when I make the fps parameter - // of type "Int?" the react bridge throws an error. - @ReactProp(name = "fps", defaultInt = -1) -- fun setFps(view: CameraView, fps: Int) { -+ override fun setFps(view: CameraView, fps: Int) { - view.fps = if (fps > 0) fps else null - } - - @ReactProp(name = "photoHdr") -- fun setPhotoHdr(view: CameraView, photoHdr: Boolean) { -+ override fun setPhotoHdr(view: CameraView, photoHdr: Boolean) { - view.photoHdr = photoHdr - } - - @ReactProp(name = "photoQualityBalance") -- fun setPhotoQualityBalance(view: CameraView, photoQualityBalance: String?) { -+ override fun setPhotoQualityBalance(view: CameraView, photoQualityBalance: String?) { - if (photoQualityBalance != null) { - val newMode = QualityBalance.fromUnionValue(photoQualityBalance) - view.photoQualityBalance = newMode -@@ -174,22 +193,22 @@ class CameraViewManager : ViewGroupManager() { - } - - @ReactProp(name = "videoHdr") -- fun setVideoHdr(view: CameraView, videoHdr: Boolean) { -+ override fun setVideoHdr(view: CameraView, videoHdr: Boolean) { - view.videoHdr = videoHdr - } - - @ReactProp(name = "lowLightBoost") -- fun setLowLightBoost(view: CameraView, lowLightBoost: Boolean) { -+ override fun setLowLightBoost(view: CameraView, lowLightBoost: Boolean) { - view.lowLightBoost = lowLightBoost - } - - @ReactProp(name = "isActive") -- fun setIsActive(view: CameraView, isActive: Boolean) { -+ override fun setIsActive(view: CameraView, isActive: Boolean) { - view.isActive = isActive - } - - @ReactProp(name = "torch") -- fun setTorch(view: CameraView, torch: String?) { -+ override fun setTorch(view: CameraView, torch: String?) { - if (torch != null) { - val newMode = Torch.fromUnionValue(torch) - view.torch = newMode -@@ -199,17 +218,17 @@ class CameraViewManager : ViewGroupManager() { - } - - @ReactProp(name = "zoom") -- fun setZoom(view: CameraView, zoom: Double) { -+ override fun setZoom(view: CameraView, zoom: Double) { - view.zoom = zoom.toFloat() - } - - @ReactProp(name = "exposure") -- fun setExposure(view: CameraView, exposure: Double) { -+ override fun setExposure(view: CameraView, exposure: Double) { - view.exposure = exposure - } - - @ReactProp(name = "orientation") -- fun setOrientation(view: CameraView, orientation: String?) { -+ override fun setOrientation(view: CameraView, orientation: String?) { - if (orientation != null) { - val newMode = Orientation.fromUnionValue(orientation) - view.orientation = newMode -@@ -219,7 +238,7 @@ class CameraViewManager : ViewGroupManager() { - } - - @ReactProp(name = "codeScannerOptions") -- fun setCodeScanner(view: CameraView, codeScannerOptions: ReadableMap?) { -+ override fun setCodeScannerOptions(view: CameraView, codeScannerOptions: ReadableMap?) { - if (codeScannerOptions != null) { - val newCodeScannerOptions = CodeScannerOptions.fromJSValue(codeScannerOptions) - view.codeScannerOptions = newCodeScannerOptions -@@ -227,4 +246,8 @@ class CameraViewManager : ViewGroupManager() { - view.codeScannerOptions = null - } - } -+ -+ override fun setEnableBufferCompression(view: CameraView?, value: Boolean) { -+ // ios only -+ } - } -diff --git a/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/frameprocessor/VisionCameraProxy.kt b/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/frameprocessor/VisionCameraProxy.kt -index b9d3f67..cb70963 100644 ---- a/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/frameprocessor/VisionCameraProxy.kt -+++ b/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/frameprocessor/VisionCameraProxy.kt -@@ -7,12 +7,14 @@ import com.facebook.jni.HybridData - import com.facebook.proguard.annotations.DoNotStrip - import com.facebook.react.bridge.ReactApplicationContext - import com.facebook.react.bridge.UiThreadUtil -+import com.facebook.react.common.annotations.FrameworkAPI - import com.facebook.react.turbomodule.core.CallInvokerHolderImpl - import com.facebook.react.uimanager.UIManagerHelper - import com.mrousavy.camera.CameraView - import com.mrousavy.camera.core.ViewNotFoundError - import java.lang.ref.WeakReference - -+@OptIn(FrameworkAPI::class) - @Suppress("KotlinJniMissingFunction") // we use fbjni. - class VisionCameraProxy(private val reactContext: ReactApplicationContext) { - companion object { -diff --git a/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/types/Events.kt b/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/types/Events.kt -index 1ed0355..b8ff7cf 100644 ---- a/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/types/Events.kt -+++ b/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/types/Events.kt -@@ -3,39 +3,61 @@ package com.mrousavy.camera.types - import com.facebook.react.bridge.Arguments - import com.facebook.react.bridge.WritableMap - import com.facebook.react.uimanager.events.Event -+import com.mrousavy.camera.types.CameraInitializedEvent.Companion.EVENT_NAME - - class CameraInitializedEvent(surfaceId: Int, viewId: Int) : Event(surfaceId, viewId) { -- override fun getEventName() = "cameraInitialized" -+ override fun getEventName() = EVENT_NAME - override fun getEventData(): WritableMap = Arguments.createMap() -+ companion object { -+ const val EVENT_NAME = "topInitialized" -+ } - } - - class CameraStartedEvent(surfaceId: Int, viewId: Int) : Event(surfaceId, viewId) { -- override fun getEventName() = "cameraStarted" -+ override fun getEventName() = EVENT_NAME - override fun getEventData(): WritableMap = Arguments.createMap() -+ companion object { -+ const val EVENT_NAME = "topStarted" -+ } - } - - class CameraStoppedEvent(surfaceId: Int, viewId: Int) : Event(surfaceId, viewId) { -- override fun getEventName() = "cameraStopped" -+ override fun getEventName() = EVENT_NAME - override fun getEventData(): WritableMap = Arguments.createMap() -+ companion object { -+ const val EVENT_NAME = "topStopped" -+ } - } - - class CameraShutterEvent(surfaceId: Int, viewId: Int, private val data: WritableMap) : Event(surfaceId, viewId) { -- override fun getEventName() = "cameraShutter" -+ override fun getEventName() = EVENT_NAME - override fun getEventData() = data -+ companion object { -+ const val EVENT_NAME = "topShutter" -+ } - } - - class CameraErrorEvent(surfaceId: Int, viewId: Int, private val data: WritableMap) : Event(surfaceId, viewId) { -- override fun getEventName() = "cameraError" -+ override fun getEventName() = EVENT_NAME - override fun getEventData() = data -+ companion object { -+ const val EVENT_NAME = "topError" -+ } - } - - class CameraViewReadyEvent(surfaceId: Int, viewId: Int) : Event(surfaceId, viewId) { -- override fun getEventName() = "cameraViewReady" -+ override fun getEventName() = EVENT_NAME - override fun getEventData(): WritableMap = Arguments.createMap() -+ companion object { -+ const val EVENT_NAME = "topViewReady" -+ } - } - - class CameraCodeScannedEvent(surfaceId: Int, viewId: Int, private val data: WritableMap) : - Event(surfaceId, viewId) { -- override fun getEventName() = "cameraCodeScanned" -+ override fun getEventName() = EVENT_NAME - override fun getEventData() = data -+ companion object { -+ const val EVENT_NAME = "topCodeScanned" -+ } - } -diff --git a/node_modules/react-native-vision-camera/ios/.swift-version b/node_modules/react-native-vision-camera/ios/.swift-version -new file mode 100644 -index 0000000..ef425ca ---- /dev/null -+++ b/node_modules/react-native-vision-camera/ios/.swift-version -@@ -0,0 +1 @@ -+5.2 -diff --git a/node_modules/react-native-vision-camera/ios/.swiftformat b/node_modules/react-native-vision-camera/ios/.swiftformat -new file mode 100644 -index 0000000..95e71c1 ---- /dev/null -+++ b/node_modules/react-native-vision-camera/ios/.swiftformat -@@ -0,0 +1,12 @@ -+--allman false -+--indent 2 -+--exclude Pods,Generated -+ -+--disable andOperator -+--disable redundantReturn -+--disable wrapMultilineStatementBraces -+--disable organizeDeclarations -+ -+--enable markTypes -+ -+--enable isEmpty -diff --git a/node_modules/react-native-vision-camera/ios/.swiftlint.yml b/node_modules/react-native-vision-camera/ios/.swiftlint.yml -new file mode 100644 -index 0000000..6999c33 ---- /dev/null -+++ b/node_modules/react-native-vision-camera/ios/.swiftlint.yml -@@ -0,0 +1,52 @@ -+disabled_rules: -+ - identifier_name -+ - trailing_comma -+ - todo -+ - type_body_length -+ - cyclomatic_complexity -+ - function_body_length -+ - for_where -+opt_in_rules: -+ - contains_over_filter_count -+ - contains_over_filter_is_empty -+ - contains_over_first_not_nil -+ - contains_over_range_nil_comparison -+ - empty_collection_literal -+ - empty_count -+ - empty_string -+ - first_where -+ - flatmap_over_map_reduce -+ - last_where -+ - reduce_boolean -+ - reduce_into -+ - yoda_condition -+ - vertical_whitespace_opening_braces -+ - vertical_whitespace_closing_braces -+ - vertical_parameter_alignment_on_call -+ - untyped_error_in_catch -+ - unowned_variable_capture -+ - unavailable_function -+ - switch_case_on_newline -+ - static_operator -+ - strict_fileprivate -+ - sorted_imports -+ - sorted_first_last -+ - required_enum_case -+ - redundant_type_annotation -+ - redundant_nil_coalescing -+ - attributes -+ - convenience_type -+analyzer_rules: -+ - explicit_self -+ - unused_declaration -+ - unused_import -+ -+excluded: # paths to ignore during linting. Takes precedence over `included`. -+ - Pods -+ -+# Adjust rule numbers -+line_length: 160 -+file_length: 500 -+ -+# reporter type (xcode, json, csv, checkstyle, codeclimate, junit, html, emoji, sonarqube, markdown, github-actions-logging) -+reporter: "xcode" -diff --git a/node_modules/react-native-vision-camera/ios/CameraView.swift b/node_modules/react-native-vision-camera/ios/CameraView.swift -index 1aca0c6..cbb4849 100644 ---- a/node_modules/react-native-vision-camera/ios/CameraView.swift -+++ b/node_modules/react-native-vision-camera/ios/CameraView.swift -@@ -23,39 +23,42 @@ import UIKit - public final class CameraView: UIView, CameraSessionDelegate { - // pragma MARK: React Properties - // props that require reconfiguring -- @objc var cameraId: NSString? -- @objc var enableDepthData = false -- @objc var enablePortraitEffectsMatteDelivery = false -- @objc var enableBufferCompression = false -+ @objc public var cameraId: NSString? -+ @objc public var enableDepthData = false -+ @objc public var enablePortraitEffectsMatteDelivery = false -+ @objc public var enableBufferCompression = false - // use cases -- @objc var photo = false -- @objc var video = false -- @objc var audio = false -- @objc var enableFrameProcessor = false -- @objc var codeScannerOptions: NSDictionary? -- @objc var pixelFormat: NSString? -- @objc var enableLocation = false -+ @objc public var photo = false -+ @objc public var video = false -+ @objc public var audio = false -+ @objc public var enableFrameProcessor = false -+ @objc public var codeScannerOptions: NSDictionary? -+ @objc public var pixelFormat: NSString? -+ @objc public var enableLocation = false - // props that require format reconfiguring -- @objc var format: NSDictionary? -- @objc var fps: NSNumber? -- @objc var videoHdr = false -- @objc var photoHdr = false -- @objc var photoQualityBalance: NSString? -- @objc var lowLightBoost = false -- @objc var orientation: NSString? -+ @objc public var format: NSDictionary? -+ @objc public var fps: NSNumber? -+ @objc public var videoHdr = false -+ @objc public var photoHdr = false -+ @objc public var photoQualityBalance: NSString? -+ @objc public var lowLightBoost = false -+ @objc public var orientation: NSString? - // other props -- @objc var isActive = false -- @objc var torch = "off" -- @objc var zoom: NSNumber = 1.0 // in "factor" -- @objc var exposure: NSNumber = 1.0 -- @objc var enableFpsGraph = false -- @objc var videoStabilizationMode: NSString? -- @objc var resizeMode: NSString = "cover" { -+ @objc public var isActive = false -+ @objc public var torch = "off" -+ @objc public var zoom: NSNumber = 1.0 // in "factor" -+ @objc public var exposure: NSNumber = 1.0 -+ @objc public var enableFpsGraph = false -+ @objc public var videoStabilizationMode: NSString? -+ @objc public var resizeMode: NSString = "cover" { - didSet { - let parsed = try? ResizeMode(jsValue: resizeMode as String) - previewView.resizeMode = parsed ?? .cover - } - } -+#if RCT_NEW_ARCH_ENABLED -+ @objc public var delegate: RNCameraViewDirectEventDelegate? -+#else - - // events - @objc var onInitialized: RCTDirectEventBlock? -@@ -65,8 +68,9 @@ public final class CameraView: UIView, CameraSessionDelegate { - @objc var onShutter: RCTDirectEventBlock? - @objc var onViewReady: RCTDirectEventBlock? - @objc var onCodeScanned: RCTDirectEventBlock? -+#endif - // zoom -- @objc var enableZoomGesture = false { -+ @objc public var enableZoomGesture = false { - didSet { - if enableZoomGesture { - addPinchGestureRecognizer() -@@ -117,7 +121,14 @@ public final class CameraView: UIView, CameraSessionDelegate { - if newSuperview != nil { - if !isMounted { - isMounted = true -- onViewReady?(nil) -+#if RCT_NEW_ARCH_ENABLED -+ guard let delegate = delegate else { -+ return -+ } -+ delegate.onViewReady() -+#else -+ onViewReady?(nil) -+#endif - } - } - } -@@ -287,10 +298,6 @@ public final class CameraView: UIView, CameraSessionDelegate { - - func onError(_ error: CameraError) { - ReactLogger.log(level: .error, message: "Invoking onError(): \(error.message)") -- guard let onError = onError else { -- return -- } -- - var causeDictionary: [String: Any]? - if case let .unknown(_, cause) = error, - let cause = cause { -@@ -301,44 +308,86 @@ public final class CameraView: UIView, CameraSessionDelegate { - "details": cause.userInfo, - ] - } -+#if RCT_NEW_ARCH_ENABLED -+ guard let delegate = delegate else { -+ return -+ } -+ delegate.onError(error:[ -+ "code": error.code, -+ "message": error.message, -+ "cause": causeDictionary ?? NSNull(), -+ ]) -+#else -+guard let onError = onError else { return } - onError([ - "code": error.code, - "message": error.message, - "cause": causeDictionary ?? NSNull(), - ]) -+#endif - } - - func onSessionInitialized() { - ReactLogger.log(level: .info, message: "Camera initialized!") -+#if RCT_NEW_ARCH_ENABLED -+ guard let delegate = delegate else { -+ return -+ } -+ delegate.onInitialized() -+#else - guard let onInitialized = onInitialized else { - return - } - onInitialized([:]) -+#endif - } - - func onCameraStarted() { - ReactLogger.log(level: .info, message: "Camera started!") -+#if RCT_NEW_ARCH_ENABLED -+ guard let delegate = delegate else { -+ return -+ } -+ delegate.onStarted() -+#else - guard let onStarted = onStarted else { - return - } - onStarted([:]) -+#endif - } - - func onCameraStopped() { - ReactLogger.log(level: .info, message: "Camera stopped!") -+#if RCT_NEW_ARCH_ENABLED -+ guard let delegate = delegate else { -+ return -+ } -+ delegate.onStopped() -+#else - guard let onStopped = onStopped else { - return - } - onStopped([:]) -+#endif - } - - func onCaptureShutter(shutterType: ShutterType) { -+#if RCT_NEW_ARCH_ENABLED -+ guard let delegate = delegate else { -+ return -+ } -+ delegate.onShutter(message:[ -+ "type": shutterType.jsValue, -+ ]) -+#else - guard let onShutter = onShutter else { - return - } - onShutter([ - "type": shutterType.jsValue, - ]) -+#endif - } - - func onFrame(sampleBuffer: CMSampleBuffer) { -@@ -365,6 +414,15 @@ public final class CameraView: UIView, CameraSessionDelegate { - } - - func onCodeScanned(codes: [CameraSession.Code], scannerFrame: CameraSession.CodeScannerFrame) { -+#if RCT_NEW_ARCH_ENABLED -+ guard let delegate = delegate else { -+ return -+ } -+ delegate.onCodeScanned(message:[ -+ "codes": codes.map { $0.toJSValue() }, -+ "frame": scannerFrame.toJSValue(), -+ ]) -+#else - guard let onCodeScanned = onCodeScanned else { - return - } -@@ -372,6 +430,7 @@ public final class CameraView: UIView, CameraSessionDelegate { - "codes": codes.map { $0.toJSValue() }, - "frame": scannerFrame.toJSValue(), - ]) -+#endif - } - - /** -@@ -396,3 +455,13 @@ public final class CameraView: UIView, CameraSessionDelegate { - } - } - } -+ -+@objc public protocol RNCameraViewDirectEventDelegate: AnyObject { //TODO: Move to a separate file -+ func onInitialized() -+ func onError(error: NSDictionary) -+ func onViewReady() -+ func onStarted() -+ func onStopped() -+ func onShutter(message: NSDictionary) -+ func onCodeScanned(message: NSDictionary) -+} -diff --git a/node_modules/react-native-vision-camera/ios/CameraViewManager.swift b/node_modules/react-native-vision-camera/ios/CameraViewManager.swift -index ecfcf3d..4b2c201 100644 ---- a/node_modules/react-native-vision-camera/ios/CameraViewManager.swift -+++ b/node_modules/react-native-vision-camera/ios/CameraViewManager.swift -@@ -141,7 +141,8 @@ final class CameraViewManager: RCTViewManager { - - private func getCameraView(withTag tag: NSNumber) -> CameraView { - // swiftlint:disable force_cast -- return bridge.uiManager.view(forReactTag: tag) as! CameraView -+ let cameraView = bridge.uiManager.view(forReactTag: tag) -+ return ((cameraView?.isKind(of: CameraView.self))! ? cameraView : cameraView?.value(forKey: "contentView") as? UIView) as! CameraView - // swiftlint:enable force_cast - } - } -diff --git a/node_modules/react-native-vision-camera/ios/RNCameraView.h b/node_modules/react-native-vision-camera/ios/RNCameraView.h -new file mode 100644 -index 0000000..46c2c2c ---- /dev/null -+++ b/node_modules/react-native-vision-camera/ios/RNCameraView.h -@@ -0,0 +1,14 @@ -+// This guard prevent this file to be compiled in the old architecture. -+#ifdef RCT_NEW_ARCH_ENABLED -+#import -+#import -+ -+ -+NS_ASSUME_NONNULL_BEGIN -+ -+@interface RNCameraView : RCTViewComponentView -+@end -+ -+NS_ASSUME_NONNULL_END -+ -+#endif /* RCT_NEW_ARCH_ENABLED */ -diff --git a/node_modules/react-native-vision-camera/ios/RNCameraView.mm b/node_modules/react-native-vision-camera/ios/RNCameraView.mm -new file mode 100644 -index 0000000..019be20 ---- /dev/null -+++ b/node_modules/react-native-vision-camera/ios/RNCameraView.mm -@@ -0,0 +1,377 @@ -+// This guard prevent the code from being compiled in the old architecture -+#ifdef RCT_NEW_ARCH_ENABLED -+#import -+ -+#import -+#import -+#import -+#import -+ -+#import "RCTFabricComponentsPlugins.h" -+#import -+#import -+#import -+#import -+ -+#ifdef USE_FRAMEWORKS -+#import -+#else -+#import "VisionCamera-Swift.h" -+#endif -+ -+@interface RNCameraView : RCTViewComponentView -+@end -+ -+ -+using namespace facebook::react; -+ -+@implementation RNCameraView { -+ CameraView * _view; -+} -+ -++ (ComponentDescriptorProvider)componentDescriptorProvider -+{ -+ return concreteComponentDescriptorProvider(); -+} -+ -+- (instancetype)initWithFrame:(CGRect)frame -+{ -+ self = [super initWithFrame:frame]; -+if (self) { -+ static const auto defaultProps = std::make_shared(); -+ _props = defaultProps; -+ -+ //The remaining part of the initializer is standard Objective-C code to create views and layout them with AutoLayout. Here we can change whatever we want to. -+ _view = [[CameraView alloc] init]; -+ _view.delegate = self; -+ -+ self.contentView = _view; -+} -+ -+return self; -+} -+ -+// why we need this func -> https://reactnative.dev/docs/next/the-new-architecture/pillars-fabric-components#write-the-native-ios-code -+- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps -+{ -+ const auto &newViewProps = *std::static_pointer_cast(props); -+ const auto &oldViewProps = *std::static_pointer_cast(_props); -+ -+ NSMutableArray* changedProps = [[NSMutableArray alloc] init]; -+ -+ if(oldViewProps.isActive != newViewProps.isActive){ -+ _view.isActive = newViewProps.isActive; -+ [changedProps addObject:@"isActive"]; -+ } -+ if(oldViewProps.cameraId != newViewProps.cameraId){ -+ _view.cameraId = RCTNSStringFromString(newViewProps.cameraId); -+ [changedProps addObject:@"cameraId"]; -+ } -+ if(oldViewProps.photoQualityBalance != newViewProps.photoQualityBalance){ -+ _view.photoQualityBalance = RCTNSStringFromString(newViewProps.photoQualityBalance); -+ [changedProps addObject:@"photoQualityBalance"]; -+ } -+ if(oldViewProps.enableDepthData != newViewProps.enableDepthData){ -+ _view.enableDepthData = newViewProps.enableDepthData; -+ [changedProps addObject:@"enableDepthData"]; -+ } -+ if(oldViewProps.enablePortraitEffectsMatteDelivery != newViewProps.enablePortraitEffectsMatteDelivery){ -+ _view.enablePortraitEffectsMatteDelivery = newViewProps.enablePortraitEffectsMatteDelivery; -+ [changedProps addObject:@"enablePortraitEffectsMatteDelivery"]; -+ } -+ if(oldViewProps.photo != newViewProps.photo){ -+ _view.photo = [NSNumber numberWithBool:newViewProps.photo]; -+ [changedProps addObject:@"photo"]; -+ } -+ if(oldViewProps.video != newViewProps.video){ -+ _view.video = [NSNumber numberWithBool:newViewProps.video]; -+ [changedProps addObject:@"video"]; -+ } -+ if(oldViewProps.audio != newViewProps.audio){ -+ _view.audio = [NSNumber numberWithBool:newViewProps.audio]; -+ [changedProps addObject:@"audio"]; -+ } -+ if(oldViewProps.enableFrameProcessor != newViewProps.enableFrameProcessor){ -+ _view.enableFrameProcessor = newViewProps.enableFrameProcessor; -+ [changedProps addObject:@"enableFrameProcessor"]; -+ } -+ if(oldViewProps.enableLocation != newViewProps.enableLocation){ -+ _view.enableLocation = newViewProps.enableLocation; -+ [changedProps addObject:@"enableLocation"]; -+ } -+ if(oldViewProps.enableBufferCompression != newViewProps.enableBufferCompression){ -+ _view.enableBufferCompression = newViewProps.enableBufferCompression; -+ [changedProps addObject:@"enableBufferCompression"]; -+ } -+ if(oldViewProps.fps != newViewProps.fps){ -+ _view.fps = [NSNumber numberWithInt:newViewProps.fps]; -+ [changedProps addObject:@"fps"]; -+ } -+ if(oldViewProps.videoHdr != newViewProps.videoHdr){ -+ _view.videoHdr = newViewProps.videoHdr; -+ [changedProps addObject:@"videoHdr"]; -+ } -+ if(oldViewProps.photoHdr != newViewProps.photoHdr){ -+ _view.photoHdr = newViewProps.photoHdr; -+ [changedProps addObject:@"photoHdr"]; -+ } -+ if(oldViewProps.lowLightBoost != newViewProps.lowLightBoost){ -+ _view.lowLightBoost = newViewProps.lowLightBoost; -+ [changedProps addObject:@"lowLightBoost"]; -+ } -+ if(oldViewProps.videoStabilizationMode != newViewProps.videoStabilizationMode){ -+ _view.videoStabilizationMode = RCTNSStringFromString(newViewProps.videoStabilizationMode); -+ [changedProps addObject:@"videoStabilizationMode"]; -+ } -+ if(oldViewProps.torch != newViewProps.torch){ -+ _view.torch = RCTNSStringFromString(newViewProps.torch); -+ [changedProps addObject:@"torch"]; -+ } -+ if(oldViewProps.orientation != newViewProps.orientation){ -+ _view.orientation = RCTNSStringFromString(newViewProps.orientation); -+ [changedProps addObject:@"orientation"]; -+ } -+ if(oldViewProps.resizeMode != newViewProps.resizeMode){ -+ _view.resizeMode = RCTNSStringFromString(newViewProps.resizeMode); -+ [changedProps addObject:@"resizeMode"]; -+ } -+ if(oldViewProps.pixelFormat != newViewProps.pixelFormat){ -+ _view.pixelFormat = RCTNSStringFromString(newViewProps.pixelFormat); -+ [changedProps addObject:@"pixelFormat"]; -+ } -+ if(oldViewProps.zoom != newViewProps.zoom){ -+ _view.zoom = [NSNumber numberWithDouble:newViewProps.zoom]; -+ [changedProps addObject:@"zoom"]; -+ } -+ if(oldViewProps.exposure != newViewProps.exposure){ -+ _view.exposure = [NSNumber numberWithDouble:newViewProps.exposure]; -+ [changedProps addObject:@"exposure"]; -+ } -+ if(oldViewProps.enableZoomGesture != newViewProps.enableZoomGesture){ -+ _view.enableZoomGesture = newViewProps.enableZoomGesture; -+ [changedProps addObject:@"enableZoomGesture"]; -+ } -+ if(oldViewProps.enableFpsGraph != newViewProps.enableFpsGraph){ -+ _view.enableFpsGraph = newViewProps.enableFpsGraph; -+ [changedProps addObject:@"enableFpsGraph"]; -+ } -+ -+ -+ if(_view.format == nil){ -+ _view.format =[ [NSMutableDictionary alloc] init]; -+ } -+ -+ -+ //Checking format props, TODO: find cleaner way to do it -+ if(oldViewProps.format.supportsDepthCapture != newViewProps.format.supportsDepthCapture){ -+ NSNumber* supportsDepthCapture = newViewProps.format.supportsDepthCapture ? @1 : @0; -+ [_view.format setValue:supportsDepthCapture forKey:@"supportsDepthCapture"]; -+ [changedProps addObject:@"format"]; -+ } -+ if(oldViewProps.format.autoFocusSystem != newViewProps.format.autoFocusSystem){ -+ [_view.format setValue:RCTNSStringFromString(newViewProps.format.autoFocusSystem) forKey:@"autoFocusSystem"]; -+ [changedProps addObject:@"format"]; -+ } -+ if(oldViewProps.format.pixelFormats.size() != newViewProps.format.pixelFormats.size()){ -+ NSMutableArray* newPixelFormats = [[NSMutableArray alloc] init]; -+ for(int i = 0; i < newViewProps.format.pixelFormats.size(); i++){ -+ [newPixelFormats addObject:RCTNSStringFromString(newViewProps.format.pixelFormats.at(i))]; -+ } -+ [_view.format setValue:newPixelFormats forKey:@"pixelFormats"]; -+ [changedProps addObject:@"format"]; -+ } -+ -+ if(oldViewProps.format.videoStabilizationModes.size() != newViewProps.format.videoStabilizationModes.size()){ -+ NSMutableArray* newVideoStabilizationModes = [[NSMutableArray alloc] init]; -+ for(int i = 0; i < newViewProps.format.videoStabilizationModes.size(); i++){ -+ [newVideoStabilizationModes addObject:RCTNSStringFromString(newViewProps.format.videoStabilizationModes.at(i))]; -+ } -+ [_view.format setValue:newVideoStabilizationModes forKey:@"videoStabilizationModes"]; -+ [changedProps addObject:@"format"]; -+ } -+ -+ if(oldViewProps.format.photoHeight != newViewProps.format.photoHeight){ -+ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.photoHeight] forKey:@"photoHeight"]; -+ [changedProps addObject:@"format"]; -+ } -+ if(oldViewProps.format.photoWidth != newViewProps.format.photoWidth){ -+ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.photoWidth] forKey:@"photoWidth"]; -+ [changedProps addObject:@"format"]; -+ } -+ if(oldViewProps.format.videoHeight != newViewProps.format.videoHeight){ -+ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.videoHeight] forKey:@"videoHeight"]; -+ [changedProps addObject:@"format"]; -+ } -+ if(oldViewProps.format.videoWidth != newViewProps.format.videoWidth){ -+ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.videoWidth] forKey:@"videoWidth"]; -+ [changedProps addObject:@"format"]; -+ } -+ if(oldViewProps.format.maxISO != newViewProps.format.maxISO){ -+ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.maxISO] forKey:@"maxISO"]; -+ [changedProps addObject:@"format"]; -+ } -+ if(oldViewProps.format.minISO != newViewProps.format.minISO){ -+ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.minISO] forKey:@"minISO"]; -+ [changedProps addObject:@"format"]; -+ } -+ if(oldViewProps.format.maxFps != newViewProps.format.maxFps){ -+ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.maxFps] forKey:@"maxFps"]; -+ [changedProps addObject:@"format"]; -+ } -+ if(oldViewProps.format.minFps != newViewProps.format.minFps){ -+ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.minFps] forKey:@"minFps"]; -+ [changedProps addObject:@"format"]; -+ } -+ if(oldViewProps.format.fieldOfView != newViewProps.format.fieldOfView){ -+ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.fieldOfView] forKey:@"fieldOfView"]; -+ [changedProps addObject:@"format"]; -+ } -+ -+ if(oldViewProps.format.supportsVideoHDR != newViewProps.format.supportsVideoHDR){ -+ NSNumber* supportsVideoHDR = newViewProps.format.supportsVideoHDR ? @1 : @0; -+ [_view.format setValue:supportsVideoHDR forKey:@"supportsVideoHDR"]; -+ [changedProps addObject:@"format"]; -+ } -+ if(oldViewProps.format.supportsPhotoHDR != newViewProps.format.supportsPhotoHDR){ -+ NSNumber* supportsPhotoHDR = newViewProps.format.supportsPhotoHDR ? @1 : @0; -+ [_view.format setValue:supportsPhotoHDR forKey:@"supportsPhotoHDR"]; -+ [changedProps addObject:@"format"]; -+ } -+ -+ if (_view.format.count == 0) { -+ _view.format = nil; -+ } -+ -+ if(_view.codeScannerOptions == nil){ -+ _view.codeScannerOptions =[[NSMutableDictionary alloc] init]; -+ } -+ -+ if(oldViewProps.codeScannerOptions.codeTypes.size() != newViewProps.codeScannerOptions.codeTypes.size()){ -+ NSMutableArray* newCodeTypes = [[NSMutableArray alloc] init]; -+ for(int i = 0; i < newViewProps.codeScannerOptions.codeTypes.size(); i++){ -+ [newCodeTypes addObject:RCTNSStringFromString(newViewProps.codeScannerOptions.codeTypes.at(i))]; -+ } -+ [_view.codeScannerOptions setValue:newCodeTypes forKey:@"codeTypes"]; -+ [changedProps addObject:@"codeScannerOptions"]; -+ } -+ -+ if(oldViewProps.codeScannerOptions.interval != newViewProps.codeScannerOptions.interval){ -+ [_view.codeScannerOptions setValue:[NSNumber numberWithDouble:newViewProps.codeScannerOptions.interval] forKey:@"interval"]; -+ [changedProps addObject:@"codeScannerOptions"]; -+ } -+ -+ if( -+ oldViewProps.codeScannerOptions.regionOfInterest.x != newViewProps.codeScannerOptions.regionOfInterest.x || -+ oldViewProps.codeScannerOptions.regionOfInterest.y != newViewProps.codeScannerOptions.regionOfInterest.y || -+ oldViewProps.codeScannerOptions.regionOfInterest.width != newViewProps.codeScannerOptions.regionOfInterest.width || -+ oldViewProps.codeScannerOptions.regionOfInterest.height != newViewProps.codeScannerOptions.regionOfInterest.height -+ ){ -+ NSDictionary *newRegionOfInterest = @{ -+ @"x": @(newViewProps.codeScannerOptions.regionOfInterest.x), -+ @"y": @(newViewProps.codeScannerOptions.regionOfInterest.y), -+ @"width": @(newViewProps.codeScannerOptions.regionOfInterest.width), -+ @"height": @(newViewProps.codeScannerOptions.regionOfInterest.height), -+ }; -+ [_view.codeScannerOptions setValue:newRegionOfInterest forKey:@"regionOfInterest"]; -+ [changedProps addObject:@"codeScannerOptions"]; -+ } -+ -+ if (_view.codeScannerOptions.count == 0) { -+ _view.codeScannerOptions = nil; -+ } -+ -+ [_view didSetProps:changedProps]; -+ -+ [super updateProps:props oldProps:oldProps]; -+} -+ -+- (void)onViewReady{ -+ if(_eventEmitter){ -+ std::dynamic_pointer_cast(_eventEmitter) -+ ->onViewReady( CameraViewEventEmitter::OnViewReady{}); -+ } -+} -+ -+- (void)onErrorWithError:(NSDictionary *)error{ -+ if(_eventEmitter){ -+ std::dynamic_pointer_cast(_eventEmitter) -+ ->onError( CameraViewEventEmitter::OnError{ -+ .code = std::string([(error != nil ? [error objectForKey:@"code"] : @"") UTF8String]), -+ .message = std::string([(error != nil ? [error objectForKey:@"message"] : @"") UTF8String]), -+ .cause = { -+ .code = std::string([(error != nil ? [[error objectForKey:@"cause"] objectForKey:@"code"] : @"") UTF8String]), // TODO: Further secure type safety to prevent crashes -+ .domain = std::string([(error != nil ? [[error objectForKey:@"cause"] objectForKey:@"domain"] : @"") UTF8String]), -+ .message = std::string([(error != nil ? [[error objectForKey:@"cause"] objectForKey:@"message"] : @"") UTF8String]), -+ .details = std::string([(error != nil ? [[error objectForKey:@"cause"] objectForKey:@"details"] : @"") UTF8String]) -+ } -+ }); -+ } -+} -+ -+- (void)onInitialized{ -+ if(_eventEmitter){ -+ std::dynamic_pointer_cast(_eventEmitter) -+ ->onInitialized( CameraViewEventEmitter::OnInitialized{}); -+ } -+} -+ -+- (void)onCodeScannedWithMessage:(NSDictionary *)message { -+ if(_eventEmitter){ -+ std::dynamic_pointer_cast(_eventEmitter) -+ ->onCodeScanned( CameraViewEventEmitter::OnCodeScanned{ -+ .codes = { -+ .type = std::string([(message != nil ? [[message objectForKey:@"codes"] objectForKey:@"type"] : @"") UTF8String]), -+ .value = std::string([(message != nil ? [[message objectForKey:@"codes"] objectForKey:@"value"] : @"") UTF8String]), -+ .frame = { -+ .x = [(message != nil ? [[[message objectForKey:@"codes"] objectForKey:@"frame"] objectForKey:@"x"] : @0) doubleValue], -+ .y = [(message != nil ? [[[message objectForKey:@"codes"] objectForKey:@"frame"] objectForKey:@"y"] : @0) doubleValue], -+ .width = [(message != nil ? [[[message objectForKey:@"codes"] objectForKey:@"frame"] objectForKey:@"width"] : @0) doubleValue], -+ .height = [(message != nil ? [[[message objectForKey:@"codes"] objectForKey:@"frame"] objectForKey:@"height"] : @0) doubleValue], -+ }, -+ }, -+ .frame = { -+ .width = [(message != nil ? [[message objectForKey:@"frame"] objectForKey:@"width"] : @0) intValue], -+ .height = [(message != nil ? [[message objectForKey:@"frame"] objectForKey:@"height"] : @0) intValue], -+ }, -+ // nothing is sent here from CameraView -+ .corners = { -+ .x = [(message != nil ? [[message objectForKey:@"corners"] objectForKey:@"x"] : @0) doubleValue], -+ .y = [(message != nil ? [[message objectForKey:@"corners"] objectForKey:@"y"] : @0) doubleValue], -+ } -+ }); -+ } -+} -+ -+ -+- (void)onShutterWithMessage:(NSDictionary *)message { -+ if(_eventEmitter){ -+ std::dynamic_pointer_cast(_eventEmitter) -+ ->onShutter( CameraViewEventEmitter::OnShutter{ -+ .type = std::string([(message != nil ? [message objectForKey:@"type"] : @"") UTF8String]), -+ }); -+ } -+} -+ -+ -+- (void)onStarted { -+ if(_eventEmitter){ -+ std::dynamic_pointer_cast(_eventEmitter) -+ ->onStarted( CameraViewEventEmitter::OnStarted{}); -+ } -+} -+ -+ -+- (void)onStopped { -+ if(_eventEmitter){ -+ std::dynamic_pointer_cast(_eventEmitter) -+ ->onViewReady( CameraViewEventEmitter::OnViewReady{}); -+ } -+} -+ -+Class CameraViewCls(void) -+{ -+ return RNCameraView.class; -+} -+ -+@end -+#endif -diff --git a/node_modules/react-native-vision-camera/lib/commonjs/Camera.js b/node_modules/react-native-vision-camera/lib/commonjs/Camera.js -index ac08791..6e691b9 100644 ---- a/node_modules/react-native-vision-camera/lib/commonjs/Camera.js -+++ b/node_modules/react-native-vision-camera/lib/commonjs/Camera.js -@@ -10,8 +10,11 @@ var _CameraError = require("./CameraError"); - var _NativeCameraModule = require("./NativeCameraModule"); - var _FrameProcessorPlugins = require("./FrameProcessorPlugins"); - var _CameraDevices = require("./CameraDevices"); -+var _CameraViewNativeComponent = _interopRequireDefault(require("./specs/CameraViewNativeComponent")); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } -+const NativeCameraView = _CameraViewNativeComponent.default; -+ - //#region Types - - //#endregion -@@ -552,10 +555,5 @@ class Camera extends _react.default.PureComponent { - } - } - //#endregion -- --// requireNativeComponent automatically resolves 'CameraView' to 'CameraViewManager' - exports.Camera = Camera; --const NativeCameraView = (0, _reactNative.requireNativeComponent)('CameraView', --// @ts-expect-error because the type declarations are kinda wrong, no? --Camera); - //# sourceMappingURL=Camera.js.map -\ No newline at end of file -diff --git a/node_modules/react-native-vision-camera/lib/commonjs/Camera.js.map b/node_modules/react-native-vision-camera/lib/commonjs/Camera.js.map -index 808f69a..02a8590 100644 ---- a/node_modules/react-native-vision-camera/lib/commonjs/Camera.js.map -+++ b/node_modules/react-native-vision-camera/lib/commonjs/Camera.js.map -@@ -1 +1 @@ --{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_CameraError","_NativeCameraModule","_FrameProcessorPlugins","_CameraDevices","obj","__esModule","default","_extends","Object","assign","bind","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","Camera","React","PureComponent","displayName","isNativeViewMounted","constructor","props","onViewReady","onInitialized","onStarted","onStopped","onShutter","onError","onCodeScanned","ref","createRef","lastFrameProcessor","undefined","state","isRecordingWithFlash","handle","nodeHandle","findNodeHandle","current","CameraRuntimeError","takePhoto","options","CameraModule","e","tryParseNativeCameraError","takeSnapshot","getBitRateMultiplier","bitRate","startRecording","onRecordingError","onRecordingFinished","videoBitRate","passThruOptions","flash","setState","nativeOptions","videoBitRateOverride","videoBitRateMultiplier","onRecordCallback","video","error","pauseRecording","resumeRecording","stopRecording","cancelRecording","focus","point","getAvailableCameraDevices","CameraDevices","addCameraDevicesChangedListener","listener","getCameraPermissionStatus","getMicrophonePermissionStatus","getLocationPermissionStatus","requestCameraPermission","requestMicrophonePermission","requestLocationPermission","event","nativeEvent","cause","isErrorWithCause","cameraError","code","message","console","_this$props$onInitial","_this$props","_this$props$onStarted","_this$props2","_this$props$onStopped","_this$props3","_this$props$onShutter","_this$props4","codeScanner","codes","frame","setFrameProcessor","frameProcessor","VisionCameraProxy","unsetFrameProcessor","removeFrameProcessor","componentDidUpdate","render","device","shouldEnableBufferCompression","pixelFormat","torch","createElement","NativeCameraView","cameraId","id","codeScannerOptions","enableFrameProcessor","enableBufferCompression","enableFpsGraph","exports","requireNativeComponent"],"sourceRoot":"../../src","sources":["Camera.tsx"],"mappings":"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A;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAaqB,eAAeA,CAAA,EAAkB;IAC5C,IAAI;MACF,OAAO,MAAMtB,gCAAY,CAACsB,eAAe,CAAC,IAAI,CAAC7B,MAAM,CAAC;IACxD,CAAC,CAAC,OAAOQ,CAAC,EAAE;MACV,MAAM,IAAAC,sCAAyB,EAACD,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAasB,KAAKA,CAACC,KAAY,EAAiB;IAC9C,IAAI;MACF,OAAO,MAAMxB,gCAAY,CAACuB,KAAK,CAAC,IAAI,CAAC9B,MAAM,EAAE+B,KAAK,CAAC;IACrD,CAAC,CAAC,OAAOvB,CAAC,EAAE;MACV,MAAM,IAAAC,sCAAyB,EAACD,CAAC,CAAC;IACpC;EACF;EACA;;EAEA;EACA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAcwB,yBAAyBA,CAAA,EAAmB;IACxD,OAAOC,4BAAa,CAACD,yBAAyB,CAAC,CAAC;EAClD;EACA;AACF;AACA;AACA;AACA;AACA;EACE,OAAcE,+BAA+BA,CAACC,QAA8C,EAAuB;IACjH,OAAOF,4BAAa,CAACC,+BAA+B,CAACC,QAAQ,CAAC;EAChE;EACA;AACF;AACA;AACA;AACA;AACA;EACE,OAAcC,yBAAyBA,CAAA,EAA2B;IAChE,OAAO7B,gCAAY,CAAC6B,yBAAyB,CAAC,CAAC;EACjD;EACA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,OAAcC,6BAA6BA,CAAA,EAA2B;IACpE,OAAO9B,gCAAY,CAAC8B,6BAA6B,CAAC,CAAC;EACrD;EACA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,OAAcC,2BAA2BA,CAAA,EAA2B;IAClE,OAAO/B,gCAAY,CAAC+B,2BAA2B,CAAC,CAAC;EACnD;EACA;AACF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"} -\ No newline at end of file -+{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_CameraError","_NativeCameraModule","_FrameProcessorPlugins","_CameraDevices","_CameraViewNativeComponent","obj","__esModule","default","_extends","Object","assign","bind","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","NativeCameraView","NativeCameraViewCodegen","Camera","React","PureComponent","displayName","isNativeViewMounted","constructor","props","onViewReady","onInitialized","onStarted","onStopped","onShutter","onError","onCodeScanned","ref","createRef","lastFrameProcessor","undefined","state","isRecordingWithFlash","handle","nodeHandle","findNodeHandle","current","CameraRuntimeError","takePhoto","options","CameraModule","e","tryParseNativeCameraError","takeSnapshot","getBitRateMultiplier","bitRate","startRecording","onRecordingError","onRecordingFinished","videoBitRate","passThruOptions","flash","setState","nativeOptions","videoBitRateOverride","videoBitRateMultiplier","onRecordCallback","video","error","pauseRecording","resumeRecording","stopRecording","cancelRecording","focus","point","getAvailableCameraDevices","CameraDevices","addCameraDevicesChangedListener","listener","getCameraPermissionStatus","getMicrophonePermissionStatus","getLocationPermissionStatus","requestCameraPermission","requestMicrophonePermission","requestLocationPermission","event","nativeEvent","cause","isErrorWithCause","cameraError","code","message","console","_this$props$onInitial","_this$props","_this$props$onStarted","_this$props2","_this$props$onStopped","_this$props3","_this$props$onShutter","_this$props4","codeScanner","codes","frame","setFrameProcessor","frameProcessor","VisionCameraProxy","unsetFrameProcessor","removeFrameProcessor","componentDidUpdate","render","device","shouldEnableBufferCompression","pixelFormat","torch","createElement","cameraId","id","codeScannerOptions","enableFrameProcessor","enableBufferCompression","enableFpsGraph","exports"],"sourceRoot":"../../src","sources":["Camera.tsx"],"mappings":"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B,EAACD,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAaqB,eAAeA,CAAA,EAAkB;IAC5C,IAAI;MACF,OAAO,MAAMtB,gCAAY,CAACsB,eAAe,CAAC,IAAI,CAAC7B,MAAM,CAAC;IACxD,CAAC,CAAC,OAAOQ,CAAC,EAAE;MACV,MAAM,IAAAC,sCAAyB,EAACD,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAasB,KAAKA,CAACC,KAAY,EAAiB;IAC9C,IAAI;MACF,OAAO,MAAMxB,gCAAY,CAACuB,KAAK,CAAC,IAAI,CAAC9B,MAAM,EAAE+B,KAAK,CAAC;IACrD,CAAC,CAAC,OAAOvB,CAAC,EAAE;MACV,MAAM,IAAAC,sCAAyB,EAACD,CAAC,CAAC;IACpC;EACF;EACA;;EAEA;EACA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAcwB,yBAAyBA,CAAA,EAAmB;IACxD,OAAOC,4BAAa,CAACD,yBAAyB,CAAC,CAAC;EAClD;EACA;AACF;AACA;AACA;AACA;AACA;EACE,OAAcE,+BAA+BA,CAACC,QAA8C,EAAuB;IACjH,OAAOF,4BAAa,CAACC,+BAA+B,CAACC,QAAQ,CAAC;EAChE;EACA;AACF;AACA;AACA;AACA;AACA;EACE,OAAcC,yBAAyBA,CAAA,EAA2B;IAChE,OAAO7B,gCAAY,CAAC6B,yBAAyB,CAAC,CAAC;EACjD;EACA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,OAAcC,6BAA6BA,CAAA,EAA2B;IACpE,OAAO9B,gCAAY,CAAC8B,6BAA6B,CAAC,CAAC;EACrD;EACA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,OAAcC,2BAA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"} -\ No newline at end of file -diff --git a/node_modules/react-native-vision-camera/lib/commonjs/FrameProcessorPlugins.js b/node_modules/react-native-vision-camera/lib/commonjs/FrameProcessorPlugins.js -index cc2179c..3581e20 100644 ---- a/node_modules/react-native-vision-camera/lib/commonjs/FrameProcessorPlugins.js -+++ b/node_modules/react-native-vision-camera/lib/commonjs/FrameProcessorPlugins.js -@@ -70,7 +70,7 @@ try { - isAsyncContextBusy.value = false; - } - }, asyncContext); -- hasWorklets = true; -+ // hasWorklets = true - } catch (e) { - // Worklets are not installed, so Frame Processors are disabled. - } -diff --git a/node_modules/react-native-vision-camera/lib/commonjs/FrameProcessorPlugins.js.map b/node_modules/react-native-vision-camera/lib/commonjs/FrameProcessorPlugins.js.map -index cab0ad6..4e34f24 100644 ---- a/node_modules/react-native-vision-camera/lib/commonjs/FrameProcessorPlugins.js.map -+++ b/node_modules/react-native-vision-camera/lib/commonjs/FrameProcessorPlugins.js.map -@@ -1 +1 @@ --{"version":3,"names":["_CameraError","require","_NativeCameraModule","_JSIHelper","errorMessage","hasWorklets","isAsyncContextBusy","value","runOnAsyncContext","_frame","_func","CameraRuntimeError","throwJSError","error","assertJSIAvailable","Worklets","throwErrorOnJS","createRunInJsFn","message","stack","Error","name","jsEngine","global","ErrorUtils","reportFatalError","safeError","createSharedValue","asyncContext","createContext","createRunInContextFn","frame","func","e","internal","decrementRefCount","proxy","initFrameProcessorPlugin","removeFrameProcessor","setFrameProcessor","result","CameraModule","installFrameProcessorBindings","VisionCameraProxy","exports","getFrameProcessorPlugin","options","console","warn","getLastFrameProcessorCall","frameProcessorFuncId","_global$__frameProces","__frameProcessorRunAtTargetFpsMap","setLastFrameProcessorCall","runAtTargetFps","fps","funcId","__workletHash","targetIntervalMs","now","performance","diffToLastCall","undefined","runAsync","incrementRefCount"],"sourceRoot":"../../src","sources":["FrameProcessorPlugins.ts"],"mappings":"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"} -\ No newline at end of file -+{"version":3,"names":["_CameraError","require","_NativeCameraModule","_JSIHelper","errorMessage","hasWorklets","isAsyncContextBusy","value","runOnAsyncContext","_frame","_func","CameraRuntimeError","throwJSError","error","assertJSIAvailable","Worklets","throwErrorOnJS","createRunInJsFn","message","stack","Error","name","jsEngine","global","ErrorUtils","reportFatalError","safeError","createSharedValue","asyncContext","createContext","createRunInContextFn","frame","func","e","internal","decrementRefCount","proxy","initFrameProcessorPlugin","removeFrameProcessor","setFrameProcessor","result","CameraModule","installFrameProcessorBindings","VisionCameraProxy","exports","getFrameProcessorPlugin","options","console","warn","getLastFrameProcessorCall","frameProcessorFuncId","_global$__frameProces","__frameProcessorRunAtTargetFpsMap","setLastFrameProcessorCall","runAtTargetFps","fps","funcId","__workletHash","targetIntervalMs","now","performance","diffToLastCall","undefined","runAsync","incrementRefCount"],"sourceRoot":"../../src","sources":["FrameProcessorPlugins.ts"],"mappings":"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"} -\ No newline at end of file -diff --git a/node_modules/react-native-vision-camera/lib/commonjs/specs/CameraViewNativeComponent.js b/node_modules/react-native-vision-camera/lib/commonjs/specs/CameraViewNativeComponent.js -new file mode 100644 -index 0000000..7008471 ---- /dev/null -+++ b/node_modules/react-native-vision-camera/lib/commonjs/specs/CameraViewNativeComponent.js -@@ -0,0 +1,11 @@ -+"use strict"; -+ -+Object.defineProperty(exports, "__esModule", { -+ value: true -+}); -+exports.default = void 0; -+var _codegenNativeComponent = _interopRequireDefault(require("react-native/Libraries/Utilities/codegenNativeComponent")); -+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -+/* eslint-disable @typescript-eslint/ban-types */ -+var _default = exports.default = (0, _codegenNativeComponent.default)('CameraView'); -+//# sourceMappingURL=CameraViewNativeComponent.js.map -\ No newline at end of file -diff --git a/node_modules/react-native-vision-camera/lib/commonjs/specs/CameraViewNativeComponent.js.map b/node_modules/react-native-vision-camera/lib/commonjs/specs/CameraViewNativeComponent.js.map -new file mode 100644 -index 0000000..d1b3d81 ---- /dev/null -+++ b/node_modules/react-native-vision-camera/lib/commonjs/specs/CameraViewNativeComponent.js.map -@@ -0,0 +1 @@ -+{"version":3,"names":["_codegenNativeComponent","_interopRequireDefault","require","obj","__esModule","default","_default","exports","codegenNativeComponent"],"sourceRoot":"../../../src","sources":["specs/CameraViewNativeComponent.ts"],"mappings":";;;;;;AAGA,IAAAA,uBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA6F,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAH7F;AAAA,IAAAG,QAAA,GAAAC,OAAA,CAAAF,OAAA,GA0Fe,IAAAG,+BAAsB,EAAc,YAAY,CAAC"} -\ No newline at end of file -diff --git a/node_modules/react-native-vision-camera/lib/module/Camera.js b/node_modules/react-native-vision-camera/lib/module/Camera.js -index b5bbf8b..3f44fdd 100644 ---- a/node_modules/react-native-vision-camera/lib/module/Camera.js -+++ b/node_modules/react-native-vision-camera/lib/module/Camera.js -@@ -1,10 +1,12 @@ - function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } - import React from 'react'; --import { requireNativeComponent, findNodeHandle } from 'react-native'; -+import { findNodeHandle } from 'react-native'; - import { CameraRuntimeError, tryParseNativeCameraError, isErrorWithCause } from './CameraError'; - import { CameraModule } from './NativeCameraModule'; - import { VisionCameraProxy } from './FrameProcessorPlugins'; - import { CameraDevices } from './CameraDevices'; -+import NativeCameraViewCodegen from './specs/CameraViewNativeComponent'; -+const NativeCameraView = NativeCameraViewCodegen; - - //#region Types - -@@ -546,9 +548,4 @@ export class Camera extends React.PureComponent { - } - } - //#endregion -- --// requireNativeComponent automatically resolves 'CameraView' to 'CameraViewManager' --const NativeCameraView = requireNativeComponent('CameraView', --// @ts-expect-error because the type declarations are kinda wrong, no? --Camera); - //# sourceMappingURL=Camera.js.map -\ No newline at end of file -diff --git a/node_modules/react-native-vision-camera/lib/module/Camera.js.map b/node_modules/react-native-vision-camera/lib/module/Camera.js.map -index 42aa7ea..0205781 100644 ---- a/node_modules/react-native-vision-camera/lib/module/Camera.js.map -+++ b/node_modules/react-native-vision-camera/lib/module/Camera.js.map -@@ -1 +1 @@ --{"version":3,"names":["React","requireNativeComponent","findNodeHandle","CameraRuntimeError","tryParseNativeCameraError","isErrorWithCause","CameraModule","VisionCameraProxy","CameraDevices","Camera","PureComponent","displayName","isNativeViewMounted","constructor","props","onViewReady","bind","onInitialized","onStarted","onStopped","onShutter","onError","onCodeScanned","ref","createRef","lastFrameProcessor","undefined","state","isRecordingWithFlash","handle","nodeHandle","current","takePhoto","options","e","takeSnapshot","getBitRateMultiplier","bitRate","startRecording","onRecordingError","onRecordingFinished","videoBitRate","passThruOptions","flash","setState","nativeOptions","videoBitRateOverride","videoBitRateMultiplier","onRecordCallback","video","error","pauseRecording","resumeRecording","stopRecording","cancelRecording","focus","point","getAvailableCameraDevices","addCameraDevicesChangedListener","listener","getCameraPermissionStatus","getMicrophonePermissionStatus","getLocationPermissionStatus","requestCameraPermission","requestMicrophonePermission","requestLocationPermission","event","nativeEvent","cause","cameraError","code","message","console","_this$props$onInitial","_this$props","call","_this$props$onStarted","_this$props2","_this$props$onStopped","_this$props3","_this$props$onShutter","_this$props4","codeScanner","codes","frame","setFrameProcessor","frameProcessor","unsetFrameProcessor","removeFrameProcessor","componentDidUpdate","render","device","shouldEnableBufferCompression","pixelFormat","torch","createElement","NativeCameraView","_extends","cameraId","id","codeScannerOptions","enableFrameProcessor","enableBufferCompression","enableFpsGraph"],"sourceRoot":"../../src","sources":["Camera.tsx"],"mappings":"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3C,IAAI;MACF,OAAO,MAAM7C,YAAY,CAAC6C,cAAc,CAAC,IAAI,CAACtB,MAAM,CAAC;IACvD,CAAC,CAAC,OAAOK,CAAC,EAAE;MACV,MAAM9B,yBAAyB,CAAC8B,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAakB,eAAeA,CAAA,EAAkB;IAC5C,IAAI;MACF,OAAO,MAAM9C,YAAY,CAAC8C,eAAe,CAAC,IAAI,CAACvB,MAAM,CAAC;IACxD,CAAC,CAAC,OAAOK,CAAC,EAAE;MACV,MAAM9B,yBAAyB,CAAC8B,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAamB,aAAaA,CAAA,EAAkB;IAC1C,IAAI;MACF,OAAO,MAAM/C,YAAY,CAAC+C,aAAa,CAAC,IAAI,CAACxB,MAAM,CAAC;IACtD,CAAC,CAAC,OAAOK,CAAC,EAAE;MACV,MAAM9B,yBAAyB,CAAC8B,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAaoB,eAAeA,CAAA,EAAkB;IAC5C,IAAI;MACF,OAAO,MAAMhD,YAAY,CAACgD,eAAe,CAAC,IAAI,CAACzB,MAAM,CAAC;IACxD,CAAC,CAAC,OAAOK,CAAC,EAAE;MACV,MAAM9B,yBAAyB,CAAC8B,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAaqB,KAAKA,CAACC,KAAY,EAAiB;IAC9C,IAAI;MACF,OAAO,MAAMlD,YAAY,CAACiD,KAAK,CAAC,IAA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"} -\ No newline at end of file -+{"version":3,"names":["React","findNodeHandle","CameraRuntimeError","tryParseNativeCameraError","isErrorWithCause","CameraModule","VisionCameraProxy","CameraDevices","NativeCameraViewCodegen","NativeCameraView","Camera","PureComponent","displayName","isNativeViewMounted","constructor","props","onViewReady","bind","onInitialized","onStarted","onStopped","onShutter","onError","onCodeScanned","ref","createRef","lastFrameProcessor","undefined","state","isRecordingWithFlash","handle","nodeHandle","current","takePhoto","options","e","takeSnapshot","getBitRateMultiplier","bitRate","startRecording","onRecordingError","onRecordingFinished","videoBitRate","passThruOptions","flash","setState","nativeOptions","videoBitRateOverride","videoBitRateMultiplier","onRecordCallback","video","error","pauseRecording","resumeRecording","stopRecording","cancelRecording","focus","point","getAvailableCameraDevices","addCameraDevicesChangedListener","listener","getCameraPermissionStatus","getMicrophonePermissionStatus","getLocationPermissionStatus","requestCameraPermission","requestMicrophonePermission","requestLocationPermission","event","nativeEvent","cause","cameraError","code","message","console","_this$props$onInitial","_this$props","call","_this$props$onStarted","_this$props2","_this$props$onStopped","_this$props3","_this$props$onShutter","_this$props4","codeScanner","codes","frame","setFrameProcessor","frameProcessor","unsetFrameProcessor","removeFrameProcessor","componentDidUpdate","render","device","shouldEnableBufferCompression","pixelFormat","torch","createElement","_extends","cameraId","id","codeScannerOptions","enableFrameProcessor","enableBufferCompression","enableFpsGraph"],"sourceRoot":"../../src","sources":["Camera.tsx"],"mappings":"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CA;AACA;AACA;AACA;EACE,MAAaiB,cAAcA,CAAA,EAAkB;IAC3C,IAAI;MACF,OAAO,MAAM/C,YAAY,CAAC+C,cAAc,CAAC,IAAI,CAACtB,MAAM,CAAC;IACvD,CAAC,CAAC,OAAOK,CAAC,EAAE;MACV,MAAMhC,yBAAyB,CAACgC,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAakB,eAAeA,CAAA,EAAkB;IAC5C,IAAI;MACF,OAAO,MAAMhD,YAAY,CAACgD,eAAe,CAAC,IAAI,CAACvB,MAAM,CAAC;IACxD,CAAC,CAAC,OAAOK,CAAC,EAAE;MACV,MAAMhC,yBAAyB,CAACgC,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAamB,aAAaA,CAAA,EAAkB;IAC1C,IAAI;MACF,OAAO,MAAMjD,YAAY,CAACiD,aAAa,CAAC,IAAI,CAACxB,MAAM,CAAC;IACtD,CAAC,CAAC,OAAOK,CAAC,EAAE;MACV,MAAMhC,yBAAyB,CAACgC,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAaoB,eAAeA,CAAA,EAAkB;IAC5C,IAAI;MACF,OAAO,MAAMlD,YAAY,CAACkD,eAAe,CAAC,IAAI,CAACzB,MAAM,CAAC;IACxD,CAAC,CAAC,OAAOK,CAAC,EAAE;MACV,MAAMhC,yBAAyB,CAACgC,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAaqB,KAAKA,CAACC,KAAY,EAAiB;IAC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"} -\ No newline at end of file -diff --git a/node_modules/react-native-vision-camera/lib/module/FrameProcessorPlugins.js b/node_modules/react-native-vision-camera/lib/module/FrameProcessorPlugins.js -index a0ee374..f1f08c1 100644 ---- a/node_modules/react-native-vision-camera/lib/module/FrameProcessorPlugins.js -+++ b/node_modules/react-native-vision-camera/lib/module/FrameProcessorPlugins.js -@@ -64,7 +64,7 @@ try { - isAsyncContextBusy.value = false; - } - }, asyncContext); -- hasWorklets = true; -+ // hasWorklets = true - } catch (e) { - // Worklets are not installed, so Frame Processors are disabled. - } -diff --git a/node_modules/react-native-vision-camera/lib/module/FrameProcessorPlugins.js.map b/node_modules/react-native-vision-camera/lib/module/FrameProcessorPlugins.js.map -index baf8705..1b73944 100644 ---- a/node_modules/react-native-vision-camera/lib/module/FrameProcessorPlugins.js.map -+++ b/node_modules/react-native-vision-camera/lib/module/FrameProcessorPlugins.js.map -@@ -1 +1 @@ --{"version":3,"names":["CameraRuntimeError","CameraModule","assertJSIAvailable","errorMessage","hasWorklets","isAsyncContextBusy","value","runOnAsyncContext","_frame","_func","throwJSError","error","Worklets","require","throwErrorOnJS","createRunInJsFn","message","stack","Error","name","jsEngine","global","ErrorUtils","reportFatalError","safeError","createSharedValue","asyncContext","createContext","createRunInContextFn","frame","func","e","internal","decrementRefCount","proxy","initFrameProcessorPlugin","removeFrameProcessor","setFrameProcessor","result","installFrameProcessorBindings","VisionCameraProxy","getFrameProcessorPlugin","options","console","warn","getLastFrameProcessorCall","frameProcessorFuncId","_global$__frameProces","__frameProcessorRunAtTargetFpsMap","setLastFrameProcessorCall","runAtTargetFps","fps","funcId","__workletHash","targetIntervalMs","now","performance","diffToLastCall","undefined","runAsync","incrementRefCount"],"sourceRoot":"../../src","sources":["FrameProcessorPlugins.ts"],"mappings":"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"} -\ No newline at end of file -+{"version":3,"names":["CameraRuntimeError","CameraModule","assertJSIAvailable","errorMessage","hasWorklets","isAsyncContextBusy","value","runOnAsyncContext","_frame","_func","throwJSError","error","Worklets","require","throwErrorOnJS","createRunInJsFn","message","stack","Error","name","jsEngine","global","ErrorUtils","reportFatalError","safeError","createSharedValue","asyncContext","createContext","createRunInContextFn","frame","func","e","internal","decrementRefCount","proxy","initFrameProcessorPlugin","removeFrameProcessor","setFrameProcessor","result","installFrameProcessorBindings","VisionCameraProxy","getFrameProcessorPlugin","options","console","warn","getLastFrameProcessorCall","frameProcessorFuncId","_global$__frameProces","__frameProcessorRunAtTargetFpsMap","setLastFrameProcessorCall","runAtTargetFps","fps","funcId","__workletHash","targetIntervalMs","now","performance","diffToLastCall","undefined","runAsync","incrementRefCount"],"sourceRoot":"../../src","sources":["FrameProcessorPlugins.ts"],"mappings":"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"} -\ No newline at end of file -diff --git a/node_modules/react-native-vision-camera/lib/module/specs/CameraViewNativeComponent.js b/node_modules/react-native-vision-camera/lib/module/specs/CameraViewNativeComponent.js -new file mode 100644 -index 0000000..9a7c100 ---- /dev/null -+++ b/node_modules/react-native-vision-camera/lib/module/specs/CameraViewNativeComponent.js -@@ -0,0 +1,5 @@ -+/* eslint-disable @typescript-eslint/ban-types */ -+ -+import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -+export default codegenNativeComponent('CameraView'); -+//# sourceMappingURL=CameraViewNativeComponent.js.map -\ No newline at end of file -diff --git a/node_modules/react-native-vision-camera/lib/module/specs/CameraViewNativeComponent.js.map b/node_modules/react-native-vision-camera/lib/module/specs/CameraViewNativeComponent.js.map -new file mode 100644 -index 0000000..4052494 ---- /dev/null -+++ b/node_modules/react-native-vision-camera/lib/module/specs/CameraViewNativeComponent.js.map -@@ -0,0 +1 @@ -+{"version":3,"names":["codegenNativeComponent"],"sourceRoot":"../../../src","sources":["specs/CameraViewNativeComponent.ts"],"mappings":"AAAA;;AAGA,OAAOA,sBAAsB,MAAM,yDAAyD;AAuF5F,eAAeA,sBAAsB,CAAc,YAAY,CAAC"} -\ No newline at end of file -diff --git a/node_modules/react-native-vision-camera/lib/typescript/Camera.d.ts.map b/node_modules/react-native-vision-camera/lib/typescript/Camera.d.ts.map -index 71cc59b..d6ebc1c 100644 ---- a/node_modules/react-native-vision-camera/lib/typescript/Camera.d.ts.map -+++ b/node_modules/react-native-vision-camera/lib/typescript/Camera.d.ts.map -@@ -1 +1 @@ --{"version":3,"file":"Camera.d.ts","sourceRoot":"","sources":["../../src/Camera.tsx"],"names":[],"mappings":"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"} -\ No newline at end of file -+{"version":3,"file":"Camera.d.ts","sourceRoot":"","sources":["../../src/Camera.tsx"],"names":[],"mappings":"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"} -\ No newline at end of file -diff --git a/node_modules/react-native-vision-camera/lib/typescript/specs/CameraViewNativeComponent.d.ts b/node_modules/react-native-vision-camera/lib/typescript/specs/CameraViewNativeComponent.d.ts -new file mode 100644 -index 0000000..e7717c6 ---- /dev/null -+++ b/node_modules/react-native-vision-camera/lib/typescript/specs/CameraViewNativeComponent.d.ts -@@ -0,0 +1,100 @@ -+/// -+/// -+import type { HostComponent, ViewProps } from 'react-native'; -+import type { DirectEventHandler, Double, Int32 } from 'react-native/Libraries/Types/CodegenTypes'; -+export type VisionCameraComponentType = HostComponent; -+export interface NativeProps extends ViewProps { -+ enableGpuBuffers: boolean; -+ androidPreviewViewType?: string; -+ cameraId: string; -+ enableFrameProcessor: boolean; -+ enableLocation: boolean; -+ enableBufferCompression: boolean; -+ photoQualityBalance: string; -+ isActive: boolean; -+ photo?: boolean; -+ video?: boolean; -+ audio?: boolean; -+ torch?: string; -+ zoom?: Double; -+ exposure?: Double; -+ enableZoomGesture?: boolean; -+ enableFpsGraph?: boolean; -+ resizeMode?: string; -+ format?: Readonly<{ -+ supportsDepthCapture?: boolean; -+ photoHeight: Double; -+ photoWidth: Double; -+ videoHeight: Double; -+ videoWidth: Double; -+ maxISO: Double; -+ minISO: Double; -+ maxFps: Double; -+ minFps: Double; -+ fieldOfView: Double; -+ supportsVideoHDR: boolean; -+ supportsPhotoHDR: boolean; -+ autoFocusSystem: string; -+ videoStabilizationModes: string[]; -+ pixelFormats: string[]; -+ }>; -+ pixelFormat: string; -+ fps?: Int32; -+ videoHdr?: boolean; -+ photoHdr?: boolean; -+ lowLightBoost?: boolean; -+ videoStabilizationMode?: string; -+ enableDepthData?: boolean; -+ enablePortraitEffectsMatteDelivery?: boolean; -+ orientation?: string; -+ codeScannerOptions?: Readonly<{ -+ codeTypes?: string[]; -+ interval?: Double; -+ regionOfInterest?: Readonly<{ -+ x?: Double; -+ y?: Double; -+ width?: Double; -+ height?: Double; -+ }>; -+ }>; -+ onCodeScanned?: DirectEventHandler; -+ }>; -+ frame?: Readonly<{ -+ width: Int32; -+ height: Int32; -+ }>; -+ corners?: Readonly<{ -+ x: Double; -+ y: Double; -+ }>; -+ }>>; -+ onShutter?: DirectEventHandler>; -+ onStarted?: DirectEventHandler>; -+ onStopped?: DirectEventHandler>; -+ onInitialized?: DirectEventHandler>; -+ onError?: DirectEventHandler; -+ }>>; -+ onViewReady: DirectEventHandler>; -+} -+declare const _default: import("react-native/Libraries/Utilities/codegenNativeComponent").NativeComponentType; -+export default _default; -+//# sourceMappingURL=CameraViewNativeComponent.d.ts.map -\ No newline at end of file -diff --git a/node_modules/react-native-vision-camera/lib/typescript/specs/CameraViewNativeComponent.d.ts.map b/node_modules/react-native-vision-camera/lib/typescript/specs/CameraViewNativeComponent.d.ts.map -new file mode 100644 -index 0000000..e47e42f ---- /dev/null -+++ b/node_modules/react-native-vision-camera/lib/typescript/specs/CameraViewNativeComponent.d.ts.map -@@ -0,0 +1 @@ -+{"version":3,"file":"CameraViewNativeComponent.d.ts","sourceRoot":"","sources":["../../../src/specs/CameraViewNativeComponent.ts"],"names":[],"mappings":";;AACA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,2CAA2C,CAAC;AAGnG,MAAM,MAAM,yBAAyB,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;AAEnE,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,uBAAuB,EAAE,OAAO,CAAC;IACjC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,QAAQ,CAAC;QAChB,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,gBAAgB,EAAE,OAAO,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,uBAAuB,EAAE,MAAM,EAAE,CAAC;QAClC,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC,CAAC;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,QAAQ,CAAC;QAC5B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,QAAQ,CAAC;YAC1B,CAAC,CAAC,EAAE,MAAM,CAAC;YACX,CAAC,CAAC,EAAE,MAAM,CAAC;YACX,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,aAAa,CAAC,EAAE,kBAAkB,CAChC,QAAQ,CAAC;QACP,KAAK,CAAC,EAAE,QAAQ,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,KAAK,CAAC,EAAE,QAAQ,CAAC;gBAAE,CAAC,EAAE,MAAM,CAAC;gBAAC,CAAC,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAC,CAAC,CAAC;SAC1E,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,QAAQ,CAAC;YAAE,KAAK,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE,KAAK,CAAA;SAAE,CAAC,CAAC;QAClD,OAAO,CAAC,EAAE,QAAQ,CAAC;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC9C,CAAC,CACH,CAAC;IACF,SAAS,CAAC,EAAE,kBAAkB,CAC5B,QAAQ,CAAC;QACP,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CACH,CAAC;IACF,SAAS,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,aAAa,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,kBAAkB,CAC1B,QAAQ,CAAC;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,QAAQ,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACrF,CAAC,CACH,CAAC;IACF,WAAW,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;CAC/C;;AAED,wBAAiE"} -\ No newline at end of file -diff --git a/node_modules/react-native-vision-camera/package.json b/node_modules/react-native-vision-camera/package.json -index 86352fa..7af9577 100644 ---- a/node_modules/react-native-vision-camera/package.json -+++ b/node_modules/react-native-vision-camera/package.json -@@ -166,5 +166,13 @@ - ] - ] - }, -- "packageManager": "yarn@1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447" -+ "codegenConfig": { -+ "name": "RNVisioncameraSpec", -+ "type": "all", -+ "jsSrcsDir": "./src/specs", -+ "android": { -+ "javaPackageName": "com.mrousavy.camera" -+ } -+ }, -+ "packageManager": "yarn@1.22.19" - } -diff --git a/node_modules/react-native-vision-camera/src/Camera.tsx b/node_modules/react-native-vision-camera/src/Camera.tsx -index 18733ba..1668322 100644 ---- a/node_modules/react-native-vision-camera/src/Camera.tsx -+++ b/node_modules/react-native-vision-camera/src/Camera.tsx -@@ -1,5 +1,5 @@ - import React from 'react' --import { requireNativeComponent, NativeSyntheticEvent, findNodeHandle, NativeMethods } from 'react-native' -+import { NativeSyntheticEvent, findNodeHandle, NativeMethods } from 'react-native' - import type { CameraDevice } from './CameraDevice' - import type { ErrorWithCause } from './CameraError' - import { CameraCaptureError, CameraRuntimeError, tryParseNativeCameraError, isErrorWithCause } from './CameraError' -@@ -10,9 +10,12 @@ import type { Point } from './Point' - import type { RecordVideoOptions, VideoFile } from './VideoFile' - import { VisionCameraProxy } from './FrameProcessorPlugins' - import { CameraDevices } from './CameraDevices' --import type { EmitterSubscription } from 'react-native' -+import type { EmitterSubscription, requireNativeComponent } from 'react-native' - import type { Code, CodeScanner, CodeScannerFrame } from './CodeScanner' - import { TakeSnapshotOptions } from './Snapshot' -+import NativeCameraViewCodegen from './specs/CameraViewNativeComponent' -+ -+const NativeCameraView = NativeCameraViewCodegen as unknown as ReturnType> - - //#region Types - export type CameraPermissionStatus = 'granted' | 'not-determined' | 'denied' | 'restricted' -@@ -604,10 +607,3 @@ export class Camera extends React.PureComponent { - } - } - //#endregion -- --// requireNativeComponent automatically resolves 'CameraView' to 'CameraViewManager' --const NativeCameraView = requireNativeComponent( -- 'CameraView', -- // @ts-expect-error because the type declarations are kinda wrong, no? -- Camera, --) -diff --git a/node_modules/react-native-vision-camera/src/FrameProcessorPlugins.ts b/node_modules/react-native-vision-camera/src/FrameProcessorPlugins.ts -index aa9d5ee..e7a3fa8 100644 ---- a/node_modules/react-native-vision-camera/src/FrameProcessorPlugins.ts -+++ b/node_modules/react-native-vision-camera/src/FrameProcessorPlugins.ts -@@ -98,7 +98,7 @@ try { - isAsyncContextBusy.value = false - } - }, asyncContext) -- hasWorklets = true -+ // hasWorklets = true - } catch (e) { - // Worklets are not installed, so Frame Processors are disabled. - } -diff --git a/node_modules/react-native-vision-camera/src/specs/CameraViewNativeComponent.ts b/node_modules/react-native-vision-camera/src/specs/CameraViewNativeComponent.ts -new file mode 100644 -index 0000000..70f4572 ---- /dev/null -+++ b/node_modules/react-native-vision-camera/src/specs/CameraViewNativeComponent.ts -@@ -0,0 +1,91 @@ -+/* eslint-disable @typescript-eslint/ban-types */ -+import type { HostComponent, ViewProps } from 'react-native'; -+import type { DirectEventHandler, Double, Int32 } from 'react-native/Libraries/Types/CodegenTypes'; -+import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; -+ -+export type VisionCameraComponentType = HostComponent; -+ -+export interface NativeProps extends ViewProps { -+ enableGpuBuffers: boolean; -+ androidPreviewViewType?: string; -+ cameraId: string; -+ enableFrameProcessor: boolean; -+ enableLocation: boolean; -+ enableBufferCompression: boolean; -+ photoQualityBalance: string; -+ isActive: boolean; -+ photo?: boolean; -+ video?: boolean; -+ audio?: boolean; -+ torch?: string; -+ zoom?: Double; -+ exposure?: Double; -+ enableZoomGesture?: boolean; -+ enableFpsGraph?: boolean; -+ resizeMode?: string; -+ format?: Readonly<{ -+ supportsDepthCapture?: boolean; -+ photoHeight: Double; -+ photoWidth: Double; -+ videoHeight: Double; -+ videoWidth: Double; -+ maxISO: Double; -+ minISO: Double; -+ maxFps: Double; -+ minFps: Double; -+ fieldOfView: Double; -+ supportsVideoHDR: boolean; -+ supportsPhotoHDR: boolean; -+ autoFocusSystem: string; -+ videoStabilizationModes: string[]; -+ pixelFormats: string[]; -+ }>; -+ pixelFormat: string; -+ fps?: Int32; -+ videoHdr?: boolean; // not sure why was int on native side -+ photoHdr?: boolean; // not sure why was int on native side -+ lowLightBoost?: boolean; // same -+ videoStabilizationMode?: string; -+ enableDepthData?: boolean; -+ enablePortraitEffectsMatteDelivery?: boolean; -+ orientation?: string; -+ codeScannerOptions?: Readonly<{ -+ codeTypes?: string[]; -+ interval?: Double; -+ regionOfInterest?: Readonly<{ -+ x?: Double, -+ y?: Double, -+ width?: Double, -+ height?: Double, -+ }>; -+ }>; -+ onCodeScanned?: DirectEventHandler< -+ Readonly<{ -+ codes?: Readonly<{ -+ type?: string; -+ value?: string; -+ frame?: Readonly<{ x: Double, y: Double, width: Double, height: Double}>; -+ }>; -+ frame?: Readonly<{ width: Int32, height: Int32 }>; -+ corners?: Readonly<{ x: Double, y: Double }>; -+ }> -+ >; -+ onShutter?: DirectEventHandler< -+ Readonly<{ -+ type: string; -+ }> -+ >; -+ onStarted?: DirectEventHandler>; -+ onStopped?: DirectEventHandler>; -+ onInitialized?: DirectEventHandler>; -+ onError?: DirectEventHandler< -+ Readonly<{ -+ code: string; -+ message: string; -+ cause: Readonly<{ code: string; domain: string; message: string; details: string }>; -+ }> -+ >; -+ onViewReady: DirectEventHandler>; -+} -+ -+export default codegenNativeComponent('CameraView'); diff --git a/patches/react-native-vision-camera+4.0.0-beta.13+002+native-stack-unmount-recycle-camera-session.patch b/patches/react-native-vision-camera+4.0.0-beta.13+002+native-stack-unmount-recycle-camera-session.patch deleted file mode 100644 index ac9bda68f9d9..000000000000 --- a/patches/react-native-vision-camera+4.0.0-beta.13+002+native-stack-unmount-recycle-camera-session.patch +++ /dev/null @@ -1,55 +0,0 @@ -diff --git a/node_modules/react-native-vision-camera/ios/RNCameraView.mm b/node_modules/react-native-vision-camera/ios/RNCameraView.mm -index b90427e..0be4171 100644 ---- a/node_modules/react-native-vision-camera/ios/RNCameraView.mm -+++ b/node_modules/react-native-vision-camera/ios/RNCameraView.mm -@@ -34,26 +34,43 @@ + (ComponentDescriptorProvider)componentDescriptorProvider - return concreteComponentDescriptorProvider(); - } - --- (instancetype)initWithFrame:(CGRect)frame --{ -- self = [super initWithFrame:frame]; --if (self) { -- static const auto defaultProps = std::make_shared(); -+- (void) initCamera { -+ static const auto defaultProps = std::make_shared(); - _props = defaultProps; - -- //The remaining part of the initializer is standard Objective-C code to create views and layout them with AutoLayout. Here we can change whatever we want to. -+ // The remaining part of the initializer is standard bjective-C code to create views and layout them with utoLayout. Here we can change whatever we want to. - _view = [[CameraView alloc] init]; - _view.delegate = self; - - self.contentView = _view; - } - --return self; -+- (instancetype)initWithFrame:(CGRect)frame -+{ -+ self = [super initWithFrame:frame]; -+ if (self) { -+ [self initCamera]; -+ } -+ -+ return self; -+} -+ -+- (void) prepareForRecycle { -+ [super prepareForRecycle]; -+ -+ self.contentView = _view; -+ _view.delegate = nil; -+ _view = nil; -+ self.contentView = nil; - } - - // why we need this func -> https://reactnative.dev/docs/next/the-new-architecture/pillars-fabric-components#write-the-native-ios-code - - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps - { -+ if (_view == nil) { -+ [self initCamera]; -+ } -+ - const auto &newViewProps = *std::static_pointer_cast(props); - const auto &oldViewProps = *std::static_pointer_cast(_props); - diff --git a/patches/react-native-vision-camera+4.6.1.patch b/patches/react-native-vision-camera+4.6.1.patch new file mode 100644 index 000000000000..c388ae1398b0 --- /dev/null +++ b/patches/react-native-vision-camera+4.6.1.patch @@ -0,0 +1,5513 @@ +diff --git a/node_modules/react-native-vision-camera/android/.editorconfig b/node_modules/react-native-vision-camera/android/.editorconfig +new file mode 100644 +index 0000000..2f08d6d +--- /dev/null ++++ b/node_modules/react-native-vision-camera/android/.editorconfig +@@ -0,0 +1,15 @@ ++[*.{kt,kts}] ++indent_style=space ++indent_size=2 ++continuation_indent_size=4 ++insert_final_newline=true ++max_line_length=140 ++ktlint_code_style=android_studio ++ktlint_standard=enabled ++ktlint_experimental=enabled ++ktlint_standard_filename=disabled # dont require PascalCase filenames ++ktlint_standard_no-wildcard-imports=disabled # allow .* imports ++ktlint_function_signature_rule_force_multiline_when_parameter_count_greater_or_equal_than=5 ++ktlint_function_signature_body_expression_wrapping=multiline ++ij_kotlin_allow_trailing_comma_on_call_site=false ++ij_kotlin_allow_trailing_comma=false +diff --git a/node_modules/react-native-vision-camera/android/.project b/node_modules/react-native-vision-camera/android/.project +new file mode 100644 +index 0000000..0e0a1ba +--- /dev/null ++++ b/node_modules/react-native-vision-camera/android/.project +@@ -0,0 +1,17 @@ ++ ++ ++ android_ ++ Project android_ created by Buildship. ++ ++ ++ ++ ++ org.eclipse.buildship.core.gradleprojectbuilder ++ ++ ++ ++ ++ ++ org.eclipse.buildship.core.gradleprojectnature ++ ++ +diff --git a/node_modules/react-native-vision-camera/android/gradlew b/node_modules/react-native-vision-camera/android/gradlew +new file mode 100644 +index 0000000..1b6c787 +--- /dev/null ++++ b/node_modules/react-native-vision-camera/android/gradlew +@@ -0,0 +1,234 @@ ++#!/bin/sh ++ ++# ++# Copyright © 2015-2021 the original authors. ++# ++# Licensed under the Apache License, Version 2.0 (the "License"); ++# you may not use this file except in compliance with the License. ++# You may obtain a copy of the License at ++# ++# https://www.apache.org/licenses/LICENSE-2.0 ++# ++# Unless required by applicable law or agreed to in writing, software ++# distributed under the License is distributed on an "AS IS" BASIS, ++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++# See the License for the specific language governing permissions and ++# limitations under the License. ++# ++ ++############################################################################## ++# ++# Gradle start up script for POSIX generated by Gradle. ++# ++# Important for running: ++# ++# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is ++# noncompliant, but you have some other compliant shell such as ksh or ++# bash, then to run this script, type that shell name before the whole ++# command line, like: ++# ++# ksh Gradle ++# ++# Busybox and similar reduced shells will NOT work, because this script ++# requires all of these POSIX shell features: ++# * functions; ++# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», ++# «${var#prefix}», «${var%suffix}», and «$( cmd )»; ++# * compound commands having a testable exit status, especially «case»; ++# * various built-in commands including «command», «set», and «ulimit». ++# ++# Important for patching: ++# ++# (2) This script targets any POSIX shell, so it avoids extensions provided ++# by Bash, Ksh, etc; in particular arrays are avoided. ++# ++# The "traditional" practice of packing multiple parameters into a ++# space-separated string is a well documented source of bugs and security ++# problems, so this is (mostly) avoided, by progressively accumulating ++# options in "$@", and eventually passing that to Java. ++# ++# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, ++# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; ++# see the in-line comments for details. ++# ++# There are tweaks for specific operating systems such as AIX, CygWin, ++# 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 ++# within the Gradle project. ++# ++# You can find Gradle at https://github.com/gradle/gradle/. ++# ++############################################################################## ++ ++# Attempt to set APP_HOME ++ ++# Resolve links: $0 may be a link ++app_path=$0 ++ ++# Need this for daisy-chained symlinks. ++while ++ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path ++ [ -h "$app_path" ] ++do ++ ls=$( ls -ld "$app_path" ) ++ link=${ls#*' -> '} ++ case $link in #( ++ /*) app_path=$link ;; #( ++ *) app_path=$APP_HOME$link ;; ++ esac ++done ++ ++APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit ++ ++APP_NAME="Gradle" ++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"' ++ ++# Use the maximum available, or set MAX_FD != -1 to use that value. ++MAX_FD=maximum ++ ++warn () { ++ echo "$*" ++} >&2 ++ ++die () { ++ echo ++ echo "$*" ++ echo ++ exit 1 ++} >&2 ++ ++# OS specific support (must be 'true' or 'false'). ++cygwin=false ++msys=false ++darwin=false ++nonstop=false ++case "$( uname )" in #( ++ CYGWIN* ) cygwin=true ;; #( ++ Darwin* ) darwin=true ;; #( ++ MSYS* | MINGW* ) msys=true ;; #( ++ NONSTOP* ) nonstop=true ;; ++esac ++ ++CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar ++ ++ ++# Determine the Java command to use to start the JVM. ++if [ -n "$JAVA_HOME" ] ; then ++ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then ++ # IBM's JDK on AIX uses strange locations for the executables ++ JAVACMD=$JAVA_HOME/jre/sh/java ++ else ++ JAVACMD=$JAVA_HOME/bin/java ++ fi ++ if [ ! -x "$JAVACMD" ] ; then ++ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME ++ ++Please set the JAVA_HOME variable in your environment to match the ++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. ++ ++Please set the JAVA_HOME variable in your environment to match the ++location of your Java installation." ++fi ++ ++# Increase the maximum file descriptors if we can. ++if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then ++ case $MAX_FD in #( ++ max*) ++ MAX_FD=$( ulimit -H -n ) || ++ warn "Could not query maximum file descriptor limit" ++ esac ++ case $MAX_FD in #( ++ '' | soft) :;; #( ++ *) ++ ulimit -n "$MAX_FD" || ++ warn "Could not set maximum file descriptor limit to $MAX_FD" ++ esac ++fi ++ ++# Collect all arguments for the java command, stacking in reverse order: ++# * args from the command line ++# * the main class name ++# * -classpath ++# * -D...appname settings ++# * --module-path (only if needed) ++# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. ++ ++# For Cygwin or MSYS, switch paths to Windows format before running java ++if "$cygwin" || "$msys" ; then ++ APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) ++ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) ++ ++ JAVACMD=$( cygpath --unix "$JAVACMD" ) ++ ++ # Now convert the arguments - kludge to limit ourselves to /bin/sh ++ for arg do ++ if ++ case $arg in #( ++ -*) false ;; # don't mess with options #( ++ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath ++ [ -e "$t" ] ;; #( ++ *) false ;; ++ esac ++ then ++ arg=$( cygpath --path --ignore --mixed "$arg" ) ++ fi ++ # Roll the args list around exactly as many times as the number of ++ # args, so each arg winds up back in the position where it started, but ++ # possibly modified. ++ # ++ # NB: a `for` loop captures its iteration list before it begins, so ++ # changing the positional parameters here affects neither the number of ++ # iterations, nor the values presented in `arg`. ++ shift # remove old arg ++ set -- "$@" "$arg" # push replacement arg ++ done ++fi ++ ++# 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 ++# double quotes to make sure that they get re-expanded; and ++# * put everything else in single quotes, so that it's not re-expanded. ++ ++set -- \ ++ "-Dorg.gradle.appname=$APP_BASE_NAME" \ ++ -classpath "$CLASSPATH" \ ++ org.gradle.wrapper.GradleWrapperMain \ ++ "$@" ++ ++# Use "xargs" to parse quoted args. ++# ++# With -n1 it outputs one arg per line, with the quotes and backslashes removed. ++# ++# In Bash we could simply go: ++# ++# readarray ARGS < <( xargs -n1 <<<"$var" ) && ++# set -- "${ARGS[@]}" "$@" ++# ++# but POSIX shell has neither arrays nor command substitution, so instead we ++# post-process each arg (as a line of input to sed) to backslash-escape any ++# character that might be a shell metacharacter, then use eval to reverse ++# that process (while maintaining the separation between arguments), and wrap ++# the whole thing up as a single "set" statement. ++# ++# This will of course break if any of these variables contains a newline or ++# an unmatched quote. ++# ++ ++eval "set -- $( ++ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | ++ xargs -n1 | ++ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | ++ tr '\n' ' ' ++ )" '"$@"' ++ ++exec "$JAVACMD" "$@" +diff --git a/node_modules/react-native-vision-camera/android/gradlew.bat b/node_modules/react-native-vision-camera/android/gradlew.bat +new file mode 100644 +index 0000000..107acd3 +--- /dev/null ++++ b/node_modules/react-native-vision-camera/android/gradlew.bat +@@ -0,0 +1,89 @@ ++@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 +diff --git a/node_modules/react-native-vision-camera/android/oldarch/src/main/java/com/facebook/react/viewmanagers/CameraViewManagerDelegate.java b/node_modules/react-native-vision-camera/android/oldarch/src/main/java/com/facebook/react/viewmanagers/CameraViewManagerDelegate.java +new file mode 100644 +index 0000000..a1bed79 +--- /dev/null ++++ b/node_modules/react-native-vision-camera/android/oldarch/src/main/java/com/facebook/react/viewmanagers/CameraViewManagerDelegate.java +@@ -0,0 +1,113 @@ ++/** ++* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++* ++* Do not edit this file as changes may cause incorrect behavior and will be lost ++* once the code is regenerated. ++* ++* @generated by codegen project: GeneratePropsJavaDelegate.js ++*/ ++ ++package com.facebook.react.viewmanagers; ++ ++import android.view.View; ++import androidx.annotation.Nullable; ++import com.facebook.react.bridge.ReadableMap; ++import com.facebook.react.uimanager.BaseViewManagerDelegate; ++import com.facebook.react.uimanager.BaseViewManagerInterface; ++ ++public class CameraViewManagerDelegate & CameraViewManagerInterface> extends aseViewManagerDelegate { ++ public CameraViewManagerDelegate(U viewManager) { ++ super(viewManager); ++ } ++ @Override ++ public void setProperty(T view, String propName, @Nullable Object value) { ++ switch (propName) { ++ case "enableGpuBuffers": ++ mViewManager.setEnableGpuBuffers(view, value == null ? false : (boolean) value); ++ break; ++ case "androidPreviewViewType": ++ mViewManager.setAndroidPreviewViewType(view, value == null ? null : (String) value); ++ break; ++ case "codeScannerOptions": ++ mViewManager.setCodeScannerOptions(view, (ReadableMap) value); ++ break; ++ case "cameraId": ++ mViewManager.setCameraId(view, value == null ? null : (String) value); ++ break; ++ case "enableFrameProcessor": ++ mViewManager.setEnableFrameProcessor(view, value == null ? false : (boolean) value); ++ break; ++ case "enableLocation": ++ mViewManager.setEnableLocation(view, value == null ? false : (boolean) value); ++ break; ++ case "enableBufferCompression": ++ mViewManager.setEnableBufferCompression(view, value == null ? false : (boolean) value); ++ break; ++ case "photoQualityBalance": ++ mViewManager.setPhotoQualityBalance(view, value == null ? null : (String) value); ++ break; ++ case "isActive": ++ mViewManager.setIsActive(view, value == null ? false : (boolean) value); ++ break; ++ case "photo": ++ mViewManager.setPhoto(view, value == null ? false : (boolean) value); ++ break; ++ case "video": ++ mViewManager.setVideo(view, value == null ? false : (boolean) value); ++ break; ++ case "audio": ++ mViewManager.setAudio(view, value == null ? false : (boolean) value); ++ break; ++ case "torch": ++ mViewManager.setTorch(view, value == null ? null : (String) value); ++ break; ++ case "zoom": ++ mViewManager.setZoom(view, value == null ? 0f : ((Double) value).doubleValue()); ++ break; ++ case "exposure": ++ mViewManager.setExposure(view, value == null ? 0f : ((Double) value).doubleValue()); ++ break; ++ case "enableZoomGesture": ++ mViewManager.setEnableZoomGesture(view, value == null ? false : (boolean) value); ++ break; ++ case "enableFpsGraph": ++ mViewManager.setEnableFpsGraph(view, value == null ? false : (boolean) value); ++ break; ++ case "resizeMode": ++ mViewManager.setResizeMode(view, value == null ? null : (String) value); ++ break; ++ case "format": ++ mViewManager.setFormat(view, (ReadableMap) value); ++ break; ++ case "pixelFormat": ++ mViewManager.setPixelFormat(view, value == null ? null : (String) value); ++ break; ++ case "fps": ++ mViewManager.setFps(view, value == null ? 0 : ((Double) value).intValue()); ++ break; ++ case "videoHdr": ++ mViewManager.setVideoHdr(view, value == null ? false : (boolean) value); ++ break; ++ case "photoHdr": ++ mViewManager.setPhotoHdr(view, value == null ? false : (boolean) value); ++ break; ++ case "lowLightBoost": ++ mViewManager.setLowLightBoost(view, value == null ? false : (boolean) value); ++ break; ++ case "videoStabilizationMode": ++ mViewManager.setVideoStabilizationMode(view, value == null ? null : (String) value); ++ break; ++ case "enableDepthData": ++ mViewManager.setEnableDepthData(view, value == null ? false : (boolean) value); ++ break; ++ case "enablePortraitEffectsMatteDelivery": ++ mViewManager.setEnablePortraitEffectsMatteDelivery(view, value == null ? false : (boolean) value); ++ break; ++ case "orientation": ++ mViewManager.setOrientation(view, value == null ? null : (String) value); ++ break; ++ default: ++ super.setProperty(view, propName, value); ++ } ++ } ++} +diff --git a/node_modules/react-native-vision-camera/android/oldarch/src/main/java/com/facebook/react/viewmanagers/CameraViewManagerInterface.java b/node_modules/react-native-vision-camera/android/oldarch/src/main/java/com/facebook/react/viewmanagers/CameraViewManagerInterface.java +new file mode 100644 +index 0000000..94079b2 +--- /dev/null ++++ b/node_modules/react-native-vision-camera/android/oldarch/src/main/java/com/facebook/react/viewmanagers/CameraViewManagerInterface.java +@@ -0,0 +1,45 @@ ++/** ++* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). ++* ++* Do not edit this file as changes may cause incorrect behavior and will be lost ++* once the code is regenerated. ++* ++* @generated by codegen project: GeneratePropsJavaInterface.js ++*/ ++ ++package com.facebook.react.viewmanagers; ++ ++import android.view.View; ++import androidx.annotation.Nullable; ++import com.facebook.react.bridge.ReadableMap; ++ ++public interface CameraViewManagerInterface { ++ void setEnableGpuBuffers(T view, boolean value); ++ void setAndroidPreviewViewType(T view, @Nullable String value); ++ void setCodeScannerOptions(T view, @Nullable ReadableMap value); ++ void setCameraId(T view, @Nullable String value); ++ void setEnableFrameProcessor(T view, boolean value); ++ void setEnableLocation(T view, boolean value); ++ void setEnableBufferCompression(T view, boolean value); ++ void setPhotoQualityBalance(T view, @Nullable String value); ++ void setIsActive(T view, boolean value); ++ void setPhoto(T view, boolean value); ++ void setVideo(T view, boolean value); ++ void setAudio(T view, boolean value); ++ void setTorch(T view, @Nullable String value); ++ void setZoom(T view, double value); ++ void setExposure(T view, double value); ++ void setEnableZoomGesture(T view, boolean value); ++ void setEnableFpsGraph(T view, boolean value); ++ void setResizeMode(T view, @Nullable String value); ++ void setFormat(T view, @Nullable ReadableMap value); ++ void setPixelFormat(T view, @Nullable String value); ++ void setFps(T view, int value); ++ void setVideoHdr(T view, boolean value); ++ void setPhotoHdr(T view, boolean value); ++ void setLowLightBoost(T view, boolean value); ++ void setVideoStabilizationMode(T view, @Nullable String value); ++ void setEnableDepthData(T view, boolean value); ++ void setEnablePortraitEffectsMatteDelivery(T view, boolean value); ++ void setOrientation(T view, @Nullable String value); ++} +diff --git a/node_modules/react-native-vision-camera/android/settings.gradle b/node_modules/react-native-vision-camera/android/settings.gradle +new file mode 100644 +index 0000000..56a6c3d +--- /dev/null ++++ b/node_modules/react-native-vision-camera/android/settings.gradle +@@ -0,0 +1,3 @@ ++rootProject.name = 'VisionCamera' ++ ++include ':VisionCamera' +diff --git a/node_modules/react-native-vision-camera/android/src/main/.DS_Store b/node_modules/react-native-vision-camera/android/src/main/.DS_Store +new file mode 100644 +index 0000000..e69de29 +diff --git a/node_modules/react-native-vision-camera/ios/.swiftformat b/node_modules/react-native-vision-camera/ios/.swiftformat +new file mode 100644 +index 0000000..95e71c1 +--- /dev/null ++++ b/node_modules/react-native-vision-camera/ios/.swiftformat +@@ -0,0 +1,12 @@ ++--allman false ++--indent 2 ++--exclude Pods,Generated ++ ++--disable andOperator ++--disable redundantReturn ++--disable wrapMultilineStatementBraces ++--disable organizeDeclarations ++ ++--enable markTypes ++ ++--enable isEmpty +diff --git a/node_modules/react-native-vision-camera/ios/.swiftlint.yml b/node_modules/react-native-vision-camera/ios/.swiftlint.yml +new file mode 100644 +index 0000000..1a72686 +--- /dev/null ++++ b/node_modules/react-native-vision-camera/ios/.swiftlint.yml +@@ -0,0 +1,52 @@ ++disabled_rules: ++ - identifier_name ++ - trailing_comma ++ - todo ++ - type_body_length ++ - cyclomatic_complexity ++ - function_body_length ++ - for_where ++opt_in_rules: ++ - contains_over_filter_count ++ - contains_over_filter_is_empty ++ - contains_over_first_not_nil ++ - contains_over_range_nil_comparison ++ - empty_collection_literal ++ - empty_count ++ - empty_string ++ - first_where ++ - flatmap_over_map_reduce ++ - last_where ++ - reduce_boolean ++ - reduce_into ++ - yoda_condition ++ - vertical_whitespace_opening_braces ++ - vertical_whitespace_closing_braces ++ - vertical_parameter_alignment_on_call ++ - untyped_error_in_catch ++ - unowned_variable_capture ++ - unavailable_function ++ - switch_case_on_newline ++ - static_operator ++ - strict_fileprivate ++ - sorted_imports ++ - sorted_first_last ++ - required_enum_case ++ - redundant_type_annotation ++ - redundant_nil_coalescing ++ - attributes ++ - convenience_type ++analyzer_rules: ++ - explicit_self ++ - unused_declaration ++ - unused_import ++ ++excluded: # paths to ignore during linting. Takes precedence over `included`. ++ - Pods ++ ++# Adjust rule numbers ++line_length: 160 ++file_length: 500 ++ ++# reporter type (xcode, json, csv, checkstyle, codeclimate, junit, html, emoji, sonarqube, markdown, github-actions-logging) ++reporter: 'xcode' +diff --git a/node_modules/react-native-vision-camera/ios/RNCameraView.h b/node_modules/react-native-vision-camera/ios/RNCameraView.h +new file mode 100644 +index 0000000..46c2c2c +--- /dev/null ++++ b/node_modules/react-native-vision-camera/ios/RNCameraView.h +@@ -0,0 +1,14 @@ ++// This guard prevent this file to be compiled in the old architecture. ++#ifdef RCT_NEW_ARCH_ENABLED ++#import ++#import ++ ++ ++NS_ASSUME_NONNULL_BEGIN ++ ++@interface RNCameraView : RCTViewComponentView ++@end ++ ++NS_ASSUME_NONNULL_END ++ ++#endif /* RCT_NEW_ARCH_ENABLED */ +diff --git a/node_modules/react-native-vision-camera/ios/RNCameraView.mm b/node_modules/react-native-vision-camera/ios/RNCameraView.mm +new file mode 100644 +index 0000000..20f4996 +--- /dev/null ++++ b/node_modules/react-native-vision-camera/ios/RNCameraView.mm +@@ -0,0 +1,394 @@ ++// This guard prevent the code from being compiled in the old architecture ++#ifdef RCT_NEW_ARCH_ENABLED ++#import ++ ++#import ++#import ++#import ++#import ++ ++#import "RCTFabricComponentsPlugins.h" ++#import ++#import ++#import ++#import ++ ++#ifdef USE_FRAMEWORKS ++#import ++#else ++#import "VisionCamera-Swift.h" ++#endif ++ ++@interface RNCameraView : RCTViewComponentView ++@end ++ ++ ++using namespace facebook::react; ++ ++@implementation RNCameraView { ++ CameraView * _view; ++} ++ +++ (ComponentDescriptorProvider)componentDescriptorProvider ++{ ++ return concreteComponentDescriptorProvider(); ++} ++ ++- (void) initCamera { ++ static const auto defaultProps = std::make_shared(); ++ _props = defaultProps; ++ ++ // The remaining part of the initializer is standard bjective-C code to create views and layout them with utoLayout. Here we can change whatever we want to. ++ _view = [[CameraView alloc] init]; ++ _view.delegate = self; ++ ++ self.contentView = _view; ++} ++ ++- (instancetype)initWithFrame:(CGRect)frame ++{ ++ self = [super initWithFrame:frame]; ++ if (self) { ++ [self initCamera]; ++ } ++ ++ return self; ++} ++ ++- (void) prepareForRecycle { ++ [super prepareForRecycle]; ++ ++ self.contentView = _view; ++ _view.delegate = nil; ++ _view = nil; ++ self.contentView = nil; ++} ++ ++// why we need this func -> https://reactnative.dev/docs/next/the-new-architecture/pillars-fabric-components#write-the-native-ios-code ++- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps ++{ ++ if (_view == nil) { ++ [self initCamera]; ++ } ++ ++ const auto &newViewProps = *std::static_pointer_cast(props); ++ const auto &oldViewProps = *std::static_pointer_cast(_props); ++ ++ NSMutableArray* changedProps = [[NSMutableArray alloc] init]; ++ ++ if(oldViewProps.isActive != newViewProps.isActive){ ++ _view.isActive = newViewProps.isActive; ++ [changedProps addObject:@"isActive"]; ++ } ++ if(oldViewProps.cameraId != newViewProps.cameraId){ ++ _view.cameraId = RCTNSStringFromString(newViewProps.cameraId); ++ [changedProps addObject:@"cameraId"]; ++ } ++ if(oldViewProps.photoQualityBalance != newViewProps.photoQualityBalance){ ++ _view.photoQualityBalance = RCTNSStringFromString(newViewProps.photoQualityBalance); ++ [changedProps addObject:@"photoQualityBalance"]; ++ } ++ if(oldViewProps.enableDepthData != newViewProps.enableDepthData){ ++ _view.enableDepthData = newViewProps.enableDepthData; ++ [changedProps addObject:@"enableDepthData"]; ++ } ++ if(oldViewProps.enablePortraitEffectsMatteDelivery != newViewProps.enablePortraitEffectsMatteDelivery){ ++ _view.enablePortraitEffectsMatteDelivery = newViewProps.enablePortraitEffectsMatteDelivery; ++ [changedProps addObject:@"enablePortraitEffectsMatteDelivery"]; ++ } ++ if(oldViewProps.photo != newViewProps.photo){ ++ _view.photo = [NSNumber numberWithBool:newViewProps.photo]; ++ [changedProps addObject:@"photo"]; ++ } ++ if(oldViewProps.video != newViewProps.video){ ++ _view.video = [NSNumber numberWithBool:newViewProps.video]; ++ [changedProps addObject:@"video"]; ++ } ++ if(oldViewProps.audio != newViewProps.audio){ ++ _view.audio = [NSNumber numberWithBool:newViewProps.audio]; ++ [changedProps addObject:@"audio"]; ++ } ++ if(oldViewProps.enableFrameProcessor != newViewProps.enableFrameProcessor){ ++ _view.enableFrameProcessor = newViewProps.enableFrameProcessor; ++ [changedProps addObject:@"enableFrameProcessor"]; ++ } ++ if(oldViewProps.enableLocation != newViewProps.enableLocation){ ++ _view.enableLocation = newViewProps.enableLocation; ++ [changedProps addObject:@"enableLocation"]; ++ } ++ if(oldViewProps.enableBufferCompression != newViewProps.enableBufferCompression){ ++ _view.enableBufferCompression = newViewProps.enableBufferCompression; ++ [changedProps addObject:@"enableBufferCompression"]; ++ } ++ if(oldViewProps.fps != newViewProps.fps){ ++ _view.fps = [NSNumber numberWithInt:newViewProps.fps]; ++ [changedProps addObject:@"fps"]; ++ } ++ if(oldViewProps.videoHdr != newViewProps.videoHdr){ ++ _view.videoHdr = newViewProps.videoHdr; ++ [changedProps addObject:@"videoHdr"]; ++ } ++ if(oldViewProps.photoHdr != newViewProps.photoHdr){ ++ _view.photoHdr = newViewProps.photoHdr; ++ [changedProps addObject:@"photoHdr"]; ++ } ++ if(oldViewProps.lowLightBoost != newViewProps.lowLightBoost){ ++ _view.lowLightBoost = newViewProps.lowLightBoost; ++ [changedProps addObject:@"lowLightBoost"]; ++ } ++ if(oldViewProps.videoStabilizationMode != newViewProps.videoStabilizationMode){ ++ _view.videoStabilizationMode = RCTNSStringFromString(newViewProps.videoStabilizationMode); ++ [changedProps addObject:@"videoStabilizationMode"]; ++ } ++ if(oldViewProps.torch != newViewProps.torch){ ++ _view.torch = RCTNSStringFromString(newViewProps.torch); ++ [changedProps addObject:@"torch"]; ++ } ++ if(oldViewProps.orientation != newViewProps.orientation){ ++ _view.orientation = RCTNSStringFromString(newViewProps.orientation); ++ [changedProps addObject:@"orientation"]; ++ } ++ if(oldViewProps.resizeMode != newViewProps.resizeMode){ ++ _view.resizeMode = RCTNSStringFromString(newViewProps.resizeMode); ++ [changedProps addObject:@"resizeMode"]; ++ } ++ if(oldViewProps.pixelFormat != newViewProps.pixelFormat){ ++ _view.pixelFormat = RCTNSStringFromString(newViewProps.pixelFormat); ++ [changedProps addObject:@"pixelFormat"]; ++ } ++ if(oldViewProps.zoom != newViewProps.zoom){ ++ _view.zoom = [NSNumber numberWithDouble:newViewProps.zoom]; ++ [changedProps addObject:@"zoom"]; ++ } ++ if(oldViewProps.exposure != newViewProps.exposure){ ++ _view.exposure = [NSNumber numberWithDouble:newViewProps.exposure]; ++ [changedProps addObject:@"exposure"]; ++ } ++ if(oldViewProps.enableZoomGesture != newViewProps.enableZoomGesture){ ++ _view.enableZoomGesture = newViewProps.enableZoomGesture; ++ [changedProps addObject:@"enableZoomGesture"]; ++ } ++ if(oldViewProps.enableFpsGraph != newViewProps.enableFpsGraph){ ++ _view.enableFpsGraph = newViewProps.enableFpsGraph; ++ [changedProps addObject:@"enableFpsGraph"]; ++ } ++ ++ ++ if(_view.format == nil){ ++ _view.format =[ [NSMutableDictionary alloc] init]; ++ } ++ ++ ++ //Checking format props, TODO: find cleaner way to do it ++ if(oldViewProps.format.supportsDepthCapture != newViewProps.format.supportsDepthCapture){ ++ NSNumber* supportsDepthCapture = newViewProps.format.supportsDepthCapture ? @1 : @0; ++ [_view.format setValue:supportsDepthCapture forKey:@"supportsDepthCapture"]; ++ [changedProps addObject:@"format"]; ++ } ++ if(oldViewProps.format.autoFocusSystem != newViewProps.format.autoFocusSystem){ ++ [_view.format setValue:RCTNSStringFromString(newViewProps.format.autoFocusSystem) forKey:@"autoFocusSystem"]; ++ [changedProps addObject:@"format"]; ++ } ++ if(oldViewProps.format.pixelFormats.size() != newViewProps.format.pixelFormats.size()){ ++ NSMutableArray* newPixelFormats = [[NSMutableArray alloc] init]; ++ for(int i = 0; i < newViewProps.format.pixelFormats.size(); i++){ ++ [newPixelFormats addObject:RCTNSStringFromString(newViewProps.format.pixelFormats.at(i))]; ++ } ++ [_view.format setValue:newPixelFormats forKey:@"pixelFormats"]; ++ [changedProps addObject:@"format"]; ++ } ++ ++ if(oldViewProps.format.videoStabilizationModes.size() != newViewProps.format.videoStabilizationModes.size()){ ++ NSMutableArray* newVideoStabilizationModes = [[NSMutableArray alloc] init]; ++ for(int i = 0; i < newViewProps.format.videoStabilizationModes.size(); i++){ ++ [newVideoStabilizationModes addObject:RCTNSStringFromString(newViewProps.format.videoStabilizationModes.at(i))]; ++ } ++ [_view.format setValue:newVideoStabilizationModes forKey:@"videoStabilizationModes"]; ++ [changedProps addObject:@"format"]; ++ } ++ ++ if(oldViewProps.format.photoHeight != newViewProps.format.photoHeight){ ++ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.photoHeight] forKey:@"photoHeight"]; ++ [changedProps addObject:@"format"]; ++ } ++ if(oldViewProps.format.photoWidth != newViewProps.format.photoWidth){ ++ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.photoWidth] forKey:@"photoWidth"]; ++ [changedProps addObject:@"format"]; ++ } ++ if(oldViewProps.format.videoHeight != newViewProps.format.videoHeight){ ++ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.videoHeight] forKey:@"videoHeight"]; ++ [changedProps addObject:@"format"]; ++ } ++ if(oldViewProps.format.videoWidth != newViewProps.format.videoWidth){ ++ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.videoWidth] forKey:@"videoWidth"]; ++ [changedProps addObject:@"format"]; ++ } ++ if(oldViewProps.format.maxISO != newViewProps.format.maxISO){ ++ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.maxISO] forKey:@"maxISO"]; ++ [changedProps addObject:@"format"]; ++ } ++ if(oldViewProps.format.minISO != newViewProps.format.minISO){ ++ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.minISO] forKey:@"minISO"]; ++ [changedProps addObject:@"format"]; ++ } ++ if(oldViewProps.format.maxFps != newViewProps.format.maxFps){ ++ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.maxFps] forKey:@"maxFps"]; ++ [changedProps addObject:@"format"]; ++ } ++ if(oldViewProps.format.minFps != newViewProps.format.minFps){ ++ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.minFps] forKey:@"minFps"]; ++ [changedProps addObject:@"format"]; ++ } ++ if(oldViewProps.format.fieldOfView != newViewProps.format.fieldOfView){ ++ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.fieldOfView] forKey:@"fieldOfView"]; ++ [changedProps addObject:@"format"]; ++ } ++ ++ if(oldViewProps.format.supportsVideoHDR != newViewProps.format.supportsVideoHDR){ ++ NSNumber* supportsVideoHDR = newViewProps.format.supportsVideoHDR ? @1 : @0; ++ [_view.format setValue:supportsVideoHDR forKey:@"supportsVideoHDR"]; ++ [changedProps addObject:@"format"]; ++ } ++ if(oldViewProps.format.supportsPhotoHDR != newViewProps.format.supportsPhotoHDR){ ++ NSNumber* supportsPhotoHDR = newViewProps.format.supportsPhotoHDR ? @1 : @0; ++ [_view.format setValue:supportsPhotoHDR forKey:@"supportsPhotoHDR"]; ++ [changedProps addObject:@"format"]; ++ } ++ ++ if (_view.format.count == 0) { ++ _view.format = nil; ++ } ++ ++ if(_view.codeScannerOptions == nil){ ++ _view.codeScannerOptions =[[NSMutableDictionary alloc] init]; ++ } ++ ++ if(oldViewProps.codeScannerOptions.codeTypes.size() != newViewProps.codeScannerOptions.codeTypes.size()){ ++ NSMutableArray* newCodeTypes = [[NSMutableArray alloc] init]; ++ for(int i = 0; i < newViewProps.codeScannerOptions.codeTypes.size(); i++){ ++ [newCodeTypes addObject:RCTNSStringFromString(newViewProps.codeScannerOptions.codeTypes.at(i))]; ++ } ++ [_view.codeScannerOptions setValue:newCodeTypes forKey:@"codeTypes"]; ++ [changedProps addObject:@"codeScannerOptions"]; ++ } ++ ++ if(oldViewProps.codeScannerOptions.interval != newViewProps.codeScannerOptions.interval){ ++ [_view.codeScannerOptions setValue:[NSNumber numberWithDouble:newViewProps.codeScannerOptions.interval] forKey:@"interval"]; ++ [changedProps addObject:@"codeScannerOptions"]; ++ } ++ ++ if( ++ oldViewProps.codeScannerOptions.regionOfInterest.x != newViewProps.codeScannerOptions.regionOfInterest.x || ++ oldViewProps.codeScannerOptions.regionOfInterest.y != newViewProps.codeScannerOptions.regionOfInterest.y || ++ oldViewProps.codeScannerOptions.regionOfInterest.width != newViewProps.codeScannerOptions.regionOfInterest.width || ++ oldViewProps.codeScannerOptions.regionOfInterest.height != newViewProps.codeScannerOptions.regionOfInterest.height ++ ){ ++ NSDictionary *newRegionOfInterest = @{ ++ @"x": @(newViewProps.codeScannerOptions.regionOfInterest.x), ++ @"y": @(newViewProps.codeScannerOptions.regionOfInterest.y), ++ @"width": @(newViewProps.codeScannerOptions.regionOfInterest.width), ++ @"height": @(newViewProps.codeScannerOptions.regionOfInterest.height), ++ }; ++ [_view.codeScannerOptions setValue:newRegionOfInterest forKey:@"regionOfInterest"]; ++ [changedProps addObject:@"codeScannerOptions"]; ++ } ++ ++ if (_view.codeScannerOptions.count == 0) { ++ _view.codeScannerOptions = nil; ++ } ++ ++ [_view didSetProps:changedProps]; ++ ++ [super updateProps:props oldProps:oldProps]; ++} ++ ++- (void)onViewReady{ ++ if(_eventEmitter){ ++ std::dynamic_pointer_cast(_eventEmitter) ++ ->onViewReady( CameraViewEventEmitter::OnViewReady{}); ++ } ++} ++ ++- (void)onErrorWithError:(NSDictionary *)error{ ++ if(_eventEmitter){ ++ std::dynamic_pointer_cast(_eventEmitter) ++ ->onError( CameraViewEventEmitter::OnError{ ++ .code = std::string([(error != nil ? [error objectForKey:@"code"] : @"") UTF8String]), ++ .message = std::string([(error != nil ? [error objectForKey:@"message"] : @"") UTF8String]), ++ .cause = { ++ .code = std::string([(error != nil ? [[error objectForKey:@"cause"] objectForKey:@"code"] : @"") UTF8String]), // TODO: Further ecure type safety to prevent crashes ++ .domain = std::string([(error != nil ? [[error objectForKey:@"cause"] objectForKey:@"domain"] : @"") UTF8String]), ++ .message = std::string([(error != nil ? [[error objectForKey:@"cause"] objectForKey:@"message"] : @"") UTF8String]), ++ .details = std::string([(error != nil ? [[error objectForKey:@"cause"] objectForKey:@"details"] : @"") UTF8String]) ++ } ++ }); ++ } ++} ++ ++- (void)onInitialized{ ++ if(_eventEmitter){ ++ std::dynamic_pointer_cast(_eventEmitter) ++ ->onInitialized( CameraViewEventEmitter::OnInitialized{}); ++ } ++} ++ ++- (void)onCodeScannedWithMessage:(NSDictionary *)message { ++ if(_eventEmitter){ ++ std::dynamic_pointer_cast(_eventEmitter) ++ ->onCodeScanned( CameraViewEventEmitter::OnCodeScanned{ ++ .codes = { ++ .type = std::string([(message != nil ? [[message objectForKey:@"codes"] objectForKey:@"type"] : @"") UTF8String]), ++ .value = std::string([(message != nil ? [[message objectForKey:@"codes"] objectForKey:@"value"] : @"") UTF8String]), ++ .frame = { ++ .x = [(message != nil ? [[[message objectForKey:@"codes"] objectForKey:@"frame"] objectForKey:@"x"] : @0) doubleValue], ++ .y = [(message != nil ? [[[message objectForKey:@"codes"] objectForKey:@"frame"] objectForKey:@"y"] : @0) doubleValue], ++ .width = [(message != nil ? [[[message objectForKey:@"codes"] objectForKey:@"frame"] objectForKey:@"width"] : @0) doubleValue], ++ .height = [(message != nil ? [[[message objectForKey:@"codes"] objectForKey:@"frame"] objectForKey:@"height"] : @0) oubleValue], ++ }, ++ }, ++ .frame = { ++ .width = [(message != nil ? [[message objectForKey:@"frame"] objectForKey:@"width"] : @0) intValue], ++ .height = [(message != nil ? [[message objectForKey:@"frame"] objectForKey:@"height"] : @0) intValue], ++ }, ++ // nothing is sent here from CameraView ++ .corners = { ++ .x = [(message != nil ? [[message objectForKey:@"corners"] objectForKey:@"x"] : @0) doubleValue], ++ .y = [(message != nil ? [[message objectForKey:@"corners"] objectForKey:@"y"] : @0) doubleValue], ++ } ++ }); ++ } ++} ++ ++ ++- (void)onShutterWithMessage:(NSDictionary *)message { ++ if(_eventEmitter){ ++ std::dynamic_pointer_cast(_eventEmitter) ++ ->onShutter( CameraViewEventEmitter::OnShutter{ ++ .type = std::string([(message != nil ? [message objectForKey:@"type"] : @"") UTF8String]), ++ }); ++ } ++} ++ ++ ++- (void)onStarted { ++ if(_eventEmitter){ ++ std::dynamic_pointer_cast(_eventEmitter) ++ ->onStarted( CameraViewEventEmitter::OnStarted{}); ++ } ++} ++ ++ ++- (void)onStopped { ++ if(_eventEmitter){ ++ std::dynamic_pointer_cast(_eventEmitter) ++ ->onViewReady( CameraViewEventEmitter::OnViewReady{}); ++ } ++} ++ ++Class CameraViewCls(void) ++{ ++ return RNCameraView.class; ++} ++ ++@end ++#endif +diff --git a/node_modules/react-native-vision-camera/lib/commonjs/Camera.js b/node_modules/react-native-vision-camera/lib/commonjs/Camera.js +index 4c04727..12b9255 100644 +--- a/node_modules/react-native-vision-camera/lib/commonjs/Camera.js ++++ b/node_modules/react-native-vision-camera/lib/commonjs/Camera.js +@@ -1,27 +1,42 @@ +-"use strict"; ++'use strict'; + +-Object.defineProperty(exports, "__esModule", { +- value: true ++Object.defineProperty(exports, '__esModule', { ++ value: true, + }); + exports.Camera = void 0; +-var _react = _interopRequireDefault(require("react")); +-var _reactNative = require("react-native"); +-var _CameraError = require("./CameraError"); +-var _NativeCameraModule = require("./NativeCameraModule"); +-var _VisionCameraProxy = require("./frame-processors/VisionCameraProxy"); +-var _CameraDevices = require("./CameraDevices"); +-var _SkiaCameraCanvas = require("./skia/SkiaCameraCanvas"); +-var _FpsGraph = require("./FpsGraph"); +-var _NativeCameraView = require("./NativeCameraView"); +-var _RotationHelper = require("./RotationHelper"); +-function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } +-function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } ++var _react = _interopRequireDefault(require('react')); ++var _reactNative = require('react-native'); ++var _CameraError = require('./CameraError'); ++var _NativeCameraModule = require('./NativeCameraModule'); ++var _VisionCameraProxy = require('./frame-processors/VisionCameraProxy'); ++var _CameraDevices = require('./CameraDevices'); ++var _SkiaCameraCanvas = require('./skia/SkiaCameraCanvas'); ++var _FpsGraph = require('./FpsGraph'); ++var _NativeCameraView = require('./NativeCameraView'); ++var _RotationHelper = require('./RotationHelper'); ++function _interopRequireDefault(e) { ++ return e && e.__esModule ? e : {default: e}; ++} ++function _extends() { ++ return ( ++ (_extends = Object.assign ++ ? Object.assign.bind() ++ : function (n) { ++ for (var e = 1; e < arguments.length; e++) { ++ var t = arguments[e]; ++ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); ++ } ++ return n; ++ }), ++ _extends.apply(null, arguments) ++ ); ++} + //#region Types + + //#endregion + + function isSkiaFrameProcessor(frameProcessor) { +- return frameProcessor?.type === 'drawable-skia'; ++ return frameProcessor?.type === 'drawable-skia'; + } + + //#region Camera Component +@@ -58,609 +73,597 @@ function isSkiaFrameProcessor(frameProcessor) { + * @component + */ + class Camera extends _react.default.PureComponent { +- /** @internal */ +- static displayName = 'Camera'; +- /** @internal */ +- displayName = Camera.displayName; +- isNativeViewMounted = false; +- lastUIRotation = undefined; +- rotationHelper = new _RotationHelper.RotationHelper(); +- /** @internal */ +- constructor(props) { +- super(props); +- this.onViewReady = this.onViewReady.bind(this); +- this.onAverageFpsChanged = this.onAverageFpsChanged.bind(this); +- this.onInitialized = this.onInitialized.bind(this); +- this.onStarted = this.onStarted.bind(this); +- this.onStopped = this.onStopped.bind(this); +- this.onPreviewStarted = this.onPreviewStarted.bind(this); +- this.onPreviewStopped = this.onPreviewStopped.bind(this); +- this.onShutter = this.onShutter.bind(this); +- this.onOutputOrientationChanged = this.onOutputOrientationChanged.bind(this); +- this.onPreviewOrientationChanged = this.onPreviewOrientationChanged.bind(this); +- this.onError = this.onError.bind(this); +- this.onCodeScanned = this.onCodeScanned.bind(this); +- this.ref = /*#__PURE__*/_react.default.createRef(); +- this.lastFrameProcessor = undefined; +- this.state = { +- isRecordingWithFlash: false, +- averageFpsSamples: [] +- }; +- } +- get handle() { +- const nodeHandle = (0, _reactNative.findNodeHandle)(this.ref.current); +- if (nodeHandle == null || nodeHandle === -1) { +- throw new _CameraError.CameraRuntimeError('system/view-not-found', "Could not get the Camera's native view tag! Does the Camera View exist in the native view-tree?"); +- } +- return nodeHandle; +- } ++ /** @internal */ ++ static displayName = 'Camera'; ++ /** @internal */ ++ displayName = Camera.displayName; ++ isNativeViewMounted = false; ++ lastUIRotation = undefined; ++ rotationHelper = new _RotationHelper.RotationHelper(); ++ /** @internal */ ++ constructor(props) { ++ super(props); ++ this.onViewReady = this.onViewReady.bind(this); ++ this.onAverageFpsChanged = this.onAverageFpsChanged.bind(this); ++ this.onInitialized = this.onInitialized.bind(this); ++ this.onStarted = this.onStarted.bind(this); ++ this.onStopped = this.onStopped.bind(this); ++ this.onPreviewStarted = this.onPreviewStarted.bind(this); ++ this.onPreviewStopped = this.onPreviewStopped.bind(this); ++ this.onShutter = this.onShutter.bind(this); ++ this.onOutputOrientationChanged = this.onOutputOrientationChanged.bind(this); ++ this.onPreviewOrientationChanged = this.onPreviewOrientationChanged.bind(this); ++ this.onError = this.onError.bind(this); ++ this.onCodeScanned = this.onCodeScanned.bind(this); ++ this.ref = /*#__PURE__*/ _react.default.createRef(); ++ this.lastFrameProcessor = undefined; ++ this.state = { ++ isRecordingWithFlash: false, ++ averageFpsSamples: [], ++ }; ++ } ++ get handle() { ++ const nodeHandle = (0, _reactNative.findNodeHandle)(this.ref.current); ++ if (nodeHandle == null || nodeHandle === -1) { ++ throw new _CameraError.CameraRuntimeError('system/view-not-found', "Could not get the Camera's native view tag! Does the Camera View exist in the native view-tree?"); ++ } ++ return nodeHandle; ++ } + +- //#region View-specific functions (UIViewManager) +- /** +- * Take a single photo and write it's content to a temporary file. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while capturing the photo. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * @example +- * ```ts +- * const photo = await camera.current.takePhoto({ +- * flash: 'on', +- * enableAutoRedEyeReduction: true +- * }) +- * ``` +- */ +- async takePhoto(options) { +- try { +- return await _NativeCameraModule.CameraModule.takePhoto(this.handle, options ?? {}); +- } catch (e) { +- throw (0, _CameraError.tryParseNativeCameraError)(e); +- } +- } ++ //#region View-specific functions (UIViewManager) ++ /** ++ * Take a single photo and write it's content to a temporary file. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while capturing the photo. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * @example ++ * ```ts ++ * const photo = await camera.current.takePhoto({ ++ * flash: 'on', ++ * enableAutoRedEyeReduction: true ++ * }) ++ * ``` ++ */ ++ async takePhoto(options) { ++ try { ++ return await _NativeCameraModule.CameraModule.takePhoto(this.handle, options ?? {}); ++ } catch (e) { ++ throw (0, _CameraError.tryParseNativeCameraError)(e); ++ } ++ } + +- /** +- * Captures a snapshot of the Camera view and write it's content to a temporary file. +- * +- * - On iOS, `takeSnapshot` waits for a Frame from the video pipeline and therefore requires `video` to be enabled. +- * - On Android, `takeSnapshot` performs a GPU view screenshot from the preview view. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while capturing the photo. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * @example +- * ```ts +- * const snapshot = await camera.current.takeSnapshot({ +- * quality: 100 +- * }) +- * ``` +- */ +- async takeSnapshot(options) { +- try { +- return await _NativeCameraModule.CameraModule.takeSnapshot(this.handle, options ?? {}); +- } catch (e) { +- throw (0, _CameraError.tryParseNativeCameraError)(e); +- } +- } +- getBitRateMultiplier(bitRate) { +- if (typeof bitRate === 'number' || bitRate == null) return 1; +- switch (bitRate) { +- case 'extra-low': +- return 0.6; +- case 'low': +- return 0.8; +- case 'normal': +- return 1; +- case 'high': +- return 1.2; +- case 'extra-high': +- return 1.4; +- } +- } ++ /** ++ * Captures a snapshot of the Camera view and write it's content to a temporary file. ++ * ++ * - On iOS, `takeSnapshot` waits for a Frame from the video pipeline and therefore requires `video` to be enabled. ++ * - On Android, `takeSnapshot` performs a GPU view screenshot from the preview view. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while capturing the photo. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * @example ++ * ```ts ++ * const snapshot = await camera.current.takeSnapshot({ ++ * quality: 100 ++ * }) ++ * ``` ++ */ ++ async takeSnapshot(options) { ++ try { ++ return await _NativeCameraModule.CameraModule.takeSnapshot(this.handle, options ?? {}); ++ } catch (e) { ++ throw (0, _CameraError.tryParseNativeCameraError)(e); ++ } ++ } ++ getBitRateMultiplier(bitRate) { ++ if (typeof bitRate === 'number' || bitRate == null) return 1; ++ switch (bitRate) { ++ case 'extra-low': ++ return 0.6; ++ case 'low': ++ return 0.8; ++ case 'normal': ++ return 1; ++ case 'high': ++ return 1.2; ++ case 'extra-high': ++ return 1.4; ++ } ++ } + +- /** +- * Start a new video recording. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while starting the video recording. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * +- * @example +- * ```ts +- * camera.current.startRecording({ +- * onRecordingFinished: (video) => console.log(video), +- * onRecordingError: (error) => console.error(error), +- * }) +- * setTimeout(() => { +- * camera.current.stopRecording() +- * }, 5000) +- * ``` +- */ +- startRecording(options) { +- const { +- onRecordingError, +- onRecordingFinished, +- ...passThruOptions +- } = options; +- if (typeof onRecordingError !== 'function' || typeof onRecordingFinished !== 'function') throw new _CameraError.CameraRuntimeError('parameter/invalid-parameter', 'The onRecordingError or onRecordingFinished functions were not set!'); +- if (options.flash === 'on') { +- // Enable torch for video recording +- this.setState({ +- isRecordingWithFlash: true +- }); +- } +- const onRecordCallback = (video, error) => { +- if (this.state.isRecordingWithFlash) { +- // disable torch again if it was enabled +- this.setState({ +- isRecordingWithFlash: false +- }); +- } +- if (error != null) return onRecordingError(error); +- if (video != null) return onRecordingFinished(video); +- }; +- const nativeRecordVideoOptions = passThruOptions; +- try { +- // TODO: Use TurboModules to make this awaitable. +- _NativeCameraModule.CameraModule.startRecording(this.handle, nativeRecordVideoOptions, onRecordCallback); +- } catch (e) { +- throw (0, _CameraError.tryParseNativeCameraError)(e); +- } +- } ++ /** ++ * Start a new video recording. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while starting the video recording. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * ++ * @example ++ * ```ts ++ * camera.current.startRecording({ ++ * onRecordingFinished: (video) => console.log(video), ++ * onRecordingError: (error) => console.error(error), ++ * }) ++ * setTimeout(() => { ++ * camera.current.stopRecording() ++ * }, 5000) ++ * ``` ++ */ ++ startRecording(options) { ++ const {onRecordingError, onRecordingFinished, ...passThruOptions} = options; ++ if (typeof onRecordingError !== 'function' || typeof onRecordingFinished !== 'function') ++ throw new _CameraError.CameraRuntimeError('parameter/invalid-parameter', 'The onRecordingError or onRecordingFinished functions were not set!'); ++ if (options.flash === 'on') { ++ // Enable torch for video recording ++ this.setState({ ++ isRecordingWithFlash: true, ++ }); ++ } ++ const onRecordCallback = (video, error) => { ++ if (this.state.isRecordingWithFlash) { ++ // disable torch again if it was enabled ++ this.setState({ ++ isRecordingWithFlash: false, ++ }); ++ } ++ if (error != null) return onRecordingError(error); ++ if (video != null) return onRecordingFinished(video); ++ }; ++ const nativeRecordVideoOptions = passThruOptions; ++ try { ++ // TODO: Use TurboModules to make this awaitable. ++ _NativeCameraModule.CameraModule.startRecording(this.handle, nativeRecordVideoOptions, onRecordCallback); ++ } catch (e) { ++ throw (0, _CameraError.tryParseNativeCameraError)(e); ++ } ++ } + +- /** +- * Pauses the current video recording. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while pausing the video recording. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * +- * @example +- * ```ts +- * // Start +- * await camera.current.startRecording({ +- * onRecordingFinished: (video) => console.log(video), +- * onRecordingError: (error) => console.error(error), +- * }) +- * await timeout(1000) +- * // Pause +- * await camera.current.pauseRecording() +- * await timeout(500) +- * // Resume +- * await camera.current.resumeRecording() +- * await timeout(2000) +- * // Stop +- * await camera.current.stopRecording() +- * ``` +- */ +- async pauseRecording() { +- try { +- return await _NativeCameraModule.CameraModule.pauseRecording(this.handle); +- } catch (e) { +- throw (0, _CameraError.tryParseNativeCameraError)(e); +- } +- } ++ /** ++ * Pauses the current video recording. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while pausing the video recording. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * ++ * @example ++ * ```ts ++ * // Start ++ * await camera.current.startRecording({ ++ * onRecordingFinished: (video) => console.log(video), ++ * onRecordingError: (error) => console.error(error), ++ * }) ++ * await timeout(1000) ++ * // Pause ++ * await camera.current.pauseRecording() ++ * await timeout(500) ++ * // Resume ++ * await camera.current.resumeRecording() ++ * await timeout(2000) ++ * // Stop ++ * await camera.current.stopRecording() ++ * ``` ++ */ ++ async pauseRecording() { ++ try { ++ return await _NativeCameraModule.CameraModule.pauseRecording(this.handle); ++ } catch (e) { ++ throw (0, _CameraError.tryParseNativeCameraError)(e); ++ } ++ } + +- /** +- * Resumes a currently paused video recording. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while resuming the video recording. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * +- * @example +- * ```ts +- * // Start +- * await camera.current.startRecording({ +- * onRecordingFinished: (video) => console.log(video), +- * onRecordingError: (error) => console.error(error), +- * }) +- * await timeout(1000) +- * // Pause +- * await camera.current.pauseRecording() +- * await timeout(500) +- * // Resume +- * await camera.current.resumeRecording() +- * await timeout(2000) +- * // Stop +- * await camera.current.stopRecording() +- * ``` +- */ +- async resumeRecording() { +- try { +- return await _NativeCameraModule.CameraModule.resumeRecording(this.handle); +- } catch (e) { +- throw (0, _CameraError.tryParseNativeCameraError)(e); +- } +- } ++ /** ++ * Resumes a currently paused video recording. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while resuming the video recording. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * ++ * @example ++ * ```ts ++ * // Start ++ * await camera.current.startRecording({ ++ * onRecordingFinished: (video) => console.log(video), ++ * onRecordingError: (error) => console.error(error), ++ * }) ++ * await timeout(1000) ++ * // Pause ++ * await camera.current.pauseRecording() ++ * await timeout(500) ++ * // Resume ++ * await camera.current.resumeRecording() ++ * await timeout(2000) ++ * // Stop ++ * await camera.current.stopRecording() ++ * ``` ++ */ ++ async resumeRecording() { ++ try { ++ return await _NativeCameraModule.CameraModule.resumeRecording(this.handle); ++ } catch (e) { ++ throw (0, _CameraError.tryParseNativeCameraError)(e); ++ } ++ } + +- /** +- * Stop the current video recording. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while stopping the video recording. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * +- * @example +- * ```ts +- * await camera.current.startRecording({ +- * onRecordingFinished: (video) => console.log(video), +- * onRecordingError: (error) => console.error(error), +- * }) +- * setTimeout(async () => { +- * await camera.current.stopRecording() +- * }, 5000) +- * ``` +- */ +- async stopRecording() { +- try { +- return await _NativeCameraModule.CameraModule.stopRecording(this.handle); +- } catch (e) { +- throw (0, _CameraError.tryParseNativeCameraError)(e); +- } +- } ++ /** ++ * Stop the current video recording. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while stopping the video recording. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * ++ * @example ++ * ```ts ++ * await camera.current.startRecording({ ++ * onRecordingFinished: (video) => console.log(video), ++ * onRecordingError: (error) => console.error(error), ++ * }) ++ * setTimeout(async () => { ++ * await camera.current.stopRecording() ++ * }, 5000) ++ * ``` ++ */ ++ async stopRecording() { ++ try { ++ return await _NativeCameraModule.CameraModule.stopRecording(this.handle); ++ } catch (e) { ++ throw (0, _CameraError.tryParseNativeCameraError)(e); ++ } ++ } + +- /** +- * Cancel the current video recording. The temporary video file will be deleted, +- * and the `startRecording`'s `onRecordingError` callback will be invoked with a `capture/recording-canceled` error. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while canceling the video recording. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * +- * @example +- * ```ts +- * await camera.current.startRecording({ +- * onRecordingFinished: (video) => console.log(video), +- * onRecordingError: (error) => { +- * if (error.code === 'capture/recording-canceled') { +- * // recording was canceled. +- * } else { +- * console.error(error) +- * } +- * }, +- * }) +- * setTimeout(async () => { +- * await camera.current.cancelRecording() +- * }, 5000) +- * ``` +- */ +- async cancelRecording() { +- try { +- return await _NativeCameraModule.CameraModule.cancelRecording(this.handle); +- } catch (e) { +- throw (0, _CameraError.tryParseNativeCameraError)(e); +- } +- } ++ /** ++ * Cancel the current video recording. The temporary video file will be deleted, ++ * and the `startRecording`'s `onRecordingError` callback will be invoked with a `capture/recording-canceled` error. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while canceling the video recording. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * ++ * @example ++ * ```ts ++ * await camera.current.startRecording({ ++ * onRecordingFinished: (video) => console.log(video), ++ * onRecordingError: (error) => { ++ * if (error.code === 'capture/recording-canceled') { ++ * // recording was canceled. ++ * } else { ++ * console.error(error) ++ * } ++ * }, ++ * }) ++ * setTimeout(async () => { ++ * await camera.current.cancelRecording() ++ * }, 5000) ++ * ``` ++ */ ++ async cancelRecording() { ++ try { ++ return await _NativeCameraModule.CameraModule.cancelRecording(this.handle); ++ } catch (e) { ++ throw (0, _CameraError.tryParseNativeCameraError)(e); ++ } ++ } + +- /** +- * Focus the camera to a specific point in the coordinate system. +- * @param {Point} point The point to focus to. This should be relative +- * to the Camera view's coordinate system and is expressed in points. +- * * `(0, 0)` means **top left**. +- * * `(CameraView.width, CameraView.height)` means **bottom right**. +- * +- * Make sure the value doesn't exceed the CameraView's dimensions. +- * +- * @throws {@linkcode CameraRuntimeError} When any kind of error occured while focussing. +- * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error +- * @example +- * ```ts +- * await camera.current.focus({ +- * x: tapEvent.x, +- * y: tapEvent.y +- * }) +- * ``` +- */ +- async focus(point) { +- try { +- return await _NativeCameraModule.CameraModule.focus(this.handle, point); +- } catch (e) { +- throw (0, _CameraError.tryParseNativeCameraError)(e); +- } +- } +- //#endregion ++ /** ++ * Focus the camera to a specific point in the coordinate system. ++ * @param {Point} point The point to focus to. This should be relative ++ * to the Camera view's coordinate system and is expressed in points. ++ * * `(0, 0)` means **top left**. ++ * * `(CameraView.width, CameraView.height)` means **bottom right**. ++ * ++ * Make sure the value doesn't exceed the CameraView's dimensions. ++ * ++ * @throws {@linkcode CameraRuntimeError} When any kind of error occured while focussing. ++ * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error ++ * @example ++ * ```ts ++ * await camera.current.focus({ ++ * x: tapEvent.x, ++ * y: tapEvent.y ++ * }) ++ * ``` ++ */ ++ async focus(point) { ++ try { ++ return await _NativeCameraModule.CameraModule.focus(this.handle, point); ++ } catch (e) { ++ throw (0, _CameraError.tryParseNativeCameraError)(e); ++ } ++ } ++ //#endregion + +- //#region Static Functions (NativeModule) +- /** +- * Get a list of all available camera devices on the current phone. +- * +- * If you use Hooks, use the `useCameraDevices(..)` hook instead. +- * +- * * For Camera Devices attached to the phone, it is safe to assume that this will never change. +- * * For external Camera Devices (USB cameras, Mac continuity cameras, etc.) the available Camera Devices +- * could change over time when the external Camera device gets plugged in or plugged out, so +- * use {@link addCameraDevicesChangedListener | addCameraDevicesChangedListener(...)} to listen for such changes. +- * +- * @example +- * ```ts +- * const devices = Camera.getAvailableCameraDevices() +- * const backCameras = devices.filter((d) => d.position === "back") +- * const frontCameras = devices.filter((d) => d.position === "front") +- * ``` +- */ +- static getAvailableCameraDevices() { +- return _CameraDevices.CameraDevices.getAvailableCameraDevices(); +- } +- /** +- * Adds a listener that gets called everytime the Camera Devices change, for example +- * when an external Camera Device (USB or continuity Camera) gets plugged in or plugged out. +- * +- * If you use Hooks, use the `useCameraDevices()` hook instead. +- */ +- static addCameraDevicesChangedListener(listener) { +- return _CameraDevices.CameraDevices.addCameraDevicesChangedListener(listener); +- } +- /** +- * Gets the current Camera Permission Status. Check this before mounting the Camera to ensure +- * the user has permitted the app to use the camera. +- * +- * To actually prompt the user for camera permission, use {@linkcode Camera.requestCameraPermission | requestCameraPermission()}. +- */ +- static getCameraPermissionStatus() { +- return _NativeCameraModule.CameraModule.getCameraPermissionStatus(); +- } +- /** +- * Gets the current Microphone-Recording Permission Status. +- * Check this before enabling the `audio={...}` property to make sure the +- * user has permitted the app to use the microphone. +- * +- * To actually prompt the user for microphone permission, use {@linkcode Camera.requestMicrophonePermission | requestMicrophonePermission()}. +- */ +- static getMicrophonePermissionStatus() { +- return _NativeCameraModule.CameraModule.getMicrophonePermissionStatus(); +- } +- /** +- * Gets the current Location Permission Status. +- * Check this before enabling the `location={...}` property to make sure the +- * the user has permitted the app to use the location. +- * +- * To actually prompt the user for location permission, use {@linkcode Camera.requestLocationPermission | requestLocationPermission()}. +- * +- * Note: This method will throw a `system/location-not-enabled` error if the Location APIs are not enabled at build-time. +- * See [the "GPS Location Tags" documentation](https://react-native-vision-camera.com/docs/guides/location) for more information. +- */ +- static getLocationPermissionStatus() { +- return _NativeCameraModule.CameraModule.getLocationPermissionStatus(); +- } +- /** +- * Shows a "request permission" alert to the user, and resolves with the new camera permission status. +- * +- * If the user has previously blocked the app from using the camera, the alert will not be shown +- * and `"denied"` will be returned. +- * +- * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. +- * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error +- */ +- static async requestCameraPermission() { +- try { +- return await _NativeCameraModule.CameraModule.requestCameraPermission(); +- } catch (e) { +- throw (0, _CameraError.tryParseNativeCameraError)(e); +- } +- } +- /** +- * Shows a "request permission" alert to the user, and resolves with the new microphone permission status. +- * +- * If the user has previously blocked the app from using the microphone, the alert will not be shown +- * and `"denied"` will be returned. +- * +- * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. +- * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error +- */ +- static async requestMicrophonePermission() { +- try { +- return await _NativeCameraModule.CameraModule.requestMicrophonePermission(); +- } catch (e) { +- throw (0, _CameraError.tryParseNativeCameraError)(e); +- } +- } +- /** +- * Shows a "request permission" alert to the user, and resolves with the new location permission status. +- * +- * If the user has previously blocked the app from using the location, the alert will not be shown +- * and `"denied"` will be returned. +- * +- * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. +- * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error +- */ +- static async requestLocationPermission() { +- try { +- return await _NativeCameraModule.CameraModule.requestLocationPermission(); +- } catch (e) { +- throw (0, _CameraError.tryParseNativeCameraError)(e); +- } +- } +- //#endregion ++ //#region Static Functions (NativeModule) ++ /** ++ * Get a list of all available camera devices on the current phone. ++ * ++ * If you use Hooks, use the `useCameraDevices(..)` hook instead. ++ * ++ * * For Camera Devices attached to the phone, it is safe to assume that this will never change. ++ * * For external Camera Devices (USB cameras, Mac continuity cameras, etc.) the available Camera Devices ++ * could change over time when the external Camera device gets plugged in or plugged out, so ++ * use {@link addCameraDevicesChangedListener | addCameraDevicesChangedListener(...)} to listen for such changes. ++ * ++ * @example ++ * ```ts ++ * const devices = Camera.getAvailableCameraDevices() ++ * const backCameras = devices.filter((d) => d.position === "back") ++ * const frontCameras = devices.filter((d) => d.position === "front") ++ * ``` ++ */ ++ static getAvailableCameraDevices() { ++ return _CameraDevices.CameraDevices.getAvailableCameraDevices(); ++ } ++ /** ++ * Adds a listener that gets called everytime the Camera Devices change, for example ++ * when an external Camera Device (USB or continuity Camera) gets plugged in or plugged out. ++ * ++ * If you use Hooks, use the `useCameraDevices()` hook instead. ++ */ ++ static addCameraDevicesChangedListener(listener) { ++ return _CameraDevices.CameraDevices.addCameraDevicesChangedListener(listener); ++ } ++ /** ++ * Gets the current Camera Permission Status. Check this before mounting the Camera to ensure ++ * the user has permitted the app to use the camera. ++ * ++ * To actually prompt the user for camera permission, use {@linkcode Camera.requestCameraPermission | requestCameraPermission()}. ++ */ ++ static getCameraPermissionStatus() { ++ return _NativeCameraModule.CameraModule.getCameraPermissionStatus(); ++ } ++ /** ++ * Gets the current Microphone-Recording Permission Status. ++ * Check this before enabling the `audio={...}` property to make sure the ++ * user has permitted the app to use the microphone. ++ * ++ * To actually prompt the user for microphone permission, use {@linkcode Camera.requestMicrophonePermission | requestMicrophonePermission()}. ++ */ ++ static getMicrophonePermissionStatus() { ++ return _NativeCameraModule.CameraModule.getMicrophonePermissionStatus(); ++ } ++ /** ++ * Gets the current Location Permission Status. ++ * Check this before enabling the `location={...}` property to make sure the ++ * the user has permitted the app to use the location. ++ * ++ * To actually prompt the user for location permission, use {@linkcode Camera.requestLocationPermission | requestLocationPermission()}. ++ * ++ * Note: This method will throw a `system/location-not-enabled` error if the Location APIs are not enabled at build-time. ++ * See [the "GPS Location Tags" documentation](https://react-native-vision-camera.com/docs/guides/location) for more information. ++ */ ++ static getLocationPermissionStatus() { ++ return _NativeCameraModule.CameraModule.getLocationPermissionStatus(); ++ } ++ /** ++ * Shows a "request permission" alert to the user, and resolves with the new camera permission status. ++ * ++ * If the user has previously blocked the app from using the camera, the alert will not be shown ++ * and `"denied"` will be returned. ++ * ++ * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. ++ * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error ++ */ ++ static async requestCameraPermission() { ++ try { ++ return await _NativeCameraModule.CameraModule.requestCameraPermission(); ++ } catch (e) { ++ throw (0, _CameraError.tryParseNativeCameraError)(e); ++ } ++ } ++ /** ++ * Shows a "request permission" alert to the user, and resolves with the new microphone permission status. ++ * ++ * If the user has previously blocked the app from using the microphone, the alert will not be shown ++ * and `"denied"` will be returned. ++ * ++ * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. ++ * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error ++ */ ++ static async requestMicrophonePermission() { ++ try { ++ return await _NativeCameraModule.CameraModule.requestMicrophonePermission(); ++ } catch (e) { ++ throw (0, _CameraError.tryParseNativeCameraError)(e); ++ } ++ } ++ /** ++ * Shows a "request permission" alert to the user, and resolves with the new location permission status. ++ * ++ * If the user has previously blocked the app from using the location, the alert will not be shown ++ * and `"denied"` will be returned. ++ * ++ * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. ++ * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error ++ */ ++ static async requestLocationPermission() { ++ try { ++ return await _NativeCameraModule.CameraModule.requestLocationPermission(); ++ } catch (e) { ++ throw (0, _CameraError.tryParseNativeCameraError)(e); ++ } ++ } ++ //#endregion + +- //#region Events (Wrapped to maintain reference equality) +- onError(event) { +- const error = event.nativeEvent; +- const cause = (0, _CameraError.isErrorWithCause)(error.cause) ? error.cause : undefined; +- // @ts-expect-error We're casting from unknown bridge types to TS unions, I expect it to hopefully work +- const cameraError = new _CameraError.CameraRuntimeError(error.code, error.message, cause); +- if (this.props.onError != null) { +- this.props.onError(cameraError); +- } else { +- // User didn't pass an `onError` handler, so just log it to console +- console.error(cameraError); +- } +- } +- onInitialized() { +- this.props.onInitialized?.(); +- } +- onStarted() { +- this.props.onStarted?.(); +- } +- onStopped() { +- this.props.onStopped?.(); +- } +- onPreviewStarted() { +- this.props.onPreviewStarted?.(); +- } +- onPreviewStopped() { +- this.props.onPreviewStopped?.(); +- } +- onShutter(event) { +- this.props.onShutter?.(event.nativeEvent); +- } +- onOutputOrientationChanged({ +- nativeEvent: { +- outputOrientation +- } +- }) { +- this.rotationHelper.outputOrientation = outputOrientation; +- this.props.onOutputOrientationChanged?.(outputOrientation); +- this.maybeUpdateUIRotation(); +- } +- onPreviewOrientationChanged({ +- nativeEvent: { +- previewOrientation +- } +- }) { +- this.rotationHelper.previewOrientation = previewOrientation; +- this.props.onPreviewOrientationChanged?.(previewOrientation); +- this.maybeUpdateUIRotation(); +- if (isSkiaFrameProcessor(this.props.frameProcessor)) { +- // If we have a Skia Frame Processor, we need to update it's orientation so it knows how to render. +- this.props.frameProcessor.previewOrientation.value = previewOrientation; +- } +- } +- maybeUpdateUIRotation() { +- const uiRotation = this.rotationHelper.uiRotation; +- if (uiRotation !== this.lastUIRotation) { +- this.props.onUIRotationChanged?.(uiRotation); +- this.lastUIRotation = uiRotation; +- } +- } +- //#endregion ++ //#region Events (Wrapped to maintain reference equality) ++ onError(event) { ++ const error = event.nativeEvent; ++ const cause = (0, _CameraError.isErrorWithCause)(error.cause) ? error.cause : undefined; ++ // @ts-expect-error We're casting from unknown bridge types to TS unions, I expect it to hopefully work ++ const cameraError = new _CameraError.CameraRuntimeError(error.code, error.message, cause); ++ if (this.props.onError != null) { ++ this.props.onError(cameraError); ++ } else { ++ // User didn't pass an `onError` handler, so just log it to console ++ console.error(cameraError); ++ } ++ } ++ onInitialized() { ++ this.props.onInitialized?.(); ++ } ++ onStarted() { ++ this.props.onStarted?.(); ++ } ++ onStopped() { ++ this.props.onStopped?.(); ++ } ++ onPreviewStarted() { ++ this.props.onPreviewStarted?.(); ++ } ++ onPreviewStopped() { ++ this.props.onPreviewStopped?.(); ++ } ++ onShutter(event) { ++ this.props.onShutter?.(event.nativeEvent); ++ } ++ onOutputOrientationChanged({nativeEvent: {outputOrientation}}) { ++ this.rotationHelper.outputOrientation = outputOrientation; ++ this.props.onOutputOrientationChanged?.(outputOrientation); ++ this.maybeUpdateUIRotation(); ++ } ++ onPreviewOrientationChanged({nativeEvent: {previewOrientation}}) { ++ this.rotationHelper.previewOrientation = previewOrientation; ++ this.props.onPreviewOrientationChanged?.(previewOrientation); ++ this.maybeUpdateUIRotation(); ++ if (isSkiaFrameProcessor(this.props.frameProcessor)) { ++ // If we have a Skia Frame Processor, we need to update it's orientation so it knows how to render. ++ this.props.frameProcessor.previewOrientation.value = previewOrientation; ++ } ++ } ++ maybeUpdateUIRotation() { ++ const uiRotation = this.rotationHelper.uiRotation; ++ if (uiRotation !== this.lastUIRotation) { ++ this.props.onUIRotationChanged?.(uiRotation); ++ this.lastUIRotation = uiRotation; ++ } ++ } ++ //#endregion + +- onCodeScanned(event) { +- const codeScanner = this.props.codeScanner; +- if (codeScanner == null) return; +- codeScanner.onCodeScanned(event.nativeEvent.codes, event.nativeEvent.frame); +- } ++ onCodeScanned(event) { ++ const codeScanner = this.props.codeScanner; ++ if (codeScanner == null) return; ++ codeScanner.onCodeScanned(event.nativeEvent.codes, event.nativeEvent.frame); ++ } + +- //#region Lifecycle +- setFrameProcessor(frameProcessor) { +- _VisionCameraProxy.VisionCameraProxy.setFrameProcessor(this.handle, frameProcessor); +- } +- unsetFrameProcessor() { +- _VisionCameraProxy.VisionCameraProxy.removeFrameProcessor(this.handle); +- } +- onViewReady() { +- this.isNativeViewMounted = true; +- if (this.props.frameProcessor != null) { +- // user passed a `frameProcessor` but we didn't set it yet because the native view was not mounted yet. set it now. +- this.setFrameProcessor(this.props.frameProcessor.frameProcessor); +- this.lastFrameProcessor = this.props.frameProcessor.frameProcessor; +- } +- } +- onAverageFpsChanged({ +- nativeEvent: { +- averageFps +- } +- }) { +- this.setState(state => { +- const averageFpsSamples = [...state.averageFpsSamples, averageFps]; +- while (averageFpsSamples.length >= _FpsGraph.MAX_BARS + 1) { +- // we keep a maximum of 30 FPS samples in our history +- averageFpsSamples.shift(); +- } +- return { +- ...state, +- averageFpsSamples: averageFpsSamples +- }; +- }); +- } ++ //#region Lifecycle ++ setFrameProcessor(frameProcessor) { ++ _VisionCameraProxy.VisionCameraProxy.setFrameProcessor(this.handle, frameProcessor); ++ } ++ unsetFrameProcessor() { ++ _VisionCameraProxy.VisionCameraProxy.removeFrameProcessor(this.handle); ++ } ++ onViewReady() { ++ this.isNativeViewMounted = true; ++ if (this.props.frameProcessor != null) { ++ // user passed a `frameProcessor` but we didn't set it yet because the native view was not mounted yet. set it now. ++ this.setFrameProcessor(this.props.frameProcessor.frameProcessor); ++ this.lastFrameProcessor = this.props.frameProcessor.frameProcessor; ++ } ++ } ++ onAverageFpsChanged({nativeEvent: {averageFps}}) { ++ this.setState((state) => { ++ const averageFpsSamples = [...state.averageFpsSamples, averageFps]; ++ while (averageFpsSamples.length >= _FpsGraph.MAX_BARS + 1) { ++ // we keep a maximum of 30 FPS samples in our history ++ averageFpsSamples.shift(); ++ } ++ return { ++ ...state, ++ averageFpsSamples: averageFpsSamples, ++ }; ++ }); ++ } + +- /** @internal */ +- componentDidUpdate() { +- if (!this.isNativeViewMounted) return; +- const frameProcessor = this.props.frameProcessor; +- if (frameProcessor?.frameProcessor !== this.lastFrameProcessor) { +- // frameProcessor argument identity changed. Update native to reflect the change. +- if (frameProcessor != null) this.setFrameProcessor(frameProcessor.frameProcessor);else this.unsetFrameProcessor(); +- this.lastFrameProcessor = frameProcessor?.frameProcessor; +- } +- } +- //#endregion ++ /** @internal */ ++ componentDidUpdate() { ++ if (!this.isNativeViewMounted) return; ++ const frameProcessor = this.props.frameProcessor; ++ if (frameProcessor?.frameProcessor !== this.lastFrameProcessor) { ++ // frameProcessor argument identity changed. Update native to reflect the change. ++ if (frameProcessor != null) this.setFrameProcessor(frameProcessor.frameProcessor); ++ else this.unsetFrameProcessor(); ++ this.lastFrameProcessor = frameProcessor?.frameProcessor; ++ } ++ } ++ //#endregion + +- /** @internal */ +- render() { +- // We remove the big `device` object from the props because we only need to pass `cameraId` to native. +- const { +- device, +- frameProcessor, +- codeScanner, +- enableFpsGraph, +- fps, +- videoBitRate, +- ...props +- } = this.props; ++ /** @internal */ ++ render() { ++ // We remove the big `device` object from the props because we only need to pass `cameraId` to native. ++ const {device, frameProcessor, codeScanner, enableFpsGraph, fps, videoBitRate, ...props} = this.props; + +- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition +- if (device == null) { +- throw new _CameraError.CameraRuntimeError('device/no-device', 'Camera: `device` is null! Select a valid Camera device. See: https://mrousavy.com/react-native-vision-camera/docs/guides/devices'); +- } +- const shouldEnableBufferCompression = props.video === true && frameProcessor == null; +- const torch = this.state.isRecordingWithFlash ? 'on' : props.torch; +- const isRenderingWithSkia = isSkiaFrameProcessor(frameProcessor); +- const shouldBeMirrored = device.position === 'front'; ++ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition ++ if (device == null) { ++ throw new _CameraError.CameraRuntimeError( ++ 'device/no-device', ++ 'Camera: `device` is null! Select a valid Camera device. See: https://mrousavy.com/react-native-vision-camera/docs/guides/devices', ++ ); ++ } ++ const shouldEnableBufferCompression = props.video === true && frameProcessor == null; ++ const torch = this.state.isRecordingWithFlash ? 'on' : props.torch; ++ const isRenderingWithSkia = isSkiaFrameProcessor(frameProcessor); ++ const shouldBeMirrored = device.position === 'front'; + +- // minFps/maxFps is either the fixed `fps` value, or a value from the [min, max] tuple +- const minFps = fps == null ? undefined : typeof fps === 'number' ? fps : fps[0]; +- const maxFps = fps == null ? undefined : typeof fps === 'number' ? fps : fps[1]; ++ // minFps/maxFps is either the fixed `fps` value, or a value from the [min, max] tuple ++ const minFps = fps == null ? undefined : typeof fps === 'number' ? fps : fps[0]; ++ const maxFps = fps == null ? undefined : typeof fps === 'number' ? fps : fps[1]; + +- // bitrate is number (override) or string (multiplier) +- let bitRateMultiplier; +- let bitRateOverride; +- if (typeof videoBitRate === 'number') { +- // If the user passed an absolute number as a bit-rate, we just use this as a full override. +- bitRateOverride = videoBitRate; +- } else if (typeof videoBitRate === 'string' && videoBitRate !== 'normal') { +- // If the user passed 'low'/'normal'/'high', we need to apply this as a multiplier to the native bitrate instead of absolutely setting it +- bitRateMultiplier = this.getBitRateMultiplier(videoBitRate); +- } +- return /*#__PURE__*/_react.default.createElement(_NativeCameraView.NativeCameraView, _extends({}, props, { +- cameraId: device.id, +- ref: this.ref, +- torch: torch, +- minFps: minFps, +- maxFps: maxFps, +- isMirrored: props.isMirrored ?? shouldBeMirrored, +- onViewReady: this.onViewReady, +- onAverageFpsChanged: enableFpsGraph ? this.onAverageFpsChanged : undefined, +- onInitialized: this.onInitialized, +- onCodeScanned: this.onCodeScanned, +- onStarted: this.onStarted, +- onStopped: this.onStopped, +- onPreviewStarted: this.onPreviewStarted, +- onPreviewStopped: this.onPreviewStopped, +- onShutter: this.onShutter, +- videoBitRateMultiplier: bitRateMultiplier, +- videoBitRateOverride: bitRateOverride, +- onOutputOrientationChanged: this.onOutputOrientationChanged, +- onPreviewOrientationChanged: this.onPreviewOrientationChanged, +- onError: this.onError, +- codeScannerOptions: codeScanner, +- enableFrameProcessor: frameProcessor != null, +- enableBufferCompression: props.enableBufferCompression ?? shouldEnableBufferCompression, +- preview: isRenderingWithSkia ? false : props.preview ?? true +- }), isRenderingWithSkia && /*#__PURE__*/_react.default.createElement(_SkiaCameraCanvas.SkiaCameraCanvas, { +- style: styles.customPreviewView, +- offscreenTextures: frameProcessor.offscreenTextures, +- resizeMode: props.resizeMode +- }), enableFpsGraph && /*#__PURE__*/_react.default.createElement(_FpsGraph.FpsGraph, { +- style: styles.fpsGraph, +- averageFpsSamples: this.state.averageFpsSamples, +- targetMaxFps: props.format?.maxFps ?? 60 +- })); +- } ++ // bitrate is number (override) or string (multiplier) ++ let bitRateMultiplier; ++ let bitRateOverride; ++ if (typeof videoBitRate === 'number') { ++ // If the user passed an absolute number as a bit-rate, we just use this as a full override. ++ bitRateOverride = videoBitRate; ++ } else if (typeof videoBitRate === 'string' && videoBitRate !== 'normal') { ++ // If the user passed 'low'/'normal'/'high', we need to apply this as a multiplier to the native bitrate instead of absolutely setting it ++ bitRateMultiplier = this.getBitRateMultiplier(videoBitRate); ++ } ++ return /*#__PURE__*/ _react.default.createElement( ++ _NativeCameraView.NativeCameraView, ++ _extends({}, props, { ++ cameraId: device.id, ++ ref: this.ref, ++ torch: torch, ++ minFps: minFps, ++ maxFps: maxFps, ++ isMirrored: props.isMirrored ?? shouldBeMirrored, ++ onViewReady: this.onViewReady, ++ onAverageFpsChanged: enableFpsGraph ? this.onAverageFpsChanged : undefined, ++ onInitialized: this.onInitialized, ++ onCodeScanned: this.onCodeScanned, ++ onStarted: this.onStarted, ++ onStopped: this.onStopped, ++ onPreviewStarted: this.onPreviewStarted, ++ onPreviewStopped: this.onPreviewStopped, ++ onShutter: this.onShutter, ++ videoBitRateMultiplier: bitRateMultiplier, ++ videoBitRateOverride: bitRateOverride, ++ onOutputOrientationChanged: this.onOutputOrientationChanged, ++ onPreviewOrientationChanged: this.onPreviewOrientationChanged, ++ onError: this.onError, ++ codeScannerOptions: codeScanner, ++ enableFrameProcessor: frameProcessor != null, ++ enableBufferCompression: props.enableBufferCompression ?? shouldEnableBufferCompression, ++ preview: isRenderingWithSkia ? false : props.preview ?? true, ++ }), ++ isRenderingWithSkia && ++ /*#__PURE__*/ _react.default.createElement(_SkiaCameraCanvas.SkiaCameraCanvas, { ++ style: styles.customPreviewView, ++ offscreenTextures: frameProcessor.offscreenTextures, ++ resizeMode: props.resizeMode, ++ }), ++ enableFpsGraph && ++ /*#__PURE__*/ _react.default.createElement(_FpsGraph.FpsGraph, { ++ style: styles.fpsGraph, ++ averageFpsSamples: this.state.averageFpsSamples, ++ targetMaxFps: props.format?.maxFps ?? 60, ++ }), ++ ); ++ } + } + //#endregion + exports.Camera = Camera; + const styles = _reactNative.StyleSheet.create({ +- customPreviewView: { +- flex: 1 +- }, +- fpsGraph: { +- elevation: 1, +- position: 'absolute', +- left: 15, +- top: 30 +- } ++ customPreviewView: { ++ flex: 1, ++ }, ++ fpsGraph: { ++ elevation: 1, ++ position: 'absolute', ++ left: 15, ++ top: 30, ++ }, + }); + //# sourceMappingURL=Camera.js.map +diff --git a/node_modules/react-native-vision-camera/lib/commonjs/Camera.js.map b/node_modules/react-native-vision-camera/lib/commonjs/Camera.js.map +index a21019c..667d46b 100644 +--- a/node_modules/react-native-vision-camera/lib/commonjs/Camera.js.map ++++ b/node_modules/react-native-vision-camera/lib/commonjs/Camera.js.map +@@ -1 +1,175 @@ +-{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_CameraError","_NativeCameraModule","_VisionCameraProxy","_CameraDevices","_SkiaCameraCanvas","_FpsGraph","_NativeCameraView","_RotationHelper","e","__esModule","default","_extends","Object","assign","bind","n","arguments","length","t","r","hasOwnProperty","call","apply","isSkiaFrameProcessor","frameProcessor","type","Camera","React","PureComponent","displayName","isNativeViewMounted","lastUIRotation","undefined","rotationHelper","RotationHelper","constructor","props","onViewReady","onAverageFpsChanged","onInitialized","onStarted","onStopped","onPreviewStarted","onPreviewStopped","onShutter","onOutputOrientationChanged","onPreviewOrientationChanged","onError","onCodeScanned","ref","createRef","lastFrameProcessor","state","isRecordingWithFlash","averageFpsSamples","handle","nodeHandle","findNodeHandle","current","CameraRuntimeError","takePhoto","options","CameraModule","tryParseNativeCameraError","takeSnapshot","getBitRateMultiplier","bitRate","startRecording","onRecordingError","onRecordingFinished","passThruOptions","flash","setState","onRecordCallback","video","error","nativeRecordVideoOptions","pauseRecording","resumeRecording","stopRecording","cancelRecording","focus","point","getAvailableCameraDevices","CameraDevices","addCameraDevicesChangedListener","listener","getCameraPermissionStatus","getMicrophonePermissionStatus","getLocationPermissionStatus","requestCameraPermission","requestMicrophonePermission","requestLocationPermission","event","nativeEvent","cause","isErrorWithCause","cameraError","code","message","console","outputOrientation","maybeUpdateUIRotation","previewOrientation","value","uiRotation","onUIRotationChanged","codeScanner","codes","frame","setFrameProcessor","VisionCameraProxy","unsetFrameProcessor","removeFrameProcessor","averageFps","MAX_BARS","shift","componentDidUpdate","render","device","enableFpsGraph","fps","videoBitRate","shouldEnableBufferCompression","torch","isRenderingWithSkia","shouldBeMirrored","position","minFps","maxFps","bitRateMultiplier","bitRateOverride","createElement","NativeCameraView","cameraId","id","isMirrored","videoBitRateMultiplier","videoBitRateOverride","codeScannerOptions","enableFrameProcessor","enableBufferCompression","preview","SkiaCameraCanvas","style","styles","customPreviewView","offscreenTextures","resizeMode","FpsGraph","fpsGraph","targetMaxFps","format","exports","StyleSheet","create","flex","elevation","left","top"],"sourceRoot":"../../src","sources":["Camera.tsx"],"mappings":"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Y,CAACgB,eAAe,CAAC,IAAI,CAACvB,MAAM,CAAC;IACxD,CAAC,CAAC,OAAO/C,CAAC,EAAE;MACV,MAAM,IAAAuD,sCAAyB,EAACvD,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAauE,aAAaA,CAAA,EAAkB;IAC1C,IAAI;MACF,OAAO,MAAMjB,gCAAY,CAACiB,aAAa,CAAC,IAAI,CAACxB,MAAM,CAAC;IACtD,CAAC,CAAC,OAAO/C,CAAC,EAAE;MACV,MAAM,IAAAuD,sCAAyB,EAACvD,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAawE,eAAeA,CAAA,EAAkB;IAC5C,IAAI;MACF,OAAO,MAAMlB,gCAAY,CAACkB,eAAe,CAAC,IAAI,CAACzB,MAAM,CAAC;IACxD,CAAC,CAAC,OAAO/C,CAAC,EAAE;MACV,MAAM,IAAAuD,sCAAyB,EAACvD,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAayE,KAAKA,CAACC,KAAY,EAAiB;IAC9C,IAAI;MACF,OAAO,MAAMpB,gCAAY,CAACmB,KAAK,CAAC,IAAI,CAAC1B,MAAM,EAAE2B,KAAK,CAAC;IACrD,CAAC,CAAC,OAAO1E,CAAC,EAAE;MACV,MAAM,IAAAuD,sCAAyB,EAACvD,CAAC,CAAC;IACpC;EACF;EACA;;EAEA;EACA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAc2E,yBAAyBA,CAAA,EAAmB;IACxD,OAAOC,4BAAa,CAACD,yBAAyB,CAAC,CAAC;EAClD;EACA;AACF;AACA;AAC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","ignoreList":[]} ++{ ++ "version": 3, ++ "names": [ ++ "_react", ++ "_interopRequireDefault", ++ "require", ++ "_reactNative", ++ "_CameraError", ++ "_NativeCameraModule", ++ "_VisionCameraProxy", ++ "_CameraDevices", ++ "_SkiaCameraCanvas", ++ "_FpsGraph", ++ "_NativeCameraView", ++ "_RotationHelper", ++ "e", ++ "__esModule", ++ "default", ++ "_extends", ++ "Object", ++ "assign", ++ "bind", ++ "n", ++ "arguments", ++ "length", ++ "t", ++ "r", ++ "hasOwnProperty", ++ "call", ++ "apply", ++ "isSkiaFrameProcessor", ++ "frameProcessor", ++ "type", ++ "Camera", ++ "React", ++ "PureComponent", ++ "displayName", ++ "isNativeViewMounted", ++ "lastUIRotation", ++ "undefined", ++ "rotationHelper", ++ "RotationHelper", ++ "constructor", ++ "props", ++ "onViewReady", ++ "onAverageFpsChanged", ++ "onInitialized", ++ "onStarted", ++ "onStopped", ++ "onPreviewStarted", ++ "onPreviewStopped", ++ "onShutter", ++ "onOutputOrientationChanged", ++ "onPreviewOrientationChanged", ++ "onError", ++ "onCodeScanned", ++ "ref", ++ "createRef", ++ "lastFrameProcessor", ++ "state", ++ "isRecordingWithFlash", ++ "averageFpsSamples", ++ "handle", ++ "nodeHandle", ++ "findNodeHandle", ++ "current", ++ "CameraRuntimeError", ++ "takePhoto", ++ "options", ++ "CameraModule", ++ "tryParseNativeCameraError", ++ "takeSnapshot", ++ "getBitRateMultiplier", ++ "bitRate", ++ "startRecording", ++ "onRecordingError", ++ "onRecordingFinished", ++ "passThruOptions", ++ "flash", ++ "setState", ++ "onRecordCallback", ++ "video", ++ "error", ++ "nativeRecordVideoOptions", ++ "pauseRecording", ++ "resumeRecording", ++ "stopRecording", ++ "cancelRecording", ++ "focus", ++ "point", ++ "getAvailableCameraDevices", ++ "CameraDevices", ++ "addCameraDevicesChangedListener", ++ "listener", ++ "getCameraPermissionStatus", ++ "getMicrophonePermissionStatus", ++ "getLocationPermissionStatus", ++ "requestCameraPermission", ++ "requestMicrophonePermission", ++ "requestLocationPermission", ++ "event", ++ "nativeEvent", ++ "cause", ++ "isErrorWithCause", ++ "cameraError", ++ "code", ++ "message", ++ "console", ++ "outputOrientation", ++ "maybeUpdateUIRotation", ++ "previewOrientation", ++ "value", ++ "uiRotation", ++ "onUIRotationChanged", ++ "codeScanner", ++ "codes", ++ "frame", ++ "setFrameProcessor", ++ "VisionCameraProxy", ++ "unsetFrameProcessor", ++ "removeFrameProcessor", ++ "averageFps", ++ "MAX_BARS", ++ "shift", ++ "componentDidUpdate", ++ "render", ++ "device", ++ "enableFpsGraph", ++ "fps", ++ "videoBitRate", ++ "shouldEnableBufferCompression", ++ "torch", ++ "isRenderingWithSkia", ++ "shouldBeMirrored", ++ "position", ++ "minFps", ++ "maxFps", ++ "bitRateMultiplier", ++ "bitRateOverride", ++ "createElement", ++ "NativeCameraView", ++ "cameraId", ++ "id", ++ "isMirrored", ++ "videoBitRateMultiplier", ++ "videoBitRateOverride", ++ "codeScannerOptions", ++ "enableFrameProcessor", ++ "enableBufferCompression", ++ "preview", ++ "SkiaCameraCanvas", ++ "style", ++ "styles", ++ "customPreviewView", ++ "offscreenTextures", ++ "resizeMode", ++ "FpsGraph", ++ "fpsGraph", ++ "targetMaxFps", ++ "format", ++ "exports", ++ "StyleSheet", ++ "create", ++ "flex", ++ "elevation", ++ "left", ++ "top" ++ ], ++ "sourceRoot": "../../src", ++ "sources": [ ++ "Camera.tsx" ++ ], ++ "mappings": "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Y,CAACgB,eAAe,CAAC,IAAI,CAACvB,MAAM,CAAC;IACxD,CAAC,CAAC,OAAO/C,CAAC,EAAE;MACV,MAAM,IAAAuD,sCAAyB,EAACvD,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAauE,aAAaA,CAAA,EAAkB;IAC1C,IAAI;MACF,OAAO,MAAMjB,gCAAY,CAACiB,aAAa,CAAC,IAAI,CAACxB,MAAM,CAAC;IACtD,CAAC,CAAC,OAAO/C,CAAC,EAAE;MACV,MAAM,IAAAuD,sCAAyB,EAACvD,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAawE,eAAeA,CAAA,EAAkB;IAC5C,IAAI;MACF,OAAO,MAAMlB,gCAAY,CAACkB,eAAe,CAAC,IAAI,CAACzB,MAAM,CAAC;IACxD,CAAC,CAAC,OAAO/C,CAAC,EAAE;MACV,MAAM,IAAAuD,sCAAyB,EAACvD,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAayE,KAAKA,CAACC,KAAY,EAAiB;IAC9C,IAAI;MACF,OAAO,MAAMpB,gCAAY,CAACmB,KAAK,CAAC,IAAI,CAAC1B,MAAM,EAAE2B,KAAK,CAAC;IACrD,CAAC,CAAC,OAAO1E,CAAC,EAAE;MACV,MAAM,IAAAuD,sCAAyB,EAACvD,CAAC,CAAC;IACpC;EACF;EACA;;EAEA;EACA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAc2E,yBAAyBA,CAAA,EAAmB;IACxD,OAAOC,4BAAa,CAACD,yBAAyB,CAAC,CAAC;EAClD;EACA;AACF;AACA;AAC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", ++ "ignoreList": [] ++} +diff --git a/node_modules/react-native-vision-camera/lib/commonjs/specs/CameraViewNativeComponent.js b/node_modules/react-native-vision-camera/lib/commonjs/specs/CameraViewNativeComponent.js +new file mode 100644 +index 0000000..9e627bc +--- /dev/null ++++ b/node_modules/react-native-vision-camera/lib/commonjs/specs/CameraViewNativeComponent.js +@@ -0,0 +1,13 @@ ++'use strict'; ++ ++Object.defineProperty(exports, '__esModule', { ++ value: true, ++}); ++exports.default = void 0; ++var _codegenNativeComponent = _interopRequireDefault(require('react-native/Libraries/Utilities/codegenNativeComponent')); ++function _interopRequireDefault(obj) { ++ return obj && obj.__esModule ? obj : {default: obj}; ++} ++/* eslint-disable @typescript-eslint/ban-types */ ++var _default = (exports.default = (0, _codegenNativeComponent.default)('CameraView')); ++//# sourceMappingURL=CameraViewNativeComponent.js.map +diff --git a/node_modules/react-native-vision-camera/lib/commonjs/specs/CameraViewNativeComponent.js.map b/node_modules/react-native-vision-camera/lib/commonjs/specs/CameraViewNativeComponent.js.map +new file mode 100644 +index 0000000..f3c7b03 +--- /dev/null ++++ b/node_modules/react-native-vision-camera/lib/commonjs/specs/CameraViewNativeComponent.js.map +@@ -0,0 +1,19 @@ ++{ ++ "version": 3, ++ "names": [ ++ "_codegenNativeComponent", ++ "_interopRequireDefault", ++ "require", ++ "obj", ++ "__esModule", ++ "default", ++ "_default", ++ "exports", ++ "codegenNativeComponent" ++ ], ++ "sourceRoot": "../../../src", ++ "sources": [ ++ "specs/CameraViewNativeComponent.ts" ++ ], ++ "mappings": ";;;;;;AAGA,IAAAA,uBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA6F,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAH7F;AAAA,IAAAG,QAAA,GAAAC,OAAA,CAAAF,OAAA,GA0Fe,IAAAG,+BAAsB,EAAc,YAAY,CAAC" ++} +diff --git a/node_modules/react-native-vision-camera/lib/module/Camera.js b/node_modules/react-native-vision-camera/lib/module/Camera.js +index e97f27c..fea7ccf 100644 +--- a/node_modules/react-native-vision-camera/lib/module/Camera.js ++++ b/node_modules/react-native-vision-camera/lib/module/Camera.js +@@ -1,21 +1,35 @@ +-function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } + import React from 'react'; +-import { findNodeHandle, StyleSheet } from 'react-native'; +-import { CameraRuntimeError, tryParseNativeCameraError, isErrorWithCause } from './CameraError'; +-import { CameraModule } from './NativeCameraModule'; +-import { VisionCameraProxy } from './frame-processors/VisionCameraProxy'; +-import { CameraDevices } from './CameraDevices'; +-import { SkiaCameraCanvas } from './skia/SkiaCameraCanvas'; +-import { FpsGraph, MAX_BARS } from './FpsGraph'; +-import { NativeCameraView } from './NativeCameraView'; +-import { RotationHelper } from './RotationHelper'; ++import {findNodeHandle, StyleSheet} from 'react-native'; ++import {CameraDevices} from './CameraDevices'; ++import {CameraRuntimeError, isErrorWithCause, tryParseNativeCameraError} from './CameraError'; ++import {FpsGraph, MAX_BARS} from './FpsGraph'; ++import {VisionCameraProxy} from './frame-processors/VisionCameraProxy'; ++import {CameraModule} from './NativeCameraModule'; ++import {NativeCameraView} from './NativeCameraView'; ++import {RotationHelper} from './RotationHelper'; ++import {SkiaCameraCanvas} from './skia/SkiaCameraCanvas'; ++ ++function _extends() { ++ return ( ++ (_extends = Object.assign ++ ? Object.assign.bind() ++ : function (n) { ++ for (var e = 1; e < arguments.length; e++) { ++ var t = arguments[e]; ++ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); ++ } ++ return n; ++ }), ++ _extends.apply(null, arguments) ++ ); ++} + + //#region Types + + //#endregion + + function isSkiaFrameProcessor(frameProcessor) { +- return frameProcessor?.type === 'drawable-skia'; ++ return frameProcessor?.type === 'drawable-skia'; + } + + //#region Camera Component +@@ -52,609 +66,597 @@ function isSkiaFrameProcessor(frameProcessor) { + * @component + */ + export class Camera extends React.PureComponent { +- /** @internal */ +- static displayName = 'Camera'; +- /** @internal */ +- displayName = Camera.displayName; +- isNativeViewMounted = false; +- lastUIRotation = undefined; +- rotationHelper = new RotationHelper(); +- /** @internal */ +- constructor(props) { +- super(props); +- this.onViewReady = this.onViewReady.bind(this); +- this.onAverageFpsChanged = this.onAverageFpsChanged.bind(this); +- this.onInitialized = this.onInitialized.bind(this); +- this.onStarted = this.onStarted.bind(this); +- this.onStopped = this.onStopped.bind(this); +- this.onPreviewStarted = this.onPreviewStarted.bind(this); +- this.onPreviewStopped = this.onPreviewStopped.bind(this); +- this.onShutter = this.onShutter.bind(this); +- this.onOutputOrientationChanged = this.onOutputOrientationChanged.bind(this); +- this.onPreviewOrientationChanged = this.onPreviewOrientationChanged.bind(this); +- this.onError = this.onError.bind(this); +- this.onCodeScanned = this.onCodeScanned.bind(this); +- this.ref = /*#__PURE__*/React.createRef(); +- this.lastFrameProcessor = undefined; +- this.state = { +- isRecordingWithFlash: false, +- averageFpsSamples: [] +- }; +- } +- get handle() { +- const nodeHandle = findNodeHandle(this.ref.current); +- if (nodeHandle == null || nodeHandle === -1) { +- throw new CameraRuntimeError('system/view-not-found', "Could not get the Camera's native view tag! Does the Camera View exist in the native view-tree?"); +- } +- return nodeHandle; +- } ++ /** @internal */ ++ static displayName = 'Camera'; ++ /** @internal */ ++ displayName = Camera.displayName; ++ isNativeViewMounted = false; ++ lastUIRotation = undefined; ++ rotationHelper = new RotationHelper(); ++ /** @internal */ ++ constructor(props) { ++ super(props); ++ this.onViewReady = this.onViewReady.bind(this); ++ this.onAverageFpsChanged = this.onAverageFpsChanged.bind(this); ++ this.onInitialized = this.onInitialized.bind(this); ++ this.onStarted = this.onStarted.bind(this); ++ this.onStopped = this.onStopped.bind(this); ++ this.onPreviewStarted = this.onPreviewStarted.bind(this); ++ this.onPreviewStopped = this.onPreviewStopped.bind(this); ++ this.onShutter = this.onShutter.bind(this); ++ this.onOutputOrientationChanged = this.onOutputOrientationChanged.bind(this); ++ this.onPreviewOrientationChanged = this.onPreviewOrientationChanged.bind(this); ++ this.onError = this.onError.bind(this); ++ this.onCodeScanned = this.onCodeScanned.bind(this); ++ this.ref = /*#__PURE__*/ React.createRef(); ++ this.lastFrameProcessor = undefined; ++ this.state = { ++ isRecordingWithFlash: false, ++ averageFpsSamples: [], ++ }; ++ } ++ get handle() { ++ const nodeHandle = findNodeHandle(this.ref.current); ++ if (nodeHandle == null || nodeHandle === -1) { ++ throw new CameraRuntimeError('system/view-not-found', "Could not get the Camera's native view tag! Does the Camera View exist in the native view-tree?"); ++ } ++ return nodeHandle; ++ } + +- //#region View-specific functions (UIViewManager) +- /** +- * Take a single photo and write it's content to a temporary file. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while capturing the photo. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * @example +- * ```ts +- * const photo = await camera.current.takePhoto({ +- * flash: 'on', +- * enableAutoRedEyeReduction: true +- * }) +- * ``` +- */ +- async takePhoto(options) { +- try { +- return await CameraModule.takePhoto(this.handle, options ?? {}); +- } catch (e) { +- throw tryParseNativeCameraError(e); +- } +- } ++ //#region View-specific functions (UIViewManager) ++ /** ++ * Take a single photo and write it's content to a temporary file. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while capturing the photo. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * @example ++ * ```ts ++ * const photo = await camera.current.takePhoto({ ++ * flash: 'on', ++ * enableAutoRedEyeReduction: true ++ * }) ++ * ``` ++ */ ++ async takePhoto(options) { ++ try { ++ return await CameraModule.takePhoto(this.handle, options ?? {}); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } + +- /** +- * Captures a snapshot of the Camera view and write it's content to a temporary file. +- * +- * - On iOS, `takeSnapshot` waits for a Frame from the video pipeline and therefore requires `video` to be enabled. +- * - On Android, `takeSnapshot` performs a GPU view screenshot from the preview view. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while capturing the photo. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * @example +- * ```ts +- * const snapshot = await camera.current.takeSnapshot({ +- * quality: 100 +- * }) +- * ``` +- */ +- async takeSnapshot(options) { +- try { +- return await CameraModule.takeSnapshot(this.handle, options ?? {}); +- } catch (e) { +- throw tryParseNativeCameraError(e); +- } +- } +- getBitRateMultiplier(bitRate) { +- if (typeof bitRate === 'number' || bitRate == null) return 1; +- switch (bitRate) { +- case 'extra-low': +- return 0.6; +- case 'low': +- return 0.8; +- case 'normal': +- return 1; +- case 'high': +- return 1.2; +- case 'extra-high': +- return 1.4; +- } +- } ++ /** ++ * Captures a snapshot of the Camera view and write it's content to a temporary file. ++ * ++ * - On iOS, `takeSnapshot` waits for a Frame from the video pipeline and therefore requires `video` to be enabled. ++ * - On Android, `takeSnapshot` performs a GPU view screenshot from the preview view. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while capturing the photo. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * @example ++ * ```ts ++ * const snapshot = await camera.current.takeSnapshot({ ++ * quality: 100 ++ * }) ++ * ``` ++ */ ++ async takeSnapshot(options) { ++ try { ++ return await CameraModule.takeSnapshot(this.handle, options ?? {}); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } ++ getBitRateMultiplier(bitRate) { ++ if (typeof bitRate === 'number' || bitRate == null) return 1; ++ switch (bitRate) { ++ case 'extra-low': ++ return 0.6; ++ case 'low': ++ return 0.8; ++ case 'normal': ++ return 1; ++ case 'high': ++ return 1.2; ++ case 'extra-high': ++ return 1.4; ++ } ++ } + +- /** +- * Start a new video recording. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while starting the video recording. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * +- * @example +- * ```ts +- * camera.current.startRecording({ +- * onRecordingFinished: (video) => console.log(video), +- * onRecordingError: (error) => console.error(error), +- * }) +- * setTimeout(() => { +- * camera.current.stopRecording() +- * }, 5000) +- * ``` +- */ +- startRecording(options) { +- const { +- onRecordingError, +- onRecordingFinished, +- ...passThruOptions +- } = options; +- if (typeof onRecordingError !== 'function' || typeof onRecordingFinished !== 'function') throw new CameraRuntimeError('parameter/invalid-parameter', 'The onRecordingError or onRecordingFinished functions were not set!'); +- if (options.flash === 'on') { +- // Enable torch for video recording +- this.setState({ +- isRecordingWithFlash: true +- }); +- } +- const onRecordCallback = (video, error) => { +- if (this.state.isRecordingWithFlash) { +- // disable torch again if it was enabled +- this.setState({ +- isRecordingWithFlash: false +- }); +- } +- if (error != null) return onRecordingError(error); +- if (video != null) return onRecordingFinished(video); +- }; +- const nativeRecordVideoOptions = passThruOptions; +- try { +- // TODO: Use TurboModules to make this awaitable. +- CameraModule.startRecording(this.handle, nativeRecordVideoOptions, onRecordCallback); +- } catch (e) { +- throw tryParseNativeCameraError(e); +- } +- } ++ /** ++ * Start a new video recording. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while starting the video recording. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * ++ * @example ++ * ```ts ++ * camera.current.startRecording({ ++ * onRecordingFinished: (video) => console.log(video), ++ * onRecordingError: (error) => console.error(error), ++ * }) ++ * setTimeout(() => { ++ * camera.current.stopRecording() ++ * }, 5000) ++ * ``` ++ */ ++ startRecording(options) { ++ const {onRecordingError, onRecordingFinished, ...passThruOptions} = options; ++ if (typeof onRecordingError !== 'function' || typeof onRecordingFinished !== 'function') ++ throw new CameraRuntimeError('parameter/invalid-parameter', 'The onRecordingError or onRecordingFinished functions were not set!'); ++ if (options.flash === 'on') { ++ // Enable torch for video recording ++ this.setState({ ++ isRecordingWithFlash: true, ++ }); ++ } ++ const onRecordCallback = (video, error) => { ++ if (this.state.isRecordingWithFlash) { ++ // disable torch again if it was enabled ++ this.setState({ ++ isRecordingWithFlash: false, ++ }); ++ } ++ if (error != null) return onRecordingError(error); ++ if (video != null) return onRecordingFinished(video); ++ }; ++ const nativeRecordVideoOptions = passThruOptions; ++ try { ++ // TODO: Use TurboModules to make this awaitable. ++ CameraModule.startRecording(this.handle, nativeRecordVideoOptions, onRecordCallback); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } + +- /** +- * Pauses the current video recording. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while pausing the video recording. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * +- * @example +- * ```ts +- * // Start +- * await camera.current.startRecording({ +- * onRecordingFinished: (video) => console.log(video), +- * onRecordingError: (error) => console.error(error), +- * }) +- * await timeout(1000) +- * // Pause +- * await camera.current.pauseRecording() +- * await timeout(500) +- * // Resume +- * await camera.current.resumeRecording() +- * await timeout(2000) +- * // Stop +- * await camera.current.stopRecording() +- * ``` +- */ +- async pauseRecording() { +- try { +- return await CameraModule.pauseRecording(this.handle); +- } catch (e) { +- throw tryParseNativeCameraError(e); +- } +- } ++ /** ++ * Pauses the current video recording. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while pausing the video recording. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * ++ * @example ++ * ```ts ++ * // Start ++ * await camera.current.startRecording({ ++ * onRecordingFinished: (video) => console.log(video), ++ * onRecordingError: (error) => console.error(error), ++ * }) ++ * await timeout(1000) ++ * // Pause ++ * await camera.current.pauseRecording() ++ * await timeout(500) ++ * // Resume ++ * await camera.current.resumeRecording() ++ * await timeout(2000) ++ * // Stop ++ * await camera.current.stopRecording() ++ * ``` ++ */ ++ async pauseRecording() { ++ try { ++ return await CameraModule.pauseRecording(this.handle); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } + +- /** +- * Resumes a currently paused video recording. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while resuming the video recording. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * +- * @example +- * ```ts +- * // Start +- * await camera.current.startRecording({ +- * onRecordingFinished: (video) => console.log(video), +- * onRecordingError: (error) => console.error(error), +- * }) +- * await timeout(1000) +- * // Pause +- * await camera.current.pauseRecording() +- * await timeout(500) +- * // Resume +- * await camera.current.resumeRecording() +- * await timeout(2000) +- * // Stop +- * await camera.current.stopRecording() +- * ``` +- */ +- async resumeRecording() { +- try { +- return await CameraModule.resumeRecording(this.handle); +- } catch (e) { +- throw tryParseNativeCameraError(e); +- } +- } ++ /** ++ * Resumes a currently paused video recording. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while resuming the video recording. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * ++ * @example ++ * ```ts ++ * // Start ++ * await camera.current.startRecording({ ++ * onRecordingFinished: (video) => console.log(video), ++ * onRecordingError: (error) => console.error(error), ++ * }) ++ * await timeout(1000) ++ * // Pause ++ * await camera.current.pauseRecording() ++ * await timeout(500) ++ * // Resume ++ * await camera.current.resumeRecording() ++ * await timeout(2000) ++ * // Stop ++ * await camera.current.stopRecording() ++ * ``` ++ */ ++ async resumeRecording() { ++ try { ++ return await CameraModule.resumeRecording(this.handle); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } + +- /** +- * Stop the current video recording. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while stopping the video recording. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * +- * @example +- * ```ts +- * await camera.current.startRecording({ +- * onRecordingFinished: (video) => console.log(video), +- * onRecordingError: (error) => console.error(error), +- * }) +- * setTimeout(async () => { +- * await camera.current.stopRecording() +- * }, 5000) +- * ``` +- */ +- async stopRecording() { +- try { +- return await CameraModule.stopRecording(this.handle); +- } catch (e) { +- throw tryParseNativeCameraError(e); +- } +- } ++ /** ++ * Stop the current video recording. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while stopping the video recording. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * ++ * @example ++ * ```ts ++ * await camera.current.startRecording({ ++ * onRecordingFinished: (video) => console.log(video), ++ * onRecordingError: (error) => console.error(error), ++ * }) ++ * setTimeout(async () => { ++ * await camera.current.stopRecording() ++ * }, 5000) ++ * ``` ++ */ ++ async stopRecording() { ++ try { ++ return await CameraModule.stopRecording(this.handle); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } + +- /** +- * Cancel the current video recording. The temporary video file will be deleted, +- * and the `startRecording`'s `onRecordingError` callback will be invoked with a `capture/recording-canceled` error. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while canceling the video recording. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * +- * @example +- * ```ts +- * await camera.current.startRecording({ +- * onRecordingFinished: (video) => console.log(video), +- * onRecordingError: (error) => { +- * if (error.code === 'capture/recording-canceled') { +- * // recording was canceled. +- * } else { +- * console.error(error) +- * } +- * }, +- * }) +- * setTimeout(async () => { +- * await camera.current.cancelRecording() +- * }, 5000) +- * ``` +- */ +- async cancelRecording() { +- try { +- return await CameraModule.cancelRecording(this.handle); +- } catch (e) { +- throw tryParseNativeCameraError(e); +- } +- } ++ /** ++ * Cancel the current video recording. The temporary video file will be deleted, ++ * and the `startRecording`'s `onRecordingError` callback will be invoked with a `capture/recording-canceled` error. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while canceling the video recording. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * ++ * @example ++ * ```ts ++ * await camera.current.startRecording({ ++ * onRecordingFinished: (video) => console.log(video), ++ * onRecordingError: (error) => { ++ * if (error.code === 'capture/recording-canceled') { ++ * // recording was canceled. ++ * } else { ++ * console.error(error) ++ * } ++ * }, ++ * }) ++ * setTimeout(async () => { ++ * await camera.current.cancelRecording() ++ * }, 5000) ++ * ``` ++ */ ++ async cancelRecording() { ++ try { ++ return await CameraModule.cancelRecording(this.handle); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } + +- /** +- * Focus the camera to a specific point in the coordinate system. +- * @param {Point} point The point to focus to. This should be relative +- * to the Camera view's coordinate system and is expressed in points. +- * * `(0, 0)` means **top left**. +- * * `(CameraView.width, CameraView.height)` means **bottom right**. +- * +- * Make sure the value doesn't exceed the CameraView's dimensions. +- * +- * @throws {@linkcode CameraRuntimeError} When any kind of error occured while focussing. +- * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error +- * @example +- * ```ts +- * await camera.current.focus({ +- * x: tapEvent.x, +- * y: tapEvent.y +- * }) +- * ``` +- */ +- async focus(point) { +- try { +- return await CameraModule.focus(this.handle, point); +- } catch (e) { +- throw tryParseNativeCameraError(e); +- } +- } +- //#endregion ++ /** ++ * Focus the camera to a specific point in the coordinate system. ++ * @param {Point} point The point to focus to. This should be relative ++ * to the Camera view's coordinate system and is expressed in points. ++ * * `(0, 0)` means **top left**. ++ * * `(CameraView.width, CameraView.height)` means **bottom right**. ++ * ++ * Make sure the value doesn't exceed the CameraView's dimensions. ++ * ++ * @throws {@linkcode CameraRuntimeError} When any kind of error occured while focussing. ++ * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error ++ * @example ++ * ```ts ++ * await camera.current.focus({ ++ * x: tapEvent.x, ++ * y: tapEvent.y ++ * }) ++ * ``` ++ */ ++ async focus(point) { ++ try { ++ return await CameraModule.focus(this.handle, point); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } ++ //#endregion + +- //#region Static Functions (NativeModule) +- /** +- * Get a list of all available camera devices on the current phone. +- * +- * If you use Hooks, use the `useCameraDevices(..)` hook instead. +- * +- * * For Camera Devices attached to the phone, it is safe to assume that this will never change. +- * * For external Camera Devices (USB cameras, Mac continuity cameras, etc.) the available Camera Devices +- * could change over time when the external Camera device gets plugged in or plugged out, so +- * use {@link addCameraDevicesChangedListener | addCameraDevicesChangedListener(...)} to listen for such changes. +- * +- * @example +- * ```ts +- * const devices = Camera.getAvailableCameraDevices() +- * const backCameras = devices.filter((d) => d.position === "back") +- * const frontCameras = devices.filter((d) => d.position === "front") +- * ``` +- */ +- static getAvailableCameraDevices() { +- return CameraDevices.getAvailableCameraDevices(); +- } +- /** +- * Adds a listener that gets called everytime the Camera Devices change, for example +- * when an external Camera Device (USB or continuity Camera) gets plugged in or plugged out. +- * +- * If you use Hooks, use the `useCameraDevices()` hook instead. +- */ +- static addCameraDevicesChangedListener(listener) { +- return CameraDevices.addCameraDevicesChangedListener(listener); +- } +- /** +- * Gets the current Camera Permission Status. Check this before mounting the Camera to ensure +- * the user has permitted the app to use the camera. +- * +- * To actually prompt the user for camera permission, use {@linkcode Camera.requestCameraPermission | requestCameraPermission()}. +- */ +- static getCameraPermissionStatus() { +- return CameraModule.getCameraPermissionStatus(); +- } +- /** +- * Gets the current Microphone-Recording Permission Status. +- * Check this before enabling the `audio={...}` property to make sure the +- * user has permitted the app to use the microphone. +- * +- * To actually prompt the user for microphone permission, use {@linkcode Camera.requestMicrophonePermission | requestMicrophonePermission()}. +- */ +- static getMicrophonePermissionStatus() { +- return CameraModule.getMicrophonePermissionStatus(); +- } +- /** +- * Gets the current Location Permission Status. +- * Check this before enabling the `location={...}` property to make sure the +- * the user has permitted the app to use the location. +- * +- * To actually prompt the user for location permission, use {@linkcode Camera.requestLocationPermission | requestLocationPermission()}. +- * +- * Note: This method will throw a `system/location-not-enabled` error if the Location APIs are not enabled at build-time. +- * See [the "GPS Location Tags" documentation](https://react-native-vision-camera.com/docs/guides/location) for more information. +- */ +- static getLocationPermissionStatus() { +- return CameraModule.getLocationPermissionStatus(); +- } +- /** +- * Shows a "request permission" alert to the user, and resolves with the new camera permission status. +- * +- * If the user has previously blocked the app from using the camera, the alert will not be shown +- * and `"denied"` will be returned. +- * +- * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. +- * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error +- */ +- static async requestCameraPermission() { +- try { +- return await CameraModule.requestCameraPermission(); +- } catch (e) { +- throw tryParseNativeCameraError(e); +- } +- } +- /** +- * Shows a "request permission" alert to the user, and resolves with the new microphone permission status. +- * +- * If the user has previously blocked the app from using the microphone, the alert will not be shown +- * and `"denied"` will be returned. +- * +- * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. +- * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error +- */ +- static async requestMicrophonePermission() { +- try { +- return await CameraModule.requestMicrophonePermission(); +- } catch (e) { +- throw tryParseNativeCameraError(e); +- } +- } +- /** +- * Shows a "request permission" alert to the user, and resolves with the new location permission status. +- * +- * If the user has previously blocked the app from using the location, the alert will not be shown +- * and `"denied"` will be returned. +- * +- * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. +- * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error +- */ +- static async requestLocationPermission() { +- try { +- return await CameraModule.requestLocationPermission(); +- } catch (e) { +- throw tryParseNativeCameraError(e); +- } +- } +- //#endregion ++ //#region Static Functions (NativeModule) ++ /** ++ * Get a list of all available camera devices on the current phone. ++ * ++ * If you use Hooks, use the `useCameraDevices(..)` hook instead. ++ * ++ * * For Camera Devices attached to the phone, it is safe to assume that this will never change. ++ * * For external Camera Devices (USB cameras, Mac continuity cameras, etc.) the available Camera Devices ++ * could change over time when the external Camera device gets plugged in or plugged out, so ++ * use {@link addCameraDevicesChangedListener | addCameraDevicesChangedListener(...)} to listen for such changes. ++ * ++ * @example ++ * ```ts ++ * const devices = Camera.getAvailableCameraDevices() ++ * const backCameras = devices.filter((d) => d.position === "back") ++ * const frontCameras = devices.filter((d) => d.position === "front") ++ * ``` ++ */ ++ static getAvailableCameraDevices() { ++ return CameraDevices.getAvailableCameraDevices(); ++ } ++ /** ++ * Adds a listener that gets called everytime the Camera Devices change, for example ++ * when an external Camera Device (USB or continuity Camera) gets plugged in or plugged out. ++ * ++ * If you use Hooks, use the `useCameraDevices()` hook instead. ++ */ ++ static addCameraDevicesChangedListener(listener) { ++ return CameraDevices.addCameraDevicesChangedListener(listener); ++ } ++ /** ++ * Gets the current Camera Permission Status. Check this before mounting the Camera to ensure ++ * the user has permitted the app to use the camera. ++ * ++ * To actually prompt the user for camera permission, use {@linkcode Camera.requestCameraPermission | requestCameraPermission()}. ++ */ ++ static getCameraPermissionStatus() { ++ return CameraModule.getCameraPermissionStatus(); ++ } ++ /** ++ * Gets the current Microphone-Recording Permission Status. ++ * Check this before enabling the `audio={...}` property to make sure the ++ * user has permitted the app to use the microphone. ++ * ++ * To actually prompt the user for microphone permission, use {@linkcode Camera.requestMicrophonePermission | requestMicrophonePermission()}. ++ */ ++ static getMicrophonePermissionStatus() { ++ return CameraModule.getMicrophonePermissionStatus(); ++ } ++ /** ++ * Gets the current Location Permission Status. ++ * Check this before enabling the `location={...}` property to make sure the ++ * the user has permitted the app to use the location. ++ * ++ * To actually prompt the user for location permission, use {@linkcode Camera.requestLocationPermission | requestLocationPermission()}. ++ * ++ * Note: This method will throw a `system/location-not-enabled` error if the Location APIs are not enabled at build-time. ++ * See [the "GPS Location Tags" documentation](https://react-native-vision-camera.com/docs/guides/location) for more information. ++ */ ++ static getLocationPermissionStatus() { ++ return CameraModule.getLocationPermissionStatus(); ++ } ++ /** ++ * Shows a "request permission" alert to the user, and resolves with the new camera permission status. ++ * ++ * If the user has previously blocked the app from using the camera, the alert will not be shown ++ * and `"denied"` will be returned. ++ * ++ * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. ++ * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error ++ */ ++ static async requestCameraPermission() { ++ try { ++ return await CameraModule.requestCameraPermission(); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } ++ /** ++ * Shows a "request permission" alert to the user, and resolves with the new microphone permission status. ++ * ++ * If the user has previously blocked the app from using the microphone, the alert will not be shown ++ * and `"denied"` will be returned. ++ * ++ * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. ++ * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error ++ */ ++ static async requestMicrophonePermission() { ++ try { ++ return await CameraModule.requestMicrophonePermission(); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } ++ /** ++ * Shows a "request permission" alert to the user, and resolves with the new location permission status. ++ * ++ * If the user has previously blocked the app from using the location, the alert will not be shown ++ * and `"denied"` will be returned. ++ * ++ * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. ++ * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error ++ */ ++ static async requestLocationPermission() { ++ try { ++ return await CameraModule.requestLocationPermission(); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } ++ //#endregion + +- //#region Events (Wrapped to maintain reference equality) +- onError(event) { +- const error = event.nativeEvent; +- const cause = isErrorWithCause(error.cause) ? error.cause : undefined; +- // @ts-expect-error We're casting from unknown bridge types to TS unions, I expect it to hopefully work +- const cameraError = new CameraRuntimeError(error.code, error.message, cause); +- if (this.props.onError != null) { +- this.props.onError(cameraError); +- } else { +- // User didn't pass an `onError` handler, so just log it to console +- console.error(cameraError); +- } +- } +- onInitialized() { +- this.props.onInitialized?.(); +- } +- onStarted() { +- this.props.onStarted?.(); +- } +- onStopped() { +- this.props.onStopped?.(); +- } +- onPreviewStarted() { +- this.props.onPreviewStarted?.(); +- } +- onPreviewStopped() { +- this.props.onPreviewStopped?.(); +- } +- onShutter(event) { +- this.props.onShutter?.(event.nativeEvent); +- } +- onOutputOrientationChanged({ +- nativeEvent: { +- outputOrientation +- } +- }) { +- this.rotationHelper.outputOrientation = outputOrientation; +- this.props.onOutputOrientationChanged?.(outputOrientation); +- this.maybeUpdateUIRotation(); +- } +- onPreviewOrientationChanged({ +- nativeEvent: { +- previewOrientation +- } +- }) { +- this.rotationHelper.previewOrientation = previewOrientation; +- this.props.onPreviewOrientationChanged?.(previewOrientation); +- this.maybeUpdateUIRotation(); +- if (isSkiaFrameProcessor(this.props.frameProcessor)) { +- // If we have a Skia Frame Processor, we need to update it's orientation so it knows how to render. +- this.props.frameProcessor.previewOrientation.value = previewOrientation; +- } +- } +- maybeUpdateUIRotation() { +- const uiRotation = this.rotationHelper.uiRotation; +- if (uiRotation !== this.lastUIRotation) { +- this.props.onUIRotationChanged?.(uiRotation); +- this.lastUIRotation = uiRotation; +- } +- } +- //#endregion ++ //#region Events (Wrapped to maintain reference equality) ++ onError(event) { ++ const error = event.nativeEvent; ++ const cause = isErrorWithCause(error.cause) ? error.cause : undefined; ++ // @ts-expect-error We're casting from unknown bridge types to TS unions, I expect it to hopefully work ++ const cameraError = new CameraRuntimeError(error.code, error.message, cause); ++ if (this.props.onError != null) { ++ this.props.onError(cameraError); ++ } else { ++ // User didn't pass an `onError` handler, so just log it to console ++ console.error(cameraError); ++ } ++ } ++ onInitialized() { ++ this.props.onInitialized?.(); ++ } ++ onStarted() { ++ this.props.onStarted?.(); ++ } ++ onStopped() { ++ this.props.onStopped?.(); ++ } ++ onPreviewStarted() { ++ this.props.onPreviewStarted?.(); ++ } ++ onPreviewStopped() { ++ this.props.onPreviewStopped?.(); ++ } ++ onShutter(event) { ++ this.props.onShutter?.(event.nativeEvent); ++ } ++ onOutputOrientationChanged({nativeEvent: {outputOrientation}}) { ++ this.rotationHelper.outputOrientation = outputOrientation; ++ this.props.onOutputOrientationChanged?.(outputOrientation); ++ this.maybeUpdateUIRotation(); ++ } ++ onPreviewOrientationChanged({nativeEvent: {previewOrientation}}) { ++ this.rotationHelper.previewOrientation = previewOrientation; ++ this.props.onPreviewOrientationChanged?.(previewOrientation); ++ this.maybeUpdateUIRotation(); ++ if (isSkiaFrameProcessor(this.props.frameProcessor)) { ++ // If we have a Skia Frame Processor, we need to update it's orientation so it knows how to render. ++ this.props.frameProcessor.previewOrientation.value = previewOrientation; ++ } ++ } ++ maybeUpdateUIRotation() { ++ const uiRotation = this.rotationHelper.uiRotation; ++ if (uiRotation !== this.lastUIRotation) { ++ this.props.onUIRotationChanged?.(uiRotation); ++ this.lastUIRotation = uiRotation; ++ } ++ } ++ //#endregion + +- onCodeScanned(event) { +- const codeScanner = this.props.codeScanner; +- if (codeScanner == null) return; +- codeScanner.onCodeScanned(event.nativeEvent.codes, event.nativeEvent.frame); +- } ++ onCodeScanned(event) { ++ const codeScanner = this.props.codeScanner; ++ if (codeScanner == null) return; ++ codeScanner.onCodeScanned(event.nativeEvent.codes, event.nativeEvent.frame); ++ } + +- //#region Lifecycle +- setFrameProcessor(frameProcessor) { +- VisionCameraProxy.setFrameProcessor(this.handle, frameProcessor); +- } +- unsetFrameProcessor() { +- VisionCameraProxy.removeFrameProcessor(this.handle); +- } +- onViewReady() { +- this.isNativeViewMounted = true; +- if (this.props.frameProcessor != null) { +- // user passed a `frameProcessor` but we didn't set it yet because the native view was not mounted yet. set it now. +- this.setFrameProcessor(this.props.frameProcessor.frameProcessor); +- this.lastFrameProcessor = this.props.frameProcessor.frameProcessor; +- } +- } +- onAverageFpsChanged({ +- nativeEvent: { +- averageFps +- } +- }) { +- this.setState(state => { +- const averageFpsSamples = [...state.averageFpsSamples, averageFps]; +- while (averageFpsSamples.length >= MAX_BARS + 1) { +- // we keep a maximum of 30 FPS samples in our history +- averageFpsSamples.shift(); +- } +- return { +- ...state, +- averageFpsSamples: averageFpsSamples +- }; +- }); +- } ++ //#region Lifecycle ++ setFrameProcessor(frameProcessor) { ++ VisionCameraProxy.setFrameProcessor(this.handle, frameProcessor); ++ } ++ unsetFrameProcessor() { ++ VisionCameraProxy.removeFrameProcessor(this.handle); ++ } ++ onViewReady() { ++ this.isNativeViewMounted = true; ++ if (this.props.frameProcessor != null) { ++ // user passed a `frameProcessor` but we didn't set it yet because the native view was not mounted yet. set it now. ++ this.setFrameProcessor(this.props.frameProcessor.frameProcessor); ++ this.lastFrameProcessor = this.props.frameProcessor.frameProcessor; ++ } ++ } ++ onAverageFpsChanged({nativeEvent: {averageFps}}) { ++ this.setState((state) => { ++ const averageFpsSamples = [...state.averageFpsSamples, averageFps]; ++ while (averageFpsSamples.length >= MAX_BARS + 1) { ++ // we keep a maximum of 30 FPS samples in our history ++ averageFpsSamples.shift(); ++ } ++ return { ++ ...state, ++ averageFpsSamples: averageFpsSamples, ++ }; ++ }); ++ } + +- /** @internal */ +- componentDidUpdate() { +- if (!this.isNativeViewMounted) return; +- const frameProcessor = this.props.frameProcessor; +- if (frameProcessor?.frameProcessor !== this.lastFrameProcessor) { +- // frameProcessor argument identity changed. Update native to reflect the change. +- if (frameProcessor != null) this.setFrameProcessor(frameProcessor.frameProcessor);else this.unsetFrameProcessor(); +- this.lastFrameProcessor = frameProcessor?.frameProcessor; +- } +- } +- //#endregion ++ /** @internal */ ++ componentDidUpdate() { ++ if (!this.isNativeViewMounted) return; ++ const frameProcessor = this.props.frameProcessor; ++ if (frameProcessor?.frameProcessor !== this.lastFrameProcessor) { ++ // frameProcessor argument identity changed. Update native to reflect the change. ++ if (frameProcessor != null) this.setFrameProcessor(frameProcessor.frameProcessor); ++ else this.unsetFrameProcessor(); ++ this.lastFrameProcessor = frameProcessor?.frameProcessor; ++ } ++ } ++ //#endregion + +- /** @internal */ +- render() { +- // We remove the big `device` object from the props because we only need to pass `cameraId` to native. +- const { +- device, +- frameProcessor, +- codeScanner, +- enableFpsGraph, +- fps, +- videoBitRate, +- ...props +- } = this.props; ++ /** @internal */ ++ render() { ++ // We remove the big `device` object from the props because we only need to pass `cameraId` to native. ++ const {device, frameProcessor, codeScanner, enableFpsGraph, fps, videoBitRate, ...props} = this.props; + +- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition +- if (device == null) { +- throw new CameraRuntimeError('device/no-device', 'Camera: `device` is null! Select a valid Camera device. See: https://mrousavy.com/react-native-vision-camera/docs/guides/devices'); +- } +- const shouldEnableBufferCompression = props.video === true && frameProcessor == null; +- const torch = this.state.isRecordingWithFlash ? 'on' : props.torch; +- const isRenderingWithSkia = isSkiaFrameProcessor(frameProcessor); +- const shouldBeMirrored = device.position === 'front'; ++ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition ++ if (device == null) { ++ throw new CameraRuntimeError( ++ 'device/no-device', ++ 'Camera: `device` is null! Select a valid Camera device. See: https://mrousavy.com/react-native-vision-camera/docs/guides/devices', ++ ); ++ } ++ const shouldEnableBufferCompression = props.video === true && frameProcessor == null; ++ const torch = this.state.isRecordingWithFlash ? 'on' : props.torch; ++ const isRenderingWithSkia = isSkiaFrameProcessor(frameProcessor); ++ const shouldBeMirrored = device.position === 'front'; + +- // minFps/maxFps is either the fixed `fps` value, or a value from the [min, max] tuple +- const minFps = fps == null ? undefined : typeof fps === 'number' ? fps : fps[0]; +- const maxFps = fps == null ? undefined : typeof fps === 'number' ? fps : fps[1]; ++ // minFps/maxFps is either the fixed `fps` value, or a value from the [min, max] tuple ++ const minFps = fps == null ? undefined : typeof fps === 'number' ? fps : fps[0]; ++ const maxFps = fps == null ? undefined : typeof fps === 'number' ? fps : fps[1]; + +- // bitrate is number (override) or string (multiplier) +- let bitRateMultiplier; +- let bitRateOverride; +- if (typeof videoBitRate === 'number') { +- // If the user passed an absolute number as a bit-rate, we just use this as a full override. +- bitRateOverride = videoBitRate; +- } else if (typeof videoBitRate === 'string' && videoBitRate !== 'normal') { +- // If the user passed 'low'/'normal'/'high', we need to apply this as a multiplier to the native bitrate instead of absolutely setting it +- bitRateMultiplier = this.getBitRateMultiplier(videoBitRate); +- } +- return /*#__PURE__*/React.createElement(NativeCameraView, _extends({}, props, { +- cameraId: device.id, +- ref: this.ref, +- torch: torch, +- minFps: minFps, +- maxFps: maxFps, +- isMirrored: props.isMirrored ?? shouldBeMirrored, +- onViewReady: this.onViewReady, +- onAverageFpsChanged: enableFpsGraph ? this.onAverageFpsChanged : undefined, +- onInitialized: this.onInitialized, +- onCodeScanned: this.onCodeScanned, +- onStarted: this.onStarted, +- onStopped: this.onStopped, +- onPreviewStarted: this.onPreviewStarted, +- onPreviewStopped: this.onPreviewStopped, +- onShutter: this.onShutter, +- videoBitRateMultiplier: bitRateMultiplier, +- videoBitRateOverride: bitRateOverride, +- onOutputOrientationChanged: this.onOutputOrientationChanged, +- onPreviewOrientationChanged: this.onPreviewOrientationChanged, +- onError: this.onError, +- codeScannerOptions: codeScanner, +- enableFrameProcessor: frameProcessor != null, +- enableBufferCompression: props.enableBufferCompression ?? shouldEnableBufferCompression, +- preview: isRenderingWithSkia ? false : props.preview ?? true +- }), isRenderingWithSkia && /*#__PURE__*/React.createElement(SkiaCameraCanvas, { +- style: styles.customPreviewView, +- offscreenTextures: frameProcessor.offscreenTextures, +- resizeMode: props.resizeMode +- }), enableFpsGraph && /*#__PURE__*/React.createElement(FpsGraph, { +- style: styles.fpsGraph, +- averageFpsSamples: this.state.averageFpsSamples, +- targetMaxFps: props.format?.maxFps ?? 60 +- })); +- } ++ // bitrate is number (override) or string (multiplier) ++ let bitRateMultiplier; ++ let bitRateOverride; ++ if (typeof videoBitRate === 'number') { ++ // If the user passed an absolute number as a bit-rate, we just use this as a full override. ++ bitRateOverride = videoBitRate; ++ } else if (typeof videoBitRate === 'string' && videoBitRate !== 'normal') { ++ // If the user passed 'low'/'normal'/'high', we need to apply this as a multiplier to the native bitrate instead of absolutely setting it ++ bitRateMultiplier = this.getBitRateMultiplier(videoBitRate); ++ } ++ return /*#__PURE__*/ React.createElement( ++ NativeCameraView, ++ _extends({}, props, { ++ cameraId: device.id, ++ ref: this.ref, ++ torch: torch, ++ minFps: minFps, ++ maxFps: maxFps, ++ isMirrored: props.isMirrored ?? shouldBeMirrored, ++ onViewReady: this.onViewReady, ++ onAverageFpsChanged: enableFpsGraph ? this.onAverageFpsChanged : undefined, ++ onInitialized: this.onInitialized, ++ onCodeScanned: this.onCodeScanned, ++ onStarted: this.onStarted, ++ onStopped: this.onStopped, ++ onPreviewStarted: this.onPreviewStarted, ++ onPreviewStopped: this.onPreviewStopped, ++ onShutter: this.onShutter, ++ videoBitRateMultiplier: bitRateMultiplier, ++ videoBitRateOverride: bitRateOverride, ++ onOutputOrientationChanged: this.onOutputOrientationChanged, ++ onPreviewOrientationChanged: this.onPreviewOrientationChanged, ++ onError: this.onError, ++ codeScannerOptions: codeScanner, ++ enableFrameProcessor: frameProcessor != null, ++ enableBufferCompression: props.enableBufferCompression ?? shouldEnableBufferCompression, ++ preview: isRenderingWithSkia ? false : props.preview ?? true, ++ }), ++ isRenderingWithSkia && ++ /*#__PURE__*/ React.createElement(SkiaCameraCanvas, { ++ style: styles.customPreviewView, ++ offscreenTextures: frameProcessor.offscreenTextures, ++ resizeMode: props.resizeMode, ++ }), ++ enableFpsGraph && ++ /*#__PURE__*/ React.createElement(FpsGraph, { ++ style: styles.fpsGraph, ++ averageFpsSamples: this.state.averageFpsSamples, ++ targetMaxFps: props.format?.maxFps ?? 60, ++ }), ++ ); ++ } + } + //#endregion + + const styles = StyleSheet.create({ +- customPreviewView: { +- flex: 1 +- }, +- fpsGraph: { +- elevation: 1, +- position: 'absolute', +- left: 15, +- top: 30 +- } ++ customPreviewView: { ++ flex: 1, ++ }, ++ fpsGraph: { ++ elevation: 1, ++ position: 'absolute', ++ left: 15, ++ top: 30, ++ }, + }); + //# sourceMappingURL=Camera.js.map +diff --git a/node_modules/react-native-vision-camera/lib/module/Camera.js.map b/node_modules/react-native-vision-camera/lib/module/Camera.js.map +index a1a484f..b45fa1d 100644 +--- a/node_modules/react-native-vision-camera/lib/module/Camera.js.map ++++ b/node_modules/react-native-vision-camera/lib/module/Camera.js.map +@@ -1 +1,151 @@ +-{"version":3,"names":["React","findNodeHandle","StyleSheet","CameraRuntimeError","tryParseNativeCameraError","isErrorWithCause","CameraModule","VisionCameraProxy","CameraDevices","SkiaCameraCanvas","FpsGraph","MAX_BARS","NativeCameraView","RotationHelper","isSkiaFrameProcessor","frameProcessor","type","Camera","PureComponent","displayName","isNativeViewMounted","lastUIRotation","undefined","rotationHelper","constructor","props","onViewReady","bind","onAverageFpsChanged","onInitialized","onStarted","onStopped","onPreviewStarted","onPreviewStopped","onShutter","onOutputOrientationChanged","onPreviewOrientationChanged","onError","onCodeScanned","ref","createRef","lastFrameProcessor","state","isRecordingWithFlash","averageFpsSamples","handle","nodeHandle","current","takePhoto","options","e","takeSnapshot","getBitRateMultiplier","bitRate","startRecording","onRecordingError","onRecordingFinished","passThruOptions","flash","setState","onRecordCallback","video","error","nativeRecordVideoOptions","pauseRecording","resumeRecording","stopRecording","cancelRecording","focus","point","getAvailableCameraDevices","addCameraDevicesChangedListener","listener","getCameraPermissionStatus","getMicrophonePermissionStatus","getLocationPermissionStatus","requestCameraPermission","requestMicrophonePermission","requestLocationPermission","event","nativeEvent","cause","cameraError","code","message","console","outputOrientation","maybeUpdateUIRotation","previewOrientation","value","uiRotation","onUIRotationChanged","codeScanner","codes","frame","setFrameProcessor","unsetFrameProcessor","removeFrameProcessor","averageFps","length","shift","componentDidUpdate","render","device","enableFpsGraph","fps","videoBitRate","shouldEnableBufferCompression","torch","isRenderingWithSkia","shouldBeMirrored","position","minFps","maxFps","bitRateMultiplier","bitRateOverride","createElement","_extends","cameraId","id","isMirrored","videoBitRateMultiplier","videoBitRateOverride","codeScannerOptions","enableFrameProcessor","enableBufferCompression","preview","style","styles","customPreviewView","offscreenTextures","resizeMode","fpsGraph","targetMaxFps","format","create","flex","elevation","left","top"],"sourceRoot":"../../src","sources":["Camera.tsx"],"mappings":"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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAaiB,eAAeA,CAAA,EAAkB;IAC5C,IAAI;MACF,OAAO,MAAM7D,YAAY,CAAC6D,eAAe,CAAC,IAAI,CAACtB,MAAM,CAAC;IACxD,CAAC,CAAC,OAAOK,CAAC,EAAE;MACV,MAAM9C,yBAAyB,CAAC8C,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAakB,KAAKA,CAACC,KAAY,EAAiB;IAC9C,IAAI;MACF,OAAO,MAAM/D,YAAY,CAAC8D,KAAK,CAAC,IAAI,CAACvB,MAAM,EAAEwB,KAAK,CAAC;IACrD,CAAC,CAAC,OAAOnB,CAAC,EAAE;MACV,MAAM9C,yBAAyB,CAAC8C,CAAC,CAAC;IACpC;EACF;EACA;;EAEA;EACA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAcoB,yBAAyBA,CAAA,EAAmB;IACxD,OAAO9D,aAAa,CAAC8D,yBAAyB,CAAC,CAAC;EAClD;EACA;AACF;AACA;AACA;AACA;AACA;EACE,OAAcC,+BAA+BA,CAACC,QAA8C,EAAuB;IACjH,OAAOhE,aAAa,CAAC+D,+BAA+B,CAACC,QAAQ,CAAC;EAChE;EACA;AACF;AACA;AACA;AACA;AACA;EACE,OAAcC,yBAAyBA,CAAA,EAA2B;IAChE,OAAOnE,YAAY,CAACmE,yBAAyB,CAAC,CAAC;EACjD;EACA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,OAAcC,6BAA6BA,CAAA,EAA2B;IACpE,OAAOpE,YAAY,CAACoE,6BAA6B,CAAC,CAAC;EACrD;EACA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAcC,2BAA2BA,CAAA,EAA2B;IAClE,OAAOrE,YAAY,CAACqE,2BAA2B,CAAC,CAAC;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","ignoreList":[]} ++{ ++ "version": 3, ++ "names": [ ++ "React", ++ "findNodeHandle", ++ "StyleSheet", ++ "CameraRuntimeError", ++ "tryParseNativeCameraError", ++ "isErrorWithCause", ++ "CameraModule", ++ "VisionCameraProxy", ++ "CameraDevices", ++ "SkiaCameraCanvas", ++ "FpsGraph", ++ "MAX_BARS", ++ "NativeCameraView", ++ "RotationHelper", ++ "isSkiaFrameProcessor", ++ "frameProcessor", ++ "type", ++ "Camera", ++ "PureComponent", ++ "displayName", ++ "isNativeViewMounted", ++ "lastUIRotation", ++ "undefined", ++ "rotationHelper", ++ "constructor", ++ "props", ++ "onViewReady", ++ "bind", ++ "onAverageFpsChanged", ++ "onInitialized", ++ "onStarted", ++ "onStopped", ++ "onPreviewStarted", ++ "onPreviewStopped", ++ "onShutter", ++ "onOutputOrientationChanged", ++ "onPreviewOrientationChanged", ++ "onError", ++ "onCodeScanned", ++ "ref", ++ "createRef", ++ "lastFrameProcessor", ++ "state", ++ "isRecordingWithFlash", ++ "averageFpsSamples", ++ "handle", ++ "nodeHandle", ++ "current", ++ "takePhoto", ++ "options", ++ "e", ++ "takeSnapshot", ++ "getBitRateMultiplier", ++ "bitRate", ++ "startRecording", ++ "onRecordingError", ++ "onRecordingFinished", ++ "passThruOptions", ++ "flash", ++ "setState", ++ "onRecordCallback", ++ "video", ++ "error", ++ "nativeRecordVideoOptions", ++ "pauseRecording", ++ "resumeRecording", ++ "stopRecording", ++ "cancelRecording", ++ "focus", ++ "point", ++ "getAvailableCameraDevices", ++ "addCameraDevicesChangedListener", ++ "listener", ++ "getCameraPermissionStatus", ++ "getMicrophonePermissionStatus", ++ "getLocationPermissionStatus", ++ "requestCameraPermission", ++ "requestMicrophonePermission", ++ "requestLocationPermission", ++ "event", ++ "nativeEvent", ++ "cause", ++ "cameraError", ++ "code", ++ "message", ++ "console", ++ "outputOrientation", ++ "maybeUpdateUIRotation", ++ "previewOrientation", ++ "value", ++ "uiRotation", ++ "onUIRotationChanged", ++ "codeScanner", ++ "codes", ++ "frame", ++ "setFrameProcessor", ++ "unsetFrameProcessor", ++ "removeFrameProcessor", ++ "averageFps", ++ "length", ++ "shift", ++ "componentDidUpdate", ++ "render", ++ "device", ++ "enableFpsGraph", ++ "fps", ++ "videoBitRate", ++ "shouldEnableBufferCompression", ++ "torch", ++ "isRenderingWithSkia", ++ "shouldBeMirrored", ++ "position", ++ "minFps", ++ "maxFps", ++ "bitRateMultiplier", ++ "bitRateOverride", ++ "createElement", ++ "_extends", ++ "cameraId", ++ "id", ++ "isMirrored", ++ "videoBitRateMultiplier", ++ "videoBitRateOverride", ++ "codeScannerOptions", ++ "enableFrameProcessor", ++ "enableBufferCompression", ++ "preview", ++ "style", ++ "styles", ++ "customPreviewView", ++ "offscreenTextures", ++ "resizeMode", ++ "fpsGraph", ++ "targetMaxFps", ++ "format", ++ "create", ++ "flex", ++ "elevation", ++ "left", ++ "top" ++ ], ++ "sourceRoot": "../../src", ++ "sources": [ ++ "Camera.tsx" ++ ], ++ "mappings": "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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAaiB,eAAeA,CAAA,EAAkB;IAC5C,IAAI;MACF,OAAO,MAAM7D,YAAY,CAAC6D,eAAe,CAAC,IAAI,CAACtB,MAAM,CAAC;IACxD,CAAC,CAAC,OAAOK,CAAC,EAAE;MACV,MAAM9C,yBAAyB,CAAC8C,CAAC,CAAC;IACpC;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAakB,KAAKA,CAACC,KAAY,EAAiB;IAC9C,IAAI;MACF,OAAO,MAAM/D,YAAY,CAAC8D,KAAK,CAAC,IAAI,CAACvB,MAAM,EAAEwB,KAAK,CAAC;IACrD,CAAC,CAAC,OAAOnB,CAAC,EAAE;MACV,MAAM9C,yBAAyB,CAAC8C,CAAC,CAAC;IACpC;EACF;EACA;;EAEA;EACA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAcoB,yBAAyBA,CAAA,EAAmB;IACxD,OAAO9D,aAAa,CAAC8D,yBAAyB,CAAC,CAAC;EAClD;EACA;AACF;AACA;AACA;AACA;AACA;EACE,OAAcC,+BAA+BA,CAACC,QAA8C,EAAuB;IACjH,OAAOhE,aAAa,CAAC+D,+BAA+B,CAACC,QAAQ,CAAC;EAChE;EACA;AACF;AACA;AACA;AACA;AACA;EACE,OAAcC,yBAAyBA,CAAA,EAA2B;IAChE,OAAOnE,YAAY,CAACmE,yBAAyB,CAAC,CAAC;EACjD;EACA;AACF;AACA;AACA;AACA;AACA;AACA;EACE,OAAcC,6BAA6BA,CAAA,EAA2B;IACpE,OAAOpE,YAAY,CAACoE,6BAA6B,CAAC,CAAC;EACrD;EACA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAcC,2BAA2BA,CAAA,EAA2B;IAClE,OAAOrE,YAAY,CAACqE,2BAA2B,CAAC,CAAC;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", ++ "ignoreList": [] ++} +diff --git a/node_modules/react-native-vision-camera/lib/module/specs/CameraViewNativeComponent.js b/node_modules/react-native-vision-camera/lib/module/specs/CameraViewNativeComponent.js +new file mode 100644 +index 0000000..3dd9033 +--- /dev/null ++++ b/node_modules/react-native-vision-camera/lib/module/specs/CameraViewNativeComponent.js +@@ -0,0 +1,5 @@ ++/* eslint-disable @typescript-eslint/ban-types */ ++import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; ++ ++export default codegenNativeComponent('CameraView'); ++//# sourceMappingURL=CameraViewNativeComponent.js.map +diff --git a/node_modules/react-native-vision-camera/lib/module/specs/CameraViewNativeComponent.js.map b/node_modules/react-native-vision-camera/lib/module/specs/CameraViewNativeComponent.js.map +new file mode 100644 +index 0000000..fc84756 +--- /dev/null ++++ b/node_modules/react-native-vision-camera/lib/module/specs/CameraViewNativeComponent.js.map +@@ -0,0 +1,11 @@ ++{ ++ "version": 3, ++ "names": [ ++ "codegenNativeComponent" ++ ], ++ "sourceRoot": "../../../src", ++ "sources": [ ++ "specs/CameraViewNativeComponent.ts" ++ ], ++ "mappings": "AAAA;;AAGA,OAAOA,sBAAsB,MAAM,yDAAyD;AAuF5F,eAAeA,sBAAsB,CAAc,YAAY,CAAC" ++} +diff --git a/node_modules/react-native-vision-camera/lib/typescript/Camera.d.ts.map b/node_modules/react-native-vision-camera/lib/typescript/Camera.d.ts.map +index 5abba6e..8e4c1b6 100644 +--- a/node_modules/react-native-vision-camera/lib/typescript/Camera.d.ts.map ++++ b/node_modules/react-native-vision-camera/lib/typescript/Camera.d.ts.map +@@ -1 +1,10 @@ +-{"version":3,"file":"Camera.d.ts","sourceRoot":"","sources":["../../src/Camera.tsx"],"names":[],"mappings":"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"} +\ No newline at end of file ++{ ++ "version": 3, ++ "file": "Camera.d.ts", ++ "sourceRoot": "", ++ "sources": [ ++ "../../src/Camera.tsx" ++ ], ++ "names": [], ++ "mappings": "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" ++} +diff --git a/node_modules/react-native-vision-camera/lib/typescript/specs/CameraViewNativeComponent.d.ts b/node_modules/react-native-vision-camera/lib/typescript/specs/CameraViewNativeComponent.d.ts +new file mode 100644 +index 0000000..f919d3c +--- /dev/null ++++ b/node_modules/react-native-vision-camera/lib/typescript/specs/CameraViewNativeComponent.d.ts +@@ -0,0 +1,107 @@ ++/// ++/// ++import type {HostComponent, ViewProps} from 'react-native'; ++import type {DirectEventHandler, Double, Int32} from 'react-native/Libraries/Types/CodegenTypes'; ++ ++export type VisionCameraComponentType = HostComponent; ++export interface NativeProps extends ViewProps { ++ enableGpuBuffers: boolean; ++ androidPreviewViewType?: string; ++ cameraId: string; ++ enableFrameProcessor: boolean; ++ enableLocation: boolean; ++ enableBufferCompression: boolean; ++ photoQualityBalance: string; ++ isActive: boolean; ++ photo?: boolean; ++ video?: boolean; ++ audio?: boolean; ++ torch?: string; ++ zoom?: Double; ++ exposure?: Double; ++ enableZoomGesture?: boolean; ++ enableFpsGraph?: boolean; ++ resizeMode?: string; ++ format?: Readonly<{ ++ supportsDepthCapture?: boolean; ++ photoHeight: Double; ++ photoWidth: Double; ++ videoHeight: Double; ++ videoWidth: Double; ++ maxISO: Double; ++ minISO: Double; ++ maxFps: Double; ++ minFps: Double; ++ fieldOfView: Double; ++ supportsVideoHDR: boolean; ++ supportsPhotoHDR: boolean; ++ autoFocusSystem: string; ++ videoStabilizationModes: string[]; ++ pixelFormats: string[]; ++ }>; ++ pixelFormat: string; ++ fps?: Int32; ++ videoHdr?: boolean; ++ photoHdr?: boolean; ++ lowLightBoost?: boolean; ++ videoStabilizationMode?: string; ++ enableDepthData?: boolean; ++ enablePortraitEffectsMatteDelivery?: boolean; ++ orientation?: string; ++ codeScannerOptions?: Readonly<{ ++ codeTypes?: string[]; ++ interval?: Double; ++ regionOfInterest?: Readonly<{ ++ x?: Double; ++ y?: Double; ++ width?: Double; ++ height?: Double; ++ }>; ++ }>; ++ onCodeScanned?: DirectEventHandler< ++ Readonly<{ ++ codes?: Readonly<{ ++ type?: string; ++ value?: string; ++ frame?: Readonly<{ ++ x: Double; ++ y: Double; ++ width: Double; ++ height: Double; ++ }>; ++ }>; ++ frame?: Readonly<{ ++ width: Int32; ++ height: Int32; ++ }>; ++ corners?: Readonly<{ ++ x: Double; ++ y: Double; ++ }>; ++ }> ++ >; ++ onShutter?: DirectEventHandler< ++ Readonly<{ ++ type: string; ++ }> ++ >; ++ onStarted?: DirectEventHandler>; ++ onStopped?: DirectEventHandler>; ++ onInitialized?: DirectEventHandler>; ++ onError?: DirectEventHandler< ++ Readonly<{ ++ code: string; ++ message: string; ++ cause: Readonly<{ ++ code: string; ++ domain: string; ++ message: string; ++ details: string; ++ }>; ++ }> ++ >; ++ onViewReady: DirectEventHandler>; ++} ++declare const _default: import('react-native/Libraries/Utilities/codegenNativeComponent').NativeComponentType; ++export default _default; ++//# sourceMappingURL=CameraViewNativeComponent.d.ts.map +diff --git a/node_modules/react-native-vision-camera/lib/typescript/specs/CameraViewNativeComponent.d.ts.map b/node_modules/react-native-vision-camera/lib/typescript/specs/CameraViewNativeComponent.d.ts.map +new file mode 100644 +index 0000000..61fb28a +--- /dev/null ++++ b/node_modules/react-native-vision-camera/lib/typescript/specs/CameraViewNativeComponent.d.ts.map +@@ -0,0 +1,10 @@ ++{ ++ "version": 3, ++ "file": "CameraViewNativeComponent.d.ts", ++ "sourceRoot": "", ++ "sources": [ ++ "../../../src/specs/CameraViewNativeComponent.ts" ++ ], ++ "names": [], ++ "mappings": "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" ++} +diff --git a/node_modules/react-native-vision-camera/src/Camera.tsx b/node_modules/react-native-vision-camera/src/Camera.tsx +index afe056a..2c82a0b 100644 +--- a/node_modules/react-native-vision-camera/src/Camera.tsx ++++ b/node_modules/react-native-vision-camera/src/Camera.tsx +@@ -1,45 +1,38 @@ +-import React from 'react' +-import { findNodeHandle, StyleSheet } from 'react-native' +-import type { CameraDevice } from './types/CameraDevice' +-import type { CameraCaptureError } from './CameraError' +-import { CameraRuntimeError, tryParseNativeCameraError, isErrorWithCause } from './CameraError' +-import type { CameraProps, DrawableFrameProcessor, OnShutterEvent, ReadonlyFrameProcessor } from './types/CameraProps' +-import { CameraModule } from './NativeCameraModule' +-import type { PhotoFile, TakePhotoOptions } from './types/PhotoFile' +-import type { Point } from './types/Point' +-import type { RecordVideoOptions, VideoFile } from './types/VideoFile' +-import { VisionCameraProxy } from './frame-processors/VisionCameraProxy' +-import { CameraDevices } from './CameraDevices' +-import type { EmitterSubscription, NativeSyntheticEvent, NativeMethods } from 'react-native' +-import type { TakeSnapshotOptions } from './types/Snapshot' +-import { SkiaCameraCanvas } from './skia/SkiaCameraCanvas' +-import type { Frame } from './types/Frame' +-import { FpsGraph, MAX_BARS } from './FpsGraph' +-import type { +- AverageFpsChangedEvent, +- NativeCameraViewProps, +- OnCodeScannedEvent, +- OnErrorEvent, +- OutputOrientationChangedEvent, +- PreviewOrientationChangedEvent, +-} from './NativeCameraView' +-import { NativeCameraView } from './NativeCameraView' +-import { RotationHelper } from './RotationHelper' ++import React from 'react'; ++import {findNodeHandle, StyleSheet} from 'react-native'; ++import type {EmitterSubscription, NativeMethods, NativeSyntheticEvent} from 'react-native'; ++import {CameraDevices} from './CameraDevices'; ++import type {CameraCaptureError} from './CameraError'; ++import {CameraRuntimeError, isErrorWithCause, tryParseNativeCameraError} from './CameraError'; ++import {FpsGraph, MAX_BARS} from './FpsGraph'; ++import {VisionCameraProxy} from './frame-processors/VisionCameraProxy'; ++import {CameraModule} from './NativeCameraModule'; ++import type {AverageFpsChangedEvent, NativeCameraViewProps, OnCodeScannedEvent, OnErrorEvent, OutputOrientationChangedEvent, PreviewOrientationChangedEvent} from './NativeCameraView'; ++import {NativeCameraView} from './NativeCameraView'; ++import {RotationHelper} from './RotationHelper'; ++import {SkiaCameraCanvas} from './skia/SkiaCameraCanvas'; ++import type {CameraDevice} from './types/CameraDevice'; ++import type {CameraProps, DrawableFrameProcessor, OnShutterEvent, ReadonlyFrameProcessor} from './types/CameraProps'; ++import type {Frame} from './types/Frame'; ++import type {PhotoFile, TakePhotoOptions} from './types/PhotoFile'; ++import type {Point} from './types/Point'; ++import type {TakeSnapshotOptions} from './types/Snapshot'; ++import type {RecordVideoOptions, VideoFile} from './types/VideoFile'; + + //#region Types +-export type CameraPermissionStatus = 'granted' | 'not-determined' | 'denied' | 'restricted' +-export type CameraPermissionRequestResult = 'granted' | 'denied' ++export type CameraPermissionStatus = 'granted' | 'not-determined' | 'denied' | 'restricted'; ++export type CameraPermissionRequestResult = 'granted' | 'denied'; + +-type NativeRecordVideoOptions = Omit +-type RefType = React.Component & Readonly ++type NativeRecordVideoOptions = Omit; ++type RefType = React.Component & Readonly; + interface CameraState { +- isRecordingWithFlash: boolean +- averageFpsSamples: number[] ++ isRecordingWithFlash: boolean; ++ averageFpsSamples: number[]; + } + //#endregion + + function isSkiaFrameProcessor(frameProcessor?: ReadonlyFrameProcessor | DrawableFrameProcessor): frameProcessor is DrawableFrameProcessor { +- return frameProcessor?.type === 'drawable-skia' ++ return frameProcessor?.type === 'drawable-skia'; + } + + //#region Camera Component +@@ -76,627 +69,629 @@ function isSkiaFrameProcessor(frameProcessor?: ReadonlyFrameProcessor | Drawable + * @component + */ + export class Camera extends React.PureComponent { +- /** @internal */ +- static displayName = 'Camera' +- /** @internal */ +- displayName = Camera.displayName +- private lastFrameProcessor: ((frame: Frame) => void) | undefined +- private isNativeViewMounted = false +- private lastUIRotation: number | undefined = undefined +- private rotationHelper = new RotationHelper() +- +- private readonly ref: React.RefObject +- +- /** @internal */ +- constructor(props: CameraProps) { +- super(props) +- this.onViewReady = this.onViewReady.bind(this) +- this.onAverageFpsChanged = this.onAverageFpsChanged.bind(this) +- this.onInitialized = this.onInitialized.bind(this) +- this.onStarted = this.onStarted.bind(this) +- this.onStopped = this.onStopped.bind(this) +- this.onPreviewStarted = this.onPreviewStarted.bind(this) +- this.onPreviewStopped = this.onPreviewStopped.bind(this) +- this.onShutter = this.onShutter.bind(this) +- this.onOutputOrientationChanged = this.onOutputOrientationChanged.bind(this) +- this.onPreviewOrientationChanged = this.onPreviewOrientationChanged.bind(this) +- this.onError = this.onError.bind(this) +- this.onCodeScanned = this.onCodeScanned.bind(this) +- this.ref = React.createRef() +- this.lastFrameProcessor = undefined +- this.state = { +- isRecordingWithFlash: false, +- averageFpsSamples: [], +- } +- } +- +- private get handle(): number { +- const nodeHandle = findNodeHandle(this.ref.current) +- if (nodeHandle == null || nodeHandle === -1) { +- throw new CameraRuntimeError( +- 'system/view-not-found', +- "Could not get the Camera's native view tag! Does the Camera View exist in the native view-tree?", +- ) +- } +- +- return nodeHandle +- } +- +- //#region View-specific functions (UIViewManager) +- /** +- * Take a single photo and write it's content to a temporary file. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while capturing the photo. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * @example +- * ```ts +- * const photo = await camera.current.takePhoto({ +- * flash: 'on', +- * enableAutoRedEyeReduction: true +- * }) +- * ``` +- */ +- public async takePhoto(options?: TakePhotoOptions): Promise { +- try { +- return await CameraModule.takePhoto(this.handle, options ?? {}) +- } catch (e) { +- throw tryParseNativeCameraError(e) +- } +- } +- +- /** +- * Captures a snapshot of the Camera view and write it's content to a temporary file. +- * +- * - On iOS, `takeSnapshot` waits for a Frame from the video pipeline and therefore requires `video` to be enabled. +- * - On Android, `takeSnapshot` performs a GPU view screenshot from the preview view. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while capturing the photo. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * @example +- * ```ts +- * const snapshot = await camera.current.takeSnapshot({ +- * quality: 100 +- * }) +- * ``` +- */ +- public async takeSnapshot(options?: TakeSnapshotOptions): Promise { +- try { +- return await CameraModule.takeSnapshot(this.handle, options ?? {}) +- } catch (e) { +- throw tryParseNativeCameraError(e) +- } +- } +- +- private getBitRateMultiplier(bitRate: CameraProps['videoBitRate']): number { +- if (typeof bitRate === 'number' || bitRate == null) return 1 +- switch (bitRate) { +- case 'extra-low': +- return 0.6 +- case 'low': +- return 0.8 +- case 'normal': +- return 1 +- case 'high': +- return 1.2 +- case 'extra-high': +- return 1.4 +- } +- } +- +- /** +- * Start a new video recording. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while starting the video recording. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * +- * @example +- * ```ts +- * camera.current.startRecording({ +- * onRecordingFinished: (video) => console.log(video), +- * onRecordingError: (error) => console.error(error), +- * }) +- * setTimeout(() => { +- * camera.current.stopRecording() +- * }, 5000) +- * ``` +- */ +- public startRecording(options: RecordVideoOptions): void { +- const { onRecordingError, onRecordingFinished, ...passThruOptions } = options +- if (typeof onRecordingError !== 'function' || typeof onRecordingFinished !== 'function') +- throw new CameraRuntimeError('parameter/invalid-parameter', 'The onRecordingError or onRecordingFinished functions were not set!') +- +- if (options.flash === 'on') { +- // Enable torch for video recording +- this.setState({ +- isRecordingWithFlash: true, +- }) +- } +- +- const onRecordCallback = (video?: VideoFile, error?: CameraCaptureError): void => { +- if (this.state.isRecordingWithFlash) { +- // disable torch again if it was enabled +- this.setState({ +- isRecordingWithFlash: false, +- }) +- } +- +- if (error != null) return onRecordingError(error) +- if (video != null) return onRecordingFinished(video) +- } +- +- const nativeRecordVideoOptions: NativeRecordVideoOptions = passThruOptions +- try { +- // TODO: Use TurboModules to make this awaitable. +- CameraModule.startRecording(this.handle, nativeRecordVideoOptions, onRecordCallback) +- } catch (e) { +- throw tryParseNativeCameraError(e) +- } +- } +- +- /** +- * Pauses the current video recording. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while pausing the video recording. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * +- * @example +- * ```ts +- * // Start +- * await camera.current.startRecording({ +- * onRecordingFinished: (video) => console.log(video), +- * onRecordingError: (error) => console.error(error), +- * }) +- * await timeout(1000) +- * // Pause +- * await camera.current.pauseRecording() +- * await timeout(500) +- * // Resume +- * await camera.current.resumeRecording() +- * await timeout(2000) +- * // Stop +- * await camera.current.stopRecording() +- * ``` +- */ +- public async pauseRecording(): Promise { +- try { +- return await CameraModule.pauseRecording(this.handle) +- } catch (e) { +- throw tryParseNativeCameraError(e) +- } +- } +- +- /** +- * Resumes a currently paused video recording. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while resuming the video recording. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * +- * @example +- * ```ts +- * // Start +- * await camera.current.startRecording({ +- * onRecordingFinished: (video) => console.log(video), +- * onRecordingError: (error) => console.error(error), +- * }) +- * await timeout(1000) +- * // Pause +- * await camera.current.pauseRecording() +- * await timeout(500) +- * // Resume +- * await camera.current.resumeRecording() +- * await timeout(2000) +- * // Stop +- * await camera.current.stopRecording() +- * ``` +- */ +- public async resumeRecording(): Promise { +- try { +- return await CameraModule.resumeRecording(this.handle) +- } catch (e) { +- throw tryParseNativeCameraError(e) +- } +- } +- +- /** +- * Stop the current video recording. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while stopping the video recording. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * +- * @example +- * ```ts +- * await camera.current.startRecording({ +- * onRecordingFinished: (video) => console.log(video), +- * onRecordingError: (error) => console.error(error), +- * }) +- * setTimeout(async () => { +- * await camera.current.stopRecording() +- * }, 5000) +- * ``` +- */ +- public async stopRecording(): Promise { +- try { +- return await CameraModule.stopRecording(this.handle) +- } catch (e) { +- throw tryParseNativeCameraError(e) +- } +- } +- +- /** +- * Cancel the current video recording. The temporary video file will be deleted, +- * and the `startRecording`'s `onRecordingError` callback will be invoked with a `capture/recording-canceled` error. +- * +- * @throws {@linkcode CameraCaptureError} When any kind of error occured while canceling the video recording. +- * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error +- * +- * @example +- * ```ts +- * await camera.current.startRecording({ +- * onRecordingFinished: (video) => console.log(video), +- * onRecordingError: (error) => { +- * if (error.code === 'capture/recording-canceled') { +- * // recording was canceled. +- * } else { +- * console.error(error) +- * } +- * }, +- * }) +- * setTimeout(async () => { +- * await camera.current.cancelRecording() +- * }, 5000) +- * ``` +- */ +- public async cancelRecording(): Promise { +- try { +- return await CameraModule.cancelRecording(this.handle) +- } catch (e) { +- throw tryParseNativeCameraError(e) +- } +- } +- +- /** +- * Focus the camera to a specific point in the coordinate system. +- * @param {Point} point The point to focus to. This should be relative +- * to the Camera view's coordinate system and is expressed in points. +- * * `(0, 0)` means **top left**. +- * * `(CameraView.width, CameraView.height)` means **bottom right**. +- * +- * Make sure the value doesn't exceed the CameraView's dimensions. +- * +- * @throws {@linkcode CameraRuntimeError} When any kind of error occured while focussing. +- * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error +- * @example +- * ```ts +- * await camera.current.focus({ +- * x: tapEvent.x, +- * y: tapEvent.y +- * }) +- * ``` +- */ +- public async focus(point: Point): Promise { +- try { +- return await CameraModule.focus(this.handle, point) +- } catch (e) { +- throw tryParseNativeCameraError(e) +- } +- } +- //#endregion +- +- //#region Static Functions (NativeModule) +- /** +- * Get a list of all available camera devices on the current phone. +- * +- * If you use Hooks, use the `useCameraDevices(..)` hook instead. +- * +- * * For Camera Devices attached to the phone, it is safe to assume that this will never change. +- * * For external Camera Devices (USB cameras, Mac continuity cameras, etc.) the available Camera Devices +- * could change over time when the external Camera device gets plugged in or plugged out, so +- * use {@link addCameraDevicesChangedListener | addCameraDevicesChangedListener(...)} to listen for such changes. +- * +- * @example +- * ```ts +- * const devices = Camera.getAvailableCameraDevices() +- * const backCameras = devices.filter((d) => d.position === "back") +- * const frontCameras = devices.filter((d) => d.position === "front") +- * ``` +- */ +- public static getAvailableCameraDevices(): CameraDevice[] { +- return CameraDevices.getAvailableCameraDevices() +- } +- /** +- * Adds a listener that gets called everytime the Camera Devices change, for example +- * when an external Camera Device (USB or continuity Camera) gets plugged in or plugged out. +- * +- * If you use Hooks, use the `useCameraDevices()` hook instead. +- */ +- public static addCameraDevicesChangedListener(listener: (newDevices: CameraDevice[]) => void): EmitterSubscription { +- return CameraDevices.addCameraDevicesChangedListener(listener) +- } +- /** +- * Gets the current Camera Permission Status. Check this before mounting the Camera to ensure +- * the user has permitted the app to use the camera. +- * +- * To actually prompt the user for camera permission, use {@linkcode Camera.requestCameraPermission | requestCameraPermission()}. +- */ +- public static getCameraPermissionStatus(): CameraPermissionStatus { +- return CameraModule.getCameraPermissionStatus() +- } +- /** +- * Gets the current Microphone-Recording Permission Status. +- * Check this before enabling the `audio={...}` property to make sure the +- * user has permitted the app to use the microphone. +- * +- * To actually prompt the user for microphone permission, use {@linkcode Camera.requestMicrophonePermission | requestMicrophonePermission()}. +- */ +- public static getMicrophonePermissionStatus(): CameraPermissionStatus { +- return CameraModule.getMicrophonePermissionStatus() +- } +- /** +- * Gets the current Location Permission Status. +- * Check this before enabling the `location={...}` property to make sure the +- * the user has permitted the app to use the location. +- * +- * To actually prompt the user for location permission, use {@linkcode Camera.requestLocationPermission | requestLocationPermission()}. +- * +- * Note: This method will throw a `system/location-not-enabled` error if the Location APIs are not enabled at build-time. +- * See [the "GPS Location Tags" documentation](https://react-native-vision-camera.com/docs/guides/location) for more information. +- */ +- public static getLocationPermissionStatus(): CameraPermissionStatus { +- return CameraModule.getLocationPermissionStatus() +- } +- /** +- * Shows a "request permission" alert to the user, and resolves with the new camera permission status. +- * +- * If the user has previously blocked the app from using the camera, the alert will not be shown +- * and `"denied"` will be returned. +- * +- * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. +- * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error +- */ +- public static async requestCameraPermission(): Promise { +- try { +- return await CameraModule.requestCameraPermission() +- } catch (e) { +- throw tryParseNativeCameraError(e) +- } +- } +- /** +- * Shows a "request permission" alert to the user, and resolves with the new microphone permission status. +- * +- * If the user has previously blocked the app from using the microphone, the alert will not be shown +- * and `"denied"` will be returned. +- * +- * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. +- * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error +- */ +- public static async requestMicrophonePermission(): Promise { +- try { +- return await CameraModule.requestMicrophonePermission() +- } catch (e) { +- throw tryParseNativeCameraError(e) +- } +- } +- /** +- * Shows a "request permission" alert to the user, and resolves with the new location permission status. +- * +- * If the user has previously blocked the app from using the location, the alert will not be shown +- * and `"denied"` will be returned. +- * +- * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. +- * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error +- */ +- public static async requestLocationPermission(): Promise { +- try { +- return await CameraModule.requestLocationPermission() +- } catch (e) { +- throw tryParseNativeCameraError(e) +- } +- } +- //#endregion +- +- //#region Events (Wrapped to maintain reference equality) +- private onError(event: NativeSyntheticEvent): void { +- const error = event.nativeEvent +- const cause = isErrorWithCause(error.cause) ? error.cause : undefined +- // @ts-expect-error We're casting from unknown bridge types to TS unions, I expect it to hopefully work +- const cameraError = new CameraRuntimeError(error.code, error.message, cause) +- +- if (this.props.onError != null) { +- this.props.onError(cameraError) +- } else { +- // User didn't pass an `onError` handler, so just log it to console +- console.error(cameraError) +- } +- } +- +- private onInitialized(): void { +- this.props.onInitialized?.() +- } +- +- private onStarted(): void { +- this.props.onStarted?.() +- } +- +- private onStopped(): void { +- this.props.onStopped?.() +- } +- +- private onPreviewStarted(): void { +- this.props.onPreviewStarted?.() +- } +- +- private onPreviewStopped(): void { +- this.props.onPreviewStopped?.() +- } +- +- private onShutter(event: NativeSyntheticEvent): void { +- this.props.onShutter?.(event.nativeEvent) +- } +- +- private onOutputOrientationChanged({ nativeEvent: { outputOrientation } }: NativeSyntheticEvent): void { +- this.rotationHelper.outputOrientation = outputOrientation +- this.props.onOutputOrientationChanged?.(outputOrientation) +- this.maybeUpdateUIRotation() +- } +- +- private onPreviewOrientationChanged({ nativeEvent: { previewOrientation } }: NativeSyntheticEvent): void { +- this.rotationHelper.previewOrientation = previewOrientation +- this.props.onPreviewOrientationChanged?.(previewOrientation) +- this.maybeUpdateUIRotation() +- +- if (isSkiaFrameProcessor(this.props.frameProcessor)) { +- // If we have a Skia Frame Processor, we need to update it's orientation so it knows how to render. +- this.props.frameProcessor.previewOrientation.value = previewOrientation +- } +- } +- +- private maybeUpdateUIRotation(): void { +- const uiRotation = this.rotationHelper.uiRotation +- if (uiRotation !== this.lastUIRotation) { +- this.props.onUIRotationChanged?.(uiRotation) +- this.lastUIRotation = uiRotation +- } +- } +- //#endregion +- +- private onCodeScanned(event: NativeSyntheticEvent): void { +- const codeScanner = this.props.codeScanner +- if (codeScanner == null) return +- +- codeScanner.onCodeScanned(event.nativeEvent.codes, event.nativeEvent.frame) +- } +- +- //#region Lifecycle +- private setFrameProcessor(frameProcessor: (frame: Frame) => void): void { +- VisionCameraProxy.setFrameProcessor(this.handle, frameProcessor) +- } +- +- private unsetFrameProcessor(): void { +- VisionCameraProxy.removeFrameProcessor(this.handle) +- } +- +- private onViewReady(): void { +- this.isNativeViewMounted = true +- if (this.props.frameProcessor != null) { +- // user passed a `frameProcessor` but we didn't set it yet because the native view was not mounted yet. set it now. +- this.setFrameProcessor(this.props.frameProcessor.frameProcessor) +- this.lastFrameProcessor = this.props.frameProcessor.frameProcessor +- } +- } +- +- private onAverageFpsChanged({ nativeEvent: { averageFps } }: NativeSyntheticEvent): void { +- this.setState((state) => { +- const averageFpsSamples = [...state.averageFpsSamples, averageFps] +- while (averageFpsSamples.length >= MAX_BARS + 1) { +- // we keep a maximum of 30 FPS samples in our history +- averageFpsSamples.shift() +- } +- +- return { +- ...state, +- averageFpsSamples: averageFpsSamples, +- } +- }) +- } +- +- /** @internal */ +- componentDidUpdate(): void { +- if (!this.isNativeViewMounted) return +- const frameProcessor = this.props.frameProcessor +- if (frameProcessor?.frameProcessor !== this.lastFrameProcessor) { +- // frameProcessor argument identity changed. Update native to reflect the change. +- if (frameProcessor != null) this.setFrameProcessor(frameProcessor.frameProcessor) +- else this.unsetFrameProcessor() +- +- this.lastFrameProcessor = frameProcessor?.frameProcessor +- } +- } +- //#endregion +- +- /** @internal */ +- public render(): React.ReactNode { +- // We remove the big `device` object from the props because we only need to pass `cameraId` to native. +- const { device, frameProcessor, codeScanner, enableFpsGraph, fps, videoBitRate, ...props } = this.props +- +- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition +- if (device == null) { +- throw new CameraRuntimeError( +- 'device/no-device', +- 'Camera: `device` is null! Select a valid Camera device. See: https://mrousavy.com/react-native-vision-camera/docs/guides/devices', +- ) +- } +- +- const shouldEnableBufferCompression = props.video === true && frameProcessor == null +- const torch = this.state.isRecordingWithFlash ? 'on' : props.torch +- const isRenderingWithSkia = isSkiaFrameProcessor(frameProcessor) +- const shouldBeMirrored = device.position === 'front' +- +- // minFps/maxFps is either the fixed `fps` value, or a value from the [min, max] tuple +- const minFps = fps == null ? undefined : typeof fps === 'number' ? fps : fps[0] +- const maxFps = fps == null ? undefined : typeof fps === 'number' ? fps : fps[1] +- +- // bitrate is number (override) or string (multiplier) +- let bitRateMultiplier: number | undefined +- let bitRateOverride: number | undefined +- if (typeof videoBitRate === 'number') { +- // If the user passed an absolute number as a bit-rate, we just use this as a full override. +- bitRateOverride = videoBitRate +- } else if (typeof videoBitRate === 'string' && videoBitRate !== 'normal') { +- // If the user passed 'low'/'normal'/'high', we need to apply this as a multiplier to the native bitrate instead of absolutely setting it +- bitRateMultiplier = this.getBitRateMultiplier(videoBitRate) +- } +- +- return ( +- +- {isRenderingWithSkia && ( +- +- )} +- {enableFpsGraph && ( +- +- )} +- +- ) +- } ++ /** @internal */ ++ static displayName = 'Camera'; ++ /** @internal */ ++ displayName = Camera.displayName; ++ private lastFrameProcessor: ((frame: Frame) => void) | undefined; ++ private isNativeViewMounted = false; ++ private lastUIRotation: number | undefined = undefined; ++ private rotationHelper = new RotationHelper(); ++ ++ private readonly ref: React.RefObject; ++ ++ /** @internal */ ++ constructor(props: CameraProps) { ++ super(props); ++ this.onViewReady = this.onViewReady.bind(this); ++ this.onAverageFpsChanged = this.onAverageFpsChanged.bind(this); ++ this.onInitialized = this.onInitialized.bind(this); ++ this.onStarted = this.onStarted.bind(this); ++ this.onStopped = this.onStopped.bind(this); ++ this.onPreviewStarted = this.onPreviewStarted.bind(this); ++ this.onPreviewStopped = this.onPreviewStopped.bind(this); ++ this.onShutter = this.onShutter.bind(this); ++ this.onOutputOrientationChanged = this.onOutputOrientationChanged.bind(this); ++ this.onPreviewOrientationChanged = this.onPreviewOrientationChanged.bind(this); ++ this.onError = this.onError.bind(this); ++ this.onCodeScanned = this.onCodeScanned.bind(this); ++ this.ref = React.createRef(); ++ this.lastFrameProcessor = undefined; ++ this.state = { ++ isRecordingWithFlash: false, ++ averageFpsSamples: [], ++ }; ++ } ++ ++ private get handle(): number { ++ const nodeHandle = findNodeHandle(this.ref.current); ++ if (nodeHandle == null || nodeHandle === -1) { ++ throw new CameraRuntimeError('system/view-not-found', "Could not get the Camera's native view tag! Does the Camera View exist in the native view-tree?"); ++ } ++ ++ return nodeHandle; ++ } ++ ++ //#region View-specific functions (UIViewManager) ++ /** ++ * Take a single photo and write it's content to a temporary file. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while capturing the photo. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * @example ++ * ```ts ++ * const photo = await camera.current.takePhoto({ ++ * flash: 'on', ++ * enableAutoRedEyeReduction: true ++ * }) ++ * ``` ++ */ ++ public async takePhoto(options?: TakePhotoOptions): Promise { ++ try { ++ return await CameraModule.takePhoto(this.handle, options ?? {}); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } ++ ++ /** ++ * Captures a snapshot of the Camera view and write it's content to a temporary file. ++ * ++ * - On iOS, `takeSnapshot` waits for a Frame from the video pipeline and therefore requires `video` to be enabled. ++ * - On Android, `takeSnapshot` performs a GPU view screenshot from the preview view. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while capturing the photo. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * @example ++ * ```ts ++ * const snapshot = await camera.current.takeSnapshot({ ++ * quality: 100 ++ * }) ++ * ``` ++ */ ++ public async takeSnapshot(options?: TakeSnapshotOptions): Promise { ++ try { ++ return await CameraModule.takeSnapshot(this.handle, options ?? {}); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } ++ ++ private getBitRateMultiplier(bitRate: CameraProps['videoBitRate']): number { ++ if (typeof bitRate === 'number' || bitRate == null) return 1; ++ switch (bitRate) { ++ case 'extra-low': ++ return 0.6; ++ case 'low': ++ return 0.8; ++ case 'normal': ++ return 1; ++ case 'high': ++ return 1.2; ++ case 'extra-high': ++ return 1.4; ++ } ++ } ++ ++ /** ++ * Start a new video recording. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while starting the video recording. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * ++ * @example ++ * ```ts ++ * camera.current.startRecording({ ++ * onRecordingFinished: (video) => console.log(video), ++ * onRecordingError: (error) => console.error(error), ++ * }) ++ * setTimeout(() => { ++ * camera.current.stopRecording() ++ * }, 5000) ++ * ``` ++ */ ++ public startRecording(options: RecordVideoOptions): void { ++ const {onRecordingError, onRecordingFinished, ...passThruOptions} = options; ++ if (typeof onRecordingError !== 'function' || typeof onRecordingFinished !== 'function') ++ throw new CameraRuntimeError('parameter/invalid-parameter', 'The onRecordingError or onRecordingFinished functions were not set!'); ++ ++ if (options.flash === 'on') { ++ // Enable torch for video recording ++ this.setState({ ++ isRecordingWithFlash: true, ++ }); ++ } ++ ++ const onRecordCallback = (video?: VideoFile, error?: CameraCaptureError): void => { ++ if (this.state.isRecordingWithFlash) { ++ // disable torch again if it was enabled ++ this.setState({ ++ isRecordingWithFlash: false, ++ }); ++ } ++ ++ if (error != null) return onRecordingError(error); ++ if (video != null) return onRecordingFinished(video); ++ }; ++ ++ const nativeRecordVideoOptions: NativeRecordVideoOptions = passThruOptions; ++ try { ++ // TODO: Use TurboModules to make this awaitable. ++ CameraModule.startRecording(this.handle, nativeRecordVideoOptions, onRecordCallback); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } ++ ++ /** ++ * Pauses the current video recording. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while pausing the video recording. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * ++ * @example ++ * ```ts ++ * // Start ++ * await camera.current.startRecording({ ++ * onRecordingFinished: (video) => console.log(video), ++ * onRecordingError: (error) => console.error(error), ++ * }) ++ * await timeout(1000) ++ * // Pause ++ * await camera.current.pauseRecording() ++ * await timeout(500) ++ * // Resume ++ * await camera.current.resumeRecording() ++ * await timeout(2000) ++ * // Stop ++ * await camera.current.stopRecording() ++ * ``` ++ */ ++ public async pauseRecording(): Promise { ++ try { ++ return await CameraModule.pauseRecording(this.handle); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } ++ ++ /** ++ * Resumes a currently paused video recording. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while resuming the video recording. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * ++ * @example ++ * ```ts ++ * // Start ++ * await camera.current.startRecording({ ++ * onRecordingFinished: (video) => console.log(video), ++ * onRecordingError: (error) => console.error(error), ++ * }) ++ * await timeout(1000) ++ * // Pause ++ * await camera.current.pauseRecording() ++ * await timeout(500) ++ * // Resume ++ * await camera.current.resumeRecording() ++ * await timeout(2000) ++ * // Stop ++ * await camera.current.stopRecording() ++ * ``` ++ */ ++ public async resumeRecording(): Promise { ++ try { ++ return await CameraModule.resumeRecording(this.handle); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } ++ ++ /** ++ * Stop the current video recording. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while stopping the video recording. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * ++ * @example ++ * ```ts ++ * await camera.current.startRecording({ ++ * onRecordingFinished: (video) => console.log(video), ++ * onRecordingError: (error) => console.error(error), ++ * }) ++ * setTimeout(async () => { ++ * await camera.current.stopRecording() ++ * }, 5000) ++ * ``` ++ */ ++ public async stopRecording(): Promise { ++ try { ++ return await CameraModule.stopRecording(this.handle); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } ++ ++ /** ++ * Cancel the current video recording. The temporary video file will be deleted, ++ * and the `startRecording`'s `onRecordingError` callback will be invoked with a `capture/recording-canceled` error. ++ * ++ * @throws {@linkcode CameraCaptureError} When any kind of error occured while canceling the video recording. ++ * Use the {@linkcode CameraCaptureError.code | code} property to get the actual error ++ * ++ * @example ++ * ```ts ++ * await camera.current.startRecording({ ++ * onRecordingFinished: (video) => console.log(video), ++ * onRecordingError: (error) => { ++ * if (error.code === 'capture/recording-canceled') { ++ * // recording was canceled. ++ * } else { ++ * console.error(error) ++ * } ++ * }, ++ * }) ++ * setTimeout(async () => { ++ * await camera.current.cancelRecording() ++ * }, 5000) ++ * ``` ++ */ ++ public async cancelRecording(): Promise { ++ try { ++ return await CameraModule.cancelRecording(this.handle); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } ++ ++ /** ++ * Focus the camera to a specific point in the coordinate system. ++ * @param {Point} point The point to focus to. This should be relative ++ * to the Camera view's coordinate system and is expressed in points. ++ * * `(0, 0)` means **top left**. ++ * * `(CameraView.width, CameraView.height)` means **bottom right**. ++ * ++ * Make sure the value doesn't exceed the CameraView's dimensions. ++ * ++ * @throws {@linkcode CameraRuntimeError} When any kind of error occured while focussing. ++ * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error ++ * @example ++ * ```ts ++ * await camera.current.focus({ ++ * x: tapEvent.x, ++ * y: tapEvent.y ++ * }) ++ * ``` ++ */ ++ public async focus(point: Point): Promise { ++ try { ++ return await CameraModule.focus(this.handle, point); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } ++ //#endregion ++ ++ //#region Static Functions (NativeModule) ++ /** ++ * Get a list of all available camera devices on the current phone. ++ * ++ * If you use Hooks, use the `useCameraDevices(..)` hook instead. ++ * ++ * * For Camera Devices attached to the phone, it is safe to assume that this will never change. ++ * * For external Camera Devices (USB cameras, Mac continuity cameras, etc.) the available Camera Devices ++ * could change over time when the external Camera device gets plugged in or plugged out, so ++ * use {@link addCameraDevicesChangedListener | addCameraDevicesChangedListener(...)} to listen for such changes. ++ * ++ * @example ++ * ```ts ++ * const devices = Camera.getAvailableCameraDevices() ++ * const backCameras = devices.filter((d) => d.position === "back") ++ * const frontCameras = devices.filter((d) => d.position === "front") ++ * ``` ++ */ ++ public static getAvailableCameraDevices(): CameraDevice[] { ++ return CameraDevices.getAvailableCameraDevices(); ++ } ++ /** ++ * Adds a listener that gets called everytime the Camera Devices change, for example ++ * when an external Camera Device (USB or continuity Camera) gets plugged in or plugged out. ++ * ++ * If you use Hooks, use the `useCameraDevices()` hook instead. ++ */ ++ public static addCameraDevicesChangedListener(listener: (newDevices: CameraDevice[]) => void): EmitterSubscription { ++ return CameraDevices.addCameraDevicesChangedListener(listener); ++ } ++ /** ++ * Gets the current Camera Permission Status. Check this before mounting the Camera to ensure ++ * the user has permitted the app to use the camera. ++ * ++ * To actually prompt the user for camera permission, use {@linkcode Camera.requestCameraPermission | requestCameraPermission()}. ++ */ ++ public static getCameraPermissionStatus(): CameraPermissionStatus { ++ return CameraModule.getCameraPermissionStatus(); ++ } ++ /** ++ * Gets the current Microphone-Recording Permission Status. ++ * Check this before enabling the `audio={...}` property to make sure the ++ * user has permitted the app to use the microphone. ++ * ++ * To actually prompt the user for microphone permission, use {@linkcode Camera.requestMicrophonePermission | requestMicrophonePermission()}. ++ */ ++ public static getMicrophonePermissionStatus(): CameraPermissionStatus { ++ return CameraModule.getMicrophonePermissionStatus(); ++ } ++ /** ++ * Gets the current Location Permission Status. ++ * Check this before enabling the `location={...}` property to make sure the ++ * the user has permitted the app to use the location. ++ * ++ * To actually prompt the user for location permission, use {@linkcode Camera.requestLocationPermission | requestLocationPermission()}. ++ * ++ * Note: This method will throw a `system/location-not-enabled` error if the Location APIs are not enabled at build-time. ++ * See [the "GPS Location Tags" documentation](https://react-native-vision-camera.com/docs/guides/location) for more information. ++ */ ++ public static getLocationPermissionStatus(): CameraPermissionStatus { ++ return CameraModule.getLocationPermissionStatus(); ++ } ++ /** ++ * Shows a "request permission" alert to the user, and resolves with the new camera permission status. ++ * ++ * If the user has previously blocked the app from using the camera, the alert will not be shown ++ * and `"denied"` will be returned. ++ * ++ * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. ++ * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error ++ */ ++ public static async requestCameraPermission(): Promise { ++ try { ++ return await CameraModule.requestCameraPermission(); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } ++ /** ++ * Shows a "request permission" alert to the user, and resolves with the new microphone permission status. ++ * ++ * If the user has previously blocked the app from using the microphone, the alert will not be shown ++ * and `"denied"` will be returned. ++ * ++ * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. ++ * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error ++ */ ++ public static async requestMicrophonePermission(): Promise { ++ try { ++ return await CameraModule.requestMicrophonePermission(); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } ++ /** ++ * Shows a "request permission" alert to the user, and resolves with the new location permission status. ++ * ++ * If the user has previously blocked the app from using the location, the alert will not be shown ++ * and `"denied"` will be returned. ++ * ++ * @throws {@linkcode CameraRuntimeError} When any kind of error occured while requesting permission. ++ * Use the {@linkcode CameraRuntimeError.code | code} property to get the actual error ++ */ ++ public static async requestLocationPermission(): Promise { ++ try { ++ return await CameraModule.requestLocationPermission(); ++ } catch (e) { ++ throw tryParseNativeCameraError(e); ++ } ++ } ++ //#endregion ++ ++ //#region Events (Wrapped to maintain reference equality) ++ private onError(event: NativeSyntheticEvent): void { ++ const error = event.nativeEvent; ++ const cause = isErrorWithCause(error.cause) ? error.cause : undefined; ++ // @ts-expect-error We're casting from unknown bridge types to TS unions, I expect it to hopefully work ++ const cameraError = new CameraRuntimeError(error.code, error.message, cause); ++ ++ if (this.props.onError != null) { ++ this.props.onError(cameraError); ++ } else { ++ // User didn't pass an `onError` handler, so just log it to console ++ console.error(cameraError); ++ } ++ } ++ ++ private onInitialized(): void { ++ this.props.onInitialized?.(); ++ } ++ ++ private onStarted(): void { ++ this.props.onStarted?.(); ++ } ++ ++ private onStopped(): void { ++ this.props.onStopped?.(); ++ } ++ ++ private onPreviewStarted(): void { ++ this.props.onPreviewStarted?.(); ++ } ++ ++ private onPreviewStopped(): void { ++ this.props.onPreviewStopped?.(); ++ } ++ ++ private onShutter(event: NativeSyntheticEvent): void { ++ this.props.onShutter?.(event.nativeEvent); ++ } ++ ++ private onOutputOrientationChanged({nativeEvent: {outputOrientation}}: NativeSyntheticEvent): void { ++ this.rotationHelper.outputOrientation = outputOrientation; ++ this.props.onOutputOrientationChanged?.(outputOrientation); ++ this.maybeUpdateUIRotation(); ++ } ++ ++ private onPreviewOrientationChanged({nativeEvent: {previewOrientation}}: NativeSyntheticEvent): void { ++ this.rotationHelper.previewOrientation = previewOrientation; ++ this.props.onPreviewOrientationChanged?.(previewOrientation); ++ this.maybeUpdateUIRotation(); ++ ++ if (isSkiaFrameProcessor(this.props.frameProcessor)) { ++ // If we have a Skia Frame Processor, we need to update it's orientation so it knows how to render. ++ this.props.frameProcessor.previewOrientation.value = previewOrientation; ++ } ++ } ++ ++ private maybeUpdateUIRotation(): void { ++ const uiRotation = this.rotationHelper.uiRotation; ++ if (uiRotation !== this.lastUIRotation) { ++ this.props.onUIRotationChanged?.(uiRotation); ++ this.lastUIRotation = uiRotation; ++ } ++ } ++ //#endregion ++ ++ private onCodeScanned(event: NativeSyntheticEvent): void { ++ const codeScanner = this.props.codeScanner; ++ if (codeScanner == null) return; ++ ++ codeScanner.onCodeScanned(event.nativeEvent.codes, event.nativeEvent.frame); ++ } ++ ++ //#region Lifecycle ++ private setFrameProcessor(frameProcessor: (frame: Frame) => void): void { ++ VisionCameraProxy.setFrameProcessor(this.handle, frameProcessor); ++ } ++ ++ private unsetFrameProcessor(): void { ++ VisionCameraProxy.removeFrameProcessor(this.handle); ++ } ++ ++ private onViewReady(): void { ++ this.isNativeViewMounted = true; ++ if (this.props.frameProcessor != null) { ++ // user passed a `frameProcessor` but we didn't set it yet because the native view was not mounted yet. set it now. ++ this.setFrameProcessor(this.props.frameProcessor.frameProcessor); ++ this.lastFrameProcessor = this.props.frameProcessor.frameProcessor; ++ } ++ } ++ ++ private onAverageFpsChanged({nativeEvent: {averageFps}}: NativeSyntheticEvent): void { ++ this.setState((state) => { ++ const averageFpsSamples = [...state.averageFpsSamples, averageFps]; ++ while (averageFpsSamples.length >= MAX_BARS + 1) { ++ // we keep a maximum of 30 FPS samples in our history ++ averageFpsSamples.shift(); ++ } ++ ++ return { ++ ...state, ++ averageFpsSamples: averageFpsSamples, ++ }; ++ }); ++ } ++ ++ /** @internal */ ++ componentDidUpdate(): void { ++ if (!this.isNativeViewMounted) return; ++ const frameProcessor = this.props.frameProcessor; ++ if (frameProcessor?.frameProcessor !== this.lastFrameProcessor) { ++ // frameProcessor argument identity changed. Update native to reflect the change. ++ if (frameProcessor != null) this.setFrameProcessor(frameProcessor.frameProcessor); ++ else this.unsetFrameProcessor(); ++ ++ this.lastFrameProcessor = frameProcessor?.frameProcessor; ++ } ++ } ++ //#endregion ++ ++ /** @internal */ ++ public render(): React.ReactNode { ++ // We remove the big `device` object from the props because we only need to pass `cameraId` to native. ++ const {device, frameProcessor, codeScanner, enableFpsGraph, fps, videoBitRate, ...props} = this.props; ++ ++ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition ++ if (device == null) { ++ throw new CameraRuntimeError( ++ 'device/no-device', ++ 'Camera: `device` is null! Select a valid Camera device. See: https://mrousavy.com/react-native-vision-camera/docs/guides/devices', ++ ); ++ } ++ ++ const shouldEnableBufferCompression = props.video === true && frameProcessor == null; ++ const torch = this.state.isRecordingWithFlash ? 'on' : props.torch; ++ const isRenderingWithSkia = isSkiaFrameProcessor(frameProcessor); ++ const shouldBeMirrored = device.position === 'front'; ++ ++ // minFps/maxFps is either the fixed `fps` value, or a value from the [min, max] tuple ++ const minFps = fps == null ? undefined : typeof fps === 'number' ? fps : fps[0]; ++ const maxFps = fps == null ? undefined : typeof fps === 'number' ? fps : fps[1]; ++ ++ // bitrate is number (override) or string (multiplier) ++ let bitRateMultiplier: number | undefined; ++ let bitRateOverride: number | undefined; ++ if (typeof videoBitRate === 'number') { ++ // If the user passed an absolute number as a bit-rate, we just use this as a full override. ++ bitRateOverride = videoBitRate; ++ } else if (typeof videoBitRate === 'string' && videoBitRate !== 'normal') { ++ // If the user passed 'low'/'normal'/'high', we need to apply this as a multiplier to the native bitrate instead of absolutely setting it ++ bitRateMultiplier = this.getBitRateMultiplier(videoBitRate); ++ } ++ ++ return ( ++ ++ {isRenderingWithSkia && ( ++ ++ )} ++ {enableFpsGraph && ( ++ ++ )} ++ ++ ); ++ } + } + //#endregion + + const styles = StyleSheet.create({ +- customPreviewView: { +- flex: 1, +- }, +- fpsGraph: { +- elevation: 1, +- position: 'absolute', +- left: 15, +- top: 30, +- }, +-}) ++ customPreviewView: { ++ flex: 1, ++ }, ++ fpsGraph: { ++ elevation: 1, ++ position: 'absolute', ++ left: 15, ++ top: 30, ++ }, ++}); +diff --git a/node_modules/react-native-vision-camera/src/specs/CameraViewNativeComponent.ts b/node_modules/react-native-vision-camera/src/specs/CameraViewNativeComponent.ts +new file mode 100644 +index 0000000..b2c83cb +--- /dev/null ++++ b/node_modules/react-native-vision-camera/src/specs/CameraViewNativeComponent.ts +@@ -0,0 +1,91 @@ ++/* eslint-disable @typescript-eslint/ban-types */ ++import type {HostComponent, ViewProps} from 'react-native'; ++import type {DirectEventHandler, Double, Int32} from 'react-native/Libraries/Types/CodegenTypes'; ++import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; ++ ++export type VisionCameraComponentType = HostComponent; ++ ++export interface NativeProps extends ViewProps { ++ enableGpuBuffers: boolean; ++ androidPreviewViewType?: string; ++ cameraId: string; ++ enableFrameProcessor: boolean; ++ enableLocation: boolean; ++ enableBufferCompression: boolean; ++ photoQualityBalance: string; ++ isActive: boolean; ++ photo?: boolean; ++ video?: boolean; ++ audio?: boolean; ++ torch?: string; ++ zoom?: Double; ++ exposure?: Double; ++ enableZoomGesture?: boolean; ++ enableFpsGraph?: boolean; ++ resizeMode?: string; ++ format?: Readonly<{ ++ supportsDepthCapture?: boolean; ++ photoHeight: Double; ++ photoWidth: Double; ++ videoHeight: Double; ++ videoWidth: Double; ++ maxISO: Double; ++ minISO: Double; ++ maxFps: Double; ++ minFps: Double; ++ fieldOfView: Double; ++ supportsVideoHDR: boolean; ++ supportsPhotoHDR: boolean; ++ autoFocusSystem: string; ++ videoStabilizationModes: string[]; ++ pixelFormats: string[]; ++ }>; ++ pixelFormat: string; ++ fps?: Int32; ++ videoHdr?: boolean; // not sure why was int on native side ++ photoHdr?: boolean; // not sure why was int on native side ++ lowLightBoost?: boolean; // same ++ videoStabilizationMode?: string; ++ enableDepthData?: boolean; ++ enablePortraitEffectsMatteDelivery?: boolean; ++ orientation?: string; ++ codeScannerOptions?: Readonly<{ ++ codeTypes?: string[]; ++ interval?: Double; ++ regionOfInterest?: Readonly<{ ++ x?: Double; ++ y?: Double; ++ width?: Double; ++ height?: Double; ++ }>; ++ }>; ++ onCodeScanned?: DirectEventHandler< ++ Readonly<{ ++ codes?: Readonly<{ ++ type?: string; ++ value?: string; ++ frame?: Readonly<{x: Double; y: Double; width: Double; height: Double}>; ++ }>; ++ frame?: Readonly<{width: Int32; height: Int32}>; ++ corners?: Readonly<{x: Double; y: Double}>; ++ }> ++ >; ++ onShutter?: DirectEventHandler< ++ Readonly<{ ++ type: string; ++ }> ++ >; ++ onStarted?: DirectEventHandler>; ++ onStopped?: DirectEventHandler>; ++ onInitialized?: DirectEventHandler>; ++ onError?: DirectEventHandler< ++ Readonly<{ ++ code: string; ++ message: string; ++ cause: Readonly<{code: string; domain: string; message: string; details: string}>; ++ }> ++ >; ++ onViewReady: DirectEventHandler>; ++} ++ ++export default codegenNativeComponent('CameraView'); diff --git a/src/CONST.ts b/src/CONST.ts index ee70e3b29668..42c438509ef2 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -101,9 +101,9 @@ const selfGuidedTourTask: OnboardingTask = { const onboardingEmployerOrSubmitMessage: OnboardingMessage = { message: 'Getting paid back is as easy as sending a message. Let’s go over the basics.', video: { - url: `${CLOUDFRONT_URL}/videos/guided-setup-get-paid-back-v2.mp4`, + url: `${CLOUDFRONT_URL}/videos/guided-setup-get-paid-back-v3.mp4`, thumbnailUrl: `${CLOUDFRONT_URL}/images/guided-setup-get-paid-back.jpg`, - duration: 55, + duration: 26, width: 1280, height: 960, }, @@ -146,6 +146,7 @@ const onboardingEmployerOrSubmitMessage: OnboardingMessage = { const combinedTrackSubmitOnboardingEmployerOrSubmitMessage: OnboardingMessage = { ...onboardingEmployerOrSubmitMessage, tasks: [ + selfGuidedTourTask, { type: 'submitExpense', autoCompleted: false, @@ -191,6 +192,7 @@ const onboardingPersonalSpendMessage: OnboardingMessage = { height: 960, }, tasks: [ + selfGuidedTourTask, { type: 'trackExpense', autoCompleted: false, @@ -668,7 +670,6 @@ const CONST = { BETAS: { ALL: 'all', DEFAULT_ROOMS: 'defaultRooms', - DUPE_DETECTION: 'dupeDetection', P2P_DISTANCE_REQUESTS: 'p2pDistanceRequests', SPOTNANA_TRAVEL: 'spotnanaTravel', REPORT_FIELDS_FEATURE: 'reportFieldsFeature', @@ -911,6 +912,8 @@ const CONST = { NEWHELP_URL: 'https://help.expensify.com', INTERNAL_DEV_EXPENSIFY_URL: 'https://www.expensify.com.dev', STAGING_EXPENSIFY_URL: 'https://staging.expensify.com', + DENIED_CAMERA_ACCESS_INSTRUCTIONS_URL: + 'https://help.expensify.com/articles/new-expensify/expenses-&-payments/Create-an-expense#:~:text=How%20can%20I%20enable%20camera%20permission%20for%20a%20website%20on%20mobile%20browsers%3F', BANK_ACCOUNT_PERSONAL_DOCUMENTATION_INFO_URL: 'https://community.expensify.com/discussion/6983/faq-why-do-i-need-to-provide-personal-documentation-when-setting-up-updating-my-bank-account', PERSONAL_DATA_PROTECTION_INFO_URL: 'https://community.expensify.com/discussion/5677/deep-dive-security-how-expensify-protects-your-information', @@ -932,6 +935,7 @@ const CONST = { CONFIGURE_REIMBURSEMENT_SETTINGS_HELP_URL: 'https://help.expensify.com/articles/expensify-classic/workspaces/Configure-Reimbursement-Settings', COPILOT_HELP_URL: 'https://help.expensify.com/articles/expensify-classic/copilots-and-delegates/Assign-or-remove-a-Copilot', DELAYED_SUBMISSION_HELP_URL: 'https://help.expensify.com/articles/expensify-classic/reports/Automatically-submit-employee-reports', + PLAN_TYPES_AND_PRICING_HELP_URL: 'https://help.expensify.com/articles/new-expensify/billing-and-subscriptions/Plan-types-and-pricing', // Use Environment.getEnvironmentURL to get the complete URL with port number DEV_NEW_EXPENSIFY_URL: 'https://dev.new.expensify.com:', NAVATTIC: { @@ -1305,6 +1309,9 @@ const CONST = { SIDEBAR_LOADED: 'sidebar_loaded', LOAD_SEARCH_OPTIONS: 'load_search_options', SEND_MESSAGE: 'send_message', + APPLY_AIRSHIP_UPDATES: 'apply_airship_updates', + APPLY_PUSHER_UPDATES: 'apply_pusher_updates', + APPLY_HTTPS_UPDATES: 'apply_https_updates', COLD: 'cold', WARM: 'warm', REPORT_ACTION_ITEM_LAYOUT_DEBOUNCE_TIME: 1500, @@ -2575,8 +2582,8 @@ const CONST = { }, NAME_USER_FRIENDLY: { netsuite: 'NetSuite', - quickbooksOnline: 'Quickbooks Online', - quickbooksDesktop: 'Quickbooks Desktop', + quickbooksOnline: 'QuickBooks Online', + quickbooksDesktop: 'QuickBooks Desktop', xero: 'Xero', intacct: 'Sage Intacct', financialForce: 'FinancialForce', @@ -3171,6 +3178,7 @@ const CONST = { CANCEL_PAYMENT: 'cancelPayment', UNAPPROVE: 'unapprove', DEBUG: 'debug', + GO_TO_WORKSPACE: 'goToWorkspace', }, EDIT_REQUEST_FIELD: { AMOUNT: 'amount', @@ -3815,8 +3823,8 @@ const CONST = { }, GA: {}, GB: { - regex: /^[A-Z]{1,2}[0-9R][0-9A-Z]?\s*[0-9][A-Z-CIKMOV]{2}$/, - samples: 'LA102UX, BL2F8FX, BD1S9LU, WR4G 6LH', + regex: /^[A-Z]{1,2}[0-9R][0-9A-Z]?\s*([0-9][ABD-HJLNP-UW-Z]{2})?$/, + samples: 'LA102UX, BL2F8FX, BD1S9LU, WR4G 6LH, W1U', }, GD: {}, GE: { @@ -4974,9 +4982,8 @@ const CONST = { '2. Go to *Workspaces*.\n' + '3. Select your workspace.\n' + '4. Click *Categories*.\n' + - '5. Add or import your own categories.\n' + - "6. Disable any default categories you don't need.\n" + - '7. Require a category for every expense in *Settings*.\n' + + "5. Disable any categories you don't need.\n" + + '6. Add your own categories in the top right.\n' + '\n' + `[Take me to workspace category settings](${workspaceCategoriesLink}).`, }, @@ -5056,10 +5063,7 @@ const CONST = { }, ], }, - [onboardingChoices.PERSONAL_SPEND]: { - ...onboardingPersonalSpendMessage, - tasks: [selfGuidedTourTask, ...onboardingPersonalSpendMessage.tasks], - }, + [onboardingChoices.PERSONAL_SPEND]: onboardingPersonalSpendMessage, [onboardingChoices.CHAT_SPLIT]: { message: 'Splitting bills with friends is as easy as sending a message. Here’s how.', video: { @@ -5949,6 +5953,7 @@ const CONST = { MAX_TAX_RATE_INTEGER_PLACES: 4, MAX_TAX_RATE_DECIMAL_PLACES: 4, + MIN_TAX_RATE_DECIMAL_PLACES: 2, DOWNLOADS_PATH: '/Downloads', DOWNLOADS_TIMEOUT: 5000, @@ -5978,6 +5983,8 @@ const CONST = { }, BULK_ACTION_TYPES: { EXPORT: 'export', + APPROVE: 'approve', + PAY: 'pay', HOLD: 'hold', UNHOLD: 'unhold', DELETE: 'delete', @@ -6150,6 +6157,14 @@ const CONST = { description: 'workspace.upgrade.reportFields.description' as const, icon: 'Pencil', }, + categories: { + id: 'categories' as const, + alias: 'categories', + name: 'Categories', + title: 'workspace.upgrade.categories.title' as const, + description: 'workspace.upgrade.categories.description' as const, + icon: 'FolderOpen', + }, [this.POLICY.CONNECTIONS.NAME.NETSUITE]: { id: this.POLICY.CONNECTIONS.NAME.NETSUITE, alias: 'netsuite', @@ -6277,6 +6292,7 @@ const CONST = { RATE_ID: 'rateID', ENABLED: 'enabled', IGNORE: 'ignore', + DESTINATION: 'destination', }, IMPORT_SPREADSHEET: { diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index f97edbd744eb..3c3812774380 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -219,6 +219,9 @@ const ONYXKEYS = { /** The NVP containing all information related to educational tooltip in workspace chat */ NVP_WORKSPACE_TOOLTIP: 'workspaceTooltip', + /** The NVP containing the target url to navigate to when deleting a transaction */ + NVP_DELETE_TRANSACTION_NAVIGATE_BACK_URL: 'nvp_deleteTransactionNavigateBackURL', + /** Whether to show save search rename tooltip */ SHOULD_SHOW_SAVED_SEARCH_RENAME_TOOLTIP: 'shouldShowSavedSearchRenameTooltip', @@ -1012,6 +1015,7 @@ type OnyxValuesMapping = { [ONYXKEYS.NVP_PRIVATE_AMOUNT_OWED]: number; [ONYXKEYS.NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_END]: number; [ONYXKEYS.NVP_WORKSPACE_TOOLTIP]: OnyxTypes.WorkspaceTooltip; + [ONYXKEYS.NVP_DELETE_TRANSACTION_NAVIGATE_BACK_URL]: string | undefined; [ONYXKEYS.NVP_SHOULD_HIDE_GBR_TOOLTIP]: boolean; [ONYXKEYS.NVP_PRIVATE_CANCELLATION_DETAILS]: OnyxTypes.CancellationDetails[]; [ONYXKEYS.ROOM_MEMBERS_USER_SEARCH_PHRASE]: string; diff --git a/src/ROUTES.ts b/src/ROUTES.ts index d8f8b0f91105..a6eb3c1166df 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -156,7 +156,11 @@ const ROUTES = { SETTINGS_ABOUT: 'settings/about', SETTINGS_APP_DOWNLOAD_LINKS: 'settings/about/app-download-links', SETTINGS_WALLET: 'settings/wallet', - SETTINGS_WALLET_VERIFY_ACCOUNT: {route: 'settings/wallet/verify', getRoute: (backTo?: string) => getUrlWithBackToParam('settings/wallet/verify', backTo)}, + SETTINGS_WALLET_VERIFY_ACCOUNT: { + route: 'settings/wallet/verify', + getRoute: (backTo?: string, forwardTo?: string) => + getUrlWithBackToParam(forwardTo ? `settings/wallet/verify?forwardTo=${encodeURIComponent(forwardTo)}` : 'settings/wallet/verify', backTo), + }, SETTINGS_WALLET_DOMAINCARD: { route: 'settings/wallet/card/:cardID?', getRoute: (cardID: string) => `settings/wallet/card/${cardID}` as const, @@ -471,6 +475,11 @@ const ROUTES = { getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') => getUrlWithBackToParam(`${action as string}/${iouType as string}/attendees/${transactionID}/${reportID}`, backTo), }, + MONEY_REQUEST_UPGRADE: { + route: ':action/:iouType/upgrade/:transactionID/:reportID', + getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '') => + getUrlWithBackToParam(`${action as string}/${iouType as string}/upgrade/${transactionID}/${reportID}`, backTo), + }, SETTINGS_TAGS_ROOT: { route: 'settings/:policyID/tags', getRoute: (policyID: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/tags`, backTo), @@ -1295,6 +1304,14 @@ const ROUTES = { route: 'settings/workspaces/:policyID/per-diem', getRoute: (policyID: string) => `settings/workspaces/${policyID}/per-diem` as const, }, + WORKSPACE_PER_DIEM_IMPORT: { + route: 'settings/workspaces/:policyID/per-diem/import', + getRoute: (policyID: string) => `settings/workspaces/${policyID}/per-diem/import` as const, + }, + WORKSPACE_PER_DIEM_IMPORTED: { + route: 'settings/workspaces/:policyID/per-diem/imported', + getRoute: (policyID: string) => `settings/workspaces/${policyID}/per-diem/imported` as const, + }, WORKSPACE_PER_DIEM_SETTINGS: { route: 'settings/workspaces/:policyID/per-diem/settings', getRoute: (policyID: string) => `settings/workspaces/${policyID}/per-diem/settings` as const, diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 5fd64b0fc0d0..e4fa03bf4815 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -199,6 +199,7 @@ const SCREENS = { HOLD: 'Money_Request_Hold_Reason', STEP_CONFIRMATION: 'Money_Request_Step_Confirmation', START: 'Money_Request_Start', + STEP_UPGRADE: 'Money_Request_Step_Upgrade', STEP_AMOUNT: 'Money_Request_Step_Amount', STEP_CATEGORY: 'Money_Request_Step_Category', STEP_CURRENCY: 'Money_Request_Step_Currency', @@ -546,6 +547,8 @@ const SCREENS = { RULES_MAX_EXPENSE_AGE: 'Rules_Max_Expense_Age', RULES_BILLABLE_DEFAULT: 'Rules_Billable_Default', PER_DIEM: 'Per_Diem', + PER_DIEM_IMPORT: 'Per_Diem_Import', + PER_DIEM_IMPORTED: 'Per_Diem_Imported', PER_DIEM_SETTINGS: 'Per_Diem_Settings', }, diff --git a/src/components/AddPaymentCard/PaymentCardForm.tsx b/src/components/AddPaymentCard/PaymentCardForm.tsx index 5aaa23b238f7..9843996602f1 100644 --- a/src/components/AddPaymentCard/PaymentCardForm.tsx +++ b/src/components/AddPaymentCard/PaymentCardForm.tsx @@ -165,10 +165,6 @@ function PaymentCardForm({ errors.addressStreet = translate(label.error.addressStreet); } - if (values.addressZipCode && !ValidationUtils.isValidZipCode(values.addressZipCode)) { - errors.addressZipCode = translate(label.error.addressZipCode); - } - if (!values.acceptTerms) { errors.acceptTerms = translate('common.error.acceptTerms'); } @@ -283,10 +279,9 @@ function PaymentCardForm({ InputComponent={TextInput} defaultValue={data?.addressZipCode} inputID={INPUT_IDS.ADDRESS_ZIP_CODE} - label={translate('common.zip')} - aria-label={translate('common.zip')} + label={translate('common.zipPostCode')} + aria-label={translate('common.zipPostCode')} role={CONST.ROLE.PRESENTATION} - inputMode={CONST.INPUT_MODE.NUMERIC} maxLength={CONST.BANK_ACCOUNT.MAX_LENGTH.ZIP_CODE} containerStyles={[styles.mt5]} /> diff --git a/src/components/AttachmentModal.tsx b/src/components/AttachmentModal.tsx index 207f3eed6f8c..3dc058c6975b 100644 --- a/src/components/AttachmentModal.tsx +++ b/src/components/AttachmentModal.tsx @@ -13,6 +13,7 @@ import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; import addEncryptedAuthTokenToURL from '@libs/addEncryptedAuthTokenToURL'; +import attachmentModalHandler from '@libs/AttachmentModalHandler'; import fileDownload from '@libs/fileDownload'; import * as FileUtils from '@libs/fileDownload/FileUtils'; import Navigation from '@libs/Navigation/Navigation'; @@ -387,7 +388,7 @@ function AttachmentModal({ setIsModalOpen(false); if (typeof onModalClose === 'function') { - onModalClose(); + attachmentModalHandler.handleModalClose(onModalClose); } // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps @@ -491,7 +492,6 @@ function AttachmentModal({ <> { diff --git a/src/components/Attachments/AttachmentCarousel/Pager/index.tsx b/src/components/Attachments/AttachmentCarousel/Pager/index.tsx index e830503d1876..f02867376c7e 100644 --- a/src/components/Attachments/AttachmentCarousel/Pager/index.tsx +++ b/src/components/Attachments/AttachmentCarousel/Pager/index.tsx @@ -70,14 +70,13 @@ function AttachmentCarouselPager( const pageScrollHandler = usePageScrollHandler((e) => { 'worklet'; - // eslint-disable-next-line react-compiler/react-compiler - activePage.value = e.position; - isPagerScrolling.value = e.offset !== 0; + activePage.set(e.position); + isPagerScrolling.set(e.offset !== 0); }, []); useEffect(() => { setActivePageIndex(initialPage); - activePage.value = initialPage; + activePage.set(initialPage); }, [activePage, initialPage]); /** The `pagerItems` object that passed down to the context. Later used to detect current page, whether it's a single image gallery etc. */ @@ -103,7 +102,7 @@ function AttachmentCarouselPager( ); const animatedProps = useAnimatedProps(() => ({ - scrollEnabled: isScrollEnabled.value, + scrollEnabled: isScrollEnabled.get(), })); /** diff --git a/src/components/Attachments/AttachmentCarousel/index.tsx b/src/components/Attachments/AttachmentCarousel/index.tsx index 3a7540f65055..f169416f1812 100644 --- a/src/components/Attachments/AttachmentCarousel/index.tsx +++ b/src/components/Attachments/AttachmentCarousel/index.tsx @@ -253,18 +253,18 @@ function AttachmentCarousel({report, source, onNavigate, setDownloadButtonVisibi Gesture.Pan() .enabled(canUseTouchScreen) .onUpdate(({translationX}) => { - if (!isScrollEnabled.value) { + if (!isScrollEnabled.get()) { return; } if (translationX !== 0) { - isPagerScrolling.value = true; + isPagerScrolling.set(true); } scrollTo(scrollRef, page * cellWidth - translationX, 0, false); }) .onEnd(({translationX, velocityX}) => { - if (!isScrollEnabled.value) { + if (!isScrollEnabled.get()) { return; } @@ -281,7 +281,7 @@ function AttachmentCarousel({report, source, onNavigate, setDownloadButtonVisibi newIndex = Math.min(attachments.length - 1, Math.max(0, page + delta)); } - isPagerScrolling.value = false; + isPagerScrolling.set(false); scrollTo(scrollRef, newIndex * cellWidth, 0, true); }) // eslint-disable-next-line react-compiler/react-compiler diff --git a/src/components/Attachments/AttachmentCarousel/useCarouselContextEvents.ts b/src/components/Attachments/AttachmentCarousel/useCarouselContextEvents.ts index 1c54d7841347..3311f6476194 100644 --- a/src/components/Attachments/AttachmentCarousel/useCarouselContextEvents.ts +++ b/src/components/Attachments/AttachmentCarousel/useCarouselContextEvents.ts @@ -35,12 +35,11 @@ function useCarouselContextEvents(setShouldShowArrows: (show?: SetStateAction { - if (!isScrollEnabled.value) { + if (!isScrollEnabled.get()) { return; } onRequestToggleArrows(); - }, [isScrollEnabled.value, onRequestToggleArrows]); + }, [isScrollEnabled, onRequestToggleArrows]); return {handleTap, handleScaleChange, scale, isScrollEnabled}; } diff --git a/src/components/Attachments/AttachmentView/AttachmentViewPdf/BaseAttachmentViewPdf.tsx b/src/components/Attachments/AttachmentView/AttachmentViewPdf/BaseAttachmentViewPdf.tsx index 7c1d350fc307..4da481809b46 100644 --- a/src/components/Attachments/AttachmentView/AttachmentViewPdf/BaseAttachmentViewPdf.tsx +++ b/src/components/Attachments/AttachmentView/AttachmentViewPdf/BaseAttachmentViewPdf.tsx @@ -58,7 +58,7 @@ function BaseAttachmentViewPdf({ onPressProp(event); } - if (attachmentCarouselPagerContext !== null && isScrollEnabled?.value) { + if (attachmentCarouselPagerContext !== null && isScrollEnabled?.get()) { attachmentCarouselPagerContext.onTap(); } }, diff --git a/src/components/Attachments/AttachmentView/AttachmentViewPdf/index.android.tsx b/src/components/Attachments/AttachmentView/AttachmentViewPdf/index.android.tsx index c6e7984b793f..c756345664cc 100644 --- a/src/components/Attachments/AttachmentView/AttachmentViewPdf/index.android.tsx +++ b/src/components/Attachments/AttachmentView/AttachmentViewPdf/index.android.tsx @@ -32,32 +32,32 @@ function AttachmentViewPdf(props: AttachmentViewPdfProps) { const Pan = Gesture.Pan() .manualActivation(true) .onTouchesMove((evt) => { - if (offsetX.value !== 0 && offsetY.value !== 0 && isScrollEnabled && scale.value === 1) { - const translateX = Math.abs((evt.allTouches.at(0)?.absoluteX ?? 0) - offsetX.value); - const translateY = Math.abs((evt.allTouches.at(0)?.absoluteY ?? 0) - offsetY.value); - const allowEnablingScroll = !isPanGestureActive.value || isScrollEnabled.value; + if (offsetX.get() !== 0 && offsetY.get() !== 0 && isScrollEnabled && scale.get() === 1) { + const translateX = Math.abs((evt.allTouches.at(0)?.absoluteX ?? 0) - offsetX.get()); + const translateY = Math.abs((evt.allTouches.at(0)?.absoluteY ?? 0) - offsetY.get()); + const allowEnablingScroll = !isPanGestureActive.get() || isScrollEnabled.get(); // if the value of X is greater than Y and the pdf is not zoomed in, // enable the pager scroll so that the user // can swipe to the next attachment otherwise disable it. if (translateX > translateY && translateX > SCROLL_THRESHOLD && allowEnablingScroll) { // eslint-disable-next-line react-compiler/react-compiler - isScrollEnabled.value = true; + isScrollEnabled.set(true); } else if (translateY > SCROLL_THRESHOLD) { - isScrollEnabled.value = false; + isScrollEnabled.set(false); } } - isPanGestureActive.value = true; - offsetX.value = evt.allTouches.at(0)?.absoluteX ?? 0; - offsetY.value = evt.allTouches.at(0)?.absoluteY ?? 0; + isPanGestureActive.set(true); + offsetX.set(evt.allTouches.at(0)?.absoluteX ?? 0); + offsetY.set(evt.allTouches.at(0)?.absoluteY ?? 0); }) .onTouchesUp(() => { - isPanGestureActive.value = false; + isPanGestureActive.set(false); if (!isScrollEnabled) { return; } - isScrollEnabled.value = scale.value === 1; + isScrollEnabled.set(scale.get() === 1); }); const Content = useMemo( @@ -69,7 +69,7 @@ function AttachmentViewPdf(props: AttachmentViewPdfProps) { // The react-native-pdf's onScaleChanged event will sometimes give us scale values of e.g. 0.99... instead of 1, // even though we're not pinching/zooming // Rounding the scale value to 2 decimal place fixes this issue, since pinching will still be possible but very small pinches are ignored. - scale.value = Math.round(newScale * 1e2) / 1e2; + scale.set(Math.round(newScale * 1e2) / 1e2); }} /> ), diff --git a/src/components/Attachments/AttachmentView/AttachmentViewVideo/index.tsx b/src/components/Attachments/AttachmentView/AttachmentViewVideo/index.tsx index 4db93266fe0a..e42c1e3e2fb8 100644 --- a/src/components/Attachments/AttachmentView/AttachmentViewVideo/index.tsx +++ b/src/components/Attachments/AttachmentView/AttachmentViewVideo/index.tsx @@ -21,7 +21,7 @@ function AttachmentViewVideo({source, isHovered = false, shouldUseSharedVideoEle shouldUseSharedVideoElement={shouldUseSharedVideoElement && !shouldUseNarrowLayout} isVideoHovered={isHovered} videoDuration={duration} - style={[styles.w100, styles.h100]} + style={[styles.w100, styles.h100, styles.pb5]} /> ); } diff --git a/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx b/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx index 2d22a2560bb0..abc221ed646a 100644 --- a/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx +++ b/src/components/AutoCompleteSuggestions/BaseAutoCompleteSuggestions.tsx @@ -50,24 +50,27 @@ function BaseAutoCompleteSuggestions({ const innerHeight = CONST.AUTO_COMPLETE_SUGGESTER.SUGGESTION_ROW_HEIGHT * suggestions.length; const animatedStyles = useAnimatedStyle(() => ({ - opacity: fadeInOpacity.value, - ...StyleUtils.getAutoCompleteSuggestionContainerStyle(rowHeight.value), + opacity: fadeInOpacity.get(), + ...StyleUtils.getAutoCompleteSuggestionContainerStyle(rowHeight.get()), })); useEffect(() => { if (measuredHeightOfSuggestionRows === prevRowHeightRef.current) { - // eslint-disable-next-line react-compiler/react-compiler - fadeInOpacity.value = withTiming(1, { - duration: 70, - easing: Easing.inOut(Easing.ease), - }); - rowHeight.value = measuredHeightOfSuggestionRows; + fadeInOpacity.set( + withTiming(1, { + duration: 70, + easing: Easing.inOut(Easing.ease), + }), + ); + rowHeight.set(measuredHeightOfSuggestionRows); } else { - fadeInOpacity.value = 1; - rowHeight.value = withTiming(measuredHeightOfSuggestionRows, { - duration: 100, - easing: Easing.bezier(0.25, 0.1, 0.25, 1), - }); + fadeInOpacity.set(1); + rowHeight.set( + withTiming(measuredHeightOfSuggestionRows, { + duration: 100, + easing: Easing.bezier(0.25, 0.1, 0.25, 1), + }), + ); } prevRowHeightRef.current = measuredHeightOfSuggestionRows; @@ -103,7 +106,7 @@ function BaseAutoCompleteSuggestions({ renderItem={renderItem} keyExtractor={keyExtractor} removeClippedSubviews={false} - showsVerticalScrollIndicator={innerHeight > rowHeight.value} + showsVerticalScrollIndicator={innerHeight > rowHeight.get()} extraData={[highlightedSuggestionIndex, renderSuggestionMenuItem]} /> diff --git a/src/components/AutoCompleteSuggestions/index.tsx b/src/components/AutoCompleteSuggestions/index.tsx index 3d1b91dce4b5..9703bb739785 100644 --- a/src/components/AutoCompleteSuggestions/index.tsx +++ b/src/components/AutoCompleteSuggestions/index.tsx @@ -1,9 +1,12 @@ import React, {useEffect} from 'react'; +// The coordinates are based on the App's height, not the device height. +// So we need to get the height from useWindowDimensions to calculate the position correctly. More details: https://github.com/Expensify/App/issues/53180 +// eslint-disable-next-line no-restricted-imports +import {useWindowDimensions} from 'react-native'; import useKeyboardState from '@hooks/useKeyboardState'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useSafeAreaInsets from '@hooks/useSafeAreaInsets'; import useStyleUtils from '@hooks/useStyleUtils'; -import useWindowDimensions from '@hooks/useWindowDimensions'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; import CONST from '@src/CONST'; import AutoCompleteSuggestionsPortal from './AutoCompleteSuggestionsPortal'; @@ -54,7 +57,7 @@ function AutoCompleteSuggestions({measureParentContainerAndReportCu const isSuggestionMenuAboveRef = React.useRef(false); const leftValue = React.useRef(0); const prevLeftValue = React.useRef(0); - const {windowHeight, windowWidth} = useWindowDimensions(); + const {height: windowHeight, width: windowWidth} = useWindowDimensions(); const {shouldUseNarrowLayout} = useResponsiveLayout(); const [suggestionHeight, setSuggestionHeight] = React.useState(0); const [containerState, setContainerState] = React.useState(initialContainerState); @@ -125,6 +128,7 @@ function AutoCompleteSuggestions({measureParentContainerAndReportCu measuredHeight = measureHeightOfSuggestionRows(suggestionsLength, true); bottomValue = windowHeight - y - cursorCoordinates.y + scrollValue - measuredHeight - CONST.AUTO_COMPLETE_SUGGESTER.SUGGESTION_ROW_HEIGHT - keyboardHeight; } + setSuggestionHeight(measuredHeight); setContainerState({ left: leftValue.current, diff --git a/src/components/AvatarCropModal/AvatarCropModal.tsx b/src/components/AvatarCropModal/AvatarCropModal.tsx index 7911255ba49c..3ff9ccc4e3f8 100644 --- a/src/components/AvatarCropModal/AvatarCropModal.tsx +++ b/src/components/AvatarCropModal/AvatarCropModal.tsx @@ -97,16 +97,16 @@ function AvatarCropModal({imageUri = '', imageName = '', imageType = '', onClose // Changes the modal state values to initial const resetState = useCallback(() => { - originalImageWidth.value = CONST.AVATAR_CROP_MODAL.INITIAL_SIZE; - originalImageHeight.value = CONST.AVATAR_CROP_MODAL.INITIAL_SIZE; - translateY.value = 0; - translateX.value = 0; - scale.value = CONST.AVATAR_CROP_MODAL.MIN_SCALE; - rotation.value = 0; - translateSlider.value = 0; - prevMaxOffsetX.value = 0; - prevMaxOffsetY.value = 0; - isLoading.value = false; + originalImageWidth.set(CONST.AVATAR_CROP_MODAL.INITIAL_SIZE); + originalImageHeight.set(CONST.AVATAR_CROP_MODAL.INITIAL_SIZE); + translateY.set(0); + translateX.set(0); + scale.set(CONST.AVATAR_CROP_MODAL.MIN_SCALE); + rotation.set(0); + translateSlider.set(0); + prevMaxOffsetX.set(0); + prevMaxOffsetY.set(0); + isLoading.set(false); setImageContainerSize(CONST.AVATAR_CROP_MODAL.INITIAL_SIZE); setSliderContainerSize(CONST.AVATAR_CROP_MODAL.INITIAL_SIZE); setIsImageContainerInitialized(false); @@ -123,12 +123,11 @@ function AvatarCropModal({imageUri = '', imageName = '', imageType = '', onClose ImageSize.getSize(imageUri).then(({width, height, rotation: orginalRotation}) => { // On Android devices ImageSize library returns also rotation parameter. if (orginalRotation === 90 || orginalRotation === 270) { - // eslint-disable-next-line react-compiler/react-compiler - originalImageHeight.value = width; - originalImageWidth.value = height; + originalImageHeight.set(width); + originalImageWidth.set(height); } else { - originalImageHeight.value = height; - originalImageWidth.value = width; + originalImageHeight.set(height); + originalImageWidth.set(width); } setIsImageInitialized(true); @@ -136,8 +135,8 @@ function AvatarCropModal({imageUri = '', imageName = '', imageType = '', onClose // Because the reanimated library has some internal optimizations, // sometimes when the modal is hidden styles of the image and slider might not be updated. // To trigger the update we need to slightly change the following values: - translateSlider.value += 0.01; - rotation.value += 360; + translateSlider.set((value) => value + 0.01); + rotation.set((value) => value + 360); }); }, [imageUri, originalImageHeight, originalImageWidth, rotation, translateSlider]); @@ -156,19 +155,19 @@ function AvatarCropModal({imageUri = '', imageName = '', imageType = '', onClose const getDisplayedImageSize = useCallback(() => { 'worklet'; - let height = imageContainerSize * scale.value; - let width = imageContainerSize * scale.value; + let height = imageContainerSize * scale.get(); + let width = imageContainerSize * scale.get(); // Since the smaller side will be always equal to the imageContainerSize multiplied by scale, // another side can be calculated with aspect ratio. - if (originalImageWidth.value > originalImageHeight.value) { - width *= originalImageWidth.value / originalImageHeight.value; + if (originalImageWidth.get() > originalImageHeight.get()) { + width *= originalImageWidth.get() / originalImageHeight.get(); } else { - height *= originalImageHeight.value / originalImageWidth.value; + height *= originalImageHeight.get() / originalImageWidth.get(); } return {height, width}; - }, [imageContainerSize, scale, originalImageWidth, originalImageHeight]); + }, [imageContainerSize, originalImageHeight, originalImageWidth, scale]); /** * Validates the offset to prevent overflow, and updates the image offset. @@ -180,13 +179,12 @@ function AvatarCropModal({imageUri = '', imageName = '', imageType = '', onClose const {height, width} = getDisplayedImageSize(); const maxOffsetX = (width - imageContainerSize) / 2; const maxOffsetY = (height - imageContainerSize) / 2; - translateX.value = clamp(offsetX, [maxOffsetX * -1, maxOffsetX]); - translateY.value = clamp(offsetY, [maxOffsetY * -1, maxOffsetY]); - // eslint-disable-next-line react-compiler/react-compiler - prevMaxOffsetX.value = maxOffsetX; - prevMaxOffsetY.value = maxOffsetY; + translateX.set(clamp(offsetX, [maxOffsetX * -1, maxOffsetX])); + translateY.set(clamp(offsetY, [maxOffsetY * -1, maxOffsetY])); + prevMaxOffsetX.set(maxOffsetX); + prevMaxOffsetY.set(maxOffsetY); }, - [getDisplayedImageSize, imageContainerSize, translateX, translateY, prevMaxOffsetX, prevMaxOffsetY, clamp], + [getDisplayedImageSize, imageContainerSize, translateX, clamp, translateY, prevMaxOffsetX, prevMaxOffsetY], ); const newScaleValue = useCallback((newSliderValue: number, containerSize: number) => { @@ -201,8 +199,8 @@ function AvatarCropModal({imageUri = '', imageName = '', imageType = '', onClose * and updates image's offset. */ const panGesture = Gesture.Pan().onChange((event) => { - const newX = translateX.value + event.changeX; - const newY = translateY.value + event.changeY; + const newX = translateX.get() + event.changeX; + const newY = translateY.get() + event.changeY; updateImageOffset(newX, newY); }); @@ -211,7 +209,7 @@ function AvatarCropModal({imageUri = '', imageName = '', imageType = '', onClose // when the browser window is resized. useEffect(() => { // If no panning has happened and the value is 0, do an early return. - if (!prevMaxOffsetX.value && !prevMaxOffsetY.value) { + if (!prevMaxOffsetX.get() && !prevMaxOffsetY.get()) { return; } const {height, width} = getDisplayedImageSize(); @@ -221,14 +219,14 @@ function AvatarCropModal({imageUri = '', imageName = '', imageType = '', onClose // Since interpolation is expensive, we only want to do it if // image has been panned across X or Y axis by the user. if (prevMaxOffsetX) { - translateX.value = interpolate(translateX.value, [prevMaxOffsetX.value * -1, prevMaxOffsetX.value], [maxOffsetX * -1, maxOffsetX]); + translateX.set(interpolate(translateX.get(), [prevMaxOffsetX.get() * -1, prevMaxOffsetX.get()], [maxOffsetX * -1, maxOffsetX])); } if (prevMaxOffsetY) { - translateY.value = interpolate(translateY.value, [prevMaxOffsetY.value * -1, prevMaxOffsetY.value], [maxOffsetY * -1, maxOffsetY]); + translateY.set(interpolate(translateY.get(), [prevMaxOffsetY.get() * -1, prevMaxOffsetY.get()], [maxOffsetY * -1, maxOffsetY])); } - prevMaxOffsetX.value = maxOffsetX; - prevMaxOffsetY.value = maxOffsetY; + prevMaxOffsetX.set(maxOffsetX); + prevMaxOffsetY.set(maxOffsetY); }, [getDisplayedImageSize, imageContainerSize, prevMaxOffsetX, prevMaxOffsetY, translateX, translateY]); /** @@ -239,65 +237,69 @@ function AvatarCropModal({imageUri = '', imageName = '', imageType = '', onClose onBegin: () => { 'worklet'; - isPressableEnabled.value = false; + isPressableEnabled.set(false); }, onChange: (event: GestureUpdateEvent) => { 'worklet'; - const newSliderValue = clamp(translateSlider.value + event.changeX, [0, sliderContainerSize]); + const newSliderValue = clamp(translateSlider.get() + event.changeX, [0, sliderContainerSize]); const newScale = newScaleValue(newSliderValue, sliderContainerSize); - const differential = newScale / scale.value; + const differential = newScale / scale.get(); - scale.value = newScale; - translateSlider.value = newSliderValue; + scale.set(newScale); + translateSlider.set(newSliderValue); - const newX = translateX.value * differential; - const newY = translateY.value * differential; + const newX = translateX.get() * differential; + const newY = translateY.get() * differential; updateImageOffset(newX, newY); }, onFinalize: () => { 'worklet'; - isPressableEnabled.value = true; + isPressableEnabled.set(true); }, }; // This effect is needed to prevent the incorrect position of // the slider's knob when the window's layout changes useEffect(() => { - translateSlider.value = interpolate(scale.value, [CONST.AVATAR_CROP_MODAL.MIN_SCALE, CONST.AVATAR_CROP_MODAL.MAX_SCALE], [0, sliderContainerSize]); - }, [scale.value, sliderContainerSize, translateSlider]); + translateSlider.set(interpolate(scale.get(), [CONST.AVATAR_CROP_MODAL.MIN_SCALE, CONST.AVATAR_CROP_MODAL.MAX_SCALE], [0, sliderContainerSize])); + }, [scale, sliderContainerSize, translateSlider]); // Rotates the image by changing the rotation value by 90 degrees // and updating the position so the image remains in the same place after rotation const rotateImage = useCallback(() => { - rotation.value -= 90; + runOnUI(() => { + rotation.set((value) => value - 90); - // Rotating 2d coordinates by applying the formula (x, y) → (-y, x). - [translateX.value, translateY.value] = [translateY.value, translateX.value * -1]; + const oldTranslateX = translateX.get(); + translateX.set(translateY.get()); + translateY.set(oldTranslateX * -1); - // Since we rotated the image by 90 degrees, now width becomes height and vice versa. - [originalImageHeight.value, originalImageWidth.value] = [originalImageWidth.value, originalImageHeight.value]; - }, [originalImageHeight.value, originalImageWidth.value, rotation, translateX.value, translateY.value]); + const oldOriginalImageHeight = originalImageHeight.get(); + originalImageHeight.set(originalImageWidth.get()); + originalImageWidth.set(oldOriginalImageHeight); + })(); + }, [originalImageHeight, originalImageWidth, rotation, translateX, translateY]); // Crops an image that was provided in the imageUri prop, using the current position/scale // then calls onSave and onClose callbacks const cropAndSaveImage = useCallback(() => { - if (isLoading.value) { + if (isLoading.get()) { return; } - isLoading.value = true; - const smallerSize = Math.min(originalImageHeight.value, originalImageWidth.value); - const size = smallerSize / scale.value; - const imageCenterX = originalImageWidth.value / 2; - const imageCenterY = originalImageHeight.value / 2; + isLoading.set(true); + const smallerSize = Math.min(originalImageHeight.get(), originalImageWidth.get()); + const size = smallerSize / scale.get(); + const imageCenterX = originalImageWidth.get() / 2; + const imageCenterY = originalImageHeight.get() / 2; const apothem = size / 2; // apothem for squares is equals to half of it size // Since the translate value is only a distance from the image center, we are able to calculate // the originX and the originY - start coordinates of cropping view. - const originX = imageCenterX - apothem - (translateX.value / imageContainerSize / scale.value) * smallerSize; - const originY = imageCenterY - apothem - (translateY.value / imageContainerSize / scale.value) * smallerSize; + const originX = imageCenterX - apothem - (translateX.get() / imageContainerSize / scale.get()) * smallerSize; + const originY = imageCenterY - apothem - (translateY.get() / imageContainerSize / scale.get()) * smallerSize; const crop = { height: size, @@ -312,29 +314,15 @@ function AvatarCropModal({imageUri = '', imageName = '', imageType = '', onClose const name = isSvg ? 'fileName.png' : imageName; const type = isSvg ? 'image/png' : imageType; - cropOrRotateImage(imageUri, [{rotate: rotation.value % 360}, {crop}], {compress: 1, name, type}) + cropOrRotateImage(imageUri, [{rotate: rotation.get() % 360}, {crop}], {compress: 1, name, type}) .then((newImage) => { onClose?.(); onSave?.(newImage); }) .catch(() => { - isLoading.value = false; + isLoading.set(false); }); - }, [ - imageUri, - imageName, - imageType, - onClose, - onSave, - originalImageHeight.value, - originalImageWidth.value, - scale.value, - translateX.value, - imageContainerSize, - translateY.value, - rotation.value, - isLoading, - ]); + }, [isLoading, originalImageHeight, originalImageWidth, scale, translateX, imageContainerSize, translateY, imageType, imageName, imageUri, rotation, onClose, onSave]); const sliderOnPress = (locationX: number) => { // We are using the worklet directive here and running on the UI thread to ensure the Reanimated @@ -342,17 +330,16 @@ function AvatarCropModal({imageUri = '', imageName = '', imageType = '', onClose 'worklet'; - if (!locationX || !isPressableEnabled.value) { + if (!locationX || !isPressableEnabled.get()) { return; } const newSliderValue = clamp(locationX, [0, sliderContainerSize]); const newScale = newScaleValue(newSliderValue, sliderContainerSize); - // eslint-disable-next-line react-compiler/react-compiler - translateSlider.value = newSliderValue; - const differential = newScale / scale.value; - scale.value = newScale; - const newX = translateX.value * differential; - const newY = translateY.value * differential; + translateSlider.set(newSliderValue); + const differential = newScale / scale.get(); + scale.set(newScale); + const newX = translateX.get() * differential; + const newY = translateY.get() * differential; updateImageOffset(newX, newY); }; diff --git a/src/components/AvatarCropModal/ImageCropView.tsx b/src/components/AvatarCropModal/ImageCropView.tsx index 5bfb0d5f6557..1f11986a99f9 100644 --- a/src/components/AvatarCropModal/ImageCropView.tsx +++ b/src/components/AvatarCropModal/ImageCropView.tsx @@ -59,12 +59,12 @@ function ImageCropView({imageUri = '', containerSize = 0, panGesture = Gesture.P const imageStyle = useAnimatedStyle(() => { 'worklet'; - const height = originalImageHeight.value; - const width = originalImageWidth.value; + const height = originalImageHeight.get(); + const width = originalImageWidth.get(); const aspectRatio = height > width ? height / width : width / height; - const rotate = interpolate(rotation.value, [0, 360], [0, 360]); + const rotate = interpolate(rotation.get(), [0, 360], [0, 360]); return { - transform: [{translateX: translateX.value}, {translateY: translateY.value}, {scale: scale.value * aspectRatio}, {rotate: `${rotate}deg`}], + transform: [{translateX: translateX.get()}, {translateY: translateY.get()}, {scale: scale.get() * aspectRatio}, {rotate: `${rotate}deg`}], }; }, [originalImageHeight, originalImageWidth, rotation, translateX, translateY, scale]); diff --git a/src/components/AvatarCropModal/Slider.tsx b/src/components/AvatarCropModal/Slider.tsx index bac581da25e6..2f8a8fb6ef53 100644 --- a/src/components/AvatarCropModal/Slider.tsx +++ b/src/components/AvatarCropModal/Slider.tsx @@ -34,7 +34,7 @@ function Slider({sliderValue, gestureCallbacks}: SliderProps) { 'worklet'; return { - transform: [{translateX: sliderValue.value}], + transform: [{translateX: sliderValue.get()}], }; }); diff --git a/src/components/Banner.tsx b/src/components/Banner.tsx index 0ae3afbf98bb..8ca56da524b2 100644 --- a/src/components/Banner.tsx +++ b/src/components/Banner.tsx @@ -8,6 +8,7 @@ import useThemeStyles from '@hooks/useThemeStyles'; import getButtonState from '@libs/getButtonState'; import CONST from '@src/CONST'; import type IconAsset from '@src/types/utils/IconAsset'; +import Button from './Button'; import Hoverable from './Hoverable'; import Icon from './Icon'; import * as Expensicons from './Icon/Expensicons'; @@ -46,6 +47,12 @@ type BannerProps = { /** Styles to be assigned to the Banner text */ textStyles?: StyleProp; + + /** Whether to display button in the banner */ + shouldShowButton?: boolean; + + /** Callback called when pressing the button */ + onButtonPress?: () => void; }; function Banner({ @@ -54,11 +61,13 @@ function Banner({ icon = Expensicons.Exclamation, onClose, onPress, + onButtonPress, containerStyles, textStyles, shouldRenderHTML = false, shouldShowIcon = false, shouldShowCloseButton = false, + shouldShowButton = false, }: BannerProps) { const theme = useTheme(); const styles = useThemeStyles(); @@ -68,7 +77,7 @@ function Banner({ return ( {(isHovered) => { - const isClickable = onClose ?? onPress; + const isClickable = onClose && onPress; const shouldHighlight = isClickable && isHovered; return ( ))} + {shouldShowButton && ( +