Fix for the init CLI for next.js projects that use the src directory
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@trigger.dev/init": patch
|
||||
---
|
||||
|
||||
Fix for Next.js projects using the src dir
|
||||
@@ -65,14 +65,23 @@ const main = async () => {
|
||||
resolvedPath,
|
||||
cliResults
|
||||
);
|
||||
|
||||
logger.success(`✅ Setup environment variables ${addedEnvVars.join(", ")}`);
|
||||
|
||||
const nextJsDir = await detectPagesOrAppDir(resolvedPath);
|
||||
const usesSrcDir = await detectUseOfSrcDir(resolvedPath);
|
||||
|
||||
if (usesSrcDir) {
|
||||
logger.info("📁 Detected use of src directory");
|
||||
}
|
||||
|
||||
const nextJsDir = await detectPagesOrAppDir(resolvedPath, usesSrcDir);
|
||||
|
||||
const routeDir = pathModule.join(resolvedPath, usesSrcDir ? "src" : "");
|
||||
|
||||
if (nextJsDir === "pages") {
|
||||
await createTriggerPageRoute(resolvedPath, cliResults);
|
||||
await createTriggerPageRoute(routeDir, cliResults, usesSrcDir);
|
||||
} else {
|
||||
await createTriggerAppRoute(resolvedPath, cliResults);
|
||||
await createTriggerAppRoute(routeDir, cliResults, usesSrcDir);
|
||||
}
|
||||
|
||||
const api = new TriggerApi(apiKey, cliResults.flags.triggerUrl);
|
||||
@@ -144,20 +153,55 @@ async function detectTypescriptProject(path: string): Promise<boolean> {
|
||||
}
|
||||
}
|
||||
|
||||
async function detectUseOfSrcDir(path: string): Promise<boolean> {
|
||||
// Detects if the project is using a src directory
|
||||
try {
|
||||
await fs.access(pathModule.join(path, "src"));
|
||||
return true;
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Detect the use of pages or app dir in the Next.js project
|
||||
// Import the next.config.js file and check for experimental: { appDir: true }
|
||||
async function detectPagesOrAppDir(path: string): Promise<"pages" | "app"> {
|
||||
async function detectPagesOrAppDir(
|
||||
path: string,
|
||||
usesSrcDir = false
|
||||
): Promise<"pages" | "app"> {
|
||||
const nextConfigPath = pathModule.join(path, "next.config.js");
|
||||
const importedConfig = await import(nextConfigPath);
|
||||
|
||||
if (importedConfig?.default?.experimental?.appDir) {
|
||||
return "app";
|
||||
} else {
|
||||
// We need to check if src/app/page.tsx exists
|
||||
// Or app/page.tsx exists
|
||||
// If so then we return app
|
||||
// If not return pages
|
||||
|
||||
const appPagePath = pathModule.join(
|
||||
path,
|
||||
usesSrcDir ? "src" : "",
|
||||
"app",
|
||||
"page.tsx"
|
||||
);
|
||||
|
||||
const appPageExists = await pathExists(appPagePath);
|
||||
|
||||
if (appPageExists) {
|
||||
return "app";
|
||||
}
|
||||
|
||||
return "pages";
|
||||
}
|
||||
}
|
||||
|
||||
async function createTriggerPageRoute(path: string, cliResults: CliResults) {
|
||||
async function createTriggerPageRoute(
|
||||
path: string,
|
||||
cliResults: CliResults,
|
||||
usesSrcDir = false
|
||||
) {
|
||||
const routeContent = `
|
||||
import { Job, TriggerClient, eventTrigger } from "@trigger.dev/sdk";
|
||||
import { createPagesRoute } from "@trigger.dev/nextjs";
|
||||
@@ -203,10 +247,16 @@ export default handler;
|
||||
}
|
||||
|
||||
await fs.writeFile(pathModule.join(directories, "trigger.ts"), routeContent);
|
||||
logger.success("✅ Create pages route at /pages/api/trigger.ts");
|
||||
logger.success(
|
||||
`✅ Created pages route at ${usesSrcDir ? "src/" : ""}pages/api/trigger.ts`
|
||||
);
|
||||
}
|
||||
|
||||
async function createTriggerAppRoute(path: string, cliResults: CliResults) {
|
||||
async function createTriggerAppRoute(
|
||||
path: string,
|
||||
cliResults: CliResults,
|
||||
usesSrcDir = false
|
||||
) {
|
||||
const routeContent = `
|
||||
import { Job, TriggerClient, eventTrigger } from "@trigger.dev/sdk";
|
||||
import { createAppRoute } from "@trigger.dev/nextjs";
|
||||
@@ -250,7 +300,9 @@ export const { POST, dynamic } = createAppRoute(client, {
|
||||
}
|
||||
|
||||
await fs.writeFile(pathModule.join(directories, "route.ts"), routeContent);
|
||||
logger.success("✅ Create app route at /app/api/trigger/route.ts");
|
||||
logger.success(
|
||||
`✅ Created app route at ${usesSrcDir ? "src/" : ""}app/api/trigger.ts`
|
||||
);
|
||||
}
|
||||
|
||||
type EnvironmentVariable = "TRIGGER_API_KEY" | "TRIGGER_API_URL" | "VERCEL_URL";
|
||||
|
||||
Generated
+5
-5
@@ -583,8 +583,8 @@ importers:
|
||||
'@octokit/types': ^9.2.3
|
||||
'@octokit/webhooks': ^10.4.0
|
||||
'@octokit/webhooks-types': ^6.10.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.0.0-next.1
|
||||
'@trigger.dev/sdk': workspace:^2.0.0-next.1
|
||||
'@trigger.dev/integration-kit': workspace:^2.0.0-next.2
|
||||
'@trigger.dev/sdk': workspace:^2.0.0-next.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/node': '18'
|
||||
octokit: ^2.0.14
|
||||
@@ -609,8 +609,8 @@ importers:
|
||||
|
||||
integrations/openai:
|
||||
specifiers:
|
||||
'@trigger.dev/integration-kit': workspace:^2.0.0-next.1
|
||||
'@trigger.dev/sdk': workspace:^2.0.0-next.0
|
||||
'@trigger.dev/integration-kit': workspace:^2.0.0-next.2
|
||||
'@trigger.dev/sdk': workspace:^2.0.0-next.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/node': '18'
|
||||
openai: ^3.3.0
|
||||
@@ -631,7 +631,7 @@ importers:
|
||||
integrations/slack:
|
||||
specifiers:
|
||||
'@slack/web-api': ^6.8.1
|
||||
'@trigger.dev/sdk': workspace:^2.0.0-next.0
|
||||
'@trigger.dev/sdk': workspace:^2.0.0-next.2
|
||||
'@trigger.dev/tsconfig': workspace:*
|
||||
'@types/node': '18'
|
||||
rimraf: ^3.0.2
|
||||
|
||||
Reference in New Issue
Block a user