Skip to content

Commit

Permalink
Fix upgrade command for outdated dev deps (#2093)
Browse files Browse the repository at this point in the history
* Failing test for outdated dev deps

* Fix outdated devDeps being ignored

* Changesets
  • Loading branch information
frandiox committed May 8, 2024
1 parent ae262b6 commit 286589e
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 4 deletions.
5 changes: 5 additions & 0 deletions .changeset/early-rockets-do.md
@@ -0,0 +1,5 @@
---
'@shopify/cli-hydrogen': patch
---

Fix `h2 upgrade` command to detect outdated devDependencies.
90 changes: 88 additions & 2 deletions packages/cli/src/commands/hydrogen/upgrade.test.ts
Expand Up @@ -142,6 +142,22 @@ async function inTemporaryHydrogenRepo(
});
}

function increasePatchVersion(depName: string, deps: Record<string, string>) {
const depVersion = deps[depName];
if (!depVersion) {
throw new Error(
`No dependency "${depName}" found in: ${Object.keys(deps || {})}`,
);
}

return {
[depName]: depVersion.replace(
/\.(\d+)$/,
(_, patchVersion) => `.${Number(patchVersion) + 1}`,
),
};
}

describe('upgrade', async () => {
// Create an outdated skeleton package.json for all tests
const OUTDATED_HYDROGEN_PACKAGE_JSON = createOutdatedSkeletonPackageJson();
Expand Down Expand Up @@ -295,13 +311,83 @@ describe('upgrade', async () => {
cleanGitRepo: true,
packageJson: {
dependencies: {
// @ts-ignore
'@shopify/hydrogen': releases[2].version,
'@shopify/hydrogen': releases[2]!.version,
},
},
},
);
});

it('it finds outdated dependencies', async () => {
const {releases} = await getChangelog();
const latestRelease = releases[0]!;

expect(
getAvailableUpgrades({
currentVersion: latestRelease.version,
currentDependencies: {},
releases,
}).availableUpgrades,
).toHaveLength(0);

const depName = Object.keys(latestRelease.dependencies)[0]!;
const devDepName = Object.keys(latestRelease.devDependencies)[0]!;

// Copy of latest release, no changes
expect(
getAvailableUpgrades({
currentVersion: latestRelease.version,
currentDependencies: {
[depName]: latestRelease.dependencies[depName]!,
[devDepName]: latestRelease.devDependencies[devDepName]!,
},
releases: [{...latestRelease}, ...releases],
}).availableUpgrades,
).toHaveLength(0);

// Copy of latest release but with increased patch version of a dependency
expect(
getAvailableUpgrades({
currentVersion: latestRelease.version,
currentDependencies: {
[depName]: latestRelease.dependencies[depName]!,
},
releases: [
{
...latestRelease,
dependencies: {
...latestRelease.dependencies,
...increasePatchVersion(depName, latestRelease.dependencies),
},
},
...releases,
],
}).availableUpgrades,
).toHaveLength(1);

// Copy of latest release but with increased patch version of a dev-dependency
expect(
getAvailableUpgrades({
currentVersion: latestRelease.version,
currentDependencies: {
[devDepName]: latestRelease.devDependencies[devDepName]!,
},
releases: [
{
...latestRelease,
devDependencies: {
...latestRelease.devDependencies,
...increasePatchVersion(
devDepName,
latestRelease.devDependencies,
),
},
},
...releases,
],
}).availableUpgrades,
).toHaveLength(1);
});
});

describe('getSelectedRelease', () => {
Expand Down
7 changes: 5 additions & 2 deletions packages/cli/src/commands/hydrogen/upgrade.ts
Expand Up @@ -327,14 +327,17 @@ export async function getChangelog(): Promise<ChangeLog> {
);
}

export function hasOutdatedDependencies({
function hasOutdatedDependencies({
release,
currentDependencies,
}: {
release: Release;
currentDependencies: Dependencies;
}) {
return Object.entries(release.dependencies).some(([name, version]) => {
return Object.entries({
...release.dependencies,
...release.devDependencies,
}).some(([name, version]) => {
const currentDependencyVersion = currentDependencies?.[name];
if (!currentDependencyVersion) return false;
const isDependencyOutdated = semver.gt(
Expand Down

0 comments on commit 286589e

Please sign in to comment.