name: Node.js Test on: [push] jobs: nodejs-test: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 # Use caching only when a lockfile exists (avoids setup-node error) - name: Set up Node.js (with cache) if: ${{ hashFiles('**/package-lock.json','**/npm-shrinkwrap.json','**/yarn.lock') != '' }} uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Set up Node.js (no cache) if: ${{ hashFiles('**/package-lock.json','**/npm-shrinkwrap.json','**/yarn.lock') == '' }} uses: actions/setup-node@v4 with: node-version: '20' - name: Verify Node & npm run: | node -v npm -v - name: Install deps and run tests (or scaffold a smoke test) shell: bash run: | set -euo pipefail if [ -f package.json ]; then echo "package.json found." if [ -f package-lock.json ] || [ -f npm-shrinkwrap.json ]; then echo "Lockfile present -> npm ci" npm ci else echo "No lockfile -> npm install" npm install fi # Run tests only if there's a meaningful test script (not the default) if node -e "const p=require('./package.json'); const s=p.scripts&&p.scripts.test; process.exit(!(s && !/no test specified/i.test(String(s))));"; then npm test else echo "No meaningful test script found; skipping tests." fi else echo "No Node project detected -> scaffold a tiny Mocha test" npm init -y >/dev/null 2>&1 npm install --save-dev mocha >/dev/null 2>&1 npm pkg set scripts.test="mocha" >/dev/null 2>&1 printf '%s\n' \ 'function add(a, b) { return a + b; }' \ 'module.exports = { add };' > sum.js mkdir -p test printf '%s\n' \ "const assert = require('assert');" \ "const { add } = require('../sum');" \ "describe('add', () => {" \ " it('adds numbers', () => {" \ " assert.strictEqual(add(2, 2), 4);" \ " });" \ "});" > test/sum.test.js npm test fi