@williamthorsen/release-kit 5.4.0 → 7.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/CHANGELOG.md +32 -0
  2. package/README.md +12 -12
  3. package/dist/esm/.cache +1 -1
  4. package/dist/esm/assertCleanWorkingTree.js +9 -14
  5. package/dist/esm/bin/release-kit.js +202 -229
  6. package/dist/esm/buildChangelogEntries.d.ts +2 -2
  7. package/dist/esm/buildChangelogEntries.js +142 -149
  8. package/dist/esm/buildDependencyGraph.d.ts +1 -1
  9. package/dist/esm/buildDependencyGraph.js +60 -59
  10. package/dist/esm/buildEmptyReleaseEntry.d.ts +1 -1
  11. package/dist/esm/buildEmptyReleaseEntry.js +12 -15
  12. package/dist/esm/buildReleaseSummary.d.ts +1 -1
  13. package/dist/esm/buildReleaseSummary.js +23 -26
  14. package/dist/esm/buildSyntheticChangelogEntry.d.ts +1 -1
  15. package/dist/esm/buildSyntheticChangelogEntry.js +9 -12
  16. package/dist/esm/bumpAllVersions.d.ts +1 -1
  17. package/dist/esm/bumpAllVersions.js +51 -52
  18. package/dist/esm/bumpVersion.d.ts +1 -1
  19. package/dist/esm/bumpVersion.js +25 -28
  20. package/dist/esm/changelogJsonFile.d.ts +1 -1
  21. package/dist/esm/changelogJsonFile.js +59 -62
  22. package/dist/esm/changelogJsonUtils.d.ts +1 -1
  23. package/dist/esm/changelogJsonUtils.js +35 -32
  24. package/dist/esm/changelogOverrides.d.ts +1 -1
  25. package/dist/esm/changelogOverrides.js +374 -377
  26. package/dist/esm/checkWorkTypesDrift.js +104 -99
  27. package/dist/esm/collectPolicyViolations.d.ts +2 -2
  28. package/dist/esm/collectPolicyViolations.js +11 -14
  29. package/dist/esm/commitCommand.js +48 -53
  30. package/dist/esm/compareVersions.js +20 -23
  31. package/dist/esm/createGithubRelease.js +56 -59
  32. package/dist/esm/createGithubReleaseCommand.js +21 -29
  33. package/dist/esm/createTags.js +57 -56
  34. package/dist/esm/decideRelease.d.ts +2 -2
  35. package/dist/esm/decideRelease.js +27 -41
  36. package/dist/esm/defaults.d.ts +3 -3
  37. package/dist/esm/defaults.js +36 -48
  38. package/dist/esm/deleteFileIfExists.js +10 -12
  39. package/dist/esm/deriveWorkspaceConfig.d.ts +1 -1
  40. package/dist/esm/deriveWorkspaceConfig.js +34 -36
  41. package/dist/esm/detectPackageManager.js +35 -37
  42. package/dist/esm/detectUndeclaredTagPrefixes.js +41 -40
  43. package/dist/esm/determineBumpFromCommits.d.ts +2 -2
  44. package/dist/esm/determineBumpFromCommits.js +25 -29
  45. package/dist/esm/determineBumpType.d.ts +1 -1
  46. package/dist/esm/determineBumpType.js +31 -32
  47. package/dist/esm/discoverWorkspaces.js +38 -40
  48. package/dist/esm/format.js +6 -11
  49. package/dist/esm/generateChangelogs.d.ts +1 -1
  50. package/dist/esm/generateChangelogs.js +13 -17
  51. package/dist/esm/getCommitsSinceTarget.d.ts +1 -1
  52. package/dist/esm/getCommitsSinceTarget.js +54 -55
  53. package/dist/esm/hasPrettierConfig.js +33 -35
  54. package/dist/esm/help/prepareHelp.d.ts +2 -0
  55. package/dist/esm/help/prepareHelp.js +26 -0
  56. package/dist/esm/index.d.ts +4 -4
  57. package/dist/esm/index.js +2 -8
  58. package/dist/esm/init/checks.js +28 -32
  59. package/dist/esm/init/detectRepoType.js +12 -15
  60. package/dist/esm/init/initCommand.js +60 -54
  61. package/dist/esm/init/parseJsonRecord.js +9 -11
  62. package/dist/esm/init/scaffold.d.ts +1 -1
  63. package/dist/esm/init/scaffold.js +32 -38
  64. package/dist/esm/init/templates.d.ts +1 -1
  65. package/dist/esm/init/templates.js +16 -22
  66. package/dist/esm/injectReleaseNotesIntoReadme.js +42 -49
  67. package/dist/esm/injectSection.js +17 -27
  68. package/dist/esm/loadConfig.d.ts +1 -1
  69. package/dist/esm/loadConfig.js +206 -225
  70. package/dist/esm/parseCommitMessage.d.ts +1 -1
  71. package/dist/esm/parseCommitMessage.js +72 -76
  72. package/dist/esm/parseRequestedTags.js +6 -9
  73. package/dist/esm/prepareCommand.d.ts +32 -1
  74. package/dist/esm/prepareCommand.js +225 -271
  75. package/dist/esm/previewTagPrefixes.d.ts +1 -1
  76. package/dist/esm/previewTagPrefixes.js +101 -96
  77. package/dist/esm/propagateBumps.d.ts +2 -2
  78. package/dist/esm/propagateBumps.js +48 -50
  79. package/dist/esm/publish.d.ts +2 -2
  80. package/dist/esm/publish.js +22 -28
  81. package/dist/esm/publishCommand.js +75 -86
  82. package/dist/esm/pushCommand.js +33 -40
  83. package/dist/esm/pushRelease.d.ts +1 -1
  84. package/dist/esm/pushRelease.js +21 -24
  85. package/dist/esm/readCurrentVersion.js +13 -17
  86. package/dist/esm/releasePrepare.d.ts +1 -1
  87. package/dist/esm/releasePrepare.js +213 -231
  88. package/dist/esm/releasePrepareMono.d.ts +2 -2
  89. package/dist/esm/releasePrepareMono.js +434 -493
  90. package/dist/esm/releasePrepareProject.d.ts +2 -2
  91. package/dist/esm/releasePrepareProject.js +143 -153
  92. package/dist/esm/renderChangelogMarkdown.d.ts +1 -1
  93. package/dist/esm/renderChangelogMarkdown.js +20 -24
  94. package/dist/esm/renderReleaseNotes.d.ts +1 -1
  95. package/dist/esm/renderReleaseNotes.js +50 -55
  96. package/dist/esm/reportPrepare.d.ts +1 -1
  97. package/dist/esm/reportPrepare.js +230 -231
  98. package/dist/esm/resolveCliffConfigPath.js +18 -23
  99. package/dist/esm/resolveCommandTags.d.ts +1 -1
  100. package/dist/esm/resolveCommandTags.js +47 -44
  101. package/dist/esm/resolveReleaseNotesConfig.d.ts +1 -1
  102. package/dist/esm/resolveReleaseNotesConfig.js +39 -41
  103. package/dist/esm/resolveReleaseTags.d.ts +1 -1
  104. package/dist/esm/resolveReleaseTags.js +39 -40
  105. package/dist/esm/runGitCliff.js +27 -30
  106. package/dist/esm/showTagPrefixesCommand.js +48 -70
  107. package/dist/esm/stripEmojiPrefix.js +2 -5
  108. package/dist/esm/stripScope.js +18 -21
  109. package/dist/esm/sync-labels/generateCommand.d.ts +1 -1
  110. package/dist/esm/sync-labels/generateCommand.js +51 -52
  111. package/dist/esm/sync-labels/initCommand.js +46 -47
  112. package/dist/esm/sync-labels/loadSyncLabelsConfig.d.ts +1 -1
  113. package/dist/esm/sync-labels/loadSyncLabelsConfig.js +46 -52
  114. package/dist/esm/sync-labels/presets.d.ts +1 -1
  115. package/dist/esm/sync-labels/presets.js +40 -43
  116. package/dist/esm/sync-labels/resolveLabels.d.ts +1 -1
  117. package/dist/esm/sync-labels/resolveLabels.js +28 -35
  118. package/dist/esm/sync-labels/syncCommand.js +30 -30
  119. package/dist/esm/sync-labels/templates.d.ts +1 -1
  120. package/dist/esm/sync-labels/templates.js +23 -26
  121. package/dist/esm/sync-labels/types.js +1 -0
  122. package/dist/esm/syncWorkTypes.js +83 -81
  123. package/dist/esm/tagCommand.js +12 -21
  124. package/dist/esm/typeGuards.js +4 -8
  125. package/dist/esm/types.js +66 -60
  126. package/dist/esm/validateConfig.d.ts +1 -1
  127. package/dist/esm/validateConfig.js +109 -115
  128. package/dist/esm/validateOnlyExcludesStrandedDependents.d.ts +2 -2
  129. package/dist/esm/validateOnlyExcludesStrandedDependents.js +97 -91
  130. package/dist/esm/validateOverridesCommand.d.ts +2 -2
  131. package/dist/esm/validateOverridesCommand.js +111 -111
  132. package/dist/esm/workTypesData.js +57 -60
  133. package/dist/esm/workTypesUtils.js +16 -21
  134. package/dist/esm/writeReleaseNotesPreviews.js +55 -57
  135. package/package.json +2 -6
