@williamthorsen/release-kit 14.0.0 → 14.2.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 (110) hide show
  1. package/.meta/changelog.json +173 -0
  2. package/.readyup/kits/default.js +64 -7
  3. package/.readyup/kits/npm-auto-publish.js +127 -75
  4. package/.readyup/manifest.json +22 -7
  5. package/CHANGELOG.md +47 -0
  6. package/README.md +18 -4
  7. package/dist/esm/assertReleasesOnNpm.d.ts +7 -0
  8. package/dist/esm/assertReleasesOnNpm.js +56 -0
  9. package/dist/esm/assertTaggedBaseline.d.ts +2 -2
  10. package/dist/esm/attachChangelogDiagnostics.d.ts +2 -2
  11. package/dist/esm/bin/release-kit.js +10 -6
  12. package/dist/esm/buildChangelogEntries.d.ts +3 -3
  13. package/dist/esm/buildChangelogEntries.js +3 -3
  14. package/dist/esm/buildDependencyGraph.d.ts +11 -11
  15. package/dist/esm/buildDependencyGraph.js +13 -13
  16. package/dist/esm/buildReleaseSummary.d.ts +3 -3
  17. package/dist/esm/buildReleaseSummary.js +4 -12
  18. package/dist/esm/changelogArchive.d.ts +14 -0
  19. package/dist/esm/changelogArchive.js +21 -0
  20. package/dist/esm/changelogJsonFile.d.ts +2 -2
  21. package/dist/esm/changelogOverrides.d.ts +9 -8
  22. package/dist/esm/changelogOverrides.js +3 -6
  23. package/dist/esm/createGithubReleaseCommand.d.ts +2 -1
  24. package/dist/esm/createGithubReleaseCommand.js +7 -4
  25. package/dist/esm/deriveDirectoryConfig.d.ts +13 -0
  26. package/dist/esm/deriveDirectoryConfig.js +59 -0
  27. package/dist/esm/deriveWorkspaceConfig.js +2 -3
  28. package/dist/esm/discoverWorkspaces.d.ts +3 -3
  29. package/dist/esm/enumerateReleaseWindows.d.ts +1 -1
  30. package/dist/esm/enumerateReleaseWindows.js +1 -3
  31. package/dist/esm/findTransitiveDependents.js +3 -3
  32. package/dist/esm/findUnroutedEntryScopes.d.ts +2 -2
  33. package/dist/esm/formatDirectoryPublishSkip.d.ts +3 -0
  34. package/dist/esm/formatDirectoryPublishSkip.js +3 -0
  35. package/dist/esm/formatExcludedSkip.d.ts +5 -2
  36. package/dist/esm/formatExcludedSkip.js +2 -2
  37. package/dist/esm/formatProjectPublishSkip.d.ts +3 -0
  38. package/dist/esm/formatProjectPublishSkip.js +3 -0
  39. package/dist/esm/generateChangelogs.d.ts +7 -7
  40. package/dist/esm/generateChangelogs.js +2 -2
  41. package/dist/esm/help/prepareHelp.d.ts +1 -1
  42. package/dist/esm/help/prepareHelp.js +7 -5
  43. package/dist/esm/init/hasPublishablePackage.d.ts +10 -0
  44. package/dist/esm/init/hasPublishablePackage.js +28 -0
  45. package/dist/esm/init/initCommand.js +23 -13
  46. package/dist/esm/init/scaffold.d.ts +6 -1
  47. package/dist/esm/init/scaffold.js +10 -7
  48. package/dist/esm/init/templates.js +1 -1
  49. package/dist/esm/init/updateTemplatesCommand.d.ts +2 -1
  50. package/dist/esm/init/updateTemplatesCommand.js +12 -6
  51. package/dist/esm/isPublishableManifest.d.ts +2 -0
  52. package/dist/esm/isPublishableManifest.js +5 -0
  53. package/dist/esm/loadConfig.d.ts +12 -12
  54. package/dist/esm/loadConfig.js +79 -30
  55. package/dist/esm/matchesTagPrefix.d.ts +2 -0
  56. package/dist/esm/matchesTagPrefix.js +4 -0
  57. package/dist/esm/npmRegistry.d.ts +35 -0
  58. package/dist/esm/npmRegistry.js +58 -0
  59. package/dist/esm/prepareCommand.d.ts +1 -1
  60. package/dist/esm/prepareCommand.js +50 -36
  61. package/dist/esm/prepareTarget.d.ts +103 -0
  62. package/dist/esm/prepareTarget.js +274 -0
  63. package/dist/esm/previewTagPrefixes.d.ts +5 -3
  64. package/dist/esm/previewTagPrefixes.js +60 -14
  65. package/dist/esm/propagateBumps.js +1 -1
  66. package/dist/esm/publishCommand.js +13 -1
  67. package/dist/esm/readChangelogSections.d.ts +6 -4
  68. package/dist/esm/readChangelogSections.js +18 -4
  69. package/dist/esm/releasePlan.d.ts +4 -2
  70. package/dist/esm/releasePlan.js +34 -12
  71. package/dist/esm/releasePrepareTargets.d.ts +47 -0
  72. package/dist/esm/releasePrepareTargets.js +335 -0
  73. package/dist/esm/renderChangelogMarkdown.d.ts +23 -0
  74. package/dist/esm/renderChangelogMarkdown.js +47 -11
  75. package/dist/esm/reportPrepare.d.ts +2 -3
  76. package/dist/esm/reportPrepare.js +24 -12
  77. package/dist/esm/resolveCommandTags.d.ts +3 -1
  78. package/dist/esm/resolveCommandTags.js +15 -22
  79. package/dist/esm/resolveReleaseDeclaration.d.ts +45 -0
  80. package/dist/esm/resolveReleaseDeclaration.js +153 -0
  81. package/dist/esm/resolveReleaseTags.d.ts +14 -3
  82. package/dist/esm/resolveReleaseTags.js +36 -15
  83. package/dist/esm/resolveReleaseTargets.d.ts +29 -0
  84. package/dist/esm/resolveReleaseTargets.js +131 -0
  85. package/dist/esm/sync-labels/generateCommand.js +2 -1
  86. package/dist/esm/sync-labels/resolveLabels.d.ts +4 -3
  87. package/dist/esm/sync-labels/resolveLabels.js +30 -1
  88. package/dist/esm/sync-labels/templates.js +1 -1
  89. package/dist/esm/sync-labels/types.d.ts +2 -0
  90. package/dist/esm/types.d.ts +251 -167
  91. package/dist/esm/types.js +22 -0
  92. package/dist/esm/validateConfig.js +80 -21
  93. package/dist/esm/validateOverridesCommand.d.ts +1 -1
  94. package/dist/esm/validateOverridesCommand.js +17 -28
  95. package/docs/api.md +25 -58
  96. package/docs/changelogs.md +26 -6
  97. package/docs/configuration.md +80 -17
  98. package/docs/labels.md +30 -5
  99. package/docs/project-releases.md +42 -2
  100. package/docs/publishing.md +3 -3
  101. package/docs/releasing.md +12 -4
  102. package/docs/work-types.md +1 -1
  103. package/package.json +6 -6
  104. package/presets/labels/common.yaml +11 -0
  105. package/dist/esm/releasePrepare.d.ts +0 -36
  106. package/dist/esm/releasePrepare.js +0 -230
  107. package/dist/esm/releasePrepareMono.d.ts +0 -29
  108. package/dist/esm/releasePrepareMono.js +0 -503
  109. package/dist/esm/releasePrepareProject.d.ts +0 -47
  110. package/dist/esm/releasePrepareProject.js +0 -164
