107 lines
3.9 KiB
YAML
107 lines
3.9 KiB
YAML
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.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 latest version for comparison"
|
|
if: ${{ steps.npm.outputs.latestVersion && inputs.skipCompare == 'false' }}
|
|
id: pack_comparison
|
|
uses: act/common/npm/npm-pack@master
|
|
with:
|
|
version: ${{ steps.npm.outputs.latestVersion }}
|
|
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.latestVersion }}
|
|
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
|