@@ -1,68 +1,74 @@
1
- import { printError, printStep, printSuccess, reportWriteResult } from "@williamthorsen/nmr-core";
1
+ import { printError, printStep, printSuccess, reportWriteResult } from '@williamthorsen/nmr-core';
2
2
  import { hasPackageJson, isGitRepo, usesPnpm } from "./checks.js";
3
3
  import { detectRepoType } from "./detectRepoType.js";
4
4
  import { scaffoldFiles } from "./scaffold.js";
5
5
  function runRequiredCheck(label, result) {
6
- if (result.ok) {
7
- printSuccess(label);
8
- return true;
9
- }
10
- printError(result.message ?? `${label} failed`);
11
- return false;
6
+ if (result.ok) {
7
+ printSuccess(label);
8
+ return true;
9
+ }
10
+ printError(result.message ?? `${label} failed`);
11
+ return false;
12
12
  }
13
13
  function checkEligibility() {
14
- printStep("Checking eligibility");
15
- if (!runRequiredCheck("Git repository detected", isGitRepo())) return false;
16
- if (!runRequiredCheck("package.json found", hasPackageJson())) return false;
17
- if (!runRequiredCheck("pnpm detected", usesPnpm())) return false;
18
- return true;
14
+ printStep('Checking eligibility');
15
+ if (!runRequiredCheck('Git repository detected', isGitRepo()))
16
+ return false;
17
+ if (!runRequiredCheck('package.json found', hasPackageJson()))
18
+ return false;
19
+ if (!runRequiredCheck('pnpm detected', usesPnpm()))
20
+ return false;
21
+ return true;
19
22
  }
