diff --git a/.github/actions/composite/setupNode/action.yml b/.github/actions/composite/setupNode/action.yml index 3bd28aeed64f..a720a3942fa1 100644 --- a/.github/actions/composite/setupNode/action.yml +++ b/.github/actions/composite/setupNode/action.yml @@ -3,7 +3,7 @@ description: Set up Node inputs: IS_HYBRID_BUILD: - description: "Indicates if node is set up for hybrid app" + description: 'Indicates if node is set up for hybrid app' required: false default: 'false' @@ -33,7 +33,7 @@ runs: with: path: node_modules key: ${{ inputs.IS_HYBRID_BUILD == 'true' && format('{0}-node-modules-{1}', runner.os, hashFiles('package-lock.json', 'patches/**', 'Mobile-Expensify/patches/**')) || format('{0}-node-modules-{1}', runner.os, hashFiles('package-lock.json', 'patches/**'))}} - + - id: cache-old-dot-node-modules if: inputs.IS_HYBRID_BUILD == 'true' # v5.0.1 @@ -48,9 +48,9 @@ runs: run: rm -rf node_modules - name: Install root project node packages - if: steps.cache-node-modules.outputs.cache-hit != 'true' || (inputs.IS_HYBRID_BUILD == 'true' && steps.cache-old-dot-node-modules.outputs.cache-hit != 'true') + if: steps.cache-node-modules.outputs.cache-hit != 'true' || (inputs.IS_HYBRID_BUILD == 'true' && steps.cache-old-dot-node-modules.outputs.cache-hit != 'true') uses: nick-fields/retry@ad984534de44a9489a53aefd81eb77f87c70dc60 # v4 with: timeout_minutes: 30 max_attempts: 3 - command: npm ci \ No newline at end of file + command: npm ci diff --git a/.github/actions/javascript/bumpVersion/action.yml b/.github/actions/javascript/bumpVersion/action.yml index 9ba98e0b85aa..1575e3d42e74 100644 --- a/.github/actions/javascript/bumpVersion/action.yml +++ b/.github/actions/javascript/bumpVersion/action.yml @@ -1,12 +1,12 @@ name: Bump npm version description: Increase the application version (JS and native), based on git tags inputs: - SEMVER_LEVEL: - description: Semantic Versioning Level - required: true + SEMVER_LEVEL: + description: Semantic Versioning Level + required: true outputs: - NEW_VERSION: - description: The new semver version of the application, updated in the JS and native layers. + NEW_VERSION: + description: The new semver version of the application, updated in the JS and native layers. runs: - using: node24 - main: ./index.js + using: node24 + main: ./index.js diff --git a/.github/actions/javascript/checkAndroidStatus/action.yml b/.github/actions/javascript/checkAndroidStatus/action.yml index 2d3614d4fe79..ff990f796dfc 100644 --- a/.github/actions/javascript/checkAndroidStatus/action.yml +++ b/.github/actions/javascript/checkAndroidStatus/action.yml @@ -1,22 +1,22 @@ name: 'Check Android Status' description: 'Checks the status of the Android track and calculates the rollout percentage.' inputs: - GITHUB_TOKEN: - description: Auth token for New Expensify Github - required: true - GOOGLE_KEY_FILE: - description: Authentication file for Google Cloud API - required: true - PACKAGE_NAME: - description: Package name to check the status of - required: true + GITHUB_TOKEN: + description: Auth token for New Expensify Github + required: true + GOOGLE_KEY_FILE: + description: Authentication file for Google Cloud API + required: true + PACKAGE_NAME: + description: Package name to check the status of + required: true outputs: - HALTED: - description: True if the app is halted, false otherwise - COMPLETED: - description: True if the app is completed a rollout, false otherwise - ROLLOUT_PERCENTAGE: - description: The calculated rollout percentage + HALTED: + description: True if the app is halted, false otherwise + COMPLETED: + description: True if the app is completed a rollout, false otherwise + ROLLOUT_PERCENTAGE: + description: The calculated rollout percentage runs: - using: 'node24' - main: './index.js' + using: 'node24' + main: './index.js' diff --git a/.github/actions/javascript/formatCodeCovComment/action.yml b/.github/actions/javascript/formatCodeCovComment/action.yml index 31628b315909..3f15639bc34b 100644 --- a/.github/actions/javascript/formatCodeCovComment/action.yml +++ b/.github/actions/javascript/formatCodeCovComment/action.yml @@ -1,10 +1,9 @@ -name: "Format CodeCov Comment" -description: "Reformats CodeCov PR comments to display only relevant information" +name: 'Format CodeCov Comment' +description: 'Reformats CodeCov PR comments to display only relevant information' inputs: - GITHUB_TOKEN: - description: "Github token for authentication" - required: true + GITHUB_TOKEN: + description: 'Github token for authentication' + required: true runs: - using: "node24" - main: "./index.js" - + using: 'node24' + main: './index.js' diff --git a/.github/actions/javascript/getAndroidRolloutPercentage/action.yml b/.github/actions/javascript/getAndroidRolloutPercentage/action.yml index 9867918987fa..b15168889312 100644 --- a/.github/actions/javascript/getAndroidRolloutPercentage/action.yml +++ b/.github/actions/javascript/getAndroidRolloutPercentage/action.yml @@ -1,15 +1,15 @@ name: 'Get Android Rollout percentage' description: 'Gets the current Android track rollout percentage.' inputs: - GOOGLE_KEY_FILE: - description: Authentication file for Google Cloud API - required: true - PACKAGE_NAME: - description: Package name to check the status of - required: true + GOOGLE_KEY_FILE: + description: Authentication file for Google Cloud API + required: true + PACKAGE_NAME: + description: Package name to check the status of + required: true outputs: - CURRENT_ROLLOUT_PERCENTAGE: - description: 'The current rollout percentage of the track' + CURRENT_ROLLOUT_PERCENTAGE: + description: 'The current rollout percentage of the track' runs: - using: 'node24' - main: './index.js' + using: 'node24' + main: './index.js' diff --git a/.github/actions/javascript/getArtifactInfo/action.yml b/.github/actions/javascript/getArtifactInfo/action.yml index 02e146c1567b..2f6cf5439c38 100644 --- a/.github/actions/javascript/getArtifactInfo/action.yml +++ b/.github/actions/javascript/getArtifactInfo/action.yml @@ -18,5 +18,5 @@ outputs: description: The ID of the workflow that produced the artifact runs: - using: "node24" - main: "index.js" + using: 'node24' + main: 'index.js' diff --git a/.github/actions/javascript/getDeployPullRequestList/action.yml b/.github/actions/javascript/getDeployPullRequestList/action.yml index bba09ab70419..7d3ae9e78940 100644 --- a/.github/actions/javascript/getDeployPullRequestList/action.yml +++ b/.github/actions/javascript/getDeployPullRequestList/action.yml @@ -1,20 +1,20 @@ name: 'Get Release Pull Request List' description: 'Gather all the PRs being deployed for given release tag.' inputs: - TAG: - description: Git tag - required: true - GITHUB_TOKEN: - description: "Github token for authentication" - required: true - IS_PRODUCTION_DEPLOY: - description: "True if we are deploying to production" - required: false + TAG: + description: Git tag + required: true + GITHUB_TOKEN: + description: 'Github token for authentication' + required: true + IS_PRODUCTION_DEPLOY: + description: 'True if we are deploying to production' + required: false outputs: - PR_LIST: - description: Array of pull request numbers - MOBILE_EXPENSIFY_PR_LIST: - description: Array of Mobile-Expensify pull request numbers + PR_LIST: + description: Array of pull request numbers + MOBILE_EXPENSIFY_PR_LIST: + description: Array of Mobile-Expensify pull request numbers runs: - using: 'node24' - main: './index.js' + using: 'node24' + main: './index.js' diff --git a/.github/actions/javascript/getPullRequestIncrementalChanges/action.yml b/.github/actions/javascript/getPullRequestIncrementalChanges/action.yml index ba57a4bdd90a..3cd1b061a45a 100644 --- a/.github/actions/javascript/getPullRequestIncrementalChanges/action.yml +++ b/.github/actions/javascript/getPullRequestIncrementalChanges/action.yml @@ -1,10 +1,10 @@ name: 'Check Pull Request Incremental Changes' description: | Detects actual file changes in PR opened or synchronize events, ignoring false positives from merge commits. - + This action is specifically designed for pull_request synchronize events where you need to distinguish between actual changes pushed to the PR versus changes that came from merging the base branch. - + For simple file change detection in PRs, use `gh pr diff ` instead. inputs: diff --git a/.github/actions/javascript/isAuthorizedContributor/action.yml b/.github/actions/javascript/isAuthorizedContributor/action.yml index 1f5fb410a18b..977f3cba90ed 100644 --- a/.github/actions/javascript/isAuthorizedContributor/action.yml +++ b/.github/actions/javascript/isAuthorizedContributor/action.yml @@ -1,27 +1,27 @@ name: 'Is Authorized Contributor' description: 'Checks whether a PR author is authorized to contribute (org member, Contributor+, or linked issue)' inputs: - PR_NUMBER: - description: Pull request number - required: true - ACTOR: - description: Login of the user to authorize (PR author, comment author, etc.) - required: true - ACTOR_ASSOCIATION: - description: "Actor's association with the repository (MEMBER, OWNER, CONTRIBUTOR, etc.)" - required: true - GITHUB_TOKEN: - description: Auth token for repository API calls - required: true - default: ${{ github.token }} - OS_BOTIFY_TOKEN: - description: OSBotify token for org team membership (read:org) - required: true + PR_NUMBER: + description: Pull request number + required: true + ACTOR: + description: Login of the user to authorize (PR author, comment author, etc.) + required: true + ACTOR_ASSOCIATION: + description: "Actor's association with the repository (MEMBER, OWNER, CONTRIBUTOR, etc.)" + required: true + GITHUB_TOKEN: + description: Auth token for repository API calls + required: true + default: ${{ github.token }} + OS_BOTIFY_TOKEN: + description: OSBotify token for org team membership (read:org) + required: true outputs: - IS_AUTHORIZED: - description: "'true' if the contributor is authorized, 'false' otherwise" - IS_INTERNAL: - description: "'true' if the actor is an internal Expensify engineer (engineering org team member), 'false' otherwise" + IS_AUTHORIZED: + description: "'true' if the contributor is authorized, 'false' otherwise" + IS_INTERNAL: + description: "'true' if the actor is an internal Expensify engineer (engineering org team member), 'false' otherwise" runs: - using: 'node24' - main: './index.js' + using: 'node24' + main: './index.js' diff --git a/.github/actions/javascript/isDeployChecklistLocked/action.yml b/.github/actions/javascript/isDeployChecklistLocked/action.yml index bf7b558553ad..f71b3dbd7847 100644 --- a/.github/actions/javascript/isDeployChecklistLocked/action.yml +++ b/.github/actions/javascript/isDeployChecklistLocked/action.yml @@ -1,14 +1,14 @@ name: 'Check if the deploy checklist is locked' description: 'Checks if the open deploy checklist issue has the LockCashDeploys label' inputs: - GITHUB_TOKEN: - description: Auth token for New Expensify Github - required: true + GITHUB_TOKEN: + description: Auth token for New Expensify Github + required: true outputs: - IS_LOCKED: - description: Whether or not the open deploy checklist issue is locked. - NUMBER: - description: Deploy checklist issue number + IS_LOCKED: + description: Whether or not the open deploy checklist issue is locked. + NUMBER: + description: Deploy checklist issue number runs: - using: 'node24' - main: 'index.js' + using: 'node24' + main: 'index.js' diff --git a/.github/actions/javascript/markPullRequestsAsDeployed/action.yml b/.github/actions/javascript/markPullRequestsAsDeployed/action.yml index 95cad61eeaae..ae5431057ca3 100644 --- a/.github/actions/javascript/markPullRequestsAsDeployed/action.yml +++ b/.github/actions/javascript/markPullRequestsAsDeployed/action.yml @@ -1,43 +1,43 @@ -name: "Mark Pull Requests as Deployed" -description: "Mark pull requests as deployed on production or staging" +name: 'Mark Pull Requests as Deployed' +description: 'Mark pull requests as deployed on production or staging' inputs: - PR_LIST: - description: "Array of pull request numbers" - required: true - MOBILE_EXPENSIFY_PR_LIST: - description: "Array of Mobile-Expensify pull request numbers" - required: false - IS_PRODUCTION_DEPLOY: - description: "Check if deploying to production" - required: false - default: "false" - DEPLOY_VERSION: - description: "The app version in which the pull requests were deployed" - required: true - GITHUB_TOKEN: - description: "Github token for authentication" - required: true - ANDROID: - description: "Android job result ('success', 'failure', 'cancelled', or 'skipped')" - required: true - IOS: - description: "iOS job result ('success', 'failure', 'cancelled', or 'skipped')" - required: true - WEB: - description: "Web job result ('success', 'failure', 'cancelled', or 'skipped')" - required: true - DATE: - description: "The date of deployment" - required: false - NOTE: - description: "Additional note from the deployer" - required: false - ANDROID_SENTRY_URL: - description: "URL to Sentry size analysis for Android" - required: false - IOS_SENTRY_URL: - description: "URL to Sentry size analysis for iOS" - required: false + PR_LIST: + description: 'Array of pull request numbers' + required: true + MOBILE_EXPENSIFY_PR_LIST: + description: 'Array of Mobile-Expensify pull request numbers' + required: false + IS_PRODUCTION_DEPLOY: + description: 'Check if deploying to production' + required: false + default: 'false' + DEPLOY_VERSION: + description: 'The app version in which the pull requests were deployed' + required: true + GITHUB_TOKEN: + description: 'Github token for authentication' + required: true + ANDROID: + description: "Android job result ('success', 'failure', 'cancelled', or 'skipped')" + required: true + IOS: + description: "iOS job result ('success', 'failure', 'cancelled', or 'skipped')" + required: true + WEB: + description: "Web job result ('success', 'failure', 'cancelled', or 'skipped')" + required: true + DATE: + description: 'The date of deployment' + required: false + NOTE: + description: 'Additional note from the deployer' + required: false + ANDROID_SENTRY_URL: + description: 'URL to Sentry size analysis for Android' + required: false + IOS_SENTRY_URL: + description: 'URL to Sentry size analysis for iOS' + required: false runs: - using: "node24" - main: "./index.js" + using: 'node24' + main: './index.js' diff --git a/.github/actions/javascript/postOrReplaceComment/action.yml b/.github/actions/javascript/postOrReplaceComment/action.yml index d3d47dfc3650..d39fa6b9f332 100644 --- a/.github/actions/javascript/postOrReplaceComment/action.yml +++ b/.github/actions/javascript/postOrReplaceComment/action.yml @@ -1,42 +1,42 @@ -name: "postOrReplaceComment" -description: "Post a test build or custom pull request comment, hiding the previous matching comment" +name: 'postOrReplaceComment' +description: 'Post a test build or custom pull request comment, hiding the previous matching comment' inputs: - REPO: - description: "Repository to place a comment. Can be App or Mobile-Expensify" - default: App - APP_PR_NUMBER: - description: "Pull request number for Expensify/App repository" - required: false - MOBILE_EXPENSIFY_PR_NUMBER: - description: "Pull request number for Expensify/Mobile-Expensify repository" - required: false - GITHUB_TOKEN: - description: "Github token for authentication" - default: "${{ github.token }}" - ANDROID: - description: "Android job result ('success', 'failure', 'cancelled', or 'skipped')" - required: false - IOS: - description: "iOS job result ('success', 'failure', 'cancelled', or 'skipped')" - required: false - WEB: - description: "Web job result ('success', 'failure', 'cancelled', or 'skipped')" - required: false - ANDROID_LINK: - description: "Link for the Android build" - required: false - IOS_LINK: - description: "Link for the iOS build" - required: false - WEB_LINK: - description: "Link for the web build" - required: false - COMMENT_BODY: - description: "Custom comment body. When provided, posts this comment instead of the test build message" - required: false - COMMENT_PREFIX: - description: "Prefix used to find and hide the previous matching comment" - required: true + REPO: + description: 'Repository to place a comment. Can be App or Mobile-Expensify' + default: App + APP_PR_NUMBER: + description: 'Pull request number for Expensify/App repository' + required: false + MOBILE_EXPENSIFY_PR_NUMBER: + description: 'Pull request number for Expensify/Mobile-Expensify repository' + required: false + GITHUB_TOKEN: + description: 'Github token for authentication' + default: '${{ github.token }}' + ANDROID: + description: "Android job result ('success', 'failure', 'cancelled', or 'skipped')" + required: false + IOS: + description: "iOS job result ('success', 'failure', 'cancelled', or 'skipped')" + required: false + WEB: + description: "Web job result ('success', 'failure', 'cancelled', or 'skipped')" + required: false + ANDROID_LINK: + description: 'Link for the Android build' + required: false + IOS_LINK: + description: 'Link for the iOS build' + required: false + WEB_LINK: + description: 'Link for the web build' + required: false + COMMENT_BODY: + description: 'Custom comment body. When provided, posts this comment instead of the test build message' + required: false + COMMENT_PREFIX: + description: 'Prefix used to find and hide the previous matching comment' + required: true runs: - using: "node24" - main: "./index.js" + using: 'node24' + main: './index.js' diff --git a/.github/workflows/buildAdHoc.yml b/.github/workflows/buildAdHoc.yml index 6039ce909553..a95e3329c6fd 100644 --- a/.github/workflows/buildAdHoc.yml +++ b/.github/workflows/buildAdHoc.yml @@ -49,13 +49,13 @@ jobs: with: github-token: ${{ github.token }} script: | - const workflowURL = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`; - github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: ${{ inputs.APP_PR_NUMBER || 0 }}, - body: `🚧 ${{ github.actor }} has triggered a test Expensify/App build. You can view the [workflow run here](${workflowURL}).` - }); + const workflowURL = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`; + github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: ${{ inputs.APP_PR_NUMBER || 0 }}, + body: `🚧 ${{ github.actor }} has triggered a test Expensify/App build. You can view the [workflow run here](${workflowURL}).` + }); - name: Add build start comment to Expensify/Mobile-Expensify PR if: ${{ inputs.MOBILE_EXPENSIFY_PR != '' }} @@ -64,13 +64,13 @@ jobs: with: github-token: ${{ secrets.OS_BOTIFY_TOKEN }} script: | - const workflowURL = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`; - github.rest.issues.createComment({ - owner: context.repo.owner, - repo: 'Mobile-Expensify', - issue_number: ${{ inputs.MOBILE_EXPENSIFY_PR || 0 }}, - body: `🚧 ${{ github.actor }} has triggered a test Expensify/Mobile-Expensify build. You can view the [workflow run here](${workflowURL}).` - }); + const workflowURL = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`; + github.rest.issues.createComment({ + owner: context.repo.owner, + repo: 'Mobile-Expensify', + issue_number: ${{ inputs.MOBILE_EXPENSIFY_PR || 0 }}, + body: `🚧 ${{ github.actor }} has triggered a test Expensify/Mobile-Expensify build. You can view the [workflow run here](${workflowURL}).` + }); buildAndroid: name: Build Android diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml index a6676d4a1faf..a36d86f5ffec 100644 --- a/.github/workflows/buildAndroid.yml +++ b/.github/workflows/buildAndroid.yml @@ -295,4 +295,3 @@ jobs: with: name: ${{ inputs.artifact-prefix }}android-apk-artifact path: Expensify.apk - diff --git a/.github/workflows/buildIOS.yml b/.github/workflows/buildIOS.yml index 51c6c5d69913..42a0ad4d4ff3 100644 --- a/.github/workflows/buildIOS.yml +++ b/.github/workflows/buildIOS.yml @@ -303,4 +303,3 @@ jobs: with: name: ${{ inputs.artifact-prefix }}ios-sourcemap-artifact path: Mobile-Expensify/main.jsbundle.map - diff --git a/.github/workflows/cherryPick.yml b/.github/workflows/cherryPick.yml index c4412c481e1d..c5922d1b34a6 100644 --- a/.github/workflows/cherryPick.yml +++ b/.github/workflows/cherryPick.yml @@ -30,7 +30,7 @@ on: required: true concurrency: - group: "cherrypick" + group: 'cherrypick' cancel-in-progress: false jobs: @@ -449,7 +449,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} - - name: "Announces a CP failure in the #announce Slack room" + - name: 'Announces a CP failure in the #announce Slack room' uses: slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3 if: ${{ failure() }} with: @@ -465,7 +465,7 @@ jobs: }] } - - name: "Announce CP cancellation in #deployer" + - name: 'Announce CP cancellation in #deployer' uses: slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3 if: ${{ cancelled() }} with: diff --git a/.github/workflows/claude-review.yml b/.github/workflows/claude-review.yml index 1bdb19092980..8423d38161dd 100644 --- a/.github/workflows/claude-review.yml +++ b/.github/workflows/claude-review.yml @@ -82,11 +82,11 @@ jobs: if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' && steps.filter.outputs.code == 'true' uses: anthropics/claude-code-action@4d7e1f0cd85743fdc93b1c8040ab54395da024e2 # v1.0.149 with: - display_report: "true" + display_report: 'true' anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} github_token: ${{ secrets.GITHUB_TOKEN }} - allowed_non_write_users: "*" - prompt: "/review-code-pr REPO: ${{ github.repository }} PR_NUMBER: ${{ github.event.pull_request.number }}" + allowed_non_write_users: '*' + prompt: '/review-code-pr REPO: ${{ github.repository }} PR_NUMBER: ${{ github.event.pull_request.number }}' claude_args: | --model claude-opus-4-8 --effort xhigh @@ -106,11 +106,11 @@ jobs: if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' && steps.filter.outputs.docs == 'true' uses: anthropics/claude-code-action@4d7e1f0cd85743fdc93b1c8040ab54395da024e2 # v1.0.149 with: - display_report: "true" + display_report: 'true' anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} github_token: ${{ secrets.GITHUB_TOKEN }} - allowed_non_write_users: "*" - prompt: "/review-helpdot-pr REPO: ${{ github.repository }} PR_NUMBER: ${{ github.event.pull_request.number }}" + allowed_non_write_users: '*' + prompt: '/review-helpdot-pr REPO: ${{ github.repository }} PR_NUMBER: ${{ github.event.pull_request.number }}' claude_args: | --model claude-opus-4-8 --effort high diff --git a/.github/workflows/createNewVersion.yml b/.github/workflows/createNewVersion.yml index 8dcffee2b302..ee7de58bc33f 100644 --- a/.github/workflows/createNewVersion.yml +++ b/.github/workflows/createNewVersion.yml @@ -95,7 +95,7 @@ jobs: # Store the commit hash before checkout to ensure we cherry-pick the right commit DETACHED_COMMIT=$(git rev-parse HEAD) - + # Cherry-pick the version bump commit onto main, to safely handle case where new commits exist on main git checkout main && git pull origin main git cherry-pick "$DETACHED_COMMIT" @@ -127,10 +127,10 @@ jobs: run: | git add Mobile-Expensify git commit -m "Update Mobile-Expensify submodule version to ${{ steps.bumpVersion.outputs.NEW_VERSION }}" - + MAX_RETRIES=5 RETRY_DELAY=2 - + for i in $(seq 1 $MAX_RETRIES); do if git push origin main; then echo "::notice::Successfully pushed E/App changes on attempt $i" @@ -152,7 +152,7 @@ jobs: continue fi done - + echo "::error::E/App push failed after $MAX_RETRIES attempts" echo "::error::CRITICAL: Mobile-Expensify has version ${{ steps.bumpVersion.outputs.NEW_VERSION }} but E/App does not!" echo "::error::Manual intervention required - run the syncVersions workflow to fix" @@ -162,7 +162,7 @@ jobs: run: | APP_VERSION=$(jq -r .version package.json) ME_VERSION=$(jq -r .meta.version Mobile-Expensify/app/config/config.json) - + if [ "$APP_VERSION" != "$ME_VERSION" ]; then echo "::error::Version mismatch detected after push!" echo "::error::E/App version: $APP_VERSION" diff --git a/.github/workflows/cspell.yml b/.github/workflows/cspell.yml index b080faa5f07f..84a4fc5a1329 100644 --- a/.github/workflows/cspell.yml +++ b/.github/workflows/cspell.yml @@ -52,4 +52,4 @@ jobs: if: always() with: path: .cspellcache - key: cspell-${{ runner.os }}-${{ hashFiles('cspell.json', 'normalized-package-lock.json') }}-${{ github.sha }} \ No newline at end of file + key: cspell-${{ runner.os }}-${{ hashFiles('cspell.json', 'normalized-package-lock.json') }}-${{ github.sha }} diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index cb59dfd68941..713f7d192db9 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -749,7 +749,22 @@ jobs: name: Post a Slack message when any platform fails to build or deploy runs-on: blacksmith-2vcpu-ubuntu-2404 if: ${{ failure() }} - needs: [androidBuild, androidUploadGooglePlay, androidUploadBrowserStack, androidUploadApplause, androidSubmit, iosBuild, iosUploadTestflight, iosUploadBrowserStack, iosUploadApplause, iosSubmit, webBuild, webDeploy, victoryChartRendererBuild] + needs: + [ + androidBuild, + androidUploadGooglePlay, + androidUploadBrowserStack, + androidUploadApplause, + androidSubmit, + iosBuild, + iosUploadTestflight, + iosUploadBrowserStack, + iosUploadApplause, + iosSubmit, + webBuild, + webDeploy, + victoryChartRendererBuild, + ] steps: - name: Checkout uses: useblacksmith/checkout@c9796daa2a4bdebdab5bd16be2c09a70cd4e1121 # v1 @@ -900,7 +915,7 @@ jobs: env: GITHUB_TOKEN: ${{ github.token }} - - name: πŸš€ Create release πŸš€ + - name: πŸš€ Create release πŸš€ run: | # Check if the release already exists if gh release view "${{ needs.prep.outputs.TAG }}" --repo "${{ github.repository }}" &> /dev/null; then diff --git a/.github/workflows/deployBlockerInvestigation.yml b/.github/workflows/deployBlockerInvestigation.yml index 4ccc76a27d7d..a6312385abde 100644 --- a/.github/workflows/deployBlockerInvestigation.yml +++ b/.github/workflows/deployBlockerInvestigation.yml @@ -72,10 +72,10 @@ jobs: if: steps.validate.outputs.valid == 'true' uses: anthropics/claude-code-action@4d7e1f0cd85743fdc93b1c8040ab54395da024e2 # v1.0.149 with: - display_report: "true" + display_report: 'true' anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} github_token: ${{ secrets.OS_BOTIFY_TOKEN }} - prompt: "/investigate-deploy-blocker ISSUE_URL: ${{ env.ISSUE_URL }}" + prompt: '/investigate-deploy-blocker ISSUE_URL: ${{ env.ISSUE_URL }}' claude_args: | --model claude-opus-4-8 --effort xhigh diff --git a/.github/workflows/deployExpensifyHelp.yml b/.github/workflows/deployExpensifyHelp.yml index 773aa76b8c72..6ac8461d4770 100644 --- a/.github/workflows/deployExpensifyHelp.yml +++ b/.github/workflows/deployExpensifyHelp.yml @@ -23,7 +23,7 @@ on: # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. concurrency: - group: "pages" + group: 'pages' cancel-in-progress: false jobs: diff --git a/.github/workflows/failureNotifier.yml b/.github/workflows/failureNotifier.yml index 47b0c8741df7..f4c925f2b2d0 100644 --- a/.github/workflows/failureNotifier.yml +++ b/.github/workflows/failureNotifier.yml @@ -2,7 +2,7 @@ name: Notify on Workflow Failure on: workflow_run: - workflows: ["Process new code merged to main", "Remote Build iOS", "Remote Build Android"] + workflows: ['Process new code merged to main', 'Remote Build iOS', 'Remote Build Android'] branches: [main] types: - completed diff --git a/.github/workflows/formatCodeCovComment.yml b/.github/workflows/formatCodeCovComment.yml index c2401dfbeabd..bd6ffe38ff8e 100644 --- a/.github/workflows/formatCodeCovComment.yml +++ b/.github/workflows/formatCodeCovComment.yml @@ -13,9 +13,8 @@ jobs: if: github.event.issue.pull_request && github.event.comment.user.login == 'codecov[bot]' steps: - name: Checkout - uses: useblacksmith/checkout@c9796daa2a4bdebdab5bd16be2c09a70cd4e1121 # v1 + uses: useblacksmith/checkout@c9796daa2a4bdebdab5bd16be2c09a70cd4e1121 # v1 - name: Format CodeCov Comment uses: ./.github/actions/javascript/formatCodeCovComment with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4246c1b9ab46..4044662d9436 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -5,7 +5,8 @@ on: pull_request: types: [opened, synchronize] branches-ignore: [staging, production] - paths: ['**.js', '**.ts', '**.tsx', '**.json', '**.mjs', '**.cjs', 'config/.editorconfig', 'config/eslint/**', 'scripts/lint.sh', 'scripts/lintChanged.sh', '.watchmanconfig', '.imgbotconfig'] + paths: + ['**.js', '**.ts', '**.tsx', '**.json', '**.mjs', '**.cjs', 'config/.editorconfig', 'config/eslint/**', 'scripts/lint.sh', 'scripts/lintChanged.sh', '.watchmanconfig', '.imgbotconfig'] concurrency: group: ${{ github.ref == 'refs/heads/main' && format('{0}-{1}', github.ref, github.sha) || github.ref }}-lint diff --git a/.github/workflows/oxfmt.yml b/.github/workflows/oxfmt.yml index 362104e4d813..89ddca914e81 100644 --- a/.github/workflows/oxfmt.yml +++ b/.github/workflows/oxfmt.yml @@ -5,18 +5,7 @@ on: pull_request: types: [opened, synchronize] branches-ignore: [staging, production] - paths: - [ - "**.js", - "**.ts", - "**.tsx", - "**.json", - "**.mjs", - "**.cjs", - "config/.editorconfig", - ".watchmanconfig", - ".imgbotconfig", - ] + paths: ['**.js', '**.ts', '**.tsx', '**.json', '**.mjs', '**.cjs', '**.yml', '**.yaml', '.oxfmtrc.json', 'config/.editorconfig', '.watchmanconfig', '.imgbotconfig'] concurrency: group: ${{ github.ref == 'refs/heads/main' && format('{0}-{1}', github.ref, github.sha) || github.ref }}-oxfmt diff --git a/.github/workflows/proposalPolice.yml b/.github/workflows/proposalPolice.yml index 973a23b5ab21..3716a83b8ae1 100644 --- a/.github/workflows/proposalPolice.yml +++ b/.github/workflows/proposalPolice.yml @@ -6,7 +6,7 @@ on: jobs: proposal-police-workflow: runs-on: blacksmith-4vcpu-ubuntu-2404 - if: "!contains(fromJSON('[\"OSBotify\", \"imgbot[bot]\", \"melvin-bot[bot]\", \"codecov[bot]\"]'), github.actor)" + if: '!contains(fromJSON(''["OSBotify", "imgbot[bot]", "melvin-bot[bot]", "codecov[bot]"]''), github.actor)' steps: - uses: useblacksmith/checkout@c9796daa2a4bdebdab5bd16be2c09a70cd4e1121 # v1 diff --git a/.github/workflows/publishReactNativeAndroidArtifacts.yml b/.github/workflows/publishReactNativeAndroidArtifacts.yml index 71ac44185dee..2c9d0b69687d 100644 --- a/.github/workflows/publishReactNativeAndroidArtifacts.yml +++ b/.github/workflows/publishReactNativeAndroidArtifacts.yml @@ -236,4 +236,3 @@ jobs: with: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} CHANNEL: '#expensify-open-source' - diff --git a/.github/workflows/react-compiler-compliance.yml b/.github/workflows/react-compiler-compliance.yml index 66a3d1f77c2a..c3356e29fdc0 100644 --- a/.github/workflows/react-compiler-compliance.yml +++ b/.github/workflows/react-compiler-compliance.yml @@ -5,7 +5,7 @@ on: pull_request: types: [opened, synchronize] branches-ignore: [staging, production] - paths: ["**.ts", "**.tsx"] + paths: ['**.ts', '**.tsx'] concurrency: group: ${{ github.ref == 'refs/heads/main' && format('{0}-{1}', github.ref, github.sha) || github.ref }}-react-compiler-compliance diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 19b236d3e4bb..fc48dd5be378 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,7 @@ jobs: runs-on: blacksmith-8vcpu-ubuntu-2404 env: CI: true - NODE_OPTIONS: "--experimental-vm-modules --max-old-space-size=8192" + NODE_OPTIONS: '--experimental-vm-modules --max-old-space-size=8192' strategy: fail-fast: false matrix: diff --git a/.github/workflows/testBuildOnPush.yml b/.github/workflows/testBuildOnPush.yml index 54e0a7df0ffe..071d41b36c8b 100644 --- a/.github/workflows/testBuildOnPush.yml +++ b/.github/workflows/testBuildOnPush.yml @@ -62,21 +62,21 @@ jobs: # v8 uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd with: - github-token: ${{ github.token }} - script: | - const prData = await github.rest.repos.listPullRequestsAssociatedWithCommit({ - owner: context.repo.owner, - repo: context.repo.repo, - commit_sha: context.sha, - }); - const prNumber = prData?.data?.find(p => p.state === 'closed' && p.merged_at)?.number?.toString(); - if (prNumber) { - const prUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/pull/${prNumber}`; - core.notice(`Found merged pull request: [#${prNumber}](${prUrl})`); - core.setOutput('PR_NUMBER', prNumber); - } else { - core.setFailed(`Commit pushed by non-OSBotify actor. No merged pull request found for commit ${context.sha}`); - } + github-token: ${{ github.token }} + script: | + const prData = await github.rest.repos.listPullRequestsAssociatedWithCommit({ + owner: context.repo.owner, + repo: context.repo.repo, + commit_sha: context.sha, + }); + const prNumber = prData?.data?.find(p => p.state === 'closed' && p.merged_at)?.number?.toString(); + if (prNumber) { + const prUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/pull/${prNumber}`; + core.notice(`Found merged pull request: [#${prNumber}](${prUrl})`); + core.setOutput('PR_NUMBER', prNumber); + } else { + core.setFailed(`Commit pushed by non-OSBotify actor. No merged pull request found for commit ${context.sha}`); + } buildApps: needs: [prep] diff --git a/.github/workflows/unused-styles.yml b/.github/workflows/unused-styles.yml index e65cf341523d..eb09a8dc5542 100644 --- a/.github/workflows/unused-styles.yml +++ b/.github/workflows/unused-styles.yml @@ -25,4 +25,3 @@ jobs: - name: Run unused style searcher run: npx ts-node scripts/findUnusedStyles.ts - \ No newline at end of file diff --git a/.github/workflows/updateHelpDotRedirects.yml b/.github/workflows/updateHelpDotRedirects.yml index ae6a61ece6a2..5237ffb3c281 100644 --- a/.github/workflows/updateHelpDotRedirects.yml +++ b/.github/workflows/updateHelpDotRedirects.yml @@ -14,7 +14,7 @@ on: # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. concurrency: - group: "redirects" + group: 'redirects' cancel-in-progress: false jobs: diff --git a/.github/workflows/verifyParserFiles.yml b/.github/workflows/verifyParserFiles.yml index 55df4ae1597f..459b0d9d2f04 100644 --- a/.github/workflows/verifyParserFiles.yml +++ b/.github/workflows/verifyParserFiles.yml @@ -5,7 +5,7 @@ on: types: [opened, synchronize] branches-ignore: [staging, production] paths: - - "src/libs/SearchParser/**" + - 'src/libs/SearchParser/**' jobs: verify: diff --git a/.github/workflows/verifyPodfile.yml b/.github/workflows/verifyPodfile.yml index 15559f5ee8b1..488742b86603 100644 --- a/.github/workflows/verifyPodfile.yml +++ b/.github/workflows/verifyPodfile.yml @@ -6,8 +6,8 @@ on: branches-ignore: [staging, production] paths: - ios/** - - "package.json" - - "package-lock.json" + - 'package.json' + - 'package-lock.json' jobs: verify: diff --git a/.oxfmtrc.json b/.oxfmtrc.json index a2f56cf33db9..46e9af39ccf0 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -62,8 +62,6 @@ "package.json", "package-lock.json", "*.html", - "*.yml", - "*.yaml", "*.css", "*.scss", "*.md", @@ -75,5 +73,13 @@ "src/libs/SearchParser/autocompleteParser.js", "Mobile-Expensify", "modules/group-ib-fp" + ], + "overrides": [ + { + "files": ["*.yml", "*.yaml"], + "options": { + "tabWidth": 2 + } + } ] } diff --git a/.prettierignore b/.prettierignore index 95555d090bf2..57e29eda82f8 100644 --- a/.prettierignore +++ b/.prettierignore @@ -10,8 +10,6 @@ vendor package.json package-lock.json *.html -*.yml -*.yaml *.css *.scss *.md diff --git a/codecov.yml b/codecov.yml index f526f04b2d41..11e98eb3e2f4 100644 --- a/codecov.yml +++ b/codecov.yml @@ -17,8 +17,8 @@ codecov: after_n_builds: 8 comment: - require_changes: "coverage_drop OR uncovered_patch" - layout: "condensed_header, files" + require_changes: 'coverage_drop OR uncovered_patch' + layout: 'condensed_header, files' hide_project_coverage: true hide_comment_details: false @@ -28,4 +28,4 @@ flags: - src/ ignore: - - "src/languages/**" + - 'src/languages/**' diff --git a/cspell.json b/cspell.json index abf54437da66..dc072790138c 100644 --- a/cspell.json +++ b/cspell.json @@ -779,6 +779,7 @@ "onplayerror", "ontext", "onxy", + "oxfmt", "openxmlformats", "ordinality", "organisation", diff --git a/docs/_config.yml b/docs/_config.yml index fbf0e75d8708..06b604db391d 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -10,9 +10,9 @@ main_style: /assets/css/styles.css defaults: - scope: - path: "" # an empty string here means all files in the project + path: '' # an empty string here means all files in the project values: - layout: "default" + layout: 'default' image: /assets/images/og-preview-image.png exclude: [README.md, TEMPLATE.md, vendor, Gemfile, Gemfile.lock] diff --git a/docs/_data/_routes.yml b/docs/_data/_routes.yml index f2259e435102..ea8c0295cdb4 100644 --- a/docs/_data/_routes.yml +++ b/docs/_data/_routes.yml @@ -126,9 +126,9 @@ platforms: hub-title: Expensify Classic - Help & Resources hub-description: Questions? Find the answers by clicking a Category or using the search bar located in the left-hand menu. url: www.expensify.com - description: "Your account settings look like this:" + description: 'Your account settings look like this:' image: /assets/images/settings-old-dot.svg - + # Hubs are comprised of subcategories and articles. Subcategories contain multiple related articles, but there can be standalone articles as well hubs: - href: getting-started @@ -155,7 +155,7 @@ platforms: title: Domains icon: /assets/images/domains.svg description: Claim and verify your company’s domain to access additional management and security features. - + - href: bank-accounts-and-payments title: Bank Accounts & Payments icon: /assets/images/send-money.svg @@ -201,15 +201,14 @@ platforms: icon: /assets/images/subscription-annual.svg description: Review Expensify's subscription options, plan types, and payment methods. - - href: new-expensify title: New Expensify hub-title: New Expensify - Help & Resources hub-description: Questions? Find the answers by clicking a Category or using the search bar. url: new.expensify.com - description: "Your account settings look like this:" + description: 'Your account settings look like this:' image: /assets/images/help-new.png - + hubs: - href: getting-started title: Getting Started @@ -229,7 +228,7 @@ platforms: - href: ai-agents title: AI Agents icon: /assets/images/simple-illustration__ai-bot.svg - description: Learn about AI Agents and what they can do. + description: Learn about AI Agents and what they can do. - href: workspaces title: Workspaces @@ -239,13 +238,13 @@ platforms: - href: insights title: Insights icon: /assets/images/monitor.svg - description: Get insight into company expenses to track spend patterns and stay informed. - + description: Get insight into company expenses to track spend patterns and stay informed. + - href: reports-and-expenses title: Reports & Expenses icon: /assets/images/envelope-receipt.svg description: Learn more about expense tracking and submission. - + - href: domains title: Domains icon: /assets/images/domains.svg @@ -260,7 +259,7 @@ platforms: title: Connect Credit Cards icon: /assets/images/bank-card.svg description: Track credit card transactions and reconcile company cards. - + - href: expensify-card title: Expensify Card icon: /assets/images/hand-card.svg @@ -275,57 +274,57 @@ platforms: title: Settings icon: /assets/images/gears.svg description: Manage profile settings and notifications. - + - href: billing-and-subscriptions title: Expensify Billing & Subscriptions icon: /assets/images/subscription-annual.svg description: Review Expensify's subscription options, plan types, and payment methods. - + - href: travel title: Expensify Travel hub-title: Expensify Travel hub-description: Questions? Find the answers by clicking a Category or using the search bar. url: travel.expensify.com - description: "Get the help you need to book and manage travel." + description: 'Get the help you need to book and manage travel.' image: /assets/images/help-travel.png - + hubs: - href: getting-started title: Getting Started icon: /assets/images/accounting.svg - description: "Learn how to get started with Expensify Travel." + description: 'Learn how to get started with Expensify Travel.' - href: booking-travel title: Booking with Expensify Travel icon: /assets/images/simple-illustration__luggage.svg - description: "Everything you need to know about booking flights, hotels, and more with Expensify Travel." + description: 'Everything you need to know about booking flights, hotels, and more with Expensify Travel.' - href: managing-trips title: Managing trips icon: /assets/images/plane.svg - description: "Learn how to easily manage, modify, or cancel your trips." + description: 'Learn how to easily manage, modify, or cancel your trips.' - href: company-setup title: Setting up your company in Expensify Travel icon: /assets/images/gears.svg - description: "Set up your company to manage departments, users, booking restrictions, and more." + description: 'Set up your company to manage departments, users, booking restrictions, and more.' - href: travel-policy title: Creating a travel policy icon: /assets/images/simple-illustration__rules.svg - description: "Create a clear, effective travel policy for employee bookings." + description: 'Create a clear, effective travel policy for employee bookings.' - href: travel-analytics title: Travel Analytics icon: /assets/images/simple-illustration__chart.svg - description: "Track spend, spot savings, and drive smarter bookings with travel analytics." + description: 'Track spend, spot savings, and drive smarter bookings with travel analytics.' - href: event-management title: Event Management icon: /assets/images/envelope-receipt.svg - description: "Learn how to create and manage Travel Events for group bookings." + description: 'Learn how to create and manage Travel Events for group bookings.' - href: consolidated-travel-billing title: Consolidated Travel Billing icon: /assets/images/subscription-annual.svg - description: "Centralize travel payments so employees can book trips without using personal cards or submitting reimbursements." + description: 'Centralize travel payments so employees can book trips without using personal cards or submitting reimbursements.' diff --git a/package.json b/package.json index f5833ab78967..07aa2e2e4e95 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "spell-changed": "cspell --color --no-must-find-files", "fmt": "oxfmt --write .", "fmt-changed": "oxfmt --write $(git diff --diff-filter=AMR --name-only origin/main HEAD)", - "fmt-watch": "onchange \"**/*.{js,mjs,ts,tsx}\" -- oxfmt --write {{changed}}", + "fmt-watch": "onchange \"**/*.{js,mjs,ts,tsx,yml,yaml}\" -- oxfmt --write {{changed}}", "print-version": "echo $npm_package_version", "storybook": "storybook dev -p 6006", "storybook-build": "ENV=production storybook build -o dist/docs",