name: Reusable Test Workflow on: workflow_call: inputs: os: description: 'Operating system' required: false type: string default: 'ubuntu-latest' node-version: description: 'Node.js version' required: false type: string default: '20.x' package-manager: description: 'Package manager to use' required: false type: string default: 'npm' jobs: test: name: Test runs-on: ${{ inputs.os }} timeout-minutes: 10 steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Setup Node.js uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: ${{ inputs.node-version }} - name: Setup pnpm if: inputs.package-manager == 'pnpm' && inputs.node-version != '18.x' uses: pnpm/action-setup@91ab88e2619ed1f46221f0ba42d1492c02baf788 # v6.0.6 with: # Keep an explicit pnpm major because this repo's packageManager is Yarn. version: 10 - name: Setup pnpm (via Corepack) if: inputs.package-manager == 'pnpm' && inputs.node-version == '18.x' shell: bash run: | corepack enable corepack prepare pnpm@9 --activate - name: Setup Yarn (via Corepack) if: inputs.package-manager == 'yarn' shell: bash run: | corepack enable corepack prepare yarn@stable --activate - name: Setup Bun if: inputs.package-manager == 'bun' uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 # COREPACK_ENABLE_STRICT=0 allows pnpm to install even though # package.json declares "packageManager": "yarn@..." - name: Install dependencies shell: bash env: COREPACK_ENABLE_STRICT: '0' npm_config_ignore_scripts: 'true' YARN_ENABLE_SCRIPTS: 'false' run: | case "${{ inputs.package-manager }}" in npm) npm ci --ignore-scripts ;; # pnpm v10 can fail CI on ignored native build scripts # (for example msgpackr-extract) even though this repo is Yarn-native # and pnpm is only exercised here as a compatibility lane. pnpm) pnpm install --ignore-scripts --config.strict-dep-builds=false --no-frozen-lockfile ;; # Yarn Berry (v4+) removed --ignore-engines; engine checking is no longer a core feature yarn) yarn install --mode=skip-build ;; bun) bun install --ignore-scripts ;; *) echo "Unsupported package manager: ${{ inputs.package-manager }}" && exit 1 ;; esac - name: Run tests run: node tests/run-all.js env: CLAUDE_CODE_PACKAGE_MANAGER: ${{ inputs.package-manager }} - name: Upload test artifacts if: failure() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: test-results-${{ inputs.os }}-node${{ inputs.node-version }}-${{ inputs.package-manager }} path: | tests/ !tests/node_modules/