20
- function initCommand({ dryRun, force, withConfig }) {
21
- if (dryRun) {
22
- console.info("[dry-run mode]");
23
- }
24
- let eligible;
25
- try {
26
- eligible = checkEligibility();
27
- } catch (error) {
28
- printError(`Eligibility check failed: ${error instanceof Error ? error.message : String(error)}`);
29
- return 1;
30
- }
31
- if (!eligible) return 1;
32
- printStep("Detecting repo type");
33
- let repoType;
34
- try {
35
- repoType = detectRepoType();
36
- } catch (error) {
37
- printError(`Failed to detect repo type: ${error instanceof Error ? error.message : String(error)}`);
38
- return 1;
39
- }
40
- printSuccess(`Detected: ${repoType}`);
41
- printStep("Scaffolding files");
42
- let results;
43
- try {
44
- results = scaffoldFiles({ repoType, dryRun, overwrite: force, withConfig });
45
- } catch (error) {
46
- printError(`Failed to scaffold files: ${error instanceof Error ? error.message : String(error)}`);
47
- return 1;
48
- }
49
- for (const result of results) {
50
- reportWriteResult(result, dryRun);
51
- }
52
- if (results.some((r) => r.outcome === "failed")) {
53
- return 1;
54
- }
55
- printStep("Next steps");
56
- const configHint = withConfig ? "1. (Optional) Customize .config/release-kit.config.ts and .config/git-cliff.toml." : "1. (Optional) Run again with --with-config to scaffold config files.";
57
- console.info(`
23
+ export function initCommand({ dryRun, force, withConfig }) {
24
+ if (dryRun) {
25
+ console.info('[dry-run mode]');
26
+ }
27
+ let eligible;
28
+ try {
29
+ eligible = checkEligibility();
30
+ }
31
+ catch (error) {
32
+ printError(`Eligibility check failed: ${error instanceof Error ? error.message : String(error)}`);
33
+ return 1;
34
+ }
35
+ if (!eligible)
36
+ return 1;
37
+ printStep('Detecting repo type');
38
+ let repoType;
39
+ try {
40
+ repoType = detectRepoType();
41
+ }
42
+ catch (error) {
43
+ printError(`Failed to detect repo type: ${error instanceof Error ? error.message : String(error)}`);
44
+ return 1;
45
+ }
46
+ printSuccess(`Detected: ${repoType}`);
47
+ printStep('Scaffolding files');
48
+ let results;
49
+ try {
50
+ results = scaffoldFiles({ repoType, dryRun, overwrite: force, withConfig });
51
+ }
52
+ catch (error) {
53
+ printError(`Failed to scaffold files: ${error instanceof Error ? error.message : String(error)}`);
54
+ return 1;
55
+ }
56
+ for (const result of results) {
57
+ reportWriteResult(result, dryRun);
58
+ }
59
+ if (results.some((r) => r.outcome === 'failed')) {
60
+ return 1;
61
+ }
62
+ printStep('Next steps');
63
+ const configHint = withConfig
64
+ ? '1. (Optional) Customize .config/release-kit.config.ts and .config/git-cliff.toml.'
65
+ : '1. (Optional) Run again with --with-config to scaffold config files.';
66
+ console.info(`
58
67
  ${configHint}
59
68
  2. If this is a public repo, set provenance: true in .github/workflows/publish.yaml.
60
69
  3. Test by running: npx @williamthorsen/release-kit prepare --dry-run
61
70
  4. Commit the generated files.
62
71
  5. Register each package as a trusted publisher on npmjs.com.
63
72
  `);
64
- return 0;
73
+ return 0;
65
74
  }
66
- export {
67
- initCommand
68
- };
@@ -1,13 +1,11 @@
1
1
  import { isRecord } from "../typeGuards.js";
2
- function parseJsonRecord(raw) {
3
- let parsed;
4
- try {
5
- parsed = JSON.parse(raw);
6
- } catch {
7
- return void 0;
8
- }
9
- return isRecord(parsed) ? parsed : void 0;
2
+ export function parseJsonRecord(raw) {
3
+ let parsed;
4
+ try {
5
+ parsed = JSON.parse(raw);
6
+ }
7
+ catch {
8
+ return undefined;
9
+ }
10
+ return isRecord(parsed) ? parsed : undefined;
10
11
  }
11
- export {
12
- parseJsonRecord
13
- };
@@ -1,5 +1,5 @@
1
1
  import type { WriteResult } from '@williamthorsen/nmr-core';
2
- import type { RepoType } from './detectRepoType.ts';
2
+ import type { RepoType } from './detectRepoType.js';
3
3
  interface ScaffoldOptions {
4
4
  repoType: RepoType;
5
5
  dryRun: boolean;
@@ -1,41 +1,35 @@
1
- import { existsSync, readFileSync } from "node:fs";
2
- import { resolve } from "node:path";
3
- import { findPackageRoot, writeFileWithCheck } from "@williamthorsen/nmr-core";
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { findPackageRoot, writeFileWithCheck } from '@williamthorsen/nmr-core';
4
4
  import { createGithubReleaseWorkflow, publishWorkflow, releaseConfigScript, releaseWorkflow } from "./templates.js";
5
- function copyCliffTemplate(dryRun, overwrite) {
6
- const destPath = ".config/git-cliff.toml";
7
- const root = findPackageRoot(import.meta.url);
8
- const templatePath = resolve(root, "cliff.toml.template");
9
- if (!existsSync(templatePath)) {
10
- return { filePath: destPath, outcome: "failed", error: `Could not find bundled template at ${templatePath}` };
11
- }
12
- let content;
13
- try {
14
- content = readFileSync(templatePath, "utf8");
15
- } catch (error) {
16
- const message = error instanceof Error ? error.message : String(error);
17
- return { filePath: destPath, outcome: "failed", error: `Failed to read template ${templatePath}: ${message}` };
18
- }
19
- return writeFileWithCheck(destPath, content, { dryRun, overwrite });
5
+ export function copyCliffTemplate(dryRun, overwrite) {
6
+ const destPath = '.config/git-cliff.toml';
7
+ const root = findPackageRoot(import.meta.url);
8
+ const templatePath = resolve(root, 'cliff.toml.template');
9
+ if (!existsSync(templatePath)) {
10
+ return { filePath: destPath, outcome: 'failed', error: `Could not find bundled template at ${templatePath}` };
11
+ }
12
+ let content;
13
+ try {
14
+ content = readFileSync(templatePath, 'utf8');
15
+ }
16
+ catch (error) {
17
+ const message = error instanceof Error ? error.message : String(error);
18
+ return { filePath: destPath, outcome: 'failed', error: `Failed to read template ${templatePath}: ${message}` };
19
+ }
20
+ return writeFileWithCheck(destPath, content, { dryRun, overwrite });
20
21
  }
21
- function scaffoldFiles({ repoType, dryRun, overwrite, withConfig }) {
22
- const results = [
23
- writeFileWithCheck(".github/workflows/create-github-release.yaml", createGithubReleaseWorkflow(repoType), {
24
- dryRun,
25
- overwrite
26
- }),
27
- writeFileWithCheck(".github/workflows/publish.yaml", publishWorkflow(repoType), { dryRun, overwrite }),
28
- writeFileWithCheck(".github/workflows/release.yaml", releaseWorkflow(repoType), { dryRun, overwrite })
29
- ];
30
- if (withConfig) {
31
- results.push(
32
- writeFileWithCheck(".config/release-kit.config.ts", releaseConfigScript(repoType), { dryRun, overwrite }),
33
- copyCliffTemplate(dryRun, overwrite)
34
- );
35
- }
36
- return results;
22
+ export function scaffoldFiles({ repoType, dryRun, overwrite, withConfig }) {
23
+ const results = [
24
+ writeFileWithCheck('.github/workflows/create-github-release.yaml', createGithubReleaseWorkflow(repoType), {
25
+ dryRun,
26
+ overwrite,
27
+ }),
28
+ writeFileWithCheck('.github/workflows/publish.yaml', publishWorkflow(repoType), { dryRun, overwrite }),
29
+ writeFileWithCheck('.github/workflows/release.yaml', releaseWorkflow(repoType), { dryRun, overwrite }),
30
+ ];
31
+ if (withConfig) {
32
+ results.push(writeFileWithCheck('.config/release-kit.config.ts', releaseConfigScript(repoType), { dryRun, overwrite }), copyCliffTemplate(dryRun, overwrite));
33
+ }
34
+ return results;
37
35
  }
38
- export {
39
- copyCliffTemplate,
40
- scaffoldFiles
41
- };
@@ -1,4 +1,4 @@
1
- import type { RepoType } from './detectRepoType.ts';
1
+ import type { RepoType } from './detectRepoType.js';
2
2
  export declare function releaseConfigScript(repoType: RepoType): string;
3
3
  export declare function publishWorkflow(repoType: RepoType): string;
4
4
  export declare function createGithubReleaseWorkflow(repoType: RepoType): string;
@@ -1,6 +1,6 @@
1
- function releaseConfigScript(repoType) {
2
- if (repoType === "monorepo") {
3
- return `import type { ReleaseKitConfig } from '@williamthorsen/release-kit';
1
+ export function releaseConfigScript(repoType) {
2
+ if (repoType === 'monorepo') {
3
+ return `import type { ReleaseKitConfig } from '@williamthorsen/release-kit';
4
4
 
5
5
  const config: ReleaseKitConfig = {
6
6
  releaseNotes: {
@@ -23,8 +23,8 @@ const config: ReleaseKitConfig = {
23
23
 
24
24
  export default config;
25
25
  `;
26
- }
27
- return `import type { ReleaseKitConfig } from '@williamthorsen/release-kit';
26
+ }
27
+ return `import type { ReleaseKitConfig } from '@williamthorsen/release-kit';
28
28
 
29
29
  const config: ReleaseKitConfig = {
30
30
  releaseNotes: {
@@ -43,9 +43,9 @@ const config: ReleaseKitConfig = {
43
43
  export default config;
44
44
  `;
45
45
  }
46
- function publishWorkflow(repoType) {
47
- const tagPattern = repoType === "monorepo" ? "'*-v[0-9]*.[0-9]*.[0-9]*'" : "'v[0-9]*.[0-9]*.[0-9]*'";
48
- return `# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
46
+ export function publishWorkflow(repoType) {
47
+ const tagPattern = repoType === 'monorepo' ? "'*-v[0-9]*.[0-9]*.[0-9]*'" : "'v[0-9]*.[0-9]*.[0-9]*'";
48
+ return `# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
49
49
  name: Publish
50
50
 
51
51
  on:
@@ -65,9 +65,9 @@ jobs:
65
65
  tags: \${{ github.ref_name }}
66
66
  `;
67
67
  }
68
- function createGithubReleaseWorkflow(repoType) {
69
- const tagPattern = repoType === "monorepo" ? "'*-v[0-9]*.[0-9]*.[0-9]*'" : "'v[0-9]*.[0-9]*.[0-9]*'";
70
- return `# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
68
+ export function createGithubReleaseWorkflow(repoType) {
69
+ const tagPattern = repoType === 'monorepo' ? "'*-v[0-9]*.[0-9]*.[0-9]*'" : "'v[0-9]*.[0-9]*.[0-9]*'";
70
+ return `# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
71
71
  name: Create GitHub Release
72
72
 
73
73
  on:
@@ -85,9 +85,9 @@ jobs:
85
85
  tag: \${{ github.ref_name }}
86
86
  `;
87
87
  }
88
- function releaseWorkflow(repoType) {
89
- if (repoType === "monorepo") {
90
- return `# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
88
+ export function releaseWorkflow(repoType) {
89
+ if (repoType === 'monorepo') {
90
+ return `# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
91
91
  name: Release
92
92
 
93
93
  on:
@@ -124,8 +124,8 @@ jobs:
124
124
  bump: \${{ inputs.bump }}
125
125
  force: \${{ inputs.force }}
126
126
  `;
127
- }
128
- return `# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
127
+ }
128
+ return `# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
129
129
  name: Release
130
130
 
131
131
  on:
@@ -158,9 +158,3 @@ jobs:
158
158
  force: \${{ inputs.force }}
159
159
  `;
160
160
  }
161
- export {
162
- createGithubReleaseWorkflow,
163
- publishWorkflow,
164
- releaseConfigScript,
165
- releaseWorkflow
166
- };
@@ -1,55 +1,48 @@
1
- import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
- import { join } from "node:path";
1
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
3
  import { extractVersion, readChangelogEntries } from "./changelogJsonUtils.js";
4
4
  import { injectSection } from "./injectSection.js";
5
5
  import { matchesAudience, renderReleaseNotesSingle } from "./renderReleaseNotes.js";
6
- function renderInjectedReadme(readme, changelogJsonPath, tag, sectionOrder) {
7
- if (!existsSync(changelogJsonPath)) {
8
- console.warn(`Warning: ${changelogJsonPath} not found; skipping README injection`);
9
- return void 0;
10
- }
11
- const version = extractVersion(tag);
12
- const entries = readChangelogEntries(changelogJsonPath);
13
- if (entries === void 0) {
14
- console.warn(`Warning: could not parse ${changelogJsonPath}; skipping README injection`);
15
- return void 0;
16
- }
17
- const entry = entries.find((e) => e.version === version);
18
- if (entry === void 0) {
19
- console.warn(`Warning: no changelog entry for version ${version}; skipping README injection`);
20
- return void 0;
21
- }
22
- const renderedSections = renderReleaseNotesSingle(entry, {
23
- filter: matchesAudience("all"),
24
- includeHeading: false,
25
- ...sectionOrder === void 0 ? {} : { sectionOrder }
26
- });
27
- if (renderedSections.trimEnd().length === 0) {
28
- console.warn(`Warning: no user-facing release notes for version ${version}; skipping README injection`);
29
- return void 0;
30
- }
31
- const labeledHeading = `## Release notes \u2014 v${version} (${entry.date})`;
32
- const releaseNotesMarkdown = `${labeledHeading}
33
-
34
- ${renderedSections.trimEnd()}`;
35
- const injectedReadme = injectSection(readme, "release-notes", releaseNotesMarkdown);
36
- return { injectedReadme, releaseNotesMarkdown };
6
+ export function renderInjectedReadme(readme, changelogJsonPath, tag, sectionOrder) {
7
+ if (!existsSync(changelogJsonPath)) {
8
+ console.warn(`Warning: ${changelogJsonPath} not found; skipping README injection`);
9
+ return undefined;
10
+ }
11
+ const version = extractVersion(tag);
12
+ const entries = readChangelogEntries(changelogJsonPath);
13
+ if (entries === undefined) {
14
+ console.warn(`Warning: could not parse ${changelogJsonPath}; skipping README injection`);
15
+ return undefined;
16
+ }
17
+ const entry = entries.find((e) => e.version === version);
18
+ if (entry === undefined) {
19
+ console.warn(`Warning: no changelog entry for version ${version}; skipping README injection`);
20
+ return undefined;
21
+ }
22
+ const renderedSections = renderReleaseNotesSingle(entry, {
23
+ filter: matchesAudience('all'),
24
+ includeHeading: false,
25
+ ...(sectionOrder === undefined ? {} : { sectionOrder }),
26
+ });
27
+ if (renderedSections.trimEnd().length === 0) {
28
+ console.warn(`Warning: no user-facing release notes for version ${version}; skipping README injection`);
29
+ return undefined;
30
+ }
31
+ const labeledHeading = `## Release notes — v${version} (${entry.date})`;
32
+ const releaseNotesMarkdown = `${labeledHeading}\n\n${renderedSections.trimEnd()}`;
33
+ const injectedReadme = injectSection(readme, 'release-notes', releaseNotesMarkdown);
34
+ return { injectedReadme, releaseNotesMarkdown };
37
35
  }
38
- function injectReleaseNotesIntoReadme(readmePath, changelogJsonPath, tag, sectionOrder) {
39
- const originalReadme = readFileSync(readmePath, "utf8");
40
- const rendered = renderInjectedReadme(originalReadme, changelogJsonPath, tag, sectionOrder);
41
- if (rendered === void 0) {
42
- return void 0;
43
- }
44
- writeFileSync(readmePath, rendered.injectedReadme, "utf8");
45
- return originalReadme;
36
+ export function injectReleaseNotesIntoReadme(readmePath, changelogJsonPath, tag, sectionOrder) {
37
+ const originalReadme = readFileSync(readmePath, 'utf8');
38
+ const rendered = renderInjectedReadme(originalReadme, changelogJsonPath, tag, sectionOrder);
39
+ if (rendered === undefined) {
40
+ return undefined;
41
+ }
42
+ writeFileSync(readmePath, rendered.injectedReadme, 'utf8');
43
+ return originalReadme;
46
44
  }
47
- function resolveReadmePath(workspacePath) {
48
- const readmePath = join(workspacePath, "README.md");
49
- return existsSync(readmePath) ? readmePath : void 0;
45
+ export function resolveReadmePath(workspacePath) {
46
+ const readmePath = join(workspacePath, 'README.md');
47
+ return existsSync(readmePath) ? readmePath : undefined;
50
48
  }
51
- export {
52
- injectReleaseNotesIntoReadme,
53
- renderInjectedReadme,
54
- resolveReadmePath
55
- };
@@ -1,32 +1,22 @@
1
1
  function openMarker(key) {
2
- return `<!-- section:${key} -->`;
2
+ return `<!-- section:${key} -->`;
3
3
  }
4
4
  function closeMarker(key) {
5
- return `<!-- /section:${key} -->`;
5
+ return `<!-- /section:${key} -->`;
6
6
  }
7
- function injectSection(content, key, injection) {
8
- const open = openMarker(key);
9
- const close = closeMarker(key);
10
- const openIndex = content.indexOf(open);
11
- const closeIndex = content.indexOf(close);
12
- if (openIndex !== -1 && closeIndex !== -1 && closeIndex > openIndex) {
13
- const before = content.slice(0, openIndex + open.length);
14
- const after = content.slice(closeIndex);
15
- return `${before}
16
- ${injection}
17
- ${after}`;
18
- }
19
- const section = `${open}
20
- ${injection}
21
- ${close}`;
22
- if (content.length === 0) {
23
- return `${section}
24
- `;
25
- }
26
- return `${section}
27
-
28
- ${content}`;
7
+ export function injectSection(content, key, injection) {
8
+ const open = openMarker(key);
9
+ const close = closeMarker(key);
10
+ const openIndex = content.indexOf(open);
11
+ const closeIndex = content.indexOf(close);
12
+ if (openIndex !== -1 && closeIndex !== -1 && closeIndex > openIndex) {
13
+ const before = content.slice(0, openIndex + open.length);
14
+ const after = content.slice(closeIndex);
15
+ return `${before}\n${injection}\n${after}`;
16
+ }
17
+ const section = `${open}\n${injection}\n${close}`;
18
+ if (content.length === 0) {
19
+ return `${section}\n`;
20
+ }
21
+ return `${section}\n\n${content}`;
29
22
  }
30
- export {
31
- injectSection
32
- };
@@ -1,4 +1,4 @@
1
- import type { MonorepoReleaseConfig, ReleaseConfig, ReleaseKitConfig, WorkTypeConfig } from './types.ts';
1
+ import type { MonorepoReleaseConfig, ReleaseConfig, ReleaseKitConfig, WorkTypeConfig } from './types.js';
2
2
  export declare const ROOT_PACKAGE_JSON_PATH = "package.json";
3
3
  export declare function readRootPackageVersion(): {
4
4
  exists: boolean;