@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.
Files changed (134) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +3 -3
  3. package/dist/esm/.cache +1 -1
  4. package/dist/esm/assertCleanWorkingTree.js +9 -14
  5. package/dist/esm/bin/release-kit.js +200 -199
  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 -102
  27. package/dist/esm/collectPolicyViolations.d.ts +2 -2
  28. package/dist/esm/collectPolicyViolations.js +11 -14
  29. package/dist/esm/commitCommand.js +48 -46
  30. package/dist/esm/compareVersions.js +20 -23
  31. package/dist/esm/createGithubRelease.js +56 -59
  32. package/dist/esm/createGithubReleaseCommand.js +21 -23
  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.js +4 -8
  55. package/dist/esm/index.d.ts +4 -4
  56. package/dist/esm/index.js +2 -8
  57. package/dist/esm/init/checks.js +28 -32
  58. package/dist/esm/init/detectRepoType.js +12 -15
  59. package/dist/esm/init/initCommand.js +60 -54
  60. package/dist/esm/init/parseJsonRecord.js +9 -11
  61. package/dist/esm/init/scaffold.d.ts +1 -1
  62. package/dist/esm/init/scaffold.js +32 -38
  63. package/dist/esm/init/templates.d.ts +1 -1
  64. package/dist/esm/init/templates.js +16 -22
  65. package/dist/esm/injectReleaseNotesIntoReadme.js +42 -49
  66. package/dist/esm/injectSection.js +17 -27
  67. package/dist/esm/loadConfig.d.ts +1 -1
  68. package/dist/esm/loadConfig.js +206 -225
  69. package/dist/esm/parseCommitMessage.d.ts +1 -1
  70. package/dist/esm/parseCommitMessage.js +72 -76
  71. package/dist/esm/parseRequestedTags.js +6 -9
  72. package/dist/esm/prepareCommand.d.ts +1 -1
  73. package/dist/esm/prepareCommand.js +225 -235
  74. package/dist/esm/previewTagPrefixes.d.ts +1 -1
  75. package/dist/esm/previewTagPrefixes.js +101 -96
  76. package/dist/esm/propagateBumps.d.ts +2 -2
  77. package/dist/esm/propagateBumps.js +48 -50
  78. package/dist/esm/publish.d.ts +2 -2
  79. package/dist/esm/publish.js +22 -28
  80. package/dist/esm/publishCommand.js +75 -80
  81. package/dist/esm/pushCommand.js +33 -34
  82. package/dist/esm/pushRelease.d.ts +1 -1
  83. package/dist/esm/pushRelease.js +21 -24
  84. package/dist/esm/readCurrentVersion.js +13 -17
  85. package/dist/esm/releasePrepare.d.ts +1 -1
  86. package/dist/esm/releasePrepare.js +213 -231
  87. package/dist/esm/releasePrepareMono.d.ts +2 -2
  88. package/dist/esm/releasePrepareMono.js +434 -494
  89. package/dist/esm/releasePrepareProject.d.ts +2 -2
  90. package/dist/esm/releasePrepareProject.js +143 -153
  91. package/dist/esm/renderChangelogMarkdown.d.ts +1 -1
  92. package/dist/esm/renderChangelogMarkdown.js +20 -24
  93. package/dist/esm/renderReleaseNotes.d.ts +1 -1
  94. package/dist/esm/renderReleaseNotes.js +50 -55
  95. package/dist/esm/reportPrepare.d.ts +1 -1
  96. package/dist/esm/reportPrepare.js +230 -231
  97. package/dist/esm/resolveCliffConfigPath.js +18 -23
  98. package/dist/esm/resolveCommandTags.d.ts +1 -1
  99. package/dist/esm/resolveCommandTags.js +47 -45
  100. package/dist/esm/resolveReleaseNotesConfig.d.ts +1 -1
  101. package/dist/esm/resolveReleaseNotesConfig.js +39 -43
  102. package/dist/esm/resolveReleaseTags.d.ts +1 -1
  103. package/dist/esm/resolveReleaseTags.js +39 -40
  104. package/dist/esm/runGitCliff.js +27 -30
  105. package/dist/esm/showTagPrefixesCommand.js +48 -70
  106. package/dist/esm/stripEmojiPrefix.js +2 -5
  107. package/dist/esm/stripScope.js +18 -21
  108. package/dist/esm/sync-labels/generateCommand.d.ts +1 -1
  109. package/dist/esm/sync-labels/generateCommand.js +51 -53
  110. package/dist/esm/sync-labels/initCommand.js +46 -48
  111. package/dist/esm/sync-labels/loadSyncLabelsConfig.d.ts +1 -1
  112. package/dist/esm/sync-labels/loadSyncLabelsConfig.js +46 -52
  113. package/dist/esm/sync-labels/presets.d.ts +1 -1
  114. package/dist/esm/sync-labels/presets.js +40 -43
  115. package/dist/esm/sync-labels/resolveLabels.d.ts +1 -1
  116. package/dist/esm/sync-labels/resolveLabels.js +28 -35
  117. package/dist/esm/sync-labels/syncCommand.js +30 -31
  118. package/dist/esm/sync-labels/templates.d.ts +1 -1
  119. package/dist/esm/sync-labels/templates.js +23 -26
  120. package/dist/esm/sync-labels/types.js +1 -0
  121. package/dist/esm/syncWorkTypes.js +83 -84
  122. package/dist/esm/tagCommand.js +12 -14
  123. package/dist/esm/typeGuards.js +4 -8
  124. package/dist/esm/types.js +66 -60
  125. package/dist/esm/validateConfig.d.ts +1 -1
  126. package/dist/esm/validateConfig.js +109 -115
  127. package/dist/esm/validateOnlyExcludesStrandedDependents.d.ts +2 -2
  128. package/dist/esm/validateOnlyExcludesStrandedDependents.js +97 -91
  129. package/dist/esm/validateOverridesCommand.d.ts +2 -2
  130. package/dist/esm/validateOverridesCommand.js +110 -111
  131. package/dist/esm/workTypesData.js +57 -60
  132. package/dist/esm/workTypesUtils.js +16 -21
  133. package/dist/esm/writeReleaseNotesPreviews.js +55 -57
  134. package/package.json +2 -2
