Skip to content
Draft
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
28 changes: 12 additions & 16 deletions src/commands/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ export default createCommand(config, async ({ values }) => {
`Repository "${repo}" has no starter models. Use a repository created from the starter in the Prismic dashboard.`,
);
}
await removeStarterDocuments(connectedRepository.starter);
await cleanupStarterProject(connectedRepository.starter);
}

const hasStarterModelChanges =
Expand Down Expand Up @@ -299,30 +299,16 @@ async function isStarterPackage(starter: NonNullable<Repository["starter"]>): Pr
return Boolean(starterPackageName && packageJson.name === starterPackageName);
}

async function removeStarterDocuments(starter: NonNullable<Repository["starter"]>): Promise<void> {
if (!(await isStarterPackage(starter))) {
console.warn(
"Starter seed documents were not removed because the local package does not match the repository starter.",
);
return;
}

const projectRoot = await findProjectRoot();
await rm(new URL("documents/", projectRoot), { recursive: true, force: true });
}

async function completeStarterHandoff(
adapter: Adapter,
starter: NonNullable<Repository["starter"]>,
config: { repo: string; token: string | undefined; host: string },
): Promise<void> {
try {
const hostedPreviewURL = new URL(adapter.localPreviewConfig.resolverPath, starter.deploymentUrl)
.href;
const previews = await getPreviews(config);
await Promise.all(
previews
.filter((preview) => preview.url === hostedPreviewURL)
.filter((preview) => preview.label === "Starter Preview")
.map((preview) => removePreview(preview.id, config)),
);
const hasDevelopmentPreview = previews.some(
Expand Down Expand Up @@ -353,3 +339,13 @@ async function completeStarterHandoff(
await updatePackageJsonName(config.repo);
}
}

async function cleanupStarterProject(starter: NonNullable<Repository["starter"]>): Promise<void> {
if (!(await isStarterPackage(starter))) return;

const projectRoot = await findProjectRoot();
await Promise.all([
rm(new URL(".deployment", projectRoot), { recursive: true, force: true }),
rm(new URL("documents", projectRoot), { recursive: true, force: true }),
]);
}
13 changes: 9 additions & 4 deletions test/init.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@
);

const { stderr, exitCode } = await prismic("init", ["--repo", repo, "--no-setup"]);
expect(exitCode, stderr).toBe(0);

Check failure on line 133 in test/init.test.ts

View workflow job for this annotation

GitHub Actions / test (Node.js 20)

[tests] test/init.test.ts > reconnects an existing project with --repo

AssertionError: Failed to load your profile Prismic responded with an unexpected error. Try again, and report it if it keeps happening. Status: 500 Internal Server Error URL: https://user-service.prismic.io/profile Report: https://github.com/prismicio/cli/issues : expected 1 to be +0 // Object.is equality - Expected + Received - 0 + 1 ❯ test/init.test.ts:133:27

Check failure on line 133 in test/init.test.ts

View workflow job for this annotation

GitHub Actions / test (Node.js 20)

[tests] test/init.test.ts > reconnects an existing project with --repo

AssertionError: Failed to load your profile Prismic responded with an unexpected error. Try again, and report it if it keeps happening. Status: 500 Internal Server Error URL: https://user-service.prismic.io/profile Report: https://github.com/prismicio/cli/issues : expected 1 to be +0 // Object.is equality - Expected + Received - 0 + 1 ❯ test/init.test.ts:133:27

Check failure on line 133 in test/init.test.ts

View workflow job for this annotation

GitHub Actions / test (Node.js 20)

[tests] test/init.test.ts > reconnects an existing project with --repo

AssertionError: Failed to load your profile Prismic responded with an unexpected error. Try again, and report it if it keeps happening. Status: 500 Internal Server Error URL: https://user-service.prismic.io/profile Report: https://github.com/prismicio/cli/issues : expected 1 to be +0 // Object.is equality - Expected + Received - 0 + 1 ❯ test/init.test.ts:133:27

const config = JSON.parse(await readFile(new URL("prismic.config.json", project), "utf-8"));
expect(config).toMatchObject({
Expand Down Expand Up @@ -315,6 +315,8 @@
);
await mkdir(new URL("documents/", project), { recursive: true });
await writeFile(new URL("documents/homepage.json", project), "{}");
await mkdir(new URL(".deployment/foo/", project), { recursive: true });
await writeFile(new URL(".deployment/foo/bar", project), "test");

const { stderr, exitCode } = await prismic("init", ["--repo", repo, "--no-setup"]);
expect(exitCode, stderr).toBe(0);
Expand All @@ -325,14 +327,15 @@
const packageJson = JSON.parse(await readFile(new URL("package.json", project), "utf-8"));
expect(packageJson.name).toBe(repo);

// Seed documents are removed.
// Starter artifacts are removed.
await expect(access(new URL("documents/", project))).rejects.toThrow();
await expect(access(new URL(".deployment/", project))).rejects.toThrow();

// The hosted preview is replaced by the local Development preview.
const previews = await getPreviews({ repo, token, host });
const previewLabels = previews.map((preview) => preview.label);
expect(previewLabels).toContain("Development");
expect(previewLabels).not.toContain("Production");
expect(previewLabels).not.toContain("Starter Preview");

const repository = await getRepository({ repo, token, host });
expect(repository.simulatorUrl).toBe("http://localhost:3000/slice-simulator");
Expand All @@ -344,7 +347,7 @@
}
}, 120_000);

it("keeps seed documents when the local package does not match the starter", async ({
it("keeps starter artifacts when the local package does not match the starter", async ({
expect,
project,
prismic,
Expand All @@ -357,12 +360,14 @@
// The fixture package.json has no name, so it cannot match the starter.
await mkdir(new URL("documents/", project), { recursive: true });
await writeFile(new URL("documents/homepage.json", project), "{}");
await mkdir(new URL(".deployment/foo/", project), { recursive: true });
await writeFile(new URL(".deployment/foo/bar", project), "test");

const { stderr, exitCode } = await prismic("init", ["--repo", repo, "--no-setup"]);
expect(exitCode, stderr).toBe(0);
expect(stderr).toContain("Starter seed documents were not removed");

await expect(access(new URL("documents/", project))).resolves.toBeUndefined();
await expect(access(new URL(".deployment/", project))).resolves.toBeUndefined();
} finally {
await deleteRepository(repo, { token, password, host });
}
Expand Down
Loading