@@ -21,9 +21,23 @@ name: publish
2121
2222# Workflow triggers:
2323on :
24- # Run workflow when a new tag is pushed to the repository:
25- push :
26- tags : v[0-9]+.[0-9]+.[0-9]+
24+ # Allow the workflow to be manually run:
25+ workflow_dispatch :
26+ # Workflow inputs:
27+ inputs :
28+ version :
29+ description : ' Version Increment'
30+ type : choice
31+ default : ' none'
32+ options :
33+ - ' none'
34+ - ' major'
35+ - ' minor'
36+ - ' patch'
37+ - ' premajor'
38+ - ' preminor'
39+ - ' prepatch'
40+ - ' prerelease'
2741
2842# Workflow jobs:
2943jobs :
@@ -32,14 +46,15 @@ jobs:
3246 publish :
3347
3448 # Define display name:
35- name : ' Publish to npm'
49+ name : ' Publish package to npm'
3650
3751 # Define the type of virtual host machine on which to run the job:
3852 runs-on : ubuntu-latest
3953
4054 # Define environment variables:
4155 env :
4256 SLACK_WEBHOOK_URL : ${{ secrets.SLACK_WEBHOOK_URL }}
57+ NPM_TOKEN : ${{ secrets.NPM_TOKEN }}
4358
4459 # Define the sequence of job steps...
4560 steps :
5570 node-version : 16
5671 timeout-minutes : 5
5772
73+ # Configure git:
74+ - name : ' Configure git'
75+ run : |
76+ git config --local user.email "noreply@stdlib.io"
77+ git config --local user.name "stdlib-bot"
78+
79+ # Increment package version (if requested):
80+ - name : ' Increment package version (if requested)'
81+ if : ${{ github.event.inputs.version != 'none' }}
82+ run : |
83+ # Save NPM_TOKEN to user's .npmrc:
84+ echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > ~/.npmrc
85+
86+ # Increment package version:
87+ npm version ${{ github.event.inputs.version }} --no-git-tag-version
88+
89+ # Define variable for new version:
90+ NEW_VERSION=$(node -p "require('./package.json').version")
91+
92+ # Replace branch in README.md link definitions for badges with the new version:
93+ find . -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/branch([=:])[^ ]+/branch\1v${NEW_VERSION}/g"
94+
95+ # Create a new commit and tag:
96+ git add package.json README.md
97+ git commit -m "Release v${NEW_VERSION}"
98+ git tag -a "v${NEW_VERSION}" -m "Release v${NEW_VERSION}"
99+
100+ # Push changes to GitHub:
101+ SLUG=${{ github.repository }}
102+ git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" --follow-tags
103+
104+ # Remove CLI:
105+ - name : ' Remove CLI'
106+ if : ${{ github.ref == 'refs/heads/main' }}
107+ run : |
108+ # Exit if the package does not have a CLI:
109+ if ! grep -q '"bin":' package.json; then
110+ exit 0
111+ fi
112+ rm -rf ./bin/cli
113+ rm -f test/test.cli.js
114+ rm -f etc/cli_opts.json
115+ rm -f docs/usage.txt
116+
117+ # For all dependencies, check in all *.js files if they are still used; if not, remove them:
118+ jq -r '.dependencies | keys[]' ./package.json | while read -r dep; do
119+ dep=$(echo "$dep" | xargs)
120+ if ! grep -q "$dep" lib/** && ! grep -q -s "$dep" manifest.json && ! grep -q -s "$dep" include.gypi; then
121+ jq --indent 2 "del(.dependencies[\"$dep\"])" ./package.json > ./package.json.tmp
122+ mv ./package.json.tmp ./package.json
123+ fi
124+ done
125+ jq -r '.devDependencies | keys[]' ./package.json | while read -r dep; do
126+ if [[ "$dep" != "@stdlib"* ]]; then
127+ continue
128+ fi
129+ dep=$(echo "$dep" | xargs)
130+ if ! grep -q "$dep" lib/** && ! grep -q -s "$dep" manifest.json && ! grep -q -s "$dep" include.gypi; then
131+ jq --indent 2 "del(.devDependencies[\"$dep\"])" ./package.json > ./package.json.tmp
132+ mv ./package.json.tmp ./package.json
133+ fi
134+ done
135+
136+ # Remove CLI section:
137+ find . -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?<section class=\"cli\">[\s\S]+?<\!\-\- \/.cli \-\->//"
138+
139+ # Remove CLI from package.json:
140+ jq -r 'del(.bin)' package.json > package.json.tmp
141+ mv package.json.tmp package.json
142+
143+ # Add entry for CLI package to See Also section of README.md:
144+ cliPkgName=$(jq -r '.name' package.json)-cli
145+ escapedPkg=$(echo "$cliPkgName" | sed -e 's/\//\\\//g')
146+ escapedPkg=$(echo "$escapedPkg" | sed -e 's/\@/\\\@/g')
147+ find . -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/<section class=\"related\">(?:\n\n\* \* \*\n\n## See Also\n\n)?/<section class=\"related\">\n\n## See Also\n\n- <span class=\"package-name\">[\`$escapedPkg\`][$escapedPkg]<\/span><span class=\"delimiter\">: <\/span><span class=\"description\">CLI package for use as a command-line utility.<\/span>\n/"
148+
149+ # Add link definition for CLI package to README.md:
150+ find . -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/<section class=\"links\">/<section class=\"links\">\n\n[$escapedPkg]: https:\/\/www.npmjs.com\/package\/$escapedPkg/"
151+
152+ # Replace GitHub MathJax equations with SVGs:
153+ - name : ' Replace GitHub MathJax equations with SVGs'
154+ run : |
155+ find . -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe 's/```math\n([\s\S]+?)\n```\n\n//g'
156+ find . -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe 's/<!-- <div class="equation"(.*)(<\/div>\s*-->)/<div class="equation"$1<\/div>/sg'
157+
58158 # Replace GitHub links to individual packages with npm links:
59159 - name : ' Replace all GitHub links to individual packages with npm links'
60160 run : |
@@ -65,14 +165,39 @@ jobs:
65165 run : |
66166 find . -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`\n\nAlternatively,[^<]+<\/section>/\`\`\`\n\n<\/section>/"
67167
168+ # Remove unnecessary files:
169+ - name : ' Remove unnecessary files'
170+ run : |
171+ rm -f docs/repl.txt
172+ rm -f docs/types/test.ts
173+
68174 # Replace all stdlib GitHub dependencies with the respective npm packages:
69175 - name : ' Replace all stdlib GitHub dependencies with the respective npm packages'
70176 run : |
71- find package.json -type f -print0 | xargs -0 sed -Ei 's/"github:stdlib-js[^"]*"/"^0.0.x"/g'
177+ for dep in $(jq -r '.dependencies | keys | .[]' package.json); do
178+ if [[ "$dep" != "@stdlib"* ]]; then
179+ continue
180+ fi
181+ # Trim leading and trailing whitespace:
182+ dep=$(echo "$dep" | xargs)
183+ version="^$(npm view $dep version)"
184+ jq -r --arg dep "$dep" --arg version "$version" '.dependencies[$dep] = $version' package.json > package.json.tmp
185+ mv package.json.tmp package.json
186+ done
187+ for dep in $(jq -r '.devDependencies | keys | .[]' package.json); do
188+ if [[ "$dep" != "@stdlib"* ]]; then
189+ continue
190+ fi
191+ # Trim leading and trailing whitespace:
192+ dep=$(echo "$dep" | xargs)
193+ version="^$(npm view $dep version)"
194+ jq -r --arg dep "$dep" --arg version "$version" '.devDependencies[$dep] = $version' package.json > package.json.tmp
195+ mv package.json.tmp package.json
196+ done
72197
73198 # Publish package to npm:
74199 - name : ' Publish package to npm'
75- uses : JS-DevTools/npm-publish@v1
200+ uses : JS-DevTools/npm-publish@v2
76201 with :
77202 token : ${{ secrets.NPM_TOKEN }}
78203 access : public
84209
85210 # Send status to Slack channel if job fails:
86211 - name : ' Send status to Slack channel in case of failure'
87- uses : act10ns/slack@v1
212+ uses : act10ns/slack@v2
88213 with :
89214 status : ${{ job.status }}
90215 steps : ${{ toJson(steps) }}
0 commit comments