diff --git a/.github/ISSUE_TEMPLATE/onboarding-request-engineering.yml b/.github/ISSUE_TEMPLATE/onboarding-request-engineering.yml index 089106da503..284e92a6339 100644 --- a/.github/ISSUE_TEMPLATE/onboarding-request-engineering.yml +++ b/.github/ISSUE_TEMPLATE/onboarding-request-engineering.yml @@ -1,7 +1,7 @@ name: Onboarding Request (Engineering) description: Fill out this form to request initiation of engineering onboarding for title: "Onboarding: [name]" -labels: [ onboarding ] +labels: [ user-onboarding ] assignees: timwright12 body: - type: markdown diff --git a/.github/ISSUE_TEMPLATE/release_ticket.md b/.github/ISSUE_TEMPLATE/release_ticket.md index 64c24e0fd64..faa9246b6d8 100644 --- a/.github/ISSUE_TEMPLATE/release_ticket.md +++ b/.github/ISSUE_TEMPLATE/release_ticket.md @@ -3,7 +3,7 @@ name: Release Review Template about: Template for requesting a production release for VA mobile app title: "{{ env.releaseDate }} Release Sign-Off: {{ env.versionNumber }}" labels: release -assignees: timwright12, chrisj-usds, drjecker, dumathane, rachelhanster, kellylein, DonMcCaugheyUSDS, TKDickson +assignees: timwright12, chrisj-usds, dumathane, rachelhanster, kellylein, DonMcCaugheyUSDS, TKDickson --- diff --git a/.github/workflows/documentation_accessibility_checks.yml b/.github/workflows/documentation_accessibility_checks.yml index dfce804cd6e..ba349c755e8 100644 --- a/.github/workflows/documentation_accessibility_checks.yml +++ b/.github/workflows/documentation_accessibility_checks.yml @@ -18,15 +18,15 @@ jobs: run: npm cache clean --force - name: Install Axe CLI globally run: npm install -g @axe-core/cli@latest - - name: Update npm + - name: Update npm run: npm install -g npm@latest - uses: actions/setup-node@v3 with: node-version-file: 'VAMobile/.nvmrc' cache: yarn cache-dependency-path: VAMobile/yarn.lock - - name: Install ChromeDriver - run: npm install -g chromedriver@126.0.0 + - name: Install latest version of chromeDriver + run: npm install -g chromedriver@latest - name: Test build working-directory: VAMobile run: | diff --git a/.github/workflows/e2e_android.yml b/.github/workflows/e2e_android.yml index 07079320794..c7b675e39a0 100644 --- a/.github/workflows/e2e_android.yml +++ b/.github/workflows/e2e_android.yml @@ -30,16 +30,20 @@ on: description: 'Add results to testRail?' type: boolean required: false - device_specific: - description: 'Is your testRail run Android only? (only check if adding results to testRail)' - type: boolean - required: false schedule: - cron: '0 4 * * 1,2,3,4,5' workflow_run: workflows: ['[Release] New Release Issue'] types: - in_progress + workflow_call: + secrets: + TEST_RAIL_USER: + description: "TestRail robot userid" + required: true + TEST_RAIL_KEY: + description: "TestRail api key" + required: true concurrency: group: android-detox-${{ github.ref }} @@ -343,7 +347,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} id: create-issue - matrix-send_test_results_to_testrail: + matrix_send_test_results_to_testrail: if: (!cancelled()) && github.event.inputs.run_testRail == 'true' needs: [matrix-e2e-android, output_detox_tests_to_run] strategy: @@ -356,6 +360,66 @@ jobs: with: test_names: "${{matrix.testsuite}}" testRail_name: ${{ inputs.testRail_name }} - test_specific_OS_needed: ${{ inputs.device_specific}} test_OS_name: "Android" secrets: inherit + + update-test-names: + if: (!cancelled()) && github.event.inputs.run_testRail == 'true' + needs: [matrix-e2e-android, output_detox_tests_to_run, matrix_send_test_results_to_testrail] + continue-on-error: false + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: update-test-names + run: | + for ((i=0; ; i+=250)); do + echo "i = $i" + getTestCaseNewName=$(curl -X GET -H 'Content-Type: application/json' \ + -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ + "https://dsvavsp.testrail.io//index.php?/api/v2/get_tests/${{ needs.matrix_send_test_results_to_testrail.outputs.test_run_id_number }}&offset=$i") + echo $(jq --compact-output '[.tests[] | .title |= sub("(]).*$"; "]")]' <<< "$getTestCaseNewName") >> input.json + if [[ $(jq '._links.next == null' <<< "$getTestCaseNewName") == 'true' ]]; + then + break + fi + done + getTestCaseNewName=$(jq --compact-output -s 'add' input.json) + groupTestCasesByTitle=$(echo $getTestCaseNewName | jq --compact-output '[group_by(.title)[] | [.[0].title, .[0].status_id, map(.id)[]]]') + getFirstTestNewName=$(echo $groupTestCasesByTitle | jq --compact-output '[.[] | .[0]]') + getCasesID=$(curl -X GET -H 'Content-Type: application/json' \ + -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ + "https://dsvavsp.testrail.io//index.php?/api/v2/get_cases/29") + updateRunWithNewCases=$(curl -X POST -H 'Content-Type: application/json' \ + -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ + -d '{"suite_id": 92, "include_all": false, "case_ids": '$(echo $getCasesID | jq --argjson testRailNames "$getFirstTestNewName" --compact-output '.cases | map(select(.title == $testRailNames[])) | map(.id)')'}' \ + "https://dsvavsp.testrail.io//index.php?/api/v2/update_run/${{needs.matrix_send_test_results_to_testrail.outputs.test_run_id_number}}") + getTestCases=$(curl -X GET -H 'Content-Type: application/json' \ + -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ + "https://dsvavsp.testrail.io//index.php?/api/v2/get_tests/${{needs.matrix_send_test_results_to_testrail.outputs.test_run_id_number}}") + for i in $(echo $getTestCases | jq -r '.tests[].id'); do + getTestName=$(echo $getTestCases | jq --argjson testIDs "$i" -r '.tests | map(select(.id == $testIDs)) | .[0].title') + + getFailedTests=$(echo $getTestCaseNewName | jq --compact-output 'map(select(.status_id == 5)) | map(.title)') + isTestFailed=$(echo $getFailedTests | jq 'any(. == "'"$getTestName"'")') + getRetestTests=$(echo $getTestCaseNewName | jq --compact-output 'map(select(.status_id == 4)) | map(.title)') + isTestRetest=$(echo $getRetestTests | jq 'any(. == "'"$getTestName"'")') + getPassedTests=$(echo $getTestCaseNewName | jq --compact-output 'map(select(.status_id == 1)) | map(.title)') + isTestPassed=$(echo $getPassedTests | jq 'any(. == "'"$getTestName"'")') + if [[ "$isTestFailed" == "true" ]]; then + resp5=$(curl -X POST -H 'Content-Type: application/json' \ + -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ + -d '{"status_id": 5}' \ + "https://dsvavsp.testrail.io//index.php?/api/v2/add_result/"$i"") + elif [[ "$isTestRetest" == "true" ]]; then + resp5=$(curl -X POST -H 'Content-Type: application/json' \ + -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ + -d '{"status_id": 4}' \ + "https://dsvavsp.testrail.io//index.php?/api/v2/add_result/"$i"") + elif [[ "$isTestPassed" == "true" ]]; then + resp5=$(curl -X POST -H 'Content-Type: application/json' \ + -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ + -d '{"status_id": 1}' \ + "https://dsvavsp.testrail.io//index.php?/api/v2/add_result/"$i"") + fi + done diff --git a/.github/workflows/e2e_detox_mapping.yml b/.github/workflows/e2e_detox_mapping.yml index 366a531c42a..000c07e8344 100644 --- a/.github/workflows/e2e_detox_mapping.yml +++ b/.github/workflows/e2e_detox_mapping.yml @@ -68,32 +68,32 @@ jobs: id: testing_matrix run: | resp=$(echo ${{steps.changed_files_dir.outputs.all_changed_and_modified_files}} | - jq 'select(contains(["Login"])) += ["LoginScreen"] | - select(contains(["AppealsDetailsScreen"])) += ["Appeals", "AppealsExpanded"] | + jq 'select(contains(["LoginScreen"])) += ["LoginScreen"] | + select(contains(["AppealDetailsScreen"])) += ["Appeals", "AppealsExpanded"] | select(contains(["NeedHelpData"]) or contains(["NoClaimsAndAppeals"]) or contains(["NoClaimsAndAppealsAccess"]) or contains(["ClaimsAndAppealsListView"]) or contains(["claimsAndAppeals"])) += ["Appeals", "AppealsExpanded", "Claims"] | - select(contains(["ClaimsDetailsScreen"]) or contains(["ClaimsLettersScreen"]) or contains(["SubmitEvidence"]) or contains(["ClaimsHistoryScreen"])) += ["Claims"] | - select(contains(["ClaimsLettersScreen"]) or contains(["decisionLetters"])) += ["DecisionLetters"] | + select(contains(["ClaimDetailsScreen"]) or contains(["ClaimLettersScreen"]) or contains(["SubmitEvidence"]) or contains(["ClaimsHistoryScreen"])) += ["Claims"] | + select(contains(["ClaimLettersScreen"]) or contains(["decisionLetters"])) += ["DecisionLetters"] | select(contains(["DisabilityRatingsScreen"]) or contains(["disabilityRating"])) += ["DisabilityRatings", "VeteranStatusCard"] | select(contains(["Letters"]) or contains(["letters"])) += ["VALetters"] | select(contains(["Appointments"]) or contains(["appointments"])) += ["Appointments", "AppointmentsExpanded"] | - select(contains(["Cerner"]) or contains(["Facilities"])) += ["Cerner"] | + select(contains(["CernerAlert"]) or contains(["Facilities"])) += ["Cerner"] | select(contains(["Pharmacy"]) or contains(["prescriptions"])) += ["Prescriptions"] | select(contains(["SecureMessaging"]) or contains(["secureMessaging"])) += ["Messages"] | select(contains(["Vaccines"]) or contains(["vaccines"])) += ["VaccineRecords"] | select(contains(["ContactVAScreen"])) += ["HomeScreen"] | select(contains(["MilitaryInformationScreen"]) or contains(["militaryService"]) or contains(["Nametag"])) += ["MilitaryInformation", "VeteranStatusCard"] | - select(contains(["PersonalInformationScreen"]) or contains(["demographics"]) or contains(["personalInformation"])) += ["PeronsalInformationScreen", "VeteranStatusCard", "HomeScreen", "ProfileScreen"] | + select(contains(["PersonalInformationScreen"]) or contains(["demographics"]) or contains(["personalInformation"])) += ["PersonalInformationScreen", "VeteranStatusCard", "HomeScreen", "ProfileScreen"] | select(contains(["SettingsScreen"])) += ["SettingsScreen"] | - select(contains(["VeteranCrisisLineScreen"])) += ["VeteransCrisisLine", "SignIn"] | + select(contains(["VeteransCrisisLineScreen"])) += ["VeteransCrisisLine", "SignIn"] | + select(contains(["VeteranStatusScreen"])) += ["VeteranStatusCard"] | select(contains(["OnboardingCarousel"])) += ["Onboarding"] | select(contains(["PaymentHistory"]) or contains(["payments"])) += ["Payments"] | select(contains(["DirectDepositScreen"]) or contains(["directDeposit"])) += ["DirectDeposit"] | select(contains(["SplashScreen"])) += ["Onboarding", "LoginScreen"] | - select(contains(["Auth"])) += ["SignIn"] | + select(contains(["auth"])) += ["SignIn"] | select(contains(["authorizedServices"])) += ["Appeals", "AppealsExpanded", "Appointments", "AppointmentsExpanded", "Claims", "DirectDeposit", "DisabilityRatings", "PersonalInformationScreen", "VALetters", "MilitaryInformation", "Payments", "Prescriptions", "Messages", "VeteranStatusCard"] | select(contains(["contactInformation"]) or contains(["ContactInformationScreen"])) += ["ContactInformation", "VALetters"] | select(contains(["NotificationManager"])) += ["SettingsScreen", "PushNotifications"] | - select(contains(["OnboardingCarousel"])) += ["Onboarding"] | select(contains(["Types"]) or contains(["VAImage"])) += ["AvailabilityFramework", "Cerner", "ContactInformation", "VALetters", "LoginScreen", "Onboarding", "ProfileScreen", "PushNotifications", "SettingsScreen", "SignIn", "VaccineRecords", "Claims", "Appeals", "AppealsExpanded", "DisabilityRatings", "Appointments", "AppointmentsExpanded", "Prescriptions", "Messages", "MilitaryInformation", "HomeScreen", "VeteransCrisisLine", "VeteranStatusCard", "DirectDeposit", "Payments", "PersonalInformationScreen"] | unique') @@ -147,7 +147,7 @@ jobs: or contains(["TextArea"]) or contains(["TextLines"]) or contains(["TextView"]) or contains(["backButtonLabels"]) or contains(["common.ts"])) += ["AvailabilityFramework", "Cerner", "ContactInformation", "VALetters", "LoginScreen", "Onboarding", "ProfileScreen", "PushNotifications", "SettingsScreen", "SignIn", "VaccineRecords", "Claims", "Appeals", "AppealsExpanded", "DisabilityRatings", "Appointments", "AppointmentsExpanded", "Prescriptions", "Messages", "MilitaryInformation", "HomeScreen", "VeteransCrisisLine", "VeteranStatusCard", "DirectDeposit", "Payments", "PersonalInformationScreen"] | unique ') - + test_matrix=$(echo "$resp" | jq --argjson a "${resp_file}" --argjson b "${resp}" --compact-output '$a + $b | unique') echo "$test_matrix" test_matrix=$(echo $test_matrix | jq --compact-output 'map(select(. == ("Appeals", "AppealsExpanded", "Appointments", "AppointmentExpanded", "AvailabilityFramework", "Cerner", "Claims", diff --git a/.github/workflows/e2e_ios.yml b/.github/workflows/e2e_ios.yml index 4cf563640aa..00822a7b1e3 100644 --- a/.github/workflows/e2e_ios.yml +++ b/.github/workflows/e2e_ios.yml @@ -30,16 +30,21 @@ on: description: 'Add results to testRail?' type: boolean required: false - device_specific: - description: 'Is your testRail run iOS only? (only check if adding results to testRail)' - type: boolean - required: false schedule: - cron: '0 4 * * 1,2,3,4,5' workflow_run: workflows: ['[Release] New Release Issue'] types: - in_progress + workflow_call: + secrets: + TEST_RAIL_USER: + description: "TestRail robot userid" + required: true + TEST_RAIL_KEY: + description: "TestRail api key" + required: true + concurrency: group: ios-detox-${{ github.ref }} @@ -321,7 +326,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} id: create-issue - matrix-send_test_results_to_testrail: + matrix_send_test_results_to_testrail: if: (!cancelled()) && github.event.inputs.run_testRail == 'true' needs: [matrix-e2e-ios, output_detox_tests_to_run] strategy: @@ -334,6 +339,66 @@ jobs: with: test_names: "${{matrix.testsuite}}" testRail_name: ${{ inputs.testRail_name }} - test_specific_OS_needed: ${{ inputs.device_specific}} test_OS_name: "iOS" secrets: inherit + + update-test-names: + if: (!cancelled()) && github.event.inputs.run_testRail == 'true' + needs: [matrix-e2e-ios, output_detox_tests_to_run, matrix_send_test_results_to_testrail] + runs-on: ubuntu-latest + continue-on-error: false + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: update-test-names + run: | + for ((i=0; ; i+=250)); do + echo "i = $i" + getTestCaseNewName=$(curl -X GET -H 'Content-Type: application/json' \ + -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ + "https://dsvavsp.testrail.io//index.php?/api/v2/get_tests/${{ needs.matrix_send_test_results_to_testrail.outputs.test_run_id_number }}&offset=$i") + echo $(jq --compact-output '[.tests[] | .title |= sub("(]).*$"; "]")]' <<< "$getTestCaseNewName") >> input.json + if [[ $(jq '._links.next == null' <<< "$getTestCaseNewName") == 'true' ]]; + then + break + fi + done + getTestCaseNewName=$(jq --compact-output -s 'add' input.json) + groupTestCasesByTitle=$(echo $getTestCaseNewName | jq --compact-output '[group_by(.title)[] | [.[0].title, .[0].status_id, map(.id)[]]]') + getFirstTestNewName=$(echo $groupTestCasesByTitle | jq --compact-output '[.[] | .[0]]') + getCasesID=$(curl -X GET -H 'Content-Type: application/json' \ + -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ + "https://dsvavsp.testrail.io//index.php?/api/v2/get_cases/29") + updateRunWithNewCases=$(curl -X POST -H 'Content-Type: application/json' \ + -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ + -d '{"suite_id": 92, "include_all": false, "case_ids": '$(echo $getCasesID | jq --argjson testRailNames "$getFirstTestNewName" --compact-output '.cases | map(select(.title == $testRailNames[])) | map(.id)')'}' \ + "https://dsvavsp.testrail.io//index.php?/api/v2/update_run/${{needs.matrix_send_test_results_to_testrail.outputs.test_run_id_number}}") + getTestCases=$(curl -X GET -H 'Content-Type: application/json' \ + -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ + "https://dsvavsp.testrail.io//index.php?/api/v2/get_tests/${{needs.matrix_send_test_results_to_testrail.outputs.test_run_id_number}}") + for i in $(echo $getTestCases | jq -r '.tests[].id'); do + getTestName=$(echo $getTestCases | jq --argjson testIDs "$i" -r '.tests | map(select(.id == $testIDs)) | .[0].title') + + getFailedTests=$(echo $getTestCaseNewName | jq --compact-output 'map(select(.status_id == 5)) | map(.title)') + isTestFailed=$(echo $getFailedTests | jq 'any(. == "'"$getTestName"'")') + getRetestTests=$(echo $getTestCaseNewName | jq --compact-output 'map(select(.status_id == 4)) | map(.title)') + isTestRetest=$(echo $getRetestTests | jq 'any(. == "'"$getTestName"'")') + getPassedTests=$(echo $getTestCaseNewName | jq --compact-output 'map(select(.status_id == 1)) | map(.title)') + isTestPassed=$(echo $getPassedTests | jq 'any(. == "'"$getTestName"'")') + if [[ "$isTestFailed" == "true" ]]; then + resp5=$(curl -X POST -H 'Content-Type: application/json' \ + -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ + -d '{"status_id": 5}' \ + "https://dsvavsp.testrail.io//index.php?/api/v2/add_result/"$i"") + elif [[ "$isTestRetest" == "true" ]]; then + resp5=$(curl -X POST -H 'Content-Type: application/json' \ + -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ + -d '{"status_id": 4}' \ + "https://dsvavsp.testrail.io//index.php?/api/v2/add_result/"$i"") + elif [[ "$isTestPassed" == "true" ]]; then + resp5=$(curl -X POST -H 'Content-Type: application/json' \ + -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ + -d '{"status_id": 1}' \ + "https://dsvavsp.testrail.io//index.php?/api/v2/add_result/"$i"") + fi + done diff --git a/.github/workflows/label_pull_request_onReview.yml b/.github/workflows/label_pull_request_onReview.yml index 2751d5ce279..aad4113b01d 100644 --- a/.github/workflows/label_pull_request_onReview.yml +++ b/.github/workflows/label_pull_request_onReview.yml @@ -17,7 +17,7 @@ jobs: - name: Remove old labels and add FE-Changes Requested run: | - gh pr edit ${{ github.event.pull_request.number }} --remove-label "FE-Needs Review,FE-With QA" --add-label "FE-Changes Requested" + gh pr edit ${{ github.event.pull_request.number }} --remove-label "FE-With QA" --add-label "FE-Changes Requested" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -29,9 +29,9 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 - - name: Remove old labels and add FE-Needs Review + - name: Remove old labels run: | - gh pr edit ${{ github.event.pull_request.number }} --remove-label "FE-Changes Requested" --add-label "FE-Needs Review" + gh pr edit ${{ github.event.pull_request.number }} --remove-label "FE-Changes Requested" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -59,10 +59,10 @@ jobs: if [[ $(jq '[.[] | select(. | IN("timwright12", "rbontrager", "DJUltraTom", "TKDickson"))] | length' <<< "$approvals") -gt 0 ]] then echo 'This PR has QA approval and one other' - gh pr edit ${{ github.event.pull_request.number }} --remove-label "FE-Needs Review,FE-With QA" --add-label "FE-Ready to Merge" + gh pr edit ${{ github.event.pull_request.number }} --remove-label "FE-With QA" --add-label "FE-Ready to Merge" else echo 'This PR requires QA approval' - gh pr edit ${{ github.event.pull_request.number }} --remove-label "FE-Needs Review" --add-label "FE-With QA" + gh pr edit ${{ github.event.pull_request.number }} --add-label "FE-With QA" fi else echo 'This PR requires 2 approvals, including one QA approval' diff --git a/.github/workflows/start_test_rail_run.yml b/.github/workflows/start_test_rail_run.yml index 556a73aa57e..287e2c12a15 100644 --- a/.github/workflows/start_test_rail_run.yml +++ b/.github/workflows/start_test_rail_run.yml @@ -59,12 +59,18 @@ jobs: echo "TICKET_NUMBER: ${{inputs.ticketNumber}}" echo "MILESTONE_ID: ${{inputs.milestoneId}}" echo "" >> input.json + resp=$(curl -X GET -H 'Content-Type: application/json' \ + -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ + "https://dsvavsp.testrail.io//index.php?/api/v2/get_cases/29§ion_id=3239") + length=$(echo $resp | jq '.cases | map(select(.custom_release_candidate_test_case == true )) | map(.id) | length') + randomNumber=$(((RANDOM % ${length}))) + getID=$(echo $resp | jq --argjson random $randomNumber --compact-output '.cases | map(select(.custom_release_candidate_test_case == true )) | map(.id) | .[$random]') for ((i=0; ; i+=250)); do echo "i = $i" resp=$(curl -X GET -H 'Content-Type: application/json' \ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ "https://dsvavsp.testrail.io//index.php?/api/v2/get_cases/29&offset=$i") - echo $(jq --compact-output '.cases | map(select(.custom_release_candidate_test_case == true)) | map(.id)' <<< "$resp") >> input.json + echo $(jq --argjson testID $getID --compact-output '.cases | map(select(.custom_release_candidate_test_case == true and (.section_id != 3239 or .id == $testID))) | map(.id)' <<< "$resp") >> input.json if [[ $(jq '._links.next == null' <<< "$resp") == 'true' ]]; then break diff --git a/.github/workflows/update_testrail_results.yml b/.github/workflows/update_testrail_results.yml index 3fe4e8b0e8c..a6bf3b822a5 100644 --- a/.github/workflows/update_testrail_results.yml +++ b/.github/workflows/update_testrail_results.yml @@ -16,13 +16,14 @@ on: testRail_name: type: string default: '' - test_specific_OS_needed: - type: boolean - default: false test_OS_name: type: string default: '' - + outputs: + test_run_id_number: + description: "The id number for the test run" + value: ${{ jobs.send_test_results_to_testrail.outputs.output1 }} + defaults: run: working-directory: VAMobile @@ -30,6 +31,8 @@ defaults: jobs: send_test_results_to_testrail: runs-on: ubuntu-latest + outputs: + output1: ${{ steps.run-id-selection.outputs.TEST_RUN_ID }} steps: - name: Checkout uses: actions/checkout@v3 @@ -47,18 +50,13 @@ jobs: echo "TEST_RUN_ID=$resp" >> "$GITHUB_OUTPUT" if [ "$resp" == '' ]; then if [[ "${{ inputs.testRail_name }}" == "" ]]; then - if [[ ${{ inputs.test_specific_OS_needed}} == true ]]; then - OS_name="${{inputs.test_OS_name}}: " - else - OS_name='' - fi resp=$(curl -X POST -H 'Content-Type: application/json' \ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ - -d '{"suite_id": 92, "include_all": false, "name": "'"${OS_name}$(date +'%Y-%m-%d')"'"}' \ + -d '{"suite_id": 92, "include_all": false, "name": "'"$(date +'%Y-%m-%d')"'"}' \ "https://dsvavsp.testrail.io//index.php?/api/v2/add_run/29" ) resp=$(curl -X GET -H 'Content-Type: application/json' \ -u "${{secrets.TEST_RAIL_USER}}:${{secrets.TEST_RAIL_KEY}}" \ - "https://dsvavsp.testrail.io//index.php?/api/v2/get_runs/29&is_completed=0" | jq '.runs[] | select(.name =="'"${OS_name}$(date +'%Y-%m-%d')"'") | .id') + "https://dsvavsp.testrail.io//index.php?/api/v2/get_runs/29&is_completed=0" | jq '.runs[] | select(.name =="'"$(date +'%Y-%m-%d')"'") | .id') echo "$resp" echo "TEST_RUN_ID=$resp" >> "$GITHUB_OUTPUT" else @@ -100,4 +98,3 @@ jobs: --run-id ${{steps.run-id-selection.outputs.TEST_RUN_ID}} \ --section-id ${{steps.section-id-selection.outputs.SECTION_RUN_ID}} \ -f "/home/runner/work/va-mobile-app/va-mobile-app/e2e-junit.xml" - diff --git a/VAMobile/android/Gemfile.lock b/VAMobile/android/Gemfile.lock index a7ff0fb738e..ee304c14cb0 100644 --- a/VAMobile/android/Gemfile.lock +++ b/VAMobile/android/Gemfile.lock @@ -10,20 +10,20 @@ GEM artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.3.0) - aws-partitions (1.991.0) - aws-sdk-core (3.209.1) + aws-partitions (1.998.0) + aws-sdk-core (3.211.0) aws-eventstream (~> 1, >= 1.3.0) - aws-partitions (~> 1, >= 1.651.0) + aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.94.0) - aws-sdk-core (~> 3, >= 3.207.0) + aws-sdk-kms (1.95.0) + aws-sdk-core (~> 3, >= 3.210.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.167.0) - aws-sdk-core (~> 3, >= 3.207.0) + aws-sdk-s3 (1.169.0) + aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) - aws-sigv4 (1.10.0) + aws-sigv4 (1.10.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) base64 (0.2.0) @@ -113,7 +113,7 @@ GEM google-apis-firebaseappdistribution_v1alpha (~> 0.2.0) fastlane-plugin-slack_bot (1.4.0) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.73.0) + google-apis-androidpublisher_v3 (0.74.0) google-apis-core (>= 0.15.0, < 2.a) google-apis-core (0.15.1) addressable (~> 2.5, >= 2.5.1) @@ -148,7 +148,7 @@ GEM google-cloud-core (~> 1.6) googleauth (~> 1.9) mini_mime (~> 1.0) - googleauth (1.11.1) + googleauth (1.11.2) faraday (>= 1.0, < 3.a) google-cloud-env (~> 2.1) jwt (>= 1.4, < 3.0) @@ -160,7 +160,7 @@ GEM domain_name (~> 0.5) httpclient (2.8.3) jmespath (1.6.2) - json (2.7.2) + json (2.7.4) jwt (2.9.3) base64 mini_magick (4.13.2) @@ -168,7 +168,7 @@ GEM multi_json (1.15.0) multipart-post (2.4.1) mutex_m (0.2.0) - nanaimo (0.3.0) + nanaimo (0.4.0) naturally (2.2.1) nkf (0.2.0) optparse (0.5.0) @@ -181,7 +181,7 @@ GEM trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.3.8) + rexml (3.3.9) rouge (2.0.7) ruby2_keywords (0.0.5) rubyzip (2.3.2) @@ -205,12 +205,12 @@ GEM uber (0.1.0) unicode-display_width (2.6.0) word_wrap (1.0.0) - xcodeproj (1.25.1) + xcodeproj (1.26.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) - nanaimo (~> 0.3.0) + nanaimo (~> 0.4.0) rexml (>= 3.3.6, < 4.0) xcpretty (0.3.0) rouge (~> 2.0.7) diff --git a/VAMobile/documentation/design/Components/Alerts and progress/Alert.md b/VAMobile/documentation/design/Components/Alerts and progress/Alert.md index 7fdc7afa2cf..86a041eed3a 100644 --- a/VAMobile/documentation/design/Components/Alerts and progress/Alert.md +++ b/VAMobile/documentation/design/Components/Alerts and progress/Alert.md @@ -8,19 +8,19 @@ Alerts are an in-content way to keep users informed of important and sometimes t ### Informational **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/alert--info) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=253-1119&mode=design&t=gceZHkCGGR5VP79F-4) - + ### Success **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/alert--success) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=253-1098&mode=design&t=gceZHkCGGR5VP79F-4) - + ### Warning **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/alert--warning) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=253-1077&mode=design&t=gceZHkCGGR5VP79F-4) - + ### Error **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/alert--error) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=253-1056&mode=design&t=gceZHkCGGR5VP79F-4) - + ## Usage diff --git a/VAMobile/documentation/design/Components/Alerts and progress/Snackbar.md b/VAMobile/documentation/design/Components/Alerts and progress/Snackbar.md index 0fd0a7fee5a..7bd8620b2b7 100644 --- a/VAMobile/documentation/design/Components/Alerts and progress/Snackbar.md +++ b/VAMobile/documentation/design/Components/Alerts and progress/Snackbar.md @@ -8,11 +8,11 @@ Snackbars provide feedback regarding API interactions at the bottom of the scree ### Default **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/snackbar--default) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=263-702&t=1BgtKDvOeoxfzmzR-4) - + ### Variations **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/snackbar--with-action) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=263-702&t=1BgtKDvOeoxfzmzR-4) - + ## Usage diff --git a/VAMobile/documentation/design/Components/Buttons and links/Button.md b/VAMobile/documentation/design/Components/Buttons and links/Button.md index 7ce424112d1..18189d5d82a 100644 --- a/VAMobile/documentation/design/Components/Buttons and links/Button.md +++ b/VAMobile/documentation/design/Components/Buttons and links/Button.md @@ -10,25 +10,25 @@ A button draws attention to important actions with a large selectable surface. #### Primary **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/button--primary) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=224-606&mode=design&t=CNVVTHmCkOFHUVbq-4) - + #### Secondary **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/button--secondary) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=224-607&mode=design&t=CNVVTHmCkOFHUVbq-4) - + ### Base #### Primary **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/button--base) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=224-595&mode=design&t=CNVVTHmCkOFHUVbq-4) - + #### Secondary **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/button--base-secondary) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=224-596&mode=design&t=CNVVTHmCkOFHUVbq-4) - + ### Destructive **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/button--destructive) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=224-586&mode=design&t=CNVVTHmCkOFHUVbq-4) - + ## Usage [Refer to the VA Design System for usage guidance](https://design.va.gov/components/button/) diff --git a/VAMobile/documentation/design/Components/Buttons and links/Link.md b/VAMobile/documentation/design/Components/Buttons and links/Link.md index d2f3ec2aad9..522c9717b7c 100644 --- a/VAMobile/documentation/design/Components/Buttons and links/Link.md +++ b/VAMobile/documentation/design/Components/Buttons and links/Link.md @@ -8,12 +8,12 @@ A link is a navigation element that can appear alone, inline (embedded), or in a ### Default **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/link--default) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=235-771&mode=design&t=CNVVTHmCkOFHUVbq-4) - + ### Default (with icon) **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/link--default-with-icon) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=235-772&mode=design&t=CNVVTHmCkOFHUVbq-4) - + ### Additional variants * [Attachment](https://department-of-veterans-affairs.github.io/va-mobile-library/iframe.html?args=&id=link--attachment&viewMode=story) diff --git a/VAMobile/documentation/design/Components/Navigation/Secondary/SegmentedControl.md b/VAMobile/documentation/design/Components/Navigation/Secondary/SegmentedControl.md index 0d376da1bc7..e10802b3f8f 100644 --- a/VAMobile/documentation/design/Components/Navigation/Secondary/SegmentedControl.md +++ b/VAMobile/documentation/design/Components/Navigation/Secondary/SegmentedControl.md @@ -8,17 +8,17 @@ A segmented control is used to switch between related views of information withi ### Two segments **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/segmented-control--2-segments) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=211-244&mode=design&t=CNVVTHmCkOFHUVbq-4) - + ### Three segments **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/segmented-control--3-segments) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=211-248&mode=design&t=CNVVTHmCkOFHUVbq-4) - + ### Four segments **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/segmented-control--4-segments) | [Figma](https://www.figma.com/file/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library?type=design&node-id=211-253&mode=design&t=CNVVTHmCkOFHUVbq-4) - + ## Usage diff --git a/VAMobile/documentation/design/Components/Selection and input/Checkbox.md b/VAMobile/documentation/design/Components/Selection and input/Checkbox.md index 944ece80c14..a90b5f6f822 100644 --- a/VAMobile/documentation/design/Components/Selection and input/Checkbox.md +++ b/VAMobile/documentation/design/Components/Selection and input/Checkbox.md @@ -10,29 +10,29 @@ Allows users to select one or more items from a list. Checkboxes are an easily u #### Default **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/checkbox--default) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=1415-384&t=iHMS9U3pTWPZb8Qb-4) - + #### Tile **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/checkbox--tile) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=1415-384&t=iHMS9U3pTWPZb8Qb-4) - + #### Error **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/checkbox--error) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=1415-384&t=iHMS9U3pTWPZb8Qb-4) - + ### Checkbox Group #### Default **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/checkbox-group--default) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=1415-441&t=iHMS9U3pTWPZb8Qb-4) - + #### Tile **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/checkbox-group--tile) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=1415-441&t=iHMS9U3pTWPZb8Qb-4) - + #### Error **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/checkbox-group--error) | [Figma](https://www.figma.com/design/Zzt8z60hCtdEzXx2GFWghH/%F0%9F%93%90-Component-Library---Design-System---VA-Mobile?node-id=1415-441&t=iHMS9U3pTWPZb8Qb-4) - + ## Usage [Refer to the VA Design System for usage guidance](https://design.va.gov/components/form/checkbox) diff --git a/VAMobile/documentation/design/Foundation/Design tokens/Color.md b/VAMobile/documentation/design/Foundation/Design tokens/Color.md index 14525c56ea0..2a6901a1b68 100644 --- a/VAMobile/documentation/design/Foundation/Design tokens/Color.md +++ b/VAMobile/documentation/design/Foundation/Design tokens/Color.md @@ -11,15 +11,15 @@ To learn more about color tokens, see the [slides](https://docs.google.com/prese ## Primitive **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/design-tokens-colors--docs#primitive) - + ## Semantic **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/design-tokens-colors--docs#semantic) - + ## Component **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/design-tokens-colors--docs#component) - + ## How to use color tokens diff --git a/VAMobile/documentation/design/Foundation/Design tokens/Spacing.md b/VAMobile/documentation/design/Foundation/Design tokens/Spacing.md index e4f6f16f0d2..f8b36a83d3a 100644 --- a/VAMobile/documentation/design/Foundation/Design tokens/Spacing.md +++ b/VAMobile/documentation/design/Foundation/Design tokens/Spacing.md @@ -15,7 +15,7 @@ The VA follows the USWDS spacing tokens and adds additional semantic tokens for ### Primitive **Open in**: [Storybook](https://department-of-veterans-affairs.github.io/va-mobile-library/?path=/docs/design-tokens-spacing--docs#primitive) - + ## How to use spacing tokens diff --git a/VAMobile/documentation/design/Foundation/Icons.md b/VAMobile/documentation/design/Foundation/Icons.md index 6fa94bbe045..3bbbafe6152 100644 --- a/VAMobile/documentation/design/Foundation/Icons.md +++ b/VAMobile/documentation/design/Foundation/Icons.md @@ -12,40 +12,40 @@ Use icons to communicate meaning, action, status, or feedback. [Refer to the VA Design System for additional guidance](https://design.va.gov/foundation/icons) ### Appointments - + ### Communication - + ### Feedback - + ### Form fields - + ### Health - + ### Interaction - + ### Messaging - + ### Navigation - + ### Payments - + ### Prescriptions - + ### Social media - + ### Other - + **Note**: The VA Mobile App icon library includes several icons that are not included in the VA Design System. These include: - check_box — used for form fields diff --git a/VAMobile/documentation/docs/About our team/_category_.json b/VAMobile/documentation/docs/About our team/_category_.json index eb13411165b..997fb675c43 100644 --- a/VAMobile/documentation/docs/About our team/_category_.json +++ b/VAMobile/documentation/docs/About our team/_category_.json @@ -1,4 +1,4 @@ { "label": "About our team", - "position": 7 + "position": 9 } diff --git a/VAMobile/documentation/docs/App Features/_category_.json b/VAMobile/documentation/docs/App Features/_category_.json new file mode 100644 index 00000000000..cc93fa1470c --- /dev/null +++ b/VAMobile/documentation/docs/App Features/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "App Features", + "position": 10 +} diff --git a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Auth Diagrams.md b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Auth Diagrams.md index c28c3219a3b..08bf84f414a 100644 --- a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Auth Diagrams.md +++ b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Auth Diagrams.md @@ -2,9 +2,11 @@ title: Authentication Diagrams --- -```mermaid +### Username and Password Authorization Flow +![Username and Password Authorization Flow](../../../../static/img/backend/username-and-password-authorization-flow.png) + +``` sequenceDiagram - title: Username and Password Authorization Flow participant User participant App participant Server @@ -14,9 +16,11 @@ sequenceDiagram App-->>User: Display auth result ``` -```mermaid +### Biometrics Flow for Username and Password Initial Login +![Biometrics Flow for Username and Password Initial Login](../../../../static/img/backend/biometrics-flow-for-username-and-password-initial-login.png) + +``` sequenceDiagram - title: Biometrics Flow for Username and Password Initial Login participant User participant Keychain participant App @@ -30,9 +34,10 @@ sequenceDiagram App-->>User: Display auth result ``` -```mermaid +### Biometrics Flow for Username and Password Subsequent Login +![Biometrics Flow for Username and Password Subsequent Login](../../../../static/img/backend/biometrics-flow-for-username-and-password-subsequent-login.png) +``` sequenceDiagram - title: Biometrics Flow for Username and Password Subsequent Login participant User participant Keychain participant App @@ -48,25 +53,26 @@ sequenceDiagram App-->>User: Display auth result ``` -```mermaid +### VA: Health and Benefits Biometrics Initial Login +![Health and Benefits Biometrics Initial Login](../../../../static/img/backend/health-and-benefits-biometrics-initial-login.png) +``` sequenceDiagram - title: VA: Health and Benefits Biometrics Initial Login participant User participant Secure App Storage participant App - participant IAM + participant SIS participant Identity Provider User->>App: Tap Login button - App->>IAM: Start the sign in process - IAM->>User: Which Identity Provider do you want? - User-->>IAM: This one please. - IAM-->>Identity Provider: Please authenticate this person at IAL2/AAL2/LOA3 + App->>SIS: Start the sign in process + SIS->>User: Which Identity Provider do you want? + User-->>SIS: This one please. + SIS-->>Identity Provider: Please authenticate this person at IAL2/AAL2/LOA3 Identity Provider->>User: Please send your username and password User-->>Identity Provider: Here they are - Identity Provider-->>IAM: It's them, I'm sure of it - IAM-->>App: Here is a code to get your tokens - App->>IAM: Please create a token and session for me - IAM-->>App: Done and done! Here is the token + Identity Provider-->>SIS: It's them, I'm sure of it + SIS-->>App: Here is a code to get your tokens + App->>SIS: Please create a token and session for me + SIS-->>App: Done and done! Here is the token App->>User: Do you want to use biometrics to log in? User-->>App: Yes please! App->>Secure App Storage: Please hang on to this for us and lock it with biometrics @@ -74,20 +80,23 @@ sequenceDiagram App-->>User: Display Auth Result ``` -```mermaid +### VA: Health and Benefits Biometrics Subsequent Login +![Health and Benefits Biometrics Subsequent Login](../../../../static/img/backend/health-and-benefits-biometrics-subsequent-login.png) +``` sequenceDiagram - title: VA: Health and Benefits Biometrics Subsequent Login participant User participant Secure App Storage participant App - participant IAM + participant SIS App->>Secure App Storage: Is there a stored token? Secure App Storage-->>App: Yes there is App->>User: Can I please have your biometrics? User-->>App: Here you go! App->>Secure App Storage: Here are the biometrics, can you send the token to me? Secure App Storage-->>App: Here it is! - App->>IAM: Can I get a refreshed token, please? Here is the old one. - IAM-->>App: Here you go, one new token. + App->>SIS: Can I get a refreshed token, please? Here is the old one. + SIS-->>App: Here you go, one new token. App-->>User: Display Auth Result ``` + +In order to regenerate these graphs, add 'mermaid' to the end of the \`\`\` at the beginning of each codeblock \ No newline at end of file diff --git a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Endpoint Creation Checklist.md b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Endpoint Creation Checklist.md index 82fcd132721..02bb817cf6b 100644 --- a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Endpoint Creation Checklist.md +++ b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Endpoint Creation Checklist.md @@ -42,7 +42,7 @@ title: Endpoint Creation Checklist $ref: '#/components/responses/504' ``` -Regenerated HTML file by running `generate_static_docs.sh` command (`modules/mobile/docs/generate_static_docs.sh`) +Regenerated [OpenAPI documentation](./OpenAPIDocumentation.md) HTML file by running `modules/mobile/docs/generate_static_docs.sh` ### Monitoring diff --git a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/ErrorHandling.md b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/ErrorHandling.md index 2cb495de19f..5cabc0971b6 100644 --- a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/ErrorHandling.md +++ b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/ErrorHandling.md @@ -12,7 +12,7 @@ The vets-api mobile endpoints generally follow the following pattern: - the controller then uses [service objects](#outbound-request-service-objects) to communicate with other servers in the vets-api ecosystem. those service objects may perform their own validations. These will generally be the same as the ones performed in the controller but may occasionally differ. - the external service processes that request and responds or times out - the service object processes the response. -- when the request fails (status is >= 400), the service objects will raise corresponding errors. These errors are rescued by [ExceptionHandling](#exception-handling) and responds with error details to the client. +- when the request fails (status is >= 400), the service objects will raise corresponding errors. These errors are rescued by [ExceptionHandling](#exception-handling) and responds with error details to the client. (Note: this is only true if the service configuration uses the Faraday plug `faraday.use Faraday::Response::RaiseError`. Most services that make requests for data do use this plug.) - when the request is successful (status is < 400), any additional business logic will be applied by the service object. This often includes parsing and converting the data to models. - the data is then returned to the controller. - the controller then performs any additional modifications that are necessary, serializes the data, and returns it to the client with an appropriate status code. diff --git a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/ModelsAndSerializers.md b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/ModelsAndSerializers.md new file mode 100644 index 00000000000..7d99e7782ae --- /dev/null +++ b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/ModelsAndSerializers.md @@ -0,0 +1,31 @@ +# Models + +Unlike a typical Rails app, most of the models in the mobile module do not use ActiveRecord. Most of our models are populated from upstream data sources, so there's no need to store the data in a local database, which makes them a bad fit for ActiveRecord. As a result, most vets-api models inherit from `Dry::Struct` instead of `ActiveRecord::Base` to represent data. Dry structs use [`Dry::Types`](https://dry-rb.org/gems/dry-types) to validate attribute data types. + + +## Serializers + +Mobile serializers use `JSONAPI::Serializer` and they do two things: +- ensure that our responses are formatted as valid [JSONAPI](./JSONAPI.md) +- determine which attributes from the model are included in the response + +## Best Practice + +- all data should be converted to models in order to use type validation +- all nested attributes should be fully detailed within the data model in order to whitelist and validate all attributes that will be serialized. In other words, if a model has an attribute that is a hash or an array of hashes, all attributes in the hash should also be validated with `Dry::Types`. For example, a hash could look like: +``` + attribute :debt_history do + attribute :date, Types::Date + attribute :letter_code, Types::String + attribute :description, Types::String + end +``` +an array of hashes could look like: +``` + attribute :debt_history, Types::Array do + attribute :date, Types::Date + attribute :letter_code, Types::String + attribute :description, Types::String + end +``` +- all data should be serialized to ensure JSONAPI compliance diff --git a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/OpenAPIDocumentation.md b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/OpenAPIDocumentation.md new file mode 100644 index 00000000000..8e9fb27134d --- /dev/null +++ b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/OpenAPIDocumentation.md @@ -0,0 +1,27 @@ +# OpenAPI Documentation + +## OpenAPI Creation and Artifact Generation + +We document our API endpoints using [OpenAPI3](https://swagger.io/specification/). The documentation is recorded in a group of yaml files, which are converted to [HTML](../API/index.md) and JSON via the `modules/mobile/docs/generate_static_docs.sh` script. Developers must run that script each time they change the yaml to ensure that our documentation is up to date. + +## Setup + +Developers will need to install [redocly](https://redocly.com/docs/cli/installation#install-globally) in order to run the `generate_static_docs` script. + +## Using OpenAPI in RSpec + +The backend team uses the [committee-rails gem](https://github.com/willnet/committee-rails) to tie our documentation and specs together. This gem should be used in request specs to validate requests and responses against the JSON file generated by the `generate_static_docs` script. To add it to a request spec, simply call the method `assert_schema_conform(expected_status)`. This will use the uri path from the `request` object and the expected status (e.g., 200) to look up which schema the response should match and validate the `response.body` against it. + +## Limitations + +Our schema tests are only as good as the data we're testing against. These tests run against VCR cassettes we've either recorded or been given. These cassettes will not necessarily cover all cases. It's also possible for cassettes to become out of date, which can cause drift between our specs/OpenAPI documentation and reality. + +Schema tests are also only as good as the schema they're testing against. Schema should be written as strictly as possible. That means indicating when properties are required or nullable, when additional properties are not permitted in objects, indicating string formats, and specifying which strings are possible via the enum type. Greater specificity results in better documentation. + +## Best Practices + +- use [models and serializers](./ModelsAndSerializers.md) to lock down the schema +- use all VCR cassettes available to ensure broad test coverage +- only validate the schema once per unique case. In other words, if you need to run several tests with the same data setup and you expect the same response each time, there's no need to validate the schema each time. +- use `nullable: true` when you know an attribute may be null. This should also be reflected in the model. +- use `additionalProperties: false` on all objects. Additional properties should be prevented by the model and serializer. diff --git a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Iam.md b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/sis.md similarity index 83% rename from VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Iam.md rename to VAMobile/documentation/docs/Engineering/BackEnd/Architecture/sis.md index 0dc89356d4f..ea8e501d8bf 100644 --- a/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/Iam.md +++ b/VAMobile/documentation/docs/Engineering/BackEnd/Architecture/sis.md @@ -1,14 +1,8 @@ --- -title: IAM +title: SIS --- - -## Authentication Sequence Diagram - -![IAM sequence diagram](../../../../static/img/backend/iam-authentication-sequence-diagram.png) - -## Vets-API Authentication Activity Diagram - -![API authentication diagram](../../../../static/img/backend/vets-api-authentication-activity-diagram.png) +For more info on how SIS works after mobile passes to them, you can view their [docs](https://github.com/department-of-veterans-affairs/va.gov-team/blob/master/products/identity/Products/Sign-In%20Service/Engineering%20Docs/Authentication%20Types/Client%20Auth%20(User)/auth_flows/api_oauth.md +) directly. ## Provider Details diff --git a/VAMobile/documentation/docs/Engineering/BackEnd/Testing/ApiTokens.md b/VAMobile/documentation/docs/Engineering/BackEnd/Testing/ApiTokens.md index 491de63b6f4..cbdaf932402 100644 --- a/VAMobile/documentation/docs/Engineering/BackEnd/Testing/ApiTokens.md +++ b/VAMobile/documentation/docs/Engineering/BackEnd/Testing/ApiTokens.md @@ -4,11 +4,11 @@ title: API Tokens ## Authorization and token types -The mobile app currently uses two authorization services: IAM and SIS (short for Sign-In Service). IAM is a third party service and SIS is an in-house VA auth service. We expect to eventually sunset IAM in favor of SIS. +The mobile app currently SIS tokens (short for Sign-In Service). SIS is an in-house VA auth service. -The tokens are visually distinct: IAM tokens are 20 characters long, while SIS tokens are over a thousand characters long. +SIS tokens are over a thousand characters long. -The one important functional difference is that you have to include an additional header when using SIS tokens: `Authentication-Method: SIS` +You have to include an additional header when using SIS tokens: `Authentication-Method: SIS` ## Fetching API tokens @@ -16,13 +16,7 @@ We host a web app on heroku for fetching api tokens. You can fetch tokens in two 1. Manual: Go to the [token generator web app](https://va-mobile-cutter.herokuapp.com) and log in with a test user. User credentials are in 1Password. -2. Automated: These requests use basic auth (ask teammates for username and password) and will only work if the test user has previously been logged in via the manual approach and the user's refresh token is still valid. There are routes for fetching IAM tokens: - -```bash -GET https://va-mobile-cutter.herokuapp.com/auth/iam/token/judy.morrison@id.me -``` - -And SIS tokens: +2. Automated: These requests use basic auth (ask teammates for username and password) and will only work if the test user has previously been logged in via the manual approach and the user's refresh token is still valid. The route for fetching SIS tokens is: ```bash GET https://va-mobile-cutter.herokuapp.com/auth/sis/token/judy.morrison@id.me diff --git a/VAMobile/documentation/docs/Engineering/BackEnd/Testing/StagingInstances.md b/VAMobile/documentation/docs/Engineering/BackEnd/Testing/StagingInstances.md index 865fe4a202b..a0e34dc2d2d 100644 --- a/VAMobile/documentation/docs/Engineering/BackEnd/Testing/StagingInstances.md +++ b/VAMobile/documentation/docs/Engineering/BackEnd/Testing/StagingInstances.md @@ -25,13 +25,7 @@ You'll see "TERMINAL" as a tab. From here, you have access to the console. You c ### User Sign In -You can then fetch an [api token](ApiTokens.md#fetching-api-tokens) and use that token to create either an IAM user session (deprecated): - -```ruby -irb(main):001:0> user = IAMSSOeOAuth::SessionManager.new('EESBp0xiLD6p1g86q4g1').find_or_create_user -``` - -or an SIS user session: +You can then fetch an [api token](ApiTokens.md#fetching-api-tokens) and use that token to create a SIS user session: ```ruby irb(main):001:0> token = SignIn::AccessTokenJwtDecoder.new(access_token_jwt: 'crazylongsistoken').perform(with_validation: true) diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/AccessibilityInformation.md b/VAMobile/documentation/docs/Engineering/FrontEnd/AccessibilityInformation.md index 2fa5f065108..56f30fc48f7 100644 --- a/VAMobile/documentation/docs/Engineering/FrontEnd/AccessibilityInformation.md +++ b/VAMobile/documentation/docs/Engineering/FrontEnd/AccessibilityInformation.md @@ -1,6 +1,5 @@ --- title: Accessibility Information -sidebar_position: 1 --- # Accessibility Information diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/CustomHooks/_category_.json b/VAMobile/documentation/docs/Engineering/FrontEnd/CustomHooks/_category_.json index 88392073f6d..9220f69134b 100644 --- a/VAMobile/documentation/docs/Engineering/FrontEnd/CustomHooks/_category_.json +++ b/VAMobile/documentation/docs/Engineering/FrontEnd/CustomHooks/_category_.json @@ -1,5 +1,3 @@ { - "label": "Custom Hooks", - "position": 3 + "label": "Custom Hooks" } - diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/DebuggingToolsInstructions.md b/VAMobile/documentation/docs/Engineering/FrontEnd/DebuggingToolsInstructions.md index 3dabc1546df..292df26f202 100644 --- a/VAMobile/documentation/docs/Engineering/FrontEnd/DebuggingToolsInstructions.md +++ b/VAMobile/documentation/docs/Engineering/FrontEnd/DebuggingToolsInstructions.md @@ -1,6 +1,5 @@ --- title: Debugging Tools -sidebar_position: 4 --- # Debugging Instructions diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/DemoMode/_category_.json b/VAMobile/documentation/docs/Engineering/FrontEnd/DemoMode/_category_.json new file mode 100644 index 00000000000..23d45f0e887 --- /dev/null +++ b/VAMobile/documentation/docs/Engineering/FrontEnd/DemoMode/_category_.json @@ -0,0 +1,3 @@ +{ + "label": "Demo Mode" +} diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/DemoMode/index.md b/VAMobile/documentation/docs/Engineering/FrontEnd/DemoMode/index.md new file mode 100644 index 00000000000..e76af4edfb4 --- /dev/null +++ b/VAMobile/documentation/docs/Engineering/FrontEnd/DemoMode/index.md @@ -0,0 +1,63 @@ +--- +title: Accessing Demo Mode +--- + +## Purpose + +* The VA Health and Benefit App’s Demo Mode mode provides a safe and non-productionalized environment for users to interact and engage with the app’s navigation, functionality, features, and designs. +* Demo mode is set up with a single user that is not tied to any production test account and allow users to access all of the app’s latest offerings. Users can complete actions such as submitting a secure message or a prescription refill to experience the entire user journey without impacting other systems or teams. +* Demo users should use the latest version of the app in order to experience the latest version of demo mode. Work in progress items that the VA Health and Benefits App Team is working on will not appear in demo mode until it is released into production. +* Google Play store uses demo access to perform their testing; if unable to access they will decline the release + +## Steps to Access Demo Mode + + 1. Download or update existing app to the latest version (any device) + 2. [Apple App Store Link](https://apps.apple.com/us/app/va-health-and-benefits/id1559609596) + 3. [Google Play Store Link](https://play.google.com/store/apps/details?id=gov.va.mobileapp&hl=en_US&gl=US) + 4. Open the app + 5. Tap the VA Logo 7 times + 6. Enter the Password (`Zhuzh-it`) and click demo button + 7. Screen is updated with a Demo Mode bar on the home screen + 8. Click the Sign In button + 9. Demo user is now at the home page of the mobile app and can explore + +## Steps to Access Demo Mode with a Screenreader + + 1. Download or update the VA: Health and Benefits app to the latest version (version 2.37.0 or later) and open the app. + * [Apple App Store Link](https://apps.apple.com/us/app/va-health-and-benefits/id1559609596) + * [Google Play Store Link](https://play.google.com/store/apps/details?id=gov.va.mobileapp&hl=en_US&gl=US) + 2. Swipe past the Veterans Crisis Line link to the VA logo (it will come immediately after the Crisis Line link and before the "sign in" button). + * With VoiceOver (iOS), it will announce as "Department of Veterans Affairs logo, image, VA U.S. Department of Veterans Affairs". + * With Talkback (Android), it will announce as "Department of Veterans Affairs logo, image". + 3. Double-tap the VA logo image 7 times (14 times total). + 4. A modal window will appear to enter a password and focus will be on the input field. + * With VoiceOver (iOS), it will announce "Text field is editing, word mode, insertion point at start". + * With Talkback (Android), it will announce "Enter password, edit box". + 5. Enter the password (`Zhuzh-it`) into the text field. + 6. After entering the password, swipe to the "demo" button and double tap. + 7. After tapping the demo button, the login screen will update. The focus should shift back to the Veterans Crisis Line link, but depending on your phone's version, it might take you lower on the screen. If you have successfully activated demo mode, there will be an alert box that says "Demo mode, heading" directly below / after the Veterans Crisis Line link. Swipe past that and down to the "sign in" button. + 8. Double-tap the "sign in" button to login with demo mode. + +## Troubleshooting + +### Demo Mode’s password is not working + +* Case sensitive and space sensitive - review password entered +* Mobile app may need to be updated - update the app +* Demo password has changed, contact the mobile team in slack ([#va-mobile-app](https://dsva.slack.com/archives/C018V2JCWRJ)) + +### A new feature does not appear in Demo Mode + +* If the new feature has not yet been released to production, it will not appear in demo mode +* If the new feature is released to veterans in production, try the following: + * Download the latest version of VA Health and Benefits App + * Open the app and log into Demo + * Hard close the app (app switcher then swipe to close it) + * Open it again + * If it's still not there, data may be cached + * Log into demo mode + * Go to Settings -> Developer Screen -> Click the Remote Config button + * Scroll down to the Override Toggle section + * Tap the relevant feature toggle to on + * Click Apply Overrides + * Log back into Demo Mode diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/DevSetupProcess.md b/VAMobile/documentation/docs/Engineering/FrontEnd/DevSetupProcess.md index 47a28871dfd..8814dbc8848 100644 --- a/VAMobile/documentation/docs/Engineering/FrontEnd/DevSetupProcess.md +++ b/VAMobile/documentation/docs/Engineering/FrontEnd/DevSetupProcess.md @@ -1,6 +1,5 @@ --- title: Development Setup Process -sidebar_position: 5 --- # Development setup instructions diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/DowntimeMessages.md b/VAMobile/documentation/docs/Engineering/FrontEnd/DowntimeMessages.md index 4a3e07a03b8..e97783253f2 100644 --- a/VAMobile/documentation/docs/Engineering/FrontEnd/DowntimeMessages.md +++ b/VAMobile/documentation/docs/Engineering/FrontEnd/DowntimeMessages.md @@ -1,6 +1,5 @@ --- title: Downtime Messages -sidebar_position: 6 --- # Downtime Messages diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/PushNotifications/_category_.json b/VAMobile/documentation/docs/Engineering/FrontEnd/PushNotifications/_category_.json index c51b88a0268..89dda607cf2 100644 --- a/VAMobile/documentation/docs/Engineering/FrontEnd/PushNotifications/_category_.json +++ b/VAMobile/documentation/docs/Engineering/FrontEnd/PushNotifications/_category_.json @@ -1,5 +1,3 @@ { - "label": "Push Notifications", - "position": 7 + "label": "Push Notifications" } - diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/Overview/_category_.json b/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/Overview/_category_.json index 2e25bd9b246..0a00d901f0c 100644 --- a/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/Overview/_category_.json +++ b/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/Overview/_category_.json @@ -1,4 +1,3 @@ { - "label": "Overview", - "position": 1 -} \ No newline at end of file + "label": "Overview" +} diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/Tutorials/_category_.json b/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/Tutorials/_category_.json index b9ad330445a..4c518b6f1da 100644 --- a/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/Tutorials/_category_.json +++ b/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/Tutorials/_category_.json @@ -1,4 +1,3 @@ { - "label": "Redux Toolkit Tutorials", - "position": 2 -} \ No newline at end of file + "label": "Redux Toolkit Tutorials" +} diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/_category_.json b/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/_category_.json index d4b4162c8e3..a083de1496f 100644 --- a/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/_category_.json +++ b/VAMobile/documentation/docs/Engineering/FrontEnd/ReduxToolkit/_category_.json @@ -1,4 +1,3 @@ { - "label": "Redux Toolkit", - "position": 10 -} \ No newline at end of file + "label": "Redux Toolkit" +} diff --git a/VAMobile/documentation/docs/Engineering/FrontEnd/SingleSignOn.md b/VAMobile/documentation/docs/Engineering/FrontEnd/SingleSignOn.md index ecd00656881..725cda916ea 100644 --- a/VAMobile/documentation/docs/Engineering/FrontEnd/SingleSignOn.md +++ b/VAMobile/documentation/docs/Engineering/FrontEnd/SingleSignOn.md @@ -40,4 +40,4 @@ This will open the WebView screen with an SSO session, allowing the user to acce ## API documentation -For more information on API usage for SSO, view the [Device SSO Token Exchange]() documentation. +For more information on API usage for SSO, view the [Device SSO Token Exchange](https://github.com/department-of-veterans-affairs/va.gov-team/blob/master/products/identity/Products/Sign-In%20Service/Engineering%20Docs/Authentication%20Types/Client%20Auth%20(User)/auth_flows/device_sso_token_exchange.md) documentation. diff --git a/VAMobile/documentation/docs/Engineering/_category_.json b/VAMobile/documentation/docs/Engineering/_category_.json index 2fc5457c048..37dd203f884 100644 --- a/VAMobile/documentation/docs/Engineering/_category_.json +++ b/VAMobile/documentation/docs/Engineering/_category_.json @@ -1,4 +1,4 @@ { "label": "Engineering", - "position": 4 + "position": 5 } diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/commonIcons.md b/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/commonIcons.md index d94caed3fde..0c37b670ecc 100644 --- a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/commonIcons.md +++ b/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/commonIcons.md @@ -1,12 +1,10 @@ import { ReactComponent as Add} from '@componentsDocs/VAIcon/svgs/Add.svg'; import { ReactComponent as Building} from '@componentsDocs/VAIcon/svgs/Building.svg'; -import { ReactComponent as Bullet} from '@componentsDocs/VAIcon/svgs/Bullet.svg'; import { ReactComponent as CheckMark} from '@componentsDocs/VAIcon/svgs/CheckMark.svg'; import { ReactComponent as ChevronLeft} from '@componentsDocs/VAIcon/svgs/ChevronLeft.svg'; import { ReactComponent as ChevronRight} from '@componentsDocs/VAIcon/svgs/ChevronRight.svg'; import { ReactComponent as CircleCheckMark} from '@componentsDocs/VAIcon/svgs/CircleCheckMark.svg'; import { ReactComponent as Compose} from '@componentsDocs/VAIcon/svgs/Compose.svg'; -import { ReactComponent as Ellipsis} from '@componentsDocs/VAIcon/svgs/Ellipsis.svg'; import { ReactComponent as ExclamationTriangle} from '@componentsDocs/VAIcon/svgs/ExclamationTriangle.svg'; import { ReactComponent as ExternalLink} from '@componentsDocs/VAIcon/svgs/ExternalLink.svg'; import { ReactComponent as Folder} from '@componentsDocs/VAIcon/svgs/Folder.svg'; @@ -18,9 +16,7 @@ import { ReactComponent as Phone} from '@componentsDocs/VAIcon/svgs/Phone.svg'; import { ReactComponent as QuestionMark} from '@componentsDocs/VAIcon/svgs/QuestionMark.svg'; import { ReactComponent as Remove} from '@componentsDocs/VAIcon/svgs/Remove.svg'; import { ReactComponent as Reply} from '@componentsDocs/VAIcon/svgs/Reply.svg'; -import { ReactComponent as Sort} from '@componentsDocs/VAIcon/svgs/Sort.svg'; import { ReactComponent as Trash} from '@componentsDocs/VAIcon/svgs/Trash.svg'; -import { ReactComponent as Truck} from '@componentsDocs/VAIcon/svgs/Truck.svg'; import { ReactComponent as Unread} from '@componentsDocs/VAIcon/svgs/Unread.svg'; import { ReactComponent as VideoCamera} from '@componentsDocs/VAIcon/svgs/VideoCamera.svg'; import IconsPathSection from '@site/src/components/IconsPathSection' @@ -35,13 +31,11 @@ Name | Icon | File Location :---: | :---: | :---: Add | | Add.svg Building | | Building.svg -Bullet | | Bullet.svg Check Mark | | CheckMark.svg Check Mark in Circle | | CircleCheckMark.svg Chevron Left | | ChevronLeft.svg Chevron Right | | ChevronRight.svg Compose | | Compose.svg -Ellipsis | | Ellipsis.svg Exclamation Triangle | | ExclamationTriangle.svg External Link | | ExternalLink.svg Folder | | Folder.svg @@ -53,8 +47,6 @@ Phone | | Phone.svg Question Mark | | QuestionMark.svg Remove | | Remove.svg Reply | | Reply.svg -Sort | | Sort.svg Trash | | Trash.svg -Truck | | Truck.svg Unread | | Unread.svg Video Camera | | VideoCamera.svg \ No newline at end of file diff --git a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/navIcons.md b/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/navIcons.md deleted file mode 100644 index 7ffde766175..00000000000 --- a/VAMobile/documentation/docs/Flagship design library/Foundation/Icons/navIcons.md +++ /dev/null @@ -1,28 +0,0 @@ -import { ReactComponent as BenefitsSelected} from '@componentsDocs/VAIcon/svgs/navIcon/BenefitsSelected.svg'; -import { ReactComponent as BenefitsUnselected} from '@componentsDocs/VAIcon/svgs/navIcon/BenefitsUnselected.svg'; -import { ReactComponent as HealthSelected} from '@componentsDocs/VAIcon/svgs/navIcon/HealthSelected.svg'; -import { ReactComponent as HealthUnselected} from '@componentsDocs/VAIcon/svgs/navIcon/HealthUnselected.svg'; -import { ReactComponent as HomeSelected} from '@componentsDocs/VAIcon/svgs/navIcon/HomeSelected.svg'; -import { ReactComponent as HomeUnselected} from '@componentsDocs/VAIcon/svgs/navIcon/HomeUnselected.svg'; -import { ReactComponent as PaymentsSelected} from '@componentsDocs/VAIcon/svgs/navIcon/PaymentsSelected.svg'; -import { ReactComponent as PaymentsUnselected} from '@componentsDocs/VAIcon/svgs/navIcon/PaymentsUnselected.svg'; -import { ReactComponent as ProfileSelected} from '@componentsDocs/VAIcon/svgs/navIcon/ProfileSelected.svg'; -import IconsPathSection from '@site/src/components/IconsPathSection' - -# Navigation - -:::info - -::: - -Name | Icon | File Name -:---: | :---: | :---: -Benefits Selected | | BenefitsSelected.svg -Benefits Unselected | | BenefitsUnselected.svg -Health Selected | | HealthSelected.svg -Health Unselected | | HealthUnselected.svg -Home Selected | | HomeSelected.svg -Home Unselected | | HomeUnselected.svg -Payments Selected | | PaymentsSelected.svg -Payments Unselected | | PaymentsUnselected.svg -Profile Selected | | ProfileSelected.svg diff --git a/VAMobile/documentation/docs/Flagship design library/Templates/Home.md b/VAMobile/documentation/docs/Flagship design library/Templates/Home.md new file mode 100644 index 00000000000..6f92d6acb06 --- /dev/null +++ b/VAMobile/documentation/docs/Flagship design library/Templates/Home.md @@ -0,0 +1,107 @@ +--- +title: Home Screen +sidebar_position: 4 +--- + +The Home screen is the initial/default screen of the VA Health & Benefits mobile app. It sits at the top level of the hierarchical navigation (as a peer to the Health, Benefits and Payments category screens) and displays a personalized summary of a Veteran's current tasks and interactions with features in the VA mobile app. It also contains the primary entry point for the Veteran's Profile information (including App Settings). + + + + +## Anatomy: + +The VA mobile app’s personalized home screen combines content that is variable, fixed, personalized, and evergreen to deliver an experience that surfaces value to Veterans and supports understanding of the app’s capabilities, regardless of what a Veteran’s interactions are with the VA. To do this in a way that's predictable and performant, the Home screen displays a mix of content types within predetermined locations (zones). + +Having a mix of content, arranged into intentional zones, ensures that users: + +* Always see elements that help demonstrate the current & future value of the app +* Always see "personalized" information even if they don't have any active tasks at a given moment (users don’t experience an empty home screen in the absence of tasks) +* See the things that are likely relevant and valuable to them first +* Get a consistent information structure for screen readers to tab through that is present even if load times lag +* See things that are important to proper app functioning when necessary + + +### Zones + +The VA Mobile app Home screen zones ensure that the most impactful content items are getting the proper placement in the screen's hierarchy while also handling a variety of user contexts and technical situations. + +Diagram of home screen zones for VA mobile app + + +#### Zone 1: Mission-critical app info + +* **What it is:** Area for alerts and announcements from the app. It informs users when there’s something they need to do to ensure that the app is functioning and informs users of new features + * **Module appearance logic:** Variable & optional, can be personalized or universal: Modules appear to all users when in applicable situations. Otherwise, do not show. +* **What lives in this zone:** + * [Encouraged update](https://department-of-veterans-affairs.github.io/va-mobile-app/docs/App%20Features/EncouragedUpdate/) (MVP) + * [What’s new](https://department-of-veterans-affairs.github.io/va-mobile-app/docs/App%20Features/WhatsNew/) (MVP) +* **Guidelines for future module inclusion:** +Information is appropriate for inclusion on the home screen within the mission-critical app info section when it: + * Conveys information that’s necessary for the app to function properly + * Conveys information about important changes within the app + + +#### Zone 2: Activity + +* **What it is:** An alphabetical list of feature modules giving Veterans an overview of what VA is doing for them—includes any critical “in-flight” tasks or actions that may need attention. Each module contains personalized information briefly summarizing that activity and provides a secondary entry point into the app feature. + * **Module appearance logic:** Variable. Modules appear while that feature’s activity is still considered “in flight” or when there is a user action to take. Each feature has different periods of time/circumstances that determine how long they are visible on the home screen (ex: the Claims module stays until the claim closes, the Secure Message stays until any new messages have been viewed). + * **Module anatomy** + * **Title:** Feature name + * **Description text:** Indicates # of items with an in-flight status; terms used vary by feature; provides just enough information to accurately indicate what is happening/is needed. +* **What lives in this zone:** + * Prescriptions (MVP) + * Appointments (MVP) + * Messages (MVP) + * Claims (MVP) + * Debts *(future)* + * Letters & documents *(future)* + * Payments *(future)* + * Vaccine/medical records *(future)* + * Travel pay *(future)* +* **Guidelines for module inclusion:** +A feature is appropriate for inclusion as an Activity module on the home screen when it: + * Has an “in-flight” status (ex: an open Claim, an upcoming Appointment) + * Has an action that is available for the user to take (ex: a refillable Prescription, an unread Message) + + +#### Zone 3: About you: + +* **What it is:** A personalized, high-level snapshot of the individual Veteran at VA. + * **Module appearance logic:** Fixed appearance. +* **What lives in this zone:** + * Branch of Service/Veteran Status card (MVP) + * Disability rating & monthly payment (MVP) +* **Guidelines for module inclusion:** +Information is appropriate for inclusion on the home screen within About you when it: + * **Is** or **provides access** to information relating to who the individual Veterans *is within VA* as opposed to relating to a specific activity or task + * Contains high-level data about the individual Veteran that changes infrequently + + +#### Zone 4: VA resources: + +* **What it is:** Links to support/tools that are of universal interest to Veterans and a space for announcements from VA. + * **Module appearance logic:** Fixed appearance +* **What lives in this zone:** + * Contact us (MVP) + * Find a VA Location (MVP) + * Banner space for VA announcements (MVP) + * Banner appearance is optional—use when needed. + * Display one banner at a time. + * Banner announcements should be of interest to all Veterans, and timely. +* **Guidelines for module inclusion:** +Information is appropriate for inclusion on the home screen within the VA resources section when it: + * Is a tool or information that is relevant to a general audience, and + * It does not fit within the Benefits, Health or Payment categories. + + +### Screen Template +The Home screen uses the [Category screen template](https://department-of-veterans-affairs.github.io/va-mobile-app/docs/Flagship%20design%20library/Templates/ScreenTypes#category-landing-screen). + + +### Resources +* [Figma file: Home screen 2.0 Shipped File](https://www.figma.com/design/ddMWiCQCfmUKFhMcYG9fYv/Home-2.0---%F0%9F%9A%A2-Shipped---VA-Mobile?m=auto&node-id=1410-20598&t=a610026nBu9afD1A-1) (includes happy path as well as design for loading states, errors, and alternate statuses) +* Mural: [Home screen 2.0 Appearance logic for error handling and edge cases](https://app.mural.co/t/adhoccorporateworkspace2583/m/adhoccorporateworkspace2583/1704381519703/cd6d78c5824a5fb0cc8b26597f0ad271072df8f2?wid=0-1705962128474) + +### Design Principles +TBD (discussion of the role of surface and elevation in the home screen’s design) + diff --git a/VAMobile/documentation/docs/Flagship design library/Templates/ScreenTypes.md b/VAMobile/documentation/docs/Flagship design library/Templates/ScreenTypes.md index 07948e4ddf5..0b50b46062e 100644 --- a/VAMobile/documentation/docs/Flagship design library/Templates/ScreenTypes.md +++ b/VAMobile/documentation/docs/Flagship design library/Templates/ScreenTypes.md @@ -16,26 +16,10 @@ The VA mobile app has 5 main screen types that fall into two categories: ## Hierarchical screens -### Home screen​ - - -* **Definition:** The Home screen is the initial/default screen of the app. It sits at the top level of the hierarchical navigation and summarizes a Veteran's interactions with the VA mobile app. It also provides access to the Veteran's profile information. - - The Home screen contains several zones of variable and fixed content: - - **Activity:** Personalized modules that summarize "in-flight" activities and provide a secondary entry point to app features (variable appearance). - - **About you:** Personalized high-level data, including the Veteran Status card (fixed appearance). - - **VA resources:** General interest/evergreen links to VA tools as well as a banner space for announcements (fixed appearance). - - The Home screen displays the tab bar and a link to the Veteran Crisis line. It does not display a back button. -- **Screen transition:** Screen transition between home and categories is top-level peer (fade through). -- **Scroll behavior:** Content scrolls if it exceeds the panel height. -- **Resources:** - - [Figma file: Home screen template](https://www.figma.com/design/cdp7Be4UdYesq9fXeqaOgt/Navigation-2.0-Screen-Templates---%F0%9F%9A%A2-Shipped---VA-Mobile?node-id=7733-11182&t=GsZrpZDn1qDXDTr0-4) - ### Category landing screen​ -- **Definition:** Category screens sit at the top level of the hierarchical navigation (and are peers to the Home screen), grouping features of a similar type. Each category screen contains permanent entry points to features and variable description text when applicable. Features are grouped into subsections if the number of features in a category exceeds 6. Displays the tab bar and a link to the Veteran Crisis line. It does not display a back button. +- **Definition:** The Category landing screen template is used by the navigation categories at the top of the app's hierarchy: Health, Benefits, and Payments. These navigation category landing screens group features of a similar type, providing permanent entry points to features and variable description text for each feature when applicable. The app's Home screen also uses this template, but has a special set of rules that distinguish it from the other top-level categories ([see Home Screen for a more detailed description](https://department-of-veterans-affairs.github.io/va-mobile-app/docs/Flagship%20design%20library/Templates/Home)). The category landing screen template displays the tab bar and a link to the Veteran Crisis line. It does not display a back button. - **Screen transition:** Screen transition between categories is top-level peer (fade through). - **Scroll behavior:** Content scrolls if it exceeds the panel height. - Screen title scroll behavior: @@ -49,7 +33,7 @@ The VA mobile app has 5 main screen types that fall into two categories: ### Feature landing screen​ -- **Definition:** The “home” screen of a feature. Features are parent sections with multiple children that generally live within a category. A complex feature (like pharmacy or secure messaging) can also have subsections. Displays the tab bar and a descriptive back button. +- **Definition:** The “home” screen of a feature. Features are parent sections with multiple children that generally live within a category. A complex feature (like Prescriptions or Messages) can also have subsections. Displays the tab bar and a descriptive back button. - **Screen transition:** Horizontal (pushing on & off from right). - **Scroll behavior:** Content scrolls if it exceeds the panel height. - Screen title scroll behavior: diff --git a/VAMobile/documentation/docs/Flagship design library/Templates/image.png b/VAMobile/documentation/docs/Flagship design library/Templates/image.png new file mode 100644 index 00000000000..fbcf1e907af Binary files /dev/null and b/VAMobile/documentation/docs/Flagship design library/Templates/image.png differ diff --git a/VAMobile/documentation/docs/Flagship design library/_category_.json b/VAMobile/documentation/docs/Flagship design library/_category_.json index d4b4c000bbc..2a54e555dfd 100644 --- a/VAMobile/documentation/docs/Flagship design library/_category_.json +++ b/VAMobile/documentation/docs/Flagship design library/_category_.json @@ -1,4 +1,4 @@ { "label": "Flagship design library", - "position": 2 + "position": 3 } diff --git a/VAMobile/documentation/docs/Operations/_category_.json b/VAMobile/documentation/docs/Operations/_category_.json index 16fb9d4ac89..05d3ec5b360 100644 --- a/VAMobile/documentation/docs/Operations/_category_.json +++ b/VAMobile/documentation/docs/Operations/_category_.json @@ -1,4 +1,4 @@ { "label": "Operations", - "position": 6 + "position": 8 } diff --git a/VAMobile/documentation/docs/Product/_category_.json b/VAMobile/documentation/docs/Product/_category_.json index 6b2c3ee3e58..b1badb0e9b3 100644 --- a/VAMobile/documentation/docs/Product/_category_.json +++ b/VAMobile/documentation/docs/Product/_category_.json @@ -1,4 +1,4 @@ { "label": "Product", - "position": 3 + "position": 4 } diff --git a/VAMobile/documentation/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-content-designers.md b/VAMobile/documentation/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-content-designers.md index 43144997840..ade5873fe9e 100644 --- a/VAMobile/documentation/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-content-designers.md +++ b/VAMobile/documentation/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-content-designers.md @@ -4,7 +4,9 @@ title: Checklist for content designers # Accessibility checklist for content designers -*Last update: April 23, 2024* +*Last update: October 28, 2024* + +The following accessibility guidelines include guidance from both [Web Content Accessibility Guidelines (WCAG) 2.2](https://www.w3.org/TR/WCAG22/) and [Mobile Content Accessibility Guidelines (MCAG)](https://getevinced.github.io/mcag/). Since the majority of the list is made up of WCAG guidance, we have included an indicator of "(MCAG)" whenever the guidance comes from MCAG. ## **Code quality** Good quality code is resilient which makes it compatible with a wider range of browsers and assistive technologies. @@ -26,7 +28,7 @@ Structuring content helps people group information and work out what's important ### **Headings should communicate content hierarchy.** - Introduce each content section with a heading. - Use heading levels to reflect a logical content hierarchy. -- Begin the main body content with a heading level 1 that describes the page. Only one H1 should be used per screen and should make it clear to a user what information will be found on that screen. +- Begin the main body content with a heading that describes the page. Only one primary (web equivalant to an H1) should be used per screen and should make it clear to a user what information will be found on that screen. - Communicate the heading structure to developers, if it’s unclear. ### **Group related items as lists.** @@ -40,12 +42,28 @@ Clear instructions for entering or fixing information will help a user complete - Check that all required fields are visually identified. - Check that each label makes the field’s purpose clear. - Offer clear help text to help people enter information correctly. +- Within a process that requires the user to enter the exact information more than one time after the user provides the data once, at least one of the following should be true: + - The fields are auto-populated, or + - The user can choose to auto-populate the fields + - Except when: + - The information is required to ensure the security of the content, or + - The previously entered information is no longer valid. ### **Messages should tell you what and how to fix an error.** - Identify where mistakes are and describe the issue in language people will understand. -- Offer suggestions for fixing an input error, where you can. +- When there is an option for it, error messages include suggestions for revision, except when: + - The information may jeopardize the security or privacy of the user. (MCAG) - Write error messages to be as specific as you can, rather than using generic messages. - Avoid putting links inside error message text. +- If a user input results in an error, the item in error should be clearly marked. (MCAG) +- If a user input results in an error, the error is described by text. (MCAG) +- Error messages should be located next to the item in error. + +### **Sensitive Transcations Error Prevention (MCAG)** +- When users submit any action involving financial transactions, legal commitments, or authorization to access or change data owned by users, at least one of the following should be true: + - There is a mechanism that validates the user inputs and provides an option to correct errors, or + - The user can check and confirm the data before executing the transaction, or + - The submission is reversible.
## **Images** @@ -95,7 +113,14 @@ Multimedia content can offer users an alternative to text. Everyone can watch or ## **Navigation** Users want to navigate around the app easily. A user’s confidence in an app will build when they know where they are and that layouts are applied consistently. - Provide a descriptive title for each page or view. + - The screen title should describe its' context. (MCAG) +- Each screen title should be unique. (MCAG) - Provide a unique name for common page regions that are used more than once on a page. +- The order of elements on the screen should make sense and reflect the content hierarchy of the screen. (MCAG) + +### **Logical Content Grouping (MCAG)** +Elements forming a single context unit should be grouped together so they are announced by assistive technologies as a single element. +- When browsing through the screen with a screen reader or a similar assistive technology, ensure that elements that assemble a single context (i.e. a button, its' text, and its' icon **or** an image and its' caption) are announced as one unit and that each of its parts is not announced separately.
## **Sensory** @@ -125,7 +150,34 @@ Text on web pages must be easy to read, see and scan. Accessible text makes the ### **Text should be easy to scan and read.** - Avoid overusing text formatting, like underline, bold, italic and all caps. - Left-align text. Avoid using right-align, center, or justified text. +
+ +## **Unique Labels (MCAG)** +- Interactive elements' labels and accessible names should be unique, except when elements have the exact functionality. +
+ +## **Scaled Text Legibility (MCAG)** +- Text blocks should not be written in all capital letters +- Text blocks should not be written entirely in italics +- Text blocks should not be written in lighter or thinner font weights. A minimum font weight of 400 is recommended. +- Text blocks should not be set to have a justified alignment. All inter-word spacing should be even and consistent. +- Text line lengths should not exceed 70 characters per row, including spaces, using the default font size / zoom settings. +
+## **Predictability (MCAG)** +- Users should remain in the same context (i.e. screen, modal, alerts) when they enter or update values in controls and form elements, except when: + - Users are informed about the context change up front. +- No significant content or structure changes should occur when users enter or update values in controls and form elements, except when: + - The changes are due to filtering or sorting actions, and + - Users can predict the changes, and + - The location of the focus and assistive technologies in the UI is kept +- Users should remain in the same context (i.e. screen, modal, alerts) when they shift the focus to any control or form element +- No significant content or structure changes should occur when users shift the focus to any control or form element + +## **Consistent Help (MCAG)** +- Help mechanisms and help center links should be visually located consistently across all screens. +- Help mechanisms and help center links should be programmatically located consistently across all screens. +- Help mechanisms and help center links should have the exact same identifying names across all screens. --- diff --git a/VAMobile/documentation/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-ux-designers.md b/VAMobile/documentation/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-ux-designers.md index cf0ee02e4ea..d812dc52ade 100644 --- a/VAMobile/documentation/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-ux-designers.md +++ b/VAMobile/documentation/docs/QA/QualityAssuranceProcess/Accessibility/a11y-checklist-ux-designers.md @@ -4,7 +4,9 @@ title: Checklist for UX designers # Accessibility checklist for UX designers -*Last update: April 23, 2024* +*Last update: October 21, 2024* + +The following accessibility guidelines include guidance from both [Web Content Accessibility Guidelines (WCAG) 2.2](https://www.w3.org/TR/WCAG22/) and [Mobile Content Accessibility Guidelines (MCAG)](https://getevinced.github.io/mcag/). Since the majority of the list is made up of WCAG guidance, we have included an indicator of "(MCAG)" whenever the guidance comes from MCAG. ## **Adaptable UI** An adaptable user interface (UI) works for everyone. Someone’s screen size or text settings should never stop them from seeing and using anything. @@ -35,22 +37,32 @@ A minimum contrast between two colors is necessary so that a user can perceive b ## **Target size** When targets are small, it is difficult for users with hand tremors and those who have difficulty with fine motor movement to activate them accurately. Providing sufficient size, or sufficient spacing between targets, will reduce the likelihood of accidentally activating the wrong control. -- Ensure that the size of the target for pointer inputs is at least 44 by 44 CSS pixels, except when: +- Ensure that the size of the target for pointer inputs is at least 44 by 44 CSS pixels (or 7x7 millimeters), except when: * The target does not overlap any other target and has a target offset of at least 44 CSS pixels to every adjacent target * The interaction can be achieved through a different control on the same screen * The target is in a sentence, or is in a bulleted or numbered list, or its’ size is otherwise constrained by the line-height of non-target text + * The target is a default user agent control and was not modified by the mobile app team (MCAG).
## **Content structure** Structuring content helps people group information and work out what's important and what they need to read first. This structure must be shown visually and using code. - Provide easily identifiable feedback (i.e. confirmation of a form submission, alerting the user when something goes wrong, notify the user of changes on the page, etc.). Instructions should be easy to identify. - - -### **All tasks can be completed using only a keyboard.** - Design headings that reflect a logical visual and semantic content hierarchy. -- Ensure headings at the same level look similar across the app. -- Note down intended heading levels for developers, if they’re unclear. -
+- In a screen with multiple content sections (i.e. Prescription details), each section should have a heading. +- Ensure headings at the same "level" look similar across the app. +- Annotate intended headings for developers, if they are unclear. +- Ensure that the order of the elements on the screen make sense and reflect the content hierarchy of the screen (MCAG). +- Ensure that elements that assemble a single context (i.e. a heading and a single line of copy that should be read together) are announced by a screenreader as one unit and that each of the parts are not announced separately (MCAG). + +## **Spacing** +Blocks of text (three lines or more in the body text font size without additional zoom) should have sufficient spacing between lines, words, and characters. Using typography and spacking tokens (see "Spacing tokens" below), each typography component will be pre-built into the library with the minimum spacing requirements. +- Spaces between lines in text blocks are at least 0.9 times the font size and no more than 1.7 times the font size. +- Spaces between paragraphs (with subsequent paragraphs) should be at least two times (double) that of the font size. +- The font’s default inter-word spacing should not be changed. +- The font’s default inter-letter spacing should not be changed. + +### **Spacing tokens** +Typography tokens and various other components will be pre-built into the Flagship and Component libraries with the minimum required spacing tokens needed to follow accessibility best practices. While you can increase the amount of spacing used, you should never reduce it without consulting the accessibility specialist on the mobile app team. For full spacing token documentation, [see the design system](https://department-of-veterans-affairs.github.io/va-mobile-app/design/Foundation/Design%20tokens/Spacing). ## **Forms** Clear instructions for entering or fixing information will help a user complete a form quickly and correctly the first time. Using autocomplete and giving someone a chance to review information helps reduce the amount of typing. @@ -64,7 +76,9 @@ Clear instructions for entering or fixing information will help a user complete ### **Labels and error messages should be discernible.** - Ensure form labels are visible at all times. - Place error messages beneath the related form field. -- Make error messages visible and noticeable using color, familiar icons, and text. Do not use color alone. +- Make error messages visible and noticeable using color, familiar icons, and text. **Do not use color alone.** +- If an element has both a visible label and an accessible name, the visible label's text should be included in the accessible name (MCAG). + - The accessible name's copy should start with the text of the visible label (MCAG). ### **Information should be checkable before submission.** - Let people review the information they’ve entered in a form and fix any mistakes before they complete a legal or financial transaction, change saved data, or submit a test answer. @@ -74,6 +88,19 @@ Clear instructions for entering or fixing information will help a user complete * Except when: re-entering the information is essential, the information is required to ensure the security of the content, or previously entered information is no longer valid.
+## **Real-time updates (MCAG)** +- There should be a visual indication for real-time updates on the screen. +- There should be auditory indications for real-time updates while using the app. +- Real-time updates should have tactile indications (haptics) unless a user has turned haptic feedback off. +- Time-sensitive real-time updates should be reflected in a push notification when a user is not actively using the app unless a user has opted out of or turned off push notifications. + +## **Toast / snackbar (MCAG)** +- The content of a snackbar should be announced by assistive technology without the focus shifting to it. +- The font size of a snackbar message should be at the same as the base font size. +- Each snackbar message should stay visible for at least 5 seconds plus one extra second for every 120 words (rounding up) unless the user can take an action (i.e. "undo"). + - If there is an action that a user can take, the snackbar **should not** auto-dismiss. + - If the only option within the snackbar is to "dismiss", the snackbar **should** auto-dismiss. + ## **Images** Images, including icons, that are meaningful must have a text alternative (alt text) so that users who can’t see them, can still get the same visual information they contain. - Identify decorative images so engineers can code them correctly. @@ -81,6 +108,17 @@ Images, including icons, that are meaningful must have a text alternative (alt t - If icons are used, they should have accompanying text and/or a label. Icons should not be used on their own, as it can cause issues for blind/low vision users and users with cognitive disabilities.
+## **External device support (MCAG)** +If a smartphone device supports the connection of an external assistive technology device, users should be able to operate controls and other interactive elements of the app while using the device of their choosing. + +When designing, consider how your design will be used by a variety of assistive tech devices. These devices include, but are not limited to: +- Braille displays +- Switch control devices +- Eye-tracking systems and/or technology +- Augmentative and alternative communication (AAC) devices +- Hearing aid compatibility +- Adaptive keyboards and input devices (including a mouse) + ## **Keyboard** Any function or experience a user has when using a mouse must be available to keyboard users. Keyboard accessibility remains as important as ever and most major mobile operating systems do include keyboard interfaces, allowing mobile devices to be operated by external physical keyboards (e.g. keyboards connected via Bluetooth, USB On-The-Go) or alternative on-screen keyboards (e.g. scanning on-screen keyboards). @@ -117,6 +155,7 @@ Users want to navigate around the app easily. A user’s confidence in an app wi ## **Dragging movement** Some people cannot perform dragging movements in a precise manner. Others use a specialized or adapted input device, such as a trackball, head pointer, eye-gaze system, or speech-controlled mouse emulator, which may make dragging cumbersome and error-prone. - Ensure that all functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging, unless dragging is essential or the functionality is determined by the user agent and not modified by the author. +- Multipoint gestures should have a keyboard alternative.
## **Motion interaction** @@ -139,6 +178,9 @@ Information that relies on sensory perceptions (like color or sound) to relay me ### **Communicate information using multiple accessible methods.** - Add another method if using color to communicate important information. +- Elements distinction should not solely rely on color cues (MCAG). +- Elements' state distinction should not solely rely on color cues (MCAG). +- Conveying information, indicating an action, or prompting a response should not soley rely on color cues (MCAG).
## **Tables** @@ -180,7 +222,7 @@ Multimedia content can offer users an alternative to text. Users can watch or li ## **Consistent help** When the placement of the help mechanism is kept consistent across a set of screens, users looking for help will find it easier to identify. -- If a help option (contact form, chat box, etc.) is available to a user, ensure that the placement / location of this option is consistent across screens. +- If a help option (contact form, chat box, etc.) is available to a user, ensure that the placement / location and naming of this option is consistent across screens.
## **Audio and moving content** @@ -197,6 +239,9 @@ Content that moves or starts playing automatically grabs people's attention. Giv - Stop moving content, including carousels, from playing automatically, unless it plays for 5 seconds or less. - Let people pause, stop or hide any media content that plays automatically and is longer than 5 seconds. +## **Web Views (MCAG)** +- Content presented within Web Views should meet the WCAG 2.2, AA requirements, except when: + - Elements' target size should meet 2.5.5 Target Size (Enhanced) (AAA) instead of 2.5.8 Target Size (Minimum) (AA) --- diff --git a/VAMobile/documentation/docs/QA/QualityAssuranceProcess/ClosingBugTickets.md b/VAMobile/documentation/docs/QA/QualityAssuranceProcess/ClosingBugTickets.md new file mode 100644 index 00000000000..b7a94e14f60 --- /dev/null +++ b/VAMobile/documentation/docs/QA/QualityAssuranceProcess/ClosingBugTickets.md @@ -0,0 +1,18 @@ +# Closing bug tickets + +## Why not just write up all bugs and keep those issues around forever? +To deliver a meaningful, high-quality app to veterans, teams must devote some portion of their time to fixing bugs to improve the user experience. However, even on teams that are dedicating a reasonable portion of time towards those improvements, it's easy for a backlog of bug tickets to get bloated to the point where it's unmanageable (requires too much cognitive load to understand & prioritize). + +In addition to spending 30% of our time on maintenance (bug fixes, code upkeep, and the like), a clear set of definitions for bug tickets that we will close as 'not fixing' will help keep the backlog of bug tickets to a manageable, meaningful set. + +### When to close as not fixing +Bug tickets that should be closed without fixing include: +- Any bug in an external system, where the mobile app team cannot / will not be responsible for fixing it + - For high-severity bugs, ideally when closing they will include information about how the issue was communicated to the responsible external team +- Bugs that are no longer relevant/no longer apply (for example, a visual issue with the UI of a screen, but the screen has since been redesigned to remove the previously-wrong element) +- Bugs that are prohibitively 'expensive'/risky to fix (decision made in conjunction with the relevant FE team) +- Low-severity bugs which have been reported from production, and we are unable to reproduce in staging + +### Process +- Anyone can close a bug ticket as "not fixing" by closing the issue, adding a comment with explanation, and applying the "Closed - Can't / Won't Fix" label. +- Anyone can open a previously "not fixing" bug ticket by re-opening it, adding a comment with explanation, and contacting the owning subteam about it. \ No newline at end of file diff --git a/VAMobile/documentation/docs/QA/_category_.json b/VAMobile/documentation/docs/QA/_category_.json index d80b1470fb7..96adc258eb6 100644 --- a/VAMobile/documentation/docs/QA/_category_.json +++ b/VAMobile/documentation/docs/QA/_category_.json @@ -1,4 +1,4 @@ { "label": "QA", - "position": 5 -} \ No newline at end of file + "position": 7 +} diff --git a/VAMobile/documentation/docs/UX/_category_.json b/VAMobile/documentation/docs/UX/_category_.json index 6a6d7e815af..036822b2bde 100644 --- a/VAMobile/documentation/docs/UX/_category_.json +++ b/VAMobile/documentation/docs/UX/_category_.json @@ -1,4 +1,4 @@ { "label": "UX", - "position": 4 + "position": 6 } diff --git a/VAMobile/documentation/docs/contributing.md b/VAMobile/documentation/docs/contributing.md new file mode 100644 index 00000000000..3b26a9a724a --- /dev/null +++ b/VAMobile/documentation/docs/contributing.md @@ -0,0 +1,47 @@ +--- +title: Contributing +sidebar_position: 2 +--- + +## VA Health & Benefits: Mobile & Web Collaboration + +### Collaboration Phases + +This model shows how collaboration between web and mobile teams evolves as web teams develop more experience working in the mobile app and add mobile specific resources to their teams. + +**The outcome is such that an Experience team owns one or multiple Veteran-facing experiences across modalities – mobile app(s), va.gov, and future modalities.** + +Any support with Experience teams will be dependent on prioritization. + +### Definitions + +Web team: An OCTO-led team that owns Veteran-facing va.gov experience(s). + +Mobile team: An OCTO-led team that owns all experiences in VA: Health and Benefits mobile app. + +Experience team: A yet-to-exist team that owns Veteran-facing experiences across all modalities: native mobile apps, va.gov, and current/future technologies. + +| Phase A: Mobile works independently | Phase B: Web experience advises mobile | Phase C: Mobile and Web split responsibilities | Phase D: Mobile advises web experience team** | Phase E: Web team works independently and become an Experience team. | +| --- | --- | --- | --- | --- | +| VAHB Mobile App team does all of the implementation and maintenance work | VAHB Mobile App team does all of the implementation and maintenance work | Web experience team works to identify, strategize, and design initiatives

VAHB builds/ships, measures and maintains. | Web experience team does all of the implementation and maintenance work

VAHB may lend resources as needed | **Experience** team does **all** the implementation and maintenance work | +| | Web experience team advises mobile team as experience subject matter experts | VAHB team advises the experience team | VAHB team advises the experience team, runs QA, and reviews code. | VAHB runs QA and reviews code prior to submission and release | +| Mobile OCTO team POs manage initiatives | Mobile OCTO team POs manage initiatives | Experience OCTO POs manage initiatives | Experience OCTO POs manage initiatives | Experience OCTO POs manage initiatives | + +### **_How an initiative will work in detail_** + +Transition Phase C (Mobile and Web split responsibilities) represents the next available stage of collaboration that web and mobile teams can move to while most mobile expertise is still within the mobile team. + +#### Success measures for Phase C + +1. Web teams move through the strategy and design phases with minimal support from the mobile team. +2. The mobile team implement requirements and designs that the web experience team created with minimal rework. + +**What needs to be done to move on to the next step:** + +| Initiative Steps | Web Application Team | VAHB Mobile Team | +|--------------------|----------------------|------------------| +| Step 0: Identify | Create a [project brief](https://github.com/department-of-veterans-affairs/va-mobile-app/issues/new?template=feature-request.yml) that roughly lays out abstract requirements, risks, and major players. | - Mobile reviews the brief and gives feedback on mobile specific elements. - This is the review gate to consider if this feature or update is appropriate for VAHB. | +| Step 1: Strategize | - Web team drafts product strategy and decides on requirements. - A formal kickoff could be scheduled at this stage to lay out how these teams will collaborate with each other, timelines, and points of contact. - Web team creates tickets on their own board for research and design. | - Mobile reviews and gives feedback on mobile specific considerations. - Mobile will prioritize resources to consult on Step 2 | +| Step 2: Design | - Evaluative research, design and product ideation is done in order to define the first version of a feature. Finalize what is in and what isn’t. What does it look like? - Web creates an implementation plan and submits a [testplan request](https://github.com/department-of-veterans-affairs/va-mobile-app/issues/new?template=QA_Test_Plan.md) to the mobile QA team. | - Mobile will consult on research, design, data, content, accessibility, etc - Mobile reviews implementation plan - Mobile prioritizes implementation | +| Step 3: Build/Ship | - Web shares test accounts and assists with testing - Web assists with providing app store and what’s new content | - Mobile copies over engineering tickets and test plans - Mobile points engineering and QA tickets - Mobile implements - Mobile leads all necessary steps to include in whole app release process, including phased release, app store info, and what’s new content | +| Step 4: Measure | - Web assists with comparing web and mobile analytics | - Mobile monitors initial launch success | diff --git a/VAMobile/documentation/package.json b/VAMobile/documentation/package.json index 2a93aedf4c9..653269b88ba 100644 --- a/VAMobile/documentation/package.json +++ b/VAMobile/documentation/package.json @@ -28,7 +28,7 @@ "docusaurus-plugin-remote-content": "^4.0.0", "file-loader": "^6.2.0", "mdx-mermaid": "^1.3.2", - "mermaid": "^10.1.0", + "mermaid": "^10.9.3", "prism-react-renderer": "^1.2.1", "raw-loader": "^4.0.2", "react": "^17.0.1", diff --git a/VAMobile/documentation/static/img/backend/biometrics-flow-for-username-and-password-initial-login.png b/VAMobile/documentation/static/img/backend/biometrics-flow-for-username-and-password-initial-login.png new file mode 100644 index 00000000000..b67337376f3 Binary files /dev/null and b/VAMobile/documentation/static/img/backend/biometrics-flow-for-username-and-password-initial-login.png differ diff --git a/VAMobile/documentation/static/img/backend/biometrics-flow-for-username-and-password-subsequent-login.png b/VAMobile/documentation/static/img/backend/biometrics-flow-for-username-and-password-subsequent-login.png new file mode 100644 index 00000000000..cc06c26e600 Binary files /dev/null and b/VAMobile/documentation/static/img/backend/biometrics-flow-for-username-and-password-subsequent-login.png differ diff --git a/VAMobile/documentation/static/img/backend/health-and-benefits-biometrics-initial-login.png b/VAMobile/documentation/static/img/backend/health-and-benefits-biometrics-initial-login.png new file mode 100644 index 00000000000..54a25dfebc9 Binary files /dev/null and b/VAMobile/documentation/static/img/backend/health-and-benefits-biometrics-initial-login.png differ diff --git a/VAMobile/documentation/static/img/backend/health-and-benefits-biometrics-subsequent-login.png b/VAMobile/documentation/static/img/backend/health-and-benefits-biometrics-subsequent-login.png new file mode 100644 index 00000000000..2763845cc83 Binary files /dev/null and b/VAMobile/documentation/static/img/backend/health-and-benefits-biometrics-subsequent-login.png differ diff --git a/VAMobile/documentation/static/img/backend/iam-authentication-sequence-diagram.png b/VAMobile/documentation/static/img/backend/iam-authentication-sequence-diagram.png deleted file mode 100644 index 1b1ebdc6402..00000000000 Binary files a/VAMobile/documentation/static/img/backend/iam-authentication-sequence-diagram.png and /dev/null differ diff --git a/VAMobile/documentation/static/img/backend/username-and-password-authorization-flow.png b/VAMobile/documentation/static/img/backend/username-and-password-authorization-flow.png new file mode 100644 index 00000000000..afec0a28e53 Binary files /dev/null and b/VAMobile/documentation/static/img/backend/username-and-password-authorization-flow.png differ diff --git a/VAMobile/documentation/static/img/backend/vets-api-authentication-activity-diagram.png b/VAMobile/documentation/static/img/backend/vets-api-authentication-activity-diagram.png deleted file mode 100644 index 2d17a674053..00000000000 Binary files a/VAMobile/documentation/static/img/backend/vets-api-authentication-activity-diagram.png and /dev/null differ diff --git a/VAMobile/documentation/static/img/home/vamobile-home-zones.png b/VAMobile/documentation/static/img/home/vamobile-home-zones.png new file mode 100644 index 00000000000..be1e7646e78 Binary files /dev/null and b/VAMobile/documentation/static/img/home/vamobile-home-zones.png differ diff --git a/VAMobile/documentation/yarn.lock b/VAMobile/documentation/yarn.lock index 6913311f616..17396e773e9 100644 --- a/VAMobile/documentation/yarn.lock +++ b/VAMobile/documentation/yarn.lock @@ -1312,7 +1312,7 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@braintree/sanitize-url@^6.0.2": +"@braintree/sanitize-url@^6.0.1": version "6.0.4" resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== @@ -3683,13 +3683,6 @@ cose-base@^1.0.0: dependencies: layout-base "^1.0.0" -cose-base@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-2.2.0.tgz#1c395c35b6e10bb83f9769ca8b817d614add5c01" - integrity sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g== - dependencies: - layout-base "^2.0.0" - cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" @@ -3938,20 +3931,10 @@ cytoscape-cose-bilkent@^4.1.0: dependencies: cose-base "^1.0.0" -cytoscape-fcose@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz#e4d6f6490df4fab58ae9cea9e5c3ab8d7472f471" - integrity sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ== - dependencies: - cose-base "^2.2.0" - -cytoscape@^3.23.0: - version "3.26.0" - resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.26.0.tgz#b4c6961445fd51e1fd3cca83c3ffe924d9a8abc9" - integrity sha512-IV+crL+KBcrCnVVUCZW+zRRRFUZQcrtdOPXki+o4CFUWLdAEYvuZLcBSJC9EBK++suamERKzeY7roq2hdovV3w== - dependencies: - heap "^0.2.6" - lodash "^4.17.21" +cytoscape@^3.28.1: + version "3.30.2" + resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.30.2.tgz#94149707fb6547a55e3b44f03ffe232706212161" + integrity sha512-oICxQsjW8uSaRmn4UK/jkczKOqTrVqt5/1WL0POiJUT2EKNc9STM4hYFHv917yu55aTBMFNRzymlJhVAiWPCxw== "d3-array@1 - 2": version "2.12.1" @@ -4532,16 +4515,16 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -dompurify@3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.5.tgz#eb3d9cfa10037b6e73f32c586682c4b2ab01fbed" - integrity sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A== - dompurify@^2.2.8: version "2.4.7" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.7.tgz#277adeb40a2c84be2d42a8bcd45f582bfa4d0cfc" integrity sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ== +"dompurify@^3.0.5 <3.1.7": + version "3.1.6" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.1.6.tgz#43c714a94c6a7b8801850f82e756685300a027e2" + integrity sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ== + domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" @@ -4605,10 +4588,10 @@ electron-to-chromium@^1.5.4: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6" integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q== -elkjs@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.8.2.tgz#c37763c5a3e24e042e318455e0147c912a7c248e" - integrity sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ== +elkjs@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.9.3.tgz#16711f8ceb09f1b12b99e971b138a8384a529161" + integrity sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ== emoji-regex@^8.0.0: version "8.0.0" @@ -5529,11 +5512,6 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -heap@^0.2.6: - version "0.2.7" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" - integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== - history@^4.9.0: version "4.10.1" resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" @@ -5667,9 +5645,9 @@ http-parser-js@>=0.5.1: integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + version "2.0.7" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz#915f236d92ae98ef48278a95dedf17e991936ec6" + integrity sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" @@ -6183,6 +6161,13 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +katex@^0.16.9: + version "0.16.11" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.11.tgz#4bc84d5584f996abece5f01c6ad11304276a33f5" + integrity sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ== + dependencies: + commander "^8.3.0" + keyv@^4.0.0: version "4.5.3" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" @@ -6230,11 +6215,6 @@ layout-base@^1.0.0: resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== -layout-base@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285" - integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== - leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -6517,23 +6497,23 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -mermaid@^10.1.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.3.0.tgz#45c1399fc8b95818822cbbd7b03a6093d15685a9" - integrity sha512-H5quxuQjwXC8M1WuuzhAp2TdqGg74t5skfDBrNKJ7dt3z8Wprl5S6h9VJsRhoBUTSs1TMtHEdplLhCqXleZZLw== +mermaid@^10.9.3: + version "10.9.3" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.9.3.tgz#90bc6f15c33dbe5d9507fed31592cc0d88fee9f7" + integrity sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw== dependencies: - "@braintree/sanitize-url" "^6.0.2" + "@braintree/sanitize-url" "^6.0.1" "@types/d3-scale" "^4.0.3" "@types/d3-scale-chromatic" "^3.0.0" - cytoscape "^3.23.0" + cytoscape "^3.28.1" cytoscape-cose-bilkent "^4.1.0" - cytoscape-fcose "^2.1.0" d3 "^7.4.0" d3-sankey "^0.12.3" dagre-d3-es "7.0.10" dayjs "^1.11.7" - dompurify "3.0.5" - elkjs "^0.8.2" + dompurify "^3.0.5 <3.1.7" + elkjs "^0.9.0" + katex "^0.16.9" khroma "^2.0.0" lodash-es "^4.17.21" mdast-util-from-markdown "^1.3.0" diff --git a/VAMobile/e2e/tests/Appeals.e2e.ts b/VAMobile/e2e/tests/Appeals.e2e.ts index 047591a25f1..1ac75e392fa 100644 --- a/VAMobile/e2e/tests/Appeals.e2e.ts +++ b/VAMobile/e2e/tests/Appeals.e2e.ts @@ -1,3 +1,9 @@ +/* +Description: +Detox script that follows the Appeals test case found in testRail (VA Mobile App > RC Regression Test > Manual > Benefits Page Elements) +When to update: +This script should be updated whenever new things are added/changed in appeals details or if anything appeal wise is changed in src/store/api/demo/mocks/claims.json. +*/ import { by, device, element, expect, waitFor } from 'detox' import { setTimeout } from 'timers/promises' diff --git a/VAMobile/e2e/tests/AppealsExpanded.e2e.ts b/VAMobile/e2e/tests/AppealsExpanded.e2e.ts index f38aae054f7..46f4779e9f1 100644 --- a/VAMobile/e2e/tests/AppealsExpanded.e2e.ts +++ b/VAMobile/e2e/tests/AppealsExpanded.e2e.ts @@ -1,3 +1,10 @@ +/* +Description: +Detox script that tests for all appeal status types and verifies that the appeal appears in the claim list and that the appeal details page opens when clicked. +As a note: most of the current status wording is checked in our unit tests so there this test does not check that. +When to update: +This script should be updated whenever a new appeal status types is created, if anything appeal wise is changed in src/store/api/demo/mocks/claims.json or if any new content changes are made to appeals. +*/ import { by, device, element, expect, waitFor } from 'detox' import { @@ -160,6 +167,7 @@ describe('AppealsExpanded', () => { const appealInfo = expectedInformation[i] await expect(element(by.text('Appeal for ' + appealInfo[0]))).toExist() await expect(element(by.text(appealInfo[1]))).toExist() + //This if statement tests the wording in the review past events dropdown. If appealInfo[2] is true but appealInfo[3] is undefined then the wording matches what we are checking for in appealInfo[1]. Otherwise the wording matches what is given in appealInfo[3]. if (appealInfo[2] !== undefined && appealInfo[2] === 'true') { await element(by.text('Review past events')).tap() if (appealInfo[3] === undefined) { diff --git a/VAMobile/e2e/tests/AppointmentsExpanded.e2e.ts b/VAMobile/e2e/tests/AppointmentsExpanded.e2e.ts index 46f53fa90cc..630d17cf08e 100644 --- a/VAMobile/e2e/tests/AppointmentsExpanded.e2e.ts +++ b/VAMobile/e2e/tests/AppointmentsExpanded.e2e.ts @@ -6,6 +6,55 @@ export const Appointmentse2eConstants = { GET_DIRECTIONS_ID: 'directionsTestID', } +const checkMedicationWording = async ({ + appointmentType, + appointmentStatus, + pastAppointment, +}: { + appointmentType: string + appointmentStatus: string + pastAppointment: boolean +}) => { + if ( + appointmentType === 'Phone' || + appointmentType === 'CC' || + appointmentType === 'Onsite' || + appointmentType === 'VA' || + appointmentType === 'ATLAS' || + appointmentType === 'GFE' || + appointmentType === 'Home' + ) { + if ( + appointmentStatus === 'Canceled' || + (!pastAppointment && (appointmentStatus === 'Upcoming' || appointmentStatus === 'Confirmed')) + ) { + await expect(element(by.text('Prepare for your appointment'))).toExist() + await expect(element(by.text('Find a full list of things to bring to your appointment'))).toExist() + + if (appointmentType === 'ATLAS' || appointmentType === 'Home' || appointmentType === 'GFE') { + await expect(element(by.text('Get your device ready to join.'))).toExist() + await expect(element(by.id('prepareForVideoVisitTestID'))).toExist() + await waitFor(element(by.id('prepareForVideoVisitTestID'))) + .toBeVisible() + .whileElement(by.id(pastAppointment ? 'PastApptDetailsTestID' : 'UpcomingApptDetailsTestID')) + .scroll(300, 'down') + await element(by.id('prepareForVideoVisitTestID')).tap() + await expect(element(by.text('Appointments help'))).toExist() + await element(by.text('Close')).tap() + } else { + await expect(element(by.text('Get your device ready to join.'))).not.toExist() + await expect(element(by.id('prepareForVideoVisitTestID'))).not.toExist() + } + } else { + await expect(element(by.text('Prepare for your appointment'))).not.toExist() + await expect(element(by.text('Find a full list of things to bring to your appointment'))).not.toExist() + } + } else { + await expect(element(by.text('Prepare for your appointment'))).not.toExist() + await expect(element(by.text('Find a full list of things to bring to your appointment'))).not.toExist() + } +} + const checkUpcomingApptDetails = async ( appointmentType: string, appointmentStatus: string, @@ -255,6 +304,7 @@ const checkUpcomingApptDetails = async ( await expect(element(by.id('CallTTYTestID')).atIndex(1)).toExist() } } + await checkMedicationWording({ appointmentType, appointmentStatus, pastAppointment }) await element(by.text('Appointments')).tap() } @@ -532,10 +582,6 @@ export async function apppointmentVerification(pastAppointment = false) { if (!pastAppointment) { await expect(element(by.text('Video appointment'))) await expect(element(by.text('You can join 30 minutes before your appointment time.'))).toExist() - await expect(element(by.id('prepareForVideoVisitTestID'))).toExist() - await element(by.id('prepareForVideoVisitTestID')).tap() - await expect(element(by.text('Appointments help'))).toExist() - await element(by.text('Close')).tap() } else { await expect(element(by.text('Past video appointment'))) } diff --git a/VAMobile/e2e/tests/Prescriptions.e2e.ts b/VAMobile/e2e/tests/Prescriptions.e2e.ts index ba1cf923952..c490c1f424d 100644 --- a/VAMobile/e2e/tests/Prescriptions.e2e.ts +++ b/VAMobile/e2e/tests/Prescriptions.e2e.ts @@ -1,9 +1,14 @@ +/* +Description: +Detox script that follows the prescriptions test case found in testRail (VA Mobile App > RC Regression Test > Manual > Health Page Elements) +When to update: +This script should be updated whenever new things are added/changed in prescriptions or if anything is changed in src/store/api/demo/mocks/prescriptions.json. +*/ import { by, device, element, expect, waitFor } from 'detox' import { setTimeout } from 'timers/promises' import { CommonE2eIdConstants, - changeMockData, checkImages, loginToDemoMode, openHealth, @@ -63,6 +68,13 @@ beforeAll(async () => { await openPrescriptions() }) +/* +Validates and tests the sort prescription options +param name: String name of the sort option +param first Prescription: String name of the first prescription that appears in the list once the sort option is selected +param last Prescription: String name of the last prescription that appears in the list once the sort option is selected +param first Instance: Boolean value that tells the test to scroll to the top so the filter and sort button is displayed +*/ export async function validateSort( name: string, firstPrescription: string, @@ -117,6 +129,12 @@ export async function validateSort( }) } +/* +Validates and tests the filter prescription options +param name: String name of the filter option +param quantity: Number of prescriptions expected for a specific filter option +param helperText: Optional string name of the helper text for the filter option +*/ export async function validateFilter(name: string, quantity: number, helperText?: string) { const filterDescription = name === 'Pending' ? 'Pending refills' : name === 'Tracking' ? 'Refills with tracking' : `${name} prescriptions` diff --git a/VAMobile/env/constant.env b/VAMobile/env/constant.env index 620e7e605de..d912e23ce81 100644 --- a/VAMobile/env/constant.env +++ b/VAMobile/env/constant.env @@ -1,6 +1,7 @@ WEBVIEW_URL_CHANGE_LEGAL_NAME=https://www.va.gov/resources/how-to-change-your-legal-name-on-file-with-va/ WEBVIEW_URL_CORONA_FAQ=https://www.va.gov/coronavirus-veteran-frequently-asked-questions WEBVIEW_URL_FACILITY_LOCATOR=https://www.va.gov/find-locations/ +WEBVIEW_URL_WHAT_TO_BRING_TO_APPOINTMENTS=https://www.va.gov/resources/what-should-i-bring-to-my-health-care-appointments/ LINK_URL_VA_NOTIFICATIONS=https://www.va.gov/profile/notifications/ LINK_URL_VA_SCHEDULING=https://www.va.gov/health-care/schedule-view-va-appointments/ LINK_URL_IN_APP_RECRUITMENT=https://docs.google.com/forms/d/e/1FAIpQLSfRb0OtW34qKm8tGoQwwwDFs8IqwOMCLTde3DeM-ukKOEZBnA/viewform diff --git a/VAMobile/ios/Gemfile.lock b/VAMobile/ios/Gemfile.lock index 50e26862d8d..e60cfae3a4c 100644 --- a/VAMobile/ios/Gemfile.lock +++ b/VAMobile/ios/Gemfile.lock @@ -5,7 +5,7 @@ GEM base64 nkf rexml - activesupport (7.2.1.1) + activesupport (7.2.1.2) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) @@ -24,29 +24,29 @@ GEM artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.3.0) - aws-partitions (1.991.0) - aws-sdk-core (3.209.1) + aws-partitions (1.998.0) + aws-sdk-core (3.211.0) aws-eventstream (~> 1, >= 1.3.0) - aws-partitions (~> 1, >= 1.651.0) + aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.94.0) - aws-sdk-core (~> 3, >= 3.207.0) + aws-sdk-kms (1.95.0) + aws-sdk-core (~> 3, >= 3.210.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.167.0) - aws-sdk-core (~> 3, >= 3.207.0) + aws-sdk-s3 (1.169.0) + aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) - aws-sigv4 (1.10.0) + aws-sigv4 (1.10.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) base64 (0.2.0) bigdecimal (3.1.8) claide (1.1.0) - cocoapods (1.15.2) + cocoapods (1.16.1) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.15.2) + cocoapods-core (= 1.16.1) cocoapods-deintegrate (>= 1.0.3, < 2.0) cocoapods-downloader (>= 2.1, < 3.0) cocoapods-plugins (>= 1.0.0, < 2.0) @@ -60,8 +60,8 @@ GEM molinillo (~> 0.8.0) nap (~> 1.0) ruby-macho (>= 2.3.0, < 3.0) - xcodeproj (>= 1.23.0, < 2.0) - cocoapods-core (1.15.2) + xcodeproj (>= 1.26.0, < 2.0) + cocoapods-core (1.16.1) activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) @@ -126,7 +126,7 @@ GEM faraday_middleware (1.2.1) faraday (~> 1.0) fastimage (2.3.1) - fastlane (2.224.0) + fastlane (2.225.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -142,6 +142,7 @@ GEM faraday-cookie_jar (~> 0.0.6) faraday_middleware (~> 1.0) fastimage (>= 2.1.0, < 3.0.0) + fastlane-sirp (>= 1.0.0) gh_inspector (>= 1.1.2, < 2.0.0) google-apis-androidpublisher_v3 (~> 0.3) google-apis-playcustomapp_v1 (~> 0.1) @@ -168,6 +169,8 @@ GEM xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3, < 2.0.0) fastlane-plugin-slack_bot (1.4.0) + fastlane-sirp (1.0.0) + sysrandom (~> 1.0) ffi (1.17.0) ffi (1.17.0-arm64-darwin) fourflusher (2.3.1) @@ -216,7 +219,7 @@ GEM i18n (1.14.6) concurrent-ruby (~> 1.0) jmespath (1.6.2) - json (2.7.2) + json (2.7.4) jwt (2.9.3) base64 logger (1.6.1) @@ -226,7 +229,7 @@ GEM molinillo (0.8.0) multi_json (1.15.0) multipart-post (2.4.1) - nanaimo (0.3.0) + nanaimo (0.4.0) nap (1.1.0) naturally (2.2.1) netrc (0.11.0) @@ -241,7 +244,7 @@ GEM trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.3.8) + rexml (3.3.9) rouge (2.0.7) ruby-macho (2.5.1) ruby2_keywords (0.0.5) @@ -256,6 +259,7 @@ GEM simctl (1.6.10) CFPropertyList naturally + sysrandom (1.0.5) terminal-notifier (2.0.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) @@ -274,12 +278,12 @@ GEM xcode-install (2.8.1) claide (>= 0.9.1) fastlane (>= 2.1.0, < 3.0.0) - xcodeproj (1.25.1) + xcodeproj (1.26.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) - nanaimo (~> 0.3.0) + nanaimo (~> 0.4.0) rexml (>= 3.3.6, < 4.0) xcpretty (0.3.0) rouge (~> 2.0.7) diff --git a/VAMobile/ios/fastlane/Fastfile b/VAMobile/ios/fastlane/Fastfile index c70792cdb42..1b28d55cbab 100644 --- a/VAMobile/ios/fastlane/Fastfile +++ b/VAMobile/ios/fastlane/Fastfile @@ -109,7 +109,7 @@ platform :ios do slack_release_success(version.version_string, "iOS") end rescue => e - slack_release_error(version, e) + slack_release_error(version, "iOS", e) end end diff --git a/VAMobile/package.json b/VAMobile/package.json index fef0af36993..55706892da5 100644 --- a/VAMobile/package.json +++ b/VAMobile/package.json @@ -52,8 +52,8 @@ "@react-navigation/bottom-tabs": "^6.6.1", "@react-navigation/native": "^6.1.18", "@react-navigation/stack": "^6.4.1", - "@reduxjs/toolkit": "^2.2.8", - "@tanstack/react-query": "^5.56.2", + "@reduxjs/toolkit": "^2.3.0", + "@tanstack/react-query": "^5.59.15", "eslint-plugin-tsdoc": "^0.3.0", "i18next": "^23.7.18", "jsc-android": "^250231.0.0", @@ -89,19 +89,19 @@ "underscore": "^1.13.7" }, "devDependencies": { - "@babel/core": "^7.24.9", + "@babel/core": "^7.26.0", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-env": "^7.24.8", - "@babel/preset-typescript": "^7.25.7", - "@babel/runtime": "^7.24.8", + "@babel/preset-env": "^7.26.0", + "@babel/preset-typescript": "^7.26.0", + "@babel/runtime": "^7.26.0", "@department-of-veterans-affairs/eslint-config-mobile": "0.15.0", "@react-native/babel-preset": "0.75.4", "@react-native/eslint-config": "^0.75.3", "@react-native/metro-config": "^0.75.3", - "@react-native/typescript-config": "0.75.3", - "@testing-library/jest-dom": "^6.5.0", - "@testing-library/react-native": "^12.7.2", + "@react-native/typescript-config": "0.76.0", + "@testing-library/jest-dom": "^6.6.2", + "@testing-library/react-native": "^12.8.0", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@tsconfig/react-native": "^3.0.5", "@types/detox": "^18.1.0", @@ -124,7 +124,7 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-react": "^7.37.1", + "eslint-plugin-react": "^7.37.2", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-native": "^4.1.0", "husky": "^9.1.6", @@ -138,7 +138,7 @@ "prettier": "^3.3.3", "react-devtools": "^5.3.1", "react-test-renderer": "^18.3.1", - "redux-mock-store": "^1.5.4", + "redux-mock-store": "^1.5.5", "ts-jest": "^29.2.5", "ts-node": "^10.9.2", "typescript": "^5.5.4", diff --git a/VAMobile/src/api/claimsAndAppeals/getAppeal.tsx b/VAMobile/src/api/claimsAndAppeals/getAppeal.tsx index 89e4d48bb22..d747048113d 100644 --- a/VAMobile/src/api/claimsAndAppeals/getAppeal.tsx +++ b/VAMobile/src/api/claimsAndAppeals/getAppeal.tsx @@ -8,19 +8,19 @@ import { claimsAndAppealsKeys } from './queryKeys' /** * Fetch user Appeal */ -const getAppeal = async (id: string, abortSignal: AbortSignal): Promise => { - const response = await get(`/v0/appeal/${id}`, {}, abortSignal) +const getAppeal = async (id: string): Promise => { + const response = await get(`/v0/appeal/${id}`, {}) return response?.data } /** * Returns a query for user Appeal */ -export const useAppeal = (id: string, abortSignal: AbortSignal, options?: { enabled?: boolean }) => { +export const useAppeal = (id: string, options?: { enabled?: boolean }) => { return useQuery({ ...options, queryKey: [claimsAndAppealsKeys.appeal, id], - queryFn: () => getAppeal(id, abortSignal), + queryFn: () => getAppeal(id), meta: { errorName: 'getAppeal: Service error', }, diff --git a/VAMobile/src/api/claimsAndAppeals/getClaim.tsx b/VAMobile/src/api/claimsAndAppeals/getClaim.tsx index 6e22392688d..4d61137875d 100644 --- a/VAMobile/src/api/claimsAndAppeals/getClaim.tsx +++ b/VAMobile/src/api/claimsAndAppeals/getClaim.tsx @@ -8,19 +8,19 @@ import { claimsAndAppealsKeys } from './queryKeys' /** * Fetch user Claim */ -const getClaim = async (id: string, abortSignal?: AbortSignal): Promise => { - const response = await get(`/v0/claim/${id}`, {}, abortSignal) +const getClaim = async (id: string): Promise => { + const response = await get(`/v0/claim/${id}`, {}) return response?.data } /** * Returns a query for user Claim */ -export const useClaim = (id: string, abortSignal?: AbortSignal, options?: { enabled?: boolean }) => { +export const useClaim = (id: string, options?: { enabled?: boolean }) => { return useQuery({ ...options, queryKey: [claimsAndAppealsKeys.claim, id], - queryFn: () => getClaim(id, abortSignal), + queryFn: () => getClaim(id), meta: { errorName: 'getClaim: Service error', }, diff --git a/VAMobile/src/components/CategoryLandingAlert.tsx b/VAMobile/src/components/CategoryLandingAlert.tsx index ac7891c33a6..ab8d7ca435c 100644 --- a/VAMobile/src/components/CategoryLandingAlert.tsx +++ b/VAMobile/src/components/CategoryLandingAlert.tsx @@ -4,7 +4,9 @@ import { HapticFeedbackTypes } from 'react-native-haptic-feedback' import { useIsFocused } from '@react-navigation/native' -import { Box, TextView, VAIcon } from 'components' +import { Icon } from '@department-of-veterans-affairs/mobile-component-library' + +import { Box, TextView } from 'components' import { NAMESPACE } from 'constants/namespaces' import { triggerHaptic } from 'utils/haptics' import { useTheme } from 'utils/hooks' @@ -32,22 +34,13 @@ const CategoryLandingAlert: FC = ({ text, isError }: return ( - + = ({ {currentlySelectedOption?.label} - - + + diff --git a/VAMobile/src/components/VAIconWithText/VAIconWithText.test.tsx b/VAMobile/src/components/IconWithText/IconWithText.test.tsx similarity index 73% rename from VAMobile/src/components/VAIconWithText/VAIconWithText.test.tsx rename to VAMobile/src/components/IconWithText/IconWithText.test.tsx index ad17e7691a1..a067c81eb4e 100644 --- a/VAMobile/src/components/VAIconWithText/VAIconWithText.test.tsx +++ b/VAMobile/src/components/IconWithText/IconWithText.test.tsx @@ -4,11 +4,11 @@ import { screen } from '@testing-library/react-native' import { context, render } from 'testUtils' -import VAIconWithText from './VAIconWithText' +import IconWithText from './IconWithText' context('VAIconWithText', () => { beforeEach(() => { - render() + render() }) it('renders label, a11yLabel, and icon', () => { diff --git a/VAMobile/src/components/IconWithText/IconWithText.tsx b/VAMobile/src/components/IconWithText/IconWithText.tsx new file mode 100644 index 00000000000..4ccf36fb025 --- /dev/null +++ b/VAMobile/src/components/IconWithText/IconWithText.tsx @@ -0,0 +1,48 @@ +import React, { FC } from 'react' + +import { Icon, IconProps } from '@department-of-veterans-affairs/mobile-component-library/src/components/Icon/Icon' + +import { Box, ColorVariant, TextView, TextViewProps } from 'components' + +export type IconWithTextProps = IconProps & { + /** label to display below icon */ + label: string + /** label color variant. default is textWithIconButton */ + labelColor?: ColorVariant + /** optional a11y label */ + labelA11y?: string + /** optional margin between text and icon */ + mt?: number +} + +/** + * Display icon with text label underneath + * + * @returns IconWithText component + */ +const IconWithText: FC = ({ label, labelColor, labelA11y, mt, ...iconProps }) => { + const props: IconProps = { + ...iconProps, + fill: iconProps.fill || 'link', + height: iconProps.height || 24, + width: iconProps.width || 24, + preventScaling: iconProps.preventScaling ?? true, + } + + const textProps: TextViewProps = { + variant: 'textWithIconButton', + mt: mt || 3, // 6px total combined with line height + color: labelColor || 'textWithIconButton', + accessibilityLabel: labelA11y, + allowFontScaling: false, + } + + return ( + + + {label} + + ) +} + +export default IconWithText diff --git a/VAMobile/src/components/IconWithText/index.ts b/VAMobile/src/components/IconWithText/index.ts new file mode 100644 index 00000000000..985a29d1cd4 --- /dev/null +++ b/VAMobile/src/components/IconWithText/index.ts @@ -0,0 +1,2 @@ +export * from './IconWithText' +export { default } from './IconWithText' diff --git a/VAMobile/src/components/Menu/MenuView.tsx b/VAMobile/src/components/Menu/MenuView.tsx index 83a04555a20..6a81f08b4a9 100644 --- a/VAMobile/src/components/Menu/MenuView.tsx +++ b/VAMobile/src/components/Menu/MenuView.tsx @@ -2,11 +2,13 @@ import React, { FC, useEffect, useRef } from 'react' import { useTranslation } from 'react-i18next' import { Dimensions, Pressable, StyleProp, View, ViewStyle } from 'react-native' +import { Icon } from '@department-of-veterans-affairs/mobile-component-library' +import { IconProps } from '@department-of-veterans-affairs/mobile-component-library/src/components/Icon/Icon' + +import IconWithText from 'components/IconWithText' import TextView from 'components/TextView' -import VAIcon, { VA_ICON_MAP } from 'components/VAIcon' -import VAIconWithText from 'components/VAIconWithText' import { NAMESPACE } from 'constants/namespaces' -import { VAIconColors, VATextColors } from 'styles/theme' +import { VATextColors } from 'styles/theme' import { useTheme } from 'utils/hooks' import { isIOS } from 'utils/platform' @@ -28,12 +30,10 @@ export type MenuItemActionsType = { actionText: string /** adds a divider after the action*/ addDivider: boolean - /** name of the icon to show */ - iconName?: keyof typeof VA_ICON_MAP + /** icon props to show */ + iconProps?: IconProps /** method to */ onPress?: () => void - /** color for the menu icon */ - iconColor?: keyof VAIconColors /** color for the menu text */ textColor?: keyof VATextColors /** action accessibility label */ @@ -100,7 +100,7 @@ const MenuView: FC = ({ actions }) => { // gets the action passed down to the menu and creates the menu actions const getActionsForMenu = () => { return actions.map((item, index) => { - const { iconName, actionText, accessibilityLabel, iconColor, textColor } = item + const { iconProps, actionText, accessibilityLabel, textColor } = item const onPressMenu = () => { hideMenu() @@ -121,9 +121,7 @@ const MenuView: FC = ({ actions }) => { viewStyle={menuStyle} underlayColor={currentTheme.colors.buttonBackground.overFlowMenuButton} accessibilityLabel={accessibilityLabel}> - {iconName && ( - - )} + {iconProps && } {actionText} @@ -139,7 +137,7 @@ const MenuView: FC = ({ actions }) => { <> - + diff --git a/VAMobile/src/components/NavigationTabBar.tsx b/VAMobile/src/components/NavigationTabBar.tsx index a6031680d77..fd3d652d464 100644 --- a/VAMobile/src/components/NavigationTabBar.tsx +++ b/VAMobile/src/components/NavigationTabBar.tsx @@ -16,8 +16,7 @@ import { changeNavigationBarColor } from 'utils/rnNativeUIUtilities' import { themeFn } from 'utils/theme' import Box from './Box' -import { VA_ICON_MAP } from './VAIcon' -import VAIconWithText, { VAIconWithTextProps } from './VAIconWithText/VAIconWithText' +import IconWithText, { IconWithTextProps } from './IconWithText' type TabBarRoute = { key: string @@ -106,11 +105,32 @@ const NavigationTabBar: FC = ({ state, navigation, transl accessible: true, } - const iconProps: VAIconWithTextProps = { - name: `${routeName}${isFocused ? 'Selected' : 'Unselected'}` as keyof typeof VA_ICON_MAP, - fill: isFocused ? 'active' : 'inactive', + const iconProps: IconWithTextProps = { + name: 'Home', + fill: isFocused ? theme.colors.icon.active : theme.colors.icon.inactive, label: routeName, labelColor: isFocused ? 'textWithIconButton' : 'textWithIconButtonInactive', + height: 24, + width: 24, + } + switch (routeName) { + case 'Home': + iconProps.height = 28 + iconProps.width = 28 + iconProps.mt = -1 + iconProps.name = isFocused ? 'Home' : 'HomeOutlined' + break + case 'Health': + iconProps.name = isFocused ? 'MedicalServices' : 'MedicalServicesOutlined' + break + case 'Benefits': + iconProps.name = isFocused ? 'Description' : 'DescriptionOutlined' + break + case 'Payments': + iconProps.name = isFocused ? 'RequestQuote' : 'RequestQuoteOutlined' + break + default: + iconProps.name = 'Home' } return ( @@ -121,7 +141,7 @@ const NavigationTabBar: FC = ({ state, navigation, transl {...a11yValueProp({ text: t('listPosition', { position: index + 1, total: state.routes.length }) })}> - + diff --git a/VAMobile/src/components/Templates/CategoryLanding.test.tsx b/VAMobile/src/components/Templates/CategoryLanding.test.tsx index 3e4d2a7c3bb..7530b958714 100644 --- a/VAMobile/src/components/Templates/CategoryLanding.test.tsx +++ b/VAMobile/src/components/Templates/CategoryLanding.test.tsx @@ -26,7 +26,7 @@ context('CategoryLandingTemplate', () => { }) it('should render a header button if passed in', () => { - initializeTestInstance('', { label: 'test', icon: { name: 'HomeSelected' }, onPress: onPressSpy }) + initializeTestInstance('', { label: 'test', icon: { name: 'HomeOutlined' }, onPress: onPressSpy }) fireEvent.press(screen.getByRole('button', { name: 'test' })) expect(onPressSpy).toHaveBeenCalled() }) diff --git a/VAMobile/src/components/Templates/FeatureLandingAndChildTemplate.test.tsx b/VAMobile/src/components/Templates/FeatureLandingAndChildTemplate.test.tsx index 485d6bed4e8..15fa49dee02 100644 --- a/VAMobile/src/components/Templates/FeatureLandingAndChildTemplate.test.tsx +++ b/VAMobile/src/components/Templates/FeatureLandingAndChildTemplate.test.tsx @@ -37,7 +37,7 @@ context('FeatureLandingAndChildTemplate', () => { }) it('should render a header button and onPress if passed in', () => { - initializeTestInstance({ label: 'test', icon: { name: 'HomeSelected' }, onPress: onPressSpy }) + initializeTestInstance({ label: 'test', icon: { name: 'HomeOutlined' }, onPress: onPressSpy }) fireEvent.press(screen.getByRole('button', { name: 'test' })) expect(onPressSpy).toHaveBeenCalled() }) diff --git a/VAMobile/src/components/Templates/FullScreenSubtask.test.tsx b/VAMobile/src/components/Templates/FullScreenSubtask.test.tsx index deb3b5f6648..076d4665877 100644 --- a/VAMobile/src/components/Templates/FullScreenSubtask.test.tsx +++ b/VAMobile/src/components/Templates/FullScreenSubtask.test.tsx @@ -1,6 +1,7 @@ import React from 'react' -import { VAIconProps } from 'components/VAIcon' +import { IconProps } from '@department-of-veterans-affairs/mobile-component-library/src/components/Icon/Icon' + import { context, fireEvent, render, screen } from 'testUtils' import FullScreenSubtask from './FullScreenSubtask' @@ -12,7 +13,7 @@ context('FullScreenSubtask', () => { titleText?: string, leftButtonText?: string, rightButtonText?: string, - rightVAIconProps?: VAIconProps, + rightIconProps?: IconProps, primaryContentButtonText?: string, onPrimaryButtonPress?: () => void, secondaryContentButtonText?: string, @@ -23,7 +24,7 @@ context('FullScreenSubtask', () => { title={titleText} leftButtonText={leftButtonText} rightButtonText={rightButtonText} - rightVAIconProps={rightVAIconProps} + rightVAIconProps={rightIconProps} primaryContentButtonText={primaryContentButtonText} onPrimaryContentButtonPress={onPrimaryButtonPress} secondaryContentButtonText={secondaryContentButtonText} diff --git a/VAMobile/src/components/Templates/FullScreenSubtask.tsx b/VAMobile/src/components/Templates/FullScreenSubtask.tsx index ad5534d24de..eb678d56b83 100644 --- a/VAMobile/src/components/Templates/FullScreenSubtask.tsx +++ b/VAMobile/src/components/Templates/FullScreenSubtask.tsx @@ -6,10 +6,10 @@ import { useSafeAreaInsets } from 'react-native-safe-area-context' import { StackActions, useNavigation } from '@react-navigation/native' import { Button, ButtonVariants } from '@department-of-veterans-affairs/mobile-component-library' +import { IconProps } from '@department-of-veterans-affairs/mobile-component-library/src/components/Icon/Icon' import { Box, CrisisLineButton, TextView, TextViewProps, VAScrollView, WaygateWrapper } from 'components' import { MenuViewActionsType } from 'components/Menu' -import { VAIconProps } from 'components/VAIcon' import { NAMESPACE } from 'constants/namespaces' import { useDestructiveActionSheet, useTheme } from 'utils/hooks' @@ -44,7 +44,7 @@ export type FullScreenSubtaskProps = { /** Optional TestID for right button */ rightButtonTestID?: string /** icon for title bar right button(must have right button text to display) */ - rightVAIconProps?: VAIconProps + rightVAIconProps?: IconProps /** ref for the VAScrollView component that contains the content */ scrollViewRef?: Ref /** shows the menu icon with the specified action types (won't be shown if right button text is set) */ diff --git a/VAMobile/src/components/Templates/HeaderBanner.test.tsx b/VAMobile/src/components/Templates/HeaderBanner.test.tsx index 35c1662efd6..c3f30cd8de2 100644 --- a/VAMobile/src/components/Templates/HeaderBanner.test.tsx +++ b/VAMobile/src/components/Templates/HeaderBanner.test.tsx @@ -1,6 +1,7 @@ import React from 'react' -import { VAIconProps } from 'components/VAIcon' +import { IconProps } from '@department-of-veterans-affairs/mobile-component-library/src/components/Icon/Icon' + import { context, fireEvent, render, screen } from 'testUtils' import HeaderBanner, { HeaderLeftButtonProps, HeaderRightButtonProps, HeaderStaticTitleProps } from './HeaderBanner' @@ -14,7 +15,7 @@ context('HeaderBanner', () => { onLeftTitleButtonPress?: () => void, rightButtonText?: string, onRightTitleButtonPress?: () => void, - rightVAIconProps?: VAIconProps, + rightIconProps?: IconProps, ): void => { let leftButton: HeaderLeftButtonProps | undefined if (leftButtonText && onLeftTitleButtonPress) { @@ -23,8 +24,8 @@ context('HeaderBanner', () => { const title: HeaderStaticTitleProps | undefined = titleText ? { type: 'Static', title: titleText } : undefined let rightButton: HeaderRightButtonProps | undefined if (rightButtonText && onRightTitleButtonPress) { - if (rightVAIconProps) { - rightButton = { text: rightButtonText, onPress: onRightTitleButtonPress, icon: rightVAIconProps } + if (rightIconProps) { + rightButton = { text: rightButtonText, onPress: onRightTitleButtonPress, icon: rightIconProps } } else { rightButton = { text: rightButtonText, onPress: onRightTitleButtonPress } } diff --git a/VAMobile/src/components/Templates/HeaderBanner.tsx b/VAMobile/src/components/Templates/HeaderBanner.tsx index b38f11014b8..25d25dd1936 100644 --- a/VAMobile/src/components/Templates/HeaderBanner.tsx +++ b/VAMobile/src/components/Templates/HeaderBanner.tsx @@ -4,7 +4,9 @@ import { Shadow, ShadowProps } from 'react-native-shadow-2' import { useFocusEffect } from '@react-navigation/native' -import { Box, BoxProps, DescriptiveBackButton, TextView, TextViewProps, VAIconProps, VAIconWithText } from 'components' +import { IconProps } from '@department-of-veterans-affairs/mobile-component-library/src/components/Icon/Icon' + +import { Box, BoxProps, DescriptiveBackButton, IconWithText, TextView, TextViewProps } from 'components' import MenuView, { MenuViewActionsType } from 'components/Menu' import colors from 'styles/themes/VAColors' import { useAccessibilityFocus, useIsScreenReaderEnabled, useTheme } from 'utils/hooks' @@ -45,7 +47,7 @@ export type HeaderRightButtonProps = { a11yLabel?: string accessibilityRole?: AccessibilityRole onPress: () => void - icon?: VAIconProps + icon?: IconProps testID?: string } @@ -315,7 +317,7 @@ const HeaderBanner: FC = ({ accessibilityRole={rightButton.accessibilityRole || 'button'}> {rightButton.icon ? ( - = ({ listOfText, paragraphSpacing }) = accessible={true} accessibilityRole="text"> - + {!!boldedTextPrefix && {boldedTextPrefix}} diff --git a/VAMobile/src/components/VAIcon/VAIcon.test.tsx b/VAMobile/src/components/VAIcon/VAIcon.test.tsx index 589bb6d998e..1da8820ac65 100644 --- a/VAMobile/src/components/VAIcon/VAIcon.test.tsx +++ b/VAMobile/src/components/VAIcon/VAIcon.test.tsx @@ -19,7 +19,7 @@ jest.mock('../../utils/hooks', () => { context('VAIconTests', () => { describe('optional parameters', () => { it('should get passed to svg component', () => { - render() + render() expect(screen.getByTestId('myId')).toBeTruthy() }) diff --git a/VAMobile/src/components/VAIcon/VAIcon.tsx b/VAMobile/src/components/VAIcon/VAIcon.tsx index 5c87c414c0e..13e658c3a73 100644 --- a/VAMobile/src/components/VAIcon/VAIcon.tsx +++ b/VAMobile/src/components/VAIcon/VAIcon.tsx @@ -13,15 +13,12 @@ import { useAppDispatch, useFontScale, useTheme } from 'utils/hooks' // See VAIcon function documentation below for guidance on adding new SVGs import Add from './svgs/Add.svg' import Building from './svgs/Building.svg' -import Bullet from './svgs/Bullet.svg' import CheckMark from './svgs/CheckMark.svg' // Chevrons import ChevronLeft from './svgs/ChevronLeft.svg' import ChevronRight from './svgs/ChevronRight.svg' import CircleCheckMark from './svgs/CircleCheckMark.svg' import Compose from './svgs/Compose.svg' -import Ellipsis from './svgs/Ellipsis.svg' -import ExclamationCircle from './svgs/ExclamationCircle.svg' import ExclamationTriangle from './svgs/ExclamationTriangle.svg' import ExternalLink from './svgs/ExternalLink.svg' import Folder from './svgs/Folder.svg' @@ -35,9 +32,7 @@ import QuestionMark from './svgs/QuestionMark.svg' import Redo from './svgs/Redo.svg' import Remove from './svgs/Remove.svg' import Reply from './svgs/Reply.svg' -import Sort from './svgs/Sort.svg' import Trash from './svgs/Trash.svg' -import Truck from './svgs/Truck.svg' import Unread from './svgs/Unread.svg' import UploadPhoto from './svgs/UploadPhoto.svg' import VideoCamera from './svgs/VideoCamera.svg' @@ -56,24 +51,12 @@ import PhoneTTY from './svgs/links/PhoneTTY.svg' import Text from './svgs/links/Text.svg' import RightArrowInCircle from './svgs/links/right-arrow-blue-circle.svg' // Navigation -import BenefitsSelected from './svgs/navIcon/BenefitsSelected.svg' -import BenefitsUnselected from './svgs/navIcon/BenefitsUnselected.svg' -import HealthSelected from './svgs/navIcon/HealthSelected.svg' -import HealthUnselected from './svgs/navIcon/HealthUnselected.svg' -import HomeSelected from './svgs/navIcon/HomeSelected.svg' -import HomeUnselected from './svgs/navIcon/HomeUnselected.svg' -import PaymentsSelected from './svgs/navIcon/PaymentsSelected.svg' -import PaymentsUnselected from './svgs/navIcon/PaymentsUnselected.svg' -import ProfileSelected from './svgs/navIcon/ProfileSelected.svg' import RadioEmpty from './svgs/radio/RadioEmpty.svg' import RadioFilled from './svgs/radio/RadioFilled.svg' export const VA_ICON_MAP = { Add, - BenefitsSelected, - BenefitsUnselected, Building, - Bullet, Calendar, Chat, CheckBoxEmpty, @@ -88,25 +71,16 @@ export const VA_ICON_MAP = { CirclePhone, Compose, Directions, - Ellipsis, - ExclamationCircle, ExclamationTriangle, ExternalLink, Folder, - HealthSelected, - HealthUnselected, - HomeSelected, - HomeUnselected, Inbox, Info, Lock, Minus, PaperClip, - PaymentsSelected, - PaymentsUnselected, Phone, PhoneTTY, - ProfileSelected, QuestionMark, RadioEmpty, // Also used for RadioDisabled content--same icon, different colors RadioFilled, @@ -114,10 +88,8 @@ export const VA_ICON_MAP = { Remove, Reply, RightArrowInCircle, // TODO: Ticket 3402 (or separate implementation ticket) to remove this icon - Sort, Text, Trash, - Truck, Unread, UploadPhoto, VideoCamera, diff --git a/VAMobile/src/components/VAIcon/svgs/Bullet.svg b/VAMobile/src/components/VAIcon/svgs/Bullet.svg deleted file mode 100644 index a49721ce642..00000000000 --- a/VAMobile/src/components/VAIcon/svgs/Bullet.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - \ No newline at end of file diff --git a/VAMobile/src/components/VAIcon/svgs/Ellipsis.svg b/VAMobile/src/components/VAIcon/svgs/Ellipsis.svg deleted file mode 100644 index 6bfbaad8a0c..00000000000 --- a/VAMobile/src/components/VAIcon/svgs/Ellipsis.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - \ No newline at end of file diff --git a/VAMobile/src/components/VAIcon/svgs/ExclamationCircle.svg b/VAMobile/src/components/VAIcon/svgs/ExclamationCircle.svg deleted file mode 100644 index feea3ff0da9..00000000000 --- a/VAMobile/src/components/VAIcon/svgs/ExclamationCircle.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/VAMobile/src/components/VAIcon/svgs/Sort.svg b/VAMobile/src/components/VAIcon/svgs/Sort.svg deleted file mode 100644 index 8afcda6a5b2..00000000000 --- a/VAMobile/src/components/VAIcon/svgs/Sort.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - \ No newline at end of file diff --git a/VAMobile/src/components/VAIcon/svgs/navIcon/BenefitsSelected.svg b/VAMobile/src/components/VAIcon/svgs/navIcon/BenefitsSelected.svg deleted file mode 100644 index 47b3df4abc9..00000000000 --- a/VAMobile/src/components/VAIcon/svgs/navIcon/BenefitsSelected.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file diff --git a/VAMobile/src/components/VAIcon/svgs/navIcon/BenefitsUnselected.svg b/VAMobile/src/components/VAIcon/svgs/navIcon/BenefitsUnselected.svg deleted file mode 100644 index 857c05fa5bc..00000000000 --- a/VAMobile/src/components/VAIcon/svgs/navIcon/BenefitsUnselected.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - \ No newline at end of file diff --git a/VAMobile/src/components/VAIcon/svgs/navIcon/HealthSelected.svg b/VAMobile/src/components/VAIcon/svgs/navIcon/HealthSelected.svg deleted file mode 100644 index 26cfcb98f49..00000000000 --- a/VAMobile/src/components/VAIcon/svgs/navIcon/HealthSelected.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - \ No newline at end of file diff --git a/VAMobile/src/components/VAIcon/svgs/navIcon/HealthUnselected.svg b/VAMobile/src/components/VAIcon/svgs/navIcon/HealthUnselected.svg deleted file mode 100644 index 4cea6dfe256..00000000000 --- a/VAMobile/src/components/VAIcon/svgs/navIcon/HealthUnselected.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - \ No newline at end of file diff --git a/VAMobile/src/components/VAIcon/svgs/navIcon/HomeSelected.svg b/VAMobile/src/components/VAIcon/svgs/navIcon/HomeSelected.svg deleted file mode 100644 index c410969c225..00000000000 --- a/VAMobile/src/components/VAIcon/svgs/navIcon/HomeSelected.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - \ No newline at end of file diff --git a/VAMobile/src/components/VAIcon/svgs/navIcon/HomeUnselected.svg b/VAMobile/src/components/VAIcon/svgs/navIcon/HomeUnselected.svg deleted file mode 100644 index 9ede1b3aa2e..00000000000 --- a/VAMobile/src/components/VAIcon/svgs/navIcon/HomeUnselected.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - \ No newline at end of file diff --git a/VAMobile/src/components/VAIcon/svgs/navIcon/PaymentsSelected.svg b/VAMobile/src/components/VAIcon/svgs/navIcon/PaymentsSelected.svg deleted file mode 100644 index 18c6999ad6c..00000000000 --- a/VAMobile/src/components/VAIcon/svgs/navIcon/PaymentsSelected.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - \ No newline at end of file diff --git a/VAMobile/src/components/VAIcon/svgs/navIcon/PaymentsUnselected.svg b/VAMobile/src/components/VAIcon/svgs/navIcon/PaymentsUnselected.svg deleted file mode 100644 index 694cf05cbe9..00000000000 --- a/VAMobile/src/components/VAIcon/svgs/navIcon/PaymentsUnselected.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - \ No newline at end of file diff --git a/VAMobile/src/components/VAIcon/svgs/navIcon/ProfileSelected.svg b/VAMobile/src/components/VAIcon/svgs/navIcon/ProfileSelected.svg deleted file mode 100644 index d91517cbf16..00000000000 --- a/VAMobile/src/components/VAIcon/svgs/navIcon/ProfileSelected.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - \ No newline at end of file diff --git a/VAMobile/src/components/VAIconWithText/VAIconWithText.tsx b/VAMobile/src/components/VAIconWithText/VAIconWithText.tsx deleted file mode 100644 index ea45754c04f..00000000000 --- a/VAMobile/src/components/VAIconWithText/VAIconWithText.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React, { FC } from 'react' - -import { Box, ColorVariant, TextView, TextViewProps, VAIcon, VAIconProps } from 'components' - -export type VAIconWithTextProps = VAIconProps & { - /** label to display below icon */ - label: string - /** label color variant. default is textWithIconButton */ - labelColor?: ColorVariant - /** optional a11y label */ - labelA11y?: string -} - -/** - * Display icon with text label underneath - * - * @returns VAIconWithText component - */ -const VAIconWithText: FC = ({ label, labelColor, labelA11y, ...vaIconProps }) => { - const iconProps: VAIconProps = { - ...vaIconProps, - fill: vaIconProps.fill || 'link', - height: vaIconProps.height || 24, - width: vaIconProps.width || 24, - preventScaling: vaIconProps.preventScaling ?? true, - } - - const textProps: TextViewProps = { - variant: 'textWithIconButton', - mt: 3, // 6px total combined with line height - color: labelColor || 'textWithIconButton', - accessibilityLabel: labelA11y, - allowFontScaling: false, - } - - return ( - - - {label} - - ) -} - -export default VAIconWithText diff --git a/VAMobile/src/components/VAIconWithText/index.ts b/VAMobile/src/components/VAIconWithText/index.ts deleted file mode 100644 index c74a63d76d1..00000000000 --- a/VAMobile/src/components/VAIconWithText/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './VAIconWithText' -export { default } from './VAIconWithText' diff --git a/VAMobile/src/components/index.ts b/VAMobile/src/components/index.ts index d1150d90629..17a6294ed20 100644 --- a/VAMobile/src/components/index.ts +++ b/VAMobile/src/components/index.ts @@ -16,8 +16,6 @@ export { default as HeaderBanner } from './Templates/HeaderBanner' export * from './Templates/HeaderBanner' export { default as VAIcon } from './VAIcon' export * from './VAIcon' -export { default as VAIconWithText } from './VAIconWithText' -export * from './VAIconWithText' export { default as List } from './List' export * from './List' export { default as Box } from './Box' @@ -106,5 +104,7 @@ export { default as CategoryLandingAlert } from './CategoryLandingAlert' export * from './CategoryLandingAlert' export { default as VALogo } from './VALogo/VALogo' export * from './VALogo/VALogo' +export { default as IconWithText } from './IconWithText/IconWithText' +export * from './IconWithText/IconWithText' export { default as MilitaryBranchEmblem } from './MilitaryBranchEmblem' export * from './MilitaryBranchEmblem' diff --git a/VAMobile/src/components/types/HeaderButton.tsx b/VAMobile/src/components/types/HeaderButton.tsx index ddb253a5207..bea2c1dc4fd 100644 --- a/VAMobile/src/components/types/HeaderButton.tsx +++ b/VAMobile/src/components/types/HeaderButton.tsx @@ -1,12 +1,12 @@ import { AccessibilityRole } from 'react-native' -import { VAIconProps } from 'components/VAIcon' +import { IconProps } from '@department-of-veterans-affairs/mobile-component-library/src/components/Icon/Icon' export type HeaderButton = { label: string labelA11y?: string accessibilityRole?: AccessibilityRole - icon: VAIconProps + icon: IconProps onPress: () => void testID?: string } diff --git a/VAMobile/src/constants/analytics.ts b/VAMobile/src/constants/analytics.ts index 0c92adbee69..181abff3046 100644 --- a/VAMobile/src/constants/analytics.ts +++ b/VAMobile/src/constants/analytics.ts @@ -6,15 +6,6 @@ import { Event, EventParams, UserAnalytic } from 'utils/analytics' */ /*eslint id-length: ["error", { "max": 24 }]*/ export const Events = { - vama_9385_api_cType: (endpoint: string, contentType: string): Event => { - return { - name: 'vama_9385_api_cType', - params: { - endpoint: endpoint, - contentType: contentType, - }, - } - }, vama_accordion_click: (section: string, isOpened: boolean): Event => { return { name: 'vama_accordion_click', diff --git a/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/AppealDetailsScreen/AppealDetailsScreen.test.tsx b/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/AppealDetailsScreen/AppealDetailsScreen.test.tsx index 6434470f32c..70fa8776987 100644 --- a/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/AppealDetailsScreen/AppealDetailsScreen.test.tsx +++ b/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/AppealDetailsScreen/AppealDetailsScreen.test.tsx @@ -49,7 +49,7 @@ context('AppealDetailsScreen', () => { const date = DateTime.fromISO('2018-01-19T10:20:42-05:00') const dateTime = date.toLocaleString(Object.assign(DateTime.DATETIME_FULL, { day: '2-digit' })) when(api.get as jest.Mock) - .calledWith(`/v0/appeal/0`, {}, expect.anything()) + .calledWith(`/v0/appeal/0`, {}) .mockResolvedValue({ data: { ...appealData, @@ -115,7 +115,7 @@ context('AppealDetailsScreen', () => { describe('when the selected tab is issues', () => { it('should display the AppealStatus component', async () => { when(api.get as jest.Mock) - .calledWith(`/v0/appeal/0`, {}, expect.anything()) + .calledWith(`/v0/appeal/0`, {}) .mockResolvedValue({ data: { ...appealData, @@ -157,7 +157,7 @@ context('AppealDetailsScreen', () => { describe('when the type is higherLevelReview', () => { it('should display "Higher level review appeal for {{ programArea }}" as the title', async () => { when(api.get as jest.Mock) - .calledWith(`/v0/appeal/0`, {}, expect.anything()) + .calledWith(`/v0/appeal/0`, {}) .mockResolvedValue({ data: { ...appealData, @@ -173,7 +173,7 @@ context('AppealDetailsScreen', () => { it('should display the Received date as the event date where the type is "hlr_request"', async () => { when(api.get as jest.Mock) - .calledWith(`/v0/appeal/0`, {}, expect.anything()) + .calledWith(`/v0/appeal/0`, {}) .mockResolvedValue({ data: { ...appealData, @@ -205,7 +205,7 @@ context('AppealDetailsScreen', () => { describe('when the type is legacyAppeal', () => { it('should display "Appeal for {{ programArea }}" as the title', async () => { when(api.get as jest.Mock) - .calledWith(`/v0/appeal/0`, {}, expect.anything()) + .calledWith(`/v0/appeal/0`, {}) .mockResolvedValue({ data: { ...appealData, @@ -221,7 +221,7 @@ context('AppealDetailsScreen', () => { it('should display the Received date as the event date where the type is "nod"', async () => { when(api.get as jest.Mock) - .calledWith(`/v0/appeal/0`, {}, expect.anything()) + .calledWith(`/v0/appeal/0`, {}) .mockResolvedValue({ data: { ...appealData, @@ -253,7 +253,7 @@ context('AppealDetailsScreen', () => { describe('when the type is appeal', () => { it('should display "Appeal for {{ programArea }}" as the title', async () => { when(api.get as jest.Mock) - .calledWith(`/v0/appeal/0`, {}, expect.anything()) + .calledWith(`/v0/appeal/0`, {}) .mockResolvedValue({ data: { ...appealData, @@ -269,7 +269,7 @@ context('AppealDetailsScreen', () => { it('should display the Received date as the event date where the type is "nod"', async () => { when(api.get as jest.Mock) - .calledWith(`/v0/appeal/0`, {}, expect.anything()) + .calledWith(`/v0/appeal/0`, {}) .mockResolvedValue({ data: { ...appealData, @@ -301,7 +301,7 @@ context('AppealDetailsScreen', () => { describe('when the type is supplementalClaim', () => { it('should display "Supplemental claim appeal for {{ programArea }}" as the title', async () => { when(api.get as jest.Mock) - .calledWith(`/v0/appeal/0`, {}, expect.anything()) + .calledWith(`/v0/appeal/0`, {}) .mockResolvedValue({ data: { ...appealData, @@ -319,7 +319,7 @@ context('AppealDetailsScreen', () => { it('should display the Received date as the event date where the type is "sc_request"', async () => { when(api.get as jest.Mock) - .calledWith(`/v0/appeal/0`, {}, expect.anything()) + .calledWith(`/v0/appeal/0`, {}) .mockResolvedValue({ data: { ...appealData, @@ -351,7 +351,7 @@ context('AppealDetailsScreen', () => { describe('when common error occurs', () => { it('should render error component when the stores screenID matches the components screenID', async () => { when(api.get as jest.Mock) - .calledWith(`/v0/appeal/0`, {}, expect.anything()) + .calledWith(`/v0/appeal/0`, {}) .mockRejectedValue({ networkError: true } as api.APIError) renderWithData() await waitFor(() => expect(screen.getByRole('header', { name: "The app can't be loaded." })).toBeTruthy()) diff --git a/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/AppealDetailsScreen/AppealDetailsScreen.tsx b/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/AppealDetailsScreen/AppealDetailsScreen.tsx index ff7e6e4efa4..d3cc73f0a15 100644 --- a/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/AppealDetailsScreen/AppealDetailsScreen.tsx +++ b/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/AppealDetailsScreen/AppealDetailsScreen.tsx @@ -15,7 +15,7 @@ import { BenefitsStackParamList } from 'screens/BenefitsScreen/BenefitsStackScre import { ScreenIDTypesConstants } from 'store/api/types/Screens' import { logAnalyticsEvent } from 'utils/analytics' import { formatDateMMMMDDYYYY, getFormattedTimeForTimeZone, getTranslation } from 'utils/formattingUtils' -import { useBeforeNavBackListener, useTheme } from 'utils/hooks' +import { useTheme } from 'utils/hooks' import { registerReviewEvent } from 'utils/inAppReviews' import { screenContentAllowed } from 'utils/waygateConfig' @@ -37,26 +37,17 @@ function AppealDetailsScreen({ navigation, route }: AppealDetailsScreenProps) { t('appealDetails.viewYourAppeal', { tabName: t('claimDetails.status') }), t('appealDetails.viewYourAppeal', { tabName: t('appealDetails.issuesTab') }), ] - const abortController = new AbortController() - const abortSignal = abortController.signal const { appealID } = route.params const { data: appeal, error: appealError, refetch: refetchAppeals, isFetching: loadingAppeal, - } = useAppeal(appealID, abortSignal, { enabled: screenContentAllowed('WG_AppealDetailsScreen') }) + } = useAppeal(appealID, { enabled: screenContentAllowed('WG_AppealDetailsScreen') }) const { attributes, type } = appeal || ({} as AppealData) const { updated, programArea, events, status, aoj, docket, issues, active } = attributes || ({} as AppealAttributesData) - useBeforeNavBackListener(navigation, () => { - // if appeals is still loading cancel it - if (loadingAppeal) { - abortController.abort() - } - }) - useEffect(() => { if (appeal && !loadingAppeal && !appealError) { registerReviewEvent(true) diff --git a/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimDetailsScreen.test.tsx b/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimDetailsScreen.test.tsx index a55b634cb3d..8a231052be3 100644 --- a/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimDetailsScreen.test.tsx +++ b/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimDetailsScreen.test.tsx @@ -59,7 +59,7 @@ context('ClaimDetailsScreen', () => { beforeEach(() => { when(api.get as jest.Mock) - .calledWith(`/v0/claim/600156928`, {}, expect.anything()) + .calledWith(`/v0/claim/600156928`, {}) .mockResolvedValue({ data: { ...claimData, @@ -183,7 +183,7 @@ context('ClaimDetailsScreen', () => { describe('when common error occurs', () => { it('should render error component when the stores screenID matches the components screenID', async () => { when(api.get as jest.Mock) - .calledWith(`/v0/claim/600156928`, {}, expect.anything()) + .calledWith(`/v0/claim/600156928`, {}) .mockRejectedValue({ networkError: true } as api.APIError) renderWithData() diff --git a/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimDetailsScreen.tsx b/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimDetailsScreen.tsx index b474df6172b..125b9683a1a 100644 --- a/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimDetailsScreen.tsx +++ b/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimDetailsScreen.tsx @@ -62,14 +62,12 @@ function ClaimDetailsScreen({ navigation, route }: ClaimDetailsScreenProps) { const { claimID, claimType } = route.params const queryClient = useQueryClient() - const abortController = new AbortController() - const abortSignal = abortController.signal const { data: claim, isFetching: loadingClaim, error: claimError, refetch: refetchClaim, - } = useClaim(claimID, abortSignal, { enabled: screenContentAllowed('WG_ClaimDetailsScreen') }) + } = useClaim(claimID, { enabled: screenContentAllowed('WG_ClaimDetailsScreen') }) const { data: decisionLetterData } = useDecisionLetters() const { data: userAuthorizedServices } = useAuthorizedServices() const { attributes } = claim || ({} as ClaimData) @@ -93,7 +91,6 @@ function ClaimDetailsScreen({ navigation, route }: ClaimDetailsScreenProps) { // if claim is still loading cancel it if (loadingClaim) { queryClient.invalidateQueries({ queryKey: claimsAndAppealsKeys.claim }) - abortController.abort() } }) diff --git a/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimStatus/ClaimFileUpload/AskForClaimDecision/AskForClaimDecision.test.tsx b/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimStatus/ClaimFileUpload/AskForClaimDecision/AskForClaimDecision.test.tsx index 2dd152ad4cd..cf9594f38f1 100644 --- a/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimStatus/ClaimFileUpload/AskForClaimDecision/AskForClaimDecision.test.tsx +++ b/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimStatus/ClaimFileUpload/AskForClaimDecision/AskForClaimDecision.test.tsx @@ -19,7 +19,7 @@ jest.mock('utils/hooks', () => { }) when(api.get as jest.Mock) - .calledWith(`/v0/claim/600156928/request-decision`, {}, expect.anything()) + .calledWith(`/v0/claim/600156928/request-decision`, {}) .mockResolvedValue({}) context('AskForClaimDecision', () => { @@ -53,7 +53,7 @@ context('AskForClaimDecision', () => { it('should initialize', async () => { when(api.get as jest.Mock) - .calledWith(`/v0/claim/600156928`, {}, undefined) + .calledWith(`/v0/claim/600156928`, {}) .mockResolvedValue({ data: { ...claim, @@ -95,7 +95,7 @@ context('AskForClaimDecision', () => { describe('when submitted decision is false or there is an erroror check box is not checked', () => { it('should not call navigation go back and display a field error when not checked', async () => { when(api.get as jest.Mock) - .calledWith(`/v0/claim/600156928`, {}, undefined) + .calledWith(`/v0/claim/600156928`, {}) .mockResolvedValue({ data: { ...claim, @@ -131,7 +131,7 @@ context('AskForClaimDecision', () => { describe('when common error occurs', () => { it('should render error component when the stores screenID matches the components screenID', async () => { when(api.get as jest.Mock) - .calledWith(`/v0/claim/600156928`, {}, undefined) + .calledWith(`/v0/claim/600156928`, {}) .mockRejectedValue({ networkError: true } as api.APIError) initializeTestInstance() await waitFor(() => expect(screen.getByRole('header', { name: "The app can't be loaded." })).toBeTruthy()) diff --git a/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimStatus/ClaimFileUpload/FileRequest.test.tsx b/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimStatus/ClaimFileUpload/FileRequest.test.tsx index 831a5f6a732..a51b0634adc 100644 --- a/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimStatus/ClaimFileUpload/FileRequest.test.tsx +++ b/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimStatus/ClaimFileUpload/FileRequest.test.tsx @@ -69,7 +69,7 @@ context('FileRequest', () => { ] when(api.get as jest.Mock) - .calledWith(`/v0/claim/600156928`, {}, undefined) + .calledWith(`/v0/claim/600156928`, {}) .mockResolvedValue({ data: { ...Claim, @@ -90,7 +90,7 @@ context('FileRequest', () => { describe('when number of requests is equal to 1', () => { it('display correctly', async () => { when(api.get as jest.Mock) - .calledWith(`/v0/claim/600156928`, {}, undefined) + .calledWith(`/v0/claim/600156928`, {}) .mockResolvedValue({ data: { ...Claim, @@ -132,7 +132,7 @@ context('FileRequest', () => { describe('when common error occurs', () => { it('should render error component when the stores screenID matches the components screenID', async () => { when(api.get as jest.Mock) - .calledWith(`/v0/claim/600156928`, {}, undefined) + .calledWith(`/v0/claim/600156928`, {}) .mockRejectedValue({ networkError: true } as api.APIError) renderWithData(request) @@ -162,7 +162,7 @@ context('FileRequest', () => { }, ] when(api.get as jest.Mock) - .calledWith(`/v0/claim/600156928`, {}, undefined) + .calledWith(`/v0/claim/600156928`, {}) .mockResolvedValue({ data: { ...Claim, diff --git a/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimStatus/ClaimFileUpload/FileRequest.tsx b/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimStatus/ClaimFileUpload/FileRequest.tsx index 7b0d8afcded..20ee6112943 100644 --- a/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimStatus/ClaimFileUpload/FileRequest.tsx +++ b/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimStatus/ClaimFileUpload/FileRequest.tsx @@ -39,7 +39,7 @@ function FileRequest({ navigation, route }: FileRequestProps) { error: claimError, refetch: refetchClaim, isFetching: loadingClaim, - } = useClaim(claimID, undefined, { enabled: !claim }) + } = useClaim(claimID, { enabled: !claim }) const requests = currentRequestsForVet( claim?.attributes.eventsTimeline || claimFallBack?.attributes.eventsTimeline || [], ) diff --git a/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimStatus/ClaimTimeline/ClaimPhase.tsx b/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimStatus/ClaimTimeline/ClaimPhase.tsx index ec0abb97733..81b0f18a1a9 100644 --- a/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimStatus/ClaimTimeline/ClaimPhase.tsx +++ b/VAMobile/src/screens/BenefitsScreen/ClaimsScreen/ClaimDetailsScreen/ClaimStatus/ClaimTimeline/ClaimPhase.tsx @@ -2,14 +2,16 @@ import React, { RefObject, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { ScrollView } from 'react-native' +import { Icon } from '@department-of-veterans-affairs/mobile-component-library' + import { ClaimAttributesData } from 'api/types' -import { AccordionCollapsible, Box, LabelTag, LabelTagTypeConstants, TextView, VAIcon } from 'components' +import { AccordionCollapsible, Box, LabelTag, LabelTagTypeConstants, TextView } from 'components' import { Events } from 'constants/analytics' import { NAMESPACE } from 'constants/namespaces' import { a11yLabelVA } from 'utils/a11yLabel' import { logAnalyticsEvent } from 'utils/analytics' import { getUserPhase, isDisabilityCompensationClaim, numberOfItemsNeedingAttentionFromVet } from 'utils/claims' -import { useAutoScrollToElement, useTheme } from 'utils/hooks' +import { useAutoScrollToElement, useFontScale, useTheme } from 'utils/hooks' /** * props for ClaimPhase components @@ -34,6 +36,7 @@ function ClaimPhase({ phase, attributes, claimID, scrollIsEnabled, scrollViewRef const { t } = useTranslation(NAMESPACE.COMMON) const [scrollRef, viewRef, scrollToCurrentPhase] = useAutoScrollToElement() const theme = useTheme() + const fs = useFontScale() const { condensedMarginBetween, standardMarginBetween, tinyMarginBetween } = theme.dimensions const isDisabilityClaim = isDisabilityCompensationClaim(attributes.claimTypeCode) @@ -46,6 +49,7 @@ function ClaimPhase({ phase, attributes, claimID, scrollIsEnabled, scrollViewRef const isIncompletePhase = phase > current const hasFileRequests = numberOfItemsNeedingAttentionFromVet(attributes.eventsTimeline || []) > 0 const disableScroll = !scrollIsEnabled || (hasFileRequests && !attributes?.waiverSubmitted) + const indicatorDiameter = fs(30) useEffect(() => { if (phase > 1 && isCurrentPhase && scrollViewRef?.current && !disableScroll) { @@ -58,13 +62,15 @@ function ClaimPhase({ phase, attributes, claimID, scrollIsEnabled, scrollViewRef {isCompletedPhase && ( - + 24 ? 24 : indicatorDiameter} + height={indicatorDiameter > 24 ? 24 : indicatorDiameter} + width={indicatorDiameter > 24 ? 24 : indicatorDiameter}> + + )} { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule or cancel?' })).toBeTruthy() expect(screen.getByText('If you need to reschedule or cancel this appointment, call your provider.')).toBeTruthy() }) @@ -165,6 +169,9 @@ context('CommunityCareAppointment', () => { expect(screen.getByRole('header', { name: 'Need to reschedule or cancel?' })).toBeTruthy() expect(screen.getByText('If you need to reschedule or cancel this appointment, call your provider.')).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByRole('link', { name: 'Find your VA location' })).toBeTruthy() expect(screen.getByLabelText('Find your V-A location')).toBeTruthy() expect( @@ -319,6 +326,9 @@ context('CommunityCareAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule?' })).toBeTruthy() expect( screen.getByText( @@ -394,6 +404,9 @@ context('CommunityCareAppointment', () => { ), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByRole('link', { name: 'Go to VA.gov to schedule' })).toBeTruthy() expect(screen.getByLabelText('Go to V-A .gov to schedule')).toBeTruthy() }) diff --git a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/CommunityCareAppointment.tsx b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/CommunityCareAppointment.tsx index cb4b90a3f25..c4760cf9011 100644 --- a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/CommunityCareAppointment.tsx +++ b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/CommunityCareAppointment.tsx @@ -17,6 +17,7 @@ import { AppointmentDateAndTime, AppointmentDetailsModality, AppointmentLocation, + AppointmentMedicationWording, AppointmentPersonalContactInfo, AppointmentProvider, AppointmentReasonAndComment, @@ -75,6 +76,7 @@ function CommunityCareAppointment({ )} + { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule or cancel?' })).toBeTruthy() expect( screen.getByText('You can cancel this appointment in the app. But if you need to reschedule, call us.'), @@ -176,6 +180,9 @@ context('InPersonVAAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule or cancel?' })).toBeTruthy() expect(screen.getByText('If you need to reschedule or cancel this appointment, call us.')).toBeTruthy() @@ -348,6 +355,9 @@ context('InPersonVAAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule?' })).toBeTruthy() expect( screen.getByText( @@ -414,6 +424,9 @@ context('InPersonVAAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule?' })).toBeTruthy() expect( screen.getByText( diff --git a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/InPersonVAAppointment.tsx b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/InPersonVAAppointment.tsx index 3ce360e193a..ee356998769 100644 --- a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/InPersonVAAppointment.tsx +++ b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/InPersonVAAppointment.tsx @@ -13,6 +13,7 @@ import { AppointmentDateAndTime, AppointmentDetailsModality, AppointmentLocation, + AppointmentMedicationWording, AppointmentPersonalContactInfo, AppointmentPreferredModality, AppointmentProvider, @@ -62,6 +63,7 @@ function InPersonVAAppointment({ + { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule or cancel?' })).toBeTruthy() expect( screen.getByText('You can cancel this appointment in the app. But if you need to reschedule, call us.'), @@ -139,6 +143,9 @@ context('PhoneAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule or cancel?' })).toBeTruthy() expect(screen.getByText('If you need to reschedule or cancel this appointment, call us.')).toBeTruthy() @@ -260,6 +267,9 @@ context('PhoneAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule?' })).toBeTruthy() expect( screen.getByText( @@ -307,6 +317,9 @@ context('PhoneAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule?' })).toBeTruthy() expect( screen.getByText( diff --git a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/PhoneAppointment.tsx b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/PhoneAppointment.tsx index aa9f94b0f84..cb3c0762f29 100644 --- a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/PhoneAppointment.tsx +++ b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/PhoneAppointment.tsx @@ -13,6 +13,7 @@ import { AppointmentDateAndTime, AppointmentDetailsModality, AppointmentLocation, + AppointmentMedicationWording, AppointmentPersonalContactInfo, AppointmentPreferredModality, AppointmentProvider, @@ -56,6 +57,7 @@ function PhoneAppointment({ appointmentID, attributes, subType, goBack, cancelAp + )} - - navigateTo('PrepareForVideoVisit')} - testID="prepareForVideoVisitTestID" - /> - ) default: diff --git a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/SharedComponents/AppointmentMedicationWording.tsx b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/SharedComponents/AppointmentMedicationWording.tsx new file mode 100644 index 00000000000..c102357887f --- /dev/null +++ b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/SharedComponents/AppointmentMedicationWording.tsx @@ -0,0 +1,105 @@ +import React from 'react' +import { useTranslation } from 'react-i18next' + +import { TFunction } from 'i18next' + +import { Box, LinkWithAnalytics, TextView, VABulletList } from 'components' +import { NAMESPACE } from 'constants/namespaces' +import { + AppointmentDetailsScreenType, + AppointmentDetailsSubType, + AppointmentDetailsSubTypeConstants, + AppointmentDetailsTypeConstants, +} from 'utils/appointments' +import getEnv from 'utils/env' +import { useRouteNavigation, useTheme } from 'utils/hooks' + +const getWebViewLink = (onPress: () => void, t: TFunction) => ( + +) + +type AppointmentMedicationWordingProps = { + subType: AppointmentDetailsSubType + type: AppointmentDetailsScreenType +} + +const { WEBVIEW_URL_WHAT_TO_BRING_TO_APPOINTMENTS } = getEnv() + +function AppointmentMedicationWording({ subType, type }: AppointmentMedicationWordingProps) { + const { t } = useTranslation(NAMESPACE.COMMON) + const navigateTo = useRouteNavigation() + const body = t('appointmentsTab.medicationWording.default.body') + const theme = useTheme() + + const openWebviewLink = () => { + navigateTo('Webview', { + url: WEBVIEW_URL_WHAT_TO_BRING_TO_APPOINTMENTS, + displayTitle: t('webview.vagov'), + loadingMessage: t('loading.vaWebsite'), + }) + } + + const webViewLink = getWebViewLink(openWebviewLink, t) + + const getContent = () => { + switch (type) { + case AppointmentDetailsTypeConstants.InPersonVA: + case AppointmentDetailsTypeConstants.Phone: + case AppointmentDetailsTypeConstants.CommunityCare: + case AppointmentDetailsTypeConstants.VideoVA: + return ( + <> + {body} + {webViewLink} + + ) + case AppointmentDetailsTypeConstants.VideoAtlas: + case AppointmentDetailsTypeConstants.VideoGFE: + case AppointmentDetailsTypeConstants.VideoHome: + return ( + <> + + {webViewLink} + + { + navigateTo('PrepareForVideoVisit') + }} + /> + + ) + default: + return null + } + } + + switch (subType) { + case AppointmentDetailsSubTypeConstants.Upcoming: + case AppointmentDetailsSubTypeConstants.Canceled: + const content = getContent() + if (!content) { + return <> + } + + return ( + + + {t('appointmentsTab.medicationWording.title')} + + {content} + + ) + default: + return <> + } +} + +export default AppointmentMedicationWording diff --git a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/SharedComponents/index.ts b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/SharedComponents/index.ts index e093d40ee65..afab848232c 100644 --- a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/SharedComponents/index.ts +++ b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/SharedComponents/index.ts @@ -10,6 +10,8 @@ export { default as AppointmentDetailsModality } from './AppointmentDetailsModal export * from './AppointmentDetailsModality' export { default as AppointmentJoinSessionPrepareForVideo } from './AppointmentJoinSessionPrepareForVideo' export * from './AppointmentJoinSessionPrepareForVideo' +export { default as AppointmentMedicationWording } from './AppointmentMedicationWording' +export * from './AppointmentMedicationWording' export { default as AppointmentLocation } from './AppointmentLocation' export * from './AppointmentLocation' export { default as AppointmentPersonalContactInfo } from './AppointmentPersonalContactInfo' diff --git a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoAtlasAppointment.test.tsx b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoAtlasAppointment.test.tsx index 980fc3e00ae..27fde95a44c 100644 --- a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoAtlasAppointment.test.tsx +++ b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoAtlasAppointment.test.tsx @@ -1,6 +1,7 @@ import React from 'react' import { screen } from '@testing-library/react-native' +import { t } from 'i18next' import { AppointmentAttributes, @@ -106,6 +107,12 @@ context('VideoAtlasAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.default.body'))).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.bullet2'))).toBeTruthy() + expect(screen.getByTestId('prepareForVideoVisitTestID')).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule or cancel?' })).toBeTruthy() expect( screen.getByText('If you need to reschedule or cancel this appointment, call the scheduling facility.'), @@ -159,6 +166,12 @@ context('VideoAtlasAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.default.body'))).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.bullet2'))).toBeTruthy() + expect(screen.getByTestId('prepareForVideoVisitTestID')).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule or cancel?' })).toBeTruthy() expect( screen.getByText('If you need to reschedule or cancel this appointment, call the scheduling facility.'), @@ -303,6 +316,12 @@ context('VideoAtlasAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.default.body'))).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.bullet2'))).toBeTruthy() + expect(screen.getByTestId('prepareForVideoVisitTestID')).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule?' })).toBeTruthy() expect( screen.getByText( @@ -362,6 +381,12 @@ context('VideoAtlasAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.default.body'))).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.bullet2'))).toBeTruthy() + expect(screen.getByTestId('prepareForVideoVisitTestID')).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule?' })).toBeTruthy() expect( screen.getByText( diff --git a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoAtlasAppointment.tsx b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoAtlasAppointment.tsx index e3c9e4f44b1..938487727f5 100644 --- a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoAtlasAppointment.tsx +++ b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoAtlasAppointment.tsx @@ -13,6 +13,7 @@ import { AppointmentDateAndTime, AppointmentDetailsModality, AppointmentLocation, + AppointmentMedicationWording, AppointmentPersonalContactInfo, AppointmentPreferredModality, AppointmentProvider, @@ -62,6 +63,7 @@ function VideoAtlasAppointment({ + { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.default.body'))).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.bullet2'))).toBeTruthy() + expect(screen.getByTestId('prepareForVideoVisitTestID')).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule or cancel?' })).toBeTruthy() expect( screen.getByText('If you need to reschedule or cancel this appointment, call the scheduling facility.'), @@ -141,6 +148,12 @@ context('VideoGFEAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.default.body'))).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.bullet2'))).toBeTruthy() + expect(screen.getByTestId('prepareForVideoVisitTestID')).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule or cancel?' })).toBeTruthy() expect( screen.getByText('If you need to reschedule or cancel this appointment, call the scheduling facility.'), @@ -269,6 +282,12 @@ context('VideoGFEAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.default.body'))).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.bullet2'))).toBeTruthy() + expect(screen.getByTestId('prepareForVideoVisitTestID')).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule?' })).toBeTruthy() expect( screen.getByText( @@ -320,6 +339,12 @@ context('VideoGFEAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.default.body'))).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.bullet2'))).toBeTruthy() + expect(screen.getByTestId('prepareForVideoVisitTestID')).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule?' })).toBeTruthy() expect( screen.getByText( diff --git a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoGFEAppointment.tsx b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoGFEAppointment.tsx index 4dfa70550e0..6c3a3218c37 100644 --- a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoGFEAppointment.tsx +++ b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoGFEAppointment.tsx @@ -13,6 +13,7 @@ import { AppointmentDateAndTime, AppointmentDetailsModality, AppointmentLocation, + AppointmentMedicationWording, AppointmentPersonalContactInfo, AppointmentPreferredModality, AppointmentProvider, @@ -62,6 +63,7 @@ function VideoGFEAppointment({ + { expect(screen.getByRole('header', { name: 'Video appointment' })).toBeTruthy() expect(screen.getByText('You can join this appointment now.')).toBeTruthy() expect(screen.getByRole('button', { name: 'Join session' })).toBeTruthy() - expect(screen.getByRole('link', { name: 'How to prepare for your video appointment' })).toBeTruthy() + expect(screen.getByTestId('prepareForVideoVisitTestID')).toBeTruthy() expect(screen.getByRole('header', { name: 'Saturday, February 6, 2021\n11:53 AM PST' })).toBeTruthy() @@ -100,6 +101,12 @@ context('VideoHomeAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.default.body'))).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.bullet2'))).toBeTruthy() + expect(screen.getByTestId('prepareForVideoVisitTestID')).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule or cancel?' })).toBeTruthy() expect( screen.getByText('If you need to reschedule or cancel this appointment, call the scheduling facility.'), @@ -132,7 +139,6 @@ context('VideoHomeAppointment', () => { expect(screen.getByRole('header', { name: 'Video appointment' })).toBeTruthy() expect(screen.getByText('You can join this appointment now.')).toBeTruthy() expect(screen.getByRole('button', { name: 'Join session' })).toBeTruthy() - expect(screen.getByRole('link', { name: 'How to prepare for your video appointment' })).toBeTruthy() expect(screen.getByRole('header', { name: 'Saturday, February 6, 2021\n11:53 AM PST' })).toBeTruthy() @@ -145,6 +151,12 @@ context('VideoHomeAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.default.body'))).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.bullet2'))).toBeTruthy() + expect(screen.getByTestId('prepareForVideoVisitTestID')).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule or cancel?' })).toBeTruthy() expect( screen.getByText('If you need to reschedule or cancel this appointment, call the scheduling facility.'), @@ -273,6 +285,12 @@ context('VideoHomeAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.default.body'))).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.bullet2'))).toBeTruthy() + expect(screen.getByTestId('prepareForVideoVisitTestID')).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule?' })).toBeTruthy() expect( screen.getByText( @@ -324,6 +342,12 @@ context('VideoHomeAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.default.body'))).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.bullet2'))).toBeTruthy() + expect(screen.getByTestId('prepareForVideoVisitTestID')).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule?' })).toBeTruthy() expect( screen.getByText( diff --git a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoHomeAppointment.tsx b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoHomeAppointment.tsx index 02854c9c496..48ee05de832 100644 --- a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoHomeAppointment.tsx +++ b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoHomeAppointment.tsx @@ -14,6 +14,7 @@ import { AppointmentDetailsModality, AppointmentJoinSessionPrepareForVideo, AppointmentLocation, + AppointmentMedicationWording, AppointmentPersonalContactInfo, AppointmentPreferredModality, AppointmentProvider, @@ -64,6 +65,7 @@ function VideoHomeAppointment({ + { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule or cancel?' })).toBeTruthy() expect(screen.getByText('If you need to reschedule or cancel this appointment, call us.')).toBeTruthy() }) @@ -173,6 +177,9 @@ context('VideoVAAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule or cancel?' })).toBeTruthy() expect(screen.getByText('If you need to reschedule or cancel this appointment, call us.')).toBeTruthy() @@ -345,6 +352,9 @@ context('VideoVAAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule?' })).toBeTruthy() expect( screen.getByText( @@ -411,6 +421,9 @@ context('VideoVAAppointment', () => { screen.getByText('Other details: Please arrive 20 minutes before the start of your appointment'), ).toBeTruthy() + expect(screen.getByRole('header', { name: t('appointmentsTab.medicationWording.title') })).toBeTruthy() + expect(screen.getByRole('link', { name: t('appointmentsTab.medicationWording.whatToBringLink') })).toBeTruthy() + expect(screen.getByRole('header', { name: 'Need to reschedule?' })).toBeTruthy() expect( screen.getByText( diff --git a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoVAAppointment.tsx b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoVAAppointment.tsx index 270249de655..6bca9e3300f 100644 --- a/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoVAAppointment.tsx +++ b/VAMobile/src/screens/HealthScreen/Appointments/AppointmentTypeComponents/VideoVAAppointment.tsx @@ -13,6 +13,7 @@ import { AppointmentDateAndTime, AppointmentDetailsModality, AppointmentLocation, + AppointmentMedicationWording, AppointmentPersonalContactInfo, AppointmentPreferredModality, AppointmentProvider, @@ -62,6 +63,7 @@ function VideoVAAppointment({ + + {isPhoneAppointment ? ( { }) it('initializes correctly', () => { - expect(screen.getByText('Before your appointment:')).toBeTruthy() - expect( - screen.getByText( - 'If you’re using an iPad or iPhone for your appointment, you’ll need to download the VA Video Connect iOS app beforehand. If you’re using any other device, you don’t need to download any software or app before your appointment.', - ), - ).toBeTruthy() - expect( - screen.getByText( - 'You’ll need to have access to a web camera and microphone. You can use an external camera and microphone if your device doesn’t have one.', - ), - ).toBeTruthy() - expect( - screen.getByText( - /To connect to your Virtual Meeting Room at the appointment time, click the "Join session" button or the link that's in your confirmation email./, - ), - ).toBeTruthy() - expect(screen.getByText('To have the best possible video experience, we recommend you:')).toBeTruthy() - expect( - screen.getByText('Connect to your video appointment from a quiet, private, and well-lighted location.'), - ).toBeTruthy() - expect( - screen.getByText('Check to ensure you have a strong Internet connection before your appointment.'), - ).toBeTruthy() - expect( - screen.getByText( - 'Connect to your appointment using a Wi-Fi network if using your mobile phone, rather than your cellular data network.', - ), - ).toBeTruthy() - expect(screen.getByText('Medication review:')).toBeTruthy() - expect( - screen.getByText( - 'During your video appointment, your provider will want to review all the medications, vitamins, herbs, and supplements you’re taking—no matter if you got them from another provider, VA clinic, or local store.', - ), - ).toBeTruthy() - expect( - screen.getByText( - "Please be ready to talk about your medications during your video visit to ensure you're getting the best and safest care possible.", - ), - ).toBeTruthy() + expect(screen.getByText(t('appointmentsTab.medicationWording.howToSetUpDevice'))).toBeTruthy() + expect(screen.getByText(t('prepareForVideoVisit.beforeYourAppointment'))).toBeTruthy() + expect(screen.getByText(t('prepareForVideoVisit.downloadBasedOnDevice'))).toBeTruthy() + expect(screen.getByText(t('prepareForVideoVisit.cameraAndMicrophone'))).toBeTruthy() + expect(screen.getByText(t('prepareForVideoVisit.joinBy'))).toBeTruthy() + expect(screen.getByText(t('prepareForVideoVisit.toHaveBestExperience'))).toBeTruthy() + expect(screen.getByText(t('prepareForVideoVisit.connectFromQuietPlace'))).toBeTruthy() + expect(screen.getByText(t('prepareForVideoVisit.checkConnection'))).toBeTruthy() + expect(screen.getByText(t('prepareForVideoVisit.connectWithWifi'))).toBeTruthy() }) }) diff --git a/VAMobile/src/screens/HealthScreen/Appointments/UpcomingAppointments/PrepareForVideoVisit/PrepareForVideoVisit.tsx b/VAMobile/src/screens/HealthScreen/Appointments/UpcomingAppointments/PrepareForVideoVisit/PrepareForVideoVisit.tsx index 26248762970..d6596630bcb 100644 --- a/VAMobile/src/screens/HealthScreen/Appointments/UpcomingAppointments/PrepareForVideoVisit/PrepareForVideoVisit.tsx +++ b/VAMobile/src/screens/HealthScreen/Appointments/UpcomingAppointments/PrepareForVideoVisit/PrepareForVideoVisit.tsx @@ -3,7 +3,7 @@ import { useTranslation } from 'react-i18next' import { StackScreenProps } from '@react-navigation/stack/lib/typescript/src/types' -import { Box, LargePanel, TextView } from 'components' +import { Box, LargePanel, TextView, VABulletList } from 'components' import { NAMESPACE } from 'constants/namespaces' import { useTheme } from 'utils/hooks' @@ -18,39 +18,32 @@ function PrepareForVideoVisit({}: PrepareForVideoVisitProps) { return ( - - {t('prepareForVideoVisit.beforeYourAppointment')} - - - {t('prepareForVideoVisit.downloadBasedOnDevice')} - - - {t('prepareForVideoVisit.cameraAndMicrophone')} + + {t('appointmentsTab.medicationWording.howToSetUpDevice')} - - {t('prepareForVideoVisit.joinBy')} + + {t('prepareForVideoVisit.beforeYourAppointment')} + - + {t('prepareForVideoVisit.toHaveBestExperience')} - - {t('prepareForVideoVisit.connectFromQuietPlace')} - - - {t('prepareForVideoVisit.checkConnection')} - - - {t('prepareForVideoVisit.connectWithWifi')} - - - - {t('prepareForVideoVisit.medicationReview')} - - - {t('prepareForVideoVisit.reviewEverything')} - - {t('prepareForVideoVisit.beReadyToTalk')} + ) diff --git a/VAMobile/src/screens/HealthScreen/Pharmacy/PrescriptionHistory/PrescriptionHistory.tsx b/VAMobile/src/screens/HealthScreen/Pharmacy/PrescriptionHistory/PrescriptionHistory.tsx index 177e1e8e259..56e50ce8038 100644 --- a/VAMobile/src/screens/HealthScreen/Pharmacy/PrescriptionHistory/PrescriptionHistory.tsx +++ b/VAMobile/src/screens/HealthScreen/Pharmacy/PrescriptionHistory/PrescriptionHistory.tsx @@ -5,6 +5,7 @@ import { Pressable, PressableProps, ScrollView } from 'react-native' import { StackScreenProps } from '@react-navigation/stack' import { Button } from '@department-of-veterans-affairs/mobile-component-library' +import { Icon, IconProps } from '@department-of-veterans-affairs/mobile-component-library/src/components/Icon/Icon' import { LinkProps } from '@department-of-veterans-affairs/mobile-component-library/src/components/Link/Link' import { filter, find } from 'underscore' @@ -32,7 +33,6 @@ import { PaginationProps, TextView, VAIcon, - VAIconProps, } from 'components' import RadioGroupModal, { RadioGroupModalProps } from 'components/RadioGroupModal' import { Events } from 'constants/analytics' @@ -262,7 +262,7 @@ function PrescriptionHistory({ navigation, route }: PrescriptionHistoryProps) { const bottomContent = ( - + {t('prescription.history.tracking')} @@ -517,9 +517,9 @@ function PrescriptionHistory({ navigation, route }: PrescriptionHistoryProps) { } } - const helpIconProps: VAIconProps = { - name: 'QuestionMark', - fill2: theme.colors.icon.transparent, + const helpIconProps: IconProps = { + name: 'HelpOutline', + fill: theme.colors.icon.active, } const headerButton = { diff --git a/VAMobile/src/screens/HealthScreen/Pharmacy/RefillScreens/RefillRequestSummary.tsx b/VAMobile/src/screens/HealthScreen/Pharmacy/RefillScreens/RefillRequestSummary.tsx index 6073c2c6961..515b79b7e9a 100644 --- a/VAMobile/src/screens/HealthScreen/Pharmacy/RefillScreens/RefillRequestSummary.tsx +++ b/VAMobile/src/screens/HealthScreen/Pharmacy/RefillScreens/RefillRequestSummary.tsx @@ -4,6 +4,7 @@ import { useTranslation } from 'react-i18next' import { StackScreenProps } from '@react-navigation/stack' import { Button, ButtonVariants } from '@department-of-veterans-affairs/mobile-component-library' +import { Icon, IconProps } from '@department-of-veterans-affairs/mobile-component-library/src/components/Icon/Icon' import { useRequestRefills } from 'api/prescriptions' import { PrescriptionsList, RefillStatusConstants } from 'api/types' @@ -15,15 +16,13 @@ import { LoadingComponent, TextArea, TextView, - VAIcon, - VAIconProps, } from 'components' import FullScreenSubtask from 'components/Templates/FullScreenSubtask' import { Events } from 'constants/analytics' import { NAMESPACE } from 'constants/namespaces' import { a11yLabelVA } from 'utils/a11yLabel' import { logAnalyticsEvent } from 'utils/analytics' -import { useBeforeNavBackListener, useRouteNavigation, useTheme } from 'utils/hooks' +import { useBeforeNavBackListener, useFontScale, useRouteNavigation, useTheme } from 'utils/hooks' import { HealthStackParamList } from '../../HealthStackScreens' import { getRxNumberTextAndLabel } from '../PrescriptionCommon' @@ -43,7 +42,8 @@ function RefillRequestSummary({ navigation, route }: RefillRequestSummaryProps) const { t } = useTranslation(NAMESPACE.COMMON) const [status, setStatus] = useState() const [requestFailed, setRequestFailed] = useState([]) - + const fs = useFontScale() + const indicatorDiameter = fs(30) const { mutate: requestRefill, isPending: showLoadingScreenRequestRefillsRetry } = useRequestRefills() const onNavToHistory = () => { @@ -124,11 +124,12 @@ function RefillRequestSummary({ navigation, route }: RefillRequestSummaryProps) const getRequestSummaryItem = () => { return refillRequestSummaryItems.map((request, index) => { - const vaIconProps: VAIconProps = { - name: request.submitted ? 'CircleCheckMark' : 'Remove', + const iconProps: IconProps = { + name: request.submitted ? 'Check' : 'Close', width: 20, height: 20, - fill: request.submitted ? theme.colors.icon.success : theme.colors.icon.error, + fill: theme.colors.icon.pagination, + preventScaling: true, } const boxProps: BoxProps = { @@ -160,7 +161,15 @@ function RefillRequestSummary({ navigation, route }: RefillRequestSummaryProps) {rxNumber} - + 24 ? 24 : indicatorDiameter} + height={indicatorDiameter > 24 ? 24 : indicatorDiameter} + width={indicatorDiameter > 24 ? 24 : indicatorDiameter}> + + ) }) diff --git a/VAMobile/src/screens/HealthScreen/SecureMessaging/EditDraft/EditDraft.tsx b/VAMobile/src/screens/HealthScreen/SecureMessaging/EditDraft/EditDraft.tsx index 03d36ee5b90..ac68fa5c401 100644 --- a/VAMobile/src/screens/HealthScreen/SecureMessaging/EditDraft/EditDraft.tsx +++ b/VAMobile/src/screens/HealthScreen/SecureMessaging/EditDraft/EditDraft.tsx @@ -315,7 +315,7 @@ function EditDraft({ navigation, route }: EditDraftProps) { menuViewActions.push({ actionText: t('save'), addDivider: true, - iconName: 'Folder', + iconProps: { name: 'Folder', fill: theme.colors.icon.defaultMenuItem }, accessibilityLabel: t('secureMessaging.saveDraft'), onPress: () => { setOnSaveDraftClicked(true) @@ -326,9 +326,8 @@ function EditDraft({ navigation, route }: EditDraftProps) { menuViewActions.push({ actionText: t('delete'), addDivider: false, - iconName: 'Trash', + iconProps: { name: 'Delete', fill: theme.colors.icon.error }, accessibilityLabel: t('secureMessaging.deleteDraft.menuBtnA11y'), - iconColor: 'error', textColor: 'error', onPress: onDeletePressed, }) diff --git a/VAMobile/src/screens/HealthScreen/SecureMessaging/ReplyMessage/ReplyMessage.tsx b/VAMobile/src/screens/HealthScreen/SecureMessaging/ReplyMessage/ReplyMessage.tsx index 4ce4b02b9be..893a9ff49c1 100644 --- a/VAMobile/src/screens/HealthScreen/SecureMessaging/ReplyMessage/ReplyMessage.tsx +++ b/VAMobile/src/screens/HealthScreen/SecureMessaging/ReplyMessage/ReplyMessage.tsx @@ -115,6 +115,16 @@ function ReplyMessage({ navigation, route }: ReplyMessageProps) { const receiverID = message?.senderId const subjectHeader = formatSubject(category, subject, t) + const messageData = { + body: messageReply, + category: category, + subject: subject, + recipient_id: receiverID, + } as SecureMessagingFormData + // Ref for use in snackbar callbacks to ensure we have the latest messageData + const messageDataRef = useRef(messageData) + messageDataRef.current = messageData + const snackbarMessages: SnackbarMessages = { successMsg: t('secureMessaging.draft.saved'), errorMsg: t('secureMessaging.draft.saved.error'), @@ -141,48 +151,6 @@ function ReplyMessage({ navigation, route }: ReplyMessageProps) { } }, [saveDraftConfirmFailed]) - useEffect(() => { - if (sendMessageError && isErrorObject(sendMessageErrorDetails)) { - if (hasErrorCode(SecureMessagingErrorCodesConstants.TRIAGE_ERROR, sendMessageErrorDetails)) { - setReplyTriageError(true) - } else { - const messageData = { - body: messageReply, - category: category, - subject: subject, - recipient_id: receiverID, - } as SecureMessagingFormData - const mutateOptions = { - onSuccess: () => { - showSnackBar(snackbarSentMessages.successMsg, dispatch, undefined, true, false, true) - logAnalyticsEvent(Events.vama_sm_send_message(messageData.category, undefined)) - navigateTo('SecureMessaging', { activeTab: 0 }) - }, - } - const params: SendMessageParameters = { - messageData: messageData, - uploads: attachmentsList, - replyToID: message.messageId, - } - showSnackBar(snackbarSentMessages.errorMsg, dispatch, () => sendMessage(params, mutateOptions), false, true) - } - } - }, [ - dispatch, - sendMessageError, - sendMessageErrorDetails, - snackbarSentMessages.successMsg, - snackbarSentMessages.errorMsg, - attachmentsList, - category, - messageReply, - receiverID, - subject, - message.messageId, - navigateTo, - sendMessage, - ]) - /** * Intercept navigation action before leaving the screen, used the handle OS swipe/hardware back behavior */ @@ -242,14 +210,14 @@ function ReplyMessage({ navigation, route }: ReplyMessageProps) { ] const sendReplyOrSaveDraft = (): void => { - const messageData = { body: messageReply, category } as SecureMessagingFormData + const reducedMessageData = { body: messageReply, category } as SecureMessagingFormData if (onSaveDraftClicked) { saveDraftWithAttachmentAlert(draftAttachmentAlert, attachmentsList, t, () => { - const params: SaveDraftParameters = { messageData: messageData, replyID: message.messageId } + const params: SaveDraftParameters = { messageData: reducedMessageData, replyID: message.messageId } const mutateOptions = { onSuccess: () => { showSnackBar(snackbarMessages.successMsg, dispatch, undefined, true, false, true) - logAnalyticsEvent(Events.vama_sm_save_draft(messageData.category)) + logAnalyticsEvent(Events.vama_sm_save_draft(reducedMessageData.category)) queryClient.invalidateQueries({ queryKey: [secureMessagingKeys.folderMessages, SecureMessagingSystemFolderIdConstants.DRAFTS], }) @@ -261,7 +229,24 @@ function ReplyMessage({ navigation, route }: ReplyMessageProps) { }) }, onError: () => { - showSnackBar(snackbarMessages.errorMsg, dispatch, () => saveDraft(params, mutateOptions), false, true) + showSnackBar( + snackbarMessages.errorMsg, + dispatch, + // passing messageDataRef to ensure we have the latest messageData + () => + saveDraft( + { + messageData: { + body: messageDataRef.current.body, + category: messageDataRef.current.category, + }, + replyID: message.messageId, + }, + mutateOptions, + ), + false, + true, + ) }, } saveDraft(params, mutateOptions) @@ -273,6 +258,32 @@ function ReplyMessage({ navigation, route }: ReplyMessageProps) { logAnalyticsEvent(Events.vama_sm_send_message(messageData.category, undefined)) navigateTo('SecureMessaging', { activeTab: 0 }) }, + onError: () => { + if ( + sendMessageError && + isErrorObject(sendMessageErrorDetails) && + hasErrorCode(SecureMessagingErrorCodesConstants.TRIAGE_ERROR, sendMessageErrorDetails) + ) { + setReplyTriageError(true) + } else { + showSnackBar( + snackbarSentMessages.errorMsg, + dispatch, + // passing messageDataRef to ensure we have the latest messageData + () => + sendMessage( + { + messageData: messageDataRef.current, + uploads: attachmentsList, + replyToID: message.messageId, + }, + mutateOptions, + ), + false, + true, + ) + } + }, } const params: SendMessageParameters = { messageData: messageData, diff --git a/VAMobile/src/screens/HealthScreen/SecureMessaging/StartNewMessage/StartNewMessage.tsx b/VAMobile/src/screens/HealthScreen/SecureMessaging/StartNewMessage/StartNewMessage.tsx index 6e1ed383abe..bc5b464dfa7 100644 --- a/VAMobile/src/screens/HealthScreen/SecureMessaging/StartNewMessage/StartNewMessage.tsx +++ b/VAMobile/src/screens/HealthScreen/SecureMessaging/StartNewMessage/StartNewMessage.tsx @@ -128,53 +128,20 @@ function StartNewMessage({ navigation, route }: StartNewMessageProps) { const scrollViewRef = useRef(null) const [isDiscarded, composeCancelConfirmation] = useComposeCancelConfirmation() - useEffect(() => { - if (sendMessageError && isErrorObject(sendMessageErrorDetails)) { - if (hasErrorCode(SecureMessagingErrorCodesConstants.TRIAGE_ERROR, sendMessageErrorDetails)) { - setReplyTriageError(true) - } else { - const messageData = { - recipient_id: parseInt(to, 10), - category: category as CategoryTypes, - body: message, - subject, - } as SecureMessagingFormData - const mutateOptions = { - onSuccess: () => { - showSnackBar(snackbarSentMessages.successMsg, dispatch, undefined, true, false, true) - logAnalyticsEvent(Events.vama_sm_send_message(messageData.category, undefined)) - navigateTo('SecureMessaging', { activeTab: 0 }) - }, - } - const params: SendMessageParameters = { messageData: messageData, uploads: attachmentsList } - showSnackBar(snackbarSentMessages.errorMsg, dispatch, () => sendMessage(params, mutateOptions), false, true) - } - } - }, [ - dispatch, - sendMessageError, - sendMessageErrorDetails, - snackbarSentMessages.successMsg, - snackbarSentMessages.errorMsg, - attachmentsList, - category, - message, - to, + const messageData = { + recipient_id: parseInt(to, 10), + category: category as CategoryTypes, + body: message, subject, - navigateTo, - sendMessage, - ]) + } as SecureMessagingFormData + // Ref for use in snackbar callbacks to ensure we have the latest messageData + const messageDataRef = useRef(messageData) + messageDataRef.current = messageData const noRecipientsReceived = !recipients || recipients.length === 0 const noProviderError = noRecipientsReceived && hasLoadedRecipients const goToCancel = () => { - const messageData = { - recipient_id: parseInt(to, 10), - category: category as CategoryTypes, - body: message, - subject, - } as SecureMessagingFormData composeCancelConfirmation({ origin: FormHeaderTypeConstants.compose, draftMessageID: undefined, @@ -332,13 +299,6 @@ function StartNewMessage({ navigation, route }: StartNewMessageProps) { } const onMessageSendOrSave = (): void => { - const messageData = { - recipient_id: parseInt(to, 10), - category: category as CategoryTypes, - body: message, - subject, - } as SecureMessagingFormData - if (onSaveDraftClicked) { saveDraftWithAttachmentAlert(draftAttachmentAlert, attachmentsList, t, () => { const params: SaveDraftParameters = { messageData: messageData } @@ -357,7 +317,14 @@ function StartNewMessage({ navigation, route }: StartNewMessageProps) { }) }, onError: () => { - showSnackBar(snackbarMessages.errorMsg, dispatch, () => saveDraft(params, mutateOptions), false, true) + showSnackBar( + snackbarMessages.errorMsg, + dispatch, + // passing messageDataRef to ensure we have the latest messageData + () => saveDraft({ messageData: messageDataRef.current }, mutateOptions), + false, + true, + ) }, } saveDraft(params, mutateOptions) @@ -369,6 +336,24 @@ function StartNewMessage({ navigation, route }: StartNewMessageProps) { logAnalyticsEvent(Events.vama_sm_send_message(messageData.category, undefined)) navigateTo('SecureMessaging', { activeTab: 0 }) }, + onError: () => { + if ( + sendMessageError && + isErrorObject(sendMessageErrorDetails) && + hasErrorCode(SecureMessagingErrorCodesConstants.TRIAGE_ERROR, sendMessageErrorDetails) + ) { + setReplyTriageError(true) + } else { + showSnackBar( + snackbarSentMessages.errorMsg, + dispatch, + // passing messageDataRef to ensure we have the latest messageData + () => sendMessage({ messageData: messageDataRef.current, uploads: attachmentsList }, mutateOptions), + false, + true, + ) + } + }, } const params: SendMessageParameters = { messageData: messageData, uploads: attachmentsList } sendMessage(params, mutateOptions) diff --git a/VAMobile/src/screens/HealthScreen/SecureMessaging/ViewMessage/ViewMessageScreen.tsx b/VAMobile/src/screens/HealthScreen/SecureMessaging/ViewMessage/ViewMessageScreen.tsx index 97c83dd869b..bcb6ec070e1 100644 --- a/VAMobile/src/screens/HealthScreen/SecureMessaging/ViewMessage/ViewMessageScreen.tsx +++ b/VAMobile/src/screens/HealthScreen/SecureMessaging/ViewMessage/ViewMessageScreen.tsx @@ -4,6 +4,7 @@ import { useSelector } from 'react-redux' import { StackScreenProps } from '@react-navigation/stack/lib/typescript/src/types' +import { IconProps } from '@department-of-veterans-affairs/mobile-component-library/src/components/Icon/Icon' import { useQueryClient } from '@tanstack/react-query' import { DateTime } from 'luxon' import _ from 'underscore' @@ -346,8 +347,9 @@ function ViewMessageScreen({ route, navigation }: ViewMessageScreenProps) { } } - const moveIconProps: VAIconProps = { + const moveIconProps: IconProps = { name: 'Folder', + fill: theme.colors.icon.active, } // If error is caused by an individual message, we want the error alert to be diff --git a/VAMobile/src/screens/HomeScreen/HomeScreen.tsx b/VAMobile/src/screens/HomeScreen/HomeScreen.tsx index 511a777ab6c..cab27ac6447 100644 --- a/VAMobile/src/screens/HomeScreen/HomeScreen.tsx +++ b/VAMobile/src/screens/HomeScreen/HomeScreen.tsx @@ -8,6 +8,7 @@ import { useIsFocused } from '@react-navigation/native' import { CardStyleInterpolators, createStackNavigator } from '@react-navigation/stack' import { StackScreenProps } from '@react-navigation/stack/lib/typescript/src/types' +import { Icon, IconProps } from '@department-of-veterans-affairs/mobile-component-library/src/components/Icon/Icon' import { colors as DSColors } from '@department-of-veterans-affairs/mobile-tokens' import { DateTime } from 'luxon' @@ -37,8 +38,6 @@ import { LoadingComponent, Nametag, TextView, - VAIcon, - VAIconProps, } from 'components' import { Events } from 'constants/analytics' import { TimeFrameTypeConstants } from 'constants/appointments' @@ -290,8 +289,9 @@ export function HomeScreen({}: HomeScreenProps) { label: t('profile.title'), accessibilityRole: 'link', icon: { - name: 'ProfileSelected', - } as VAIconProps, + name: 'AccountCircle', + fill: theme.colors.icon.active, + } as IconProps, onPress: () => navigateTo('Profile'), } @@ -343,11 +343,7 @@ export function HomeScreen({}: HomeScreenProps) { alignItems="center" accessible={true} accessibilityLabel={`${t('icon.success')} ${t('noActivity')}`}> - + - + {title} diff --git a/VAMobile/src/store/api/api.ts b/VAMobile/src/store/api/api.ts index bddeb3576d5..08d9f0e4edd 100644 --- a/VAMobile/src/store/api/api.ts +++ b/VAMobile/src/store/api/api.ts @@ -200,11 +200,7 @@ const call = async function ( // Guard against responses that can't be parsed as JSON if (!response.headers.get('Content-Type')?.startsWith('application/json')) { - if (endpoint === '/v0/user/logged-in') { - return - } else { - logAnalyticsEvent(Events.vama_9385_api_cType(endpoint, response.headers.get('Content-Type') || '')) - } + return } // No errors found, return the response @@ -219,12 +215,8 @@ const call = async function ( } } -export const get = async function ( - endpoint: string, - params: Params = {}, - abortSignal?: AbortSignal, -): Promise { - return call('GET', endpoint, params, undefined, abortSignal) +export const get = async function (endpoint: string, params: Params = {}): Promise { + return call('GET', endpoint, params, undefined) } export const post = async function ( @@ -236,8 +228,12 @@ export const post = async function ( return call('POST', endpoint, params, contentType, abortSignal) } -export const put = async function (endpoint: string, params: Params = {}): Promise { - return call('PUT', endpoint, params) +export const put = async function ( + endpoint: string, + params: Params = {}, + abortSignal?: AbortSignal, +): Promise { + return call('PUT', endpoint, params, undefined, abortSignal) } export const patch = async function (endpoint: string, params: Params = {}): Promise { diff --git a/VAMobile/src/styles/theme.ts b/VAMobile/src/styles/theme.ts index 624ea6a5e72..a074168cc6b 100644 --- a/VAMobile/src/styles/theme.ts +++ b/VAMobile/src/styles/theme.ts @@ -216,6 +216,7 @@ export type VABackgroundColors = { linkRow: string skeletonLoader: string skeletonLoaderSecondary: string + bullet: string } export type VABorderColors = { diff --git a/VAMobile/src/styles/themes/colorSchemes.ts b/VAMobile/src/styles/themes/colorSchemes.ts index 278d613e5fb..eeaaa7c1048 100644 --- a/VAMobile/src/styles/themes/colorSchemes.ts +++ b/VAMobile/src/styles/themes/colorSchemes.ts @@ -49,6 +49,7 @@ export const lightTheme = { linkRow: DSColors.vadsColorGrayWarmLight, skeletonLoader: DSColors.vadsColorBaseLighter, skeletonLoaderSecondary: DSColors.vadsColorBaseLightest, + bullet: colors.grayDark, }, border: { aboutYou: DSColors.vadsColorGrayWarmLight, @@ -273,6 +274,7 @@ export const darkTheme = { linkRow: colors.darkmodeGrayWarmDark, skeletonLoader: DSColors.vadsColorGrayMedium, skeletonLoaderSecondary: DSColors.vadsColorBaseLight, + bullet: colors.grayLighter, }, border: { aboutYou: colors.darkmodeBorder, diff --git a/VAMobile/src/styles/themes/standardTheme.ts b/VAMobile/src/styles/themes/standardTheme.ts index 4a5e27d2090..9fc35506472 100644 --- a/VAMobile/src/styles/themes/standardTheme.ts +++ b/VAMobile/src/styles/themes/standardTheme.ts @@ -135,8 +135,8 @@ const fontSizes = { lineHeight: 21, }, textWithIconButton: { - fontSize: 12, - lineHeight: 15, + fontSize: 16, + lineHeight: 20, }, UnreadMessagesTag: { fontSize: 20, @@ -152,8 +152,8 @@ const fontSizes = { lineHeight: 30, }, webviewTitle: { - fontSize: 12, - lineHeight: 12, + fontSize: 20, + lineHeight: 30, }, veteranStatus: { fontSize: 16, diff --git a/VAMobile/src/translations/en/common.json b/VAMobile/src/translations/en/common.json index 6b248854b7c..d58b833d46e 100644 --- a/VAMobile/src/translations/en/common.json +++ b/VAMobile/src/translations/en/common.json @@ -13,7 +13,6 @@ "KB.a11y": "kilobytes", "MB": "MB", "MB.a11y": "megabytes", - "aboutVA": "About VA", "aboutYou": "About you", "aboutYou.loading": "Loading your information...", "aboutYou.noInformation": "We can’t show your information right now.", @@ -229,7 +228,6 @@ "appointments.claimExam": "Claim exam", "appointments.claimExam.explanationText": "This appointment is for disability rating purposes only. It doesn't include treatment. If you have medical evidence to support your claim, bring copies to this appointment.", "appointments.clinic": "Clinic: {{ clinicName }}", - "appointments.clinicLocation": "Clinic location: {{ physicalLocation }}", "appointments.communityCare.upcomingBody": "Ask your provider how to attend this appointment.", "appointments.communityCare.upcomingTitle": "Community care appointment", "appointments.confirmed": "Confirmed", @@ -249,30 +247,23 @@ "appointments.inPersonVA.missingAddress.noDirections.noAddressOnly.communityCare": "We can't show your provider's address right now. Try again later. Or call your provider to get the address.", "appointments.inPersonVA.missingAddress.noDirections.noAnything": "We can't show the health care facility's information right now. Try again later. Or go to VA.gov to find your facility's information.", "appointments.inPersonVA.missingAddress.noDirections.noAnything.communityCare": "We can't show your provider's information right now. Try again later. Or go to VA.gov to find your provider's information.", - "appointments.inPersonVA.pastTitle": "Past in-person appointment", "appointments.inPersonVA.upcomingBody": "Go to {{ facilityName }} for this appointment.", "appointments.inPersonVA.upcomingTitle": "In-person appointment", "appointments.joinVideoConnect": "You can join VA Video Connect up to 30 minutes prior to the start time.", "appointments.keepAppointment": "Keep appointment", "appointments.loadingAppointments": "Loading your appointments...", "appointments.location.title": "Where to attend", - "appointments.noProvider": "Provider not noted", - "appointments.noProviderSelected": "No provider selected", "appointments.notAvailable": "Not available", - "appointments.noTypeOfCare": "Type of care not noted", "appointments.pastBody": "This appointment happened in the past.", "appointments.pastTitle": "Past {{ appointmentType }}", "appointments.pending": "Pending", "appointments.pending.body": "We'll try to schedule your appointment in the next 2 business days. Check back here or call your facility for updates.", "appointments.pending.cancelRequest.a11yHint": "Cancel this appointment request", - "appointments.pending.cancelled.pendingRequestTypeOfCare": "Canceled request for {{typeOfCare}} appointment", "appointments.pending.cancelled.theTimeAndDate": "{{who}} canceled this appointment.", "appointments.pending.dateInSlotTime": "{{optionDate}} in the {{optionTime}}", "appointments.pending.inAfternoon": "afternoon", "appointments.pending.inMorning": "morning", "appointments.pending.officeVisit": "Office visit", - "appointments.pending.phoneCall": "Phone call", - "appointments.pending.preferredDateAndTime": "Preferred date and time", "appointments.pending.preferredDateAndTimeFrame": "Preferred date and timeframe", "appointments.pending.preferredModality": "How you prefer to attend", "appointments.pending.preferredTypeOfAppointment": "Preferred type of appointment", @@ -323,6 +314,11 @@ "appointmentsTab.past.a11yHint": "review your past appointments", "appointmentsTab.upcoming": "Upcoming", "appointmentsTab.upcoming.a11yHint": "review your upcoming appointments", + "appointmentsTab.medicationWording.title": "Prepare for your appointment", + "appointmentsTab.medicationWording.default.body": "Bring your insurance cards. And bring a list of your medications and other information to share with your provider.", + "appointmentsTab.medicationWording.whatToBringLink": "Find a full list of things to bring to your appointment", + "appointmentsTab.medicationWording.bullet2": "Get your device ready to join.", + "appointmentsTab.medicationWording.howToSetUpDevice": "How to set up your device", "areYouSure": "Are you sure?", "askForClaimDecision.alertBtnTitle": "Request evaluation", "askForClaimDecision.alertTitle": "Request claim evaluation?", @@ -423,12 +419,9 @@ "claimDetails.weDecidedMailed": "We decided your claim on {{date}}. We mailed you a decision letter. It should arrive within 10 days after the date we decided your claim. It can sometimes take longer.", "claimDetails.weDecidedYourClaimOn": "We decided your claim on {{date}}", "claimDetails.weEstimatedThis": "We estimated your claim would be completed by now but we need more time.", - "claimDetails.whatShouldIDoIfDisagree": "What should I do if I disagree with VA's decision on my disability claim?", "claimDetails.whatYouHaveClaimed": "What you've claimed", "claimDetails.whyWeCombineLink": "Find out why we sometimes combine claims", "claimDetails.whyWeCombinePanel": "Why we sometimes combine claims", - "claimDetails.youCanDownload": "You can download your decision letter in the app. We also mailed you this letter.", - "claimDetails.yourRepresentative": "Your representative for VA claims", "claimInformation.loading": "Loading your claim details...", "claimLetters.download.error": "Letter not loaded", "claimLetters.downloading": "Loading your claim letter...", @@ -476,8 +469,6 @@ "claimPhase.youHaveFileRequest_plural": "You have {{count}} file requests", "claimPhase.youHaveFileRequestVA": "You have {{count}} file request from VA", "claimPhase.youHaveFileRequestVA_plural": "You have {{count}} file requests from VA", - "claims.appealFor": "{{displayTitle}} updated on {{date}}", - "claims.claimFor": "Claim for {{displayTitle}} updated on {{date}}", "claims.decisionLetterMailed": "Decision letter mailed", "claims.decisionLetterReady": "Decision letter ready", "claims.decisionLetterReady.alertBody": "You can download your decision letter and other claim letters in the app.", @@ -486,7 +477,6 @@ "claims.title": "Claims", "claims.viewYourActiveClaims": "Review your active claims and appeals", "claims.viewYourClosedClaims": "Review your closed claims and appeals", - "claims.youClaimsAndAppeals": "Your {{claimType}} claims and appeals", "claims.yourClaims": "Your {{claimType}} claims, decision reviews, and appeals", "claimsAndAppeal.appealStatusUnavailable": "Appeal status is unavailable", "claimsAndAppeal.claimAndAppealStatusUnavailable": "Claims and appeal status are unavailable", @@ -573,7 +563,6 @@ "contactVA.va411.body.a11yLabel": "My VA 4 1 1 is our main VA information line. We can help connect you to any of our VA contact centers.", "contactVA.va411.callMy": "Call MyVA411", "contactVA.va411.callMy.a11yLabel": "Call My VA 4 1 1", - "contactYourVA": "Contact your VA regional office for more information.", "continue": "Continue", "continueToSignin": "Continue to sign in", "crisisLineButton.label": "Talk to the Veterans Crisis Line now", @@ -679,7 +668,6 @@ "editDirectDeposit.pleaseCheckDDInfo": "Check your direct deposit information", "editDirectDeposit.routingNumber": "Routing number", "editDirectDeposit.routingNumberFieldError": "Enter a 9-digit routing number", - "editDirectDeposit.routingNumberHelperText": "Your bank’s name will appear after you add the 9-digit routing number", "editDraft": "Edit draft", "editEmail.alertError": "Check your email address", "editEmail.fieldError": "Enter your email address again using this format: X@X.com", @@ -710,11 +698,9 @@ "errors.networkConnection.body": "You aren't connected to the internet. Check your internet connection and try again.", "errors.networkConnection.header": "The app can't be loaded.", "expandToReview": "Expand to review more details", - "field": "Field", "file.removeFile": "Remove file?", "files": "Files", "fileFolder": "File folder", - "fileRemoved": "File removed", "fileRequest.askForYourClaimEvaluationBody": "Please review the evaluation details if you are ready for us to begin evaluating your claim", "fileRequest.askForYourClaimEvaluationTitle": "Ask for your claim evaluation", "fileRequest.buttonA11y": "Request {{requestNumber}} of {{totalCount}}", @@ -800,9 +786,6 @@ "forward.a11yHint": "Navigates to the next page", "goToMyVAHealth": "Go to My VA Health", "goToVAGov": "Go to VA.gov", - "greetings.afternoon": "Good afternoon", - "greetings.evening": "Good evening", - "greetings.morning": "Good morning", "health.activity.error": "We can't get some of your information right now. Health activity may not be accurate. Check back later.", "health.activity.downtime": "We're working on the mobile app. Health activity may not be accurate. Check back later.", "health.title": "Health", @@ -905,8 +888,8 @@ "lettersAndDocs.title": "VA letters and documents", "listPosition": "{{position}} of {{total}}", "loading": "Loading", + "loading.vaWebsite": "Loading VA.gov webpage...", "loadingActivity": "Loading activity", - "loadingComponent.spinner.a11y": "Loading icon,", "loaGate.expandMsg": "Read more if you haven't yet verified", "loaGate.p1": "Before we give you access to your VA claim and health care information, we need to make sure you’re you. This helps us protect you from fraud and identity theft.", "loaGate.p2": "If you haven’t yet verified your identity, we’ll help you complete the process when you sign in.", @@ -988,13 +971,11 @@ "notifications.saving": "Saving your notification preferences...", "notifications.settings.alert.openSettings": "Open device settings", "notifications.settings.alert.text": "To get app notifications, turn them on in your device settings.", - "notifications.settings.alert.title": "Turn on push notifications", "notifications.settings.link.text": "Manage email and text notifications on VA.gov", "notifications.settings.personalize.text.systemNotificationsOn": "We'll send these notifications to your device.", "notifications.settings.privacy": "Your privacy is important to us. We won't show any personal information in your notifications.", "notifications.settings.switch.a11yHint": "Select whether to turn on push notifications for {{ notificationChannelName }}", "notifications.title": "Notifications", - "notNoted": "Not noted", "onboarding.allInformationYouNeed": "With this app, you can manage your VA health care, benefits, and payments from your phone or tablet.", "onboarding.backA11yHint.benefitsOnboarding": "Go back to the benefits onboarding page", "onboarding.backA11yHint.healthOnboarding": "Go back to the health care onboarding page", @@ -1029,7 +1010,6 @@ "pagination.info": "{{beginIdx}} to {{endIdx}} of {{totalEntries}}", "pagination.next": "Next page", "pagination.previous": "Previous page", - "pastAppointmentDetails.toScheduleAnotherAppointment": "To schedule another appointment, please visit VA.gov or call your VA medical center.", "pastAppointments.allOf": "All of {{year}}", "pastAppointments.dateRangeA11yLabel": "{{date1}} to {{date2}}", "pastAppointments.eightMonthsToSixMonths": "8 months to 6 months", @@ -1089,7 +1069,6 @@ "personalInformation.preferredName.editHelperText": "25 characters maximum", "personalInformation.preferredName.fieldEmpty": "Enter a preferred name", "personalInformation.preferredName.lettersOnly": "Enter letters only", - "personalInformation.preferredName.nameTag": "{{preferredName}} {{middleName}} {{lastName}}", "personalInformation.preferredName.notSaved": "Preferred name not saved", "personalInformation.preferredName.saveLoadingText": "Saving your preferred name...", "personalInformation.preferredName.saved": "Preferred name saved", @@ -1100,23 +1079,18 @@ "personalInformation.title": "Personal information", "phoneNumber": "Phone Number", "photoGallery": "Photo gallery", - "photoRemoved": "Photo removed", "picker": "picker", "picker.noSelection": "no selection made", "pickerLaunchBtn": "Move", "pickerMoveMessageToFolder": "Move message to", - "positionOf": "position {{ position }} of {{ tabTotal }}", "preferredCommunityCareProvider": "Preferred community care provider", - "prepareForVideoVisit.beReadyToTalk": "Please be ready to talk about your medications during your video visit to ensure you're getting the best and safest care possible.", "prepareForVideoVisit.beforeYourAppointment": "Before your appointment:", "prepareForVideoVisit.cameraAndMicrophone": "You’ll need to have access to a web camera and microphone. You can use an external camera and microphone if your device doesn’t have one.", "prepareForVideoVisit.checkConnection": "Check to ensure you have a strong Internet connection before your appointment.", "prepareForVideoVisit.connectFromQuietPlace": "Connect to your video appointment from a quiet, private, and well-lighted location.", "prepareForVideoVisit.connectWithWifi": "Connect to your appointment using a Wi-Fi network if using your mobile phone, rather than your cellular data network.", "prepareForVideoVisit.downloadBasedOnDevice": "If you’re using an iPad or iPhone for your appointment, you’ll need to download the VA Video Connect iOS app beforehand. If you’re using any other device, you don’t need to download any software or app before your appointment.", - "prepareForVideoVisit.joinBy": "To connect to your Virtual Meeting Room at the appointment time, click the \"Join session\" button or the link that's in your confirmation email.", - "prepareForVideoVisit.medicationReview": "Medication review:", - "prepareForVideoVisit.reviewEverything": "During your video appointment, your provider will want to review all the medications, vitamins, herbs, and supplements you’re taking—no matter if you got them from another provider, VA clinic, or local store.", + "prepareForVideoVisit.joinBy": "To connect to your Virtual Meeting Room at the appointment time, click the “Join session” button.", "prepareForVideoVisit.toHaveBestExperience": "To have the best possible video experience, we recommend you:", "prescriptions.activityButton.subText": "{{count}} ready to refill", "prescription.details.banner.body1": "We transferred this prescription to My VA Health.", @@ -1256,7 +1230,6 @@ "remove.a11yHint": "Click to remove {{ content }} from added attachments", "removePhoto": "Remove photo?", "reply": "Reply", - "request.backLabel": "Requests", "requestNotifications.getNotified": "Get notified when you have upcoming appointments and more.", "requestNotifications.skip": "Skip for now", "requestNotifications.stayUpdated": "Stay updated with app notifications", @@ -1363,7 +1336,6 @@ "secureMessaging.startNewMessage.subject.tooManyCharacters": "Enter 50 characters or less", "secureMessaging.startNewMessage.test": "Test", "secureMessaging.startNewMessage.to.fieldError": "Select a care team to message", - "secureMessaging.tag.a11y": "You have {{unreadCount}} unread messages", "secureMessaging.title": "Messages", "secureMessaging.unread.a11y": "Unread:", "secureMessaging.viewAttachment.a11yHint": "Review this attachment", @@ -1409,22 +1381,11 @@ "termsAndConditions.toAccept": "To accept the current terms and conditions, please go to the My HealtheVet website: ", "termsAndConditions.toAccept.a11yLabel": "To accept the current terms and conditions, please go to the My Healthy Vet website: ", "text.raw": "{{text}}", - "textInput": "text input", "thisFacilityWillContactYou": "This facility will contact you if we need more information about your request.", "tryAgain": "Try again", "upcoming": "upcoming", "upcomingAppointmentDetails.addToCalendarA11yHint": "Add this appointment to your device's calendar", - "upcomingAppointmentDetails.appointmentCode": "Appointment code: {{code}}", "upcomingAppointmentDetails.cancelAppointment": "Cancel appointment", - "upcomingAppointmentDetails.cancelCommunityCareAppointment.body": "Call your community care provider. You can't cancel community care appointments online.", - "upcomingAppointmentDetails.cancelCompensationAndPension.body": "Call the {{facility}} compensation and pension office.", - "upcomingAppointmentDetails.cancelCovidVaccineAppointment.body": "COVID-19 appointments can't be canceled online. Please call the VA facility to cancel your appointment.", - "upcomingAppointmentDetails.cancelCovidVaccineAppointment.title": "To cancel this appointment, call your VA medical center", - "upcomingAppointmentDetails.cancelUncancellableAppointment.body": "Call your VA health facility. You can't cancel {{appointmentType}} appointments online.", - "upcomingAppointmentDetails.cancelUncancellableAppointment.body.alternative": "Call your VA health facility.", - "upcomingAppointmentDetails.cancelVAAppointment.body": "If you want to reschedule this appointment, you'll need to first cancel this one and then create a new appointment.", - "upcomingAppointmentDetails.cancelVAAppointment.title": "Cancel this appointment", - "upcomingAppointmentDetails.doYouNeedToCancel": "Do you need to cancel?", "upcomingAppointmentDetails.doYouNeedToCancelOrReschedule": "Need to reschedule or cancel?", "upcomingAppointmentDetails.doYouNeedToCancelOrReschedule.claimExam.body": "Call the compensation and pension office at {{facilityName}}.", "upcomingAppointmentDetails.doYouNeedToCancelOrReschedule.inAppCancel.body": "You can cancel this appointment in the app. But if you need to reschedule, call us.", @@ -1435,27 +1396,12 @@ "upcomingAppointmentDetails.findYourVAFacility.a11yHint": "This page will open in your device's browser", "upcomingAppointmentDetails.findYourVALocation": "Find your VA location", "upcomingAppointmentDetails.findYourVALocation.a11yHint": "Takes you to the V-A facility locator page. This page will open in your device's browser", - "upcomingAppointmentDetails.howToJoin": "How to join your video appointment", - "upcomingAppointmentDetails.howToJoinInstructionsAtlas": "You must join this video meeting from the ATLAS (non-VA) location listed below.", - "upcomingAppointmentDetails.howToJoinInstructionsVAAtHome": "You can join VA Video Connect 30 minutes prior to the start time.", - "upcomingAppointmentDetails.howToJoinInstructionsVADevice": "To join this video appointment, you'll need to use a device we provide.", - "upcomingAppointmentDetails.howToJoinInstructionsVALocation": "You must join this video meeting from the VA location listed below.", - "upcomingAppointmentDetails.howToJoinVirtualSession": "How to join your virtual session", "upcomingAppointmentDetails.howToJoinVirtualSessionA11yHint": "Navigates to the VA Video Connect appointment", "upcomingAppointmentDetails.joinSession": "Join session", - "upcomingAppointmentDetails.joinSession.disabledText": "This button is currently disabled as the appointment time has not begun.", "upcomingAppointmentDetails.loadingAppointmentCancellation": "Canceling your appointment...", - "upcomingAppointmentDetails.noPhoneOrAddress": "We can't display this provider's contact information right now. Try again later, or contact your VA facility and ask for the community care office.", - "upcomingAppointmentDetails.phoneAndNameButNoAddress": "We can't display this provider's address right now. Try again later, or call the provider to get the address.", - "upcomingAppointmentDetails.phoneButNoNameOrAddress": "We can't display all of the provider's information right now. Try again later, or call the provider.", - "upcomingAppointmentDetails.prepareForVideoVisit": "Prepare for video visit", - "upcomingAppointmentDetails.provider": "Provider", - "upcomingAppointmentDetails.reason": "You shared these details about your concern", "upcomingAppointmentDetails.reasonComment": "Other details: {{comment}}", "upcomingAppointmentDetails.reasonDetails": "Reason: {{reason}}", "upcomingAppointmentDetails.sharedProvider": "Details you shared with your provider", - "upcomingAppointmentDetails.specialInstructions": "Special instructions", - "upcomingAppointmentDetails.useCode": "You will use this code to find your appointment using the computer provided at the site.", "upcomingAppointments.addToCalendar": "Add to calendar", "upcomingAppointments.communityCare": "Community care", "upcomingAppointments.confirmedApptsDisplayed": "Here are your appointments. This list includes appointments you've requested but not yet confirmed.", @@ -1517,21 +1463,9 @@ "veteranStatus.uniformedServices.A11yLabel": "You can use this Veteran status to prove you served in the United States Uniformed Services. This status doesn't entitle you to any V-A benefits.", "veteranStatus.uploadPhoto": "Upload photo", "video": "Video", - "waygateEditScreen.title": "Waygate Edit Screen", - "waygateManagement.title": "Waygate Management", "webview.appointments.loading": "Loading appointments page...", - "webview.changeLegalName.loading": "Loading how to change your legal name...", "webview.vagov": "va.gov", "webview.valocation.loading": "Loading VA location finder...", - "whatsNew.bodyCopy.2.0": "We updated sections to Home, Benefits, Health, and Payments.", - "whatsNew.bodyCopy.2.0.bullet.1": "Profile is now on Home screen.", - "whatsNew.bodyCopy.2.0.bullet.2": "Disability rating and VA letters are now in Benefits.", - "whatsNew.bodyCopy.2.0.bullet.2.a11yLabel": "Disability rating and V-A letters are now in Benefits.", - "whatsNew.bodyCopy.2.0.bullet.3": "Direct deposit is now in Payments.", - "whatsNew.bodyCopy.2.2": "You can now get claim decision letters in the app.", - "whatsNew.bodyCopy.2.3": "You can now add and edit your preferred name and gender identity in your Profile section.", - "whatsNew.bodyCopy.2.13": "You can now show proof of your Veteran status with the app.", - "whatsNew.bodyCopy.2.23": "We updated how we filter and sort your prescriptions. Your active prescriptions will now show at the top of your list. You can still filter and sort your list how you want.", "whatsNew.dismissMessage": "Dismiss this message", "whatsNew.title": "What's new" } diff --git a/VAMobile/src/utils/claims.tsx b/VAMobile/src/utils/claims.tsx index aabef110f77..8691302ce61 100644 --- a/VAMobile/src/utils/claims.tsx +++ b/VAMobile/src/utils/claims.tsx @@ -2,11 +2,12 @@ import React, { ReactElement } from 'react' import { launchCamera, launchImageLibrary } from 'react-native-image-picker' import { Asset, ImagePickerResponse } from 'react-native-image-picker/src/types' +import { Icon } from '@department-of-veterans-affairs/mobile-component-library' import { ActionSheetOptions } from '@expo/react-native-action-sheet' import { TFunction } from 'i18next' import { ClaimAttributesData, ClaimEventData, FILE_REQUEST_STATUS, FILE_REQUEST_TYPE } from 'api/types' -import { Box, BoxProps, TextView, VAIcon } from 'components' +import { Box, BoxProps, TextView } from 'components' import { Events } from 'constants/analytics' import { DISABILITY_COMPENSATION_CLAIM_TYPE_CODES, MAX_NUM_PHOTOS } from 'constants/claims' @@ -244,9 +245,9 @@ export const deletePhoto = ( export const getIndicatorCommonProps = (fs: (val: number) => number) => { const indicatorDiameter = fs(30) return { - height: indicatorDiameter > 35 ? 35 : indicatorDiameter, - width: indicatorDiameter > 35 ? 35 : indicatorDiameter, - borderRadius: indicatorDiameter > 35 ? 35 : indicatorDiameter, + height: indicatorDiameter > 24 ? 24 : indicatorDiameter, + width: indicatorDiameter > 24 ? 24 : indicatorDiameter, + borderRadius: indicatorDiameter > 24 ? 24 : indicatorDiameter, justifyContent: 'center', textAlign: 'center', alignItems: 'center', @@ -264,7 +265,7 @@ export const getIndicatorValue = (number: number, useCheckMark: boolean): ReactE if (useCheckMark) { return ( - + ) } else { diff --git a/VAMobile/src/utils/env.ts b/VAMobile/src/utils/env.ts index b8f0b6a7074..522fef5004b 100644 --- a/VAMobile/src/utils/env.ts +++ b/VAMobile/src/utils/env.ts @@ -38,6 +38,7 @@ import { WEBVIEW_URL_CHANGE_LEGAL_NAME, WEBVIEW_URL_CORONA_FAQ, WEBVIEW_URL_FACILITY_LOCATOR, + WEBVIEW_URL_WHAT_TO_BRING_TO_APPOINTMENTS, } from '@env' export type EnvVars = { @@ -79,6 +80,7 @@ export type EnvVars = { WEBVIEW_URL_CORONA_FAQ: string WEBVIEW_URL_FACILITY_LOCATOR: string WEBVIEW_URL_CHANGE_LEGAL_NAME: string + WEBVIEW_URL_WHAT_TO_BRING_TO_APPOINTMENTS: string } // need to wrap @env for testing purposes @@ -121,4 +123,5 @@ export default (): EnvVars => ({ WEBVIEW_URL_CORONA_FAQ, WEBVIEW_URL_FACILITY_LOCATOR, WEBVIEW_URL_CHANGE_LEGAL_NAME, + WEBVIEW_URL_WHAT_TO_BRING_TO_APPOINTMENTS, }) diff --git a/VAMobile/yarn.lock b/VAMobile/yarn.lock index 582ce00b083..465e30e606e 100644 --- a/VAMobile/yarn.lock +++ b/VAMobile/yarn.lock @@ -20,42 +20,35 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" - integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.0.tgz#9374b5cd068d128dac0b94ff482594273b1c2815" + integrity sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g== dependencies: - "@babel/highlight" "^7.24.7" - picocolors "^1.0.0" - -"@babel/code-frame@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.7.tgz#438f2c524071531d643c6f0188e1e28f130cebc7" - integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g== - dependencies: - "@babel/highlight" "^7.25.7" + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.8": - version "7.24.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.9.tgz#53eee4e68f1c1d0282aa0eb05ddb02d033fc43a0" - integrity sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng== +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.0.tgz#f02ba6d34e88fadd5e8861e8b38902f43cc1c819" + integrity sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.0", "@babel/core@^7.21.3", "@babel/core@^7.24.9": - version "7.24.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.9.tgz#dc07c9d307162c97fa9484ea997ade65841c7c82" - integrity sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg== +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.0", "@babel/core@^7.21.3", "@babel/core@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" + integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.9" - "@babel/helper-compilation-targets" "^7.24.8" - "@babel/helper-module-transforms" "^7.24.9" - "@babel/helpers" "^7.24.8" - "@babel/parser" "^7.24.8" - "@babel/template" "^7.24.7" - "@babel/traverse" "^7.24.8" - "@babel/types" "^7.24.9" + "@babel/code-frame" "^7.26.0" + "@babel/generator" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.0" + "@babel/parser" "^7.26.0" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -80,32 +73,13 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.20.0", "@babel/generator@^7.23.0", "@babel/generator@^7.24.8", "@babel/generator@^7.24.9", "@babel/generator@^7.7.2": - version "7.24.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.9.tgz#5c2575a1070e661bbbc9df82a853989c9a656f12" - integrity sha512-G8v3jRg+z8IwY1jHFxvCNhOPYPterE4XljNgdGTYfSTtzzwjIswIzIaSPSLs3R7yFuqnqNeay5rjICfqVr+/6A== - dependencies: - "@babel/types" "^7.24.9" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" - -"@babel/generator@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.0.tgz#f858ddfa984350bc3d3b7f125073c9af6988f18e" - integrity sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw== +"@babel/generator@^7.20.0", "@babel/generator@^7.23.0", "@babel/generator@^7.25.9", "@babel/generator@^7.26.0", "@babel/generator@^7.7.2": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.0.tgz#505cc7c90d92513f458a477e5ef0703e7c91b8d7" + integrity sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w== dependencies: - "@babel/types" "^7.25.0" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" - -"@babel/generator@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.7.tgz#de86acbeb975a3e11ee92dd52223e6b03b479c56" - integrity sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA== - dependencies: - "@babel/types" "^7.25.7" + "@babel/parser" "^7.26.0" + "@babel/types" "^7.26.0" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -124,36 +98,29 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-annotate-as-pure@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" - integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-annotate-as-pure@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz#63f02dbfa1f7cb75a9bdb832f300582f30bb8972" - integrity sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA== +"@babel/helper-annotate-as-pure@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" + integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== dependencies: - "@babel/types" "^7.25.7" + "@babel/types" "^7.25.9" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" - integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz#f41752fe772a578e67286e6779a68a5a92de1ee9" + integrity sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g== dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz#b607c3161cd9d1744977d4f97139572fe778c271" - integrity sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw== +"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== dependencies: - "@babel/compat-data" "^7.24.8" - "@babel/helper-validator-option" "^7.24.8" - browserslist "^4.23.1" + "@babel/compat-data" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" @@ -172,32 +139,17 @@ "@babel/helper-split-export-declaration" "^7.18.6" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz#2eaed36b3a1c11c53bdf80d53838b293c52f5b3b" - integrity sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-member-expression-to-functions" "^7.24.7" - "@babel/helper-optimise-call-expression" "^7.24.7" - "@babel/helper-replace-supers" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - semver "^6.3.1" - -"@babel/helper-create-class-features-plugin@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz#5d65074c76cae75607421c00d6bd517fe1892d6b" - integrity sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.7" - "@babel/helper-member-expression-to-functions" "^7.25.7" - "@babel/helper-optimise-call-expression" "^7.25.7" - "@babel/helper-replace-supers" "^7.25.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" - "@babel/traverse" "^7.25.7" +"@babel/helper-create-class-features-plugin@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz#7644147706bb90ff613297d49ed5266bde729f83" + integrity sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/traverse" "^7.25.9" semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6": @@ -209,13 +161,13 @@ regexpu-core "^5.3.1" semver "^6.3.0" -"@babel/helper-create-regexp-features-plugin@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz#be4f435a80dc2b053c76eeb4b7d16dd22cfc89da" - integrity sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA== +"@babel/helper-create-regexp-features-plugin@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz#3e8999db94728ad2b2458d7a470e7770b7764e26" + integrity sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - regexpu-core "^5.3.1" + "@babel/helper-annotate-as-pure" "^7.25.9" + regexpu-core "^6.1.1" semver "^6.3.1" "@babel/helper-define-polyfill-provider@^0.6.1": @@ -229,6 +181,17 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" +"@babel/helper-define-polyfill-provider@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" + integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + "@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.21.5": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba" @@ -239,13 +202,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-environment-visitor@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" - integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== - dependencies: - "@babel/types" "^7.24.7" - "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" @@ -262,14 +218,6 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.23.0" -"@babel/helper-function-name@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" - integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== - dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" - "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" @@ -277,13 +225,6 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-hoist-variables@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" - integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== - dependencies: - "@babel/types" "^7.24.7" - "@babel/helper-member-expression-to-functions@^7.21.5": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz#3b1a009af932e586af77c1030fba9ee0bde396c0" @@ -291,21 +232,13 @@ dependencies: "@babel/types" "^7.21.5" -"@babel/helper-member-expression-to-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz#67613d068615a70e4ed5101099affc7a41c5225f" - integrity sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w== +"@babel/helper-member-expression-to-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" + integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ== dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-member-expression-to-functions@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz#541a33b071f0355a63a0fa4bdf9ac360116b8574" - integrity sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA== - dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.22.5", "@babel/helper-module-imports@^7.24.7": version "7.24.7" @@ -315,34 +248,22 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-module-imports@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz#dba00d9523539152906ba49263e36d7261040472" - integrity sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw== +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.9": - version "7.24.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz#e13d26306b89eea569180868e652e7f514de9d29" - integrity sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw== +"@babel/helper-module-transforms@^7.25.9", "@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-simple-access" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - -"@babel/helper-module-transforms@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz#2ac9372c5e001b19bc62f1fe7d96a18cb0901d1a" - integrity sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ== - dependencies: - "@babel/helper-module-imports" "^7.25.7" - "@babel/helper-simple-access" "^7.25.7" - "@babel/helper-validator-identifier" "^7.25.7" - "@babel/traverse" "^7.25.7" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -351,24 +272,17 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-optimise-call-expression@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" - integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-optimise-call-expression@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz#1de1b99688e987af723eed44fa7fc0ee7b97d77a" - integrity sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng== +"@babel/helper-optimise-call-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e" + integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ== dependencies: - "@babel/types" "^7.25.7" + "@babel/types" "^7.25.9" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.25.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz#8ec5b21812d992e1ef88a9b068260537b6f0e36c" - integrity sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" + integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" @@ -380,23 +294,14 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-remap-async-to-generator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz#b3f0f203628522713849d49403f1a414468be4c7" - integrity sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-wrap-function" "^7.24.7" - -"@babel/helper-remap-async-to-generator@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" - integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw== +"@babel/helper-remap-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" + integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-wrap-function" "^7.25.0" - "@babel/traverse" "^7.25.0" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" + "@babel/traverse" "^7.25.9" "@babel/helper-replace-supers@^7.21.5": version "7.21.5" @@ -410,39 +315,22 @@ "@babel/traverse" "^7.21.5" "@babel/types" "^7.21.5" -"@babel/helper-replace-supers@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz#f933b7eed81a1c0265740edc91491ce51250f765" - integrity sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg== +"@babel/helper-replace-supers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5" + integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-member-expression-to-functions" "^7.24.7" - "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/helper-replace-supers@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz#38cfda3b6e990879c71d08d0fef9236b62bd75f5" - integrity sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw== +"@babel/helper-simple-access@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz#6d51783299884a2c74618d6ef0f86820ec2e7739" + integrity sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q== dependencies: - "@babel/helper-member-expression-to-functions" "^7.25.7" - "@babel/helper-optimise-call-expression" "^7.25.7" - "@babel/traverse" "^7.25.7" - -"@babel/helper-simple-access@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" - integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-simple-access@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz#5eb9f6a60c5d6b2e0f76057004f8dacbddfae1c0" - integrity sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ== - dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" "@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" @@ -451,21 +339,13 @@ dependencies: "@babel/types" "^7.20.0" -"@babel/helper-skip-transparent-expression-wrappers@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" - integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== +"@babel/helper-skip-transparent-expression-wrappers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" + integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA== dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-skip-transparent-expression-wrappers@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz#382831c91038b1a6d32643f5f49505b8442cb87c" - integrity sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA== - dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" @@ -481,42 +361,25 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" - integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-string-parser@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" - integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== - -"@babel/helper-string-parser@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz#d50e8d37b1176207b4fe9acedec386c565a44a54" - integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g== +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== "@babel/helper-validator-identifier@^7.16.7": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - -"@babel/helper-validator-identifier@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5" - integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg== +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== -"@babel/helper-validator-option@^7.21.0", "@babel/helper-validator-option@^7.24.8", "@babel/helper-validator-option@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz#97d1d684448228b30b506d90cace495d6f492729" - integrity sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ== +"@babel/helper-validator-option@^7.21.0", "@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== "@babel/helper-wrap-function@^7.18.9": version "7.20.5" @@ -528,103 +391,68 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" -"@babel/helper-wrap-function@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz#52d893af7e42edca7c6d2c6764549826336aae1f" - integrity sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw== +"@babel/helper-wrap-function@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" + integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== dependencies: - "@babel/helper-function-name" "^7.24.7" - "@babel/template" "^7.24.7" - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" -"@babel/helper-wrap-function@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81" - integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ== +"@babel/helpers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" + integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== dependencies: - "@babel/template" "^7.25.0" - "@babel/traverse" "^7.25.0" - "@babel/types" "^7.25.0" - -"@babel/helpers@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.8.tgz#2820d64d5d6686cca8789dd15b074cd862795873" - integrity sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ== - dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.8" - -"@babel/highlight@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" - integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.7" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/highlight@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.7.tgz#20383b5f442aa606e7b5e3043b0b1aafe9f37de5" - integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw== - dependencies: - "@babel/helper-validator-identifier" "^7.25.7" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.5", "@babel/parser@^7.23.0", "@babel/parser@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.8.tgz#58a4dbbcad7eb1d48930524a3fd93d93e9084c6f" - integrity sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w== + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.0" -"@babel/parser@^7.25.3": - version "7.25.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.3.tgz#91fb126768d944966263f0657ab222a642b82065" - integrity sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw== +"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.5", "@babel/parser@^7.23.0", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0": + version "7.26.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.1.tgz#44e02499960df2cdce2c456372a3e8e0c3c5c975" + integrity sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw== dependencies: - "@babel/types" "^7.25.2" + "@babel/types" "^7.26.0" -"@babel/parser@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.7.tgz#99b927720f4ddbfeb8cd195a363ed4532f87c590" - integrity sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz#cc2e53ebf0a0340777fff5ed521943e253b4d8fe" + integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g== dependencies: - "@babel/types" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz#fd059fd27b184ea2b4c7e646868a9a381bbc3055" - integrity sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ== +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz#af9e4fb63ccb8abcb92375b2fcfe36b60c774d30" + integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz#468096ca44bbcbe8fcc570574e12eb1950e18107" - integrity sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz#e8dc26fcd616e6c5bf2bd0d5a2c151d4f92a9137" + integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" - integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz#807a667f9158acac6f6164b4beb85ad9ebc9e1d1" + integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/plugin-transform-optional-chaining" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz#71b21bb0286d5810e63a1538aa901c58e87375ec" - integrity sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz#de7093f1e7deaf68eadd7cc6b07f2ab82543269e" + integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg== dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" "@babel/plugin-proposal-async-generator-functions@^7.0.0": version "7.20.7" @@ -723,21 +551,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": +"@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== @@ -751,13 +572,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.18.6": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz#3e37fca4f06d93567c1cd9b75156422e90a67107" @@ -765,21 +579,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-syntax-import-assertions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778" - integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg== +"@babel/plugin-syntax-import-assertions@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz#620412405058efa56e4a564903b79355020f445f" + integrity sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" - integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== +"@babel/plugin-syntax-import-attributes@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" + integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -793,14 +607,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.22.5", "@babel/plugin-syntax-jsx@^7.25.7", "@babel/plugin-syntax-jsx@^7.7.2": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz#5352d398d11ea5e7ef330c854dea1dae0bf18165" - integrity sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw== +"@babel/plugin-syntax-jsx@^7.22.5", "@babel/plugin-syntax-jsx@^7.25.9", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" + integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== @@ -842,26 +656,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz#bfc05b0cc31ebd8af09964650cee723bb228108b" - integrity sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g== +"@babel/plugin-syntax-typescript@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-typescript@^7.7.2": version "7.14.5" @@ -878,130 +685,132 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" - integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== +"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz#7821d4410bee5daaadbb4cdd9a6649704e176845" + integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-async-generator-functions@^7.24.3", "@babel/plugin-transform-async-generator-functions@^7.24.7": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz#b785cf35d73437f6276b1e30439a57a50747bddf" - integrity sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q== +"@babel/plugin-transform-async-generator-functions@^7.24.3", "@babel/plugin-transform-async-generator-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz#1b18530b077d18a407c494eb3d1d72da505283a2" + integrity sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-remap-async-to-generator" "^7.25.0" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/traverse" "^7.25.0" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-async-to-generator@^7.20.0", "@babel/plugin-transform-async-to-generator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" - integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== +"@babel/plugin-transform-async-to-generator@^7.20.0", "@babel/plugin-transform-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" + integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-remap-async-to-generator" "^7.24.7" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" -"@babel/plugin-transform-block-scoped-functions@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" - integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== +"@babel/plugin-transform-block-scoped-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458" + integrity sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz#42063e4deb850c7bd7c55e626bf4e7ab48e6ce02" - integrity sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ== +"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1" + integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-class-properties@^7.24.1", "@babel/plugin-transform-class-properties@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834" - integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w== +"@babel/plugin-transform-class-properties@^7.24.1", "@babel/plugin-transform-class-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz#a8ce84fedb9ad512549984101fa84080a9f5f51f" + integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-class-static-block@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" - integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== +"@babel/plugin-transform-class-static-block@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz#6c8da219f4eb15cae9834ec4348ff8e9e09664a0" + integrity sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.8.tgz#ad23301fe5bc153ca4cf7fb572a9bc8b0b711cf7" - integrity sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.8" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-replace-supers" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52" + integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/traverse" "^7.25.9" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" - integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== +"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b" + integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/template" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/template" "^7.25.9" -"@babel/plugin-transform-destructuring@^7.20.0", "@babel/plugin-transform-destructuring@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" - integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ== +"@babel/plugin-transform-destructuring@^7.20.0", "@babel/plugin-transform-destructuring@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" + integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-dotall-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" - integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== +"@babel/plugin-transform-dotall-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz#bad7945dd07734ca52fe3ad4e872b40ed09bb09a" + integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-duplicate-keys@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" - integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== +"@babel/plugin-transform-duplicate-keys@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz#8850ddf57dce2aebb4394bb434a7598031059e6d" + integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-dynamic-import@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" - integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz#6f7259b4de127721a08f1e5165b852fcaa696d31" + integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-exponentiation-operator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" - integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== +"@babel/plugin-transform-dynamic-import@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz#23e917de63ed23c6600c5dd06d94669dce79f7b8" + integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-export-namespace-from@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" - integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== +"@babel/plugin-transform-exponentiation-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz#ece47b70d236c1d99c263a1e22b62dc20a4c8b0f" + integrity sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-export-namespace-from@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz#90745fe55053394f554e40584cda81f2c8a402a2" + integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-flow-strip-types@^7.20.0", "@babel/plugin-transform-flow-strip-types@^7.21.0": version "7.21.0" @@ -1011,185 +820,177 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-flow" "^7.18.6" -"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" - integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== +"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz#4bdc7d42a213397905d89f02350c5267866d5755" + integrity sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz#6d8601fbffe665c894440ab4470bc721dd9131d6" - integrity sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w== +"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97" + integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA== dependencies: - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-json-strings@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" - integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== +"@babel/plugin-transform-json-strings@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz#c86db407cb827cded902a90c707d2781aaa89660" + integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz#36b505c1e655151a9d7607799a9988fc5467d06c" - integrity sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ== +"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz#1a1c6b4d4aa59bc4cad5b6b3a223a0abd685c9de" + integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-logical-assignment-operators@^7.24.1", "@babel/plugin-transform-logical-assignment-operators@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" - integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== +"@babel/plugin-transform-logical-assignment-operators@^7.24.1", "@babel/plugin-transform-logical-assignment-operators@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz#b19441a8c39a2fda0902900b306ea05ae1055db7" + integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-member-expression-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" - integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== +"@babel/plugin-transform-member-expression-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz#63dff19763ea64a31f5e6c20957e6a25e41ed5de" + integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-amd@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" - integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== +"@babel/plugin-transform-modules-amd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz#49ba478f2295101544abd794486cd3088dddb6c5" + integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw== dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.24.8", "@babel/plugin-transform-modules-commonjs@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz#173f0c791bb7407c092ce6d77ee90eb3f2d1d2fd" - integrity sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg== +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz#d165c8c569a080baf5467bda88df6425fc060686" + integrity sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg== dependencies: - "@babel/helper-module-transforms" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-simple-access" "^7.25.7" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-simple-access" "^7.25.9" -"@babel/plugin-transform-modules-systemjs@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz#f8012316c5098f6e8dee6ecd58e2bc6f003d0ce7" - integrity sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw== +"@babel/plugin-transform-modules-systemjs@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz#8bd1b43836269e3d33307151a114bcf3ba6793f8" + integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA== dependencies: - "@babel/helper-hoist-variables" "^7.24.7" - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" -"@babel/plugin-transform-modules-umd@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" - integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== +"@babel/plugin-transform-modules-umd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz#6710079cdd7c694db36529a1e8411e49fcbf14c9" + integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw== dependencies: - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" - integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== +"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" + integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-new-target@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" - integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== +"@babel/plugin-transform-new-target@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz#42e61711294b105c248336dcb04b77054ea8becd" + integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1", "@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" - integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1", "@babel/plugin-transform-nullish-coalescing-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz#bcb1b0d9e948168102d5f7104375ca21c3266949" + integrity sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-numeric-separator@^7.24.1", "@babel/plugin-transform-numeric-separator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" - integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== +"@babel/plugin-transform-numeric-separator@^7.24.1", "@babel/plugin-transform-numeric-separator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz#bfed75866261a8b643468b0ccfd275f2033214a1" + integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-object-rest-spread@^7.24.5", "@babel/plugin-transform-object-rest-spread@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" - integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== +"@babel/plugin-transform-object-rest-spread@^7.24.5", "@babel/plugin-transform-object-rest-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz#0203725025074164808bcf1a2cfa90c652c99f18" + integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg== dependencies: - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.7" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" -"@babel/plugin-transform-object-super@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" - integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== +"@babel/plugin-transform-object-super@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz#385d5de135162933beb4a3d227a2b7e52bb4cf03" + integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" -"@babel/plugin-transform-optional-catch-binding@^7.24.1", "@babel/plugin-transform-optional-catch-binding@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" - integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== +"@babel/plugin-transform-optional-catch-binding@^7.24.1", "@babel/plugin-transform-optional-catch-binding@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz#10e70d96d52bb1f10c5caaac59ac545ea2ba7ff3" + integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-optional-chaining@^7.24.5", "@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" - integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw== +"@babel/plugin-transform-optional-chaining@^7.24.5", "@babel/plugin-transform-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz#e142eb899d26ef715435f201ab6e139541eee7dd" + integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A== dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" - integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257" + integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-private-methods@^7.22.5", "@babel/plugin-transform-private-methods@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e" - integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ== +"@babel/plugin-transform-private-methods@^7.22.5", "@babel/plugin-transform-private-methods@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz#847f4139263577526455d7d3223cd8bda51e3b57" + integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-private-property-in-object@^7.22.11", "@babel/plugin-transform-private-property-in-object@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" - integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== +"@babel/plugin-transform-private-property-in-object@^7.22.11", "@babel/plugin-transform-private-property-in-object@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz#9c8b73e64e6cc3cbb2743633885a7dd2c385fe33" + integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw== dependencies: - "@babel/helper-annotate-as-pure" "^7.24.7" - "@babel/helper-create-class-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-property-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" - integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== +"@babel/plugin-transform-property-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz#d72d588bd88b0dec8b62e36f6fda91cedfe28e3f" + integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-react-display-name@^7.0.0": version "7.22.5" @@ -1223,20 +1024,28 @@ "@babel/plugin-syntax-jsx" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/plugin-transform-regenerator@^7.20.0", "@babel/plugin-transform-regenerator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" - integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== +"@babel/plugin-transform-regenerator@^7.20.0", "@babel/plugin-transform-regenerator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz#03a8a4670d6cebae95305ac6defac81ece77740b" + integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.25.9" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" - integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== +"@babel/plugin-transform-regexp-modifiers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz#2f5837a5b5cd3842a919d8147e9903cc7455b850" + integrity sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-reserved-words@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz#0398aed2f1f10ba3f78a93db219b27ef417fb9ce" + integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-runtime@^7.0.0", "@babel/plugin-transform-runtime@^7.24.7": version "7.24.7" @@ -1250,169 +1059,157 @@ babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" - integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" - integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" - -"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" - integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-template-literals@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" - integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-typeof-symbol@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c" - integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.8" - -"@babel/plugin-transform-typescript@^7.25.7", "@babel/plugin-transform-typescript@^7.5.0": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz#8fc7c3d28ddd36bce45b9b48594129d0e560cfbe" - integrity sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.7" - "@babel/helper-create-class-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" - "@babel/plugin-syntax-typescript" "^7.25.7" - -"@babel/plugin-transform-unicode-escapes@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" - integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-unicode-property-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" - integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" - integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/plugin-transform-unicode-sets-regex@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9" - integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - -"@babel/preset-env@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.8.tgz#e0db94d7f17d6f0e2564e8d29190bc8cdacec2d1" - integrity sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ== - dependencies: - "@babel/compat-data" "^7.24.8" - "@babel/helper-compilation-targets" "^7.24.8" - "@babel/helper-plugin-utils" "^7.24.8" - "@babel/helper-validator-option" "^7.24.8" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.7" +"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz#bb785e6091f99f826a95f9894fc16fde61c163f2" + integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9" + integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + +"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32" + integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-template-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz#6dbd4a24e8fad024df76d1fac6a03cf413f60fe1" + integrity sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-typeof-symbol@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz#224ba48a92869ddbf81f9b4a5f1204bbf5a2bc4b" + integrity sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-typescript@^7.25.9", "@babel/plugin-transform-typescript@^7.5.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz#69267905c2b33c2ac6d8fe765e9dc2ddc9df3849" + integrity sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-syntax-typescript" "^7.25.9" + +"@babel/plugin-transform-unicode-escapes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz#a75ef3947ce15363fccaa38e2dd9bc70b2788b82" + integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-unicode-property-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz#a901e96f2c1d071b0d1bb5dc0d3c880ce8f53dd3" + integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz#5eae747fe39eacf13a8bd006a4fb0b5d1fa5e9b1" + integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-unicode-sets-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz#65114c17b4ffc20fa5b163c63c70c0d25621fabe" + integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/preset-env@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.0.tgz#30e5c6bc1bcc54865bff0c5a30f6d4ccdc7fa8b1" + integrity sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw== + dependencies: + "@babel/compat-data" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.24.7" - "@babel/plugin-syntax-import-attributes" "^7.24.7" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-import-assertions" "^7.26.0" + "@babel/plugin-syntax-import-attributes" "^7.26.0" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.24.7" - "@babel/plugin-transform-async-generator-functions" "^7.24.7" - "@babel/plugin-transform-async-to-generator" "^7.24.7" - "@babel/plugin-transform-block-scoped-functions" "^7.24.7" - "@babel/plugin-transform-block-scoping" "^7.24.7" - "@babel/plugin-transform-class-properties" "^7.24.7" - "@babel/plugin-transform-class-static-block" "^7.24.7" - "@babel/plugin-transform-classes" "^7.24.8" - "@babel/plugin-transform-computed-properties" "^7.24.7" - "@babel/plugin-transform-destructuring" "^7.24.8" - "@babel/plugin-transform-dotall-regex" "^7.24.7" - "@babel/plugin-transform-duplicate-keys" "^7.24.7" - "@babel/plugin-transform-dynamic-import" "^7.24.7" - "@babel/plugin-transform-exponentiation-operator" "^7.24.7" - "@babel/plugin-transform-export-namespace-from" "^7.24.7" - "@babel/plugin-transform-for-of" "^7.24.7" - "@babel/plugin-transform-function-name" "^7.24.7" - "@babel/plugin-transform-json-strings" "^7.24.7" - "@babel/plugin-transform-literals" "^7.24.7" - "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" - "@babel/plugin-transform-member-expression-literals" "^7.24.7" - "@babel/plugin-transform-modules-amd" "^7.24.7" - "@babel/plugin-transform-modules-commonjs" "^7.24.8" - "@babel/plugin-transform-modules-systemjs" "^7.24.7" - "@babel/plugin-transform-modules-umd" "^7.24.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" - "@babel/plugin-transform-new-target" "^7.24.7" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7" - "@babel/plugin-transform-numeric-separator" "^7.24.7" - "@babel/plugin-transform-object-rest-spread" "^7.24.7" - "@babel/plugin-transform-object-super" "^7.24.7" - "@babel/plugin-transform-optional-catch-binding" "^7.24.7" - "@babel/plugin-transform-optional-chaining" "^7.24.8" - "@babel/plugin-transform-parameters" "^7.24.7" - "@babel/plugin-transform-private-methods" "^7.24.7" - "@babel/plugin-transform-private-property-in-object" "^7.24.7" - "@babel/plugin-transform-property-literals" "^7.24.7" - "@babel/plugin-transform-regenerator" "^7.24.7" - "@babel/plugin-transform-reserved-words" "^7.24.7" - "@babel/plugin-transform-shorthand-properties" "^7.24.7" - "@babel/plugin-transform-spread" "^7.24.7" - "@babel/plugin-transform-sticky-regex" "^7.24.7" - "@babel/plugin-transform-template-literals" "^7.24.7" - "@babel/plugin-transform-typeof-symbol" "^7.24.8" - "@babel/plugin-transform-unicode-escapes" "^7.24.7" - "@babel/plugin-transform-unicode-property-regex" "^7.24.7" - "@babel/plugin-transform-unicode-regex" "^7.24.7" - "@babel/plugin-transform-unicode-sets-regex" "^7.24.7" + "@babel/plugin-transform-arrow-functions" "^7.25.9" + "@babel/plugin-transform-async-generator-functions" "^7.25.9" + "@babel/plugin-transform-async-to-generator" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions" "^7.25.9" + "@babel/plugin-transform-block-scoping" "^7.25.9" + "@babel/plugin-transform-class-properties" "^7.25.9" + "@babel/plugin-transform-class-static-block" "^7.26.0" + "@babel/plugin-transform-classes" "^7.25.9" + "@babel/plugin-transform-computed-properties" "^7.25.9" + "@babel/plugin-transform-destructuring" "^7.25.9" + "@babel/plugin-transform-dotall-regex" "^7.25.9" + "@babel/plugin-transform-duplicate-keys" "^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-dynamic-import" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator" "^7.25.9" + "@babel/plugin-transform-export-namespace-from" "^7.25.9" + "@babel/plugin-transform-for-of" "^7.25.9" + "@babel/plugin-transform-function-name" "^7.25.9" + "@babel/plugin-transform-json-strings" "^7.25.9" + "@babel/plugin-transform-literals" "^7.25.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" + "@babel/plugin-transform-member-expression-literals" "^7.25.9" + "@babel/plugin-transform-modules-amd" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-modules-systemjs" "^7.25.9" + "@babel/plugin-transform-modules-umd" "^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-new-target" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.9" + "@babel/plugin-transform-numeric-separator" "^7.25.9" + "@babel/plugin-transform-object-rest-spread" "^7.25.9" + "@babel/plugin-transform-object-super" "^7.25.9" + "@babel/plugin-transform-optional-catch-binding" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + "@babel/plugin-transform-private-methods" "^7.25.9" + "@babel/plugin-transform-private-property-in-object" "^7.25.9" + "@babel/plugin-transform-property-literals" "^7.25.9" + "@babel/plugin-transform-regenerator" "^7.25.9" + "@babel/plugin-transform-regexp-modifiers" "^7.26.0" + "@babel/plugin-transform-reserved-words" "^7.25.9" + "@babel/plugin-transform-shorthand-properties" "^7.25.9" + "@babel/plugin-transform-spread" "^7.25.9" + "@babel/plugin-transform-sticky-regex" "^7.25.9" + "@babel/plugin-transform-template-literals" "^7.25.9" + "@babel/plugin-transform-typeof-symbol" "^7.25.9" + "@babel/plugin-transform-unicode-escapes" "^7.25.9" + "@babel/plugin-transform-unicode-property-regex" "^7.25.9" + "@babel/plugin-transform-unicode-regex" "^7.25.9" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.4" + babel-plugin-polyfill-corejs3 "^0.10.6" babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.37.1" + core-js-compat "^3.38.1" semver "^6.3.1" "@babel/preset-flow@^7.13.13": @@ -1433,16 +1230,16 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz#43c5b68eccb856ae5b52274b77b1c3c413cde1b7" - integrity sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw== +"@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz#4a570f1b8d104a242d923957ffa1eaff142a106d" + integrity sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-validator-option" "^7.25.7" - "@babel/plugin-syntax-jsx" "^7.25.7" - "@babel/plugin-transform-modules-commonjs" "^7.25.7" - "@babel/plugin-transform-typescript" "^7.25.7" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-typescript" "^7.25.9" "@babel/register@^7.13.16": version "7.21.0" @@ -1460,21 +1257,21 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.8", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.8.tgz#5d958c3827b13cc6d05e038c07fb2e5e3420d82e" - integrity sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.8", "@babel/runtime@^7.26.0", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" + integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.0.0", "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.22.15", "@babel/template@^7.24.7", "@babel/template@^7.25.0", "@babel/template@^7.25.7", "@babel/template@^7.3.3": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.7.tgz#27f69ce382855d915b14ab0fe5fb4cbf88fa0769" - integrity sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA== +"@babel/template@^7.0.0", "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.22.15", "@babel/template@^7.25.9", "@babel/template@^7.3.3": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== dependencies: - "@babel/code-frame" "^7.25.7" - "@babel/parser" "^7.25.7" - "@babel/types" "^7.25.7" + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" "@babel/traverse@7.23.2": version "7.23.2" @@ -1492,45 +1289,16 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.20.0", "@babel/traverse@^7.20.5", "@babel/traverse@^7.21.5", "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.4.5": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.8.tgz#6c14ed5232b7549df3371d820fbd9abfcd7dfab7" - integrity sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.8" - "@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.8" - "@babel/types" "^7.24.8" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/traverse@^7.25.0": - version "7.25.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.3.tgz#f1b901951c83eda2f3e29450ce92743783373490" - integrity sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.0" - "@babel/parser" "^7.25.3" - "@babel/template" "^7.25.0" - "@babel/types" "^7.25.2" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/traverse@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.7.tgz#83e367619be1cab8e4f2892ef30ba04c26a40fa8" - integrity sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg== +"@babel/traverse@^7.20.0", "@babel/traverse@^7.20.5", "@babel/traverse@^7.21.5", "@babel/traverse@^7.24.7", "@babel/traverse@^7.25.9", "@babel/traverse@^7.4.5": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" + integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== dependencies: - "@babel/code-frame" "^7.25.7" - "@babel/generator" "^7.25.7" - "@babel/parser" "^7.25.7" - "@babel/template" "^7.25.7" - "@babel/types" "^7.25.7" + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" debug "^4.3.1" globals "^11.1.0" @@ -1542,32 +1310,13 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.17.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.21.0", "@babel/types@^7.21.3", "@babel/types@^7.21.5", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.24.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.24.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.9.tgz#228ce953d7b0d16646e755acf204f4cf3d08cc73" - integrity sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ== +"@babel/types@^7.0.0", "@babel/types@^7.17.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.21.0", "@babel/types@^7.21.3", "@babel/types@^7.21.5", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" + integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== dependencies: - "@babel/helper-string-parser" "^7.24.8" - "@babel/helper-validator-identifier" "^7.24.7" - to-fast-properties "^2.0.0" - -"@babel/types@^7.25.0", "@babel/types@^7.25.2": - version "7.25.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.2.tgz#55fb231f7dc958cd69ea141a4c2997e819646125" - integrity sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q== - dependencies: - "@babel/helper-string-parser" "^7.24.8" - "@babel/helper-validator-identifier" "^7.24.7" - to-fast-properties "^2.0.0" - -"@babel/types@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.7.tgz#1b7725c1d3a59f328cb700ce704c46371e6eef9b" - integrity sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ== - dependencies: - "@babel/helper-string-parser" "^7.25.7" - "@babel/helper-validator-identifier" "^7.25.7" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" "@bcoe/v8-coverage@^0.2.3": version "0.2.3" @@ -2569,10 +2318,10 @@ resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.75.3.tgz#3407ac591f17e5462e297784b04bc25e4d62e788" integrity sha512-3mhF8AJFfIN0E5bEs/DQ4U2LzMJYm+FPSwY5bJ1DZhrxW1PFAh24bAPrSd8PwS0iarQ7biLdr1lWf/8LFv8pDA== -"@react-native/typescript-config@0.75.3": - version "0.75.3" - resolved "https://registry.yarnpkg.com/@react-native/typescript-config/-/typescript-config-0.75.3.tgz#59d637530c826d76172b8668b9b3f028cc287d6d" - integrity sha512-yekwhjG9lDvib+3jYwagEXcyTJ4mEryDLCoQINWCwy+7GtMx2BrKweHc4Phcc1dqmK1U/XMzVUXF3X3hc+FVPA== +"@react-native/typescript-config@0.76.0": + version "0.76.0" + resolved "https://registry.yarnpkg.com/@react-native/typescript-config/-/typescript-config-0.76.0.tgz#b7bc84d271cb2b12453ff85f4bf662538a7ac5de" + integrity sha512-BgBZd5su6acl5f+xaKaD+vkuCSkgxc9PL53GMzCqulnKJTjAHpsqJJSzGu6S3RgikJE6tmEy+EhxjFJQ3KvxIw== "@react-native/virtualized-lists@0.75.3": version "0.75.3" @@ -2634,10 +2383,10 @@ color "^4.2.3" warn-once "^0.1.0" -"@reduxjs/toolkit@^2.2.8": - version "2.2.8" - resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.2.8.tgz#69e6473dd5a395860d387abdd53fe5a2add378c8" - integrity sha512-eK/ieXftPRQfaBSmzsamXEyDwkntMTY0e9SG5ETsEOv5JIPKhu3mj992t6B8FJjlnSrZBAAqdT8oMkPe4j+P9g== +"@reduxjs/toolkit@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.3.0.tgz#d00134634d6c1678e8563ac50026e429e3b64420" + integrity sha512-WC7Yd6cNGfHx8zf+iu+Q1UPTfEcXhQ+ATi7CV1hlrSAaQBdlPzg7Ww/wJHNQem7qG9rxmWoFCDCPubSvFObGzA== dependencies: immer "^10.0.3" redux "^5.0.1" @@ -2784,22 +2533,22 @@ dependencies: defer-to-connect "^2.0.0" -"@tanstack/query-core@5.56.2": - version "5.56.2" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.56.2.tgz#2def2fb0290cd2836bbb08afb0c175595bb8109b" - integrity sha512-gor0RI3/R5rVV3gXfddh1MM+hgl0Z4G7tj6Xxpq6p2I03NGPaJ8dITY9Gz05zYYb/EJq9vPas/T4wn9EaDPd4Q== +"@tanstack/query-core@5.59.13": + version "5.59.13" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.59.13.tgz#8c962980af174bbd446b7e9b9999f7432897df80" + integrity sha512-Oou0bBu/P8+oYjXsJQ11j+gcpLAMpqW42UlokQYEz4dE7+hOtVO9rVuolJKgEccqzvyFzqX4/zZWY+R/v1wVsQ== -"@tanstack/react-query@^5.56.2": - version "5.56.2" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.56.2.tgz#3a0241b9d010910905382f5e99160997b8795f91" - integrity sha512-SR0GzHVo6yzhN72pnRhkEFRAHMsUo5ZPzAxfTMvUxFIDVS6W9LYUp6nXW3fcHVdg0ZJl8opSH85jqahvm6DSVg== +"@tanstack/react-query@^5.59.15": + version "5.59.15" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.59.15.tgz#fa1c5b4d96e6a148ec761f214304bbf5ac1906be" + integrity sha512-QbVlAkTI78wB4Mqgf2RDmgC0AOiJqer2c5k9STOOSXGv1S6ZkY37r/6UpE8DbQ2Du0ohsdoXgFNEyv+4eDoPEw== dependencies: - "@tanstack/query-core" "5.56.2" + "@tanstack/query-core" "5.59.13" -"@testing-library/jest-dom@^6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz#50484da3f80fb222a853479f618a9ce5c47bfe54" - integrity sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA== +"@testing-library/jest-dom@^6.6.2": + version "6.6.2" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.6.2.tgz#8186aa9a07263adef9cc5a59a4772db8c31f4a5b" + integrity sha512-P6GJD4yqc9jZLbe98j/EkyQDTPgqftohZF5FBkHY5BUERZmcf4HeO2k0XaefEg329ux2p21i1A1DmyQ1kKw2Jw== dependencies: "@adobe/css-tools" "^4.4.0" aria-query "^5.0.0" @@ -2809,10 +2558,10 @@ lodash "^4.17.21" redent "^3.0.0" -"@testing-library/react-native@^12.7.2": - version "12.7.2" - resolved "https://registry.yarnpkg.com/@testing-library/react-native/-/react-native-12.7.2.tgz#d9dc62979264902c22ac9154eee0dc10914d1518" - integrity sha512-fSUIruOUFcuwssC8+m9H+9ib7P/+JrtIszHS4eZ6O9e4FjpjS3m24UnkJXTRl+FCbknz8oxH5Tw+thzy0qsIMg== +"@testing-library/react-native@^12.8.0": + version "12.8.0" + resolved "https://registry.yarnpkg.com/@testing-library/react-native/-/react-native-12.8.0.tgz#696e9ed09666c9cecd460160d47a52bfed28da09" + integrity sha512-peMIg+tKWGiR2GV4V7Zw74Nnn97Goqws1DrZleyj9NQXbK13FZIKxRBNM4tf1z4rAS8KE9nJ2nLXo0HFRBcqpw== dependencies: jest-matcher-utils "^29.7.0" pretty-format "^29.7.0" @@ -3794,13 +3543,13 @@ babel-plugin-polyfill-corejs2@^0.4.10: "@babel/helper-define-polyfill-provider" "^0.6.1" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: - version "0.10.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77" - integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== +babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.6: + version "0.10.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" + integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.1" - core-js-compat "^3.36.1" + "@babel/helper-define-polyfill-provider" "^0.6.2" + core-js-compat "^3.38.0" babel-plugin-polyfill-regenerator@^0.6.1: version "0.6.1" @@ -3932,25 +3681,15 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.23.0: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== - dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" - -browserslist@^4.23.1: - version "4.23.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.2.tgz#244fe803641f1c19c28c48c4b6ec9736eb3d32ed" - integrity sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA== +browserslist@^4.23.3, browserslist@^4.24.0: + version "4.24.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== dependencies: - caniuse-lite "^1.0.30001640" - electron-to-chromium "^1.4.820" - node-releases "^2.0.14" - update-browserslist-db "^1.1.0" + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" + node-releases "^2.0.18" + update-browserslist-db "^1.1.1" bs-logger@^0.2.6: version "0.2.6" @@ -4128,17 +3867,12 @@ camelize@^1.0.0: resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== -caniuse-lite@^1.0.30001587: - version "1.0.30001600" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz#93a3ee17a35aa6a9f0c6ef1b2ab49507d1ab9079" - integrity sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ== +caniuse-lite@^1.0.30001669: + version "1.0.30001673" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001673.tgz#5aa291557af1c71340e809987367410aab7a5a9e" + integrity sha512-WTrjUCSMp3LYX0nE12ECkV0a+e6LC85E0Auz75555/qr78Oc8YWhEPNfDd6SHdtlCMSzqtuXY0uyEMNRcsKpKw== -caniuse-lite@^1.0.30001640: - version "1.0.30001642" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz#6aa6610eb24067c246d30c57f055a9d0a7f8d05f" - integrity sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA== - -chalk@^2.0.1, chalk@^2.4.2: +chalk@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -4484,12 +4218,12 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -core-js-compat@^3.36.1, core-js-compat@^3.37.1: - version "3.37.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee" - integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== +core-js-compat@^3.38.0, core-js-compat@^3.38.1: + version "3.38.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09" + integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw== dependencies: - browserslist "^4.23.0" + browserslist "^4.23.3" core-util-is@~1.0.0: version "1.0.3" @@ -5054,15 +4788,10 @@ ejs@^3.1.10: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.668: - version "1.4.715" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.715.tgz#bb16bcf2a3537962fccfa746b5c98c5f7404ff46" - integrity sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg== - -electron-to-chromium@^1.4.820: - version "1.4.827" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.827.tgz#76068ed1c71dd3963e1befc8ae815004b2da6a02" - integrity sha512-VY+J0e4SFcNfQy19MEoMdaIcZLmDCprqvBtkii1WTCTQHpRvf5N8+3kTYCgL/PcntvwQvmMJWTuDPsq+IlhWKQ== +electron-to-chromium@^1.5.41: + version "1.5.47" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.47.tgz#ef0751bc19b28be8ee44cd8405309de3bf3b20c7" + integrity sha512-zS5Yer0MOYw4rtK2iq43cJagHZ8sXN0jDHDKzB+86gSBSAI4v07S97mcq+Gs2vclAxSh1j7vOAHxSVgduiiuVQ== electron@^23.1.2, electron@^25.8.1: version "25.9.8" @@ -5386,10 +5115,10 @@ es-errors@^1.2.1, es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-iterator-helpers@^1.0.19: - version "1.0.19" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" - integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== +es-iterator-helpers@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz#f6d745d342aea214fe09497e7152170dc333a7a6" + integrity sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" @@ -5398,12 +5127,12 @@ es-iterator-helpers@^1.0.19: es-set-tostringtag "^2.0.3" function-bind "^1.1.2" get-intrinsic "^1.2.4" - globalthis "^1.0.3" + globalthis "^1.0.4" has-property-descriptors "^1.0.2" has-proto "^1.0.3" has-symbols "^1.0.3" internal-slot "^1.0.7" - iterator.prototype "^1.1.2" + iterator.prototype "^1.1.3" safe-array-concat "^1.1.2" es-object-atoms@^1.0.0: @@ -5464,10 +5193,10 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@~1.0.3: version "1.0.3" @@ -5564,17 +5293,17 @@ eslint-plugin-react-native@^4.0.0, eslint-plugin-react-native@^4.1.0: dependencies: eslint-plugin-react-native-globals "^0.1.1" -eslint-plugin-react@^7.30.1, eslint-plugin-react@^7.37.1: - version "7.37.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz#56493d7d69174d0d828bc83afeffe96903fdadbd" - integrity sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg== +eslint-plugin-react@^7.30.1, eslint-plugin-react@^7.37.2: + version "7.37.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz#cd0935987876ba2900df2f58339f6d92305acc7a" + integrity sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" array.prototype.flatmap "^1.3.2" array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" - es-iterator-helpers "^1.0.19" + es-iterator-helpers "^1.1.0" estraverse "^5.3.0" hasown "^2.0.2" jsx-ast-utils "^2.4.1 || ^3.0.0" @@ -6345,6 +6074,14 @@ globalthis@^1.0.3: dependencies: define-properties "^1.1.3" +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -7176,10 +6913,10 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== +iterator.prototype@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.3.tgz#016c2abe0be3bbdb8319852884f60908ac62bf9c" + integrity sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ== dependencies: define-properties "^1.2.1" get-intrinsic "^1.2.1" @@ -7761,7 +7498,7 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -jsesc@^3.0.2: +jsesc@^3.0.2, jsesc@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== @@ -8672,10 +8409,10 @@ node-ipc@9.2.1: js-message "1.0.7" js-queue "2.0.2" -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== node-stream-zip@^1.9.1: version "1.15.0" @@ -9137,11 +8874,16 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= -picocolors@^1.0.0, picocolors@^1.0.1: +picocolors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -9743,10 +9485,10 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -redux-mock-store@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/redux-mock-store/-/redux-mock-store-1.5.4.tgz#90d02495fd918ddbaa96b83aef626287c9ab5872" - integrity sha512-xmcA0O/tjCLXhh9Fuiq6pMrJCwFRaouA8436zcikdIpYWWCjU76CRk+i2bHx8EeiSiMGnB85/lZdU3wIJVXHTA== +redux-mock-store@^1.5.5: + version "1.5.5" + resolved "https://registry.yarnpkg.com/redux-mock-store/-/redux-mock-store-1.5.5.tgz#ec3676663c081c4ca5a6a14f1ac193b56c3220eb" + integrity sha512-YxX+ofKUTQkZE4HbhYG4kKGr7oCTJfB0GLy7bSeqx86GLpGirrbUWstMnqXkqHNaQpcnbMGbof2dYs5KsPE6Zg== dependencies: lodash.isplainobject "^4.0.6" @@ -9786,6 +9528,13 @@ regenerate-unicode-properties@^10.1.0: dependencies: regenerate "^1.4.2" +regenerate-unicode-properties@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== + dependencies: + regenerate "^1.4.2" + regenerate@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" @@ -9839,6 +9588,18 @@ regexpu-core@^5.3.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" +regexpu-core@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.1.1.tgz#b469b245594cb2d088ceebc6369dceb8c00becac" + integrity sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.11.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + registry-auth-token@^3.0.1: version "3.4.0" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" @@ -9854,6 +9615,18 @@ registry-url@^3.0.3: dependencies: rc "^1.0.1" +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.11.0: + version "0.11.2" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.11.2.tgz#7404ad42be00226d72bcf1f003f1f441861913d8" + integrity sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA== + dependencies: + jsesc "~3.0.2" + regjsparser@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" @@ -11312,21 +11085,13 @@ unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -update-browserslist-db@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" - integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== +update-browserslist-db@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: - escalade "^3.1.2" - picocolors "^1.0.1" + escalade "^3.2.0" + picocolors "^1.1.0" update-notifier@^2.1.0: version "2.5.0"