From c0e2b6ac4d8bc07fdca4093854ca5b74373dbb3e Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Tue, 27 Feb 2024 14:59:40 -0500 Subject: [PATCH] chore(create-payload-app): add --init-next --- packages/create-payload-app/package.json | 6 ++- .../create-payload-app/src/lib/init-next.ts | 47 +++++++++++++++++++ packages/create-payload-app/src/main.ts | 11 +++++ packages/create-payload-app/src/types.ts | 5 ++ .../src/utils/copy-recursive-sync.ts | 21 +++++++++ pnpm-lock.yaml | 3 ++ 6 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 packages/create-payload-app/src/lib/init-next.ts create mode 100644 packages/create-payload-app/src/utils/copy-recursive-sync.ts diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index 8a7e6b48a..44ae253a7 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -6,8 +6,9 @@ "create-payload-app": "bin/cli.js" }, "scripts": { - "build": "pnpm build:swc", - "build:swc": "swc ./src -d ./dist --config-file .swcrc", + "build": "pnpm copyfiles && pnpm build:swc", + "copyfiles": "copyfiles -u 4 \"../next/src/app/(payload)/**\" \"dist/app\"", + "build:swc": "pnpm copyfiles && swc ./src -d ./dist --config-file .swcrc", "clean": "rimraf {dist,*.tsbuildinfo}", "test": "jest", "prepublishOnly": "pnpm test && pnpm clean && pnpm build" @@ -26,6 +27,7 @@ "execa": "^5.0.0", "figures": "^3.2.0", "fs-extra": "^9.0.1", + "globby": "11.1.0", "handlebars": "^4.7.7", "ora": "^5.1.0", "prompts": "^2.4.2", diff --git a/packages/create-payload-app/src/lib/init-next.ts b/packages/create-payload-app/src/lib/init-next.ts new file mode 100644 index 000000000..a6387b876 --- /dev/null +++ b/packages/create-payload-app/src/lib/init-next.ts @@ -0,0 +1,47 @@ +import fs from 'fs' +import globby from 'globby' +import path from 'path' + +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() + + const foundConfig = (await globby('next.config.*js', { cwd: process.cwd() }))?.[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) + } 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') + + console.log(`Using template files from: ${templateFilesPath}`) + + if (!fs.existsSync(templateFilesPath)) { + console.log(`Could not find template source files from ${templateFilesPath}`) + process.exit(1) + } else { + console.log('Found template source files') + } + + const userAppDir = path.resolve(projectDir, 'src/app') + if (!fs.existsSync(userAppDir)) { + console.log(`Could not find user app directory at ${userAppDir}`) + process.exit(1) + } else { + if (debug) console.log(`Found user app directory: ${userAppDir}`) + } + + copyRecursiveSync(templateFilesPath, userAppDir, debug) + process.exit(0) +} diff --git a/packages/create-payload-app/src/main.ts b/packages/create-payload-app/src/main.ts index 1a37afe83..96bc9bb44 100644 --- a/packages/create-payload-app/src/main.ts +++ b/packages/create-payload-app/src/main.ts @@ -6,6 +6,7 @@ import type { CliArgs, PackageManager } from './types' import { createProject } from './lib/create-project' import { generateSecret } from './lib/generate-secret' +import { initNext } from './lib/init-next' import { parseProjectName } from './lib/parse-project-name' import { parseTemplate } from './lib/parse-template' import { selectDb } from './lib/select-db' @@ -27,6 +28,9 @@ export class Main { '--secret': String, '--template': String, + // Next.js + '--init-next': Boolean, + // Package manager '--no-deps': Boolean, '--use-npm': Boolean, @@ -35,6 +39,7 @@ export class Main { // Flags '--beta': Boolean, + '--debug': Boolean, '--dry-run': Boolean, // Aliases @@ -53,6 +58,12 @@ export class Main { console.log(helpMessage()) process.exit(0) } + + if (this.args['--init-next']) { + await initNext(this.args) + process.exit(0) + } + const templateArg = this.args['--template'] if (templateArg) { const valid = validateTemplate(templateArg) diff --git a/packages/create-payload-app/src/types.ts b/packages/create-payload-app/src/types.ts index c981e18fb..7de379bef 100644 --- a/packages/create-payload-app/src/types.ts +++ b/packages/create-payload-app/src/types.ts @@ -3,8 +3,10 @@ import type arg from 'arg' export interface Args extends arg.Spec { '--beta': BooleanConstructor '--db': StringConstructor + '--debug': BooleanConstructor '--dry-run': BooleanConstructor '--help': BooleanConstructor + '--init-next': BooleanConstructor '--name': StringConstructor '--no-deps': BooleanConstructor '--secret': StringConstructor @@ -12,6 +14,9 @@ export interface Args extends arg.Spec { '--use-npm': BooleanConstructor '--use-pnpm': BooleanConstructor '--use-yarn': BooleanConstructor + + // Aliases + '-h': string '-n': string '-t': string diff --git a/packages/create-payload-app/src/utils/copy-recursive-sync.ts b/packages/create-payload-app/src/utils/copy-recursive-sync.ts new file mode 100644 index 000000000..dc1d6f8f9 --- /dev/null +++ b/packages/create-payload-app/src/utils/copy-recursive-sync.ts @@ -0,0 +1,21 @@ +import fs from 'fs' +import path from 'path' + +/** + * Recursively copy files from src to dest + */ +export function copyRecursiveSync(src: string, dest: string, debug?: boolean) { + const exists = fs.existsSync(src) + const stats = exists && fs.statSync(src) + const isDirectory = exists && stats.isDirectory() + if (isDirectory) { + fs.mkdirSync(dest, { recursive: true }) + fs.readdirSync(src).forEach((childItemName) => { + if (debug) console.log(`Copying: ${src}/${childItemName} -> ${dest}/${childItemName}`) + copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName)) + }) + } else { + if (debug) console.log(`Copying: ${src} -> ${dest}`) + fs.copyFileSync(src, dest) + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b13ba609..a6fe50a55 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -269,6 +269,9 @@ importers: fs-extra: specifier: ^9.0.1 version: 9.1.0 + globby: + specifier: 11.1.0 + version: 11.1.0 handlebars: specifier: ^4.7.7 version: 4.7.8