diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..e4eff6b --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,254 @@ +name: ci + +on: + push: + branches: + - master + paths-ignore: + - '*.md' + pull_request: + paths-ignore: + - '*.md' + +jobs: + test: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + name: + - Node.js 0.8 + - Node.js 0.10 + - Node.js 0.12 + - io.js 1.x + - io.js 2.x + - io.js 3.x + - Node.js 4.x + - Node.js 5.x + - Node.js 6.x + - Node.js 7.x + - Node.js 8.x + - Node.js 9.x + - Node.js 10.x + - Node.js 11.x + - Node.js 12.x + - Node.js 13.x + - Node.js 14.x + - Node.js 15.x + - Node.js 16.x + - Node.js 17.x + - Node.js 18.x + - Node.js 19.x + - Node.js 20.x + - Node.js 21.x + - Node.js 22.x + - Node.js 23.x + - Node.js 24.x + - Node.js 25.x + + include: + - name: Node.js 0.8 + node-version: "0.8" + npm-i: mocha@2.5.3 supertest@1.1.0 + npm-rm: istanbul + + - name: Node.js 0.10 + node-version: "0.10" + npm-i: mocha@3.5.3 supertest@2.0.0 + npm-rm: istanbul + + - name: Node.js 0.12 + node-version: "0.12" + npm-i: mocha@3.5.3 supertest@2.0.0 + npm-rm: istanbul + + - name: io.js 1.x + node-version: "1" + npm-i: mocha@3.5.3 supertest@2.0.0 + npm-rm: istanbul + + - name: io.js 2.x + node-version: "2" + npm-i: mocha@3.5.3 supertest@2.0.0 + npm-rm: istanbul + + - name: io.js 3.x + node-version: "3" + npm-i: mocha@3.5.3 supertest@2.0.0 + npm-rm: istanbul + + - name: Node.js 4.x + node-version: "4" + npm-i: mocha@5.2.0 supertest@3.4.2 + + - name: Node.js 5.x + node-version: "5" + npm-i: mocha@5.2.0 supertest@3.4.2 + + - name: Node.js 6.x + node-version: "6" + npm-i: mocha@6.2.2 + + - name: Node.js 7.x + node-version: "7" + npm-i: mocha@6.2.2 + + - name: Node.js 8.x + node-version: "8" + + - name: Node.js 9.x + node-version: "9" + + - name: Node.js 10.x + node-version: "10" + + - name: Node.js 11.x + node-version: "11" + + - name: Node.js 12.x + node-version: "12" + + - name: Node.js 13.x + node-version: "13" + + - name: Node.js 14.x + node-version: "14" + + - name: Node.js 15.x + node-version: "15" + + - name: Node.js 16.x + node-version: "16" + + - name: Node.js 17.x + node-version: "17" + + - name: Node.js 18.x + node-version: "18" + + - name: Node.js 19.x + node-version: "19" + + - name: Node.js 20.x + node-version: "20" + + - name: Node.js 21.x + node-version: "21" + + - name: Node.js 22.x + node-version: "22" + + - name: Node.js 23.x + node-version: "23" + + - name: Node.js 24.x + node-version: "24" + + - name: Node.js 25.x + node-version: "25" + + steps: + - uses: actions/checkout@v6 + + - name: Install Node.js ${{ matrix.node-version }} + shell: bash -eo pipefail -l {0} + run: | + nvm install --default ${{ matrix.node-version }} + if [[ "${{ matrix.node-version }}" == 0.* && "$(cut -d. -f2 <<< "${{ matrix.node-version }}")" -lt 10 ]]; then + nvm install --alias=npm 0.10 + nvm use ${{ matrix.node-version }} + sed -i '1s;^.*$;'"$(printf '#!%q' "$(nvm which npm)")"';' "$(readlink -f "$(which npm)")" + npm config set strict-ssl false + npm install -g --prefix "$(which node)/../.." npm@1.2.8000 + sed -i '1s;^.*$;'"$(printf '#!%q' "$(nvm which npm)")"';' "$(readlink -f "$(which npm)")" + fi + dirname "$(nvm which ${{ matrix.node-version }})" >> "$GITHUB_PATH" + + - name: Configure npm + run: | + if [[ "$(npm config get package-lock)" == "true" ]]; then + npm config set package-lock false + else + npm config set shrinkwrap false + fi + + - name: Remove npm module(s) ${{ matrix.npm-rm }} + run: npm rm --silent --save-dev ${{ matrix.npm-rm }} + if: matrix.npm-rm != '' + + - name: Install npm module(s) ${{ matrix.npm-i }} + run: npm install --save-dev ${{ matrix.npm-i }} + if: matrix.npm-i != '' + + - name: Setup Node.js version-specific dependencies + shell: bash + run: | + # eslint for linting + # - remove on Node.js < 12 + if [[ "$(cut -d. -f1 <<< "${{ matrix.node-version }}")" -lt 12 ]]; then + node -pe 'Object.keys(require("./package").devDependencies).join("\n")' | \ + grep -E '^eslint(-|$)' | \ + sort -r | \ + xargs -n1 npm rm --silent --save-dev + fi + + - name: Install Node.js dependencies + run: npm install + + - name: List environment + id: list_env + shell: bash + run: | + echo "node@$(node -v)" + echo "npm@$(npm -v)" + npm -s ls ||: + (npm -s ls --depth=0 ||:) | awk -F'[ @]' 'NR>1 && $2 { print $2 "=" $3 }' >> "$GITHUB_OUTPUT" + + - name: Run tests + shell: bash + run: | + if npm -ps ls istanbul | grep -q istanbul; then + npm run test-ci + cp coverage/lcov.info "coverage/${{ matrix.name }}.lcov" + else + npm test + fi + + - name: Lint code + if: steps.list_env.outputs.eslint != '' + run: npm run lint + + - name: Upload code coverage + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + with: + name: coverage-node-${{ matrix.node-version }} + path: ./coverage/lcov.info + retention-days: 1 + + coverage: + needs: test + runs-on: ubuntu-latest + permissions: + contents: read + checks: write + steps: + - uses: actions/checkout@v6 + + - name: Install lcov + shell: bash + run: sudo apt-get -y install lcov + + - name: Collect coverage reports + uses: actions/download-artifact@v6 + with: + path: ./coverage + pattern: coverage-node-* + + - name: Merge coverage reports + shell: bash + run: find ./coverage -name lcov.info -exec printf '-a %q\n' {} \; | xargs lcov -o ./lcov.info + + - name: Upload coverage report + uses: coverallsapp/github-action@648a8eb78e6d50909eff900e4ec85cab4524a45b # v2.3.6 + with: + file: ./lcov.info \ No newline at end of file diff --git a/README.md b/README.md index 0f2661c..ac71bf7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![NPM Version][npm-version-image]][npm-url] [![NPM Downloads][npm-downloads-image]][npm-url] -[![Build Status][travis-image]][travis-url] + [![Test Coverage][coveralls-image]][coveralls-url] Development-only error handler middleware. @@ -126,5 +126,3 @@ function errorNotification (err, str, req) { [npm-downloads-image]: https://badgen.net/npm/dm/errorhandler [npm-url]: https://npmjs.org/package/errorhandler [npm-version-image]: https://badgen.net/npm/v/errorhandler -[travis-image]: https://badgen.net/travis/expressjs/errorhandler/master -[travis-url]: https://travis-ci.org/expressjs/errorhandler diff --git a/package.json b/package.json index 6563f51..ccca329 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,6 @@ "lint": "eslint --plugin markdown --ext js,md .", "test": "mocha --reporter spec --bail --check-leaks test/", "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" + "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" } }