name: Release on: push: tags: - 'v*.*.*' jobs: lint: name: Lint runs-on: ubuntu-latest permissions: contents: read steps: - name: Checkout code uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - name: Setup Node.js uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version: 'lts/*' cache: 'npm' - name: Install dependencies run: npm ci - name: Run biome lint run: npm run lint test: name: Test runs-on: ubuntu-latest needs: lint permissions: contents: read steps: - name: Checkout code uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - name: Setup Node.js uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version: 'lts/*' cache: 'npm' - name: Install dependencies run: npm ci - name: Run tests with coverage run: npm test - name: Upload coverage artifacts uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: always() with: name: coverage path: coverage/ build: name: Build runs-on: ubuntu-latest needs: lint permissions: contents: read steps: - name: Checkout code uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - name: Setup Node.js uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version: 'lts/*' cache: 'npm' - name: Install dependencies run: npm ci - name: Build project run: npm run build - name: Upload build artifacts uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: dist path: dist/ create-release: name: Create GitHub Release runs-on: ubuntu-latest needs: [lint, test, build] permissions: contents: write steps: - name: Checkout code uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - name: Download build artifacts uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 with: name: dist path: dist/ - name: Create GitHub Release uses: softprops/action-gh-release@5be0e66d93ac7ed76da52eca8bb058f665c3a5fe # v2.4.2 with: generate_release_notes: true files: | dist/**/* publish: name: Publish to npm runs-on: ubuntu-latest needs: [lint, test, build, create-release] permissions: contents: read id-token: write steps: - name: Checkout code uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - name: Setup Node.js uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 with: node-version: 'lts/*' cache: 'npm' registry-url: 'https://registry.npmjs.org' - name: Install dependencies run: npm ci - name: Build project run: npm run build - name: Check if version exists on npm id: check-version run: | PACKAGE_VERSION=$(node -p "require('./package.json').version") PACKAGE_NAME=$(node -p "require('./package.json').name") echo "version=$PACKAGE_VERSION" >> $GITHUB_OUTPUT echo "name=$PACKAGE_NAME" >> $GITHUB_OUTPUT if npm view "$PACKAGE_NAME@$PACKAGE_VERSION" version 2>/dev/null; then echo "exists=true" >> $GITHUB_OUTPUT echo "⚠️ Version $PACKAGE_VERSION already exists on npm, skipping publish" else echo "exists=false" >> $GITHUB_OUTPUT echo "✅ Version $PACKAGE_VERSION does not exist on npm, will publish" fi - name: Publish to npm if: steps.check-version.outputs.exists == 'false' run: npm publish --provenance --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}