@nanoforge-dev/actions 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -19
- package/dist/create-release-pr/action.yml +20 -0
- package/dist/create-release-pr/index.js +1 -0
- package/dist/create-release-pr/index.js.map +1 -0
- package/dist/create-release-tag/action.yml +16 -0
- package/dist/create-release-tag/index.js +1 -0
- package/dist/create-release-tag/index.js.map +1 -0
- package/dist/release-packages/index.js +1 -1
- package/dist/release-packages/index.js.map +1 -1
- package/package.json +24 -21
- package/dist/pnpm-install/action.yml +0 -42
package/README.md
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
<div align="center">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
<a href="https://github.com/NanoForge-dev/
|
|
11
|
-
|
|
12
|
-
|
|
2
|
+
<br />
|
|
3
|
+
<p>
|
|
4
|
+
<a href="https://github.com/NanoForge-dev"><img src="https://github.com/NanoForge-dev/actions/blob/main/.github/logo.png" width="546" alt="NanoForge" /></a>
|
|
5
|
+
</p>
|
|
6
|
+
<br />
|
|
7
|
+
<p>
|
|
8
|
+
<a href="https://www.npmjs.com/package/@nanoforge-dev/actions"><img src="https://img.shields.io/npm/v/@nanoforge-dev/actions.svg?maxAge=3600" alt="npm version" /></a>
|
|
9
|
+
<a href="https://www.npmjs.com/package/@nanoforge-dev/actions"><img src="https://img.shields.io/npm/dt/@nanoforge-dev/actions.svg?maxAge=3600" alt="npm downloads" /></a>
|
|
10
|
+
<a href="https://github.com/NanoForge-dev/actions/actions/workflows/tests.yml"><img src="https://github.com/NanoForge-dev/actions/actions/workflows/tests.yml/badge.svg" alt="Tests status" /></a>
|
|
11
|
+
<a href="https://github.com/NanoForge-dev/actions/actions/workflows/push-docs.yml"><img src="https://github.com/NanoForge-dev/actions/actions/workflows/push-docs.yml/badge.svg" alt="Documentation status" /></a>
|
|
12
|
+
<a href="https://github.com/NanoForge-dev/actions/commits/main/utils/actions"><img src="https://img.shields.io/github/last-commit/NanoForge-dev/actions.svg?logo=github&logoColor=ffffff" alt="Last commit" /></a>
|
|
13
|
+
<a href="https://github.com/NanoForge-dev/actions/graphs/contributors"><img src="https://img.shields.io/github/contributors/NanoForge-dev/actions.svg?maxAge=3600&logo=github&logoColor=fff&color=00c7be" alt="Contributors" /></a>
|
|
14
|
+
</p>
|
|
13
15
|
</div>
|
|
14
16
|
|
|
15
17
|
## About
|
|
@@ -23,10 +25,10 @@ Most of the sources of this package come from [discord.js][discordjs-source]. Sp
|
|
|
23
25
|
**Node.js 24.11.0 or newer is required.**
|
|
24
26
|
|
|
25
27
|
```sh
|
|
26
|
-
npm install @nanoforge-dev/actions
|
|
27
|
-
yarn add @nanoforge-dev/actions
|
|
28
|
-
pnpm add @nanoforge-dev/actions
|
|
29
|
-
bun add @nanoforge-dev/actions
|
|
28
|
+
npm install --save-dev @nanoforge-dev/actions
|
|
29
|
+
yarn add -D @nanoforge-dev/actions
|
|
30
|
+
pnpm add -D @nanoforge-dev/actions
|
|
31
|
+
bun add -d @nanoforge-dev/actions
|
|
30
32
|
```
|
|
31
33
|
|
|
32
34
|
## Links
|
|
@@ -44,9 +46,9 @@ See [the contribution guide][contributing] if you'd like to submit a PR.
|
|
|
44
46
|
|
|
45
47
|
If you don't understand something in the documentation, you are experiencing problems, or you just need a gentle nudge in the right direction, please don't hesitate to ask questions in [discussions][discussions].
|
|
46
48
|
|
|
47
|
-
[documentation]: https://github.com/NanoForge-dev/
|
|
48
|
-
[discussions]: https://github.com/NanoForge-dev/
|
|
49
|
-
[source]: https://github.com/NanoForge-dev/
|
|
49
|
+
[documentation]: https://github.com/NanoForge-dev/actions
|
|
50
|
+
[discussions]: https://github.com/NanoForge-dev/actions/discussions
|
|
51
|
+
[source]: https://github.com/NanoForge-dev/actions/tree/main/packages/actions
|
|
50
52
|
[npm]: https://www.npmjs.com/package/@nanoforge-dev/actions
|
|
51
|
-
[contributing]: https://github.com/NanoForge-dev/
|
|
53
|
+
[contributing]: https://github.com/NanoForge-dev/actions/blob/main/.github/CONTRIBUTING.md
|
|
52
54
|
[discordjs-source]: https://github.com/discordjs/discord.js
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
name: "Create release PR"
|
|
2
|
+
description: "Create a PR for releasing a package"
|
|
3
|
+
inputs:
|
|
4
|
+
dry:
|
|
5
|
+
description: "Perform a dry run that skips pr creation and outputs logs indicating what would have happened"
|
|
6
|
+
default: "false"
|
|
7
|
+
package:
|
|
8
|
+
description: "The published name of the package to release"
|
|
9
|
+
version:
|
|
10
|
+
description: "New version of the package"
|
|
11
|
+
runs:
|
|
12
|
+
using: composite
|
|
13
|
+
steps:
|
|
14
|
+
- uses: oven-sh/setup-bun@v2
|
|
15
|
+
- run: bun $GITHUB_ACTION_PATH/index.js
|
|
16
|
+
shell: bash
|
|
17
|
+
env:
|
|
18
|
+
INPUT_DRY: ${{ inputs.dry }}
|
|
19
|
+
INPUT_PACKAGE: ${{ inputs.package }}
|
|
20
|
+
INPUT_VERSION: ${{ inputs.version }}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var octokit,__defProp=Object.defineProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0});import{getBooleanInput,getInput,summary}from"@actions/core";import{program}from"commander";import{context,getOctokit}from"@actions/github";import{$,file,write}from"bun";import process from"process";import{join}from"path";process.env.GITHUB_TOKEN&&(octokit=getOctokit(process.env.GITHUB_TOKEN));var resolvePackage=__name(async name=>{const pkgs=await $`pnpm list --filter ${name} --recursive --only-projects --prod --json`.json();if(pkgs.length<=0)throw new Error("Package not found");return pkgs[0]},"resolvePackage"),resolveChangelog=__name(async(path,name,version)=>{const changelogFile=await file(join(path,"CHANGELOG.md")).text(),changelogLines=[];let foundChangelog=!1;for(const line of changelogFile.split("\n")){if(line.startsWith("# [")){if(foundChangelog)break;if(!line.startsWith(`# [${name}@${version}]`))break;foundChangelog=!0}foundChangelog&&changelogLines.push(line)}return`${changelogLines.join("\n").replace(/^\s+|\s+$/g,"")}\n`},"resolveChangelog"),resolveVersion=__name(async name=>{const regex=new RegExp(`^📦 Bumped ${name}@(\\d+\\.\\d+\\.\\d+)$`),res=await $`pnpm --filter=${name} run release --dry-run`.text();for(const line of res.split("\n")){const match=regex.exec(line);if(match)return match[1]}throw new Error("Could not find the version")},"resolveVersion"),checkoutToReleaseBranch=__name(async(name,version)=>{const branchName=`releases/${name.replace("@nanoforge-dev/","")}@${version}`;return await($`git checkout -b ${branchName}`),branchName},"checkoutToReleaseBranch"),updateVersion=__name(async(path,version)=>{const fullPath=join(path,"package.json"),pkg=await file(fullPath).json();pkg.version=version,await write(fullPath,`${JSON.stringify(pkg,null,2)}\n`)},"updateVersion"),runRelease=__name(async name=>{await($`pnpm --filter=${name} run release --skip-automatic-bump --skip-tag`)},"runRelease"),pushRelease=__name(async(name,version,branch)=>{await($`git add --all`),await($`git -c user.name='github-actions[bot]' -c user.email='username@users.noreply.github.com' commit -m "chore(${name.replace("@nanoforge-dev/","")}): release ${name}@${version}"`),await($`git push origin refs/heads/${branch}:${branch}`)},"pushRelease"),createPR=__name(async branchName=>{await(octokit?.rest.pulls.create({...context.repo,base:"main",head:branchName,title:await $`git show -s --format=%s`.text()}))},"createPR"),createSummary=__name(async(name,dry)=>{const pkg=await resolvePackage(name),changelog=await resolveChangelog(pkg.path,pkg.name,pkg.version),result=summary.addHeading("Pre-Release summary");dry&&result.addRaw("\n\n> [!NOTE]\n> This is a dry run.\n\n"),result.addHeading(`${pkg.name} pre-released`,2),result.addRaw(`Version : ${pkg.version}\n`),result.addSeparator(),result.addRaw("Changelog :\n"),result.addBreak(),result.addCodeBlock(changelog,"markdown"),await result.write()},"createSummary");__name(async()=>{program.name("create release pr").description("pre-releases monorepo packages with proper sequencing").argument("[package]","release a specific package (and it's dependencies)",getInput("package")).option("--dry","skips actual publishing and outputs logs instead",getBooleanInput("dry")).option("--version <version>","new version of the package",getInput("version")).parse();const{dry:dry,version:baseVersion}=program.opts(),[packageName]=program.processedArgs,pkg=await resolvePackage(packageName),version=baseVersion||await resolveVersion(packageName),branchName=await checkoutToReleaseBranch(pkg.name,version);await updateVersion(pkg.path,version),await runRelease(pkg.name),dry||(await pushRelease(pkg.name,version,branchName),await createPR(branchName)),await createSummary(packageName,dry)},"bootstrap")().then();//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/create-release-pr/index.ts","../../src/create-release-pr/functions.ts"],"sourcesContent":["import { getBooleanInput, getInput, summary } from \"@actions/core\";\nimport { program } from \"commander\";\n\nimport {\n checkoutToReleaseBranch,\n createPR,\n pushRelease,\n resolveChangelog,\n resolvePackage,\n resolveVersion,\n runRelease,\n updateVersion,\n} from \"./functions\";\n\nconst createSummary = async (name: string, dry: boolean) => {\n const pkg = await resolvePackage(name);\n const changelog = await resolveChangelog(pkg.path, pkg.name, pkg.version);\n\n const result = summary.addHeading(\"Pre-Release summary\");\n\n if (dry) {\n result.addRaw(\"\\n\\n> [!NOTE]\\n> This is a dry run.\\n\\n\");\n }\n\n result.addHeading(`${pkg.name} pre-released`, 2);\n\n result.addRaw(`Version : ${pkg.version}\\n`);\n result.addSeparator();\n result.addRaw(\"Changelog :\\n\");\n result.addBreak();\n result.addCodeBlock(changelog, \"markdown\");\n\n await result.write();\n};\n\nconst bootstrap = async () => {\n program\n .name(\"create release pr\")\n .description(\"pre-releases monorepo packages with proper sequencing\")\n .argument(\n \"[package]\",\n \"release a specific package (and it's dependencies)\",\n getInput(\"package\"),\n )\n .option(\"--dry\", \"skips actual publishing and outputs logs instead\", getBooleanInput(\"dry\"))\n .option(\"--version <version>\", \"new version of the package\", getInput(\"version\"))\n .parse();\n\n const { dry, version: baseVersion } = program.opts<{ dry: boolean; version: string }>();\n const [packageName] = program.processedArgs as [string];\n\n const pkg = await resolvePackage(packageName);\n const version = baseVersion || (await resolveVersion(packageName));\n\n const branchName = await checkoutToReleaseBranch(pkg.name, version);\n await updateVersion(pkg.path, version);\n await runRelease(pkg.name);\n if (!dry) {\n await pushRelease(pkg.name, version, branchName);\n await createPR(branchName);\n }\n\n await createSummary(packageName, dry);\n};\n\nbootstrap().then();\n","import { context, getOctokit } from \"@actions/github\";\nimport { $, file, write } from \"bun\";\nimport process from \"node:process\";\nimport { join } from \"path\";\n\nimport { type IPkg } from \"./types\";\n\nlet octokit: ReturnType<typeof getOctokit> | undefined;\n\nif (process.env.GITHUB_TOKEN) {\n octokit = getOctokit(process.env.GITHUB_TOKEN);\n}\n\nexport const resolvePackage = async (name: string): Promise<IPkg> => {\n const pkgs: IPkg[] =\n await $`pnpm list --filter ${name} --recursive --only-projects --prod --json`.json();\n if (pkgs.length <= 0) throw new Error(\"Package not found\");\n return pkgs[0] as IPkg;\n};\n\nexport const resolveChangelog = async (\n path: string,\n name: string,\n version: string,\n): Promise<string> => {\n const changelogFile = await file(join(path, \"CHANGELOG.md\")).text();\n const changelogLines: string[] = [];\n let foundChangelog = false;\n\n for (const line of changelogFile.split(\"\\n\")) {\n if (line.startsWith(\"# [\")) {\n if (foundChangelog) {\n break;\n }\n if (!line.startsWith(`# [${name}@${version}]`)) break;\n foundChangelog = true;\n }\n if (foundChangelog) changelogLines.push(line);\n }\n\n return `${changelogLines.join(\"\\n\").replace(/^\\s+|\\s+$/g, \"\")}\\n`;\n};\n\nexport const resolveVersion = async (name: string): Promise<string> => {\n const regex = new RegExp(`^📦 Bumped ${name}@(\\\\d+\\\\.\\\\d+\\\\.\\\\d+)$`);\n const res = await $`pnpm --filter=${name} run release --dry-run`.text();\n for (const line of res.split(\"\\n\")) {\n const match = regex.exec(line);\n if (match) return match[1] as string;\n }\n throw new Error(\"Could not find the version\");\n};\n\nexport const checkoutToReleaseBranch = async (name: string, version: string): Promise<string> => {\n const branchName = `releases/${name.replace(\"@nanoforge-dev/\", \"\")}@${version}`;\n await $`git checkout -b ${branchName}`;\n return branchName;\n};\n\nexport const updateVersion = async (path: string, version: string): Promise<void> => {\n const fullPath = join(path, \"package.json\");\n const pkg = await file(fullPath).json();\n pkg.version = version;\n await write(fullPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n};\n\nexport const runRelease = async (name: string): Promise<void> => {\n await $`pnpm --filter=${name} run release --skip-automatic-bump --skip-tag`;\n};\n\nexport const pushRelease = async (name: string, version: string, branch: string): Promise<void> => {\n await $`git add --all`;\n await $`git -c user.name='github-actions[bot]' -c user.email='username@users.noreply.github.com' commit -m \"chore(${name.replace(\"@nanoforge-dev/\", \"\")}): release ${name}@${version}\"`;\n await $`git push origin refs/heads/${branch}:${branch}`;\n};\n\nexport const createPR = async (branchName: string): Promise<void> => {\n await octokit?.rest.pulls.create({\n ...context.repo,\n base: \"main\",\n head: branchName,\n title: await $`git show -s --format=%s`.text(),\n });\n};\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
name: "Create release tag"
|
|
2
|
+
description: "Create a tag the package release"
|
|
3
|
+
inputs:
|
|
4
|
+
commit:
|
|
5
|
+
description: "Commit sha to put the tag on"
|
|
6
|
+
branch:
|
|
7
|
+
description: "Head branch name"
|
|
8
|
+
runs:
|
|
9
|
+
using: composite
|
|
10
|
+
steps:
|
|
11
|
+
- uses: oven-sh/setup-bun@v2
|
|
12
|
+
- run: bun $GITHUB_ACTION_PATH/index.js
|
|
13
|
+
shell: bash
|
|
14
|
+
env:
|
|
15
|
+
INPUT_COMMIT: ${{ inputs.commit }}
|
|
16
|
+
INPUT_BRANCH: ${{ inputs.branch }}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var octokit,__defProp=Object.defineProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0});import{getInput}from"@actions/core";import{context,getOctokit}from"@actions/github";import{program}from"commander";import process from"process";process.env.GITHUB_TOKEN&&(octokit=getOctokit(process.env.GITHUB_TOKEN)),__name(async()=>{program.name("create release tag").description("create release tag for monorepo packages with proper sequencing").option("--commit <commit>","commit sha of ythe last commit",getInput("commit")).option("--branch <branch>","head branch of the merged pr",getInput("branch")).parse();const{commit:commit,branch:branch}=program.opts(),pkg=branch.replace("releases/","@nanoforge-dev/");await(octokit?.rest.git.createRef({...context.repo,ref:`refs/tags/${pkg}`,sha:commit}))},"bootstrap")().then();//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/create-release-tag/index.ts"],"sourcesContent":["import { getInput } from \"@actions/core\";\nimport { context, getOctokit } from \"@actions/github\";\nimport { program } from \"commander\";\nimport process from \"node:process\";\n\nlet octokit: ReturnType<typeof getOctokit> | undefined;\n\nif (process.env.GITHUB_TOKEN) {\n octokit = getOctokit(process.env.GITHUB_TOKEN);\n}\n\nconst bootstrap = async () => {\n program\n .name(\"create release tag\")\n .description(\"create release tag for monorepo packages with proper sequencing\")\n .option(\"--commit <commit>\", \"commit sha of ythe last commit\", getInput(\"commit\"))\n .option(\"--branch <branch>\", \"head branch of the merged pr\", getInput(\"branch\"))\n .parse();\n\n const { commit, branch } = program.opts<{ commit: string; branch: string }>();\n\n const pkg = branch.replace(\"releases/\", \"@nanoforge-dev/\");\n\n await octokit?.rest.git.createRef({\n ...context.repo,\n ref: `refs/tags/${pkg}`,\n sha: commit,\n });\n};\n\nbootstrap().then();\n"],"mappings":";;;;AAAA,SAAS,gBAAgB;AACzB,SAAS,SAAS,kBAAkB;AACpC,SAAS,eAAe;AACxB,OAAO,aAAa;AAEpB,IAAI;AAEJ,IAAI,QAAQ,IAAI,cAAc;AAC5B,YAAU,WAAW,QAAQ,IAAI,YAAY;AAC/C;AAEA,IAAM,YAAY,mCAAY;AAC5B,UACG,KAAK,oBAAoB,EACzB,YAAY,iEAAiE,EAC7E,OAAO,qBAAqB,kCAAkC,SAAS,QAAQ,CAAC,EAChF,OAAO,qBAAqB,gCAAgC,SAAS,QAAQ,CAAC,EAC9E,MAAM;AAET,QAAM,EAAE,QAAQ,OAAO,IAAI,QAAQ,KAAyC;AAE5E,QAAM,MAAM,OAAO,QAAQ,aAAa,iBAAiB;AAEzD,QAAM,SAAS,KAAK,IAAI,UAAU;AAAA,IAChC,GAAG,QAAQ;AAAA,IACX,KAAK,aAAa,GAAG;AAAA,IACrB,KAAK;AAAA,EACP,CAAC;AACH,GAjBkB;AAmBlB,UAAU,EAAE,KAAK;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var octokit,__defProp=Object.defineProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0});import{endGroup,getBooleanInput,getInput,startGroup,summary}from"@actions/core";import{program}from"commander";import{info,warning}from"@actions/core";import{$,file,write}from"bun";async function fetchDevVersion(pkg,tag2){try{const res=await fetch(`https://registry.npmjs.org/${pkg}/${tag2}`);if(!res.ok)return null;return(await res.json()).version}catch{return null}}async function getReleaseEntries(dry2,devTag){const releaseEntries=[],packageList=await $`pnpm list --recursive --only-projects --prod --json`.json(),commitHash=(await $`git rev-parse --short HEAD`.text()).trim(),timestamp=Math.round(Date.now()/1e3);for(const pkg of packageList){if(pkg.private)continue;if(!pkg.version||!pkg.name)continue;const release={name:pkg.name,version:pkg.version};if(devTag){if(!dry2){const pkgJsonString=await file(`${pkg.path}/package.json`).text();await write(`${pkg.path}/package.json`,pkgJsonString.replaceAll(/workspace:[\^~]/g,"workspace:*"))}const devVersion=await fetchDevVersion(pkg.name,devTag);if(devVersion?.endsWith(commitHash)){if(dry2)info(`[DRY] ${pkg.name}@${devVersion} already released. Editing package.json version.`);else{const pkgJson=await file(`${pkg.path}/package.json`).json();pkgJson.version=devVersion,await write(`${pkg.path}/package.json`,JSON.stringify(pkgJson,null,"\t"))}release.version=devVersion}else if(dry2)info(`[DRY] Bumping ${pkg.name} via git-cliff.`),release.version=`${pkg.version}.DRY-${devTag}.${timestamp}-${commitHash}`;else{await($`pnpm --filter=${pkg.name} run release --preid "${devTag}.${timestamp}-${commitHash}" --skip-changelog`);const pkgJson=await file(`${pkg.path}/package.json`).json();release.version=pkgJson.version}}else try{const changelogFile=await file(`${pkg.path}/CHANGELOG.md`).text();let changelogLines=[],foundChangelog=!1;for(const line of changelogFile.split("\n"))if(line.startsWith("# [")){if(foundChangelog){""===changelogLines.at(-1)&&(changelogLines=changelogLines.slice(2,-1));break}if(!line.startsWith(`# [${release.name}@${release.version}]`))break;foundChangelog=!0}else foundChangelog&&changelogLines.push(line);release.changelog=`${changelogLines.join("\n").replace(/^\s+|\s+$/g,"")}\n`}catch(error){warning(`Error parsing changelog for ${pkg.name}, will use auto generated: ${error}`)}pkg.dependencies&&(release.dependsOn=Object.keys(pkg.dependencies)),releaseEntries.push(release)}return releaseEntries}async function generateReleaseTree(dry2,devTag,packageName2,exclude2){let releaseEntries=await getReleaseEntries(dry2,devTag);if(packageName2&&"all"!==packageName2){const releaseEntry=releaseEntries.find(entry=>entry.name===packageName2);if(!releaseEntry)throw new Error(`Package ${packageName2} not releaseable`);if(!releaseEntry.dependsOn)return[[releaseEntry]]}const releaseTree=[],didRelease=new Set;for(;releaseEntries.length;){const nextBranch=[],unreleased=[];for(const entry of releaseEntries){if(!entry.dependsOn){nextBranch.push(entry);continue}entry.dependsOn.every(dep=>didRelease.has(dep))?nextBranch.push(entry):unreleased.push(entry)}for(const release of nextBranch)didRelease.add(release.name);if(releaseEntries.length===unreleased.length)throw new Error(`One or more packages have dependents that can't be released: ${unreleased.map(entry=>entry.name).join(",")}`);releaseTree.push(nextBranch),releaseEntries=unreleased}if((!packageName2||"all"===packageName2)&&Array.isArray(exclude2)&&exclude2.length){const neededPackages2=new Set,excludedReleaseTree=[];for(const releaseBranch of releaseTree.reverse()){const newThisBranch=[];for(const entry of releaseBranch)if(!exclude2.includes(entry.name)||neededPackages2.has(entry.name)){newThisBranch.push(entry);for(const dep of entry.dependsOn??[])neededPackages2.add(dep)}newThisBranch.length&&excludedReleaseTree.unshift(newThisBranch)}return excludedReleaseTree}if(!packageName2||"all"===packageName2)return releaseTree;const neededPackages=new Set([packageName2]),packageReleaseTree=[];for(const releaseBranch of releaseTree.reverse()){const newThisBranch=[];for(const entry of releaseBranch)if(neededPackages.has(entry.name)){newThisBranch.push(entry);for(const dep of entry.dependsOn??[])neededPackages.add(dep)}newThisBranch.length&&packageReleaseTree.unshift(newThisBranch)}return packageReleaseTree}__name(fetchDevVersion,"fetchDevVersion"),__name(getReleaseEntries,"getReleaseEntries"),__name(generateReleaseTree,"generateReleaseTree");import{info as info2,warning as warning2}from"@actions/core";import{context,getOctokit}from"@actions/github";import{$ as $2}from"bun";import process from"process";async function checkRegistry(release){return(await fetch(`https://registry.npmjs.org/${release.name}/${release.version}`)).ok}async function gitTagAndRelease(release,dry2){const tagName=`${release.name}@${release.version}`;if(dry2)
|
|
1
|
+
var octokit,__defProp=Object.defineProperty,__name=(target,value)=>__defProp(target,"name",{value:value,configurable:!0});import{endGroup,getBooleanInput,getInput,startGroup,summary}from"@actions/core";import{program}from"commander";import{info,warning}from"@actions/core";import{$,file,write}from"bun";async function fetchDevVersion(pkg,tag2){try{const res=await fetch(`https://registry.npmjs.org/${pkg}/${tag2}`);if(!res.ok)return null;return(await res.json()).version}catch{return null}}async function getReleaseEntries(dry2,devTag){const releaseEntries=[],packageList=await $`pnpm list --recursive --only-projects --prod --json`.json(),commitHash=(await $`git rev-parse --short HEAD`.text()).trim(),timestamp=Math.round(Date.now()/1e3);for(const pkg of packageList){if(pkg.private)continue;if(!pkg.version||!pkg.name)continue;const release={name:pkg.name,version:pkg.version};if(devTag){if(!dry2){const pkgJsonString=await file(`${pkg.path}/package.json`).text();await write(`${pkg.path}/package.json`,pkgJsonString.replaceAll(/workspace:[\^~]/g,"workspace:*"))}const devVersion=await fetchDevVersion(pkg.name,devTag);if(devVersion?.endsWith(commitHash)){if(dry2)info(`[DRY] ${pkg.name}@${devVersion} already released. Editing package.json version.`);else{const pkgJson=await file(`${pkg.path}/package.json`).json();pkgJson.version=devVersion,await write(`${pkg.path}/package.json`,JSON.stringify(pkgJson,null,"\t"))}release.version=devVersion}else if(dry2)info(`[DRY] Bumping ${pkg.name} via git-cliff.`),release.version=`${pkg.version}.DRY-${devTag}.${timestamp}-${commitHash}`;else{await($`pnpm --filter=${pkg.name} run release --preid "${devTag}.${timestamp}-${commitHash}" --skip-changelog`);const pkgJson=await file(`${pkg.path}/package.json`).json();release.version=pkgJson.version}}else try{const changelogFile=await file(`${pkg.path}/CHANGELOG.md`).text();let changelogLines=[],foundChangelog=!1;for(const line of changelogFile.split("\n"))if(line.startsWith("# [")){if(foundChangelog){""===changelogLines.at(-1)&&(changelogLines=changelogLines.slice(2,-1));break}if(!line.startsWith(`# [${release.name}@${release.version}]`))break;foundChangelog=!0}else foundChangelog&&changelogLines.push(line);release.changelog=`${changelogLines.join("\n").replace(/^\s+|\s+$/g,"")}\n`}catch(error){warning(`Error parsing changelog for ${pkg.name}, will use auto generated: ${error}`)}pkg.dependencies&&(release.dependsOn=Object.keys(pkg.dependencies)),releaseEntries.push(release)}return releaseEntries}async function generateReleaseTree(dry2,devTag,packageName2,exclude2){let releaseEntries=await getReleaseEntries(dry2,devTag);if(packageName2&&"all"!==packageName2){const releaseEntry=releaseEntries.find(entry=>entry.name===packageName2);if(!releaseEntry)throw new Error(`Package ${packageName2} not releaseable`);if(!releaseEntry.dependsOn)return[[releaseEntry]]}const releaseTree=[],didRelease=new Set;for(;releaseEntries.length;){const nextBranch=[],unreleased=[];for(const entry of releaseEntries){if(!entry.dependsOn){nextBranch.push(entry);continue}entry.dependsOn.every(dep=>didRelease.has(dep))?nextBranch.push(entry):unreleased.push(entry)}for(const release of nextBranch)didRelease.add(release.name);if(releaseEntries.length===unreleased.length)throw new Error(`One or more packages have dependents that can't be released: ${unreleased.map(entry=>entry.name).join(",")}`);releaseTree.push(nextBranch),releaseEntries=unreleased}if((!packageName2||"all"===packageName2)&&Array.isArray(exclude2)&&exclude2.length){const neededPackages2=new Set,excludedReleaseTree=[];for(const releaseBranch of releaseTree.reverse()){const newThisBranch=[];for(const entry of releaseBranch)if(!exclude2.includes(entry.name)||neededPackages2.has(entry.name)){newThisBranch.push(entry);for(const dep of entry.dependsOn??[])neededPackages2.add(dep)}newThisBranch.length&&excludedReleaseTree.unshift(newThisBranch)}return excludedReleaseTree}if(!packageName2||"all"===packageName2)return releaseTree;const neededPackages=new Set([packageName2]),packageReleaseTree=[];for(const releaseBranch of releaseTree.reverse()){const newThisBranch=[];for(const entry of releaseBranch)if(neededPackages.has(entry.name)){newThisBranch.push(entry);for(const dep of entry.dependsOn??[])neededPackages.add(dep)}newThisBranch.length&&packageReleaseTree.unshift(newThisBranch)}return packageReleaseTree}__name(fetchDevVersion,"fetchDevVersion"),__name(getReleaseEntries,"getReleaseEntries"),__name(generateReleaseTree,"generateReleaseTree");import{info as info2,warning as warning2}from"@actions/core";import{context,getOctokit}from"@actions/github";import{$ as $2}from"bun";import process from"process";async function checkRegistry(release){return(await fetch(`https://registry.npmjs.org/${release.name}/${release.version}`)).ok}async function gitTagAndRelease(release,dry2){const tagName=`${release.name}@${release.version}`;if(dry2)info2(`[DRY] Release would be "${tagName}", skipping release creation.`);else try{await(octokit?.rest.repos.createRelease({...context.repo,tag_name:tagName,name:tagName,body:release.changelog??"",generate_release_notes:void 0===release.changelog,make_latest:"true"}))}catch(error){warning2(`Failed to create github release: ${error}`)}}async function releasePackage(release,dry2,devTag,doGitRelease=!devTag){if(await checkRegistry(release))return info2(`${release.name}@${release.version} already published, skipping.`),!1;if(dry2?info2(`[DRY] Releasing ${release.name}@${release.version}`):await($2`pnpm --filter=${release.name} publish --provenance --no-git-checks ${devTag?`--tag=${devTag}`:""}`),doGitRelease&&!devTag&&await gitTagAndRelease(release,dry2),dry2)return!0;const before=performance.now();return await new Promise((resolve,reject)=>{const interval=setInterval(async()=>{if(await checkRegistry(release))return clearInterval(interval),void resolve();performance.now()>before+3e5&&(clearInterval(interval),reject(new Error(`Release for ${release.name} failed.`)))},15e3)}),!0}function npmPackageLink(packageName2){return`https://npmjs.com/package/${packageName2}`}process.env.GITHUB_TOKEN&&(octokit=getOctokit(process.env.GITHUB_TOKEN)),__name(checkRegistry,"checkRegistry"),__name(gitTagAndRelease,"gitTagAndRelease"),__name(releasePackage,"releasePackage"),__name(npmPackageLink,"npmPackageLink");var excludeInput=getInput("exclude"),dryInput=!1,devInput=!1;try{devInput=getBooleanInput("dev")}catch{}try{dryInput=getBooleanInput("dry")}catch{}program.name("release packages").description("releases monorepo packages with proper sequencing").argument("[package]","release a specific package (and it's dependencies)",getInput("package")).option("-e, --exclude <packages...>","exclude specific packages from releasing (will still release if necessary for another package)",excludeInput?excludeInput.split(","):[]).option("--dry","skips actual publishing and outputs logs instead",dryInput).option("--dev","publishes development versions and skips tagging / github releases",devInput).option("--tag <tag>",'tag to use for dev releases (defaults to "dev")',getInput("tag")).parse();var{exclude:exclude,dry:dry,dev:dev,tag:inputTag}=program.opts();if(!dev&&inputTag.length)throw new Error("The --tag option can only be used with --dev");var tag=inputTag.length?inputTag:dev?"dev":void 0,[packageName]=program.processedArgs,tree=await generateReleaseTree(dry,tag,packageName,exclude),publishedPackages=[],skippedPackages=[];for(const branch of tree)startGroup(`Releasing ${branch.map(entry=>`${entry.name}@${entry.version}`).join(", ")}`),await Promise.all(branch.map(async release=>{const published=await releasePackage(release,dry,tag),identifier=`${release.name}@${release.version}`;published?publishedPackages.push({identifier:identifier,url:npmPackageLink(release.name)}):skippedPackages.push({identifier:identifier,url:npmPackageLink(release.name)})})),endGroup();var result=summary.addHeading("Release summary");if(dry&&result.addRaw("\n\n> [!NOTE]\n> This is a dry run.\n\n"),result.addHeading("Released",2),0===publishedPackages.length)result.addRaw("\n_None_\n\n");else{result.addRaw("\n");for(const{identifier:identifier,url:url}of publishedPackages)result.addRaw(`- [${identifier}](${url})\n`);result.addRaw("\n")}if(result.addHeading("Skipped",2),0===skippedPackages.length)result.addRaw("\n_None_\n\n");else{result.addRaw("\n");for(const{identifier:identifier,url:url}of skippedPackages)result.addRaw(`- [${identifier}](${url})\n`);result.addRaw("\n")}await result.write();//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/release-packages/index.ts","../../src/release-packages/generate-release-tree.ts","../../src/release-packages/release-package.ts"],"sourcesContent":["import { endGroup, getBooleanInput, getInput, startGroup, summary } from \"@actions/core\";\nimport { program } from \"commander\";\n\nimport { generateReleaseTree } from \"./generate-release-tree\";\nimport { releasePackage } from \"./release-package\";\n\nfunction npmPackageLink(packageName: string) {\n return `https://npmjs.com/package/${packageName}` as const;\n}\n\nconst excludeInput = getInput(\"exclude\");\nlet dryInput = false;\nlet devInput = false;\n\ntry {\n devInput = getBooleanInput(\"dev\");\n} catch {\n // We're not running in actions\n}\n\ntry {\n dryInput = getBooleanInput(\"dry\");\n} catch {\n // We're not running in actions or the input isn't set (cron)\n}\n\nprogram\n .name(\"release packages\")\n .description(\"releases monorepo packages with proper sequencing\")\n .argument(\"[package]\", \"release a specific package (and it's dependencies)\", getInput(\"package\"))\n .option(\n \"-e, --exclude <packages...>\",\n \"exclude specific packages from releasing (will still release if necessary for another package)\",\n excludeInput ? excludeInput.split(\",\") : [],\n )\n .option(\"--dry\", \"skips actual publishing and outputs logs instead\", dryInput)\n .option(\"--dev\", \"publishes development versions and skips tagging / github releases\", devInput)\n .option(\"--tag <tag>\", 'tag to use for dev releases (defaults to \"dev\")', getInput(\"tag\"))\n .parse();\n\nconst {\n exclude,\n dry,\n dev,\n tag: inputTag,\n} = program.opts<{ dev: boolean; dry: boolean; exclude: string[]; tag: string }>();\n\n// All this because getInput('tag') will return empty string when not set :P\nif (!dev && inputTag.length) {\n throw new Error(\"The --tag option can only be used with --dev\");\n}\n\nconst tag = inputTag.length ? inputTag : dev ? \"dev\" : undefined;\nconst [packageName] = program.processedArgs as [string];\nconst tree = await generateReleaseTree(dry, tag, packageName, exclude);\n\ninterface ReleaseResult {\n identifier: string;\n url: string;\n}\n\nconst publishedPackages: ReleaseResult[] = [];\nconst skippedPackages: ReleaseResult[] = [];\n\nfor (const branch of tree) {\n startGroup(`Releasing ${branch.map((entry) => `${entry.name}@${entry.version}`).join(\", \")}`);\n\n await Promise.all(\n branch.map(async (release) => {\n const published = await releasePackage(release, dry, tag);\n const identifier = `${release.name}@${release.version}`;\n\n if (published) {\n publishedPackages.push({ identifier, url: npmPackageLink(release.name) });\n } else {\n skippedPackages.push({ identifier, url: npmPackageLink(release.name) });\n }\n }),\n );\n\n endGroup();\n}\n\nconst result = summary.addHeading(\"Release summary\");\n\nif (dry) {\n result.addRaw(\"\\n\\n> [!NOTE]\\n> This is a dry run.\\n\\n\");\n}\n\nresult.addHeading(\"Released\", 2);\n\nif (publishedPackages.length === 0) {\n result.addRaw(\"\\n_None_\\n\\n\");\n} else {\n result.addRaw(\"\\n\");\n\n for (const { identifier, url } of publishedPackages) {\n result.addRaw(`- [${identifier}](${url})\\n`);\n }\n\n result.addRaw(`\\n`);\n}\n\nresult.addHeading(\"Skipped\", 2);\n\nif (skippedPackages.length === 0) {\n result.addRaw(\"\\n_None_\\n\\n\");\n} else {\n result.addRaw(\"\\n\");\n\n for (const { identifier, url } of skippedPackages) {\n result.addRaw(`- [${identifier}](${url})\\n`);\n }\n\n result.addRaw(`\\n`);\n}\n\nawait result.write();\n","import { info, warning } from \"@actions/core\";\nimport type { PackageJSON, PackumentVersion } from \"@npm/types\";\nimport { $, file, write } from \"bun\";\n\ninterface pnpmTreeDependency {\n from: string;\n path: string;\n version: string;\n}\n\ninterface pnpmTree {\n dependencies?: Record<string, pnpmTreeDependency>;\n name?: string;\n path: string;\n private?: boolean;\n unsavedDependencies?: Record<string, pnpmTreeDependency>;\n version?: string;\n}\n\nexport interface ReleaseEntry {\n changelog?: string;\n dependsOn?: string[];\n name: string;\n version: string;\n}\n\nasync function fetchDevVersion(pkg: string, tag: string) {\n try {\n const res = await fetch(`https://registry.npmjs.org/${pkg}/${tag}`);\n if (!res.ok) return null;\n const packument = (await res.json()) as PackumentVersion;\n return packument.version;\n } catch {\n return null;\n }\n}\n\nasync function getReleaseEntries(dry: boolean, devTag?: string) {\n const releaseEntries: ReleaseEntry[] = [];\n const packageList: pnpmTree[] =\n await $`pnpm list --recursive --only-projects --prod --json`.json();\n\n const commitHash = (await $`git rev-parse --short HEAD`.text()).trim();\n const timestamp = Math.round(Date.now() / 1_000);\n\n for (const pkg of packageList) {\n // Don't release private packages ever (npm will error anyways)\n if (pkg.private) continue;\n // Just in case\n if (!pkg.version || !pkg.name) continue;\n\n const release: ReleaseEntry = {\n name: pkg.name,\n version: pkg.version,\n };\n\n if (devTag) {\n // Replace workspace dependencies with * to pin to associated dev versions\n if (!dry) {\n const pkgJsonString = await file(`${pkg.path}/package.json`).text();\n await write(\n `${pkg.path}/package.json`,\n pkgJsonString.replaceAll(/workspace:[\\^~]/g, \"workspace:*\"),\n );\n }\n\n const devVersion = await fetchDevVersion(pkg.name, devTag);\n if (devVersion?.endsWith(commitHash)) {\n // Write the currently released dev version so when pnpm publish runs on dependents they depend on the dev versions\n if (dry) {\n info(`[DRY] ${pkg.name}@${devVersion} already released. Editing package.json version.`);\n } else {\n const pkgJson = (await file(`${pkg.path}/package.json`).json()) as PackageJSON;\n pkgJson.version = devVersion;\n await write(`${pkg.path}/package.json`, JSON.stringify(pkgJson, null, \"\\t\"));\n }\n\n release.version = devVersion;\n } else if (dry) {\n info(`[DRY] Bumping ${pkg.name} via git-cliff.`);\n release.version = `${pkg.version}.DRY-${devTag}.${timestamp}-${commitHash}`;\n } else {\n await $`pnpm --filter=${pkg.name} run release --preid \"${devTag}.${timestamp}-${commitHash}\" --skip-changelog`;\n // Read again instead of parsing the output to be sure we're matching when checking against npm\n const pkgJson = (await file(`${pkg.path}/package.json`).json()) as PackageJSON;\n release.version = pkgJson.version;\n }\n }\n // Only need changelog for releases published to github\n else {\n try {\n // Find and parse changelog to post in github release\n const changelogFile = await file(`${pkg.path}/CHANGELOG.md`).text();\n\n let changelogLines: string[] = [];\n let foundChangelog = false;\n\n for (const line of changelogFile.split(\"\\n\")) {\n if (line.startsWith(\"# [\")) {\n if (foundChangelog) {\n if (changelogLines.at(-1) === \"\") {\n changelogLines = changelogLines.slice(2, -1);\n }\n\n break;\n }\n\n // Check changelog release version and assume no changelog if version does not match\n if (!line.startsWith(`# [${release.name}@${release.version}]`)) {\n break;\n }\n\n foundChangelog = true;\n continue;\n }\n\n if (foundChangelog) {\n changelogLines.push(line);\n }\n }\n\n release.changelog = `${changelogLines.join(\"\\n\").replace(/^\\s+|\\s+$/g, \"\")}\\n`;\n } catch (error) {\n // Probably just no changelog file but log just in case\n warning(`Error parsing changelog for ${pkg.name}, will use auto generated: ${error}`);\n }\n }\n\n if (pkg.dependencies) {\n release.dependsOn = Object.keys(pkg.dependencies);\n }\n\n releaseEntries.push(release);\n }\n\n return releaseEntries;\n}\n\nexport async function generateReleaseTree(\n dry: boolean,\n devTag?: string,\n packageName?: string,\n exclude?: string[],\n) {\n let releaseEntries = await getReleaseEntries(dry, devTag);\n // Try to early return if the package doesn't have deps\n if (packageName && packageName !== \"all\") {\n const releaseEntry = releaseEntries.find((entry) => entry.name === packageName);\n if (!releaseEntry) {\n throw new Error(`Package ${packageName} not releaseable`);\n }\n\n if (!releaseEntry.dependsOn) {\n return [[releaseEntry]];\n }\n }\n\n // Generate the whole tree first, then prune if specified\n const releaseTree: ReleaseEntry[][] = [];\n const didRelease = new Set<string>();\n\n while (releaseEntries.length) {\n const nextBranch: ReleaseEntry[] = [];\n const unreleased: ReleaseEntry[] = [];\n for (const entry of releaseEntries) {\n if (!entry.dependsOn) {\n nextBranch.push(entry);\n continue;\n }\n\n const allDepsReleased = entry.dependsOn.every((dep) => didRelease.has(dep));\n if (allDepsReleased) {\n nextBranch.push(entry);\n } else {\n unreleased.push(entry);\n }\n }\n\n // Update didRelease in a second loop to avoid loop order issues\n for (const release of nextBranch) {\n didRelease.add(release.name);\n }\n\n if (releaseEntries.length === unreleased.length) {\n throw new Error(\n `One or more packages have dependents that can't be released: ${unreleased.map((entry) => entry.name).join(\",\")}`,\n );\n }\n\n releaseTree.push(nextBranch);\n releaseEntries = unreleased;\n }\n\n // Prune exclusions\n if ((!packageName || packageName === \"all\") && Array.isArray(exclude) && exclude.length) {\n const neededPackages = new Set<string>();\n const excludedReleaseTree: ReleaseEntry[][] = [];\n\n for (const releaseBranch of releaseTree.reverse()) {\n const newThisBranch: ReleaseEntry[] = [];\n\n for (const entry of releaseBranch) {\n if (exclude.includes(entry.name) && !neededPackages.has(entry.name)) {\n continue;\n }\n\n newThisBranch.push(entry);\n for (const dep of entry.dependsOn ?? []) {\n neededPackages.add(dep);\n }\n }\n\n if (newThisBranch.length) excludedReleaseTree.unshift(newThisBranch);\n }\n\n return excludedReleaseTree;\n }\n\n if (!packageName || packageName === \"all\") {\n return releaseTree;\n }\n\n // Prune the tree for the specified package\n const neededPackages = new Set<string>([packageName]);\n const packageReleaseTree: ReleaseEntry[][] = [];\n\n for (const releaseBranch of releaseTree.reverse()) {\n const newThisBranch: ReleaseEntry[] = [];\n\n for (const entry of releaseBranch) {\n if (neededPackages.has(entry.name)) {\n newThisBranch.push(entry);\n for (const dep of entry.dependsOn ?? []) {\n neededPackages.add(dep);\n }\n }\n }\n\n if (newThisBranch.length) packageReleaseTree.unshift(newThisBranch);\n }\n\n return packageReleaseTree;\n}\n","import { info, warning } from \"@actions/core\";\nimport { context, getOctokit } from \"@actions/github\";\nimport { $ } from \"bun\";\nimport process from \"node:process\";\n\nimport type { ReleaseEntry } from \"./generate-release-tree\";\n\nlet octokit: ReturnType<typeof getOctokit> | undefined;\n\nif (process.env.GITHUB_TOKEN) {\n octokit = getOctokit(process.env.GITHUB_TOKEN);\n}\n\nasync function checkRegistry(release: ReleaseEntry) {\n const res = await fetch(`https://registry.npmjs.org/${release.name}/${release.version}`);\n return res.ok;\n}\n\nasync function gitTagAndRelease(release: ReleaseEntry, dry: boolean) {\n const tagName = `${release.name}@${release.version}`;\n\n if (dry) {\n info(`[DRY] Release would be \"${tagName}\", skipping release creation.`);\n return;\n }\n\n const commitHash = (await $`git rev-parse HEAD`.text()).trim();\n\n try {\n await octokit?.rest.repos.createRelease({\n ...context.repo,\n tag_name: tagName,\n target_commitish: commitHash,\n name: tagName,\n body: release.changelog ?? \"\",\n generate_release_notes: release.changelog === undefined,\n make_latest: \"true\",\n });\n } catch (error) {\n warning(`Failed to create github release: ${error}`);\n }\n}\n\nexport async function releasePackage(\n release: ReleaseEntry,\n dry: boolean,\n devTag?: string,\n doGitRelease = !devTag,\n) {\n // Sanity check against the registry first\n if (await checkRegistry(release)) {\n info(`${release.name}@${release.version} already published, skipping.`);\n return false;\n }\n\n if (dry) {\n info(`[DRY] Releasing ${release.name}@${release.version}`);\n } else {\n await $`pnpm --filter=${release.name} publish --provenance --no-git-checks ${devTag ? `--tag=${devTag}` : \"\"}`;\n }\n\n // && !devTag just to be sure\n if (doGitRelease && !devTag) await gitTagAndRelease(release, dry);\n\n if (dry) return true;\n\n const before = performance.now();\n\n // Poll registry to ensure next publishes won't fail\n await new Promise<void>((resolve, reject) => {\n const interval = setInterval(async () => {\n if (await checkRegistry(release)) {\n clearInterval(interval);\n resolve();\n return;\n }\n\n if (performance.now() > before + 5 * 60 * 1_000) {\n clearInterval(interval);\n reject(new Error(`Release for ${release.name} failed.`));\n }\n }, 15_000);\n });\n\n return true;\n}\n"],"mappings":"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","names":["tag","dry","packageName","exclude","neededPackages","info","warning","$","dry","info","$","warning","packageName"]}
|
|
1
|
+
{"version":3,"sources":["../../src/release-packages/index.ts","../../src/release-packages/generate-release-tree.ts","../../src/release-packages/release-package.ts"],"sourcesContent":["import { endGroup, getBooleanInput, getInput, startGroup, summary } from \"@actions/core\";\nimport { program } from \"commander\";\n\nimport { generateReleaseTree } from \"./generate-release-tree\";\nimport { releasePackage } from \"./release-package\";\n\nfunction npmPackageLink(packageName: string) {\n return `https://npmjs.com/package/${packageName}` as const;\n}\n\nconst excludeInput = getInput(\"exclude\");\nlet dryInput = false;\nlet devInput = false;\n\ntry {\n devInput = getBooleanInput(\"dev\");\n} catch {\n // We're not running in actions\n}\n\ntry {\n dryInput = getBooleanInput(\"dry\");\n} catch {\n // We're not running in actions or the input isn't set (cron)\n}\n\nprogram\n .name(\"release packages\")\n .description(\"releases monorepo packages with proper sequencing\")\n .argument(\"[package]\", \"release a specific package (and it's dependencies)\", getInput(\"package\"))\n .option(\n \"-e, --exclude <packages...>\",\n \"exclude specific packages from releasing (will still release if necessary for another package)\",\n excludeInput ? excludeInput.split(\",\") : [],\n )\n .option(\"--dry\", \"skips actual publishing and outputs logs instead\", dryInput)\n .option(\"--dev\", \"publishes development versions and skips tagging / github releases\", devInput)\n .option(\"--tag <tag>\", 'tag to use for dev releases (defaults to \"dev\")', getInput(\"tag\"))\n .parse();\n\nconst {\n exclude,\n dry,\n dev,\n tag: inputTag,\n} = program.opts<{ dev: boolean; dry: boolean; exclude: string[]; tag: string }>();\n\n// All this because getInput('tag') will return empty string when not set :P\nif (!dev && inputTag.length) {\n throw new Error(\"The --tag option can only be used with --dev\");\n}\n\nconst tag = inputTag.length ? inputTag : dev ? \"dev\" : undefined;\nconst [packageName] = program.processedArgs as [string];\nconst tree = await generateReleaseTree(dry, tag, packageName, exclude);\n\ninterface ReleaseResult {\n identifier: string;\n url: string;\n}\n\nconst publishedPackages: ReleaseResult[] = [];\nconst skippedPackages: ReleaseResult[] = [];\n\nfor (const branch of tree) {\n startGroup(`Releasing ${branch.map((entry) => `${entry.name}@${entry.version}`).join(\", \")}`);\n\n await Promise.all(\n branch.map(async (release) => {\n const published = await releasePackage(release, dry, tag);\n const identifier = `${release.name}@${release.version}`;\n\n if (published) {\n publishedPackages.push({ identifier, url: npmPackageLink(release.name) });\n } else {\n skippedPackages.push({ identifier, url: npmPackageLink(release.name) });\n }\n }),\n );\n\n endGroup();\n}\n\nconst result = summary.addHeading(\"Release summary\");\n\nif (dry) {\n result.addRaw(\"\\n\\n> [!NOTE]\\n> This is a dry run.\\n\\n\");\n}\n\nresult.addHeading(\"Released\", 2);\n\nif (publishedPackages.length === 0) {\n result.addRaw(\"\\n_None_\\n\\n\");\n} else {\n result.addRaw(\"\\n\");\n\n for (const { identifier, url } of publishedPackages) {\n result.addRaw(`- [${identifier}](${url})\\n`);\n }\n\n result.addRaw(`\\n`);\n}\n\nresult.addHeading(\"Skipped\", 2);\n\nif (skippedPackages.length === 0) {\n result.addRaw(\"\\n_None_\\n\\n\");\n} else {\n result.addRaw(\"\\n\");\n\n for (const { identifier, url } of skippedPackages) {\n result.addRaw(`- [${identifier}](${url})\\n`);\n }\n\n result.addRaw(`\\n`);\n}\n\nawait result.write();\n","import { info, warning } from \"@actions/core\";\nimport type { PackageJSON, PackumentVersion } from \"@npm/types\";\nimport { $, file, write } from \"bun\";\n\ninterface pnpmTreeDependency {\n from: string;\n path: string;\n version: string;\n}\n\ninterface pnpmTree {\n dependencies?: Record<string, pnpmTreeDependency>;\n name?: string;\n path: string;\n private?: boolean;\n unsavedDependencies?: Record<string, pnpmTreeDependency>;\n version?: string;\n}\n\nexport interface ReleaseEntry {\n changelog?: string;\n dependsOn?: string[];\n name: string;\n version: string;\n}\n\nasync function fetchDevVersion(pkg: string, tag: string) {\n try {\n const res = await fetch(`https://registry.npmjs.org/${pkg}/${tag}`);\n if (!res.ok) return null;\n const packument = (await res.json()) as PackumentVersion;\n return packument.version;\n } catch {\n return null;\n }\n}\n\nasync function getReleaseEntries(dry: boolean, devTag?: string) {\n const releaseEntries: ReleaseEntry[] = [];\n const packageList: pnpmTree[] =\n await $`pnpm list --recursive --only-projects --prod --json`.json();\n\n const commitHash = (await $`git rev-parse --short HEAD`.text()).trim();\n const timestamp = Math.round(Date.now() / 1_000);\n\n for (const pkg of packageList) {\n // Don't release private packages ever (npm will error anyways)\n if (pkg.private) continue;\n // Just in case\n if (!pkg.version || !pkg.name) continue;\n\n const release: ReleaseEntry = {\n name: pkg.name,\n version: pkg.version,\n };\n\n if (devTag) {\n // Replace workspace dependencies with * to pin to associated dev versions\n if (!dry) {\n const pkgJsonString = await file(`${pkg.path}/package.json`).text();\n await write(\n `${pkg.path}/package.json`,\n pkgJsonString.replaceAll(/workspace:[\\^~]/g, \"workspace:*\"),\n );\n }\n\n const devVersion = await fetchDevVersion(pkg.name, devTag);\n if (devVersion?.endsWith(commitHash)) {\n // Write the currently released dev version so when pnpm publish runs on dependents they depend on the dev versions\n if (dry) {\n info(`[DRY] ${pkg.name}@${devVersion} already released. Editing package.json version.`);\n } else {\n const pkgJson = (await file(`${pkg.path}/package.json`).json()) as PackageJSON;\n pkgJson.version = devVersion;\n await write(`${pkg.path}/package.json`, JSON.stringify(pkgJson, null, \"\\t\"));\n }\n\n release.version = devVersion;\n } else if (dry) {\n info(`[DRY] Bumping ${pkg.name} via git-cliff.`);\n release.version = `${pkg.version}.DRY-${devTag}.${timestamp}-${commitHash}`;\n } else {\n await $`pnpm --filter=${pkg.name} run release --preid \"${devTag}.${timestamp}-${commitHash}\" --skip-changelog`;\n // Read again instead of parsing the output to be sure we're matching when checking against npm\n const pkgJson = (await file(`${pkg.path}/package.json`).json()) as PackageJSON;\n release.version = pkgJson.version;\n }\n }\n // Only need changelog for releases published to github\n else {\n try {\n // Find and parse changelog to post in github release\n const changelogFile = await file(`${pkg.path}/CHANGELOG.md`).text();\n\n let changelogLines: string[] = [];\n let foundChangelog = false;\n\n for (const line of changelogFile.split(\"\\n\")) {\n if (line.startsWith(\"# [\")) {\n if (foundChangelog) {\n if (changelogLines.at(-1) === \"\") {\n changelogLines = changelogLines.slice(2, -1);\n }\n\n break;\n }\n\n // Check changelog release version and assume no changelog if version does not match\n if (!line.startsWith(`# [${release.name}@${release.version}]`)) {\n break;\n }\n\n foundChangelog = true;\n continue;\n }\n\n if (foundChangelog) {\n changelogLines.push(line);\n }\n }\n\n release.changelog = `${changelogLines.join(\"\\n\").replace(/^\\s+|\\s+$/g, \"\")}\\n`;\n } catch (error) {\n // Probably just no changelog file but log just in case\n warning(`Error parsing changelog for ${pkg.name}, will use auto generated: ${error}`);\n }\n }\n\n if (pkg.dependencies) {\n release.dependsOn = Object.keys(pkg.dependencies);\n }\n\n releaseEntries.push(release);\n }\n\n return releaseEntries;\n}\n\nexport async function generateReleaseTree(\n dry: boolean,\n devTag?: string,\n packageName?: string,\n exclude?: string[],\n) {\n let releaseEntries = await getReleaseEntries(dry, devTag);\n // Try to early return if the package doesn't have deps\n if (packageName && packageName !== \"all\") {\n const releaseEntry = releaseEntries.find((entry) => entry.name === packageName);\n if (!releaseEntry) {\n throw new Error(`Package ${packageName} not releaseable`);\n }\n\n if (!releaseEntry.dependsOn) {\n return [[releaseEntry]];\n }\n }\n\n // Generate the whole tree first, then prune if specified\n const releaseTree: ReleaseEntry[][] = [];\n const didRelease = new Set<string>();\n\n while (releaseEntries.length) {\n const nextBranch: ReleaseEntry[] = [];\n const unreleased: ReleaseEntry[] = [];\n for (const entry of releaseEntries) {\n if (!entry.dependsOn) {\n nextBranch.push(entry);\n continue;\n }\n\n const allDepsReleased = entry.dependsOn.every((dep) => didRelease.has(dep));\n if (allDepsReleased) {\n nextBranch.push(entry);\n } else {\n unreleased.push(entry);\n }\n }\n\n // Update didRelease in a second loop to avoid loop order issues\n for (const release of nextBranch) {\n didRelease.add(release.name);\n }\n\n if (releaseEntries.length === unreleased.length) {\n throw new Error(\n `One or more packages have dependents that can't be released: ${unreleased.map((entry) => entry.name).join(\",\")}`,\n );\n }\n\n releaseTree.push(nextBranch);\n releaseEntries = unreleased;\n }\n\n // Prune exclusions\n if ((!packageName || packageName === \"all\") && Array.isArray(exclude) && exclude.length) {\n const neededPackages = new Set<string>();\n const excludedReleaseTree: ReleaseEntry[][] = [];\n\n for (const releaseBranch of releaseTree.reverse()) {\n const newThisBranch: ReleaseEntry[] = [];\n\n for (const entry of releaseBranch) {\n if (exclude.includes(entry.name) && !neededPackages.has(entry.name)) {\n continue;\n }\n\n newThisBranch.push(entry);\n for (const dep of entry.dependsOn ?? []) {\n neededPackages.add(dep);\n }\n }\n\n if (newThisBranch.length) excludedReleaseTree.unshift(newThisBranch);\n }\n\n return excludedReleaseTree;\n }\n\n if (!packageName || packageName === \"all\") {\n return releaseTree;\n }\n\n // Prune the tree for the specified package\n const neededPackages = new Set<string>([packageName]);\n const packageReleaseTree: ReleaseEntry[][] = [];\n\n for (const releaseBranch of releaseTree.reverse()) {\n const newThisBranch: ReleaseEntry[] = [];\n\n for (const entry of releaseBranch) {\n if (neededPackages.has(entry.name)) {\n newThisBranch.push(entry);\n for (const dep of entry.dependsOn ?? []) {\n neededPackages.add(dep);\n }\n }\n }\n\n if (newThisBranch.length) packageReleaseTree.unshift(newThisBranch);\n }\n\n return packageReleaseTree;\n}\n","import { info, warning } from \"@actions/core\";\nimport { context, getOctokit } from \"@actions/github\";\nimport { $ } from \"bun\";\nimport process from \"node:process\";\n\nimport type { ReleaseEntry } from \"./generate-release-tree\";\n\nlet octokit: ReturnType<typeof getOctokit> | undefined;\n\nif (process.env.GITHUB_TOKEN) {\n octokit = getOctokit(process.env.GITHUB_TOKEN);\n}\n\nasync function checkRegistry(release: ReleaseEntry) {\n const res = await fetch(`https://registry.npmjs.org/${release.name}/${release.version}`);\n return res.ok;\n}\n\nasync function gitTagAndRelease(release: ReleaseEntry, dry: boolean) {\n const tagName = `${release.name}@${release.version}`;\n\n if (dry) {\n info(`[DRY] Release would be \"${tagName}\", skipping release creation.`);\n return;\n }\n\n try {\n await octokit?.rest.repos.createRelease({\n ...context.repo,\n tag_name: tagName,\n name: tagName,\n body: release.changelog ?? \"\",\n generate_release_notes: release.changelog === undefined,\n make_latest: \"true\",\n });\n } catch (error) {\n warning(`Failed to create github release: ${error}`);\n }\n}\n\nexport async function releasePackage(\n release: ReleaseEntry,\n dry: boolean,\n devTag?: string,\n doGitRelease = !devTag,\n) {\n // Sanity check against the registry first\n if (await checkRegistry(release)) {\n info(`${release.name}@${release.version} already published, skipping.`);\n return false;\n }\n\n if (dry) {\n info(`[DRY] Releasing ${release.name}@${release.version}`);\n } else {\n await $`pnpm --filter=${release.name} publish --provenance --no-git-checks ${devTag ? `--tag=${devTag}` : \"\"}`;\n }\n\n // && !devTag just to be sure\n if (doGitRelease && !devTag) await gitTagAndRelease(release, dry);\n\n if (dry) return true;\n\n const before = performance.now();\n\n // Poll registry to ensure next publishes won't fail\n await new Promise<void>((resolve, reject) => {\n const interval = setInterval(async () => {\n if (await checkRegistry(release)) {\n clearInterval(interval);\n resolve();\n return;\n }\n\n if (performance.now() > before + 5 * 60 * 1_000) {\n clearInterval(interval);\n reject(new Error(`Release for ${release.name} failed.`));\n }\n }, 15_000);\n });\n\n return true;\n}\n"],"mappings":"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","names":["tag","dry","packageName","exclude","neededPackages","info","warning","$","dry","info","warning","$","packageName"]}
|
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@nanoforge-dev/actions",
|
|
4
|
-
"version": "1.0
|
|
5
|
-
"description": "NanoForge
|
|
4
|
+
"version": "1.1.0",
|
|
5
|
+
"description": "NanoForge Actions",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"nanoforge",
|
|
8
8
|
"game",
|
|
9
|
-
"
|
|
9
|
+
"actions"
|
|
10
10
|
],
|
|
11
|
-
"homepage": "https://github.com/NanoForge-dev/
|
|
12
|
-
"bugs": "https://github.com/NanoForge-dev/
|
|
11
|
+
"homepage": "https://github.com/NanoForge-dev/actions#readme",
|
|
12
|
+
"bugs": "https://github.com/NanoForge-dev/actions/issues",
|
|
13
13
|
"license": "MIT",
|
|
14
14
|
"contributors": [
|
|
15
15
|
"Bill <timothe.jacquot@epitech.eu>",
|
|
@@ -29,36 +29,39 @@
|
|
|
29
29
|
},
|
|
30
30
|
"repository": {
|
|
31
31
|
"type": "git",
|
|
32
|
-
"url": "git+https://github.com/NanoForge-dev/
|
|
33
|
-
"directory": "packages/actions"
|
|
32
|
+
"url": "git+https://github.com/NanoForge-dev/actions.git"
|
|
34
33
|
},
|
|
35
|
-
"funding": "https://github.com/NanoForge-dev/
|
|
34
|
+
"funding": "https://github.com/NanoForge-dev/actions?sponsor",
|
|
36
35
|
"dependencies": {
|
|
37
|
-
"@actions/core": "^2.0.
|
|
38
|
-
"@actions/github": "^
|
|
36
|
+
"@actions/core": "^2.0.2",
|
|
37
|
+
"@actions/github": "^7.0.0",
|
|
39
38
|
"commander": "^14.0.2"
|
|
40
39
|
},
|
|
41
40
|
"devDependencies": {
|
|
41
|
+
"@commitlint/cli": "^20.3.1",
|
|
42
|
+
"@commitlint/config-conventional": "^20.3.1",
|
|
42
43
|
"@favware/cliff-jumper": "^6.0.0",
|
|
44
|
+
"@nanoforge-dev/utils-eslint-config": "^1.0.1",
|
|
45
|
+
"@nanoforge-dev/utils-prettier-config": "^1.0.1",
|
|
43
46
|
"@npm/types": "^2.1.0",
|
|
44
|
-
"@trivago/prettier-plugin-sort-imports": "^6.0.
|
|
45
|
-
"@types/bun": "^1.3.
|
|
46
|
-
"eslint": "^9.39.
|
|
47
|
-
"
|
|
48
|
-
"
|
|
47
|
+
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
|
|
48
|
+
"@types/bun": "^1.3.6",
|
|
49
|
+
"eslint": "^9.39.2",
|
|
50
|
+
"husky": "^9.1.7",
|
|
51
|
+
"lint-staged": "^16.2.7",
|
|
52
|
+
"prettier": "^3.8.0",
|
|
53
|
+
"terser": "^5.46.0",
|
|
49
54
|
"tsup": "^8.5.1",
|
|
50
|
-
"typescript": "^5.9.3"
|
|
51
|
-
"@nanoforge-dev/utils-eslint-config": "^1.0.1",
|
|
52
|
-
"@nanoforge-dev/utils-prettier-config": "^1.0.1"
|
|
55
|
+
"typescript": "^5.9.3"
|
|
53
56
|
},
|
|
54
57
|
"engines": {
|
|
55
|
-
"node": "
|
|
58
|
+
"node": "25"
|
|
56
59
|
},
|
|
57
60
|
"publishConfig": {
|
|
58
61
|
"access": "public"
|
|
59
62
|
},
|
|
60
63
|
"lint-staged": {
|
|
61
|
-
"
|
|
64
|
+
"**": [
|
|
62
65
|
"prettier --write"
|
|
63
66
|
],
|
|
64
67
|
"src/**/*.ts": [
|
|
@@ -69,7 +72,7 @@
|
|
|
69
72
|
"build": "tsc --noEmit && tsup",
|
|
70
73
|
"lint": "prettier --check . && eslint --format=pretty src",
|
|
71
74
|
"format": "prettier --write . && eslint --fix --format=pretty src",
|
|
72
|
-
"changelog": "git cliff --prepend ./CHANGELOG.md -u -c ./cliff.toml -r ../../ --include-path '
|
|
75
|
+
"changelog": "git cliff --prepend ./CHANGELOG.md -u -c ./cliff.toml -r ../../ --include-path '*'",
|
|
73
76
|
"release": "cliff-jumper"
|
|
74
77
|
}
|
|
75
78
|
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
name: "pnpm install"
|
|
2
|
-
description: "Run pnpm install with cache enabled"
|
|
3
|
-
runs:
|
|
4
|
-
using: "composite"
|
|
5
|
-
steps:
|
|
6
|
-
- name: Set up swap space
|
|
7
|
-
if: runner.os == 'Linux'
|
|
8
|
-
uses: pierotofy/set-swap-space@v1.0
|
|
9
|
-
with:
|
|
10
|
-
swap-size-gb: 10
|
|
11
|
-
|
|
12
|
-
- uses: pnpm/action-setup@v4.1.0
|
|
13
|
-
name: Install pnpm
|
|
14
|
-
with:
|
|
15
|
-
run_install: false
|
|
16
|
-
|
|
17
|
-
- name: Expose pnpm config(s) through "$GITHUB_OUTPUT"
|
|
18
|
-
id: pnpm-config
|
|
19
|
-
shell: bash
|
|
20
|
-
run: |
|
|
21
|
-
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
|
|
22
|
-
|
|
23
|
-
- name: Cache rotation keys
|
|
24
|
-
id: cache-rotation
|
|
25
|
-
shell: bash
|
|
26
|
-
run: |
|
|
27
|
-
echo "YEAR_MONTH=$(/bin/date -u "+%Y%m")" >> $GITHUB_OUTPUT
|
|
28
|
-
|
|
29
|
-
- uses: actions/cache@v4
|
|
30
|
-
name: Setup pnpm cache
|
|
31
|
-
with:
|
|
32
|
-
path: ${{ steps.pnpm-config.outputs.STORE_PATH }}
|
|
33
|
-
key: ${{ runner.os }}-pnpm-store-cache-${{ steps.cache-rotation.outputs.YEAR_MONTH }}-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
34
|
-
restore-keys: |
|
|
35
|
-
${{ runner.os }}-pnpm-store-cache-${{ steps.cache-rotation.outputs.YEAR_MONTH }}-
|
|
36
|
-
|
|
37
|
-
- name: Install dependencies
|
|
38
|
-
shell: bash
|
|
39
|
-
run: |
|
|
40
|
-
pnpm install --frozen-lockfile --prefer-offline --loglevel error
|
|
41
|
-
env:
|
|
42
|
-
HUSKY: "0"
|