@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.
- package/CHANGELOG.md +32 -0
- package/README.md +12 -12
- package/dist/esm/.cache +1 -1
- package/dist/esm/assertCleanWorkingTree.js +9 -14
- package/dist/esm/bin/release-kit.js +202 -229
- 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 -99
- package/dist/esm/collectPolicyViolations.d.ts +2 -2
- package/dist/esm/collectPolicyViolations.js +11 -14
- package/dist/esm/commitCommand.js +48 -53
- package/dist/esm/compareVersions.js +20 -23
- package/dist/esm/createGithubRelease.js +56 -59
- package/dist/esm/createGithubReleaseCommand.js +21 -29
- 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.d.ts +2 -0
- package/dist/esm/help/prepareHelp.js +26 -0
- 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 +32 -1
- package/dist/esm/prepareCommand.js +225 -271
- 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 -86
- package/dist/esm/pushCommand.js +33 -40
- 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 -493
- 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 -44
- package/dist/esm/resolveReleaseNotesConfig.d.ts +1 -1
- package/dist/esm/resolveReleaseNotesConfig.js +39 -41
- 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 -52
- package/dist/esm/sync-labels/initCommand.js +46 -47
- 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 -30
- 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 -81
- package/dist/esm/tagCommand.js +12 -21
- 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 +111 -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 -6
|
@@ -1,137 +1,131 @@
|
|
|
1
1
|
import { isRecord } from "./typeGuards.js";
|
|
2
2
|
import { releaseKitConfigSchema } from "./types.js";
|
|
3
|
-
function validateConfig(raw) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
return { config, errors, warnings };
|
|
3
|
+
export function validateConfig(raw) {
|
|
4
|
+
if (!isRecord(raw)) {
|
|
5
|
+
return { config: {}, errors: ['Config must be an object'], warnings: [] };
|
|
6
|
+
}
|
|
7
|
+
const { cleaned, deprecationErrors } = preprocessDeprecatedKeys(raw);
|
|
8
|
+
const parseResult = releaseKitConfigSchema.safeParse(cleaned);
|
|
9
|
+
if (!parseResult.success) {
|
|
10
|
+
return {
|
|
11
|
+
config: {},
|
|
12
|
+
errors: [...deprecationErrors, ...parseResult.error.issues.map(formatZodIssue)],
|
|
13
|
+
warnings: [],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const config = parseResult.data;
|
|
17
|
+
const errors = [...deprecationErrors];
|
|
18
|
+
detectLegacyIdentityDuplicates(config, errors);
|
|
19
|
+
detectRetiredPackageDuplicates(config, errors);
|
|
20
|
+
detectRetiredVsLegacyCollisions(config, errors);
|
|
21
|
+
const warnings = [];
|
|
22
|
+
const changelogJsonEnabled = config.changelogJson?.enabled ?? true;
|
|
23
|
+
if (!changelogJsonEnabled && config.releaseNotes?.shouldInjectIntoReadme) {
|
|
24
|
+
warnings.push('releaseNotes.shouldInjectIntoReadme is enabled but changelogJson.enabled is false; README injection will be skipped at runtime');
|
|
25
|
+
}
|
|
26
|
+
return { config, errors, warnings };
|
|
29
27
|
}
|
|
30
28
|
function preprocessDeprecatedKeys(raw) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return { cleaned, deprecationErrors: errors };
|
|
29
|
+
if (!isRecord(raw))
|
|
30
|
+
return { cleaned: raw, deprecationErrors: [] };
|
|
31
|
+
const errors = [];
|
|
32
|
+
const cleaned = { ...raw };
|
|
33
|
+
if (isRecord(cleaned.releaseNotes) && 'shouldCreateGithubRelease' in cleaned.releaseNotes) {
|
|
34
|
+
errors.push('releaseNotes.shouldCreateGithubRelease is no longer supported. Adoption is now signaled by installing the create-github-release workflow. Remove this field from your config; see README for the updated workflow.');
|
|
35
|
+
const releaseNotesCopy = { ...cleaned.releaseNotes };
|
|
36
|
+
delete releaseNotesCopy.shouldCreateGithubRelease;
|
|
37
|
+
cleaned.releaseNotes = releaseNotesCopy;
|
|
38
|
+
}
|
|
39
|
+
if (Array.isArray(cleaned.workspaces)) {
|
|
40
|
+
cleaned.workspaces = cleaned.workspaces.map((ws, i) => {
|
|
41
|
+
if (!isRecord(ws))
|
|
42
|
+
return ws;
|
|
43
|
+
const wsCopy = { ...ws };
|
|
44
|
+
if ('tagPrefix' in wsCopy) {
|
|
45
|
+
const dir = typeof wsCopy.dir === 'string' && wsCopy.dir !== '' ? wsCopy.dir : '<dir>';
|
|
46
|
+
errors.push(`workspaces[${i}]: 'tagPrefix' is no longer supported; remove it to use the default '${dir}-v'`);
|
|
47
|
+
delete wsCopy.tagPrefix;
|
|
48
|
+
}
|
|
49
|
+
if ('legacyTagPrefixes' in wsCopy) {
|
|
50
|
+
errors.push(`workspaces[${i}]: 'legacyTagPrefixes' is no longer supported; use 'legacyIdentities: [{ name, tagPrefix }, ...]' instead`);
|
|
51
|
+
delete wsCopy.legacyTagPrefixes;
|
|
52
|
+
}
|
|
53
|
+
return wsCopy;
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return { cleaned, deprecationErrors: errors };
|
|
61
57
|
}
|
|
62
58
|
function formatZodIssue(issue) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
59
|
+
const path = renderPath(issue.path);
|
|
60
|
+
const message = customizeMessage(issue);
|
|
61
|
+
return path === '' ? message : `${path}: ${message}`;
|
|
66
62
|
}
|
|
67
63
|
function customizeMessage(issue) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
64
|
+
if (issue.code === 'too_small' && issue.origin === 'string') {
|
|
65
|
+
return 'must be a non-empty string';
|
|
66
|
+
}
|
|
67
|
+
return issue.message;
|
|
72
68
|
}
|
|
73
69
|
function renderPath(path) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
70
|
+
let rendered = '';
|
|
71
|
+
for (const segment of path) {
|
|
72
|
+
if (typeof segment === 'number') {
|
|
73
|
+
rendered += `[${segment}]`;
|
|
74
|
+
}
|
|
75
|
+
else if (rendered === '') {
|
|
76
|
+
rendered += String(segment);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
rendered += `.${String(segment)}`;
|
|
80
|
+
}
|
|
82
81
|
}
|
|
83
|
-
|
|
84
|
-
return rendered;
|
|
82
|
+
return rendered;
|
|
85
83
|
}
|
|
86
84
|
function detectLegacyIdentityDuplicates(config, errors) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
85
|
+
if (config.workspaces === undefined)
|
|
86
|
+
return;
|
|
87
|
+
for (const [wsIndex, workspace] of config.workspaces.entries()) {
|
|
88
|
+
if (workspace.legacyIdentities === undefined)
|
|
89
|
+
continue;
|
|
90
|
+
const seen = new Set();
|
|
91
|
+
for (const [entryIndex, identity] of workspace.legacyIdentities.entries()) {
|
|
92
|
+
const key = `${identity.name}\0${identity.tagPrefix}`;
|
|
93
|
+
if (seen.has(key)) {
|
|
94
|
+
errors.push(`workspaces[${wsIndex}].legacyIdentities[${entryIndex}]: duplicate identity (name='${identity.name}', tagPrefix='${identity.tagPrefix}')`);
|
|
95
|
+
}
|
|
96
|
+
seen.add(key);
|
|
97
|
+
}
|
|
99
98
|
}
|
|
100
|
-
}
|
|
101
99
|
}
|
|
102
100
|
function detectRetiredPackageDuplicates(config, errors) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
101
|
+
if (config.retiredPackages === undefined)
|
|
102
|
+
return;
|
|
103
|
+
const seen = new Set();
|
|
104
|
+
for (const [index, retired] of config.retiredPackages.entries()) {
|
|
105
|
+
const key = `${retired.name}\0${retired.tagPrefix}`;
|
|
106
|
+
if (seen.has(key)) {
|
|
107
|
+
errors.push(`retiredPackages[${index}]: duplicate package (name='${retired.name}', tagPrefix='${retired.tagPrefix}')`);
|
|
108
|
+
}
|
|
109
|
+
seen.add(key);
|
|
111
110
|
}
|
|
112
|
-
seen.add(key);
|
|
113
|
-
}
|
|
114
111
|
}
|
|
115
112
|
function detectRetiredVsLegacyCollisions(config, errors) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
113
|
+
if (config.retiredPackages === undefined || config.workspaces === undefined)
|
|
114
|
+
return;
|
|
115
|
+
const legacyPrefixToWorkspace = new Map();
|
|
116
|
+
for (const workspace of config.workspaces) {
|
|
117
|
+
if (workspace.legacyIdentities === undefined)
|
|
118
|
+
continue;
|
|
119
|
+
for (const identity of workspace.legacyIdentities) {
|
|
120
|
+
if (!legacyPrefixToWorkspace.has(identity.tagPrefix)) {
|
|
121
|
+
legacyPrefixToWorkspace.set(identity.tagPrefix, workspace.dir);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
124
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
`retiredPackages[${index}]: tagPrefix '${retired.tagPrefix}' collides with a declared legacyIdentities[].tagPrefix on workspace '${collidingDir}'`
|
|
131
|
-
);
|
|
125
|
+
for (const [index, retired] of config.retiredPackages.entries()) {
|
|
126
|
+
const collidingDir = legacyPrefixToWorkspace.get(retired.tagPrefix);
|
|
127
|
+
if (collidingDir !== undefined) {
|
|
128
|
+
errors.push(`retiredPackages[${index}]: tagPrefix '${retired.tagPrefix}' collides with a declared legacyIdentities[].tagPrefix on workspace '${collidingDir}'`);
|
|
129
|
+
}
|
|
132
130
|
}
|
|
133
|
-
}
|
|
134
131
|
}
|
|
135
|
-
export {
|
|
136
|
-
validateConfig
|
|
137
|
-
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { DependencyGraph } from './buildDependencyGraph.
|
|
2
|
-
import type { WorkspaceConfig } from './types.
|
|
1
|
+
import type { DependencyGraph } from './buildDependencyGraph.js';
|
|
2
|
+
import type { WorkspaceConfig } from './types.js';
|
|
3
3
|
export interface CommitsProbeResult {
|
|
4
4
|
has: boolean;
|
|
5
5
|
tag: string | undefined;
|
|
@@ -1,109 +1,115 @@
|
|
|
1
|
-
function validateOnlyExcludesStrandedDependents(workspaces, only, graph, hasCommits) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
export function validateOnlyExcludesStrandedDependents(workspaces, only, graph, hasCommits) {
|
|
2
|
+
const probeCommits = memoizeCommitsProbe(hasCommits);
|
|
3
|
+
const workspaceByDir = new Map(workspaces.map((w) => [w.dir, w]));
|
|
4
|
+
const released = computeReleasedSet(only, workspaceByDir, graph, probeCommits);
|
|
5
|
+
const violations = collectStrandedViolations(released, new Set(only), graph, probeCommits);
|
|
6
|
+
if (violations.length === 0)
|
|
7
|
+
return undefined;
|
|
8
|
+
violations.sort((a, b) => a.dir.localeCompare(b.dir));
|
|
9
|
+
return violations;
|
|
9
10
|
}
|
|
10
11
|
function memoizeCommitsProbe(probe) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
const cache = new Map();
|
|
13
|
+
return (workspace) => {
|
|
14
|
+
const cached = cache.get(workspace.dir);
|
|
15
|
+
if (cached !== undefined)
|
|
16
|
+
return cached;
|
|
17
|
+
const result = probe(workspace);
|
|
18
|
+
cache.set(workspace.dir, result);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
19
21
|
}
|
|
20
22
|
function computeReleasedSet(only, workspaceByDir, graph, probeCommits) {
|
|
21
|
-
|
|
22
|
-
for (const dir of only) {
|
|
23
|
-
const workspace = workspaceByDir.get(dir);
|
|
24
|
-
if (workspace !== void 0 && probeCommits(workspace).has) {
|
|
25
|
-
released.add(dir);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
let changed = true;
|
|
29
|
-
while (changed) {
|
|
30
|
-
changed = false;
|
|
23
|
+
const released = new Set();
|
|
31
24
|
for (const dir of only) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
25
|
+
const workspace = workspaceByDir.get(dir);
|
|
26
|
+
if (workspace !== undefined && probeCommits(workspace).has) {
|
|
27
|
+
released.add(dir);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
let changed = true;
|
|
31
|
+
while (changed) {
|
|
32
|
+
changed = false;
|
|
33
|
+
for (const dir of only) {
|
|
34
|
+
if (released.has(dir))
|
|
35
|
+
continue;
|
|
36
|
+
if (hasDependencyIn(dir, graph, released)) {
|
|
37
|
+
released.add(dir);
|
|
38
|
+
changed = true;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
37
41
|
}
|
|
38
|
-
|
|
39
|
-
return released;
|
|
42
|
+
return released;
|
|
40
43
|
}
|
|
41
44
|
function hasDependencyIn(dir, graph, released) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
const forwardDeps = graph.dependenciesOf.get(dir);
|
|
46
|
+
if (forwardDeps === undefined)
|
|
47
|
+
return false;
|
|
48
|
+
for (const depPackageName of forwardDeps) {
|
|
49
|
+
const depDir = graph.packageNameToDir.get(depPackageName);
|
|
50
|
+
if (depDir !== undefined && released.has(depDir))
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
49
54
|
}
|
|
50
55
|
function collectStrandedViolations(released, onlySet, graph, probeCommits) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
const violations = [];
|
|
57
|
+
const violationDirs = new Set();
|
|
58
|
+
const visited = new Set();
|
|
59
|
+
const queue = [];
|
|
60
|
+
for (const dir of released) {
|
|
61
|
+
const packageName = graph.dirToPackageName.get(dir);
|
|
62
|
+
if (packageName !== undefined) {
|
|
63
|
+
queue.push({ packageName, attributionRoot: dir });
|
|
64
|
+
}
|
|
59
65
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
66
|
+
while (queue.length > 0) {
|
|
67
|
+
const item = queue.shift();
|
|
68
|
+
if (item === undefined)
|
|
69
|
+
break;
|
|
70
|
+
if (visited.has(item.packageName))
|
|
71
|
+
continue;
|
|
72
|
+
visited.add(item.packageName);
|
|
73
|
+
const dependents = graph.dependentsOf.get(item.packageName);
|
|
74
|
+
if (dependents === undefined)
|
|
75
|
+
continue;
|
|
76
|
+
for (const dependent of dependents) {
|
|
77
|
+
visitDependent(dependent, item.attributionRoot, {
|
|
78
|
+
released,
|
|
79
|
+
onlySet,
|
|
80
|
+
graph,
|
|
81
|
+
probeCommits,
|
|
82
|
+
queue,
|
|
83
|
+
violations,
|
|
84
|
+
violationDirs,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
78
87
|
}
|
|
79
|
-
|
|
80
|
-
return violations;
|
|
88
|
+
return violations;
|
|
81
89
|
}
|
|
82
90
|
function visitDependent(dependent, attributionRoot, ctx) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
91
|
+
if (ctx.onlySet.has(dependent.dir)) {
|
|
92
|
+
if (ctx.released.has(dependent.dir)) {
|
|
93
|
+
enqueueDependent(dependent, ctx);
|
|
94
|
+
}
|
|
95
|
+
return;
|
|
86
96
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
enqueueDependent(dependent, ctx);
|
|
97
|
+
const probe = ctx.probeCommits(dependent);
|
|
98
|
+
if (!probe.has)
|
|
99
|
+
return;
|
|
100
|
+
if (!ctx.violationDirs.has(dependent.dir)) {
|
|
101
|
+
ctx.violationDirs.add(dependent.dir);
|
|
102
|
+
ctx.violations.push({
|
|
103
|
+
dir: dependent.dir,
|
|
104
|
+
downstreamOf: attributionRoot,
|
|
105
|
+
tag: probe.tag,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
enqueueDependent(dependent, ctx);
|
|
100
109
|
}
|
|
101
110
|
function enqueueDependent(dependent, ctx) {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
111
|
+
const packageName = ctx.graph.dirToPackageName.get(dependent.dir);
|
|
112
|
+
if (packageName !== undefined) {
|
|
113
|
+
ctx.queue.push({ packageName, attributionRoot: dependent.dir });
|
|
114
|
+
}
|
|
106
115
|
}
|
|
107
|
-
export {
|
|
108
|
-
validateOnlyExcludesStrandedDependents
|
|
109
|
-
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type ValidateAllChangelogOverridesInputs, type ValidateAllChangelogOverridesResult } from './changelogOverrides.
|
|
2
|
-
import type { ChangelogEntry, ReleaseConfig } from './types.
|
|
1
|
+
import { type ValidateAllChangelogOverridesInputs, type ValidateAllChangelogOverridesResult } from './changelogOverrides.js';
|
|
2
|
+
import type { ChangelogEntry, ReleaseConfig } from './types.js';
|
|
3
3
|
export interface ValidateOverridesCommandResult {
|
|
4
4
|
exitCode: 0 | 1 | 2;
|
|
5
5
|
message: string;
|