Skip to content

Commit 7c90c83

Browse files
committed
Address PR feedback
1 parent 7bc1221 commit 7c90c83

File tree

3 files changed

+52
-43
lines changed

3 files changed

+52
-43
lines changed

src/release-specification.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,7 @@ ${releaseSpecificationPath}
657657
});
658658
});
659659

660-
it('throws if there are any packages in the release with a major version bump using the word "major", but any of their dependents defined as "peerDependencies" have no changes since their latest release and are not listed in the release', async () => {
660+
it('throws if there are any packages in the release with a major version bump using the word "major", but any of their dependents defined as "peerDependencies" are not listed in the release, even if they have no changes', async () => {
661661
await withSandbox(async (sandbox) => {
662662
const project = buildMockProject({
663663
workspacePackages: {
@@ -767,7 +767,7 @@ ${releaseSpecificationPath}
767767
});
768768
});
769769

770-
it('throws if there are any packages in the release with a major version bump using a literal version, but any of their dependents defined as "peerDependencies" have no changes since their latest release and are not listed in the release', async () => {
770+
it('throws if there are any packages in the release with a major version bump using a literal version, but any of their dependents defined as "peerDependencies" are not listed in the release, even if they have no changes', async () => {
771771
await withSandbox(async (sandbox) => {
772772
const project = buildMockProject({
773773
workspacePackages: {
@@ -878,7 +878,7 @@ ${releaseSpecificationPath}
878878
});
879879
});
880880

881-
it('throws if there are any packages in the release with a major version bump using the word "major", but their dependents via "peerDependencies" have no changes since their latest release and have their version specified as null in the release spec', async () => {
881+
it('throws if there are any packages in the release with a major version bump using the word "major", but their dependents via "peerDependencies" have their version specified as null in the release spec, even if they have no changes', async () => {
882882
await withSandbox(async (sandbox) => {
883883
const project = buildMockProject({
884884
workspacePackages: {
@@ -990,7 +990,7 @@ ${releaseSpecificationPath}
990990
});
991991
});
992992

993-
it('throws if there are any packages in the release with a major version bump using a literal version, but their dependents via "peerDependencies" have no changes since their latest release and have their version specified as null in the release spec', async () => {
993+
it('throws if there are any packages in the release with a major version bump using a literal version, but their dependents via "peerDependencies" have their version specified as null in the release spec, even if they have no changes', async () => {
994994
await withSandbox(async (sandbox) => {
995995
const project = buildMockProject({
996996
workspacePackages: {

src/ui/App.tsx

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const setsAreEqual = (a: Set<string>, b: Set<string>) => {
1313
};
1414

1515
type SubmitButtonProps = {
16-
selections: Record<string, string>;
16+
releaseSelections: Record<string, string>;
1717
packageDependencyErrors: Record<
1818
string,
1919
{ missingDependentNames: string[]; missingDependencies: string[] }
@@ -22,14 +22,16 @@ type SubmitButtonProps = {
2222
};
2323

2424
function SubmitButton({
25-
selections,
25+
releaseSelections,
2626
packageDependencyErrors,
2727
onSubmit,
2828
}: SubmitButtonProps) {
2929
const isDisabled =
30-
Object.keys(selections).length === 0 ||
30+
Object.keys(releaseSelections).length === 0 ||
3131
Object.keys(packageDependencyErrors).length > 0 ||
32-
Object.values(selections).every((value) => value === 'intentionally-skip');
32+
Object.values(releaseSelections).every(
33+
(value) => value === 'intentionally-skip',
34+
);
3335

3436
return (
3537
<button
@@ -48,7 +50,9 @@ function SubmitButton({
4850

4951
function App() {
5052
const [packages, setPackages] = useState<Package[]>([]);
51-
const [selections, setSelections] = useState<Record<string, string>>({});
53+
const [releaseSelections, setReleaseSelections] = useState<
54+
Record<string, string>
55+
>({});
5256
const [isSubmitting, setIsSubmitting] = useState(false);
5357
const [error, setError] = useState<string | null>(null);
5458
const [changelogs, setChangelogs] = useState<Record<string, string>>({});
@@ -76,7 +80,7 @@ function App() {
7680
const previousPackages = useRef<Set<string>>(new Set());
7781

7882
useEffect(() => {
79-
const majorBumps = Object.entries(selections)
83+
const majorBumps = Object.entries(releaseSelections)
8084
.filter(([_, type]) => type === 'major')
8185
.map(([pkgName]) => pkgName);
8286

@@ -90,9 +94,9 @@ function App() {
9094
.then((data: Package[]) => {
9195
const newPackageNames = new Set(data.map((pkg) => pkg.name));
9296

93-
// Only clean up selections if the package list actually changed
97+
// Only clean up releaseSelections if the package list actually changed
9498
if (!setsAreEqual(previousPackages.current, newPackageNames)) {
95-
setSelections((prev) =>
99+
setReleaseSelections((prev) =>
96100
Object.fromEntries(
97101
Object.entries(prev).filter(([pkgName]) =>
98102
newPackageNames.has(pkgName),
@@ -111,7 +115,7 @@ function App() {
111115
setError(err.message);
112116
console.error('Error fetching packages:', err);
113117
});
114-
}, [selections]);
118+
}, [releaseSelections]);
115119

116120
const checkDependencies = async (selectionData: Record<string, string>) => {
117121
if (Object.keys(selectionData).length === 0) return;
@@ -144,11 +148,11 @@ function App() {
144148

145149
useEffect(() => {
146150
const timeoutId = setTimeout(() => {
147-
void checkDependencies(selections);
151+
void checkDependencies(releaseSelections);
148152
}, 500);
149153

150154
return () => clearTimeout(timeoutId);
151-
}, [selections]);
155+
}, [releaseSelections]);
152156

153157
const handleCustomVersionChange = (packageName: string, version: string) => {
154158
try {
@@ -178,7 +182,7 @@ function App() {
178182
return rest;
179183
});
180184

181-
setSelections((prev) => ({
185+
setReleaseSelections((prev) => ({
182186
...prev,
183187
[packageName]: version,
184188
}));
@@ -195,14 +199,14 @@ function App() {
195199
value: ReleaseType | '',
196200
): void => {
197201
if (value === '') {
198-
const { [packageName]: _, ...rest } = selections;
199-
setSelections(rest);
202+
const { [packageName]: _, ...rest } = releaseSelections;
203+
setReleaseSelections(rest);
200204

201205
const { [packageName]: __, ...remainingErrors } = packageDependencyErrors;
202206
setPackageDependencyErrors(remainingErrors);
203207
} else {
204-
setSelections({
205-
...selections,
208+
setReleaseSelections({
209+
...releaseSelections,
206210
[packageName]: value,
207211
});
208212
}
@@ -214,7 +218,7 @@ function App() {
214218
const response = await fetch('/api/release', {
215219
method: 'POST',
216220
headers: { 'Content-Type': 'application/json' },
217-
body: JSON.stringify(selections),
221+
body: JSON.stringify(releaseSelections),
218222
});
219223

220224
const data: {
@@ -250,8 +254,8 @@ function App() {
250254
const errorMessage =
251255
err instanceof Error ? err.message : 'An error occurred';
252256
setError(errorMessage);
253-
console.error('Error submitting selections:', err);
254-
alert('Failed to submit selections. Please try again.');
257+
console.error('Error submitting releaseSelections:', err);
258+
alert('Failed to submit releaseSelections. Please try again.');
255259
} finally {
256260
setIsSubmitting(false);
257261
}
@@ -276,11 +280,11 @@ function App() {
276280
};
277281

278282
const handleBulkAction = (action: ReleaseType) => {
279-
const newSelections = { ...selections };
283+
const newReleaseSelections = { ...releaseSelections };
280284
selectedPackages.forEach((packageName) => {
281-
newSelections[packageName] = action;
285+
newReleaseSelections[packageName] = action;
282286
});
283-
setSelections(newSelections);
287+
setReleaseSelections(newReleaseSelections);
284288
setSelectedPackages(new Set());
285289
setShowCheckboxes(true);
286290
};
@@ -389,7 +393,7 @@ function App() {
389393
<PackageItem
390394
key={pkg.name}
391395
pkg={pkg}
392-
selections={selections}
396+
releaseSelections={releaseSelections}
393397
versionErrors={versionErrors}
394398
packageDependencyErrors={packageDependencyErrors}
395399
loadingChangelogs={loadingChangelogs}
@@ -399,7 +403,7 @@ function App() {
399403
onSelectionChange={handleSelectionChange}
400404
onCustomVersionChange={handleCustomVersionChange}
401405
onFetchChangelog={fetchChangelog}
402-
setSelections={setSelections}
406+
setReleaseSelections={setReleaseSelections}
403407
setChangelogs={setChangelogs}
404408
onToggleSelect={() => togglePackageSelection(pkg.name)}
405409
/>
@@ -408,7 +412,7 @@ function App() {
408412

409413
{packages.length > 0 && (
410414
<SubmitButton
411-
selections={selections}
415+
releaseSelections={releaseSelections}
412416
packageDependencyErrors={packageDependencyErrors}
413417
onSubmit={handleSubmit}
414418
/>

src/ui/PackageItem.tsx

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Package, ReleaseType } from './types.js';
66

77
type PackageItemProps = {
88
pkg: Package;
9-
selections: Record<string, string>;
9+
releaseSelections: Record<string, string>;
1010
versionErrors: Record<string, string>;
1111
packageDependencyErrors: Record<
1212
string,
@@ -22,14 +22,16 @@ type PackageItemProps = {
2222
onSelectionChange: (packageName: string, value: ReleaseType | '') => void;
2323
onCustomVersionChange: (packageName: string, version: string) => void;
2424
onFetchChangelog: (packageName: string) => Promise<void>;
25-
setSelections: React.Dispatch<React.SetStateAction<Record<string, string>>>;
25+
setReleaseSelections: React.Dispatch<
26+
React.SetStateAction<Record<string, string>>
27+
>;
2628
setChangelogs: React.Dispatch<React.SetStateAction<Record<string, string>>>;
2729
onToggleSelect: () => void;
2830
};
2931

3032
export function PackageItem({
3133
pkg,
32-
selections,
34+
releaseSelections,
3335
versionErrors,
3436
packageDependencyErrors,
3537
loadingChangelogs,
@@ -39,7 +41,7 @@ export function PackageItem({
3941
onSelectionChange,
4042
onCustomVersionChange,
4143
onFetchChangelog,
42-
setSelections,
44+
setReleaseSelections,
4345
setChangelogs,
4446
onToggleSelect,
4547
}: PackageItemProps) {
@@ -48,7 +50,8 @@ export function PackageItem({
4850
key={pkg.name}
4951
id={`package-${pkg.name}`}
5052
className={`border p-4 rounded-lg ${
51-
selections[pkg.name] && selections[pkg.name] !== 'intentionally-skip'
53+
releaseSelections[pkg.name] &&
54+
releaseSelections[pkg.name] !== 'intentionally-skip'
5255
? 'border-2'
5356
: 'border-gray-200'
5457
} ${
@@ -76,17 +79,19 @@ export function PackageItem({
7679
<div className="flex items-center justify-between">
7780
<div>
7881
<p className="text-gray-600">Current version: {pkg.version}</p>
79-
{selections[pkg.name] &&
80-
selections[pkg.name] !== 'intentionally-skip' &&
81-
selections[pkg.name] !== 'custom' &&
82+
{releaseSelections[pkg.name] &&
83+
releaseSelections[pkg.name] !== 'intentionally-skip' &&
84+
releaseSelections[pkg.name] !== 'custom' &&
8285
!versionErrors[pkg.name] && (
8386
<p className="text-yellow-700">
8487
New version:{' '}
85-
{!['patch', 'minor', 'major'].includes(selections[pkg.name])
86-
? selections[pkg.name]
88+
{!['patch', 'minor', 'major'].includes(
89+
releaseSelections[pkg.name],
90+
)
91+
? releaseSelections[pkg.name]
8792
: new SemVer(pkg.version)
8893
.inc(
89-
selections[pkg.name] as Exclude<
94+
releaseSelections[pkg.name] as Exclude<
9095
ReleaseType,
9196
'intentionally-skip' | 'custom' | string
9297
>,
@@ -102,7 +107,7 @@ export function PackageItem({
102107
</div>
103108
<VersionSelector
104109
packageName={pkg.name}
105-
selection={selections[pkg.name]}
110+
selection={releaseSelections[pkg.name]}
106111
onSelectionChange={onSelectionChange}
107112
onCustomVersionChange={onCustomVersionChange}
108113
onFetchChangelog={onFetchChangelog}
@@ -120,7 +125,7 @@ export function PackageItem({
120125
<DependencyErrorSection
121126
title="Missing Dependencies"
122127
items={packageDependencyErrors[pkg.name].missingDependencies}
123-
setSelections={setSelections}
128+
setSelections={setReleaseSelections}
124129
description={`The following packages are dependencies or peer dependencies of ${pkg.name}. Because they may have introduced new changes that ${pkg.name} is now using, you need to verify whether to include them in the release.
125130
126131
To do this, look at the change history for each package and compare it with the change history for ${pkg.name}. If ${pkg.name} uses any new changes from a package, then you need to include it by bumping its version. If you have confirmed that the changes to a package do not affect ${pkg.name}, you may omit it from the release by choosing "Skip" instead.`}
@@ -134,7 +139,7 @@ To do this, look at the change history for each package and compare it with the
134139
items={
135140
packageDependencyErrors[pkg.name].missingDependentNames
136141
}
137-
setSelections={setSelections}
142+
setSelections={setReleaseSelections}
138143
description={`Because ${pkg.name} is being released with a new major version, to prevent peer dependency warnings in consuming projects, all of the following packages which list ${pkg.name} as a peer dependency need to be included in the release. Please choose new versions for these packages. If for some reason you feel it is safe to omit a package you may choose "Skip".`}
139144
/>
140145
</div>

0 commit comments

Comments
 (0)