@williamthorsen/release-kit 15.0.3 → 16.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.
Files changed (135) hide show
  1. package/.meta/changelog.json +66 -0
  2. package/.readyup/kits/default.js +13 -13
  3. package/.readyup/kits/npm-auto-publish.js +4 -4
  4. package/.readyup/manifest.json +12 -12
  5. package/CHANGELOG.md +19 -0
  6. package/README.md +7 -1
  7. package/dist/esm/applyChangelogOverrides.js +6 -6
  8. package/dist/esm/assertReleasesOnNpm.js +11 -11
  9. package/dist/esm/assertTaggedBaseline.js +5 -5
  10. package/dist/esm/bin/release-kit.js +16 -16
  11. package/dist/esm/buildChangelogEntries.d.ts +19 -19
  12. package/dist/esm/buildChangelogEntries.js +40 -36
  13. package/dist/esm/buildChangelogItem.js +24 -24
  14. package/dist/esm/buildDependencyGraph.js +23 -23
  15. package/dist/esm/buildReleasedResult.js +21 -19
  16. package/dist/esm/buildSyntheticChangelogEntry.js +2 -2
  17. package/dist/esm/bumpVersion.js +8 -8
  18. package/dist/esm/changelogArchive.d.ts +1 -1
  19. package/dist/esm/changelogArchive.js +2 -2
  20. package/dist/esm/changelogJsonFile.js +5 -5
  21. package/dist/esm/changelogJsonUtils.js +3 -3
  22. package/dist/esm/changelogOverrides.d.ts +5 -5
  23. package/dist/esm/changelogOverrides.js +23 -23
  24. package/dist/esm/classifyChangelogCommit.js +4 -4
  25. package/dist/esm/commitCommand.js +3 -3
  26. package/dist/esm/compareVersions.js +13 -13
  27. package/dist/esm/configSchema.d.ts +2 -2
  28. package/dist/esm/configSchema.js +1 -1
  29. package/dist/esm/createGithubRelease.d.ts +4 -4
  30. package/dist/esm/createGithubRelease.js +10 -10
  31. package/dist/esm/createGithubReleaseCommand.js +9 -9
  32. package/dist/esm/createTags.d.ts +2 -2
  33. package/dist/esm/createTags.js +8 -8
  34. package/dist/esm/decideDirectReleases.d.ts +5 -5
  35. package/dist/esm/decideDirectReleases.js +25 -25
  36. package/dist/esm/decideRelease.d.ts +1 -1
  37. package/dist/esm/decideRelease.js +2 -2
  38. package/dist/esm/deriveDirectoryConfig.d.ts +1 -1
  39. package/dist/esm/deriveDirectoryConfig.js +18 -18
  40. package/dist/esm/deriveWorkspaceConfig.js +4 -4
  41. package/dist/esm/detectPackageManager.js +5 -5
  42. package/dist/esm/detectUndeclaredTagPrefixes.js +6 -6
  43. package/dist/esm/enumerateReleaseWindows.d.ts +1 -1
  44. package/dist/esm/enumerateReleaseWindows.js +7 -7
  45. package/dist/esm/findTransitiveDependents.js +5 -5
  46. package/dist/esm/findUnroutedEntryScopes.js +11 -11
  47. package/dist/esm/format.d.ts +1 -1
  48. package/dist/esm/format.js +1 -1
  49. package/dist/esm/formatPrepareFiles.d.ts +3 -3
  50. package/dist/esm/formatPrepareFiles.js +10 -10
  51. package/dist/esm/formatPrepareWarnings.js +6 -6
  52. package/dist/esm/hasPrettierConfig.js +2 -2
  53. package/dist/esm/init/checks.js +5 -3
  54. package/dist/esm/init/detectRepoType.js +3 -3
  55. package/dist/esm/init/initCommand.d.ts +4 -4
  56. package/dist/esm/init/initCommand.js +7 -7
  57. package/dist/esm/init/parseJsonRecord.d.ts +1 -1
  58. package/dist/esm/init/parseJsonRecord.js +4 -4
  59. package/dist/esm/init/scaffold.d.ts +4 -4
  60. package/dist/esm/init/scaffold.js +15 -15
  61. package/dist/esm/init/templates.d.ts +10 -10
  62. package/dist/esm/init/templates.js +5 -5
  63. package/dist/esm/init/updateTemplatesCommand.d.ts +2 -2
  64. package/dist/esm/init/updateTemplatesCommand.js +14 -12
  65. package/dist/esm/injectReleaseNotesIntoReadme.d.ts +1 -1
  66. package/dist/esm/injectReleaseNotesIntoReadme.js +6 -6
  67. package/dist/esm/injectSection.js +8 -8
  68. package/dist/esm/loadChangelogOverrides.d.ts +1 -1
  69. package/dist/esm/loadChangelogOverrides.js +9 -9
  70. package/dist/esm/loadConfig.d.ts +3 -3
  71. package/dist/esm/loadConfig.js +10 -10
  72. package/dist/esm/loadValidatedConfig.js +4 -4
  73. package/dist/esm/mergeConfig.d.ts +1 -1
  74. package/dist/esm/mergeConfig.js +27 -27
  75. package/dist/esm/monorepoConfigAssertions.js +15 -15
  76. package/dist/esm/npmRegistry.js +4 -4
  77. package/dist/esm/packsPath.js +3 -3
  78. package/dist/esm/parseChangeRecordBlock.js +33 -33
  79. package/dist/esm/parseCommitMessage.js +5 -5
  80. package/dist/esm/planChangelogFiles.js +8 -8
  81. package/dist/esm/planReleaseNotesPreviews.js +10 -10
  82. package/dist/esm/planVersionBump.js +24 -16
  83. package/dist/esm/prepareArgs.d.ts +9 -9
  84. package/dist/esm/prepareArgs.js +11 -11
  85. package/dist/esm/prepareCommand.js +23 -23
  86. package/dist/esm/prepareComposite.d.ts +4 -4
  87. package/dist/esm/prepareComposite.js +16 -16
  88. package/dist/esm/{releasePrepareTargets.d.ts → prepareReleaseTargets.d.ts} +9 -9
  89. package/dist/esm/{releasePrepareTargets.js → prepareReleaseTargets.js} +40 -40
  90. package/dist/esm/prepareRunContext.d.ts +1 -1
  91. package/dist/esm/prepareRunContext.js +5 -5
  92. package/dist/esm/prepareTarget.d.ts +3 -3
  93. package/dist/esm/prepareTarget.js +41 -39
  94. package/dist/esm/previewTagPrefixes.js +19 -19
  95. package/dist/esm/propagateBumps.js +8 -8
  96. package/dist/esm/publish.d.ts +2 -2
  97. package/dist/esm/publish.js +5 -5
  98. package/dist/esm/publishCommand.js +20 -20
  99. package/dist/esm/pushCommand.js +8 -8
  100. package/dist/esm/pushRelease.d.ts +1 -1
  101. package/dist/esm/pushRelease.js +2 -2
  102. package/dist/esm/readChangelogSections.d.ts +1 -1
  103. package/dist/esm/readChangelogSections.js +16 -16
  104. package/dist/esm/releasePlan.js +25 -25
  105. package/dist/esm/renderChangelogMarkdown.d.ts +4 -4
  106. package/dist/esm/renderChangelogMarkdown.js +18 -15
  107. package/dist/esm/renderReleaseNotes.d.ts +1 -1
  108. package/dist/esm/renderReleaseNotes.js +16 -16
  109. package/dist/esm/reportPrepare.js +34 -34
  110. package/dist/esm/resolveCommandTags.js +9 -9
  111. package/dist/esm/resolveReleaseDeclaration.d.ts +2 -2
  112. package/dist/esm/resolveReleaseDeclaration.js +22 -22
  113. package/dist/esm/resolveReleaseTags.js +17 -15
  114. package/dist/esm/resolveReleaseTargets.js +2 -2
  115. package/dist/esm/showTagPrefixesCommand.js +4 -4
  116. package/dist/esm/sync-labels/generateCommand.d.ts +3 -3
  117. package/dist/esm/sync-labels/generateCommand.js +10 -10
  118. package/dist/esm/sync-labels/initCommand.d.ts +3 -3
  119. package/dist/esm/sync-labels/initCommand.js +15 -15
  120. package/dist/esm/sync-labels/presets.js +3 -3
  121. package/dist/esm/sync-labels/resolveLabels.js +13 -13
  122. package/dist/esm/sync-labels/templates.d.ts +2 -2
  123. package/dist/esm/sync-labels/templates.js +1 -1
  124. package/dist/esm/tagCommand.js +4 -4
  125. package/dist/esm/topologicalSort.d.ts +2 -2
  126. package/dist/esm/topologicalSort.js +7 -7
  127. package/dist/esm/types.d.ts +3 -3
  128. package/dist/esm/validateAllChangelogOverrides.js +9 -9
  129. package/dist/esm/validateConfig.d.ts +1 -1
  130. package/dist/esm/validateConfig.js +60 -50
  131. package/dist/esm/validateOverridesCommand.js +2 -2
  132. package/docs/changelogs.md +5 -5
  133. package/docs/configuration.md +1 -1
  134. package/docs/work-types.md +1 -1
  135. package/package.json +1 -1
