Skip to content

Commit

Permalink
Fixed an issue with not being able to reenter exited pre mode (#713)
Browse files Browse the repository at this point in the history
* Fixed an issue with pre mode needs to be re-enterable after exiting, close #712

* small tweaks

* Update .changeset/afraid-dots-know.md

Co-authored-by: Mateusz Burzy艅ski <mateuszburzynski@gmail.com>
  • Loading branch information
zthxxx and Andarist committed Dec 17, 2021
1 parent 7ee263b commit 82be80e
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 4 deletions.
6 changes: 6 additions & 0 deletions .changeset/afraid-dots-know.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@changesets/cli": patch
"@changesets/pre": patch
---

Fixed an issue with not being able to reenter exited pre mode.
2 changes: 2 additions & 0 deletions .changeset/thirty-panthers-film.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
---
28 changes: 28 additions & 0 deletions packages/cli/src/commands/pre/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@ let preStateForSimpleProject: PreState = {
tag: "next"
};

let preStateForExited: PreState = {
changesets: ["slimy-dingos-whisper"],
initialVersions: {
"pkg-a": "1.0.0",
"pkg-b": "1.0.0"
},
mode: "exit",
tag: "beta"
};

jest.mock("@changesets/logger");

let mockedLogger = logger as jest.Mocked<typeof logger>;
Expand Down Expand Up @@ -52,6 +62,24 @@ describe("enterPre", () => {
"If you're trying to exit pre mode, run `changeset pre exit`"
);
});
it("should enter if already exited pre mode", async () => {
let cwd = f.copy("simple-project");
await fs.writeJSON(
path.join(cwd, ".changeset", "pre.json"),
preStateForExited
);
await pre(cwd, { command: "enter", tag: "next" });
expect(await fs.readJson(path.join(cwd, ".changeset", "pre.json"))).toEqual(
{
...preStateForExited,
mode: "pre",
tag: "next"
}
);
expect(mockedLogger.success).toBeCalledWith(
`Entered pre mode with tag ${chalk.cyan("next")}`
);
});
});

describe("exitPre", () => {
Expand Down
25 changes: 25 additions & 0 deletions packages/pre/src/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@ let preStateForSimpleProject: PreState = {
tag: "next"
};

let preStateForExited: PreState = {
changesets: ["slimy-dingos-whisper"],
initialVersions: {
"pkg-a": "1.0.0",
"pkg-b": "1.0.0"
},
mode: "exit",
tag: "beta"
};

describe("enterPre", () => {
it("should enter", async () => {
let cwd = f.copy("simple-project");
Expand All @@ -39,6 +49,21 @@ describe("enterPre", () => {
PreEnterButInPreModeError
);
});
it("should enter if already exited pre mode", async () => {
let cwd = f.copy("simple-project");
await fs.writeJSON(
path.join(cwd, ".changeset", "pre.json"),
preStateForExited
);
await enterPre(cwd, "next");
expect(await fs.readJson(path.join(cwd, ".changeset", "pre.json"))).toEqual(
{
...preStateForExited,
mode: "pre",
tag: "next"
}
);
});
});

describe("exitPre", () => {
Expand Down
8 changes: 4 additions & 4 deletions packages/pre/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,16 @@ export async function exitPre(cwd: string) {
export async function enterPre(cwd: string, tag: string) {
let packages = await getPackages(cwd);
let preStatePath = path.resolve(packages.root.dir, ".changeset", "pre.json");
// TODO: verify that the pre state isn't broken
let preState = await readPreState(packages.root.dir);
if (preState !== undefined) {
let preState: PreState | undefined = await readPreState(packages.root.dir);
// can't reenter if pre mode still exists, but we should allow exited pre mode to be reentered
if (preState?.mode === "pre") {
throw new PreEnterButInPreModeError();
}
let newPreState: PreState = {
mode: "pre",
tag,
initialVersions: {},
changesets: []
changesets: preState?.changesets ?? []
};
for (let pkg of packages.packages) {
newPreState.initialVersions[pkg.packageJson.name] = pkg.packageJson.version;
Expand Down

0 comments on commit 82be80e

Please sign in to comment.