Skip to content

feat: allowed hydration directory to be empty #673

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions src/hydrate/steps/writing/creation/writePackageJson.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import { describe, expect, it, vi } from "vitest";

import { writePackageJson } from "./writePackageJson.js";

const mockReadFileAsJson = vi.fn();
const mockReadFileSafeAsJson = vi.fn();

vi.mock("../../../../shared/readFileAsJson.js", () => ({
get readFileAsJson() {
return mockReadFileAsJson;
vi.mock("../../../../shared/readFileSafeAsJson.js", () => ({
get readFileSafeAsJson() {
return mockReadFileSafeAsJson;
},
}));

Expand All @@ -23,7 +23,7 @@ const values = {
describe("writePackageJson", () => {
it("preserves existing dependencies when they exist", async () => {
const dependencies = { abc: "1.2.3" };
mockReadFileAsJson.mockResolvedValue({ dependencies });
mockReadFileSafeAsJson.mockResolvedValue({ dependencies });

const packageJson = await writePackageJson(values);

Expand All @@ -34,7 +34,7 @@ describe("writePackageJson", () => {

it("preserves existing devDependencies that aren't known to be unnecessary when they exist", async () => {
const devDependencies = { abc: "1.2.3", jest: "4.5.6" };
mockReadFileAsJson.mockResolvedValue({ devDependencies });
mockReadFileSafeAsJson.mockResolvedValue({ devDependencies });

const packageJson = await writePackageJson(values);

Expand All @@ -44,7 +44,7 @@ describe("writePackageJson", () => {
});

it("includes a release script when releases is true", async () => {
mockReadFileAsJson.mockResolvedValue({});
mockReadFileSafeAsJson.mockResolvedValue({});

const packageJson = await writePackageJson({
...values,
Expand All @@ -61,7 +61,7 @@ describe("writePackageJson", () => {
});

it("includes a test script when unitTests is true", async () => {
mockReadFileAsJson.mockResolvedValue({});
mockReadFileSafeAsJson.mockResolvedValue({});

const packageJson = await writePackageJson({
...values,
Expand Down
7 changes: 3 additions & 4 deletions src/hydrate/steps/writing/creation/writePackageJson.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { readFileAsJson } from "../../../../shared/readFileAsJson.js";
import { readFileSafeAsJson } from "../../../../shared/readFileSafeAsJson.js";
import { HydrationInputValues } from "../../../values/types.js";
import { formatJson } from "./formatters/formatJson.js";

Expand Down Expand Up @@ -41,9 +41,8 @@ export async function writePackageJson({
| "repository"
| "unitTests"
>) {
const existingPackageJson = (await readFileAsJson(
"./package.json",
)) as object;
const existingPackageJson =
((await readFileSafeAsJson("./package.json")) as null | object) ?? {};

return await formatJson({
// To start, copy over all existing package fields (e.g. "dependencies")
Expand Down
43 changes: 43 additions & 0 deletions src/shared/ensureGitRepository.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import chalk from "chalk";
import { describe, expect, it, vi } from "vitest";

import { ensureGitRepository } from "./ensureGitRepository.js";

const mock$ = vi.fn();

vi.mock("execa", () => ({
get $() {
return mock$;
},
}));

const mockLogLine = vi.fn();

vi.mock("./cli/lines.js", () => ({
get logLine() {
return mockLogLine;
},
}));

describe("ensureGitRepository", () => {
it("does not run git init when git status succeeds", async () => {
mock$.mockResolvedValue(0);

await ensureGitRepository();

expect(mock$).toHaveBeenCalledTimes(1);
expect(mockLogLine).not.toHaveBeenCalled();
});

it("runs git init when git status fails", async () => {
mock$.mockRejectedValueOnce(1);

await ensureGitRepository();

expect(mock$).toHaveBeenCalledWith(["git init"]);
expect(mockLogLine).toHaveBeenCalledWith();
expect(mockLogLine).toHaveBeenCalledWith(
chalk.gray("Running `git init` to turn this into a Git repository."),
);
});
});
17 changes: 17 additions & 0 deletions src/shared/ensureGitRepository.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import chalk from "chalk";
import { $ } from "execa";

import { logLine } from "./cli/lines.js";

export async function ensureGitRepository() {
try {
await $`git status`;
} catch {
logLine();
logLine(
chalk.gray("Running `git init` to turn this into a Git repository."),
);

await $`git init`;
}
}
2 changes: 1 addition & 1 deletion src/shared/getDefaultSettings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export async function getDefaultSettings() {
logLine();
logLine(
chalk.gray(
"Could not populate default owner and repository. Did not detect a Git repository with an origin. ",
"Could not populate default owner and repository. Did not detect an 'origin' remote.",
),
);

Expand Down
5 changes: 4 additions & 1 deletion src/shared/runOrRestore.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ describe("runOrRestore", () => {

expect(actual).toEqual(1);

expect(mock$).not.toHaveBeenCalled();
expect(mock$).toHaveBeenCalledWith(["git status"]);
expect(mock$).toHaveBeenCalledTimes(1);
});

it("returns 1 and restores the repository when run rejects, skipRestore is false, and shouldRestore is confirmed", async () => {
Expand All @@ -87,6 +88,8 @@ describe("runOrRestore", () => {

expect(actual).toEqual(1);

expect(mock$).toHaveBeenCalledWith(["git status"]);
expect(mock$).toHaveBeenCalledWith(["git restore ."]);
expect(mock$).toHaveBeenCalledTimes(2);
});
});
3 changes: 3 additions & 0 deletions src/shared/runOrRestore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import * as prompts from "@clack/prompts";
import chalk from "chalk";
import { $ } from "execa";

import { ensureGitRepository } from "./ensureGitRepository.js";
import {
GetterDefaultInputValues,
InputValuesAndOctokit,
Expand Down Expand Up @@ -39,6 +40,8 @@ export async function runOrRestore({
),
);

await ensureGitRepository();

const { octokit, values } = await getInputValuesAndOctokit(args, defaults);

skipRestore = values.skipRestore;
Expand Down