@@ -1,164 +0,0 @@
1
- import { join as joinPath } from 'node:path';
2
- import { assertTaggedBaseline, findUntaggedBaseline } from "./assertTaggedBaseline.js";
3
- import { attachChangelogDiagnostics } from "./attachChangelogDiagnostics.js";
4
- import { readReleaseHistory, toReleaseEntries } from "./buildChangelogEntries.js";
5
- import { mergeChangelogEntriesWithDisk, renderChangelogJson, resolveChangelogJsonPath } from "./changelogJsonFile.js";
6
- import { applyChangelogOverrides } from "./changelogOverrides.js";
7
- import { decideRelease } from "./decideRelease.js";
8
- import { DEFAULT_WORK_TYPES } from "./defaults.js";
9
- import { deriveSectionOrder } from "./deriveReleaseNotesConfig.js";
10
- import { planReleaseNotesPreviews } from "./planReleaseNotesPreviews.js";
11
- import { planVersionBump } from "./planVersionBump.js";
12
- import { planPreservedSections } from "./readChangelogSections.js";
13
- import { renderChangelogMarkdown } from "./renderChangelogMarkdown.js";
14
- const ROOT_PACKAGE_FILE = './package.json';
15
- const ROOT_CHANGELOG_PATH = '.';
16
- export function releasePrepareProject(args) {
17
- const { config, options, modifiedFiles, writes, tags } = args;
18
- const { rootOverrides, overrideWarnings, globalMatchedRootKeys, warnings } = resolveOptionalOverrideArgs(args);
19
- const { bumpOverride, withReleaseNotes, force } = options;
20
- const project = config.project;
21
- if (project === undefined) {
22
- throw new Error('releasePrepareProject called without a configured project block');
23
- }
24
- const workTypes = config.workTypes ?? { ...DEFAULT_WORK_TYPES };
25
- const history = readReleaseHistory(config, { tagPrefixes: [project.tagPrefix], paths: project.paths });
26
- assertTaggedBaseline([
27
- findUntaggedBaseline({
28
- label: 'project',
29
- packageFiles: [ROOT_PACKAGE_FILE],
30
- changelogPaths: [ROOT_CHANGELOG_PATH],
31
- tagPrefixes: [project.tagPrefix],
32
- previousTag: history.previousTag,
33
- }, config),
34
- ]);
35
- const { commits, diagnostics, parsedCommitCount, unparseableCommits } = history.unreleased;
36
- const tag = history.previousTag;
37
- const since = tag === undefined ? '(no previous release found)' : `since ${tag}`;
38
- const decision = decideRelease({
39
- naturalBump: history.unreleased.bump,
40
- commitCount: commits.length,
41
- force,
42
- bumpOverride,
43
- skipReasons: {
44
- noCommits: `No commits ${since}. Pass --force to release at patch. Skipping.`,
45
- noBumpWorthy: `No bump-worthy commits ${since}. Pass --force to release at patch (or --force --bump=X for a different level). Skipping.`,
46
- },
47
- });
48
- if (decision.outcome === 'skip') {
49
- const skipped = {
50
- status: 'skipped',
51
- commitCount: commits.length,
52
- parsedCommitCount,
53
- skipReason: decision.skipReason,
54
- };
55
- if (tag !== undefined) {
56
- skipped.previousTag = tag;
57
- }
58
- if (unparseableCommits !== undefined) {
59
- skipped.unparseableCommits = unparseableCommits;
60
- }
61
- attachChangelogDiagnostics(skipped, diagnostics);
62
- return skipped;
63
- }
64
- const { releaseType } = decision;
65
- const bump = planVersionBump([ROOT_PACKAGE_FILE], releaseType);
66
- writes.push(...bump.writes);
67
- const newTag = `${project.tagPrefix}${bump.newVersion}`;
68
- const changelogs = planProjectChangelogs({
69
- config,
70
- history,
71
- newTag,
72
- rootOverrides,
73
- overrideWarnings,
74
- globalMatchedRootKeys,
75
- });
76
- const { changelogFiles, changelogJsonFiles } = changelogs;
77
- writes.push(...changelogs.writes);
78
- const previewFiles = [];
79
- if (withReleaseNotes === true && config.changelogJson.enabled && changelogJsonFiles.length > 0) {
80
- const previews = planReleaseNotesPreviews({
81
- workspacePath: ROOT_CHANGELOG_PATH,
82
- tag: newTag,
83
- entries: changelogs.entries,
84
- sectionOrder: deriveSectionOrder(workTypes),
85
- });
86
- writes.push(...previews.writes);
87
- warnings.push(...previews.warnings);
88
- previewFiles.push(...previews.writes.map((write) => write.path));
89
- }
90
- tags.push(newTag);
91
- modifiedFiles.push(ROOT_PACKAGE_FILE, ...changelogFiles, ...changelogJsonFiles);
92
- const result = {
93
- status: 'released',
94
- commitCount: commits.length,
95
- parsedCommitCount,
96
- releaseType,
97
- currentVersion: bump.currentVersion,
98
- newVersion: bump.newVersion,
99
- tag: newTag,
100
- bumpedFiles: bump.writes.map((write) => write.path),
101
- changelogFiles,
102
- commits,
103
- };
104
- if (previewFiles.length > 0) {
105
- result.previewFiles = previewFiles;
106
- }
107
- if (changelogs.changelogPreservation.length > 0) {
108
- result.changelogPreservation = changelogs.changelogPreservation;
109
- }
110
- if (tag !== undefined) {
111
- result.previousTag = tag;
112
- }
113
- if (unparseableCommits !== undefined) {
114
- result.unparseableCommits = unparseableCommits;
115
- }
116
- if (bumpOverride !== undefined) {
117
- result.bumpOverride = bumpOverride;
118
- }
119
- attachChangelogDiagnostics(result, diagnostics);
120
- return result;
121
- }
122
- function resolveOptionalOverrideArgs(args) {
123
- return {
124
- rootOverrides: args.rootOverrides ?? new Map(),
125
- overrideWarnings: args.overrideWarnings ?? [],
126
- globalMatchedRootKeys: args.globalMatchedRootKeys ?? new Set(),
127
- warnings: args.warnings ?? [],
128
- };
129
- }
130
- function planProjectChangelogs(args) {
131
- const { config, history, newTag, rootOverrides, overrideWarnings, globalMatchedRootKeys } = args;
132
- const today = new Date().toISOString().slice(0, 10);
133
- const builtEntries = toReleaseEntries(history, newTag, today);
134
- const applied = applyChangelogOverrides(builtEntries, rootOverrides);
135
- if (applied.errors.length > 0) {
136
- throw new Error(`Changelog override application failed:\n - ${applied.errors.join('\n - ')}`);
137
- }
138
- overrideWarnings.push(...applied.warnings);
139
- for (const matched of applied.matchedKeys) {
140
- globalMatchedRootKeys.add(matched);
141
- }
142
- const changelogJsonPath = resolveChangelogJsonPath(config, ROOT_CHANGELOG_PATH);
143
- const sectionOrder = deriveSectionOrder(config.workTypes ?? { ...DEFAULT_WORK_TYPES });
144
- const renderEntries = mergeChangelogEntriesWithDisk(changelogJsonPath, applied.entries);
145
- const writes = [];
146
- const changelogJsonFiles = [];
147
- if (config.changelogJson.enabled) {
148
- writes.push({ path: changelogJsonPath, content: renderChangelogJson(renderEntries) });
149
- changelogJsonFiles.push(changelogJsonPath);
150
- }
151
- const changelogFile = joinPath(ROOT_CHANGELOG_PATH, 'CHANGELOG.md');
152
- const preserved = planPreservedSections(changelogFile, renderEntries);
153
- writes.push({
154
- path: changelogFile,
155
- content: renderChangelogMarkdown(renderEntries, { sectionOrder, preservedSections: preserved.sections }),
156
- });
157
- return {
158
- changelogFiles: [changelogFile],
159
- changelogJsonFiles,
160
- changelogPreservation: preserved.preservation === undefined ? [] : [preserved.preservation],
161
- entries: renderEntries,
162
- writes,
163
- };
164
- }