aronrepo 2.2.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -35
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +110 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands-CO26JPbK.js +1170 -0
- package/dist/commands-CO26JPbK.js.map +1 -0
- package/dist/index-Co5yiJXA.d.ts +240 -0
- package/dist/index.d.ts +2 -5
- package/dist/index.js +757 -10
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +226 -0
- package/dist/node.js +1 -0
- package/package.json +54 -45
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands-CO26JPbK.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\nexport const configFileNames = ['aronrepo.config.js', 'aronrepo.config.mjs']\n\nfunction toPosixPath(value: string) {\n return value.split(path.sep).join('/')\n}\n\nfunction readJson<T>(file: string) {\n return JSON.parse(fs.readFileSync(file, 'utf8')) as T\n}\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 workspace = loadYaml(fs.readFileSync(workspacePath, 'utf8')) as { packages?: string[] } | 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/** Workspace directories whose package is published to npm. */\nexport function queryPublicWorkspaceDirs(cwd = process.cwd()) {\n return queryWorkspaceDirs(readWorkspacePatterns(cwd), cwd)\n .filter((workspace) => readWorkspacePackage(cwd, workspace).publishConfig?.access === 'public')\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 publicWorkspaces = queryPublicWorkspaceDirs(cwd)\n if (publicWorkspaces.length) {\n return { include: publicWorkspaces.map((dir) => dir === '.' ? '**' : `${dir}/**`), exclude }\n }\n const rootPackage = path.join(cwd, 'package.json')\n if (!readWorkspacePatterns(cwd).length && fs.existsSync(rootPackage) && !readJson<PackageJson>(rootPackage).private) {\n return { include: ['**'], exclude }\n }\n return undefined\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 return execFileSync('git', args, { cwd, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 })\n}\n\nfunction splitLines(output: string) {\n return output.split('\\n').map((line) => line.trim()).filter(Boolean)\n}\n\n/** Files changed by one commit. Merge commits report no files. */\nexport function getCommitFiles(cwd: string, hash: string) {\n return splitLines(git(cwd, ['diff-tree', '--no-commit-id', '--name-only', '-r', '--root', hash]))\n}\n\nexport function getStagedFiles(cwd = process.cwd()) {\n return splitLines(git(cwd, ['diff', '--cached', '--name-only']))\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 splitLines(git(cwd, ['diff', '--name-only', `${base}...${head}`]))\n}\n\n/** Commits in `from..to`, oldest first, with their changed 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, ['log', '--reverse', '--format=%H%x1f%B%x1e', range])\n return output.split('\\x1e')\n .map((entry) => entry.replace(/^\\n/, ''))\n .filter((entry) => entry.includes('\\x1f'))\n .map((entry) => {\n const [hash, message] = entry.split('\\x1f')\n return { hash, message: message.trim(), files: getCommitFiles(cwd, hash) }\n })\n}\n\n/** Latest tag reachable from `ref`, or `undefined` when there is none. */\nexport function getLatestTag(cwd: string, ref = 'HEAD') {\n try {\n return git(cwd, ['describe', '--tags', '--abbrev=0', ref]).trim() || undefined\n } catch {\n return undefined\n }\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 type { ReleaseType } from './commits'\nimport { renderReleaseNotes } from './notes'\nimport { resolveRelease, type CommitDecision, type ReleasePolicy } from './policy'\nimport {\n detectPackageManager,\n getRangeCommits,\n loadProjectPolicy,\n queryPublicWorkspaceDirs,\n readWorkspacePatterns,\n type PackageJson,\n type PackageManager\n} from './project'\nimport {\n getBaseTag,\n getNextVersion,\n getReleaseChannel,\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\nexport const runCommand: Runner = (command, args, { cwd, env }) => new Promise((resolve, reject) => {\n const child = spawn(command, args, { cwd, env, stdio: ['ignore', 'pipe', 'pipe'], shell: process.platform === 'win32' })\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) => {\n if (code === 0) resolve({ stdout, stderr })\n else reject(new Error(`\\`${command} ${args.join(' ')}\\` 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\nasync function git(environment: ReleaseEnvironment, args: string[]) {\n return (await environment.run('git', args, { cwd: environment.cwd, env: environment.env })).stdout.trim()\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 a single-package repository. */\n dir: string\n name: string\n manifest: PackageJson\n}\n\nfunction readJson<T>(file: string) {\n return JSON.parse(fs.readFileSync(file, 'utf8')) as T\n}\n\nconst dependencyFields = ['dependencies', 'optionalDependencies', 'peerDependencies'] as const\n\n/** Published packages of the repository in dependency order. */\nexport function getReleasePackages(cwd: string): ReleasePackage[] {\n let dirs = queryPublicWorkspaceDirs(cwd)\n if (!dirs.length && !readWorkspacePatterns(cwd).length) {\n const root = path.join(cwd, 'package.json')\n if (fs.existsSync(root) && !readJson<PackageJson>(root).private) dirs = ['.']\n }\n const packages = dirs.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 Set(packages.map(({ name }) => name))\n const dependenciesOf = (pkg: ReleasePackage) => dependencyFields\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}\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 date?: string\n}\n\n/** The repository URL on GitHub, from `GITHUB_REPOSITORY` or the root package.json. */\nexport function getRepositoryUrl(cwd: string, env: NodeJS.ProcessEnv = process.env) {\n if (env.GITHUB_REPOSITORY) return `${env.GITHUB_SERVER_URL ?? 'https://github.com'}/${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\n const match = url && /github\\.com[/:]([^/]+\\/[^/.]+?)(?:\\.git)?\\/?$/.exec(url)\n return match ? `https://github.com/${match[1]}` : undefined\n}\n\nasync function getBranch(environment: ReleaseEnvironment, branch?: string) {\n return branch ?? environment.env.GITHUB_REF_NAME ?? await git(environment, ['rev-parse', '--abbrev-ref', 'HEAD'])\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 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 packages = getReleasePackages(cwd)\n const base: ReleasePlan = { branch, head, mode: project.policy.mode, release: false, commits: [], packages }\n if (!channel) return base\n\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 = getNextVersion(channel, decision.release, { reachable, all })\n const repositoryUrl = getRepositoryUrl(cwd, environment.env)\n return {\n ...plan,\n version,\n tag: toVersionTag(version),\n notes: renderReleaseNotes({\n version,\n ...(from ? { previousTag: from } : {}),\n date: options.date ?? new Date().toISOString().slice(0, 10),\n ...(repositoryUrl ? { repositoryUrl } : {}),\n commits: decision.commits\n })\n }\n}\n\n/** Registry of a package: its scoped registry, `publishConfig.registry`, `NPM_CONFIG_REGISTRY`, then npm. */\nexport function getRegistry(manifest: PackageJson, env: NodeJS.ProcessEnv = process.env) {\n const scope = manifest.name?.startsWith('@') ? manifest.name.split('/')[0] : undefined\n const configured = (scope ? manifest.publishConfig?.[`${scope}:registry`] : undefined)\n ?? manifest.publishConfig?.registry\n ?? env.NPM_CONFIG_REGISTRY\n const registry = typeof configured === 'string' && configured ? 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\nasync function readPackument(environment: ReleaseEnvironment, registry: string, name: string): Promise<Packument | undefined> {\n const response = await environment.fetch(`${registry}${name.replace('/', '%2f')}`, {\n headers: { accept: 'application/json', 'cache-control': 'no-cache' }\n })\n if (response.status === 404) return undefined\n if (!response.ok) throw new Error(`Could not read ${name} from ${registry}: ${response.status} ${response.statusText}`)\n return await response.json() as Packument\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 const response = await environment.fetch(`${officialRegistry}-/npm/v1/oidc/token/exchange/package/${encodeURIComponent(name)}`, {\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\nfunction hasRegistryAuth(content: string, registry: string) {\n const nerfed = nerfDart(registry)\n return content.split(/\\r?\\n/).some((line) => {\n const key = line.split('=')[0].trim()\n return key === '_authToken' || key === '_auth' || key.startsWith(`${nerfed}:_auth`)\n })\n}\n\n/**\n * npm environment for one package: existing `.npmrc` auth, then npm trusted\n * publishing through GitHub Actions OIDC, then `NPM_TOKEN`.\n */\nasync function createNpmEnv(environment: ReleaseEnvironment, name: string, registry: string, directory: string) {\n const userconfig = environment.env.NPM_CONFIG_USERCONFIG ?? path.join(os.homedir(), '.npmrc')\n const existing = [readNpmrc(path.join(environment.cwd, '.npmrc')), readNpmrc(userconfig)].join('\\n')\n if (hasRegistryAuth(existing, registry)) return environment.env\n\n const token = await exchangeOidcToken(environment, name, registry) ?? 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 const file = path.join(directory, `${name.replace(/[@/]/g, '_')}.npmrc`)\n fs.writeFileSync(file, `${readNpmrc(userconfig).trim()}\\n${nerfDart(registry)}:_authToken=${token}\\n`, { mode: 0o600 })\n return { ...environment.env, NPM_CONFIG_USERCONFIG: file }\n}\n\nfunction detectIndent(content: string) {\n return /^(\\s+)\"/m.exec(content)?.[1] ?? ' '\n}\n\n/** Writes the release version and git head into a package manifest. */\nexport function writeReleaseManifest(cwd: string, dir: string, version: string, gitHead: string) {\n const file = path.join(cwd, dir, 'package.json')\n const content = fs.readFileSync(file, 'utf8')\n const manifest = JSON.parse(content) as PackageJson\n manifest.version = version\n manifest.gitHead = gitHead\n fs.writeFileSync(file, `${JSON.stringify(manifest, null, detectIndent(content))}\\n`)\n return manifest\n}\n\nfunction packCommand(packageManager: PackageManager, destination: string): [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', '--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')) as PackageJson\n }\n offset += 512 + Math.ceil(size / 512) * 512\n }\n throw new Error(`${tarball} has no package.json.`)\n}\n\nfunction validatePackedManifest(manifest: PackageJson, pkg: ReleasePackage, version: string, gitHead: 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 (range.startsWith('workspace:')) throw new Error(`The tarball of ${pkg.name} keeps \\`${name}: ${range}\\` in ${field}.`)\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 interface GitHubRelease {\n tag: string\n notes: string\n prerelease: boolean\n}\n\nfunction truncateNotes(notes: string, url: string | undefined) {\n if (notes.length <= releaseBodyLimit) return notes\n const cut = notes.slice(0, releaseBodyLimit)\n return `${cut.slice(0, cut.lastIndexOf('\\n'))}\\n\\n…the notes are too long for a GitHub release${url ? `; see ${url}` : ''}.\\n`\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'}/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 existing = await environment.fetch(`${api}/tags/${encodeURIComponent(release.tag)}`, { headers })\n if (existing.ok) {\n environment.log(`✓ GitHub release ${release.tag} exists.`)\n return (await existing.json() as { html_url?: string }).html_url\n }\n const response = await environment.fetch(api, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n tag_name: release.tag,\n name: release.tag,\n body: truncateNotes(release.notes, repositoryUrl ? `${repositoryUrl}/compare` : undefined),\n prerelease: release.prerelease,\n make_latest: release.prerelease ? 'false' : 'true'\n })\n })\n if (!response.ok) throw new Error(`Could not create the GitHub release ${release.tag}: ${response.status} ${await response.text()}`)\n const url = (await response.json() as { html_url?: string }).html_url\n environment.log(`✓ Created the GitHub release ${url ?? release.tag}.`)\n return 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/** Creates a missing GitHub release when HEAD carries a version tag from an earlier, interrupted run. */\nasync function resumeTaggedRelease(environment: ReleaseEnvironment, options: ReleaseOptions, plan: ReleasePlan) {\n const tags = lines(await git(environment, ['tag', '--list', 'v*', '--points-at', 'HEAD']))\n const tag = plan.channel && tags.find((candidate) => {\n const prerelease = candidate.includes('-')\n return plan.channel!.prerelease ? candidate.includes(`-${plan.channel!.prerelease}.`) : !prerelease\n })\n if (!tag || options.dryRun) return false\n const previous = await planRelease({ ...options, ignoreTags: [tag] }, environment)\n if (!previous.notes || previous.tag !== tag) return false\n environment.log(`${tag} points at HEAD; make sure its GitHub release exists.`)\n await publishGitHubRelease(environment, { tag, notes: previous.notes, prerelease: Boolean(plan.channel!.prerelease) })\n return true\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 if (options.dryRun) {\n log(`\\nDry run: would publish ${plan.tag} on ${plan.channel.distTag}.\\n\\n${plan.notes}`)\n return { status: 'dry-run', plan }\n }\n\n if (await git(environment, ['status', '--porcelain'])) throw new Error('The working tree has changes. Release from a clean checkout.')\n const existingTag = await git(environment, ['tag', '--list', plan.tag])\n if (existingTag) throw new Error(`${plan.tag} exists but is not reachable from ${plan.branch}.`)\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 try {\n const packageManager = detectPackageManager(cwd)\n // Every version must be written before packing, so workspace ranges resolve to it.\n for (const pkg of plan.packages) pkg.manifest = writeReleaseManifest(cwd, pkg.dir, plan.version, plan.head)\n\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] = packCommand(packageManager, destination)\n await environment.run(command, args, { cwd: path.join(cwd, pkg.dir), env: environment.env })\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, plan.version, plan.head)\n tarballs.set(pkg.name, file)\n log(`✓ Packed ${pkg.name}@${plan.version}`)\n }\n\n const npmEnvs = new Map<string, NodeJS.ProcessEnv>()\n const npmEnv = async (pkg: ReleasePackage) => {\n if (!npmEnvs.has(pkg.name)) npmEnvs.set(pkg.name, await createNpmEnv(environment, pkg.name, getRegistry(pkg.manifest, environment.env), directory))\n return npmEnvs.get(pkg.name)!\n }\n\n for (const pkg of plan.packages) {\n const registry = getRegistry(pkg.manifest, environment.env)\n const published = (await readPackument(environment, registry, pkg.name))?.versions?.[plan.version]\n if (published) {\n if (published.gitHead !== plan.head) {\n throw new Error(`${pkg.name}@${plan.version} is already published from ${published.gitHead ?? 'another commit'}, not ${plan.head}.`)\n }\n log(`✓ ${pkg.name}@${plan.version} is already published from this commit.`)\n continue\n }\n const args = ['publish', tarballs.get(pkg.name)!, '--tag', stagingDistTag, '--registry', registry]\n if (pkg.manifest.publishConfig?.access) args.push('--access', String(pkg.manifest.publishConfig.access))\n if (pkg.manifest.publishConfig?.provenance) args.push('--provenance')\n await environment.run('npm', args, { cwd, env: await npmEnv(pkg) })\n log(`✓ Published ${pkg.name}@${plan.version} on ${stagingDistTag}`)\n }\n\n for (const pkg of plan.packages) {\n const registry = getRegistry(pkg.manifest, environment.env)\n const published = await waitForVersion(environment, registry, pkg.name, plan.version)\n if (pkg.manifest.publishConfig?.provenance && !published.dist?.attestations) {\n log(`! ${pkg.name}@${plan.version} has no provenance attestation on ${registry}.`)\n }\n }\n\n for (const pkg of plan.packages) {\n const registry = getRegistry(pkg.manifest, environment.env)\n const tags = (await readPackument(environment, registry, pkg.name))?.['dist-tags'] ?? {}\n const env = await npmEnv(pkg)\n if (tags[plan.channel.distTag] !== plan.version) {\n await environment.run('npm', ['dist-tag', 'add', `${pkg.name}@${plan.version}`, plan.channel.distTag, '--registry', registry], { cwd, env })\n }\n if (tags[stagingDistTag]) {\n await environment.run('npm', ['dist-tag', 'rm', pkg.name, stagingDistTag, '--registry', registry], { cwd, env })\n .catch((error: Error) => log(`! Could not remove the ${stagingDistTag} dist-tag of ${pkg.name}: ${error.message}`))\n }\n log(`✓ ${pkg.name}@${plan.version} is on ${plan.channel.distTag}`)\n }\n } finally {\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\n await git(environment, ['tag', plan.tag, plan.head])\n await git(environment, ['push', 'origin', `refs/tags/${plan.tag}`])\n log(`✓ Pushed ${plan.tag}`)\n\n await publishGitHubRelease(environment, { tag: plan.tag, notes: plan.notes, prerelease: Boolean(plan.channel.prerelease) })\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 getReleaseType,\n legacyCommits,\n defaultReleasePathExcludes,\n getAgentCommitPolicy,\n getReleaseTable,\n parseCommit,\n renderAgentsBlock,\n resolveCommitRelease,\n resolveRelease,\n type CommitDecision,\n type CommitViolation,\n type ReleaseMode\n} from './index'\nimport {\n getDiffFiles,\n getLatestTag,\n getRangeCommits,\n getStagedFiles,\n loadProjectPolicy,\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 cwd?: string\n mode?: ReleaseMode\n json?: boolean\n}\n\n// Messages that git or GitHub write for you; commitlint ignores the same ones by default.\nconst ignoredMessagePatterns = [\n /^Merge pull request /,\n /^Merge (?:branch|remote-tracking branch|tag) /,\n /^Merge .+ into .+/,\n /^Merged .+ (?:in|into) .+/,\n /^Automatic merge/,\n /^Auto-merged .+ into .+/,\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 readEditMessage(file: string) {\n return fs.readFileSync(file, 'utf8')\n .split('\\n')\n .filter((line) => !line.startsWith('#'))\n .join('\\n')\n .split(/^-+ >8 -+$/m)[0]\n .trim()\n}\n\nasync function project(options: CommonOptions): Promise<ProjectPolicy> {\n return loadProjectPolicy(options.cwd ?? process.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\nexport interface CheckOptions extends CommonOptions {\n /** Commit message file, as passed to a commit-msg hook. 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 cwd = options.cwd ?? process.cwd()\n const { policy, isReleasePath } = await project(options)\n const pathOptions = isReleasePath ? { isReleasePath } : {}\n let entries: Array<{ message: string, hash?: string, files?: string[], label: string }>\n\n if (options.title !== undefined) {\n const files = options.files ?? (options.base && options.head ? getDiffFiles(cwd, options.base, options.head) : undefined)\n entries = [{ message: options.title, ...(files ? { files } : {}), label: 'PR title' }]\n } else if (options.edit || options.message !== undefined) {\n const message = options.edit ? readEditMessage(path.resolve(cwd, options.edit)) : options.message!\n entries = [{ message, files: options.files ?? getStagedFiles(cwd), label: 'Commit message' }]\n } else if (options.from) {\n entries = getRangeCommits(cwd, options.from, options.to ?? 'HEAD')\n .map((commit) => ({ ...commit, label: commit.hash.slice(0, 9) }))\n } else {\n return { code: 2, output: 'Pass --edit <file>, --message <text>, --title <text>, or --from <ref>.' }\n }\n\n const results = entries\n .filter(({ message }) => !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({ mode: policy.mode, results: results.map(({ entry, decision }) => ({ label: entry.label, ...decision })) }, 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 `${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 '',\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 = options.cwd ?? process.cwd()\n const { policy, isReleasePath, releasePaths } = await project(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 from = options.from ?? getLatestTag(cwd, to)\n plan = resolveRelease(getRangeCommits(cwd, from, to), policy, isReleasePath ? { isReleasePath } : {})\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 = options.cwd ?? process.cwd()\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 const resolved = await project(options)\n if (options.markdown) {\n return { code: 0, output: renderAgentsBlock(resolved.policy, { cli: resolved.cli, ...(resolved.releasePaths ? { releasePaths: resolved.releasePaths } : {}) }) }\n }\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 releaseTable: getReleaseTable(resolved.policy),\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: ${data.releaseTable.major.join(', ') || '-'}`,\n `Minor: ${data.releaseTable.minor.join(', ') || '-'}`,\n `Patch: ${data.releaseTable.patch.join(', ') || '-'}`,\n `None: ${data.releaseTable.none.join(', ') || '-'}`,\n '',\n ...data.agent.ownerDecisions.map((rule) => `- ${rule}`)\n ].join('\\n')\n }\n}\n\nexport function replaceAgentsBlock(content: string, block: string) {\n const start = content.indexOf(agentsBlockStart)\n const end = content.indexOf(agentsBlockEnd)\n if (start !== -1 && end > start) {\n return content.slice(0, start) + block + content.slice(end + agentsBlockEnd.length)\n }\n return `${content.trimEnd()}${content.trim() ? '\\n\\n' : ''}${block}\\n`\n}\n\nexport function readAgentsBlock(content: string) {\n const start = content.indexOf(agentsBlockStart)\n const end = content.indexOf(agentsBlockEnd)\n return start !== -1 && end > start ? content.slice(start, end + agentsBlockEnd.length) : undefined\n}\n\nexport async function agents(options: CommonOptions & { file?: string, write?: boolean }): Promise<CommandResult> {\n const resolved = await project(options)\n const file = path.resolve(resolved.cwd, options.file ?? 'AGENTS.md')\n const relative = path.relative(resolved.cwd, file)\n const block = renderAgentsBlock(resolved.policy, { cli: resolved.cli, ...(resolved.releasePaths ? { releasePaths: resolved.releasePaths } : {}) })\n const content = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : ''\n\n if (options.write) {\n const next = replaceAgentsBlock(content || '# Agent Guide\\n', block)\n if (next === content) return { code: 0, output: `✓ ${relative} is up to date.` }\n fs.writeFileSync(file, next)\n return { code: 0, output: `✓ Wrote the Aronrepo commit policy block to ${relative}.` }\n }\n const current = readAgentsBlock(content)\n if (current === block) return { code: 0, output: `✓ ${relative} has the current Aronrepo commit policy block.` }\n return {\n code: 1,\n output: `✗ ${relative} ${current ? 'has an outdated' : 'is missing the'} Aronrepo commit policy block. Run \\`aronrepo agents --write\\`.`\n }\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 '.',\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\nexport async function doctor(options: CommonOptions): Promise<CommandResult> {\n const cwd = options.cwd ?? process.cwd()\n const checks: DoctorCheck[] = []\n let resolved: ProjectPolicy | undefined\n\n try {\n resolved = await project(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: `aronrepo.config.js 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 const pkg = JSON.parse(readText(findFile(cwd, ['package.json'])) || '{}') as Record<string, Record<string, string> | undefined>\n const dependencies = { ...pkg.dependencies, ...pkg.devDependencies }\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, for example `bun add -d aronrepo`.' })\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 const rootRepository = (pkg as Record<string, unknown>).repository\n const withoutRepository = releasePackages.filter(({ manifest }) => manifest.publishConfig?.provenance && !manifest.repository && !rootRepository)\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 those package.json files.' }\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 hook = readText(findFile(cwd, ['.husky/commit-msg']))\n checks.push(hook.includes('aronrepo check')\n ? { status: 'pass', message: '.husky/commit-msg runs aronrepo check.' }\n : {\n status: 'warn',\n message: 'No commit-msg hook runs `aronrepo check`.',\n fix: 'Add .husky/commit-msg with `aronrepo check --edit \"$1\"`.'\n })\n\n const agentsResult = await agents({ ...options, cwd })\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(/^✗ /, ''), fix: 'aronrepo agents --write' })\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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"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
type ReleaseType = 'major' | 'minor' | 'patch' | false;
|
|
2
|
+
interface ConventionalCommitType {
|
|
3
|
+
type: string;
|
|
4
|
+
scope?: string;
|
|
5
|
+
/**
|
|
6
|
+
* Release level in `auto` mode. The `explicit` mode caps every type except
|
|
7
|
+
* `Bump` at `patch`; see `getReleaseType()` and `resolveCommitRelease()`.
|
|
8
|
+
*/
|
|
9
|
+
release: ReleaseType;
|
|
10
|
+
/** When to use the type, written for people and coding agents. */
|
|
11
|
+
description: string;
|
|
12
|
+
/** Release notes section. Types without a group never appear in release notes. */
|
|
13
|
+
group?: string;
|
|
14
|
+
}
|
|
15
|
+
interface LegacyCommitType {
|
|
16
|
+
type: string;
|
|
17
|
+
/** The type that replaces it. Legacy commits release and group like their replacement. */
|
|
18
|
+
replacement: string;
|
|
19
|
+
}
|
|
20
|
+
/** Release levels in descending order. */
|
|
21
|
+
declare const releaseLevels: readonly ["major", "minor", "patch"];
|
|
22
|
+
declare function compareRelease(a: ReleaseType | undefined, b: ReleaseType | undefined): number;
|
|
23
|
+
declare function maxRelease(...releases: Array<ReleaseType | undefined>): ReleaseType;
|
|
24
|
+
/**
|
|
25
|
+
* The Aronrepo commit types. The table is fixed: repositories choose a release
|
|
26
|
+
* mode and release paths, not their own types.
|
|
27
|
+
*
|
|
28
|
+
* Release notes list the groups in this order.
|
|
29
|
+
*/
|
|
30
|
+
declare const commits: readonly ConventionalCommitType[];
|
|
31
|
+
/**
|
|
32
|
+
* Types from earlier Aronrepo versions. They still resolve in history so old
|
|
33
|
+
* commits release as before, but `aronrepo check` rejects them in new commits.
|
|
34
|
+
*/
|
|
35
|
+
declare const legacyCommits: readonly LegacyCommitType[];
|
|
36
|
+
declare const types: string[];
|
|
37
|
+
declare const legacyTypes: string[];
|
|
38
|
+
declare const releaseCommits: ConventionalCommitType[];
|
|
39
|
+
declare const nonReleaseCommits: ConventionalCommitType[];
|
|
40
|
+
declare const releaseTypes: string[];
|
|
41
|
+
declare const nonReleaseTypes: string[];
|
|
42
|
+
/** Release notes groups in display order. */
|
|
43
|
+
declare const releaseGroups: string[];
|
|
44
|
+
/** The current type for a legacy type, or the type itself. */
|
|
45
|
+
declare function normalizeType(type: string): string;
|
|
46
|
+
declare function normalizeType(type: string | undefined): string | undefined;
|
|
47
|
+
declare function findCommitRule(type: string | undefined, scope?: string): ConventionalCommitType | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* - `explicit`: only `Bump(Major)` and `Bump(Minor)` raise major and minor versions.
|
|
50
|
+
* `Feat` and `New` release a patch, and breaking markers never change the level.
|
|
51
|
+
* - `auto`: `Feat` and `New` release a minor version and a `BREAKING CHANGE:` footer
|
|
52
|
+
* releases a major version, following Conventional Commits.
|
|
53
|
+
*/
|
|
54
|
+
type ReleaseMode = 'explicit' | 'auto';
|
|
55
|
+
declare const releaseModes: readonly ["explicit", "auto"];
|
|
56
|
+
declare const defaultReleaseMode: ReleaseMode;
|
|
57
|
+
interface ReleasePathsConfig {
|
|
58
|
+
/** Globs, relative to the repository root, of files that ship in published packages. */
|
|
59
|
+
include?: string[];
|
|
60
|
+
/** Globs removed from `include`. Defaults to `defaultReleasePathExcludes`. */
|
|
61
|
+
exclude?: string[];
|
|
62
|
+
}
|
|
63
|
+
interface AronrepoConfig {
|
|
64
|
+
release?: {
|
|
65
|
+
mode?: ReleaseMode;
|
|
66
|
+
/**
|
|
67
|
+
* Files whose changes can release a version. Omit it to derive the paths from
|
|
68
|
+
* public workspace packages, or set `false` to turn the path check off.
|
|
69
|
+
*/
|
|
70
|
+
paths?: ReleasePathsConfig | false;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
interface ReleasePolicy {
|
|
74
|
+
mode: ReleaseMode;
|
|
75
|
+
paths?: ReleasePathsConfig | false;
|
|
76
|
+
}
|
|
77
|
+
declare const defaultReleasePathExcludes: string[];
|
|
78
|
+
declare function defineConfig(config: AronrepoConfig): AronrepoConfig;
|
|
79
|
+
declare function getReleasePolicy(config?: AronrepoConfig): ReleasePolicy;
|
|
80
|
+
declare const defaultReleasePolicy: ReleasePolicy;
|
|
81
|
+
/** Returns a matcher for release paths, or `undefined` when every path may release. */
|
|
82
|
+
declare function createReleasePathMatcher(paths: ReleasePathsConfig | false | undefined): ((file: string) => boolean) | undefined;
|
|
83
|
+
/**
|
|
84
|
+
* Release level of a commit type in the given mode, ignoring breaking markers and paths.
|
|
85
|
+
* Use `resolveCommitRelease()` for the full decision.
|
|
86
|
+
*/
|
|
87
|
+
declare function getReleaseType(type: string | undefined, scope?: string, policy?: ReleasePolicy): ReleaseType | undefined;
|
|
88
|
+
declare const headerPattern: RegExp;
|
|
89
|
+
interface ParsedCommit {
|
|
90
|
+
hash?: string;
|
|
91
|
+
header: string;
|
|
92
|
+
body: string;
|
|
93
|
+
type?: string;
|
|
94
|
+
scope?: string;
|
|
95
|
+
subject?: string;
|
|
96
|
+
/** Where a breaking marker was found, if any. */
|
|
97
|
+
breaking?: 'header' | 'footer';
|
|
98
|
+
/** Texts of `BREAKING CHANGE:` footers. */
|
|
99
|
+
breakingNotes?: string[];
|
|
100
|
+
/** Message layout problems that do not change the release. */
|
|
101
|
+
layout?: Array<'body-leading-blank' | 'footer-leading-blank'>;
|
|
102
|
+
revert?: {
|
|
103
|
+
header?: string;
|
|
104
|
+
hash?: string;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
declare function parseCommit(message: string, hash?: string): ParsedCommit;
|
|
108
|
+
type CommitViolationRule = 'header-format' | 'subject-full-stop' | 'unknown-type' | 'legacy-type' | 'implicit-breaking' | 'release-paths' | 'body-leading-blank' | 'footer-leading-blank';
|
|
109
|
+
interface CommitViolation {
|
|
110
|
+
rule: CommitViolationRule;
|
|
111
|
+
/** Errors fail `aronrepo check`; warnings are printed only. Defaults to `error`. */
|
|
112
|
+
severity?: 'error' | 'warning';
|
|
113
|
+
message: string;
|
|
114
|
+
/** A header that satisfies the policy, when one can be derived. */
|
|
115
|
+
suggestion?: string;
|
|
116
|
+
}
|
|
117
|
+
interface CommitDecision {
|
|
118
|
+
hash?: string;
|
|
119
|
+
header: string;
|
|
120
|
+
type?: string;
|
|
121
|
+
scope?: string;
|
|
122
|
+
subject?: string;
|
|
123
|
+
/** Texts of `BREAKING CHANGE:` footers, kept for `Bump(Major)` release notes. */
|
|
124
|
+
breakingNotes?: string[];
|
|
125
|
+
/** Effective release level after mode, breaking markers, reverts, and paths. */
|
|
126
|
+
release: ReleaseType;
|
|
127
|
+
reasons: string[];
|
|
128
|
+
violations: CommitViolation[];
|
|
129
|
+
}
|
|
130
|
+
interface ResolveCommitOptions {
|
|
131
|
+
/** Files the commit changes. Omit it to skip the release path check. */
|
|
132
|
+
files?: string[];
|
|
133
|
+
/** Decides whether a changed file ships in a published package. */
|
|
134
|
+
isReleasePath?: (file: string) => boolean;
|
|
135
|
+
}
|
|
136
|
+
declare const nonReleaseAlternatives: string[];
|
|
137
|
+
declare function resolveCommitRelease(input: string | ParsedCommit, policy?: ReleasePolicy, options?: ResolveCommitOptions): CommitDecision;
|
|
138
|
+
interface CommitInput {
|
|
139
|
+
message: string;
|
|
140
|
+
hash?: string;
|
|
141
|
+
files?: string[];
|
|
142
|
+
}
|
|
143
|
+
interface ReleaseDecision {
|
|
144
|
+
release: ReleaseType;
|
|
145
|
+
commits: CommitDecision[];
|
|
146
|
+
}
|
|
147
|
+
declare function resolveRelease(inputs: CommitInput[], policy?: ReleasePolicy, options?: Omit<ResolveCommitOptions, 'files'>): ReleaseDecision;
|
|
148
|
+
interface AgentCommitPolicyExample {
|
|
149
|
+
commit: string;
|
|
150
|
+
use: string;
|
|
151
|
+
release: ReleaseType;
|
|
152
|
+
avoid?: string;
|
|
153
|
+
}
|
|
154
|
+
interface AgentCommitPolicy {
|
|
155
|
+
mode: ReleasePolicy['mode'];
|
|
156
|
+
defaultInternalCommit: string;
|
|
157
|
+
defaultInternalType: string;
|
|
158
|
+
defaultInternalScope: string;
|
|
159
|
+
releaseImpactRule: string;
|
|
160
|
+
/** Release decisions that belong to the repository owner, not to a coding agent. */
|
|
161
|
+
ownerDecisions: string[];
|
|
162
|
+
releaseWorthyChanges: string[];
|
|
163
|
+
nonReleaseDefaults: string[];
|
|
164
|
+
/** Commands an agent runs to check its commits before handing them off. */
|
|
165
|
+
verification: string[];
|
|
166
|
+
examples: AgentCommitPolicyExample[];
|
|
167
|
+
}
|
|
168
|
+
interface AgentCommitPolicyOptions {
|
|
169
|
+
/** How to run the CLI in this repository, such as `bun x aronrepo` or `pnpm exec aronrepo`. */
|
|
170
|
+
cli?: string;
|
|
171
|
+
}
|
|
172
|
+
declare function getAgentCommitPolicy(policy?: ReleasePolicy, options?: AgentCommitPolicyOptions): AgentCommitPolicy;
|
|
173
|
+
/** Agent policy for the default `explicit` mode. */
|
|
174
|
+
declare const agentCommitPolicy: AgentCommitPolicy;
|
|
175
|
+
declare function getReleaseTable(policy?: ReleasePolicy): Record<"major" | "minor" | "patch" | "none", string[]>;
|
|
176
|
+
declare const agentsBlockStart = "<!-- aronrepo:commit-policy:start -->";
|
|
177
|
+
declare const agentsBlockEnd = "<!-- aronrepo:commit-policy:end -->";
|
|
178
|
+
interface RenderAgentsBlockOptions extends AgentCommitPolicyOptions {
|
|
179
|
+
/** Resolved release paths; `undefined` means every path may release. */
|
|
180
|
+
releasePaths?: ReleasePathsConfig;
|
|
181
|
+
}
|
|
182
|
+
/** Renders the generated commit policy block for AGENTS.md, including its markers. */
|
|
183
|
+
declare function renderAgentsBlock(policy?: ReleasePolicy, options?: RenderAgentsBlockOptions): string;
|
|
184
|
+
/** Prerelease branches. Each publishes `X.Y.Z-<branch>.N` on the npm dist-tag of the same name. */
|
|
185
|
+
declare const prereleaseChannels: readonly ["alpha", "beta", "rc", "canary"];
|
|
186
|
+
/** Branches that release: `main` publishes on `latest`, and each prerelease branch on its own dist-tag. */
|
|
187
|
+
declare const releaseBranches: readonly ["main", "alpha", "beta", "rc", "canary"];
|
|
188
|
+
interface ReleaseChannel {
|
|
189
|
+
branch: string;
|
|
190
|
+
/** npm dist-tag that the release moves to. */
|
|
191
|
+
distTag: string;
|
|
192
|
+
/** Prerelease identifier, for prerelease branches only. */
|
|
193
|
+
prerelease?: string;
|
|
194
|
+
}
|
|
195
|
+
/** The release channel of a branch, or `undefined` when the branch does not release. */
|
|
196
|
+
declare function getReleaseChannel(branch: string | undefined): ReleaseChannel | undefined;
|
|
197
|
+
/** The first version of a repository without version tags. */
|
|
198
|
+
declare const initialVersion = "1.0.0";
|
|
199
|
+
declare function toVersionTag(version: string): string;
|
|
200
|
+
/** The version of a `vX.Y.Z` or `vX.Y.Z-pre.N` tag, or `undefined` for other tags. */
|
|
201
|
+
declare function parseVersionTag(tag: string): string | undefined;
|
|
202
|
+
/** The latest stable version among tags, if any. */
|
|
203
|
+
declare function getLatestStableVersion(tags: string[]): string | undefined;
|
|
204
|
+
/**
|
|
205
|
+
* The tag a channel's release range starts from: the latest stable tag, or on a
|
|
206
|
+
* prerelease branch the latest tag of that channel when it is newer.
|
|
207
|
+
*/
|
|
208
|
+
declare function getBaseTag(channel: ReleaseChannel, reachableTags: string[]): string | undefined;
|
|
209
|
+
interface VersionTags {
|
|
210
|
+
/** Version tags reachable from the release commit. */
|
|
211
|
+
reachable: string[];
|
|
212
|
+
/** Every version tag in the repository, to number prereleases. */
|
|
213
|
+
all: string[];
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* The next version of a channel.
|
|
217
|
+
*
|
|
218
|
+
* `main` raises the latest stable version by `release`. A prerelease branch
|
|
219
|
+
* targets the same version, or the version its earlier prereleases already
|
|
220
|
+
* target when that is higher, and numbers the prerelease after every existing
|
|
221
|
+
* tag of that version and channel.
|
|
222
|
+
*/
|
|
223
|
+
declare function getNextVersion(channel: ReleaseChannel, release: Exclude<ReleaseType, false>, tags: VersionTags): string;
|
|
224
|
+
interface ReleaseNotesOptions {
|
|
225
|
+
version: string;
|
|
226
|
+
/** Tag of the previous release, for the compare link. */
|
|
227
|
+
previousTag?: string;
|
|
228
|
+
/** Release date as `YYYY-MM-DD`. */
|
|
229
|
+
date?: string;
|
|
230
|
+
/** Repository URL, such as `https://github.com/owner/repo`, for links. */
|
|
231
|
+
repositoryUrl?: string;
|
|
232
|
+
commits: CommitDecision[];
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Markdown release notes. Only commits that release appear, grouped by type in
|
|
236
|
+
* the order of the commit table; `BREAKING CHANGE:` footers of major releases
|
|
237
|
+
* come first.
|
|
238
|
+
*/
|
|
239
|
+
declare function renderReleaseNotes(options: ReleaseNotesOptions): string;
|
|
240
|
+
export { findCommitRule as $, ReleaseDecision as A, getReleasePolicy as B, renderAgentsBlock as C, CommitViolation as D, CommitInput as E, createReleasePathMatcher as F, releaseModes as G, headerPattern as H, defaultReleaseMode as I, ConventionalCommitType as J, resolveCommitRelease as K, defaultReleasePathExcludes as L, ReleasePathsConfig as M, ReleasePolicy as N, CommitViolationRule as O, ResolveCommitOptions as P, compareRelease as Q, defaultReleasePolicy as R, getReleaseTable as S, CommitDecision as T, nonReleaseAlternatives as U, getReleaseType as V, parseCommit as W, ReleaseType as X, LegacyCommitType as Y, commits as Z, RenderAgentsBlockOptions as _, getBaseTag as a, normalizeType as at, agentsBlockStart as b, getReleaseChannel as c, releaseLevels as ct, prereleaseChannels as d, legacyCommits as et, releaseBranches as f, AgentCommitPolicyOptions as g, AgentCommitPolicyExample as h, VersionTags as i, nonReleaseTypes as it, ReleaseMode as j, ParsedCommit as k, initialVersion as l, releaseTypes as lt, AgentCommitPolicy as m, renderReleaseNotes as n, maxRelease as nt, getLatestStableVersion as o, releaseCommits as ot, toVersionTag as p, resolveRelease as q, ReleaseChannel as r, nonReleaseCommits as rt, getNextVersion as s, releaseGroups as st, ReleaseNotesOptions as t, legacyTypes as tt, parseVersionTag as u, types as ut, agentCommitPolicy as v, AronrepoConfig as w, getAgentCommitPolicy as x, agentsBlockEnd as y, defineConfig as z };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
//#endregion
|
|
4
|
-
export { packages };
|
|
5
|
-
//# sourceMappingURL=index.d.ts.map
|
|
1
|
+
import { $ as findCommitRule, A as ReleaseDecision, B as getReleasePolicy, C as renderAgentsBlock, D as CommitViolation, E as CommitInput, F as createReleasePathMatcher, G as releaseModes, H as headerPattern, I as defaultReleaseMode, J as ConventionalCommitType, K as resolveCommitRelease, L as defaultReleasePathExcludes, M as ReleasePathsConfig, N as ReleasePolicy, O as CommitViolationRule, P as ResolveCommitOptions, Q as compareRelease, R as defaultReleasePolicy, S as getReleaseTable, T as CommitDecision, U as nonReleaseAlternatives, V as getReleaseType, W as parseCommit, X as ReleaseType, Y as LegacyCommitType, Z as commits, _ as RenderAgentsBlockOptions, a as getBaseTag, at as normalizeType, b as agentsBlockStart, c as getReleaseChannel, ct as releaseLevels, d as prereleaseChannels, et as legacyCommits, f as releaseBranches, g as AgentCommitPolicyOptions, h as AgentCommitPolicyExample, i as VersionTags, it as nonReleaseTypes, j as ReleaseMode, k as ParsedCommit, l as initialVersion, lt as releaseTypes, m as AgentCommitPolicy, n as renderReleaseNotes, nt as maxRelease, o as getLatestStableVersion, ot as releaseCommits, p as toVersionTag, q as resolveRelease, r as ReleaseChannel, rt as nonReleaseCommits, s as getNextVersion, st as releaseGroups, t as ReleaseNotesOptions, tt as legacyTypes, u as parseVersionTag, ut as types, v as agentCommitPolicy, w as AronrepoConfig, x as getAgentCommitPolicy, y as agentsBlockEnd, z as defineConfig } from "./index-Co5yiJXA.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, 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 };
|