Skip to content
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
15 changes: 1 addition & 14 deletions src/adapters/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { readFile, rm } from "node:fs/promises";
import { createRequire } from "node:module";
import { sep } from "node:path";
import { fileURLToPath, pathToFileURL } from "node:url";

Expand All @@ -19,7 +18,7 @@ import {
writeFileRecursive,
} from "../lib/file";
import { stringify } from "../lib/json";
import { findPackageJson, readPackageJson } from "../lib/packageJson";
import { readPackageJson } from "../lib/packageJson";
import {
addPreview,
getPreviews,
Expand Down Expand Up @@ -138,18 +137,6 @@ export async function getJsFileExtension(): Promise<string> {
return (await checkIsTypeScriptProject()) ? "ts" : "js";
}

export async function getInstalledMajor(packageName: string): Promise<number> {
const require = createRequire(await findPackageJson());
try {
const { version } = require(`${packageName}/package.json`);
const major = Number.parseInt(version.split(".")[0]);
return Number.isNaN(major) ? Infinity : major;
} catch {
// Not installed yet, so assume the newest major.
return Infinity;
}
}

export abstract class Adapter {
abstract readonly id: string;
abstract readonly environmentEnvVarName: string;
Expand Down
6 changes: 3 additions & 3 deletions src/adapters/nextjs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,12 @@ import { pascalCase } from "change-case";
import {
Adapter,
checkSourceContains,
getInstalledMajor,
getJsFileExtension,
type PageFile,
writeFileIfMissing,
} from ".";
import { exists, writeFileRecursive } from "../lib/file";
import { addDependencies, getNpmPackageVersion } from "../lib/packageJson";
import { addDependencies, getInstalledMajor, getNpmPackageVersion } from "../lib/packageJson";
import { dedent, formatObjectKey } from "../lib/string";
import { checkIsTypeScriptProject, findProjectRoot } from "../project";
import {
Expand Down Expand Up @@ -48,6 +47,7 @@ export class NextJsAdapter extends Adapter {
const extension = await getJsFileExtension();
const typescript = await checkIsTypeScriptProject();
const appRouter = await checkUsesAppRouter();
const supportsCacheLife = (await getInstalledMajor("next")) >= 16;

await writeFileIfMissing(
new URL(`prismicio.${extension}`, sourceRoot),
Expand Down Expand Up @@ -81,7 +81,7 @@ export class NextJsAdapter extends Adapter {
if (appRouter) {
await writeFileIfMissing(
new URL(`app/api/revalidate/route.${extension}`, sourceRoot),
revalidateRouteTemplate({ supportsCacheLife: (await getInstalledMajor("next")) >= 16 }),
revalidateRouteTemplate({ supportsCacheLife }),
);
}
}
Expand Down
15 changes: 15 additions & 0 deletions src/lib/packageJson.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { readFile, writeFile } from "node:fs/promises";
import { createRequire } from "node:module";
import { fileURLToPath } from "node:url";

import detectIndent from "detect-indent";
Expand Down Expand Up @@ -59,6 +60,20 @@ export async function addDependencies(dependencies: Record<string, string>): Pro
});
}

export async function getInstalledMajor(packageName: string): Promise<number> {
const require = createRequire(await findPackageJson());
try {
const { version } = require(`${packageName}/package.json`);
const major = Number.parseInt(version.split(".")[0]);
return Number.isNaN(major) ? Infinity : major;
} catch {
const { dependencies, devDependencies, peerDependencies } = await readPackageJson();
const range = { ...peerDependencies, ...dependencies, ...devDependencies }[packageName] ?? "";
const major = /^[\^~]?(\d+)/.exec(range)?.[1];
return major ? Number(major) : Infinity;
}
}

// Returns the packages whose major version changed between two reads of package.json.
export function getMajorDependencyUpdates(
before: PackageJson,
Expand Down
19 changes: 19 additions & 0 deletions test/gen-setup.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,25 @@ it("works when Next.js is declared but not installed", async ({ expect, project,
await expect(project).toHaveFile("app/api/revalidate/route.js");
});

it("generates a Next.js 15 revalidate route before Next.js is installed", async ({
expect,
project,
prismic,
}) => {
await rm(new URL("node_modules/next/", project), { recursive: true });
await writeFile(
new URL("package.json", project),
JSON.stringify({ dependencies: { next: "^15.0.0" } }),
);

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

await expect(project).toHaveFile("app/api/revalidate/route.js", {
contains: 'revalidateTag("prismic");',
});
});

it(
"prints SvelteKit instructions when the project already has a root layout",
{ timeout: 30_000 },
Expand Down
Loading