aronrepo 3.0.2 → 3.0.3

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/dist/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { releaseModes } from "./index.js";
3
- import { i as explain, l as release, n as check, o as policy, r as doctor, t as agents } from "./commands-ClWK0lQ9.js";
3
+ import { i as explain, l as release, n as check, o as policy, r as doctor, t as agents } from "./commands-D2xBkCvw.js";
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
6
6
  import { parseArgs } from "node:util";
@@ -495,7 +495,8 @@ async function planRelease(options = {}, environmentOptions = {}) {
495
495
  mode: project.policy.mode,
496
496
  release: false,
497
497
  commits: [],
498
- packages
498
+ packages,
499
+ ...project.policy.assets ? { assets: project.policy.assets } : {}
499
500
  };
500
501
  if (!channel) return base;
501
502
  if (await git(environment, ["rev-parse", "--is-shallow-repository"]) === "true") throw new Error("The repository is a shallow clone, so its tags and commits are incomplete. Fetch the full history, such as `fetch-depth: 0` in actions/checkout.");
@@ -804,6 +805,50 @@ async function waitForVersion(environment, registry, name, version) {
804
805
  }
805
806
  throw new Error(`${name}@${version} did not appear on ${registry}.`);
806
807
  }
808
+ function fillAssetName(template, tag) {
809
+ return template.replaceAll("{tag}", tag).replaceAll("{version}", tag.replace(/^v/, ""));
810
+ }
811
+ /** Resolves asset files and names, and fails before any GitHub write when a file is missing. */
812
+ function resolveAssets(cwd, tag, assets = []) {
813
+ const resolved = assets.map((asset) => {
814
+ const file = path.resolve(cwd, asset.path);
815
+ if (!fs.existsSync(file) || !fs.statSync(file).isFile()) throw new Error(`The GitHub release asset ${asset.path} does not exist.`);
816
+ return {
817
+ file,
818
+ name: fillAssetName(asset.name ?? path.basename(file), tag),
819
+ ...asset.label ? { label: fillAssetName(asset.label, tag) } : {}
820
+ };
821
+ });
822
+ const names = /* @__PURE__ */ new Set();
823
+ for (const { name } of resolved) {
824
+ if (names.has(name)) throw new Error(`Two GitHub release assets are named ${name}.`);
825
+ names.add(name);
826
+ }
827
+ return resolved;
828
+ }
829
+ async function uploadAssets(environment, release, assets, headers) {
830
+ if (!assets.length) return;
831
+ if (!release.upload_url) throw new Error("The GitHub release has no upload URL for its assets.");
832
+ const uploadUrl = release.upload_url.replace(/\{.*\}$/, "");
833
+ const existing = new Set((release.assets ?? []).map(({ name }) => name));
834
+ for (const asset of assets) {
835
+ if (existing.has(asset.name)) {
836
+ environment.log(`✓ GitHub release asset ${asset.name} exists.`);
837
+ continue;
838
+ }
839
+ const query = `name=${encodeURIComponent(asset.name)}${asset.label ? `&label=${encodeURIComponent(asset.label)}` : ""}`;
840
+ const response = await environment.fetch(`${uploadUrl}?${query}`, {
841
+ method: "POST",
842
+ headers: {
843
+ ...headers,
844
+ "content-type": "application/octet-stream"
845
+ },
846
+ body: fs.readFileSync(asset.file)
847
+ });
848
+ if (!response.ok) throw new Error(`Could not upload ${asset.name} to the GitHub release: ${response.status} ${await response.text()}`);
849
+ environment.log(`✓ Uploaded ${asset.name}`);
850
+ }
851
+ }
807
852
  /** Cuts notes at a line to fit a GitHub release body, keeping the full changelog link. */
808
853
  function truncateNotes(notes, limit = releaseBodyLimit) {
809
854
  if (notes.length <= limit) return notes;
@@ -828,10 +873,13 @@ async function publishGitHubRelease(environment, release) {
828
873
  "content-type": "application/json",
829
874
  "x-github-api-version": "2022-11-28"
830
875
  };
876
+ const assets = resolveAssets(environment.cwd, release.tag, release.assets);
831
877
  const existing = await environment.fetch(`${api}/tags/${encodeURIComponent(release.tag)}`, { headers });
832
878
  if (existing.ok) {
833
879
  environment.log(`✓ GitHub release ${release.tag} exists.`);
834
- return (await existing.json()).html_url;
880
+ const found = await existing.json();
881
+ await uploadAssets(environment, found, assets, headers);
882
+ return found.html_url;
835
883
  }
836
884
  if (existing.status !== 404) throw new Error(`Could not check the GitHub release ${release.tag}: ${existing.status} ${await existing.text()}`);
837
885
  const latest = release.latest ?? !release.prerelease;
@@ -848,9 +896,10 @@ async function publishGitHubRelease(environment, release) {
848
896
  })
849
897
  });
850
898
  if (!response.ok) throw new Error(`Could not create the GitHub release ${release.tag}: ${response.status} ${await response.text()}`);
851
- const url = (await response.json()).html_url;
852
- environment.log(`✓ Created the GitHub release ${url ?? release.tag}.`);
853
- return url;
899
+ const created = await response.json();
900
+ environment.log(`✓ Created the GitHub release ${created.html_url ?? release.tag}.`);
901
+ await uploadAssets(environment, created, assets, headers);
902
+ return created.html_url;
854
903
  }
855
904
  function describePlan(plan) {
856
905
  const range = plan.from ? `${plan.from}..${plan.head.slice(0, 9)}` : `all commits up to ${plan.head.slice(0, 9)}`;
@@ -910,6 +959,7 @@ async function resumeTaggedRelease(environment, options, plan) {
910
959
  notes: previous.notes,
911
960
  prerelease: Boolean(channel.prerelease),
912
961
  target: plan.head,
962
+ ...plan.assets ? { assets: plan.assets } : {},
913
963
  latest: !channel.prerelease && await isLatestStable(environment, previous.version)
914
964
  });
915
965
  return true;
@@ -976,6 +1026,11 @@ async function runRelease(options = {}, environmentOptions = {}) {
976
1026
  };
977
1027
  }
