@@ -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 
0 commit comments