diff --git a/packages/create-payload-app/src/lib/init-next.ts b/packages/create-payload-app/src/lib/init-next.ts index a6387b876..60c17adce 100644 --- a/packages/create-payload-app/src/lib/init-next.ts +++ b/packages/create-payload-app/src/lib/init-next.ts @@ -6,30 +6,42 @@ import type { CliArgs } from '../types' import { copyRecursiveSync } from '../utils/copy-recursive-sync' -export async function initNext(args: CliArgs): Promise { - const { '--debug': debug } = args - const projectDir = process.cwd() +export async function initNext( + args: Pick & { nextDir?: string; useDistFiles?: boolean }, +): Promise<{ success: boolean }> { + const { '--debug': debug, nextDir, useDistFiles } = args + let projectDir = process.cwd() + if (nextDir) { + projectDir = path.resolve(projectDir, nextDir) + console.log(`Overriding project directory to ${projectDir}`) + } - const foundConfig = (await globby('next.config.*js', { cwd: process.cwd() }))?.[0] + if (!fs.existsSync(projectDir)) { + console.log(`Could not find specified project directory at ${projectDir}`) + return { success: false } + } + + const foundConfig = (await globby('next.config.*js', { cwd: projectDir }))?.[0] const nextConfigPath = path.resolve(projectDir, foundConfig) if (!fs.existsSync(nextConfigPath)) { console.log( `No next.config.js found at ${nextConfigPath}. Ensure you are in a Next.js project directory.`, ) - process.exit(1) + return { success: false } } else { if (debug) console.log(`Found Next config at ${nextConfigPath}`) } - const templateFilesPath = __dirname.endsWith('dist') - ? path.resolve(__dirname, '../..', 'dist/app') - : path.resolve(__dirname, '../../../next/src/app') + const templateFilesPath = + __dirname.endsWith('dist') || useDistFiles + ? path.resolve(__dirname, '../..', 'dist/app') + : path.resolve(__dirname, '../../../next/src/app') console.log(`Using template files from: ${templateFilesPath}`) if (!fs.existsSync(templateFilesPath)) { console.log(`Could not find template source files from ${templateFilesPath}`) - process.exit(1) + return { success: false } } else { console.log('Found template source files') } @@ -37,11 +49,11 @@ export async function initNext(args: CliArgs): Promise { const userAppDir = path.resolve(projectDir, 'src/app') if (!fs.existsSync(userAppDir)) { console.log(`Could not find user app directory at ${userAppDir}`) - process.exit(1) + return { success: false } } else { if (debug) console.log(`Found user app directory: ${userAppDir}`) } copyRecursiveSync(templateFilesPath, userAppDir, debug) - process.exit(0) + return { success: true } } diff --git a/packages/create-payload-app/src/main.ts b/packages/create-payload-app/src/main.ts index 96bc9bb44..05459c58f 100644 --- a/packages/create-payload-app/src/main.ts +++ b/packages/create-payload-app/src/main.ts @@ -60,8 +60,8 @@ export class Main { } if (this.args['--init-next']) { - await initNext(this.args) - process.exit(0) + const result = await initNext(this.args) + process.exit(result.success ? 0 : 1) } const templateArg = this.args['--template'] diff --git a/test/create-payload-app/.gitignore b/test/create-payload-app/.gitignore new file mode 100644 index 000000000..c9748c226 --- /dev/null +++ b/test/create-payload-app/.gitignore @@ -0,0 +1 @@ +test-app diff --git a/test/create-payload-app/int.spec.ts b/test/create-payload-app/int.spec.ts new file mode 100644 index 000000000..b4ea0a105 --- /dev/null +++ b/test/create-payload-app/int.spec.ts @@ -0,0 +1,48 @@ +import fs from 'fs' +import path from 'path' +import shelljs from 'shelljs' + +import { initNext } from '../../packages/create-payload-app/src/lib/init-next' + +describe('create-payload-app', () => { + describe('--init-next', () => { + const nextDir = path.resolve(__dirname, 'test-app') + + beforeAll(() => { + if (fs.existsSync(nextDir)) { + fs.rmdirSync(nextDir, { recursive: true }) + } + + // Create dir for Next.js project + if (!fs.existsSync(nextDir)) { + fs.mkdirSync(nextDir) + } + + // Create a new Next.js project with default options + shelljs.exec( + 'pnpm create next-app@latest . --typescript --eslint --no-tailwind --app --import-alias="@/*" --src-dir', + { cwd: nextDir }, + ) + }) + + afterAll(() => { + if (fs.existsSync(nextDir)) { + fs.rmdirSync(nextDir, { recursive: true }) + } + }) + + it('should install payload app in Next.js project', async () => { + expect(fs.existsSync(nextDir)).toBe(true) + + const result = await initNext({ + '--debug': true, + nextDir, + useDistFiles: true, // create-payload-app must be built + }) + + expect(result.success).toBe(true) + const payloadFilesPath = path.resolve(nextDir, 'src/app/(payload)') + expect(fs.existsSync(payloadFilesPath)).toBe(true) + }) + }) +})