@nanoforge-dev/actions 1.0.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/LICENSE +21 -0
- package/README.md +52 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/package.json +75 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright © 2026 NanoForge
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<br />
|
|
3
|
+
<p>
|
|
4
|
+
<a href="https://github.com/NanoForge-dev"><img src="https://github.com/NanoForge-dev/Engine/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/Engine/actions"><img src="https://github.com/NanoForge-dev/Engine/actions/workflows/tests.yml/badge.svg" alt="Tests status" /></a>
|
|
11
|
+
<a href="https://github.com/NanoForge-dev/Engine/commits/main/packages/actions"><img src="https://img.shields.io/github/last-commit/NanoForge-dev/Engine.svg?logo=github&logoColor=ffffff&path=packages%actions" alt="Last commit." /></a>
|
|
12
|
+
</p>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
## About
|
|
16
|
+
|
|
17
|
+
`@nanoforge-dev/actions` is library that contains all utils for nanoforge actions.
|
|
18
|
+
|
|
19
|
+
Most of the sources of this package come from [discord.js][discordjs-source]. Spetial thanks to them !
|
|
20
|
+
|
|
21
|
+
## Installation
|
|
22
|
+
|
|
23
|
+
**Node.js 24.11.0 or newer is required.**
|
|
24
|
+
|
|
25
|
+
```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
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Links
|
|
33
|
+
|
|
34
|
+
- [GitHub][source]
|
|
35
|
+
- [npm][npm]
|
|
36
|
+
|
|
37
|
+
## Contributing
|
|
38
|
+
|
|
39
|
+
Before creating an issue, please ensure that it hasn't already been reported/suggested, and double-check the
|
|
40
|
+
[documentation][documentation].
|
|
41
|
+
See [the contribution guide][contributing] if you'd like to submit a PR.
|
|
42
|
+
|
|
43
|
+
## Help
|
|
44
|
+
|
|
45
|
+
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
|
+
|
|
47
|
+
[documentation]: https://github.com/NanoForge-dev/Engine
|
|
48
|
+
[discussions]: https://github.com/NanoForge-dev/Engine/discussions
|
|
49
|
+
[source]: https://github.com/NanoForge-dev/Engine/tree/main/packages/actions
|
|
50
|
+
[npm]: https://www.npmjs.com/package/@nanoforge-dev/actions
|
|
51
|
+
[contributing]: https://github.com/NanoForge-dev/Engine/blob/main/.github/CONTRIBUTING.md
|
|
52
|
+
[discordjs-source]: https://github.com/discordjs/discord.js
|
package/dist/index.js
ADDED
|
@@ -0,0 +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 --filter {packages/\*} --filter {utils/\*} --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}foundChangelog&&changelogLines.push(line)}release.changelog=changelogLines.join("\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)return void info2(`[DRY] Release would be "${tagName}", skipping release creation.`);const commitHash=(await $2`git rev-parse HEAD`.text()).trim();try{await(octokit?.rest.repos.createRelease({...context.repo,tag_name:tagName,target_commitish:commitHash,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
|
|
@@ -0,0 +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 --filter {packages/\\*} --filter {utils/\\*} --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 }\n\n if (foundChangelog) {\n changelogLines.push(line);\n }\n }\n\n release.changelog = changelogLines.join(\"\\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"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/package.json",
|
|
3
|
+
"name": "@nanoforge-dev/actions",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"description": "NanoForge Engine - Actions",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"nanoforge",
|
|
8
|
+
"game",
|
|
9
|
+
"engine"
|
|
10
|
+
],
|
|
11
|
+
"homepage": "https://github.com/NanoForge-dev/Engine#readme",
|
|
12
|
+
"bugs": "https://github.com/NanoForge-dev/Engine/issues",
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"contributors": [
|
|
15
|
+
"Bill <timothe.jacquot@epitech.eu>",
|
|
16
|
+
"Exelo <exelo.corp@gmail.com>",
|
|
17
|
+
"Fexkoser <martin.fillon@epitech.eu>",
|
|
18
|
+
"Tchips <leo.outmizguine@epitech.eu>"
|
|
19
|
+
],
|
|
20
|
+
"files": [
|
|
21
|
+
"dist"
|
|
22
|
+
],
|
|
23
|
+
"exports": {
|
|
24
|
+
"./package.json": "./package.json"
|
|
25
|
+
},
|
|
26
|
+
"type": "module",
|
|
27
|
+
"directories": {
|
|
28
|
+
"lib": "src"
|
|
29
|
+
},
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "git+https://github.com/NanoForge-dev/Engine.git",
|
|
33
|
+
"directory": "packages/actions"
|
|
34
|
+
},
|
|
35
|
+
"funding": "https://github.com/NanoForge-dev/Engine?sponsor",
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@actions/core": "^2.0.1",
|
|
38
|
+
"@actions/github": "^6.0.1",
|
|
39
|
+
"commander": "^14.0.2"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@favware/cliff-jumper": "^6.0.0",
|
|
43
|
+
"@npm/types": "^2.1.0",
|
|
44
|
+
"@trivago/prettier-plugin-sort-imports": "^6.0.0",
|
|
45
|
+
"@types/bun": "^1.3.5",
|
|
46
|
+
"eslint": "^9.39.1",
|
|
47
|
+
"prettier": "^3.6.2",
|
|
48
|
+
"terser": "^5.44.1",
|
|
49
|
+
"tsup": "^8.5.1",
|
|
50
|
+
"typescript": "^5.9.3",
|
|
51
|
+
"@nanoforge-dev/utils-prettier-config": "^1.0.1",
|
|
52
|
+
"@nanoforge-dev/utils-eslint-config": "^1.0.1"
|
|
53
|
+
},
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": "24.11.0"
|
|
56
|
+
},
|
|
57
|
+
"publishConfig": {
|
|
58
|
+
"access": "public"
|
|
59
|
+
},
|
|
60
|
+
"lint-staged": {
|
|
61
|
+
"**/*.ts": [
|
|
62
|
+
"prettier --write"
|
|
63
|
+
],
|
|
64
|
+
"src/**/*.ts": [
|
|
65
|
+
"eslint --fix"
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
"scripts": {
|
|
69
|
+
"build": "tsc --noEmit && tsup",
|
|
70
|
+
"lint": "prettier --check . && eslint --format=pretty src",
|
|
71
|
+
"format": "prettier --write . && eslint --fix --format=pretty src",
|
|
72
|
+
"changelog": "git cliff --prepend ./CHANGELOG.md -u -c ./cliff.toml -r ../../ --include-path 'packages/actions/*'",
|
|
73
|
+
"release": "cliff-jumper"
|
|
74
|
+
}
|
|
75
|
+
}
|