fix(utils): type portability with RuleCreator
, fix #7605 (#7690)
#18
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI | |
on: | |
push: | |
branches: | |
- main | |
pull_request: | |
branches: | |
- '**' | |
merge_group: | |
env: | |
PRIMARY_NODE_VERSION: '>=20.6.1' | |
# Only set the read-write token if we are on the main branch | |
NX_CLOUD_ACCESS_TOKEN: ${{ (github.event_name == 'push' && github.ref == 'refs/heads/main') && secrets.NX_CLOUD_ACCESS_TOKEN || '' }} | |
defaults: | |
run: | |
shell: bash | |
# | |
# Workflow for how the CI spawns jobs: | |
# 1) Run the install and cache the install artefacts | |
# 2) Run the build and cache the output | |
# - In parallel we also any steps that don't need the build (like prettier) | |
# 3) Run the steps that depend on the build | |
# | |
permissions: | |
contents: read # to fetch code (actions/checkout) | |
jobs: | |
install: | |
name: Checkout and Install | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Install | |
uses: ./.github/actions/prepare-install | |
with: | |
node-version: ${{ env.PRIMARY_NODE_VERSION }} | |
build: | |
name: Build All Packages | |
needs: [install] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Install | |
uses: ./.github/actions/prepare-install | |
with: | |
node-version: ${{ env.PRIMARY_NODE_VERSION }} | |
- name: Build | |
uses: ./.github/actions/prepare-build | |
generate_configs: | |
name: Lint | |
needs: [build] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Install | |
uses: ./.github/actions/prepare-install | |
with: | |
node-version: ${{ env.PRIMARY_NODE_VERSION }} | |
- run: yarn generate-configs | |
- run: git status --porcelain | |
- if: failure() | |
run: echo "Outdated result detected from yarn generate-configs. Please check in any file changes." | |
lint_without_build: | |
name: Lint | |
needs: [install] | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
lint-task: ['check-spelling', 'check-format', 'lint-markdown'] | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Install | |
uses: ./.github/actions/prepare-install | |
with: | |
node-version: ${{ env.PRIMARY_NODE_VERSION }} | |
- name: Run Check | |
run: yarn ${{ matrix.lint-task }} | |
lint_with_build: | |
name: Lint | |
# because we lint with our own tooling, we need to build | |
needs: [build] | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
lint-task: ['lint', 'typecheck'] | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Install | |
uses: ./.github/actions/prepare-install | |
with: | |
node-version: ${{ env.PRIMARY_NODE_VERSION }} | |
- name: Build | |
uses: ./.github/actions/prepare-build | |
- name: Run Check | |
run: yarn ${{ matrix.lint-task }} | |
stylelint: | |
name: Stylelint | |
needs: [install] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Install | |
uses: ./.github/actions/prepare-install | |
with: | |
node-version: ${{ env.PRIMARY_NODE_VERSION }} | |
- name: Run stylelint check | |
run: yarn stylelint | |
working-directory: packages/website | |
integration_tests: | |
name: Run integration tests on primary Node.js version | |
needs: [build] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Install | |
uses: ./.github/actions/prepare-install | |
with: | |
node-version: ${{ env.PRIMARY_NODE_VERSION }} | |
- name: Build | |
uses: ./.github/actions/prepare-build | |
- name: Run integrations tests | |
run: yarn test-integration | |
env: | |
CI: true | |
unit_tests: | |
name: Run Unit Tests | |
needs: [build] | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
# just run on the oldest and latest supported versions and assume the intermediate versions are good | |
node-version: [16, 20] | |
package: | |
[ | |
'ast-spec', | |
'eslint-plugin', | |
'eslint-plugin-internal', | |
'eslint-plugin-tslint', | |
'parser', | |
'repo-tools', | |
'rule-schema-to-typescript-types', | |
'scope-manager', | |
'type-utils', | |
'typescript-estree', | |
'utils', | |
'visitor-keys', | |
] | |
env: | |
# Added the - at the end to function as a separator to improve readability in the PR comment from the Nx cloud app | |
NX_CLOUD_ENV_NAME: 'Node ${{ matrix.node-version }} -' | |
COLLECT_COVERAGE: false | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 2 | |
- name: Install | |
uses: ./.github/actions/prepare-install | |
with: | |
node-version: ${{ matrix.node-version }} | |
- name: Build | |
uses: ./.github/actions/prepare-build | |
# collect coverage on the primary node version | |
# we don't collect coverage on other node versions so they run faster | |
# note that we don't do this as a single `run` with a flag because some | |
# packages don't collect coverage on purpose, so forcing `--coverage=true` | |
# would override the config | |
- name: Run unit tests with coverage for ${{ matrix.package }} | |
if: env.PRIMARY_NODE_VERSION == matrix.node-version | |
run: npx nx test ${{ matrix.package }} | |
env: | |
CI: true | |
- name: Run unit tests for ${{ matrix.package }} | |
if: env.PRIMARY_NODE_VERSION != matrix.node-version | |
run: npx nx test ${{ matrix.package }} --coverage=false | |
env: | |
CI: true | |
- name: Store coverage for uploading | |
if: env.PRIMARY_NODE_VERSION == matrix.node-version | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ matrix.package }}-coverage | |
path: packages/${{ matrix.package }}/coverage/lcov.info | |
# Sadly 1 day is the minimum | |
retention-days: 1 | |
unit_tests_tsserver: | |
name: Run Unit Tests with Experimental TSServer | |
needs: [build] | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
package: | |
[ | |
'eslint-plugin', | |
'eslint-plugin-internal', | |
'eslint-plugin-tslint', | |
'typescript-estree', | |
] | |
env: | |
COLLECT_COVERAGE: false | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 2 | |
- name: Install | |
uses: ./.github/actions/prepare-install | |
with: | |
node-version: 18 | |
- name: Build | |
uses: ./.github/actions/prepare-build | |
- name: Run unit tests for ${{ matrix.package }} | |
run: npx nx test ${{ matrix.package }} --coverage=false | |
env: | |
CI: true | |
TYPESCRIPT_ESLINT_EXPERIMENTAL_TSSERVER: true | |
website_tests: | |
permissions: | |
contents: read # to fetch code (actions/checkout) | |
name: Website tests | |
# We technically do not need to wait for build within the pipeline any more because the build we care about is happening within Netlify, however, | |
# it is highly likely that if the CI one fails, the Netlify one will as well, so in order to not waste unncessary Github Actions minutes/resources, | |
# we do still keep this requirement here. | |
needs: [build] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 2 | |
- name: Install | |
uses: ./.github/actions/prepare-install | |
with: | |
node-version: ${{ env.PRIMARY_NODE_VERSION }} | |
- name: Build website | |
if: github.repository != 'typescript-eslint/typescript-eslint' || github.ref != 'refs/heads/main' | |
run: NX_VERBOSE_LOGGING=true yarn nx build website | |
- name: Install Playwright Browsers | |
run: npx playwright install --with-deps chromium | |
- name: Wait for Netlify deployment | |
if: github.repository == 'typescript-eslint/typescript-eslint' && github.ref == 'refs/heads/main' | |
uses: ./.github/actions/wait-for-netlify | |
id: waitForDeployment | |
with: | |
netlify_token: ${{ secrets.NETLIFY_TOKEN }} | |
- name: Run Playwright tests against the Netlify deployment | |
if: github.repository == 'typescript-eslint/typescript-eslint' && github.ref == 'refs/heads/main' | |
run: yarn playwright test --reporter=list | |
working-directory: packages/website | |
env: | |
PLAYWRIGHT_TEST_BASE_URL: ${{ steps.waitForDeployment.outputs.url }} | |
- name: Run Playwright tests against local deployment | |
if: github.repository != 'typescript-eslint/typescript-eslint' || github.ref != 'refs/heads/main' | |
run: yarn playwright test --reporter=list | |
working-directory: packages/website | |
- if: always() | |
uses: actions/upload-artifact@v3 | |
with: | |
name: playwright-report | |
path: packages/website/playwright-report | |
upload_coverage: | |
name: Upload Codecov Coverage | |
needs: [unit_tests] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Download coverage reports | |
uses: actions/download-artifact@v3 | |
with: | |
path: coverage | |
- name: Publish code coverage report | |
uses: codecov/codecov-action@v3 | |
with: | |
token: ${{ secrets.CODECOV_TOKEN }} | |
files: coverage/**/lcov.info | |
flags: unittest | |
name: codecov | |
publish_canary_version: | |
name: Publish the latest code as a canary version | |
runs-on: ubuntu-latest | |
permissions: | |
id-token: write | |
needs: [integration_tests, lint_with_build, lint_without_build, unit_tests] | |
if: github.repository == 'typescript-eslint/typescript-eslint' && github.ref == 'refs/heads/main' | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Install | |
uses: ./.github/actions/prepare-install | |
with: | |
node-version: ${{ env.PRIMARY_NODE_VERSION }} | |
registry-url: 'https://registry.npmjs.org' | |
- name: Build | |
uses: ./.github/actions/prepare-build | |
# Fetch all history for all tags and branches in this job because lerna needs it | |
- run: | | |
git fetch --prune --unshallow | |
- name: Publish all packages to npm | |
run: npx lerna publish --loglevel=verbose --canary --exact --force-publish --yes | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} |