@@ -6,34 +6,42 @@ function isPackageJson(value) {
6
6
  return typeof value === 'object' && value !== null && 'version' in value && typeof value.version === 'string';
7
7
  }
8
8
  export function planVersionBump(packageFiles, releaseType) {
9
- const { firstFile, firstPkg } = readPrimaryPackage(packageFiles);
10
- const currentVersion = firstPkg.version;
9
+ const { firstFile, firstPackageJson } = readPrimaryPackage(packageFiles);
10
+ const currentVersion = firstPackageJson.version;
11
11
  const newVersion = bumpVersion(currentVersion, releaseType);
12
- return { currentVersion, newVersion, writes: renderVersionWrites(packageFiles, firstFile, firstPkg, newVersion) };
12
+ return {
13
+ currentVersion,
14
+ newVersion,
15
+ writes: renderVersionWrites(packageFiles, firstFile, firstPackageJson, newVersion),
16
+ };
13
17
  }
14
18
  export function planVersionSet(packageFiles, newVersion) {
15
- const { firstFile, firstPkg } = readPrimaryPackage(packageFiles);
16
- const currentVersion = firstPkg.version;
19
+ const { firstFile, firstPackageJson } = readPrimaryPackage(packageFiles);
20
+ const currentVersion = firstPackageJson.version;
17
21
  if (!isForwardVersion(currentVersion, newVersion)) {
18
22
  throw new Error(`--set-version ${newVersion} is not greater than current version ${currentVersion}`);
19
23
  }
20
- return { currentVersion, newVersion, writes: renderVersionWrites(packageFiles, firstFile, firstPkg, newVersion) };
24
+ return {
25
+ currentVersion,
26
+ newVersion,
27
+ writes: renderVersionWrites(packageFiles, firstFile, firstPackageJson, newVersion),
28
+ };
21
29
  }
22
30
  export function readCurrentVersion(packageFiles) {
23
- return readPrimaryPackage(packageFiles).firstPkg.version;
31
+ return readPrimaryPackage(packageFiles).firstPackageJson.version;
24
32
  }
