name: ci on: push: branches: - main - 'release*' pull_request: permissions: pull-requests: write env: NODE_VERSION: 24.15.0 TERM: xterm jobs: lint-typecheck: runs-on: ubuntu-22.04 steps: - name: ci/checkout-repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: ci/prepare-node-deps uses: ./.github/actions/prepare-node-deps - name: ci/check-styles shell: bash run: | echo "::group::check-styles" npm run check echo "::endgroup::" - name: ci/check-i18n shell: bash run: | echo "::group::check-i18n" ./scripts/precommit/i18n.sh echo "::endgroup::" detox-lint-typecheck: # The detox/ package has its own tsconfig and is not covered by the root # check above. A TypeScript error in a detox test file makes its whole suite # fail to run, so the E2E shard exits non-zero and drops its JUnit, silently # reducing the reported test count. Type-check detox on every PR so the error # surfaces here instead. runs-on: ubuntu-22.04 steps: - name: ci/checkout-repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: ci/prepare-node-deps uses: ./.github/actions/prepare-node-deps - name: ci/detox-install shell: bash # prepare-node-deps only installs the top-level node_modules; the detox # package has its own, needed for its type-check. run: cd detox && npm ci - name: ci/detox-typecheck shell: bash run: | echo "::group::detox-typecheck" cd detox && npm run tsc echo "::endgroup::" # Also validated by the E2E workflow, but that one is label-gated, so a header # contract break could sit unreported until someone asked for an E2E run. This # job is unconditional and finishes in about a minute. - name: ci/detox-validate-flow-headers shell: bash run: | echo "::group::detox-validate-flow-headers" bash detox/maestro/scripts/validate-flow-headers.sh echo "::endgroup::" test: runs-on: ubuntu-22.04 steps: - name: ci/checkout-repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: ci/prepare-node-deps uses: ./.github/actions/prepare-node-deps - name: ci/run-tests # main and PRs run test:coverage via the test-coverage action below; # release branches just need a plain test pass. if: startsWith(github.ref_name, 'release') shell: bash run: npm run test:ci - name: ci/test-coverage if: github.event_name == 'pull_request' || github.ref_name == 'main' uses: ./.github/actions/test-coverage with: run_id: ${{ github.run_id }}