@williamthorsen/release-kit 6.0.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.
- package/CHANGELOG.md +8 -0
- package/README.md +3 -3
- package/dist/esm/.cache +1 -1
- package/dist/esm/assertCleanWorkingTree.js +9 -14
- package/dist/esm/bin/release-kit.js +200 -199
- package/dist/esm/buildChangelogEntries.d.ts +2 -2
- package/dist/esm/buildChangelogEntries.js +142 -149
- package/dist/esm/buildDependencyGraph.d.ts +1 -1
- package/dist/esm/buildDependencyGraph.js +60 -59
- package/dist/esm/buildEmptyReleaseEntry.d.ts +1 -1
- package/dist/esm/buildEmptyReleaseEntry.js +12 -15
- package/dist/esm/buildReleaseSummary.d.ts +1 -1
- package/dist/esm/buildReleaseSummary.js +23 -26
- package/dist/esm/buildSyntheticChangelogEntry.d.ts +1 -1
- package/dist/esm/buildSyntheticChangelogEntry.js +9 -12
- package/dist/esm/bumpAllVersions.d.ts +1 -1
- package/dist/esm/bumpAllVersions.js +51 -52
- package/dist/esm/bumpVersion.d.ts +1 -1
- package/dist/esm/bumpVersion.js +25 -28
- package/dist/esm/changelogJsonFile.d.ts +1 -1
- package/dist/esm/changelogJsonFile.js +59 -62
- package/dist/esm/changelogJsonUtils.d.ts +1 -1
- package/dist/esm/changelogJsonUtils.js +35 -32
- package/dist/esm/changelogOverrides.d.ts +1 -1
- package/dist/esm/changelogOverrides.js +374 -377
- package/dist/esm/checkWorkTypesDrift.js +104 -102
- package/dist/esm/collectPolicyViolations.d.ts +2 -2
- package/dist/esm/collectPolicyViolations.js +11 -14
- package/dist/esm/commitCommand.js +48 -46
- package/dist/esm/compareVersions.js +20 -23
- package/dist/esm/createGithubRelease.js +56 -59
- package/dist/esm/createGithubReleaseCommand.js +21 -23
- package/dist/esm/createTags.js +57 -56
- package/dist/esm/decideRelease.d.ts +2 -2
- package/dist/esm/decideRelease.js +27 -41
- package/dist/esm/defaults.d.ts +3 -3
- package/dist/esm/defaults.js +36 -48
- package/dist/esm/deleteFileIfExists.js +10 -12
- package/dist/esm/deriveWorkspaceConfig.d.ts +1 -1
- package/dist/esm/deriveWorkspaceConfig.js +34 -36
- package/dist/esm/detectPackageManager.js +35 -37
- package/dist/esm/detectUndeclaredTagPrefixes.js +41 -40
- package/dist/esm/determineBumpFromCommits.d.ts +2 -2
- package/dist/esm/determineBumpFromCommits.js +25 -29
- package/dist/esm/determineBumpType.d.ts +1 -1
- package/dist/esm/determineBumpType.js +31 -32
- package/dist/esm/discoverWorkspaces.js +38 -40
- package/dist/esm/format.js +6 -11
- package/dist/esm/generateChangelogs.d.ts +1 -1
- package/dist/esm/generateChangelogs.js +13 -17
- package/dist/esm/getCommitsSinceTarget.d.ts +1 -1
- package/dist/esm/getCommitsSinceTarget.js +54 -55
- package/dist/esm/hasPrettierConfig.js +33 -35
- package/dist/esm/help/prepareHelp.js +4 -8
- package/dist/esm/index.d.ts +4 -4
- package/dist/esm/index.js +2 -8
- package/dist/esm/init/checks.js +28 -32
- package/dist/esm/init/detectRepoType.js +12 -15
- package/dist/esm/init/initCommand.js +60 -54
- package/dist/esm/init/parseJsonRecord.js +9 -11
- package/dist/esm/init/scaffold.d.ts +1 -1
- package/dist/esm/init/scaffold.js +32 -38
- package/dist/esm/init/templates.d.ts +1 -1
- package/dist/esm/init/templates.js +16 -22
- package/dist/esm/injectReleaseNotesIntoReadme.js +42 -49
- package/dist/esm/injectSection.js +17 -27
- package/dist/esm/loadConfig.d.ts +1 -1
- package/dist/esm/loadConfig.js +206 -225
- package/dist/esm/parseCommitMessage.d.ts +1 -1
- package/dist/esm/parseCommitMessage.js +72 -76
- package/dist/esm/parseRequestedTags.js +6 -9
- package/dist/esm/prepareCommand.d.ts +1 -1
- package/dist/esm/prepareCommand.js +225 -235
- package/dist/esm/previewTagPrefixes.d.ts +1 -1
- package/dist/esm/previewTagPrefixes.js +101 -96
- package/dist/esm/propagateBumps.d.ts +2 -2
- package/dist/esm/propagateBumps.js +48 -50
- package/dist/esm/publish.d.ts +2 -2
- package/dist/esm/publish.js +22 -28
- package/dist/esm/publishCommand.js +75 -80
- package/dist/esm/pushCommand.js +33 -34
- package/dist/esm/pushRelease.d.ts +1 -1
- package/dist/esm/pushRelease.js +21 -24
- package/dist/esm/readCurrentVersion.js +13 -17
- package/dist/esm/releasePrepare.d.ts +1 -1
- package/dist/esm/releasePrepare.js +213 -231
- package/dist/esm/releasePrepareMono.d.ts +2 -2
- package/dist/esm/releasePrepareMono.js +434 -494
- package/dist/esm/releasePrepareProject.d.ts +2 -2
- package/dist/esm/releasePrepareProject.js +143 -153
- package/dist/esm/renderChangelogMarkdown.d.ts +1 -1
- package/dist/esm/renderChangelogMarkdown.js +20 -24
- package/dist/esm/renderReleaseNotes.d.ts +1 -1
- package/dist/esm/renderReleaseNotes.js +50 -55
- package/dist/esm/reportPrepare.d.ts +1 -1
- package/dist/esm/reportPrepare.js +230 -231
- package/dist/esm/resolveCliffConfigPath.js +18 -23
- package/dist/esm/resolveCommandTags.d.ts +1 -1
- package/dist/esm/resolveCommandTags.js +47 -45
- package/dist/esm/resolveReleaseNotesConfig.d.ts +1 -1
- package/dist/esm/resolveReleaseNotesConfig.js +39 -43
- package/dist/esm/resolveReleaseTags.d.ts +1 -1
- package/dist/esm/resolveReleaseTags.js +39 -40
- package/dist/esm/runGitCliff.js +27 -30
- package/dist/esm/showTagPrefixesCommand.js +48 -70
- package/dist/esm/stripEmojiPrefix.js +2 -5
- package/dist/esm/stripScope.js +18 -21
- package/dist/esm/sync-labels/generateCommand.d.ts +1 -1
- package/dist/esm/sync-labels/generateCommand.js +51 -53
- package/dist/esm/sync-labels/initCommand.js +46 -48
- package/dist/esm/sync-labels/loadSyncLabelsConfig.d.ts +1 -1
- package/dist/esm/sync-labels/loadSyncLabelsConfig.js +46 -52
- package/dist/esm/sync-labels/presets.d.ts +1 -1
- package/dist/esm/sync-labels/presets.js +40 -43
- package/dist/esm/sync-labels/resolveLabels.d.ts +1 -1
- package/dist/esm/sync-labels/resolveLabels.js +28 -35
- package/dist/esm/sync-labels/syncCommand.js +30 -31
- package/dist/esm/sync-labels/templates.d.ts +1 -1
- package/dist/esm/sync-labels/templates.js +23 -26
- package/dist/esm/sync-labels/types.js +1 -0
- package/dist/esm/syncWorkTypes.js +83 -84
- package/dist/esm/tagCommand.js +12 -14
- package/dist/esm/typeGuards.js +4 -8
- package/dist/esm/types.js +66 -60
- package/dist/esm/validateConfig.d.ts +1 -1
- package/dist/esm/validateConfig.js +109 -115
- package/dist/esm/validateOnlyExcludesStrandedDependents.d.ts +2 -2
- package/dist/esm/validateOnlyExcludesStrandedDependents.js +97 -91
- package/dist/esm/validateOverridesCommand.d.ts +2 -2
- package/dist/esm/validateOverridesCommand.js +110 -111
- package/dist/esm/workTypesData.js +57 -60
- package/dist/esm/workTypesUtils.js +16 -21
- package/dist/esm/writeReleaseNotesPreviews.js +55 -57
- package/package.json +2 -2
|
@@ -1,68 +1,74 @@
|
|
|
1
|
-
import { printError, printStep, printSuccess, reportWriteResult } from
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
repoType
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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,41 +1,35 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from
|
|
2
|
-
import { resolve } from
|
|
3
|
-
import { findPackageRoot, writeFileWithCheck } from
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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.
|
|
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
|
-
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
|
|
48
|
-
|
|
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
|
-
|
|
70
|
-
|
|
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
|
-
|
|
90
|
-
|
|
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
|
-
|
|
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
|
|
2
|
-
import { join } from
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
49
|
-
|
|
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
|
-
|
|
2
|
+
return `<!-- section:${key} -->`;
|
|
3
3
|
}
|
|
4
4
|
function closeMarker(key) {
|
|
5
|
-
|
|
5
|
+
return `<!-- /section:${key} -->`;
|
|
6
6
|
}
|
|
7
|
-
function injectSection(content, key, injection) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
${
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
${
|
|
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
|
-
};
|
package/dist/esm/loadConfig.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { MonorepoReleaseConfig, ReleaseConfig, ReleaseKitConfig, WorkTypeConfig } from './types.
|
|
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;
|