978
1028
  if (options.dryRun) {
1029
+ try {
1030
+ resolveAssets(cwd, plan.tag, plan.assets);
1031
+ } catch (error) {
1032
+ log(`! ${error.message} A release would stop here.`);
1033
+ }
979
1034
  if (dirty) log("! The working tree has changes; a release would stop here.");
980
1035
  if (existingTag) log(`! ${plan.tag} exists but is not reachable from ${plan.branch}; a release would stop here.`);
981
1036
  log(`\nDry run: would publish ${plan.tag} on ${plan.channel.distTag}.\n\n${plan.notes}`);
@@ -986,6 +1041,7 @@ async function runRelease(options = {}, environmentOptions = {}) {
986
1041
  }
987
1042
  if (dirty) throw new Error("The working tree has changes. Release from a clean checkout.");
988
1043
  if (existingTag) throw new Error(`${plan.tag} exists but is not reachable from ${plan.branch}.`);
1044
+ resolveAssets(cwd, plan.tag, plan.assets);
989
1045
  const npmrc = (() => {
990
1046
  const { project, user } = readNpmConfigs(cwd, environment.env);
991
1047
  return `${user}\n${project}`;
@@ -1163,6 +1219,7 @@ async function runRelease(options = {}, environmentOptions = {}) {
1163
1219
  notes,
1164
1220
  prerelease: Boolean(channel.prerelease),
1165
1221
  target: plan.head,
1222
+ ...plan.assets ? { assets: plan.assets } : {},
1166
1223
  latest: !channel.prerelease && await isLatestStable(environment, version)
1167
1224
  });
1168
1225
  return {
@@ -1685,4 +1742,4 @@ async function doctor(options) {
1685
1742
  }
1686
1743
  export { findConfigFile as A, getStagedFiles as B, runRelease as C, configFileNames as D, writeReleaseManifest as E, getGitConfig as F, queryReleaseDirs as G, loadConfig as H, getLatestTag as I, readWorkspacePackage as J, queryWorkspaceDirs as K, getProjectCliCommand as L, getCommitFiles as M, getCurrentBranch as N, detectPackageManager as O, getDiffFiles as P, getRangeCommits as R, runCommand as S, truncateNotes as T, loadProjectPolicy as U, getVersionTags as V, queryPublicWorkspaceDirs as W, resolveReleasePaths as X, readWorkspacePatterns as Y, planRelease as _, isIgnoredMessage as a, readPackedManifest as b, readEditMessage as c, exchangeOidcToken as d, getRegistry as f, officialRegistry as g, hasRegistryAuth as h, explain as i, getCliCommand as j, explainRange as k, release as l, getRepositoryUrl as m, check as n, policy as o, getReleasePackages as p, readJsonFile as q, doctor as r, readAgentsBlock as s, agents as t, replaceAgentsBlock as u, publishGitHubRelease as v, stagingDistTag as w, releaseBodyLimit as x, quoteWindowsArg as y, getRepositoryRoot as z };
1687
1744
 
1688
- //# sourceMappingURL=commands-ClWK0lQ9.js.map
1745
+ //# sourceMappingURL=commands-D2xBkCvw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands-D2xBkCvw.js","names":["readJson","loadYaml","git"],"sources":["../src/project.ts","../src/release.ts","../src/commands.ts"],"sourcesContent":["import { execFileSync } from 'node:child_process'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { globSync } from 'tinyglobby'\nimport { load as loadYaml } from 'js-yaml'\nimport {\n createReleasePathMatcher,\n defaultReleasePathExcludes,\n getReleasePolicy,\n resolveRelease,\n type AronrepoConfig,\n type CommitInput,\n type ReleasePathsConfig,\n type ReleasePolicy\n} from './policy'\n\nexport interface PackageJson {\n name?: string\n version?: string\n private?: boolean\n workspaces?: string[] | { packages?: string[] }\n publishConfig?: {\n access?: string\n provenance?: boolean\n [key: string]: unknown\n }\n [key: string]: unknown\n}\n\n/** Config files in lookup order. Node 22.18+ imports `.ts` files by stripping their types. */\nexport const configFileNames = ['aronrepo.config.js', 'aronrepo.config.mjs', 'aronrepo.config.cjs', 'aronrepo.config.ts', 'aronrepo.config.mts', 'aronrepo.config.cts']\n\nfunction toPosixPath(value: string) {\n return value.split(path.sep).join('/')\n}\n\n/** Reads JSON like npm does, accepting a UTF-8 byte order mark, and names the file when it is invalid. */\nexport function readJsonFile<T>(file: string) {\n const content = fs.readFileSync(file, 'utf8').replace(/^\\uFEFF/, '')\n try {\n return JSON.parse(content) as T\n } catch (error) {\n throw new Error(`${file} is not valid JSON: ${(error as Error).message}`, { cause: error })\n }\n}\n\nconst readJson = readJsonFile\n\nexport function findConfigFile(cwd = process.cwd()) {\n return configFileNames\n .map((name) => path.join(cwd, name))\n .find((file) => fs.existsSync(file))\n}\n\n/** Loads `aronrepo.config.js` from the repository root; returns `{}` when it is missing. */\nexport async function loadConfig(cwd = process.cwd()): Promise<AronrepoConfig> {\n const file = findConfigFile(cwd)\n if (!file) return {}\n // The query keeps long-lived processes from reusing a cached module after the file changes.\n const stat = fs.statSync(file)\n const url = `${pathToFileURL(file).href}?mtime=${stat.mtimeMs}&size=${stat.size}`\n const module = await import(url) as { default?: AronrepoConfig }\n return module.default ?? {}\n}\n\nfunction readPNPMWorkspaces(cwd: string) {\n const workspacePath = path.join(cwd, 'pnpm-workspace.yaml')\n if (!fs.existsSync(workspacePath)) return undefined\n\n const content = fs.readFileSync(workspacePath, 'utf8')\n // js-yaml 5 rejects an empty document, such as a file with only comments.\n if (!content.split('\\n').some((line) => line.trim() && !line.trim().startsWith('#'))) return undefined\n const workspace = loadYaml(content) as { packages?: string[] } | null | undefined\n return workspace?.packages\n}\n\nfunction readNPMWorkspaces(cwd: string) {\n const packagePath = path.join(cwd, 'package.json')\n if (!fs.existsSync(packagePath)) return undefined\n\n const pkg = readJson<PackageJson>(packagePath)\n return Array.isArray(pkg.workspaces)\n ? pkg.workspaces\n : pkg.workspaces?.packages\n}\n\nexport function readWorkspacePatterns(cwd = process.cwd()) {\n return readPNPMWorkspaces(cwd) ?? readNPMWorkspaces(cwd) ?? []\n}\n\nexport function queryWorkspaceDirs(patterns: string[], cwd = process.cwd()) {\n if (!patterns.length) return []\n\n return globSync(\n patterns.map((workspace) => `${workspace}/package.json`),\n {\n cwd,\n onlyFiles: true,\n expandDirectories: false,\n ignore: [\n '**/node_modules/**'\n ]\n }\n )\n .map((workspacePackage) => toPosixPath(workspacePackage).replace(/\\/?package\\.json$/, '') || '.')\n .sort()\n}\n\nexport function readWorkspacePackage(cwd: string, workspace: string) {\n return readJson<PackageJson>(path.join(cwd, workspace, 'package.json'))\n}\n\n/**\n * Directories of the packages that ship: public, non-private workspace packages,\n * and the root package when it is published too. A root package without\n * workspaces ships unless it is private; with workspaces it needs\n * `publishConfig.access: \"public\"` like the others.\n */\nexport function queryReleaseDirs(cwd = process.cwd()) {\n const dirs = queryPublicWorkspaceDirs(cwd)\n const rootFile = path.join(cwd, 'package.json')\n if (dirs.includes('.') || !fs.existsSync(rootFile)) return dirs\n const root = readJson<PackageJson>(rootFile)\n const hasWorkspaces = readWorkspacePatterns(cwd).length > 0\n if (root.name && !root.private && (!hasWorkspaces || root.publishConfig?.access === 'public')) return ['.', ...dirs]\n return dirs\n}\n\n/** Workspace directories whose package is published to npm: public and not private. */\nexport function queryPublicWorkspaceDirs(cwd = process.cwd()) {\n return queryWorkspaceDirs(readWorkspacePatterns(cwd), cwd)\n .filter((workspace) => {\n const pkg = readWorkspacePackage(cwd, workspace)\n return pkg.publishConfig?.access === 'public' && !pkg.private\n })\n}\n\n/**\n * Resolves the files whose changes can release a version.\n *\n * Configured paths win. Otherwise public workspace packages define them; a\n * single-package repository with a non-private root package uses every path.\n * Returns `undefined` when no published package is found, which turns the check off.\n */\nexport function resolveReleasePaths(cwd = process.cwd(), policy?: Pick<ReleasePolicy, 'paths'>): ReleasePathsConfig | undefined {\n if (policy?.paths === false) return undefined\n if (policy?.paths?.include) {\n return { include: policy.paths.include, exclude: policy.paths.exclude ?? defaultReleasePathExcludes }\n }\n const exclude = policy?.paths?.exclude ?? defaultReleasePathExcludes\n const dirs = queryReleaseDirs(cwd)\n if (!dirs.length) return undefined\n return { include: dirs.includes('.') ? ['**'] : dirs.map((dir) => `${dir}/**`), exclude }\n}\n\nexport type PackageManager = 'bun' | 'pnpm' | 'yarn' | 'npm'\n\nconst lockfiles: Array<[string, PackageManager]> = [\n ['bun.lock', 'bun'],\n ['bun.lockb', 'bun'],\n ['pnpm-lock.yaml', 'pnpm'],\n ['pnpm-workspace.yaml', 'pnpm'],\n ['yarn.lock', 'yarn'],\n ['package-lock.json', 'npm']\n]\n\n/** The package manager from `packageManager` in package.json, then from the lockfile; `npm` by default. */\nexport function detectPackageManager(cwd = process.cwd()): PackageManager {\n const rootPackage = path.join(cwd, 'package.json')\n const declared = fs.existsSync(rootPackage) ? String(readJson<PackageJson>(rootPackage).packageManager ?? '').split('@')[0] : ''\n if (declared === 'bun' || declared === 'pnpm' || declared === 'yarn' || declared === 'npm') return declared\n return lockfiles.find(([file]) => fs.existsSync(path.join(cwd, file)))?.[1] ?? 'npm'\n}\n\n/** How to run the aronrepo CLI with a package manager. */\nexport function getCliCommand(packageManager: PackageManager) {\n return {\n bun: 'bun x aronrepo',\n pnpm: 'pnpm exec aronrepo',\n yarn: 'yarn aronrepo',\n npm: 'npx aronrepo'\n }[packageManager]\n}\n\n/**\n * How to run the aronrepo CLI in a repository: its `aronrepo` script when it has\n * one, for example a workspace that builds aronrepo itself, or the installed binary.\n */\nexport function getProjectCliCommand(cwd: string, packageManager = detectPackageManager(cwd)) {\n const rootPackage = path.join(cwd, 'package.json')\n const scripts = fs.existsSync(rootPackage) ? readJson<PackageJson>(rootPackage).scripts as Record<string, string> | undefined : undefined\n if (scripts?.aronrepo) return packageManager === 'npm' ? 'npm run aronrepo --' : `${packageManager} run aronrepo`\n return getCliCommand(packageManager)\n}\n\nexport interface ProjectPolicy {\n cwd: string\n packageManager: PackageManager\n /** How to run the aronrepo CLI in this repository. */\n cli: string\n config: AronrepoConfig\n configFile?: string\n policy: ReleasePolicy\n releasePaths?: ReleasePathsConfig\n isReleasePath?: (file: string) => boolean\n}\n\n/** Loads the config, release policy, and release paths of a repository. */\nexport async function loadProjectPolicy(cwd = process.cwd(), overrides: Partial<ReleasePolicy> = {}): Promise<ProjectPolicy> {\n const config = await loadConfig(cwd)\n const policy = { ...getReleasePolicy(config), ...overrides }\n const releasePaths = resolveReleasePaths(cwd, policy)\n const configFile = findConfigFile(cwd)\n const packageManager = detectPackageManager(cwd)\n return {\n cwd,\n packageManager,\n cli: getProjectCliCommand(cwd, packageManager),\n config,\n ...(configFile ? { configFile } : {}),\n policy,\n ...(releasePaths ? { releasePaths } : {}),\n ...(releasePaths ? { isReleasePath: createReleasePathMatcher(releasePaths) } : {})\n }\n}\n\nfunction git(cwd: string, args: string[]) {\n if (!fs.existsSync(cwd)) throw new Error(`${cwd} does not exist.`)\n try {\n return execFileSync('git', args, { cwd, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024, stdio: ['ignore', 'pipe', 'pipe'] })\n } catch (error) {\n const { stderr, code } = error as { stderr?: string, code?: string }\n if (code === 'ENOENT') throw new Error('git is not installed or not on PATH.', { cause: error })\n throw new Error(`\\`git ${args.join(' ')}\\` failed: ${stderr?.trim() || (error as Error).message}`, { cause: error })\n }\n}\n\n/** The repository root that contains `cwd`, or `cwd` itself outside a git repository. */\nexport function getRepositoryRoot(cwd = process.cwd()) {\n try {\n return git(cwd, ['rev-parse', '--show-toplevel']).trim() || cwd\n } catch {\n return cwd\n }\n}\n\n/** A git config value, or `undefined` when it is not set. */\nexport function getGitConfig(cwd: string, key: string) {\n try {\n return git(cwd, ['config', '--get', key]).trim() || undefined\n } catch {\n return undefined\n }\n}\n\n/**\n * NUL-separated paths. `-z` keeps git from quoting paths with non-ASCII or\n * special characters, such as `\"docs/\\\\346\\\\226\\\\207.md\"`, which would never\n * match a release path.\n */\nfunction splitPaths(output: string) {\n return output.split('\\0').map((file) => file.replace(/^\\n/, '')).filter(Boolean)\n}\n\n// Rename detection lists only the new path; both paths decide whether a commit ships.\nconst nameOnly = ['--name-only', '-z', '--no-renames']\n\n/** Files changed by one commit. Merge commits report no files. */\nexport function getCommitFiles(cwd: string, hash: string) {\n return splitPaths(git(cwd, ['diff-tree', '--no-commit-id', ...nameOnly, '-r', '--root', hash]))\n}\n\nexport function getStagedFiles(cwd = process.cwd()) {\n return splitPaths(git(cwd, ['diff', '--cached', ...nameOnly]))\n}\n\n/** Files changed between the merge base of `base` and `head`, like a pull request diff. */\nexport function getDiffFiles(cwd: string, base: string, head: string) {\n return splitPaths(git(cwd, ['diff', ...nameOnly, `${base}...${head}`]))\n}\n\n/** Commits in `from..to`, oldest first, with their changed files, from one `git log`. Merge commits report no files. */\nexport function getRangeCommits(cwd: string, from: string | undefined, to = 'HEAD'): Required<CommitInput>[] {\n const range = from ? `${from}..${to}` : to\n const output = git(cwd, [\n '-c', 'log.showSignature=false',\n 'log', '--reverse', '--no-color', ...nameOnly, '--format=%x1e%H%x1f%B%x1f', range, '--'\n ])\n return output.split('\\x1e')\n .filter((entry) => entry.includes('\\x1f'))\n .map((entry) => {\n const hashEnd = entry.indexOf('\\x1f')\n const messageEnd = entry.indexOf('\\x1f', hashEnd + 1)\n return {\n hash: entry.slice(0, hashEnd),\n message: entry.slice(hashEnd + 1, messageEnd).trim(),\n files: splitPaths(entry.slice(messageEnd + 1))\n }\n })\n}\n\n/**\n * Latest `v*` version tag reachable from `ref`, or `undefined` when there is none.\n * A tag on `ref` itself does not count, so `explain --to v1.1.0` explains v1.1.0.\n */\nexport function getLatestTag(cwd: string, ref = 'HEAD') {\n try {\n return git(cwd, ['describe', '--tags', '--abbrev=0', '--match', 'v[0-9]*', `${ref}^`]).trim() || undefined\n } catch {\n return undefined\n }\n}\n\n/** `v*` tags, optionally only those merged into `ref`; none when `ref` does not exist, such as the parent of a root commit. */\nexport function getVersionTags(cwd: string, mergedInto?: string) {\n try {\n return splitPaths(git(cwd, ['tag', '--list', 'v*', ...(mergedInto ? ['--merged', mergedInto] : [])]).replace(/\\n/g, '\\0'))\n } catch {\n return []\n }\n}\n\n/** The checked-out branch, or `undefined` on a detached HEAD. */\nexport function getCurrentBranch(cwd: string) {\n const branch = git(cwd, ['rev-parse', '--abbrev-ref', 'HEAD']).trim()\n return branch === 'HEAD' ? undefined : branch\n}\n\n/** Resolves the release of a commit range with the repository's policy and release paths. */\nexport async function explainRange(cwd: string, from: string | undefined, to = 'HEAD', overrides: Partial<ReleasePolicy> = {}) {\n const project = await loadProjectPolicy(cwd, overrides)\n const commits = getRangeCommits(cwd, from, to)\n return {\n ...project,\n from,\n to,\n ...resolveRelease(commits, project.policy, project.isReleasePath ? { isReleasePath: project.isReleasePath } : {})\n }\n}\n","import { spawn } from 'node:child_process'\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { gunzipSync } from 'node:zlib'\nimport semver from 'semver'\nimport type { ReleaseType } from './commits'\nimport { renderReleaseNotes } from './notes'\nimport { resolveRelease, type CommitDecision, type ReleaseAsset, type ReleasePolicy } from './policy'\nimport {\n detectPackageManager,\n getRangeCommits,\n loadProjectPolicy,\n queryReleaseDirs,\n readJsonFile,\n type PackageJson,\n type PackageManager\n} from './project'\nimport {\n getBaseTag,\n getNextVersion,\n getReleaseChannel,\n parseVersionTag,\n toVersionTag,\n type ReleaseChannel\n} from './version'\n\nexport const officialRegistry = 'https://registry.npmjs.org/'\n\n/** npm dist-tag that holds a release until every package of it is published. */\nexport const stagingDistTag = 'aronrepo-staging'\n\n/** GitHub rejects release bodies over 125,000 characters. */\nexport const releaseBodyLimit = 120_000\n\nexport interface RunResult {\n stdout: string\n stderr: string\n}\n\nexport type Runner = (command: string, args: string[], options: { cwd: string, env: NodeJS.ProcessEnv }) => Promise<RunResult>\n\nexport type Fetch = (input: string, init?: RequestInit) => Promise<Response>\n\nexport interface ReleaseEnvironment {\n cwd: string\n env: NodeJS.ProcessEnv\n run: Runner\n fetch: Fetch\n log: (message: string) => void\n /** Waits between registry checks. */\n wait: (ms: number) => Promise<void>\n}\n\n/** Quotes an argument for `cmd.exe`, which runs `.cmd` shims such as `npm.cmd` on Windows. */\nexport function quoteWindowsArg(arg: string) {\n if (/^[\\w@+=:,./\\\\-]+$/.test(arg)) return arg\n return `\"${arg.replace(/(\\\\*)\"/g, '$1$1\\\\\"').replace(/(\\\\+)$/, '$1$1')}\"`\n}\n\nexport const runCommand: Runner = (command, args, { cwd, env }) => new Promise((resolve, reject) => {\n // Windows needs a shell for `.cmd` shims, and a shell joins arguments without quoting them.\n const child = process.platform === 'win32'\n ? spawn([command, ...args].map(quoteWindowsArg).join(' '), { cwd, env, stdio: ['ignore', 'pipe', 'pipe'], shell: true })\n : spawn(command, args, { cwd, env, stdio: ['ignore', 'pipe', 'pipe'] })\n let stdout = ''\n let stderr = ''\n child.stdout.on('data', (chunk) => { stdout += chunk })\n child.stderr.on('data', (chunk) => { stderr += chunk })\n child.on('error', reject)\n child.on('close', (code, signal) => {\n if (code === 0) resolve({ stdout, stderr })\n else reject(new Error(`\\`${command} ${args.join(' ')}\\` ${signal ? `was stopped by ${signal}` : `exited with ${code}`}.\\n${stderr.trim() || stdout.trim()}`))\n })\n})\n\nfunction createEnvironment(options: Partial<ReleaseEnvironment> = {}): ReleaseEnvironment {\n return {\n cwd: options.cwd ?? process.cwd(),\n env: options.env ?? process.env,\n run: options.run ?? runCommand,\n fetch: options.fetch ?? ((input, init) => fetch(input, init)),\n log: options.log ?? ((message) => console.log(message)),\n wait: options.wait ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)))\n }\n}\n\n/** Variables that hold credentials. Package scripts that run while packing never see them. */\nconst secretVariables = [\n 'NPM_TOKEN', 'NODE_AUTH_TOKEN', 'NPM_ID_TOKEN', 'GITHUB_TOKEN', 'GH_TOKEN',\n 'ACTIONS_ID_TOKEN_REQUEST_TOKEN', 'ACTIONS_ID_TOKEN_REQUEST_URL', 'ACTIONS_RUNTIME_TOKEN'\n]\n\nfunction withoutSecrets(env: NodeJS.ProcessEnv) {\n return Object.fromEntries(Object.entries(env).filter(([key]) => !secretVariables.includes(key.toUpperCase())))\n}\n\nasync function git(environment: ReleaseEnvironment, args: string[]) {\n return (await environment.run('git', args, { cwd: environment.cwd, env: environment.env })).stdout.trim()\n}\n\nasync function gitSucceeds(environment: ReleaseEnvironment, args: string[]) {\n try {\n await git(environment, args)\n return true\n } catch {\n return false\n }\n}\n\nfunction lines(output: string) {\n return output.split('\\n').map((line) => line.trim()).filter(Boolean)\n}\n\nexport interface ReleasePackage {\n /** Directory relative to the repository root, `.` for the root package. */\n dir: string\n name: string\n manifest: PackageJson\n}\n\nconst readJson = readJsonFile\n\nconst dependencyFields = ['dependencies', 'optionalDependencies', 'peerDependencies'] as const\n\n/** Fields whose packages must be published first; peers only need to exist when installed. */\nconst orderFields = ['dependencies', 'optionalDependencies'] as const\n\n/** Published packages of the repository in dependency order. */\nexport function getReleasePackages(cwd: string): ReleasePackage[] {\n const packages = queryReleaseDirs(cwd).map((dir) => {\n const manifest = readJson<PackageJson>(path.join(cwd, dir, 'package.json'))\n if (!manifest.name) throw new Error(`${dir}/package.json has no name.`)\n return { dir, name: manifest.name, manifest }\n })\n const names = new Map<string, string>()\n for (const { dir, name } of packages) {\n if (names.has(name)) throw new Error(`${names.get(name)}/package.json and ${dir}/package.json are both named ${name}.`)\n names.set(name, dir)\n }\n const dependenciesOf = (pkg: ReleasePackage) => orderFields\n .flatMap((field) => Object.keys((pkg.manifest[field] ?? {}) as Record<string, string>))\n .filter((name) => names.has(name) && name !== pkg.name)\n\n const ordered: ReleasePackage[] = []\n const visiting = new Set<string>()\n const visit = (pkg: ReleasePackage) => {\n if (ordered.includes(pkg)) return\n if (visiting.has(pkg.name)) throw new Error(`Published packages depend on each other in a cycle through ${pkg.name}.`)\n visiting.add(pkg.name)\n for (const name of dependenciesOf(pkg)) visit(packages.find((candidate) => candidate.name === name)!)\n visiting.delete(pkg.name)\n ordered.push(pkg)\n }\n for (const pkg of [...packages].sort((a, b) => a.dir.localeCompare(b.dir))) visit(pkg)\n return ordered\n}\n\nexport interface ReleasePlan {\n branch: string\n channel?: ReleaseChannel\n /** Full hash of the commit that releases. */\n head: string\n mode: ReleasePolicy['mode']\n /** The tag the range starts from; `undefined` for the first release. */\n from?: string\n release: ReleaseType\n version?: string\n tag?: string\n commits: CommitDecision[]\n notes?: string\n packages: ReleasePackage[]\n /** Files attached to the GitHub release, from `release.assets`. */\n assets?: ReleaseAsset[]\n}\n\nexport interface PlanReleaseOptions {\n /** Defaults to `GITHUB_REF_NAME`, then the checked-out branch. */\n branch?: string\n mode?: ReleasePolicy['mode']\n /** Plan as if the branch were `main` when it does not release, for `aronrepo explain` on feature branches. */\n fallbackToMain?: boolean\n /** Tags to ignore, to rebuild the plan of a release that is already tagged. */\n ignoreTags?: string[]\n /** Use this version instead of numbering one, to rebuild the plan of a tagged release. */\n version?: string\n date?: string\n}\n\n/**\n * The repository URL on GitHub, from `GITHUB_REPOSITORY` or the root package.json.\n * `owner/repo` and `github:owner/repo` are npm shorthands for GitHub.\n */\nexport function getRepositoryUrl(cwd: string, env: NodeJS.ProcessEnv = process.env) {\n if (env.GITHUB_REPOSITORY) return `${(env.GITHUB_SERVER_URL ?? 'https://github.com').replace(/\\/+$/, '')}/${env.GITHUB_REPOSITORY}`\n const root = path.join(cwd, 'package.json')\n if (!fs.existsSync(root)) return undefined\n const repository = readJson<PackageJson>(root).repository as string | { url?: string } | undefined\n const url = (typeof repository === 'string' ? repository : repository?.url)?.replace(/#.*$/, '')\n if (!url) return undefined\n const shorthand = /^(?:github:)?([\\w.-]+\\/[\\w.-]+?)(?:\\.git)?$/.exec(url)\n const match = shorthand ?? /(?:^|[/@])github\\.com[/:]([^/]+\\/[^/]+?)(?:\\.git)?\\/?$/.exec(url)\n return match ? `https://github.com/${match[1]}` : undefined\n}\n\nasync function getBranch(environment: ReleaseEnvironment, branch?: string) {\n if (branch) return branch\n const checkedOut = await git(environment, ['rev-parse', '--abbrev-ref', 'HEAD'])\n const ref = environment.env.GITHUB_REF_NAME\n if (!ref) return checkedOut\n // A workflow can run on `main` and check out another branch; release the branch that is checked out, not the event's.\n if (checkedOut !== 'HEAD' && checkedOut !== ref) {\n throw new Error(`GITHUB_REF_NAME is ${ref}, but ${checkedOut} is checked out. Pass --branch to choose the release branch.`)\n }\n return ref\n}\n\nfunction renderPlanNotes(environment: ReleaseEnvironment, plan: Pick<ReleasePlan, 'from' | 'commits'>, version: string, date?: string) {\n const repositoryUrl = getRepositoryUrl(environment.cwd, environment.env)\n return renderReleaseNotes({\n version,\n ...(plan.from ? { previousTag: plan.from } : {}),\n date: date ?? new Date().toISOString().slice(0, 10),\n ...(repositoryUrl ? { repositoryUrl } : {}),\n commits: plan.commits\n })\n}\n\n/** Plans the next release of the checked-out commit without changing anything. */\nexport async function planRelease(options: PlanReleaseOptions = {}, environmentOptions: Partial<ReleaseEnvironment> = {}): Promise<ReleasePlan> {\n const environment = createEnvironment(environmentOptions)\n const { cwd } = environment\n const project = await loadProjectPolicy(cwd, options.mode ? { mode: options.mode } : {})\n const branch = await getBranch(environment, options.branch)\n const channel = getReleaseChannel(branch) ?? (options.fallbackToMain ? getReleaseChannel('main') : undefined)\n const head = await git(environment, ['rev-parse', 'HEAD'])\n const packages = getReleasePackages(cwd)\n const base: ReleasePlan = {\n branch,\n head,\n mode: project.policy.mode,\n release: false,\n commits: [],\n packages,\n ...(project.policy.assets ? { assets: project.policy.assets } : {})\n }\n if (!channel) return base\n\n if (await git(environment, ['rev-parse', '--is-shallow-repository']) === 'true') {\n throw new Error('The repository is a shallow clone, so its tags and commits are incomplete. Fetch the full history, such as `fetch-depth: 0` in actions/checkout.')\n }\n const ignored = new Set(options.ignoreTags ?? [])\n const reachable = lines(await git(environment, ['tag', '--list', 'v*', '--merged', 'HEAD'])).filter((tag) => !ignored.has(tag))\n const all = lines(await git(environment, ['tag', '--list', 'v*'])).filter((tag) => !ignored.has(tag))\n const from = getBaseTag(channel, reachable)\n const decision = resolveRelease(\n getRangeCommits(cwd, from, 'HEAD'),\n project.policy,\n project.isReleasePath ? { isReleasePath: project.isReleasePath } : {}\n )\n const plan: ReleasePlan = { ...base, channel, ...(from ? { from } : {}), release: decision.release, commits: decision.commits }\n if (!decision.release) return plan\n\n const version = options.version ?? getNextVersion(channel, decision.release, { reachable, all })\n return { ...plan, version, tag: toVersionTag(version), notes: renderPlanNotes(environment, plan, version, options.date) }\n}\n\n/** `.npmrc` content that applies in a repository: the project file, then the user file, as npm reads them. */\nfunction readNpmConfigs(cwd: string, env: NodeJS.ProcessEnv) {\n const userconfig = env.NPM_CONFIG_USERCONFIG ?? env.npm_config_userconfig ?? path.join(os.homedir(), '.npmrc')\n return { project: readNpmrc(path.join(cwd, '.npmrc')), user: readNpmrc(userconfig) }\n}\n\n/** The last value of an `.npmrc` key, with `${VAR}` and `${VAR?}` expanded, or `undefined`. */\nfunction readNpmrcValue(content: string, key: string, env: NodeJS.ProcessEnv) {\n let value: string | undefined\n for (const line of content.split(/\\r?\\n/)) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith(';')) continue\n const index = trimmed.indexOf('=')\n if (index === -1 || trimmed.slice(0, index).trim() !== key) continue\n value = trimmed.slice(index + 1).trim().replace(/^(['\"])(.*)\\1$/, '$2')\n .replace(/\\$\\{([^}?]+)\\??\\}/g, (_, name: string) => env[name] ?? '')\n }\n return value\n}\n\n/**\n * Registry of a package, in npm's order: `publishConfig` (scoped, then plain),\n * the `@scope:registry` of `.npmrc` or the environment, `npm_config_registry`,\n * the `registry` of `.npmrc`, then npm. Pass `npmrc` to read `.npmrc` settings.\n */\nexport function getRegistry(manifest: PackageJson, env: NodeJS.ProcessEnv = process.env, npmrc = '') {\n const scope = manifest.name?.startsWith('@') ? manifest.name.split('/')[0] : undefined\n const candidates = [\n scope ? manifest.publishConfig?.[`${scope}:registry`] : undefined,\n manifest.publishConfig?.registry,\n scope ? env[`npm_config_${scope}:registry`] ?? env[`NPM_CONFIG_${scope}:registry`] : undefined,\n scope ? readNpmrcValue(npmrc, `${scope}:registry`, env) : undefined,\n env.NPM_CONFIG_REGISTRY ?? env.npm_config_registry,\n readNpmrcValue(npmrc, 'registry', env)\n ]\n const configured = candidates.find((value) => typeof value === 'string' && value)\n const registry = typeof configured === 'string' ? configured : officialRegistry\n return registry.endsWith('/') ? registry : `${registry}/`\n}\n\nfunction nerfDart(registry: string) {\n const url = new URL(registry)\n return `//${url.host}${url.pathname.endsWith('/') ? url.pathname : `${url.pathname}/`}`\n}\n\ninterface PublishedVersion {\n gitHead?: string\n dist?: { attestations?: unknown }\n}\n\ninterface Packument {\n 'dist-tags'?: Record<string, string>\n versions?: Record<string, PublishedVersion>\n}\n\nfunction isTransient(status: number) {\n return status === 408 || status === 429 || status >= 500\n}\n\nasync function readPackument(environment: ReleaseEnvironment, registry: string, name: string): Promise<Packument | undefined> {\n const headers: Record<string, string> = { accept: 'application/json', 'cache-control': 'no-cache' }\n // Private registries need auth to read; the public npm registry does not.\n if (registry !== officialRegistry && environment.env.NPM_TOKEN) headers.authorization = `Bearer ${environment.env.NPM_TOKEN}`\n for (let attempt = 1; ; attempt++) {\n let response: Response\n try {\n response = await environment.fetch(`${registry}${name.replace('/', '%2f')}`, { headers })\n } catch (error) {\n if (attempt >= 4) throw new Error(`Could not read ${name} from ${registry}: ${(error as Error).message}`, { cause: error })\n await environment.wait(2_000 * attempt)\n continue\n }\n if (response.status === 404) return undefined\n if (response.ok) return await response.json() as Packument\n if (!isTransient(response.status) || attempt >= 4) {\n throw new Error(`Could not read ${name} from ${registry}: ${response.status} ${response.statusText}`)\n }\n await environment.wait(2_000 * attempt)\n }\n}\n\nasync function getGitHubIdToken(environment: ReleaseEnvironment, audience: string) {\n const { ACTIONS_ID_TOKEN_REQUEST_URL: url, ACTIONS_ID_TOKEN_REQUEST_TOKEN: token } = environment.env\n if (!url || !token) return undefined\n const response = await environment.fetch(`${url}${url.includes('?') ? '&' : '?'}audience=${encodeURIComponent(audience)}`, {\n headers: { authorization: `Bearer ${token}`, accept: 'application/json' }\n })\n if (!response.ok) {\n environment.log(`! Could not get a GitHub Actions OIDC token: ${response.status} ${response.statusText}`)\n return undefined\n }\n return (await response.json() as { value?: string }).value\n}\n\n/** Exchanges a GitHub Actions OIDC token for a short-lived npm publish token (npm trusted publishing). */\nexport async function exchangeOidcToken(environment: ReleaseEnvironment, name: string, registry: string) {\n if (registry !== officialRegistry) return undefined\n const identity = environment.env.NPM_ID_TOKEN || await getGitHubIdToken(environment, 'npm:registry.npmjs.org')\n if (!identity) return undefined\n // The same escaping as the npm CLI: `@scope%2fname`.\n const response = await environment.fetch(`${officialRegistry}-/npm/v1/oidc/token/exchange/package/${name.replace('/', '%2f')}`, {\n method: 'POST',\n headers: { authorization: `Bearer ${identity}` }\n })\n if (!response.ok) {\n environment.log(`! Could not exchange the OIDC token for ${name}: ${response.status} ${response.statusText}`)\n return undefined\n }\n return (await response.json() as { token?: string }).token\n}\n\nfunction readNpmrc(file: string) {\n return fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : ''\n}\n\n/** actions/setup-node writes `_authToken=${NODE_AUTH_TOKEN}` and sets this placeholder when no token is given. */\nconst placeholderToken = 'XXXXX-XXXXX-XXXXX-XXXXX'\n\n/**\n * Auth for the registry in `.npmrc` content: `valid`, `invalid` (an unset\n * `${VAR}` or the setup-node placeholder), or `undefined` when there is none.\n * npm 9+ rejects auth without a registry prefix, so only `//host/path/:` keys count.\n */\nfunction readRegistryAuth(content: string, registry: string, env: NodeJS.ProcessEnv) {\n const nerfed = nerfDart(registry)\n const usable = (value: string | undefined) => value === undefined ? undefined : Boolean(value) && value !== placeholderToken\n const token = usable(readNpmrcValue(content, `${nerfed}:_authToken`, env))\n const auth = usable(readNpmrcValue(content, `${nerfed}:_auth`, env))\n const username = usable(readNpmrcValue(content, `${nerfed}:username`, env))\n const password = usable(readNpmrcValue(content, `${nerfed}:_password`, env))\n if (token || auth || (username && password)) return 'valid'\n if (token === false || auth === false || username === false || password === false) return 'invalid'\n return undefined\n}\n\n/** Whether `.npmrc` content has usable auth for the registry. */\nexport function hasRegistryAuth(content: string, registry: string, env: NodeJS.ProcessEnv = process.env) {\n return readRegistryAuth(content, registry, env) === 'valid'\n}\n\nlet npmrcCount = 0\n\ninterface NpmAuth {\n env: NodeJS.ProcessEnv\n source: 'npmrc' | 'oidc' | 'token'\n}\n\n/**\n * npm environment for one npm command: existing `.npmrc` auth, then npm trusted\n * publishing through GitHub Actions OIDC, then `NPM_TOKEN`. An OIDC token\n * authorizes one registry route, so every command exchanges its own.\n *\n * npm reads the project `.npmrc` before the user config, so a project\n * `_authToken=${NPM_TOKEN}` would win over a token in the user config. Both\n * files go into one temporary user config instead, the token last, and npm\n * runs outside the repository.\n */\nasync function createNpmEnv(environment: ReleaseEnvironment, name: string, registry: string, directory: string, skipOidc = false): Promise<NpmAuth> {\n const { project, user } = readNpmConfigs(environment.cwd, environment.env)\n const config = [user.trim(), project.trim()].filter(Boolean).join('\\n')\n const write = (content: string) => {\n const file = path.join(directory, `${name.replace(/[@/]/g, '_')}-${++npmrcCount}.npmrc`)\n fs.writeFileSync(file, `${content}\\n`, { mode: 0o600 })\n return { ...environment.env, NPM_CONFIG_USERCONFIG: file }\n }\n const existing = readRegistryAuth(project, registry, environment.env) ?? readRegistryAuth(user, registry, environment.env)\n if (existing === 'valid') return { env: write(config), source: 'npmrc' }\n\n const oidc = skipOidc ? undefined : await exchangeOidcToken(environment, name, registry)\n const token = oidc ?? environment.env.NPM_TOKEN\n if (!token) {\n throw new Error(`No npm auth for ${name}. Configure npm trusted publishing with \\`id-token: write\\`, set NPM_TOKEN, or add auth to .npmrc for ${registry}.`)\n }\n return { env: write(`${config}\\n${nerfDart(registry)}:_authToken=${token}`.trim()), source: oidc ? 'oidc' : 'token' }\n}\n\nfunction detectIndent(content: string) {\n return /^([ \\t]+)\"/m.exec(content)?.[1] ?? ' '\n}\n\nexport interface ReleaseManifestOptions {\n /** Names of the packages released together; their ranges must accept the release version. */\n internal?: string[]\n /** The root `repository`, written into a workspace package that has none, for npm provenance. */\n repository?: unknown\n}\n\n/** A range for `version` in the style of `range`: exact, `~`, or `^`. */\nfunction rangeFor(range: string, version: string) {\n if (semver.valid(range)) return version\n return range.trim().startsWith('~') ? `~${version}` : `^${version}`\n}\n\n/**\n * Writes the release version and git head into a package manifest. Versions are\n * never committed, so ranges on packages of the same release, such as `^0.0.0`,\n * are moved to the release version when they do not accept it.\n */\nexport function writeReleaseManifest(cwd: string, dir: string, version: string, gitHead: string, options: ReleaseManifestOptions = {}) {\n const file = path.join(cwd, dir, 'package.json')\n const content = fs.readFileSync(file, 'utf8').replace(/^\\uFEFF/, '')\n const manifest = JSON.parse(content) as PackageJson\n manifest.version = version\n manifest.gitHead = gitHead\n for (const field of dependencyFields) {\n const dependencies = manifest[field] as Record<string, string> | undefined\n for (const [name, range] of Object.entries(dependencies ?? {})) {\n if (!options.internal?.includes(name) || !semver.validRange(range)) continue\n if (!semver.satisfies(version, range, { includePrerelease: true })) dependencies![name] = rangeFor(range, version)\n }\n }\n if (dir !== '.' && !manifest.repository && options.repository) {\n const root = options.repository\n manifest.repository = typeof root === 'string'\n ? { type: 'git', url: root, directory: dir }\n : { ...root as Record<string, unknown>, directory: dir }\n }\n fs.writeFileSync(file, `${JSON.stringify(manifest, null, detectIndent(content))}\\n`)\n return manifest\n}\n\n/** Yarn 1 names the tarball with `--filename`; Yarn 2+ uses `--out`. */\nasync function isYarnClassic(environment: ReleaseEnvironment, env: NodeJS.ProcessEnv) {\n const declared = /^yarn@(\\d+)/.exec(String(readJson<PackageJson>(path.join(environment.cwd, 'package.json')).packageManager ?? ''))\n if (declared) return declared[1] === '1'\n const { stdout } = await environment.run('yarn', ['--version'], { cwd: environment.cwd, env })\n return stdout.trim().startsWith('1.')\n}\n\nasync function packCommand(environment: ReleaseEnvironment, packageManager: PackageManager, destination: string, env: NodeJS.ProcessEnv): Promise<[string, string[]]> {\n switch (packageManager) {\n case 'bun':\n return ['bun', ['pm', 'pack', '--destination', destination, '--quiet']]\n case 'pnpm':\n return ['pnpm', ['pack', '--pack-destination', destination]]\n case 'yarn':\n return ['yarn', ['pack', await isYarnClassic(environment, env) ? '--filename' : '--out', path.join(destination, 'package.tgz')]]\n default:\n return ['npm', ['pack', '--pack-destination', destination]]\n }\n}\n\n/** Reads `package/package.json` from a packed tarball. */\nexport function readPackedManifest(tarball: string): PackageJson {\n const archive = gunzipSync(fs.readFileSync(tarball))\n let offset = 0\n let longName: string | undefined\n while (offset + 512 <= archive.length) {\n const header = archive.subarray(offset, offset + 512)\n if (header.every((byte) => byte === 0)) break\n const field = (start: number, length: number) => header.subarray(start, start + length).toString('utf8').replace(/\\0.*$/s, '')\n const size = parseInt(field(124, 12).trim() || '0', 8)\n const type = field(156, 1)\n const prefix = field(345, 155)\n const name = longName ?? (prefix ? `${prefix}/${field(0, 100)}` : field(0, 100))\n const body = archive.subarray(offset + 512, offset + 512 + size)\n longName = undefined\n if (type === 'L') {\n longName = body.toString('utf8').replace(/\\0.*$/s, '')\n } else if (type === 'x') {\n const pathRecord = /\\d+ path=([^\\n]+)\\n/.exec(body.toString('utf8'))\n if (pathRecord) longName = pathRecord[1]\n } else if (name.replace(/^\\.\\//, '').split('/').slice(1).join('/') === 'package.json') {\n return JSON.parse(body.toString('utf8').replace(/^\\uFEFF/, '')) as PackageJson\n }\n offset += 512 + Math.ceil(size / 512) * 512\n }\n throw new Error(`${tarball} has no package.json.`)\n}\n\n/** Local protocols that only resolve inside the repository. */\nconst localProtocols = /^(?:workspace|file|link|portal|catalog):/\n\nfunction validatePackedManifest(manifest: PackageJson, pkg: ReleasePackage, version: string, gitHead: string, internal: string[]) {\n if (manifest.name !== pkg.name) throw new Error(`The tarball of ${pkg.dir} is ${manifest.name}, not ${pkg.name}.`)\n if (manifest.version !== version) throw new Error(`The tarball of ${pkg.name} has version ${manifest.version}, not ${version}.`)\n if (manifest.gitHead !== gitHead) throw new Error(`The tarball of ${pkg.name} has gitHead ${String(manifest.gitHead)}, not ${gitHead}.`)\n for (const field of dependencyFields) {\n for (const [name, range] of Object.entries((manifest[field] ?? {}) as Record<string, string>)) {\n if (localProtocols.test(range)) throw new Error(`The tarball of ${pkg.name} keeps \\`${name}: ${range}\\` in ${field}.`)\n if (internal.includes(name) && semver.validRange(range) && !semver.satisfies(version, range, { includePrerelease: true })) {\n throw new Error(`The tarball of ${pkg.name} has \\`${name}: ${range}\\` in ${field}, which does not accept the release version ${version}.`)\n }\n }\n }\n}\n\nasync function waitForVersion(environment: ReleaseEnvironment, registry: string, name: string, version: string) {\n for (let attempt = 1; attempt <= 30; attempt++) {\n const published = (await readPackument(environment, registry, name))?.versions?.[version]\n if (published) return published\n await environment.wait(10_000)\n }\n throw new Error(`${name}@${version} did not appear on ${registry}.`)\n}\n\nexport type GitHubReleaseAsset = ReleaseAsset\n\nexport interface GitHubRelease {\n tag: string\n notes: string\n prerelease: boolean\n /** The commit to tag when the tag does not exist on GitHub yet. */\n target?: string\n /** Whether the release becomes the repository's latest; defaults to every non-prerelease. */\n latest?: boolean\n /** Files to attach. A rerun uploads only the assets the release does not have yet. */\n assets?: GitHubReleaseAsset[]\n}\n\ninterface GitHubReleaseResponse {\n html_url?: string\n upload_url?: string\n assets?: Array<{ name: string }>\n}\n\nfunction fillAssetName(template: string, tag: string) {\n return template.replaceAll('{tag}', tag).replaceAll('{version}', tag.replace(/^v/, ''))\n}\n\n/** Resolves asset files and names, and fails before any GitHub write when a file is missing. */\nfunction resolveAssets(cwd: string, tag: string, assets: GitHubReleaseAsset[] = []) {\n const resolved = assets.map((asset) => {\n const file = path.resolve(cwd, asset.path)\n if (!fs.existsSync(file) || !fs.statSync(file).isFile()) throw new Error(`The GitHub release asset ${asset.path} does not exist.`)\n return {\n file,\n name: fillAssetName(asset.name ?? path.basename(file), tag),\n ...(asset.label ? { label: fillAssetName(asset.label, tag) } : {})\n }\n })\n const names = new Set<string>()\n for (const { name } of resolved) {\n if (names.has(name)) throw new Error(`Two GitHub release assets are named ${name}.`)\n names.add(name)\n }\n return resolved\n}\n\nasync function uploadAssets(environment: ReleaseEnvironment, release: GitHubReleaseResponse, assets: ReturnType<typeof resolveAssets>, headers: Record<string, string>) {\n if (!assets.length) return\n if (!release.upload_url) throw new Error('The GitHub release has no upload URL for its assets.')\n const uploadUrl = release.upload_url.replace(/\\{.*\\}$/, '')\n const existing = new Set((release.assets ?? []).map(({ name }) => name))\n for (const asset of assets) {\n if (existing.has(asset.name)) {\n environment.log(`✓ GitHub release asset ${asset.name} exists.`)\n continue\n }\n const query = `name=${encodeURIComponent(asset.name)}${asset.label ? `&label=${encodeURIComponent(asset.label)}` : ''}`\n const response = await environment.fetch(`${uploadUrl}?${query}`, {\n method: 'POST',\n headers: { ...headers, 'content-type': 'application/octet-stream' },\n body: fs.readFileSync(asset.file)\n })\n if (!response.ok) throw new Error(`Could not upload ${asset.name} to the GitHub release: ${response.status} ${await response.text()}`)\n environment.log(`✓ Uploaded ${asset.name}`)\n }\n}\n\n/** Cuts notes at a line to fit a GitHub release body, keeping the full changelog link. */\nexport function truncateNotes(notes: string, limit = releaseBodyLimit) {\n if (notes.length <= limit) return notes\n const footer = /\\n\\n(\\*\\*Full Changelog\\*\\*: \\S+)\\n?$/.exec(notes)?.[1]\n const note = `…the notes are too long for a GitHub release${footer ? '; see the full changelog' : ''}.`\n const tail = `\\n\\n${note}${footer ? `\\n\\n${footer}` : ''}\\n`\n const cut = notes.slice(0, Math.max(0, limit - tail.length))\n const end = cut.lastIndexOf('\\n')\n return `${(end > 0 ? cut.slice(0, end) : cut).trimEnd()}${tail}`\n}\n\n/** Creates the GitHub release of a tag unless it exists. Needs `GITHUB_TOKEN` and the repository. */\nexport async function publishGitHubRelease(environment: ReleaseEnvironment, release: GitHubRelease) {\n const token = environment.env.GITHUB_TOKEN ?? environment.env.GH_TOKEN\n const repositoryUrl = getRepositoryUrl(environment.cwd, environment.env)\n const repository = repositoryUrl?.replace(/^https?:\\/\\/[^/]+\\//, '')\n if (!token || !repository) {\n environment.log('! Skip the GitHub release: set GITHUB_TOKEN and a GitHub repository URL.')\n return undefined\n }\n const api = `${(environment.env.GITHUB_API_URL ?? 'https://api.github.com').replace(/\\/+$/, '')}/repos/${repository}/releases`\n const headers = {\n authorization: `Bearer ${token}`,\n accept: 'application/vnd.github+json',\n 'content-type': 'application/json',\n 'x-github-api-version': '2022-11-28'\n }\n const assets = resolveAssets(environment.cwd, release.tag, release.assets)\n const existing = await environment.fetch(`${api}/tags/${encodeURIComponent(release.tag)}`, { headers })\n if (existing.ok) {\n environment.log(`✓ GitHub release ${release.tag} exists.`)\n const found = await existing.json() as GitHubReleaseResponse\n await uploadAssets(environment, found, assets, headers)\n return found.html_url\n }\n if (existing.status !== 404) {\n throw new Error(`Could not check the GitHub release ${release.tag}: ${existing.status} ${await existing.text()}`)\n }\n const latest = release.latest ?? !release.prerelease\n const response = await environment.fetch(api, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n tag_name: release.tag,\n ...(release.target ? { target_commitish: release.target } : {}),\n name: release.tag,\n body: truncateNotes(release.notes),\n prerelease: release.prerelease,\n make_latest: latest ? 'true' : 'false'\n })\n })\n if (!response.ok) throw new Error(`Could not create the GitHub release ${release.tag}: ${response.status} ${await response.text()}`)\n const created = await response.json() as GitHubReleaseResponse\n environment.log(`✓ Created the GitHub release ${created.html_url ?? release.tag}.`)\n await uploadAssets(environment, created, assets, headers)\n return created.html_url\n}\n\nexport interface ReleaseOptions extends PlanReleaseOptions {\n /** Plans and prints the release without changing anything. */\n dryRun?: boolean\n}\n\nexport interface ReleaseResult {\n status: 'skipped' | 'none' | 'dry-run' | 'released' | 'resumed'\n plan: ReleasePlan\n}\n\nfunction describePlan(plan: ReleasePlan) {\n const range = plan.from ? `${plan.from}..${plan.head.slice(0, 9)}` : `all commits up to ${plan.head.slice(0, 9)}`\n return [\n `Branch: ${plan.branch}${plan.channel ? ` (npm dist-tag ${plan.channel.distTag})` : ''}`,\n `Mode: ${plan.mode}`,\n `Range: ${range}`,\n ...plan.commits.map((decision) => ` ${(decision.release || 'none').padEnd(5)} ${decision.hash?.slice(0, 9) ?? ''} ${decision.header}`),\n `Release: ${plan.release || 'none'}${plan.version ? ` → ${plan.version}` : ''}`,\n `Packages: ${plan.packages.map(({ name }) => name).join(', ') || 'none'}`\n ].join('\\n')\n}\n\n/** Whether a stable version is the highest stable version tagged in the repository. */\nasync function isLatestStable(environment: ReleaseEnvironment, version: string) {\n const versions = lines(await git(environment, ['tag', '--list', 'v*'])).flatMap((tag) => parseVersionTag(tag) ?? [])\n return !versions.some((other) => !semver.prerelease(other) && semver.gt(other, version))\n}\n\n/** Pushes a version tag without the repository's pre-push hooks, which would run after npm already published. */\nasync function pushTag(environment: ReleaseEnvironment, tag: string) {\n await git(environment, ['push', '--no-verify', 'origin', `refs/tags/${tag}`])\n}\n\n/** Finishes a release whose tag points at HEAD: pushes the tag and creates a missing GitHub release. */\nasync function resumeTaggedRelease(environment: ReleaseEnvironment, options: ReleaseOptions, plan: ReleasePlan) {\n const channel = plan.channel\n if (!channel) return false\n const tags = lines(await git(environment, ['tag', '--list', 'v*', '--points-at', 'HEAD']))\n const tag = tags.find((candidate) => {\n const version = parseVersionTag(candidate)\n if (!version) return false\n const prerelease = semver.prerelease(version)\n return channel.prerelease ? prerelease?.[0] === channel.prerelease : !prerelease\n })\n if (!tag || options.dryRun) return false\n // The tag's own version, so a later prerelease of the same version does not renumber it.\n const previous = await planRelease({ ...options, ignoreTags: [tag], version: parseVersionTag(tag)! }, environment)\n if (!previous.notes) return false\n environment.log(`${tag} points at HEAD; make sure the tag is pushed and its GitHub release exists.`)\n await pushTag(environment, tag)\n await publishGitHubRelease(environment, {\n tag,\n notes: previous.notes,\n prerelease: Boolean(channel.prerelease),\n target: plan.head,\n ...(plan.assets ? { assets: plan.assets } : {}),\n latest: !channel.prerelease && await isLatestStable(environment, previous.version!)\n })\n return true\n}\n\n/** The next version to try when one is taken: the next patch, or the next prerelease number. */\nfunction nextFreeVersion(version: string) {\n return semver.prerelease(version) ? semver.inc(version, 'prerelease')! : semver.inc(version, 'patch')!\n}\n\n/**\n * Releases the checked-out commit:\n *\n * 1. plan the version from the commits since the channel's last tag;\n * 2. write the version and git head into every published package and pack it;\n * 3. publish each package, in dependency order, on the `aronrepo-staging`\n * dist-tag, skipping versions already published from the same commit;\n * 4. wait until the registry serves every package, then move the channel's\n * dist-tag to the new version;\n * 5. push the version tag and create the GitHub release.\n *\n * Every step checks what an interrupted run already did, so rerunning the job\n * finishes a release instead of skipping or duplicating it.\n */\nexport async function runRelease(options: ReleaseOptions = {}, environmentOptions: Partial<ReleaseEnvironment> = {}): Promise<ReleaseResult> {\n const environment = createEnvironment(environmentOptions)\n const { cwd, log } = environment\n const plan = await planRelease(options, environment)\n log(describePlan(plan))\n\n if (!plan.channel) {\n log(`Branch ${plan.branch} does not release. Release branches: main, alpha, beta, rc, canary.`)\n return { status: 'skipped', plan }\n }\n if (!plan.version || !plan.tag || !plan.notes) {\n if (await resumeTaggedRelease(environment, options, plan)) return { status: 'resumed', plan }\n log('No release.')\n return { status: 'none', plan }\n }\n if (!plan.packages.length) throw new Error('No published package found. Add `\"publishConfig\": { \"access\": \"public\" }` to the packages that ship.')\n for (const pkg of plan.packages) {\n if (pkg.name.startsWith('@') && !pkg.manifest.publishConfig?.access) {\n throw new Error(`${pkg.name} is scoped, and npm publishes scoped packages as restricted by default. Set \\`publishConfig.access\\` in ${pkg.dir}/package.json.`)\n }\n }\n\n const dirty = await git(environment, ['status', '--porcelain'])\n const existingTag = await git(environment, ['tag', '--list', plan.tag])\n if (existingTag && await gitSucceeds(environment, ['merge-base', '--is-ancestor', 'HEAD', plan.tag])) {\n log(`${plan.tag} is on a newer commit of ${plan.branch}; this commit is already released.`)\n return { status: 'none', plan }\n }\n if (options.dryRun) {\n try {\n resolveAssets(cwd, plan.tag, plan.assets)\n } catch (error) {\n log(`! ${(error as Error).message} A release would stop here.`)\n }\n if (dirty) log('! The working tree has changes; a release would stop here.')\n if (existingTag) log(`! ${plan.tag} exists but is not reachable from ${plan.branch}; a release would stop here.`)\n log(`\\nDry run: would publish ${plan.tag} on ${plan.channel.distTag}.\\n\\n${plan.notes}`)\n return { status: 'dry-run', plan }\n }\n if (dirty) throw new Error('The working tree has changes. Release from a clean checkout.')\n if (existingTag) throw new Error(`${plan.tag} exists but is not reachable from ${plan.branch}.`)\n // A missing asset would fail the GitHub release after npm already published.\n resolveAssets(cwd, plan.tag, plan.assets)\n\n const npmrc = (() => {\n const { project, user } = readNpmConfigs(cwd, environment.env)\n return `${user}\\n${project}`\n })()\n const registryOf = (pkg: ReleasePackage) => getRegistry(pkg.manifest, environment.env, npmrc)\n\n // A version published from another commit without its tag comes from an interrupted\n // release; npm never reuses a version, so this release takes the next free one.\n let version = plan.version\n for (let attempt = 0; ; attempt++) {\n const taken: string[] = []\n for (const pkg of plan.packages) {\n const published = (await readPackument(environment, registryOf(pkg), pkg.name))?.versions?.[version]\n if (!published || published.gitHead === plan.head) continue\n if (!published.gitHead) {\n throw new Error(`${pkg.name}@${version} is already published without a gitHead, so aronrepo cannot tell which commit it came from. Tag that commit ${toVersionTag(version)}, or publish a newer version.`)\n }\n taken.push(`${pkg.name}@${version} (${published.gitHead.slice(0, 9)})`)\n }\n if (!taken.length) break\n if (attempt >= 20 || await git(environment, ['tag', '--list', toVersionTag(nextFreeVersion(version))])) {\n throw new Error(`${taken.join(', ')} is already published from another commit, not ${plan.head}.`)\n }\n const next = nextFreeVersion(version)\n log(`! ${taken.join(', ')} is already published from another commit without a ${toVersionTag(version)} tag; releasing ${next} instead.`)\n version = next\n }\n if (version !== plan.version) {\n plan.version = version\n plan.tag = toVersionTag(version)\n plan.notes = renderPlanNotes(environment, plan, version, options.date)\n }\n const { tag, notes, channel } = { tag: plan.tag, notes: plan.notes, channel: plan.channel }\n\n for (const pkg of plan.packages) {\n const packument = await readPackument(environment, registryOf(pkg), pkg.name)\n const current = packument?.['dist-tags']?.[channel.distTag]\n if (current && semver.valid(current) && semver.gt(current, version)) {\n throw new Error(`${pkg.name} has ${current} on ${channel.distTag}, newer than ${version}. Tag the commit of ${current} as ${toVersionTag(current)} so releases continue from it.`)\n }\n if (!packument && channel.prerelease) {\n log(`! ${pkg.name} is new; npm also points \\`latest\\` at its first version, ${version}.`)\n }\n }\n\n const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'aronrepo-release-'))\n const manifests = new Map(plan.packages.map(({ dir }) => {\n const file = path.join(cwd, dir, 'package.json')\n return [file, fs.readFileSync(file, 'utf8')]\n }))\n let restored = false\n const restore = () => {\n if (restored) return\n restored = true\n fs.rmSync(directory, { recursive: true, force: true })\n // Versions live in tags and on the registry, not in the repository.\n for (const [file, content] of manifests) fs.writeFileSync(file, content)\n }\n // A cancelled job still restores the manifests and removes the temporary npm configs with tokens.\n const onSignal = (signal: NodeJS.Signals) => {\n restore()\n process.kill(process.pid, signal)\n }\n process.once('SIGINT', onSignal)\n process.once('SIGTERM', onSignal)\n\n const runNpm = async (pkg: ReleasePackage, args: string[]) => {\n const registry = registryOf(pkg)\n const command = [...args, '--registry', registry]\n const auth = await createNpmEnv(environment, pkg.name, registry, directory)\n try {\n return await environment.run('npm', command, { cwd: directory, env: auth.env })\n } catch (error) {\n // A trusted publisher without dist-tag permission rejects `npm dist-tag`; NPM_TOKEN may still have it.\n if (auth.source !== 'oidc' || !environment.env.NPM_TOKEN) throw error\n log(`! \\`npm ${args[0]}\\` failed with the trusted publishing token; retrying with NPM_TOKEN.`)\n const fallback = await createNpmEnv(environment, pkg.name, registry, directory, true)\n return await environment.run('npm', command, { cwd: directory, env: fallback.env })\n }\n }\n\n try {\n const packageManager = detectPackageManager(cwd)\n const internal = plan.packages.map(({ name }) => name)\n const repository = (() => {\n const root = path.join(cwd, 'package.json')\n return fs.existsSync(root) ? readJson<PackageJson>(root).repository : undefined\n })()\n // Every version must be written before packing, so workspace ranges resolve to it.\n for (const pkg of plan.packages) {\n pkg.manifest = writeReleaseManifest(cwd, pkg.dir, version, plan.head, { internal, repository })\n }\n\n const packEnv = withoutSecrets(environment.env)\n const tarballs = new Map<string, string>()\n for (const [index, pkg] of plan.packages.entries()) {\n const destination = path.join(directory, String(index))\n fs.mkdirSync(destination)\n const [command, args] = await packCommand(environment, packageManager, destination, packEnv)\n await environment.run(command, args, { cwd: path.join(cwd, pkg.dir), env: packEnv })\n const tarball = fs.readdirSync(destination).find((file) => file.endsWith('.tgz'))\n if (!tarball) throw new Error(`Packing ${pkg.name} produced no tarball.`)\n const file = path.join(destination, tarball)\n validatePackedManifest(readPackedManifest(file), pkg, version, plan.head, internal)\n tarballs.set(pkg.name, file)\n log(`✓ Packed ${pkg.name}@${version}`)\n }\n\n for (const pkg of plan.packages) {\n const registry = registryOf(pkg)\n const isPublished = async () => (await readPackument(environment, registry, pkg.name))?.versions?.[version]?.gitHead === plan.head\n if (await isPublished()) {\n log(`✓ ${pkg.name}@${version} is already published from this commit.`)\n continue\n }\n const args = ['publish', tarballs.get(pkg.name)!, '--tag', stagingDistTag]\n if (pkg.manifest.publishConfig?.access) args.push('--access', String(pkg.manifest.publishConfig.access))\n if (pkg.manifest.publishConfig?.provenance) args.push('--provenance')\n try {\n await runNpm(pkg, args)\n } catch (error) {\n // A stale registry cache can hide a version that an earlier run published; npm then refuses to publish over it.\n await environment.wait(5_000)\n if (!await isPublished()) throw error\n log(`✓ ${pkg.name}@${version} was already published from this commit.`)\n continue\n }\n log(`✓ Published ${pkg.name}@${version} on ${stagingDistTag}`)\n }\n\n for (const pkg of plan.packages) {\n const registry = registryOf(pkg)\n const published = await waitForVersion(environment, registry, pkg.name, version)\n if (pkg.manifest.publishConfig?.provenance && !published.dist?.attestations) {\n log(`! ${pkg.name}@${version} has no provenance attestation on ${registry}.`)\n }\n }\n\n for (const pkg of plan.packages) {\n const tags = (await readPackument(environment, registryOf(pkg), pkg.name))?.['dist-tags'] ?? {}\n if (tags[channel.distTag] !== version) {\n await runNpm(pkg, ['dist-tag', 'add', `${pkg.name}@${version}`, channel.distTag])\n }\n if (tags[stagingDistTag]) {\n await runNpm(pkg, ['dist-tag', 'rm', pkg.name, stagingDistTag])\n .catch((error: Error) => log(`! Could not remove the ${stagingDistTag} dist-tag of ${pkg.name}: ${error.message}`))\n }\n log(`✓ ${pkg.name}@${version} is on ${channel.distTag}`)\n }\n } finally {\n process.removeListener('SIGINT', onSignal)\n process.removeListener('SIGTERM', onSignal)\n restore()\n }\n\n // A signing config would open an editor or fail after npm already published.\n await git(environment, ['-c', 'tag.gpgSign=false', 'tag', tag, plan.head])\n await pushTag(environment, tag)\n log(`✓ Pushed ${tag}`)\n\n await publishGitHubRelease(environment, {\n tag,\n notes,\n prerelease: Boolean(channel.prerelease),\n target: plan.head,\n ...(plan.assets ? { assets: plan.assets } : {}),\n latest: !channel.prerelease && await isLatestStable(environment, version)\n })\n return { status: 'released', plan }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport {\n agentsBlockEnd,\n agentsBlockStart,\n commits,\n getBaseTag,\n getNextVersion,\n getReleaseChannel,\n getReleaseType,\n legacyCommits,\n defaultReleasePathExcludes,\n getAgentCommitPolicy,\n getReleaseTable,\n parseCommit,\n renderAgentsBlock,\n resolveCommitRelease,\n resolveRelease,\n toVersionTag,\n type CommitDecision,\n type CommitViolation,\n type ReleaseMode\n} from './index'\nimport {\n detectPackageManager,\n getCliCommand,\n getCommitFiles,\n getCurrentBranch,\n getDiffFiles,\n getGitConfig,\n getRangeCommits,\n getRepositoryRoot,\n getStagedFiles,\n getVersionTags,\n loadProjectPolicy,\n readJsonFile,\n type PackageManager,\n type ProjectPolicy\n} from './project'\nimport { getReleasePackages, planRelease, runRelease, type ReleasePlan } from './release'\n\nexport interface CommandResult {\n code: number\n output: string\n}\n\nexport interface CommonOptions {\n /** Repository root. Defaults to the root of the git repository around the current directory. */\n cwd?: string\n mode?: ReleaseMode\n json?: boolean\n}\n\nfunction resolveCwd(options: CommonOptions) {\n return options.cwd ? path.resolve(options.cwd) : getRepositoryRoot(process.cwd())\n}\n\nfunction usage(message: string): CommandResult {\n return { code: 2, output: message }\n}\n\n// Messages that git, GitHub, GitLab, or Bitbucket write for you, in their exact formats.\nconst ignoredMessagePatterns = [\n /^Merge pull request #\\d+ from \\S+/,\n /^Merge (?:branch|branches|remote-tracking branch|tag|commit) '[^']+'/,\n /^Merge [0-9a-f]{7,40}(?: into \\S+)?$/,\n /^Merged in \\S+ \\(pull request #\\d+\\)/,\n /^Automatic merge from /,\n /^Auto-merged \\S+ into \\S+/,\n /^(?:fixup|squash|amend)! /,\n /^Initial commit$/\n]\n\nexport function isIgnoredMessage(message: string) {\n const header = message.trim().split('\\n')[0] ?? ''\n return ignoredMessagePatterns.some((pattern) => pattern.test(header))\n}\n\nfunction escapeRegExp(text: string) {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/**\n * A commit message file without git's comments and, with `git commit -v`,\n * without the diff below the scissors line. `commentChar` is git's\n * `core.commentChar`; `auto` falls back to `#`.\n */\nexport function readEditMessage(file: string, commentChar = '#') {\n const comment = commentChar && commentChar !== 'auto' ? commentChar : '#'\n return fs.readFileSync(file, 'utf8')\n .replace(/^\\uFEFF/, '')\n .replace(/\\r\\n/g, '\\n')\n .split(new RegExp(`^${escapeRegExp(comment)} -+ >8 -+$`, 'm'))[0]\n .split('\\n')\n .filter((line) => !line.startsWith(comment))\n .join('\\n')\n .trim()\n}\n\nasync function project(cwd: string, options: CommonOptions): Promise<ProjectPolicy> {\n return loadProjectPolicy(cwd, options.mode ? { mode: options.mode } : {})\n}\n\nfunction isError(violation: CommitViolation) {\n return (violation.severity ?? 'error') === 'error'\n}\n\nfunction formatViolation(violation: CommitViolation) {\n return ` ${isError(violation) ? '✗' : '!'} ${violation.message}${violation.suggestion ? `\\n Suggested header: ${violation.suggestion}` : ''}`\n}\n\nfunction formatDecision(decision: CommitDecision) {\n const hash = decision.hash ? `${decision.hash.slice(0, 9)} ` : ''\n return `${hash}${(decision.release || 'none').padEnd(5)} ${decision.header}\\n${decision.reasons.map((reason) => ` ${reason}`).join('\\n')}`\n}\n\n/** Repository-relative POSIX paths, as git prints them. */\nfunction normalizeFiles(files: string[], cwd: string) {\n return files.map((file) => {\n const relative = path.isAbsolute(file) ? path.relative(cwd, file) : file\n return relative.replace(/\\\\/g, '/').replace(/^(?:\\.\\/)+/, '')\n })\n}\n\nexport interface CheckOptions extends CommonOptions {\n /** Commit message file, as passed to a commit-msg hook, relative to `cwd`. Uses staged files. */\n edit?: string\n /** Commit message text. Uses staged files unless `files` is set. */\n message?: string\n /** PR title, checked against the `base...head` diff. */\n title?: string\n base?: string\n head?: string\n /** Commit range, checked commit by commit with each commit's own files. */\n from?: string\n to?: string\n files?: string[]\n}\n\nexport async function check(options: CheckOptions): Promise<CommandResult> {\n const modes = [\n options.edit !== undefined && '--edit',\n options.message !== undefined && '--message',\n options.title !== undefined && '--title',\n options.from !== undefined && '--from'\n ].filter(Boolean)\n if (!modes.length) return usage('Pass --edit <file>, --message <text>, --title <text>, or --from <ref>.')\n if (modes.length > 1) return usage(`Pass only one of ${modes.join(', ')}.`)\n if (options.to !== undefined && options.from === undefined) return usage('--to needs --from.')\n if ((options.base !== undefined || options.head !== undefined) && options.title === undefined) return usage('--base and --head only apply to --title.')\n if ((options.base === undefined) !== (options.head === undefined)) return usage('Pass --base and --head together.')\n if (options.files && options.from !== undefined) return usage('--files does not apply to --from; each commit has its own files.')\n\n const cwd = resolveCwd(options)\n const { policy, isReleasePath } = await project(cwd, options)\n const pathOptions = isReleasePath ? { isReleasePath } : {}\n const files = options.files && normalizeFiles(options.files, cwd)\n const notes: string[] = []\n let entries: Array<{ message: string, hash?: string, files?: string[], label: string, ignorable: boolean }>\n\n if (options.title !== undefined) {\n const diff = files ?? (options.base && options.head ? getDiffFiles(cwd, options.base, options.head) : undefined)\n if (!diff && isReleasePath) notes.push('! Release paths are not checked; pass --base and --head, or --files.')\n // A squash merge turns the title into a commit header, so git's own messages are no excuse here.\n entries = [{ message: options.title, ...(diff ? { files: diff } : {}), label: 'PR title', ignorable: false }]\n } else if (options.edit !== undefined || options.message !== undefined) {\n let message = options.message ?? ''\n if (options.edit !== undefined) {\n message = readEditMessage(path.resolve(cwd, options.edit), getGitConfig(cwd, 'core.commentChar'))\n // git aborts a commit with an empty message after the hook; let it.\n if (!message) return { code: 0, output: 'The commit message is empty; git aborts the commit.' }\n }\n let changed = files ?? getStagedFiles(cwd)\n // `git commit --amend` with nothing staged and a reword in `git rebase -i` keep the files of HEAD.\n if (!changed.length && !files && options.edit !== undefined) {\n try {\n changed = getCommitFiles(cwd, 'HEAD')\n } catch {\n changed = []\n }\n }\n entries = [{ message, files: changed, label: 'Commit message', ignorable: true }]\n } else {\n entries = getRangeCommits(cwd, options.from, options.to ?? 'HEAD')\n .map((commit) => ({ ...commit, label: commit.hash.slice(0, 9), ignorable: true }))\n }\n\n const results = entries\n .filter(({ message, ignorable }) => !ignorable || !isIgnoredMessage(message))\n .map((entry) => ({\n entry,\n decision: resolveCommitRelease(parseCommit(entry.message, entry.hash), policy, {\n ...pathOptions,\n ...(entry.files ? { files: entry.files } : {})\n })\n }))\n const failures = results.filter(({ decision }) => decision.violations.some(isError))\n\n if (options.json) {\n return {\n code: failures.length ? 1 : 0,\n output: JSON.stringify({\n mode: policy.mode,\n results: results.map(({ entry, decision }) => ({ label: entry.label, ...decision })),\n ...(notes.length ? { notes } : {})\n }, null, 2)\n }\n }\n if (!failures.length) {\n return {\n code: 0,\n output: [\n ...results.map(({ entry, decision }) => [\n `✓ ${entry.label}: ${decision.release || 'none'} ← ${decision.header}`,\n ...decision.violations.map(formatViolation)\n ].join('\\n')),\n ...notes,\n `${results.length} ${results.length === 1 ? 'header follows' : 'headers follow'} the Aronrepo ${policy.mode} release policy.`\n ].join('\\n')\n }\n }\n return {\n code: 1,\n output: [\n ...failures.map(({ entry, decision }) => `${entry.label}: ${decision.header}\\n${decision.violations.map(formatViolation).join('\\n')}`),\n ...notes,\n '',\n 'Run `aronrepo policy` to see which types release and which paths ship.'\n ].join('\\n')\n }\n}\n\nexport interface ExplainOptions extends CommonOptions {\n from?: string\n to?: string\n}\n\nexport async function explain(options: ExplainOptions): Promise<CommandResult> {\n const cwd = resolveCwd(options)\n const { policy, isReleasePath, releasePaths } = await project(cwd, options)\n let plan: Pick<ReleasePlan, 'release' | 'commits'> & Partial<ReleasePlan>\n let from: string | undefined\n let to = options.to ?? 'HEAD'\n\n if (options.from === undefined && options.to === undefined) {\n // The release range of the branch, or of main when the branch does not release.\n plan = await planRelease({ fallbackToMain: true, ...(options.mode ? { mode: options.mode } : {}) }, { cwd })\n from = plan.from\n to = 'HEAD'\n } else {\n // The channel's base tag before `to`, so a tag on `to` itself is explained instead of skipped.\n const channel = getReleaseChannel(getCurrentBranch(cwd)) ?? getReleaseChannel('main')!\n const reachable = getVersionTags(cwd, `${to}^`)\n from = options.from ?? getBaseTag(channel, reachable)\n const decision = resolveRelease(getRangeCommits(cwd, from, to), policy, isReleasePath ? { isReleasePath } : {})\n const version = decision.release && options.from === undefined\n ? getNextVersion(channel, decision.release, { reachable, all: getVersionTags(cwd) })\n : undefined\n plan = { ...decision, channel, ...(version ? { version, tag: toVersionTag(version) } : {}) }\n }\n\n if (options.json) {\n return {\n code: 0,\n output: JSON.stringify({\n mode: policy.mode,\n ...(plan.branch ? { branch: plan.branch } : {}),\n ...(plan.channel ? { channel: plan.channel } : {}),\n from: from ?? null,\n to,\n releasePaths: releasePaths ?? null,\n release: plan.release,\n version: plan.version ?? null,\n tag: plan.tag ?? null,\n commits: plan.commits\n }, null, 2)\n }\n }\n return {\n code: 0,\n output: [\n `Range: ${from ? `${from}..${to}` : `all commits up to ${to}`}`,\n `Mode: ${policy.mode}`,\n ...(plan.channel ? [`Channel: ${plan.channel.branch} (npm dist-tag ${plan.channel.distTag})`] : []),\n `Release paths: ${releasePaths?.include ? releasePaths.include.join(', ') : 'every path'}`,\n '',\n ...(plan.commits.length ? plan.commits.map(formatDecision) : ['No commits.']),\n '',\n `Next release: ${plan.release || 'none'}${plan.version ? ` (${plan.version})` : ''}`\n ].join('\\n')\n }\n}\n\nexport interface ReleaseCommandOptions extends CommonOptions {\n dryRun?: boolean\n branch?: string\n /** Receives progress lines; defaults to stdout. JSON output stays quiet. */\n log?: (message: string) => void\n}\n\nexport async function release(options: ReleaseCommandOptions): Promise<CommandResult> {\n const cwd = resolveCwd(options)\n const result = await runRelease({\n ...(options.mode ? { mode: options.mode } : {}),\n ...(options.branch ? { branch: options.branch } : {}),\n ...(options.dryRun ? { dryRun: true } : {})\n }, { cwd, log: options.json ? () => {} : options.log ?? ((message) => console.log(message)) })\n if (!options.json) return { code: 0, output: '' }\n const { packages, ...plan } = result.plan\n return {\n code: 0,\n output: JSON.stringify({ status: result.status, ...plan, packages: packages.map(({ dir, name }) => ({ dir, name })) }, null, 2)\n }\n}\n\nexport async function policy(options: CommonOptions & { markdown?: boolean }): Promise<CommandResult> {\n if (options.json && options.markdown) return usage('Pass --json or --markdown, not both.')\n const cwd = resolveCwd(options)\n const resolved = await project(cwd, options)\n if (options.markdown) {\n return { code: 0, output: renderAgentsBlock(resolved.policy, { cli: resolved.cli, ...(resolved.releasePaths ? { releasePaths: resolved.releasePaths } : {}) }) }\n }\n const table = getReleaseTable(resolved.policy)\n const data = {\n mode: resolved.policy.mode,\n configFile: resolved.configFile ? path.relative(resolved.cwd, resolved.configFile) : null,\n releasePaths: resolved.releasePaths ?? null,\n // Plain names for machines; the Markdown backticks are for people.\n releaseTable: Object.fromEntries(Object.entries(table).map(([level, rules]) => [level, rules.map((rule) => rule.replace(/`/g, ''))])),\n types: commits.map(({ type, scope, description, group }) => ({\n type,\n ...(scope ? { scope } : {}),\n release: getReleaseType(type, scope, resolved.policy) ?? false,\n description,\n ...(group ? { group } : {})\n })),\n legacyTypes: legacyCommits,\n agent: getAgentCommitPolicy(resolved.policy, { cli: resolved.cli })\n }\n if (options.json) return { code: 0, output: JSON.stringify(data, null, 2) }\n return {\n code: 0,\n output: [\n `Mode: ${data.mode}${data.configFile ? ` (${data.configFile})` : ' (default; no aronrepo.config.js)'}`,\n `Release paths: ${data.releasePaths?.include ? data.releasePaths.include.join(', ') : 'every path'}`,\n ...(data.releasePaths?.include ? [`Excluded: ${(data.releasePaths.exclude ?? defaultReleasePathExcludes).join(', ')}`] : []),\n '',\n `Major: ${table.major.join(', ') || '-'}`,\n `Minor: ${table.minor.join(', ') || '-'}`,\n `Patch: ${table.patch.join(', ') || '-'}`,\n `None: ${table.none.join(', ') || '-'}`,\n '',\n ...data.agent.ownerDecisions.map((rule) => `- ${rule}`)\n ].join('\\n')\n }\n}\n\n/** Where the generated block is, `undefined` when there is none; throws when its markers are broken. */\nfunction findAgentsBlock(content: string) {\n const start = content.indexOf(agentsBlockStart)\n const firstEnd = content.indexOf(agentsBlockEnd)\n if (start === -1 && firstEnd === -1) return undefined\n const end = start === -1 ? -1 : content.indexOf(agentsBlockEnd, start)\n if (start === -1 || end === -1 || firstEnd < start) {\n throw new Error(`The Aronrepo commit policy markers are out of order. Keep one ${agentsBlockStart} followed by one ${agentsBlockEnd}.`)\n }\n if (content.indexOf(agentsBlockStart, start + 1) !== -1 || content.indexOf(agentsBlockEnd, end + 1) !== -1) {\n throw new Error('The Aronrepo commit policy block appears more than once. Keep one block.')\n }\n return { start, end: end + agentsBlockEnd.length }\n}\n\nexport function replaceAgentsBlock(content: string, block: string) {\n const found = findAgentsBlock(content)\n if (found) return content.slice(0, found.start) + block + content.slice(found.end)\n return `${content.trimEnd()}${content.trim() ? '\\n\\n' : ''}${block}\\n`\n}\n\nexport function readAgentsBlock(content: string) {\n try {\n const found = findAgentsBlock(content)\n return found ? content.slice(found.start, found.end) : undefined\n } catch {\n return undefined\n }\n}\n\nexport async function agents(options: CommonOptions & { file?: string, write?: boolean }): Promise<CommandResult> {\n const cwd = resolveCwd(options)\n const resolved = await project(cwd, options)\n const file = path.resolve(cwd, options.file ?? 'AGENTS.md')\n const relative = path.relative(cwd, file)\n const block = renderAgentsBlock(resolved.policy, { cli: resolved.cli, ...(resolved.releasePaths ? { releasePaths: resolved.releasePaths } : {}) })\n const raw = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : ''\n // A Windows checkout may have CRLF line endings; compare without them and keep them on write.\n const eol = raw.includes('\\r\\n') ? '\\r\\n' : '\\n'\n const content = raw.replace(/\\r\\n/g, '\\n')\n const result = (code: number, status: string, message: string): CommandResult => ({\n code,\n output: options.json ? JSON.stringify({ file: relative, status }, null, 2) : message\n })\n\n if (options.write) {\n const next = replaceAgentsBlock(content || '# Agent Guide\\n', block)\n if (next === content) return result(0, 'current', `✓ ${relative} is up to date.`)\n fs.mkdirSync(path.dirname(file), { recursive: true })\n fs.writeFileSync(file, eol === '\\n' ? next : next.replace(/\\n/g, eol))\n return result(0, 'written', `✓ Wrote the Aronrepo commit policy block to ${relative}.`)\n }\n const current = readAgentsBlock(content)\n if (current === block) return result(0, 'current', `✓ ${relative} has the current Aronrepo commit policy block.`)\n return result(1, current ? 'outdated' : 'missing', `✗ ${relative} ${current ? 'has an outdated' : 'is missing the'} Aronrepo commit policy block. Run \\`${resolved.cli} agents --write\\`.`)\n}\n\ninterface DoctorCheck {\n status: 'pass' | 'warn' | 'fail'\n message: string\n fix?: string\n}\n\nfunction findFile(cwd: string, names: string[]) {\n return names.map((name) => path.join(cwd, name)).find((file) => fs.existsSync(file))\n}\n\nfunction readText(file: string | undefined) {\n return file ? fs.readFileSync(file, 'utf8') : ''\n}\n\nconst legacyDependencies = [\n 'semantic-release',\n '@commitlint/cli',\n '@aronrepo/commitlint-config',\n '@aronrepo/conventional-changelog-config',\n '@aronrepo/semantic-release-config',\n '@aronrepo/semantic-release-pnpm'\n]\n\nconst legacyConfigFiles = [\n 'release.config.js', 'release.config.mjs', 'release.config.cjs', '.releaserc', '.releaserc.js', '.releaserc.mjs', '.releaserc.json',\n 'commitlint.config.js', 'commitlint.config.mjs', 'commitlint.config.ts', '.commitlintrc', '.commitlintrc.js', '.commitlintrc.mjs', '.commitlintrc.json'\n]\n\nfunction installCommand(packageManager: PackageManager) {\n return {\n bun: 'bun add -d aronrepo',\n pnpm: 'pnpm add -D aronrepo',\n yarn: 'yarn add -D aronrepo',\n npm: 'npm install -D aronrepo'\n }[packageManager]\n}\n\nexport async function doctor(options: CommonOptions): Promise<CommandResult> {\n const cwd = resolveCwd(options)\n const checks: DoctorCheck[] = []\n let resolved: ProjectPolicy | undefined\n // An invalid package.json is reported below; fall back to npm for the hints.\n const packageManager = (() => {\n try {\n return detectPackageManager(cwd)\n } catch {\n return 'npm'\n }\n })()\n const cli = getCliCommand(packageManager)\n\n try {\n resolved = await project(cwd, options)\n checks.push(resolved.configFile\n ? { status: 'pass', message: `Release mode ${resolved.policy.mode} from ${path.relative(cwd, resolved.configFile)}.` }\n : {\n status: 'warn',\n message: `No aronrepo.config.js; using the default ${resolved.policy.mode} mode.`,\n fix: 'Ask the repository owner whether releases are explicit (owner-controlled) or auto, then create aronrepo.config.js with `release.mode`.'\n })\n } catch (error) {\n checks.push({ status: 'fail', message: `The Aronrepo config failed to load: ${(error as Error).message}` })\n }\n\n if (resolved) {\n checks.push(resolved.releasePaths?.include\n ? { status: 'pass', message: `Release paths: ${resolved.releasePaths.include.join(', ')}.` }\n : {\n status: 'warn',\n message: 'No published package found; every path can release a version.',\n fix: 'Set `release.paths.include` in aronrepo.config.js, or add `publishConfig.access: \"public\"` to published packages.'\n })\n }\n\n let pkg: Record<string, unknown> = {}\n try {\n const file = findFile(cwd, ['package.json'])\n if (file) pkg = readJsonFile<Record<string, unknown>>(file)\n } catch (error) {\n checks.push({ status: 'fail', message: (error as Error).message })\n }\n const dependencies = { ...pkg.dependencies as Record<string, string>, ...pkg.devDependencies as Record<string, string> }\n checks.push(dependencies.aronrepo\n ? { status: 'pass', message: 'aronrepo is installed.' }\n : { status: 'fail', message: 'aronrepo is not a dependency.', fix: `Install it as a dev dependency: \\`${installCommand(packageManager)}\\`.` })\n\n const leftovers = [\n ...legacyDependencies.filter((name) => dependencies[name]),\n ...legacyConfigFiles.filter((name) => fs.existsSync(path.join(cwd, name)))\n ]\n checks.push(leftovers.length\n ? {\n status: 'warn',\n message: `Leftovers from semantic-release or commitlint: ${leftovers.join(', ')}.`,\n fix: 'Remove them; `aronrepo check` lints commits and `aronrepo release` publishes releases.'\n }\n : { status: 'pass', message: 'No semantic-release or commitlint leftovers.' })\n\n try {\n const releasePackages = getReleasePackages(cwd)\n // `aronrepo release` writes the root repository into workspace packages, so either one is enough.\n const withoutRepository = releasePackages.filter(({ manifest }) => manifest.publishConfig?.provenance && !manifest.repository && !pkg.repository)\n checks.push(!releasePackages.length\n ? { status: 'warn', message: '`aronrepo release` finds no published package.', fix: 'Add `\"publishConfig\": { \"access\": \"public\" }` to each package that ships.' }\n : withoutRepository.length\n ? { status: 'warn', message: `npm provenance needs a \\`repository\\` field: ${withoutRepository.map(({ name }) => name).join(', ')}.`, fix: 'Add `repository` to the root package.json.' }\n : { status: 'pass', message: `\\`aronrepo release\\` publishes ${releasePackages.map(({ name }) => name).join(', ')}.` })\n } catch (error) {\n checks.push({ status: 'fail', message: (error as Error).message })\n }\n\n const hookFile = findFile(cwd, ['.husky/commit-msg'])\n const hook = readText(hookFile).split(/\\r?\\n/).filter((line) => !line.trim().startsWith('#')).join('\\n')\n const hooksPath = getGitConfig(cwd, 'core.hooksPath')\n if (!hook.includes('aronrepo check')) {\n checks.push({ status: 'warn', message: 'No commit-msg hook runs `aronrepo check`.', fix: `Add .husky/commit-msg with \\`${cli} check --edit \"$1\"\\`.` })\n } else if (!hooksPath?.replace(/\\\\/g, '/').startsWith('.husky')) {\n checks.push({ status: 'warn', message: '.husky/commit-msg is not installed; git does not run it.', fix: 'Run `husky` once, for example from the `prepare` script, to set `core.hooksPath`.' })\n } else {\n checks.push({ status: 'pass', message: '.husky/commit-msg runs aronrepo check.' })\n }\n\n // The policy block needs the config; a broken config is already reported above.\n if (resolved) {\n const agentsResult = await agents({ ...options, cwd, json: false })\n checks.push(agentsResult.code === 0\n ? { status: 'pass', message: 'AGENTS.md has the current commit policy block.' }\n : { status: 'fail', message: agentsResult.output.replace(/^✗ /, '').replace(/ Run `.*`\\.$/, ''), fix: `${resolved.cli} agents --write` })\n }\n\n const failed = checks.some(({ status }) => status === 'fail')\n if (options.json) return { code: failed ? 1 : 0, output: JSON.stringify({ ok: !failed, checks }, null, 2) }\n const icon = { pass: '✓', warn: '!', fail: '✗' }\n return {\n code: failed ? 1 : 0,\n output: [\n ...checks.map(({ status, message, fix }) => `${icon[status]} ${message}${fix ? `\\n Fix: ${fix}` : ''}`),\n '',\n failed ? 'Aronrepo setup is incomplete.' : 'Aronrepo setup is complete.'\n ].join('\\n')\n }\n}\n"],"mappings":"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"}
@@ -60,9 +60,20 @@ interface ReleasePathsConfig {
60
60
  /** Globs removed from `include`. Defaults to `defaultReleasePathExcludes`. */
61
61
  exclude?: string[];
62
62
  }
63
+ /** A file attached to every GitHub release. */
64
+ interface ReleaseAsset {
65
+ /** File to upload, relative to the repository root. */
66
+ path: string;
67
+ /** Asset name on the release; defaults to the file name. `{tag}` and `{version}` are replaced. */
68
+ name?: string;
69
+ /** Text shown for the asset instead of its name. `{tag}` and `{version}` are replaced. */
70
+ label?: string;
71
+ }
63
72
  interface AronrepoConfig {
64
73
  release?: {
65
74
  mode?: ReleaseMode;
75
+ /** Files `aronrepo release` attaches to the GitHub release, such as browser bundles or checksums. */
76
+ assets?: ReleaseAsset[];
66
77
  /**
67
78
  * Files whose changes can release a version. Omit it to derive the paths from
68
79
  * public workspace packages, or set `false` to turn the path check off.
@@ -73,6 +84,7 @@ interface AronrepoConfig {
73
84
  interface ReleasePolicy {
74
85
  mode: ReleaseMode;
75
86
  paths?: ReleasePathsConfig | false;
87
+ assets?: ReleaseAsset[];
76
88
  }
77
89
  declare const defaultReleasePathExcludes: string[];
78
90
  declare function defineConfig(config: AronrepoConfig): AronrepoConfig;
@@ -256,4 +268,4 @@ declare function getChangelogUrl(repositoryUrl: string, version: string, previou
256
268
  * come first.
257
269
  */
258
270
  declare function renderReleaseNotes(options: ReleaseNotesOptions): string;
259
- export { compareRelease as $, ParsedCommit as A, defineConfig as B, getReleaseTable as C, CommitInput as D, CommitDecision as E, ResolveCommitOptions as F, parseCommit as G, getReleaseType as H, createReleasePathMatcher as I, resolveRelease as J, releaseModes as K, defaultReleaseMode as L, ReleaseMode as M, ReleasePathsConfig as N, CommitViolation as O, ReleasePolicy as P, commits as Q, defaultReleasePathExcludes as R, getAgentCommitPolicy as S, AronrepoConfig as T, headerPattern as U, getReleasePolicy as V, nonReleaseAlternatives as W, LegacyCommitType as X, ConventionalCommitType as Y, ReleaseType as Z, AgentCommitPolicyOptions as _, VersionTags as a, nonReleaseTypes as at, agentsBlockEnd as b, getNextVersion as c, releaseGroups as ct, parseVersionTag as d, types as dt, findCommitRule as et, prereleaseChannels as f, AgentCommitPolicyExample as g, AgentCommitPolicy as h, ReleaseChannel as i, nonReleaseCommits as it, ReleaseDecision as j, CommitViolationRule as k, getReleaseChannel as l, releaseLevels as lt, toVersionTag as m, getChangelogUrl as n, legacyTypes as nt, getBaseTag as o, normalizeType as ot, releaseBranches as p, resolveCommitRelease as q, renderReleaseNotes as r, maxRelease as rt, getLatestStableVersion as s, releaseCommits as st, ReleaseNotesOptions as t, legacyCommits as tt, initialVersion as u, releaseTypes as ut, RenderAgentsBlockOptions as v, renderAgentsBlock as w, agentsBlockStart as x, agentCommitPolicy as y, defaultReleasePolicy as z };
271
+ export { commits as $, ParsedCommit as A, defaultReleasePolicy as B, getReleaseTable as C, CommitInput as D, CommitDecision as E, ReleasePolicy as F, nonReleaseAlternatives as G, getReleasePolicy as H, ResolveCommitOptions as I, resolveCommitRelease as J, parseCommit as K, createReleasePathMatcher as L, ReleaseDecision as M, ReleaseMode as N, CommitViolation as O, ReleasePathsConfig as P, ReleaseType as Q, defaultReleaseMode as R, getAgentCommitPolicy as S, AronrepoConfig as T, getReleaseType as U, defineConfig as V, headerPattern as W, ConventionalCommitType as X, resolveRelease as Y, LegacyCommitType as Z, AgentCommitPolicyOptions as _, VersionTags as a, nonReleaseCommits as at, agentsBlockEnd as b, getNextVersion as c, releaseCommits as ct, parseVersionTag as d, releaseTypes as dt, compareRelease as et, prereleaseChannels as f, types as ft, AgentCommitPolicyExample as g, AgentCommitPolicy as h, ReleaseChannel as i, maxRelease as it, ReleaseAsset as j, CommitViolationRule as k, getReleaseChannel as l, releaseGroups as lt, toVersionTag as m, getChangelogUrl as n, legacyCommits as nt, getBaseTag as o, nonReleaseTypes as ot, releaseBranches as p, releaseModes as q, renderReleaseNotes as r, legacyTypes as rt, getLatestStableVersion as s, normalizeType as st, ReleaseNotesOptions as t, findCommitRule as tt, initialVersion as u, releaseLevels as ut, RenderAgentsBlockOptions as v, renderAgentsBlock as w, agentsBlockStart as x, agentCommitPolicy as y, defaultReleasePathExcludes as z };
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { $ as compareRelease, A as ParsedCommit, B as defineConfig, C as getReleaseTable, D as CommitInput, E as CommitDecision, F as ResolveCommitOptions, G as parseCommit, H as getReleaseType, I as createReleasePathMatcher, J as resolveRelease, K as releaseModes, L as defaultReleaseMode, M as ReleaseMode, N as ReleasePathsConfig, O as CommitViolation, P as ReleasePolicy, Q as commits, R as defaultReleasePathExcludes, S as getAgentCommitPolicy, T as AronrepoConfig, U as headerPattern, V as getReleasePolicy, W as nonReleaseAlternatives, X as LegacyCommitType, Y as ConventionalCommitType, Z as ReleaseType, _ as AgentCommitPolicyOptions, a as VersionTags, at as nonReleaseTypes, b as agentsBlockEnd, c as getNextVersion, ct as releaseGroups, d as parseVersionTag, dt as types, et as findCommitRule, f as prereleaseChannels, g as AgentCommitPolicyExample, h as AgentCommitPolicy, i as ReleaseChannel, it as nonReleaseCommits, j as ReleaseDecision, k as CommitViolationRule, l as getReleaseChannel, lt as releaseLevels, m as toVersionTag, n as getChangelogUrl, nt as legacyTypes, o as getBaseTag, ot as normalizeType, p as releaseBranches, q as resolveCommitRelease, r as renderReleaseNotes, rt as maxRelease, s as getLatestStableVersion, st as releaseCommits, t as ReleaseNotesOptions, tt as legacyCommits, u as initialVersion, ut as releaseTypes, v as RenderAgentsBlockOptions, w as renderAgentsBlock, x as agentsBlockStart, y as agentCommitPolicy, z as defaultReleasePolicy } from "./index-DLkjddC1.js";
2
- export { AgentCommitPolicy, AgentCommitPolicyExample, AgentCommitPolicyOptions, AronrepoConfig, CommitDecision, CommitInput, CommitViolation, CommitViolationRule, ConventionalCommitType, LegacyCommitType, ParsedCommit, ReleaseChannel, ReleaseDecision, ReleaseMode, ReleaseNotesOptions, ReleasePathsConfig, ReleasePolicy, ReleaseType, RenderAgentsBlockOptions, ResolveCommitOptions, VersionTags, agentCommitPolicy, agentsBlockEnd, agentsBlockStart, commits, compareRelease, createReleasePathMatcher, defaultReleaseMode, defaultReleasePathExcludes, defaultReleasePolicy, defineConfig, findCommitRule, getAgentCommitPolicy, getBaseTag, getChangelogUrl, getLatestStableVersion, getNextVersion, getReleaseChannel, getReleasePolicy, getReleaseTable, getReleaseType, headerPattern, initialVersion, legacyCommits, legacyTypes, maxRelease, nonReleaseAlternatives, nonReleaseCommits, nonReleaseTypes, normalizeType, parseCommit, parseVersionTag, prereleaseChannels, releaseBranches, releaseCommits, releaseGroups, releaseLevels, releaseModes, releaseTypes, renderAgentsBlock, renderReleaseNotes, resolveCommitRelease, resolveRelease, toVersionTag, types };
1
+ import { $ as commits, A as ParsedCommit, B as defaultReleasePolicy, C as getReleaseTable, D as CommitInput, E as CommitDecision, F as ReleasePolicy, G as nonReleaseAlternatives, H as getReleasePolicy, I as ResolveCommitOptions, J as resolveCommitRelease, K as parseCommit, L as createReleasePathMatcher, M as ReleaseDecision, N as ReleaseMode, O as CommitViolation, P as ReleasePathsConfig, Q as ReleaseType, R as defaultReleaseMode, S as getAgentCommitPolicy, T as AronrepoConfig, U as getReleaseType, V as defineConfig, W as headerPattern, X as ConventionalCommitType, Y as resolveRelease, Z as LegacyCommitType, _ as AgentCommitPolicyOptions, a as VersionTags, at as nonReleaseCommits, b as agentsBlockEnd, c as getNextVersion, ct as releaseCommits, d as parseVersionTag, dt as releaseTypes, et as compareRelease, f as prereleaseChannels, ft as types, g as AgentCommitPolicyExample, h as AgentCommitPolicy, i as ReleaseChannel, it as maxRelease, j as ReleaseAsset, k as CommitViolationRule, l as getReleaseChannel, lt as releaseGroups, m as toVersionTag, n as getChangelogUrl, nt as legacyCommits, o as getBaseTag, ot as nonReleaseTypes, p as releaseBranches, q as releaseModes, r as renderReleaseNotes, rt as legacyTypes, s as getLatestStableVersion, st as normalizeType, t as ReleaseNotesOptions, tt as findCommitRule, u as initialVersion, ut as releaseLevels, v as RenderAgentsBlockOptions, w as renderAgentsBlock, x as agentsBlockStart, y as agentCommitPolicy, z as defaultReleasePathExcludes } from "./index-CmnjSEga.js";
2
+ export { AgentCommitPolicy, AgentCommitPolicyExample, AgentCommitPolicyOptions, AronrepoConfig, CommitDecision, CommitInput, CommitViolation, CommitViolationRule, ConventionalCommitType, LegacyCommitType, ParsedCommit, ReleaseAsset, ReleaseChannel, ReleaseDecision, ReleaseMode, ReleaseNotesOptions, ReleasePathsConfig, ReleasePolicy, ReleaseType, RenderAgentsBlockOptions, ResolveCommitOptions, VersionTags, agentCommitPolicy, agentsBlockEnd, agentsBlockStart, commits, compareRelease, createReleasePathMatcher, defaultReleaseMode, defaultReleasePathExcludes, defaultReleasePolicy, defineConfig, findCommitRule, getAgentCommitPolicy, getBaseTag, getChangelogUrl, getLatestStableVersion, getNextVersion, getReleaseChannel, getReleasePolicy, getReleaseTable, getReleaseType, headerPattern, initialVersion, legacyCommits, legacyTypes, maxRelease, nonReleaseAlternatives, nonReleaseCommits, nonReleaseTypes, normalizeType, parseCommit, parseVersionTag, prereleaseChannels, releaseBranches, releaseCommits, releaseGroups, releaseLevels, releaseModes, releaseTypes, renderAgentsBlock, renderReleaseNotes, resolveCommitRelease, resolveRelease, toVersionTag, types };
package/dist/index.js CHANGED
@@ -205,11 +205,17 @@ function getReleasePolicy(config = {}) {
205
205
  if (!releaseModes.includes(mode)) throw new Error(`Unknown Aronrepo release mode "${String(mode)}". Use one of: ${releaseModes.join(", ")}.`);
206
206
  const paths = config.release?.paths;
207
207
  if (paths !== void 0 && paths !== false) validateReleasePaths(paths);
208
+ const assets = config.release?.assets;
209
+ if (assets !== void 0) validateReleaseAssets(assets);
208
210
  return {
209
211
  mode,
210
- ...paths !== void 0 ? { paths } : {}
212
+ ...paths !== void 0 ? { paths } : {},
213
+ ...assets !== void 0 ? { assets } : {}
211
214
  };
212
215
  }
216
+ function validateReleaseAssets(assets) {
217
+ if (!(Array.isArray(assets) && assets.every((asset) => typeof asset === "object" && asset !== null && typeof asset.path === "string" && ["name", "label"].every((key) => asset[key] === void 0 || typeof asset[key] === "string")))) throw new Error("`release.assets` must be an array of `{ path, name?, label? }` objects.");
218
+ }
213
219
  function validateReleasePaths(paths) {
214
220
  const isGlobs = (value) => value === void 0 || Array.isArray(value) && value.every((glob) => typeof glob === "string");
215
221
  if (typeof paths !== "object" || paths === null || Array.isArray(paths)) throw new Error("`release.paths` must be `false` or an object with `include` and `exclude` glob arrays.");