name: npm-pack-and-compare description: "Build and pack an NPM package into a .tgz file." inputs: name: description: "The name of the package." required: true workingDirectory: description: "Working directory containing package.json." required: false default: "." nodeVersion: description: "Node.js version to use." required: false default: "20" buildScript: description: "Build script to run before packing (e.g., 'build' for 'npm run build'). Set to empty string to skip build step." required: false default: "build" defaultVersion: description: "Version of the package." required: true default: "1.0" outputDirectory: description: "Directory for the output .tgz." required: true default: "out" registry: description: "NPM registry URL." required: false default: ${{ github.server_url }}/api/packages/${{ github.repository_owner }}/npm/ apiKey: description: "Authentication token for the registry." required: true skipCompare: description: "Skip in-depth comparison." required: true default: "false" incrementMode: description: "Version increment mode: major, minor, patch." required: false default: "patch" outputs: tgz: description: "The generated output .tgz file." value: ${{ steps.package.outputs.tgz }} tgzName: description: "The generated output .tgz file's name." value: ${{ steps.package.outputs.tgzName }} hasChanged: description: "Whether or not the package files match." value: ${{ !steps.npm.outputs.latestVersion || inputs.skipCompare == 'true' || steps.compare.outputs.hasDifferences == 'true' }} runs: using: "composite" steps: - name: "Get the next version of the package." uses: act/common/npm/npm-get-next-branched-version@master id: npm with: name: ${{ inputs.name }} defaultVersion: ${{ inputs.defaultVersion }} registry: ${{ inputs.registry }} apiKey: ${{ inputs.apiKey }} incrementMode: ${{ inputs.incrementMode }} - name: "Pack with next version for comparison" if: ${{ steps.npm.outputs.nextVersion && inputs.skipCompare == 'false' }} id: pack_comparison uses: act/common/npm/npm-pack@master with: version: ${{ steps.npm.outputs.nextVersion }} workingDirectory: ${{ inputs.workingDirectory }} nodeVersion: ${{ inputs.nodeVersion }} buildScript: ${{ inputs.buildScript }} outputDirectory: ${{ inputs.outputDirectory }}/comparison registry: ${{ inputs.registry }} - name: "Compare to remote package" if: ${{ steps.npm.outputs.latestVersion && inputs.skipCompare == 'false' }} id: compare uses: act/common/npm/npm-diff@master with: name: ${{ inputs.name }} lhsVersion: ${{ steps.npm.outputs.latestVersion }} rhsVersion: ${{ steps.npm.outputs.nextVersion }} workingDirectory: ${{ inputs.workingDirectory }} registry: ${{ inputs.registry }} apiKey: ${{ inputs.apiKey }} failOnDifferences: "false" - name: "Pack with next version" if: ${{ !steps.npm.outputs.latestVersion || inputs.skipCompare == 'true' || steps.compare.outputs.hasDifferences == 'true' }} id: pack_final uses: act/common/npm/npm-pack@master with: version: ${{ steps.npm.outputs.nextVersion }} workingDirectory: ${{ inputs.workingDirectory }} nodeVersion: ${{ inputs.nodeVersion }} buildScript: ${{ inputs.buildScript }} outputDirectory: ${{ inputs.outputDirectory }} registry: ${{ inputs.registry }} skipInstall: ${{ steps.pack_comparison.conclusion }} - name: "Generate package outputs" id: package run: | TGZ_NAME="${{ inputs.name }}-${{ steps.npm.outputs.nextVersion }}.tgz" TGZ_PATH="${{ inputs.outputDirectory }}/$TGZ_NAME" echo "tgz=$TGZ_PATH" >> "$GITHUB_OUTPUT" echo "tgzName=$TGZ_NAME" >> "$GITHUB_OUTPUT" shell: bash