Publish to npm #9
This file contains hidden or 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: Publish to npm | |
| on: | |
| release: | |
| types: [published] | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| jobs: | |
| publish: | |
| runs-on: ubuntu-latest | |
| # Publish only for released tags or manual dispatches. | |
| if: github.event_name == 'release' || github.event_name == 'workflow_dispatch' | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Use Node.js 22 | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 22 | |
| registry-url: https://registry.npmjs.org | |
| cache: npm | |
| - name: Install dependencies | |
| run: npm ci | |
| - name: Validate version alignment | |
| run: | | |
| PACKAGE_VERSION=$(node -p "require('./package.json').version") | |
| SERVER_VERSION=$(node -p "require('./server.json').version") | |
| CONFIG_VERSION=$(node -e "const fs=require('fs'); const s=fs.readFileSync('./src/config.ts','utf8'); const m=s.match(/export const SERVER_VERSION = \"([^\"]+)\";/); if(!m){process.exit(1)}; console.log(m[1]);") | |
| echo "package.json version: ${PACKAGE_VERSION}" | |
| echo "server.json version: ${SERVER_VERSION}" | |
| echo "src/config.ts version: ${CONFIG_VERSION}" | |
| if [ "${PACKAGE_VERSION}" != "${SERVER_VERSION}" ] || [ "${PACKAGE_VERSION}" != "${CONFIG_VERSION}" ]; then | |
| echo "Version mismatch detected. Ensure package.json, server.json, and src/config.ts are identical." | |
| exit 1 | |
| fi | |
| - name: Validate release tag matches package version | |
| if: github.event_name == 'release' | |
| run: | | |
| PACKAGE_VERSION=$(node -p "require('./package.json').version") | |
| RELEASE_TAG="${{ github.event.release.tag_name }}" | |
| EXPECTED_TAG="v${PACKAGE_VERSION}" | |
| echo "release tag: ${RELEASE_TAG}" | |
| echo "expected tag: ${EXPECTED_TAG}" | |
| if [ "${RELEASE_TAG}" != "${EXPECTED_TAG}" ]; then | |
| echo "Release tag does not match package version." | |
| exit 1 | |
| fi | |
| - name: Check if version already exists on npm | |
| id: npm_check | |
| run: | | |
| PACKAGE_NAME=$(node -p "require('./package.json').name") | |
| PACKAGE_VERSION=$(node -p "require('./package.json').version") | |
| if npm view "${PACKAGE_NAME}@${PACKAGE_VERSION}" version >/dev/null 2>&1; then | |
| echo "already_published=true" >> "$GITHUB_OUTPUT" | |
| echo "Version ${PACKAGE_VERSION} is already published. Skipping publish." | |
| else | |
| echo "already_published=false" >> "$GITHUB_OUTPUT" | |
| echo "Version ${PACKAGE_VERSION} is not published yet." | |
| fi | |
| - name: Build | |
| run: npm run build | |
| - name: Test | |
| run: npm test | |
| - name: Publish to npm | |
| if: steps.npm_check.outputs.already_published == 'false' | |
| run: npm publish --access public | |
| env: | |
| NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} |