@@ -1,137 +1,131 @@
1
1
  import { isRecord } from "./typeGuards.js";
2
2
  import { releaseKitConfigSchema } from "./types.js";
3
- 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(
25
- "releaseNotes.shouldInjectIntoReadme is enabled but changelogJson.enabled is false; README injection will be skipped at runtime"
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
- if (!isRecord(raw)) return { cleaned: raw, deprecationErrors: [] };
32
- const errors = [];
33
- const cleaned = { ...raw };
34
- if (isRecord(cleaned.releaseNotes) && "shouldCreateGithubRelease" in cleaned.releaseNotes) {
35
- errors.push(
36
- "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."
37
- );
38
- const releaseNotesCopy = { ...cleaned.releaseNotes };
39
- delete releaseNotesCopy.shouldCreateGithubRelease;
40
- cleaned.releaseNotes = releaseNotesCopy;
41
- }
42
- if (Array.isArray(cleaned.workspaces)) {
43
- cleaned.workspaces = cleaned.workspaces.map((ws, i) => {
44
- if (!isRecord(ws)) return ws;
45
- const wsCopy = { ...ws };
46
- if ("tagPrefix" in wsCopy) {
47
- const dir = typeof wsCopy.dir === "string" && wsCopy.dir !== "" ? wsCopy.dir : "<dir>";
48
- errors.push(`workspaces[${i}]: 'tagPrefix' is no longer supported; remove it to use the default '${dir}-v'`);
49
- delete wsCopy.tagPrefix;
50
- }
51
- if ("legacyTagPrefixes" in wsCopy) {
52
- errors.push(
53
- `workspaces[${i}]: 'legacyTagPrefixes' is no longer supported; use 'legacyIdentities: [{ name, tagPrefix }, ...]' instead`
54
- );
55
- delete wsCopy.legacyTagPrefixes;
56
- }
57
- return wsCopy;
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
- const path = renderPath(issue.path);
64
- const message = customizeMessage(issue);
65
- return path === "" ? message : `${path}: ${message}`;
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
- if (issue.code === "too_small" && issue.origin === "string") {
69
- return "must be a non-empty string";
70
- }
71
- return issue.message;
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
- let rendered = "";
75
- for (const segment of path) {
76
- if (typeof segment === "number") {
77
- rendered += `[${segment}]`;
78
- } else if (rendered === "") {
79
- rendered += String(segment);
80
- } else {
81
- rendered += `.${String(segment)}`;
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
- if (config.workspaces === void 0) return;
88
- for (const [wsIndex, workspace] of config.workspaces.entries()) {
89
- if (workspace.legacyIdentities === void 0) continue;
90
- const seen = /* @__PURE__ */ 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(
95
- `workspaces[${wsIndex}].legacyIdentities[${entryIndex}]: duplicate identity (name='${identity.name}', tagPrefix='${identity.tagPrefix}')`
96
- );
97
- }
98
- seen.add(key);
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
- if (config.retiredPackages === void 0) return;
104
- const seen = /* @__PURE__ */ new Set();
105
- for (const [index, retired] of config.retiredPackages.entries()) {
106
- const key = `${retired.name}\0${retired.tagPrefix}`;
107
- if (seen.has(key)) {
108
- errors.push(
109
- `retiredPackages[${index}]: duplicate package (name='${retired.name}', tagPrefix='${retired.tagPrefix}')`
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
- if (config.retiredPackages === void 0 || config.workspaces === void 0) return;
117
- const legacyPrefixToWorkspace = /* @__PURE__ */ new Map();
118
- for (const workspace of config.workspaces) {
119
- if (workspace.legacyIdentities === void 0) continue;
120
- for (const identity of workspace.legacyIdentities) {
121
- if (!legacyPrefixToWorkspace.has(identity.tagPrefix)) {
122
- legacyPrefixToWorkspace.set(identity.tagPrefix, workspace.dir);
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
- for (const [index, retired] of config.retiredPackages.entries()) {
127
- const collidingDir = legacyPrefixToWorkspace.get(retired.tagPrefix);
128
- if (collidingDir !== void 0) {
129
- errors.push(
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.ts';
2
- import type { WorkspaceConfig } from './types.ts';
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
- 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) return void 0;
7
- violations.sort((a, b) => a.dir.localeCompare(b.dir));
8
- return violations;
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
- const cache = /* @__PURE__ */ new Map();
12
- return (workspace) => {
13
- const cached = cache.get(workspace.dir);
14
- if (cached !== void 0) return cached;
15
- const result = probe(workspace);
16
- cache.set(workspace.dir, result);
17
- return result;
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
- const released = /* @__PURE__ */ new Set();
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
- if (released.has(dir)) continue;
33
- if (hasDependencyIn(dir, graph, released)) {
34
- released.add(dir);
35
- changed = true;
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
- const forwardDeps = graph.dependenciesOf.get(dir);
43
- if (forwardDeps === void 0) return false;
44
- for (const depPackageName of forwardDeps) {
45
- const depDir = graph.packageNameToDir.get(depPackageName);
46
- if (depDir !== void 0 && released.has(depDir)) return true;
47
- }
48
- return false;
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
- const violations = [];
52
- const violationDirs = /* @__PURE__ */ new Set();
53
- const visited = /* @__PURE__ */ new Set();
54
- const queue = [];
55
- for (const dir of released) {
56
- const packageName = graph.dirToPackageName.get(dir);
57
- if (packageName !== void 0) {
58
- queue.push({ packageName, attributionRoot: dir });
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
- while (queue.length > 0) {
62
- const item = queue.shift();
63
- if (item === void 0) break;
64
- if (visited.has(item.packageName)) continue;
65
- visited.add(item.packageName);
66
- const dependents = graph.dependentsOf.get(item.packageName);
67
- if (dependents === void 0) continue;
68
- for (const dependent of dependents) {
69
- visitDependent(dependent, item.attributionRoot, {
70
- released,
71
- onlySet,
72
- graph,
73
- probeCommits,
74
- queue,
75
- violations,
76
- violationDirs
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
- if (ctx.onlySet.has(dependent.dir)) {
84
- if (ctx.released.has(dependent.dir)) {
85
- enqueueDependent(dependent, ctx);
91
+ if (ctx.onlySet.has(dependent.dir)) {
92
+ if (ctx.released.has(dependent.dir)) {
93
+ enqueueDependent(dependent, ctx);
94
+ }
95
+ return;
86
96
  }
87
- return;
88
- }
89
- const probe = ctx.probeCommits(dependent);
90
- if (!probe.has) return;
91
- if (!ctx.violationDirs.has(dependent.dir)) {
92
- ctx.violationDirs.add(dependent.dir);
93
- ctx.violations.push({
94
- dir: dependent.dir,
95
- downstreamOf: attributionRoot,
96
- tag: probe.tag
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
- const packageName = ctx.graph.dirToPackageName.get(dependent.dir);
103
- if (packageName !== void 0) {
104
- ctx.queue.push({ packageName, attributionRoot: dependent.dir });
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.ts';
2
- import type { ChangelogEntry, ReleaseConfig } from './types.ts';
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;