diff --git a/core/command/__tests__/command.test.js b/core/command/__tests__/command.test.js index 063ca2ba9c9..3e7998f1c04 100644 --- a/core/command/__tests__/command.test.js +++ b/core/command/__tests__/command.test.js @@ -388,6 +388,23 @@ describe("core-command", () => { ); }); + it("throws ENOVERSION when no version property exists in lerna.json", async () => { + const cwd = await initFixture("basic"); + + const lernaConfigPath = path.join(cwd, "lerna.json"); + const lernaConfig = await fs.readJson(lernaConfigPath); + delete lernaConfig.version; + await fs.writeJson(lernaConfigPath, { + ...lernaConfig, + }); + + await expect(testFactory({ cwd })).rejects.toThrow( + expect.objectContaining({ + prefix: "ENOVERSION", + }) + ); + }); + it("throws ENOWORKSPACES when npm client is pnpm and useWorkspaces is not true", async () => { const cwd = await initFixture("pnpm"); diff --git a/core/command/index.js b/core/command/index.js index e74f4198305..399b883455f 100644 --- a/core/command/index.js +++ b/core/command/index.js @@ -240,10 +240,14 @@ class Command { throw new ValidationError("ENOPKG", "`package.json` does not exist, have you run `lerna init`?"); } - if (!this.project.version) { + if (this.project.configNotFound) { throw new ValidationError("ENOLERNA", "`lerna.json` does not exist, have you run `lerna init`?"); } + if (!this.project.version) { + throw new ValidationError("ENOVERSION", "Required property version does not exist in `lerna.json`"); + } + if (this.options.independent && !this.project.isIndependent()) { throw new ValidationError( "EVERSIONMODE", diff --git a/core/project/index.js b/core/project/index.js index 4448b7bb269..99f1119993f 100644 --- a/core/project/index.js +++ b/core/project/index.js @@ -62,6 +62,7 @@ class Project { transform(obj) { // cosmiconfig returns null when nothing is found if (!obj) { + this.configNotFound = true; return { // No need to distinguish between missing and empty, // saves a lot of noisy guards elsewhere