25
33
  function readPrimaryPackage(packageFiles) {
26
34
  const firstFile = packageFiles[0];
27
35
  if (firstFile === undefined) {
28
36
  throw new Error('No package files specified');
29
37
  }
30
- return { firstFile, firstPkg: readPackageJson(firstFile) };
38
+ return { firstFile, firstPackageJson: readPackageJson(firstFile) };
31
39
  }
32
- function renderVersionWrites(packageFiles, firstFile, firstPkg, newVersion) {
40
+ function renderVersionWrites(packageFiles, firstFile, firstPackageJson, newVersion) {
33
41
  return packageFiles.map((filePath) => {
34
- const pkg = filePath === firstFile ? firstPkg : readPackageJson(filePath);
35
- pkg.version = newVersion;
36
- return { path: filePath, content: JSON.stringify(pkg, null, 2) + '\n' };
42
+ const packageJson = filePath === firstFile ? firstPackageJson : readPackageJson(filePath);
43
+ packageJson.version = newVersion;
44
+ return { path: filePath, content: JSON.stringify(packageJson, null, 2) + '\n' };
37
45
  });
38
46
  }
39
47
  function readPackageJson(filePath) {
@@ -44,15 +52,15 @@ function readPackageJson(filePath) {
44
52
  catch (error) {
45
53
  throw chainError(`Failed to read ${filePath}`, error);
46
54
  }
47
- let parsed;
55
+ let parsedJson;
48
56
  try {
49
- parsed = JSON.parse(content);
57
+ parsedJson = JSON.parse(content);
50
58
  }
51
59
  catch (error) {
52
60
  throw chainError(`Failed to parse JSON in ${filePath}`, error);
53
61
  }
54
- if (!isPackageJson(parsed)) {
62
+ if (!isPackageJson(parsedJson)) {
55
63
  throw new Error(`No valid 'version' field found in ${filePath}`);
56
64
  }
57
- return parsed;
65
+ return parsedJson;
58
66
  }
@@ -2,15 +2,15 @@ import type { ReleaseType } from './types.js';
2
2
  /** Canonical `N.N.N` semver pattern for validating `--set-version` input. */
3
3
  export declare const CANONICAL_SEMVER_PATTERN: RegExp;
4
4
  export declare const prepareFlagSchema: {
5
- dryRun: {
5
+ isDryRun: {
6
6
  long: string;
7
7
  type: "boolean";
8
8
  };
9
- force: {
9
+ shouldForce: {
10
10
  long: string;
11
11
  type: "boolean";
12
12
  };
13
- noGitChecks: {
13
+ shouldSkipGitChecks: {
14
14
  long: string;
15
15
  type: "boolean";
16
16
  short: string;
@@ -27,7 +27,7 @@ export declare const prepareFlagSchema: {
27
27
  long: string;
28
28
  type: "string";
29
29
  };
30
- withReleaseNotes: {
30
+ shouldIncludeReleaseNotes: {
31
31
  long: string;
32
32
  type: "boolean";
33
33
  };
@@ -39,14 +39,14 @@ export declare const prepareFlagSchema: {
39
39
  /** Parses CLI arguments into structured options. Prints a usage error and exits on invalid input. */
40
40
  export declare function parseArgs(argv: string[]): {
41
41
  configPath: string | undefined;
42
- dryRun: boolean;
43
- force: boolean;
44
- noGitChecks: boolean;
42
+ isDryRun: boolean;
43
+ shouldForce: boolean;
44
+ shouldSkipGitChecks: boolean;
45
45
  bumpOverride: ReleaseType | undefined;
46
- only: string[] | undefined;
46
+ onlyNames: string[] | undefined;
47
47
  /** The raw `--set-version` value, whose accepted form depends on the mode. */
48
48
  setVersion: string | undefined;
49
- withReleaseNotes: boolean;
49
+ shouldIncludeReleaseNotes: boolean;
50
50
  };
51
51
  /**
52
52
  * Parses a monorepo `--set-version` value, a comma-separated list of `<target>@N.N.N` entries, into versions keyed by
@@ -4,9 +4,9 @@ const VALID_BUMP_TYPES = ['major', 'minor', 'patch'];
4
4
  export const CANONICAL_SEMVER_PATTERN = /^\d+\.\d+\.\d+$/;
5
5
  export const prepareFlagSchema = {
6
6
  ...configFlagSchema,
7
- dryRun: { long: '--dry-run', type: 'boolean' },
8
- force: { long: '--force', type: 'boolean' },
9
- noGitChecks: {
7
+ isDryRun: { long: '--dry-run', type: 'boolean' },
8
+ shouldForce: { long: '--force', type: 'boolean' },
9
+ shouldSkipGitChecks: {
10
10
  long: '--no-git-checks',
11
11
  type: 'boolean',
12
12
  short: '-n',
@@ -14,7 +14,7 @@ export const prepareFlagSchema = {
14
14
  bump: { long: '--bump', type: 'string' },
15
15
  setVersion: { long: '--set-version', type: 'string' },
16
16
  only: { long: '--only', type: 'string' },
17
- withReleaseNotes: { long: '--with-release-notes', type: 'boolean' },
17
+ shouldIncludeReleaseNotes: { long: '--with-release-notes', type: 'boolean' },
18
18
  };
19
19
  export function parseArgs(argv) {
20
20
  const { flags } = parseArgsOrExit(argv, prepareFlagSchema);
@@ -26,19 +26,19 @@ export function parseArgs(argv) {
26
26
  }
27
27
  bumpOverride = flags.bump;
28
28
  }
29
- let only;
29
+ let onlyNames;
30
30
  if (flags.only !== undefined) {
31
- only = flags.only.split(',');
31
+ onlyNames = flags.only.split(',');
32
32
  }
33
33
  return {
34
34
  configPath: flags.config,
35
- dryRun: flags.dryRun,
36
- force: flags.force,
37
- noGitChecks: flags.noGitChecks,
35
+ isDryRun: flags.isDryRun,
36
+ shouldForce: flags.shouldForce,
37
+ shouldSkipGitChecks: flags.shouldSkipGitChecks,
38
38
  bumpOverride,
39
- only,
39
+ onlyNames,
40
40
  setVersion: flags.setVersion,
41
- withReleaseNotes: flags.withReleaseNotes,
41
+ shouldIncludeReleaseNotes: flags.shouldIncludeReleaseNotes,
42
42
  };
43
43
  }
44
44
  export function parseSetVersions(value, knownNames) {
@@ -8,23 +8,23 @@ import { dim } from "./format.js";
8
8
  import { RELEASE_GLYPHS } from "./glyphs.js";
9
9
  import { loadValidatedConfig, reportConfigProblem, reportConfigWarnings } from "./loadValidatedConfig.js";
10
10
  import { CANONICAL_SEMVER_PATTERN, parseArgs, parseSetVersions } from "./prepareArgs.js";
11
+ import { prepareReleaseTargets } from "./prepareReleaseTargets.js";
11
12
  import { RELEASE_SUMMARY_FILE, RELEASE_TAGS_FILE } from "./releaseFiles.js";
12
13
  import { applyReleasePlan } from "./releasePlan.js";
13
- import { releasePrepareTargets } from "./releasePrepareTargets.js";
14
14
  import { reportPrepare } from "./reportPrepare.js";
15
15
  import { resolveConfigFlag } from "./resolveConfigFlag.js";
16
16
  import { isSinglePackageTargets, PROJECT_TARGET_ID, resolveReleaseTargets, SINGLE_PACKAGE_TARGET_ID, } from "./resolveReleaseTargets.js";
17
17
  export async function prepareCommand(argv, styles, invocationDir) {
18
- const { configPath: configFlag, dryRun, force, noGitChecks, bumpOverride, only, setVersion, withReleaseNotes, } = parseArgs(argv);
18
+ const { configPath: configFlag, isDryRun, shouldForce, shouldSkipGitChecks, bumpOverride, onlyNames, setVersion, shouldIncludeReleaseNotes, } = parseArgs(argv);
19
19
  const options = {
20
- force,
20
+ shouldForce,
21
21
  ...(bumpOverride !== undefined && { bumpOverride }),
22
- ...(withReleaseNotes && { withReleaseNotes: true }),
22
+ ...(shouldIncludeReleaseNotes && { shouldIncludeReleaseNotes: true }),
23
23
  };
24
- if (dryRun) {
24
+ if (isDryRun) {
25
25
  console.info(`\n${formatGlyphLine(RELEASE_GLYPHS, styles.stdout, 'dryRun', 'DRY RUN: release-kit will not modify any files')}\n`);
26
26
  }
27
- if (!dryRun && !noGitChecks) {
27
+ if (!isDryRun && !shouldSkipGitChecks) {
28
28
  try {
29
29
  assertCleanWorkingTree();
30
30
  }
@@ -43,37 +43,37 @@ export async function prepareCommand(argv, styles, invocationDir) {
43
43
  reportConfigWarnings(configResult.warnings, styles.stderr);
44
44
  userConfig = configResult.config;
45
45
  }
46
- let workspace;
46
+ let workspaceDiscovery;
47
47
  try {
48
- workspace = discoverWorkspaces();
48
+ workspaceDiscovery = discoverWorkspaces();
49
49
  }
50
50
  catch (error) {
51
51
  reportError(`Failed to discover workspaces: ${describeError(error)}`);
52
52
  process.exit(1);
53
53
  }
54
- if (workspace.kind === 'empty') {
55
- reportError(`No workspace package to release. ${describeEmptyWorkspace(workspace)}`);
54
+ if (workspaceDiscovery.kind === 'empty') {
55
+ reportError(`No workspace package to release. ${describeEmptyWorkspace(workspaceDiscovery)}`);
56
56
  process.exit(1);
57
57
  }
58
- const config = resolveTargetsOrExit(userConfig, workspace, only, setVersion);
58
+ const config = resolveTargetsOrExit(userConfig, workspaceDiscovery, onlyNames, setVersion);
59
59
  const targetOptions = {
60
60
  ...options,
61
- ...(only !== undefined && { only }),
62
- ...(setVersion !== undefined && { setVersions: resolveSetVersions(setVersion, config.targets) }),
61
+ ...(onlyNames !== undefined && { onlyTargetIds: onlyNames }),
62
+ ...(setVersion !== undefined && { versionOverridesById: resolveSetVersions(setVersion, config.targets) }),
63
63
  };
64
64
  runAndReport(() => {
65
- const plan = releasePrepareTargets(config, targetOptions);
65
+ const plan = prepareReleaseTargets(config, targetOptions);
66
66
  assertReleasesOnNpm(findReleasedPackagePaths(plan, config.targets));
67
67
  return plan;
68
- }, dryRun, styles.stdout);
68
+ }, isDryRun, styles.stdout);
69
69
  }
70
70
  function findReleasedPackagePaths(plan, targets) {
71
71
  const releasedIds = new Set(plan.targets.flatMap((result) => result.status === 'released' && result.kind === 'package' ? result.targetId : []));
72
72
  return targets.flatMap((target) => target.kind === 'package' && releasedIds.has(target.id) ? target.packagePath : []);
73
73
  }
74
- function resolveTargetsOrExit(userConfig, discovery, only, setVersion) {
74
+ function resolveTargetsOrExit(userConfig, discovery, onlyNames, setVersion) {
75
75
  if (discovery.kind === 'single-package') {
76
- if (only !== undefined) {
76
+ if (onlyNames !== undefined) {
77
77
  reportError('--only is only supported for monorepo configurations');
78
78
  process.exit(1);
79
79
  }
@@ -98,8 +98,8 @@ function resolveTargetsOrExit(userConfig, discovery, only, setVersion) {
98
98
  process.exit(1);
99
99
  }
100
100
  const knownNames = listSelectableIds(config.targets);
101
- const onlyNames = only ?? [];
102
- for (const name of onlyNames) {
101
+ const requestedNames = onlyNames ?? [];
102
+ for (const name of requestedNames) {
103
103
  if (knownNames.includes(name)) {
104
104
  continue;
105
105
  }
@@ -120,7 +120,7 @@ function listSelectableIds(targets) {
120
120
  function listMemberIds(targets) {
121
121
  return targets.flatMap((target) => (target.kind === 'composite' ? [] : target.id));
122
122
  }
123
- function runAndReport(computePlan, dryRun, style) {
123
+ function runAndReport(computePlan, isDryRun, style) {
124
124
  let plan;
125
125
  try {
126
126
  plan = computePlan();
@@ -130,7 +130,7 @@ function runAndReport(computePlan, dryRun, style) {
130
130
  process.stderr.write('The command did not write any files; the working tree is unchanged.\n');
131
131
  process.exit(1);
132
132
  }
133
- if (dryRun) {
133
+ if (isDryRun) {
134
134
  process.stdout.write(reportPrepare(plan, { applied: false, style }) + '\n');
135
135
  reportPlanFiles(plan, true);
136
136
  return;
@@ -164,11 +164,11 @@ function runFormatCommand(formatCommand) {
164
164
  return describeError(error);
165
165
  }
166
166
  }
167
- function reportPlanFiles(plan, dryRun) {
167
+ function reportPlanFiles(plan, isDryRun) {
168
168
  if (plan.tags.length === 0) {
169
169
  return;
170
170
  }
171
- if (dryRun) {
171
+ if (isDryRun) {
172
172
  console.info(dim(` [dry-run] Would write ${RELEASE_TAGS_FILE}: ${plan.tags.join(' ')}`));
173
173
  if (plan.summary.length > 0) {
174
174
  console.info(dim(` [dry-run] Would write ${RELEASE_SUMMARY_FILE}`));
@@ -5,12 +5,12 @@ import type { CompositeTarget, ReleaseType, TargetPrepareResult } from './types.
5
5
  * prepares it: every run that `only` doesn't narrow, and every one that names it. A `project` block's composite
6
6
  * cannot be named.
7
7
  */
8
- export declare function describeCompositeSkip(composite: CompositeTarget, only: readonly string[] | undefined): string | undefined;
8
+ export declare function describeCompositeSkip(compositeTarget: CompositeTarget, onlyNames: readonly string[] | undefined): string | undefined;
9
9
  /**
10
10
  * Prepares a composite target: reads its history, asserts its baseline, and decides and plans its release, appending
11
11
  * its tag, writes, and modified files to the run's collection and its preview warnings to `warnings`.
12
12
  */
13
- export declare function prepareComposite(composite: CompositeTarget, context: RunContext, options: {
14
- force?: boolean;
13
+ export declare function prepareComposite(compositeTarget: CompositeTarget, context: RunContext, options: {
14
+ shouldForce?: boolean;
15
15
  bumpOverride?: ReleaseType;
16
- }, collected: CollectedReleases, warnings: string[]): TargetPrepareResult;
16
+ }, collectedReleases: CollectedReleases, warnings: string[]): TargetPrepareResult;
@@ -2,38 +2,38 @@ import { assertTaggedBaseline } from "./assertTaggedBaseline.js";
2
2
  import { collect } from "./prepareRunContext.js";
3
3
  import { buildSkippedTargetResult, decideTargetRelease, planTargetRelease, readTargetHistory, } from "./prepareTarget.js";
4
4
  import { PROJECT_TARGET_ID } from "./resolveReleaseTargets.js";
5
- export function describeCompositeSkip(composite, only) {
6
- if (only === undefined || only.includes(composite.id)) {
5
+ export function describeCompositeSkip(compositeTarget, onlyNames) {
6
+ if (onlyNames === undefined || onlyNames.includes(compositeTarget.id)) {
7
7
  return undefined;
8
8
  }
9
- if (composite.id === PROJECT_TARGET_ID) {
10
- return (`Project release skipped: --only narrows this run to ${only.join(', ')}. ` +
9
+ if (compositeTarget.id === PROJECT_TARGET_ID) {
10
+ return (`Project release skipped: --only narrows this run to ${onlyNames.join(', ')}. ` +
11
11
  'Run `release-kit prepare` without --only to include the project release.');
12
12
  }
13
- return `Release '${composite.id}' skipped: --only does not name it. Add ${composite.id} to --only to include it.`;
13
+ return `Release '${compositeTarget.id}' skipped: --only does not name it. Add ${compositeTarget.id} to --only to include it.`;
14
14
  }
15
- export function prepareComposite(composite, context, options, collected, warnings) {
16
- const { history, untagged } = readTargetHistory(composite, context.settings);
17
- assertTaggedBaseline([untagged]);
18
- const decision = decideTargetRelease(composite, history, {
19
- force: options.force === true,
15
+ export function prepareComposite(compositeTarget, context, options, collectedReleases, warnings) {
16
+ const { history, untaggedBaseline } = readTargetHistory(compositeTarget, context.settings);
17
+ assertTaggedBaseline([untaggedBaseline]);
18
+ const decision = decideTargetRelease(compositeTarget, history, {
19
+ shouldForce: options.shouldForce === true,
20
20
  bumpOverride: options.bumpOverride,
21
21
  setVersion: undefined,
22
22
  });
23
23
  if (decision.outcome === 'skip') {
24
- return buildSkippedTargetResult(composite, history, decision.skipReason);
24
+ return buildSkippedTargetResult(compositeTarget, history, decision.skipReason);
25
25
  }
26
26
  if (decision.setVersion !== undefined) {
27
27
  throw new Error('A composite target cannot take --set-version');
28
28
  }
29
- const planned = planTargetRelease({
29
+ const plannedRelease = planTargetRelease({
30
30
  ...context,
31
- target: composite,
31
+ target: compositeTarget,
32
32
  release: { releaseType: decision.releaseType },
33
33
  decision,
34
34
  history,
35
35
  });
36
- collect(collected, planned);
37
- warnings.push(...planned.warnings);
38
- return planned.result;
36
+ collect(collectedReleases, plannedRelease);
37
+ warnings.push(...plannedRelease.warnings);
38
+ return plannedRelease.result;
39
39
  }
@@ -12,7 +12,7 @@ export interface TargetPrepareOptions {
12
12
  * Release even when the range since the last tag doesn't contain any commits or any bump-worthy commits.
13
13
  * Orthogonal to `bumpOverride`: When `bumpOverride` is not given, the release falls back to `patch`.
14
14
  */
15
- force?: boolean;
15
+ shouldForce?: boolean;
16
16
  /** Level of the release, in place of the level that the changelog items call for; it doesn't trigger a release. */
17
17
  bumpOverride?: ReleaseType;
18
18
  /**
@@ -20,28 +20,28 @@ export interface TargetPrepareOptions {
20
20
  * `RELEASE_NOTES.v{version}.md`) from its changelog entries. Requires `changelogJson.enabled`; when disabled, the
21
21
  * plan records a warning and doesn't plan any previews.
22
22
  */
23
- withReleaseNotes?: boolean;
23
+ shouldIncludeReleaseNotes?: boolean;
24
24
  /**
25
25
  * Ids of the targets from which the release starts; the run plans the named package targets and their transitive
26
26
  * dependents, and each named composite, which reads its own window. Present only for a narrowed run, which skips
27
27
  * every composite that it doesn't name.
28
28
  */
29
- only?: readonly string[];
29
+ onlyTargetIds?: readonly string[];
30
30
  /**
31
31
  * Explicit versions (canonical `N.N.N`), keyed by package target id. Each named target starts the release and
32
- * releases at its version, which takes precedence over `bumpOverride` and `force`.
32
+ * releases at its version, which takes precedence over `bumpOverride` and `shouldForce`.
33
33
  */
34
- setVersions?: ReadonlyMap<string, string>;
34
+ versionOverridesById?: ReadonlyMap<string, string>;
35
35
  }
36
36
  /**
37
37
  * Plans a release over a list of targets, without writing any file.
38
38
  *
39
- * 1. Selects the planned package and directory targets: every one, or, under `only`, those named and their transitive
40
- * dependents.
39
+ * 1. Selects the planned package and directory targets: every one, or, under `onlyTargetIds`, those named and their
40
+ * transitive dependents.
41
41
  * 2. Reads each planned target's history and decides its direct release.
42
42
  * 3. Propagates bumps to dependents, asserts the baselines that matter, and sorts the release set topologically.
43
43
  * 4. Plans each release in dependency order.
44
- * 5. Prepares each composite after every package target, unless `only` narrowed the run without naming it.
44
+ * 5. Prepares each composite after every package target, unless `onlyTargetIds` narrowed the run without naming it.
45
45
  * 6. Renders the format command over the modified files.
46
46
  */
47
- export declare function releasePrepareTargets(config: TargetPrepareConfig, options: TargetPrepareOptions): ReleasePlan;
47
+ export declare function prepareReleaseTargets(config: TargetPrepareConfig, options: TargetPrepareOptions): ReleasePlan;
@@ -13,11 +13,11 @@ import { collect, describeStage, isRepoRootTarget, readHistory, runStage, } from
13
13
  import { buildSkippedTargetResult, planTargetRelease } from "./prepareTarget.js";
14
14
  import { propagateBumps } from "./propagateBumps.js";
15
15
  import { isSinglePackageTargets } from "./resolveReleaseTargets.js";
16
- import { topologicalSort } from "./topologicalSort.js";
16
+ import { sortTopologically } from "./topologicalSort.js";
17
17
  const PREVIEWS_REQUIRE_JSON_WARNING = '--with-release-notes requires changelogJson.enabled; skipping preview generation';
18
- export function releasePrepareTargets(config, options) {
18
+ export function prepareReleaseTargets(config, options) {
19
19
  const { settings } = config;
20
- const { only, withReleaseNotes } = options;
20
+ const { onlyTargetIds, shouldIncludeReleaseNotes } = options;
21
21
  const isSinglePackage = isSinglePackageTargets(config.targets);
22
22
  const memberTargets = config.targets.filter((target) => target.kind !== 'composite');
23
23
  const compositeTargets = config.targets.filter((target) => target.kind === 'composite');
@@ -25,91 +25,91 @@ export function releasePrepareTargets(config, options) {
25
25
  const graph = buildDependencyGraph(memberTargets.filter((target) => target.kind === 'package').filter((target) => target.isWorkspace));
26
26
  const startIds = selectStartIds(memberTargets, options);
27
27
  const plannedIds = findTransitiveDependents(graph, startIds);
28
- const planned = memberTargets.filter((target) => plannedIds.has(target.id));
29
- const arePreviewsBlocked = withReleaseNotes === true && !settings.changelogJson.enabled;
28
+ const plannedTargets = memberTargets.filter((target) => plannedIds.has(target.id));
29
+ const arePreviewsBlocked = shouldIncludeReleaseNotes === true && !settings.changelogJson.enabled;
30
30
  if (arePreviewsBlocked && !isSinglePackage) {
31
31
  warnings.push(PREVIEWS_REQUIRE_JSON_WARNING);
32
32
  }
33
33
  const workTypes = resolveWorkTypes(settings.workTypes);
34
34
  const context = {
35
35
  settings,
36
- overrideContext: createOverrideContext(planned.flatMap(listOverrideDirectory)),
36
+ overrideContext: createOverrideContext(plannedTargets.flatMap(listOverrideDirectory)),
37
37
  sectionOrder: deriveSectionOrder(workTypes),
38
38
  dependenciesHeader: deriveDependenciesHeader(workTypes),
39
- shouldPlanPreviews: withReleaseNotes === true && settings.changelogJson.enabled,
39
+ shouldPlanPreviews: shouldIncludeReleaseNotes === true && settings.changelogJson.enabled,
40
40
  today: new Date().toISOString().slice(0, 10),
41
41
  };
42
- const direct = decideDirectReleases(planned, settings, options, startIds);
42
+ const directReleases = decideDirectReleases(plannedTargets, settings, options, startIds);
43
43
  if (!isSinglePackage) {
44
- reportUnroutedEntryScopes(planned, direct, settings, memberTargets);
44
+ reportUnroutedEntryScopes(plannedTargets, directReleases, settings, memberTargets);
45
45
  }
46
- const releaseSet = propagateBumps(direct.bumps, graph);
47
- assertTaggedBaseline([...direct.untaggedBaselines]
48
- .filter(([id]) => direct.bumps.has(id) || !releaseSet.has(id))
46
+ const releaseSet = propagateBumps(directReleases.bumps, graph);
47
+ assertTaggedBaseline([...directReleases.untaggedBaselines]
48
+ .filter(([id]) => directReleases.bumps.has(id) || !releaseSet.has(id))
49
49
  .map(([, untagged]) => untagged));
50
- const { sorted: sortedIds, cyclicIds } = topologicalSort(releaseSet, graph);
50
+ const { sortedIds, cyclicIds } = sortTopologically(releaseSet, graph);
51
51
  if (cyclicIds.length > 0) {
52
52
  warnings.push(`Circular workspace dependencies detected among: ${cyclicIds.join(', ')}. ` +
53
53
  'Propagation metadata may be incomplete for these workspaces.');
54
54
  }
55
55
  const resultsById = new Map();
56
- for (const target of planned) {
57
- const decision = direct.decisions.get(target.id);
56
+ for (const target of plannedTargets) {
57
+ const decision = directReleases.decisions.get(target.id);
58
58
  if (decision?.outcome === 'skip' && !releaseSet.has(target.id)) {
59
- resultsById.set(target.id, buildSkippedTargetResult(target, readHistory(direct.readings, target), decision.skipReason));
59
+ resultsById.set(target.id, buildSkippedTargetResult(target, readHistory(directReleases.readings, target), decision.skipReason));
60
60
  }
61
61
  }
62
- const collected = { tags: [], writes: [], removals: [], modifiedFiles: [] };
62
+ const collectedReleases = { tags: [], writes: [], removals: [], modifiedFiles: [] };
63
63
  for (const id of sortedIds) {
64
- const target = planned.find((candidate) => candidate.id === id);
64
+ const target = plannedTargets.find((candidate) => candidate.id === id);
65
65
  const release = releaseSet.get(id);
66
66
  if (target === undefined || release === undefined) {
67
67
  continue;
68
68
  }
69
- const decision = direct.decisions.get(id);
69
+ const decision = directReleases.decisions.get(id);
70
70
  const plannedRelease = runStage(describeStage(target), () => planTargetRelease({
71
71
  ...context,
72
72
  target,
73
73
  release,
74
74
  decision: decision?.outcome === 'release' ? decision : undefined,
75
- history: readHistory(direct.readings, target),
75
+ history: readHistory(directReleases.readings, target),
76
76
  }));
77
- collect(collected, plannedRelease);
77
+ collect(collectedReleases, plannedRelease);
78
78
  warnings.push(...plannedRelease.warnings);
79
79
  resultsById.set(id, plannedRelease.result);
80
80
  }
81
- const results = planned.flatMap((target) => resultsById.get(target.id) ?? []);
81
+ const results = plannedTargets.flatMap((target) => resultsById.get(target.id) ?? []);
82
82
  for (const composite of compositeTargets) {
83
- const skipWarning = describeCompositeSkip(composite, only);
83
+ const skipWarning = describeCompositeSkip(composite, onlyTargetIds);
84
84
  if (skipWarning !== undefined) {
85
85
  warnings.push(skipWarning);
86
86
  continue;
87
87
  }
88
- const result = runStage(describeStage(composite), () => prepareComposite(composite, context, options, collected, warnings));
88
+ const result = runStage(describeStage(composite), () => prepareComposite(composite, context, options, collectedReleases, warnings));
89
89
  results.push(result);
90
90
  }
91
- const formatCommand = planFormatCommand(settings.formatCommand, collected);
91
+ const formatCommand = planFormatCommand(settings.formatCommand, collectedReleases);
92
92
  const { overrideContext } = context;
93
- for (const overrideKey of overrideContext.project.keys()) {
93
+ for (const overrideKey of overrideContext.projectOverrides.keys()) {
94
94
  if (!overrideContext.globalMatchedRootKeys.has(overrideKey)) {
95
95
  overrideContext.overrideWarnings.push(formatStaleOverrideKeyWarning(overrideKey));
96
96
  }
97
97
  }
98
98
  const allWarnings = isSinglePackage
99
- ? composeSinglePackageWarnings(collected, overrideContext, arePreviewsBlocked, warnings)
99
+ ? composeSinglePackageWarnings(collectedReleases, overrideContext, arePreviewsBlocked, warnings)
100
100
  : [...warnings, ...overrideContext.overrideWarnings];
101
101
  return {
102
102
  targets: results,
103
- tags: collected.tags,
104
- writes: collected.writes,
105
- removals: collected.removals,
103
+ tags: collectedReleases.tags,
104
+ writes: collectedReleases.writes,
105
+ removals: collectedReleases.removals,
106
106
  summary: buildReleaseSummary({ targets: results }),
107
107
  formatCommand,
108
108
  ...(allWarnings.length > 0 && { warnings: allWarnings }),
109
109
  };
110
110
  }
111
- function composeSinglePackageWarnings(collected, overrideContext, arePreviewsBlocked, previewWarnings) {
112
- if (collected.tags.length === 0) {
111
+ function composeSinglePackageWarnings(collectedReleases, overrideContext, arePreviewsBlocked, previewWarnings) {
112
+ if (collectedReleases.tags.length === 0) {
113
113
  return [];
114
114
  }
115
115
  return [
@@ -124,18 +124,18 @@ function listOverrideDirectory(target) {
124
124
  }
125
125
  return target.isWorkspace ? [target.packagePath] : [];
126
126
  }
127
- function planFormatCommand(configuredCommand, collected) {
128
- const formatCommandStr = configuredCommand ?? (hasPrettierConfig() ? 'npx prettier --write' : undefined);
129
- if (collected.tags.length === 0 || formatCommandStr === undefined) {
127
+ function planFormatCommand(configuredCommand, collectedReleases) {
128
+ const baseCommand = configuredCommand ?? (hasPrettierConfig() ? 'npx prettier --write' : undefined);
129
+ if (collectedReleases.tags.length === 0 || baseCommand === undefined) {
130
130
  return undefined;
131
131
  }
132
- const files = collected.modifiedFiles;
133
- return { command: `${formatCommandStr} ${files.join(' ')}`, files };
132
+ const files = collectedReleases.modifiedFiles;
133
+ return { command: `${baseCommand} ${files.join(' ')}`, files };
134
134
  }
135
135
  function selectStartIds(memberTargets, options) {
136
- const { only, setVersions } = options;
137
- if (only === undefined) {
136
+ const { onlyTargetIds, versionOverridesById } = options;
137
+ if (onlyTargetIds === undefined) {
138
138
  return new Set(memberTargets.map((target) => target.id));
139
139
  }
140
- return new Set([...only, ...(setVersions?.keys() ?? [])]);
140
+ return new Set([...onlyTargetIds, ...(versionOverridesById?.keys() ?? [])]);
141
141
  }
@@ -4,7 +4,7 @@ import { type TargetPrepareSettings } from './prepareTarget.js';
4
4
  import type { PlannedWrite } from './releasePlan.js';
5
5
  import type { DirectoryTarget, PackageTarget, ReleaseTarget } from './types.js';
6
6
  /** Appends one planned release's tag, writes, removals, and modified files to the run's collection. */
7
- export declare function collect(collected: CollectedReleases, planned: {
7
+ export declare function collect(collectedReleases: CollectedReleases, plannedRelease: {
8
8
  tag: string;
9
9
  writes: PlannedWrite[];
10
10
  removals: string[];
@@ -1,10 +1,10 @@
1
1
  import { chainError } from '@williamthorsen/toolbelt.errors/candidate';
2
2
  import { isRepoRoot } from "./prepareTarget.js";
3
- export function collect(collected, planned) {
4
- collected.tags.push(planned.tag);
5
- collected.writes.push(...planned.writes);
6
- collected.removals.push(...planned.removals);
7
- collected.modifiedFiles.push(...planned.modifiedFiles);
3
+ export function collect(collectedReleases, plannedRelease) {
4
+ collectedReleases.tags.push(plannedRelease.tag);
5
+ collectedReleases.writes.push(...plannedRelease.writes);
6
+ collectedReleases.removals.push(...plannedRelease.removals);
7
+ collectedReleases.modifiedFiles.push(...plannedRelease.modifiedFiles);
8
8
  }
9
9
  export function describeStage(target) {
10
10
  switch (target.kind) {
@@ -10,7 +10,7 @@ export type TargetPrepareSettings = Omit<ReleaseSettings, 'releaseNotes'>;
10
10
  /** One read of a target's release windows, and the untagged baseline that it found, if any. */
11
11
  export interface TargetReading {
12
12
  history: ReleaseHistory;
13
- untagged: UntaggedBaseline | undefined;
13
+ untaggedBaseline: UntaggedBaseline | undefined;
14
14
  }
15
15
  /** Outcome of {@link decideTargetRelease}: a release at a decided level or at an explicit version, or a skip. */
16
16
  export type TargetDecision = {
@@ -76,10 +76,10 @@ export declare function readTargetHistory(target: ReleaseTarget, settings: Targe
76
76
  export declare function describeHistoryWindow(target: ReleaseTarget): GenerateChangelogOptions;
77
77
  /**
78
78
  * Decides a target's direct release from its window: `setVersion` releases at that version, and otherwise the
79
- * window's bump, `force`, and `bumpOverride` decide as {@link decideRelease} states.
79
+ * window's bump, `shouldForce`, and `bumpOverride` decide as {@link decideRelease} states.
80
80
  */
81
81
  export declare function decideTargetRelease(target: ReleaseTarget, history: ReleaseHistory, options: {
82
- force: boolean;
82
+ shouldForce: boolean;
83
83
  bumpOverride: ReleaseType | undefined;
84
84
  setVersion: string | undefined;
85
85
  }): TargetDecision;