Skip to content

Commit

Permalink
fix(core): fix "cannot read property 'version' of undefined" for pnpm…
Browse files Browse the repository at this point in the history
… + independent versioning (#3358)
  • Loading branch information
fahslaj committed Oct 9, 2022
1 parent c455b1c commit 31e4c98
Show file tree
Hide file tree
Showing 3 changed files with 177 additions and 3 deletions.
65 changes: 65 additions & 0 deletions core/package-graph/__tests__/package-graph.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,71 @@ describe("PackageGraph", () => {
});

describe("with spec containing workspace: prefix", () => {
describe("without depNode for sibling package", () => {
it("replaces workspace alias ~ with * and adds sibling to external dependencies", () => {
const packages = [
new Package(
{
name: "test-2",
version: "1.0.0",
dependencies: {
"test-1": "workspace:~",
},
},
"/test/test-2"
),
];
const graph = new PackageGraph(packages, "allDependencies");
const package2 = graph.get("test-2");

expect(package2.externalDependencies.has("test-1")).toBe(true);
expect(package2.externalDependencies.get("test-1").workspaceSpec).toBe("workspace:~");
expect(package2.externalDependencies.get("test-1").workspaceAlias).toBe("~");
});

it("replaces workspace alias * with * and adds sibling to external dependencies", () => {
const packages = [
new Package(
{
name: "test-2",
version: "1.0.0",
dependencies: {
"test-1": "workspace:*",
},
},
"/test/test-2"
),
];
const graph = new PackageGraph(packages, "allDependencies");
const package2 = graph.get("test-2");

expect(package2.externalDependencies.has("test-1")).toBe(true);
expect(package2.externalDependencies.get("test-1").workspaceSpec).toBe("workspace:*");
expect(package2.externalDependencies.get("test-1").workspaceAlias).toBe("*");
});

it("replaces workspace alias ^ with * and adds sibling to external dependencies", () => {
const packages = [
new Package(
{
name: "test-2",
version: "1.0.0",
dependencies: {
"test-1": "workspace:^",
},
},
"/test/test-2"
),
];
const graph = new PackageGraph(packages, "allDependencies");
const package2 = graph.get("test-2");

expect(package2.externalDependencies.has("test-1")).toBe(true);
expect(package2.externalDependencies.get("test-1").workspaceSpec).toBe("workspace:^");
expect(package2.externalDependencies.get("test-1").workspaceAlias).toBe("^");
});
});

describe("creates graph links for sibling package when semver is satisfied", () => {
it("with exact match", () => {
const packages = [
Expand Down
10 changes: 7 additions & 3 deletions core/package-graph/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,13 @@ class PackageGraph extends Map {
// replace aliases (https://pnpm.io/workspaces#referencing-workspace-packages-through-aliases)
if (spec === "*" || spec === "^" || spec === "~") {
workspaceAlias = spec;
const prefix = spec === "*" ? "" : spec;
const version = depNode.version;
spec = `${prefix}${version}`;
if (depNode?.version) {
const prefix = spec === "*" ? "" : spec;
const version = depNode.version;
spec = `${prefix}${version}`;
} else {
spec = "*";
}
}
}

Expand Down
105 changes: 105 additions & 0 deletions e2e/tests/lerna-version/independent-pnpm.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import { Fixture } from "../../utils/fixture";
import { normalizeCommitSHAs, normalizeEnvironment } from "../../utils/snapshot-serializer-utils";

expect.addSnapshotSerializer({
serialize(str: string) {
return normalizeCommitSHAs(normalizeEnvironment(str));
},
test(val: string) {
return val != null && typeof val === "string";
},
});

describe("lerna-version-independent-pnpm", () => {
let fixture: Fixture;

beforeEach(async () => {
fixture = await Fixture.create({
name: "lerna-version-independent",
packageManager: "pnpm",
initializeGit: true,
runLernaInit: true,
installDependencies: true,
});
});
afterEach(() => fixture.destroy());

it("should support versioning package-b independent of package-a when using the workspace prefix", async () => {
await fixture.lerna("create package-a -y");
await fixture.lerna("create package-b -y --dependencies package-a");
await fixture.updateJson("lerna.json", (json) => ({
...json,
version: "independent",
}));
await fixture.createInitialGitCommit();
await fixture.exec("git push origin test-main");
await fixture.lerna("version 0.0.0 -y");

await fixture.addDependencyToPackage({
packagePath: "packages/package-b",
dependencyName: "package-a",
version: "workspace:*",
});
await fixture.exec("git add .");
await fixture.exec("git commit -m 'chore: update package-b dependency'");

const output = await fixture.lerna("version 3.3.3 -y");
expect(output.combinedOutput).toMatchInlineSnapshot(`
lerna notice cli v999.9.9-e2e.0
lerna info versioning independent
lerna info Looking for changed packages since package-a@0.0.0
Changes:
- package-b: 0.0.0 => 3.3.3
lerna info auto-confirmed
lerna info execute Skipping releases
lerna info git Pushing tags...
lerna success version finished
`);
});

it("should support versioning package-a and package-b when using the workspace prefix", async () => {
await fixture.lerna("create package-a -y");
await fixture.lerna("create package-b -y --dependencies package-a");
await fixture.updateJson("lerna.json", (json) => ({
...json,
version: "independent",
}));
await fixture.addDependencyToPackage({
packagePath: "packages/package-b",
dependencyName: "package-a",
version: "workspace:*",
});

await fixture.createInitialGitCommit();
await fixture.exec("git push origin test-main");
await fixture.lerna("version 0.0.0 -y");

await fixture.addDependencyToPackage({
packagePath: "packages/package-a",
dependencyName: "yargs",
version: "*",
});
await fixture.exec("git add .");
await fixture.exec("git commit -m 'chore: update package-a dependency'");

const output = await fixture.lerna("version 3.3.3 -y");
expect(output.combinedOutput).toMatchInlineSnapshot(`
lerna notice cli v999.9.9-e2e.0
lerna info versioning independent
lerna info Looking for changed packages since package-a@0.0.0
Changes:
- package-a: 0.0.0 => 3.3.3
- package-b: 0.0.0 => 3.3.3
lerna info auto-confirmed
lerna info execute Skipping releases
lerna info git Pushing tags...
lerna success version finished
`);
});
});

0 comments on commit 31e4c98

Please sign in to comment.