create-payload-app 3.0.0-alpha.61 → 3.0.0-alpha.63

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,6 +6,7 @@ type InitNextArgs = Pick<CliArgs, '--debug'> & {
6
6
  projectDir: string;
7
7
  useDistFiles?: boolean;
8
8
  };
9
+ type NextConfigType = 'cjs' | 'esm';
9
10
  type InitNextResult = {
10
11
  isSrcDir: boolean;
11
12
  nextAppDir: string;
@@ -23,6 +24,7 @@ type NextAppDetails = {
23
24
  isSrcDir: boolean;
24
25
  nextAppDir?: string;
25
26
  nextConfigPath?: string;
27
+ nextConfigType?: NextConfigType;
26
28
  };
27
29
  export declare function getNextAppDetails(projectDir: string): Promise<NextAppDetails>;
28
30
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"init-next.d.ts","sourceRoot":"","sources":["../../src/lib/init-next.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAOlE,KAAK,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAED,KAAK,cAAc,GACf;IACE,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,IAAI,CAAA;CACd,GACD;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAA;AAE9E,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAoD1E;AAiID,KAAK,cAAc,GAAG;IACpB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA+BnF"}
1
+ {"version":3,"file":"init-next.d.ts","sourceRoot":"","sources":["../../src/lib/init-next.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAOlE,KAAK,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAED,KAAK,cAAc,GAAG,KAAK,GAAG,KAAK,CAAA;AAEnC,KAAK,cAAc,GACf;IACE,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,IAAI,CAAA;CACd,GACD;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAA;AAE9E,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAgE1E;AAkJD,KAAK,cAAc,GAAG;IACpB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,cAAc,CAAA;CAChC,CAAA;AAED,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAkCnF"}
@@ -2,6 +2,7 @@ import * as p from '@clack/prompts';
2
2
  import { parse, stringify } from 'comment-json';
3
3
  import execa from 'execa';
4
4
  import fs from 'fs';
5
+ import fse from 'fs-extra';
5
6
  import globby from 'globby';
6
7
  import path from 'path';
7
8
  import { promisify } from 'util';
@@ -17,11 +18,20 @@ import { wrapNextConfig } from './wrap-next-config.js';
17
18
  export async function initNext(args) {
18
19
  const { dbType: dbType, packageManager, projectDir } = args;
19
20
  const nextAppDetails = args.nextAppDetails || await getNextAppDetails(projectDir);
20
- const { hasTopLevelLayout, isSrcDir, nextAppDir } = nextAppDetails || await getNextAppDetails(projectDir);
21
- if (!nextAppDir) {
21
+ if (!nextAppDetails.nextAppDir) {
22
+ warning(`Could not find app directory in ${projectDir}, creating...`);
23
+ const createdAppDir = path.resolve(projectDir, nextAppDetails.isSrcDir ? 'src/app' : 'app');
24
+ fse.mkdirSync(createdAppDir, {
25
+ recursive: true
26
+ });
27
+ nextAppDetails.nextAppDir = createdAppDir;
28
+ }
29
+ const { hasTopLevelLayout, isSrcDir, nextAppDir, nextConfigType } = nextAppDetails;
30
+ if (!nextConfigType) {
22
31
  return {
23
32
  isSrcDir,
24
- reason: `Could not find app directory in ${projectDir}`,
33
+ nextAppDir,
34
+ reason: `Could not determine Next Config type in ${projectDir}. Possibly try renaming next.config.js to next.config.cjs or next.config.mjs.`,
25
35
  success: false
26
36
  };
27
37
  }
@@ -43,6 +53,7 @@ export async function initNext(args) {
43
53
  const configurationResult = installAndConfigurePayload({
44
54
  ...args,
45
55
  nextAppDetails,
56
+ nextConfigType,
46
57
  useDistFiles: true
47
58
  });
48
59
  if (configurationResult.success === false) {
@@ -75,10 +86,17 @@ export async function initNext(args) {
75
86
  }
76
87
  async function addPayloadConfigToTsConfig(projectDir, isSrcDir) {
77
88
  const tsConfigPath = path.resolve(projectDir, 'tsconfig.json');
89
+ // Check if tsconfig.json exists
90
+ if (!fs.existsSync(tsConfigPath)) {
91
+ warning(`Could not find tsconfig.json to add @payload-config path.`);
92
+ return;
93
+ }
78
94
  const userTsConfigContent = await readFile(tsConfigPath, {
79
95
  encoding: 'utf8'
80
96
  });
81
97
  const userTsConfig = parse(userTsConfigContent);
98
+ const hasBaseUrl = userTsConfig?.compilerOptions?.baseUrl && userTsConfig?.compilerOptions?.baseUrl !== '.';
99
+ const baseUrl = hasBaseUrl ? userTsConfig?.compilerOptions?.baseUrl : './';
82
100
  if (!userTsConfig.compilerOptions && !('extends' in userTsConfig)) {
83
101
  userTsConfig.compilerOptions = {};
84
102
  }
@@ -86,7 +104,7 @@ async function addPayloadConfigToTsConfig(projectDir, isSrcDir) {
86
104
  userTsConfig.compilerOptions.paths = {
87
105
  ...userTsConfig.compilerOptions.paths || {},
88
106
  '@payload-config': [
89
- `./${isSrcDir ? 'src/' : ''}payload.config.ts`
107
+ `${baseUrl}${isSrcDir ? 'src/' : ''}payload.config.ts`
90
108
  ]
91
109
  };
92
110
  await writeFile(tsConfigPath, stringify(userTsConfig, null, 2), {
@@ -95,7 +113,7 @@ async function addPayloadConfigToTsConfig(projectDir, isSrcDir) {
95
113
  }
96
114
  }
97
115
  function installAndConfigurePayload(args) {
98
- const { '--debug': debug, nextAppDetails: { isSrcDir, nextAppDir, nextConfigPath } = {}, projectDir, useDistFiles } = args;
116
+ const { '--debug': debug, nextAppDetails: { isSrcDir, nextAppDir, nextConfigPath } = {}, nextConfigType, projectDir, useDistFiles } = args;
99
117
  if (!nextAppDir || !nextConfigPath) {
100
118
  return {
101
119
  reason: 'Could not find app directory or next.config.js',
@@ -127,12 +145,14 @@ function installAndConfigurePayload(args) {
127
145
  logDebug(`nextAppDir: ${nextAppDir}`);
128
146
  logDebug(`projectDir: ${projectDir}`);
129
147
  logDebug(`nextConfigPath: ${nextConfigPath}`);
148
+ logDebug(`payloadConfigPath: ${path.resolve(projectDir, 'payload.config.ts')}`);
130
149
  logDebug(`isSrcDir: ${isSrcDir}. source: ${templateSrcDir}. dest: ${path.dirname(nextConfigPath)}`);
131
150
  // This is a little clunky and needs to account for isSrcDir
132
151
  copyRecursiveSync(templateSrcDir, path.dirname(nextConfigPath), debug);
133
152
  // Wrap next.config.js with withPayload
134
153
  wrapNextConfig({
135
- nextConfigPath
154
+ nextConfigPath,
155
+ nextConfigType
136
156
  });
137
157
  return {
138
158
  payloadConfigPath: path.resolve(nextAppDir, '../payload.config.ts'),
@@ -144,8 +164,8 @@ async function installDeps(projectDir, packageManager, dbType) {
144
164
  'payload',
145
165
  '@payloadcms/next',
146
166
  '@payloadcms/richtext-lexical'
147
- ].map((pkg)=>`${pkg}@alpha`);
148
- packagesToInstall.push(`@payloadcms/db-${dbType}@alpha`);
167
+ ].map((pkg)=>`${pkg}@beta`);
168
+ packagesToInstall.push(`@payloadcms/db-${dbType}@beta`);
149
169
  let exitCode = 0;
150
170
  switch(packageManager){
151
171
  case 'npm':
@@ -204,18 +224,40 @@ export async function getNextAppDetails(projectDir) {
204
224
  ], {
205
225
  absolute: true,
206
226
  cwd: projectDir,
227
+ ignore: [
228
+ '**/node_modules/**'
229
+ ],
207
230
  onlyDirectories: true
208
231
  }))?.[0];
209
232
  if (!nextAppDir || nextAppDir.length === 0) {
210
233
  nextAppDir = undefined;
211
234
  }
235
+ const configType = await getProjectType(projectDir, nextConfigPath);
212
236
  const hasTopLevelLayout = nextAppDir ? fs.existsSync(path.resolve(nextAppDir, 'layout.tsx')) : false;
213
237
  return {
214
238
  hasTopLevelLayout,
215
239
  isSrcDir,
216
240
  nextAppDir,
217
- nextConfigPath
241
+ nextConfigPath,
242
+ nextConfigType: configType
218
243
  };
219
244
  }
245
+ async function getProjectType(projectDir, nextConfigPath) {
246
+ if (nextConfigPath.endsWith('.mjs')) {
247
+ return 'esm';
248
+ }
249
+ if (nextConfigPath.endsWith('.cjs')) {
250
+ return 'cjs';
251
+ }
252
+ const packageObj = await fse.readJson(path.resolve(projectDir, 'package.json'));
253
+ const packageJsonType = packageObj.type;
254
+ if (packageJsonType === 'module') {
255
+ return 'esm';
256
+ }
257
+ if (packageJsonType === 'commonjs') {
258
+ return 'cjs';
259
+ }
260
+ return 'cjs';
261
+ }
220
262
 
221
263
  //# sourceMappingURL=init-next.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/init-next.ts"],"sourcesContent":["import type { CompilerOptions } from 'typescript'\n\nimport * as p from '@clack/prompts'\nimport { parse, stringify } from 'comment-json'\nimport execa from 'execa'\nimport fs from 'fs'\nimport globby from 'globby'\nimport path from 'path'\nimport { promisify } from 'util'\n\nconst readFile = promisify(fs.readFile)\nconst writeFile = promisify(fs.writeFile)\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\nimport { fileURLToPath } from 'node:url'\n\nimport type { CliArgs, DbType, PackageManager } from '../types.js'\n\nimport { copyRecursiveSync } from '../utils/copy-recursive-sync.js'\nimport { debug as origDebug, warning } from '../utils/log.js'\nimport { moveMessage } from '../utils/messages.js'\nimport { wrapNextConfig } from './wrap-next-config.js'\n\ntype InitNextArgs = Pick<CliArgs, '--debug'> & {\n dbType: DbType\n nextAppDetails?: NextAppDetails\n packageManager: PackageManager\n projectDir: string\n useDistFiles?: boolean\n}\n\ntype InitNextResult =\n | {\n isSrcDir: boolean\n nextAppDir: string\n payloadConfigPath: string\n success: true\n }\n | { isSrcDir: boolean; nextAppDir?: string; reason: string; success: false }\n\nexport async function initNext(args: InitNextArgs): Promise<InitNextResult> {\n const { dbType: dbType, packageManager, projectDir } = args\n\n const nextAppDetails = args.nextAppDetails || (await getNextAppDetails(projectDir))\n\n const { hasTopLevelLayout, isSrcDir, nextAppDir } =\n nextAppDetails || (await getNextAppDetails(projectDir))\n\n if (!nextAppDir) {\n return { isSrcDir, reason: `Could not find app directory in ${projectDir}`, success: false }\n }\n\n if (hasTopLevelLayout) {\n // Output directions for user to move all files from app to top-level directory named `(app)`\n p.log.warn(moveMessage({ nextAppDir, projectDir }))\n return {\n isSrcDir,\n nextAppDir,\n reason: 'Found existing layout.tsx in app directory',\n success: false,\n }\n }\n\n const installSpinner = p.spinner()\n installSpinner.start('Installing Payload and dependencies...')\n\n const configurationResult = installAndConfigurePayload({\n ...args,\n nextAppDetails,\n useDistFiles: true, // Requires running 'pnpm pack-template-files' in cpa\n })\n\n if (configurationResult.success === false) {\n installSpinner.stop(configurationResult.reason, 1)\n return { ...configurationResult, isSrcDir, success: false }\n }\n\n const { success: installSuccess } = await installDeps(projectDir, packageManager, dbType)\n if (!installSuccess) {\n installSpinner.stop('Failed to install dependencies', 1)\n return {\n ...configurationResult,\n isSrcDir,\n reason: 'Failed to install dependencies',\n success: false,\n }\n }\n\n // Add `@payload-config` to tsconfig.json `paths`\n await addPayloadConfigToTsConfig(projectDir, isSrcDir)\n installSpinner.stop('Successfully installed Payload and dependencies')\n return { ...configurationResult, isSrcDir, nextAppDir, success: true }\n}\n\nasync function addPayloadConfigToTsConfig(projectDir: string, isSrcDir: boolean) {\n const tsConfigPath = path.resolve(projectDir, 'tsconfig.json')\n const userTsConfigContent = await readFile(tsConfigPath, {\n encoding: 'utf8',\n })\n const userTsConfig = parse(userTsConfigContent) as {\n compilerOptions?: CompilerOptions\n }\n if (!userTsConfig.compilerOptions && !('extends' in userTsConfig)) {\n userTsConfig.compilerOptions = {}\n }\n\n if (\n !userTsConfig.compilerOptions?.paths?.['@payload-config'] &&\n userTsConfig.compilerOptions?.paths\n ) {\n userTsConfig.compilerOptions.paths = {\n ...(userTsConfig.compilerOptions.paths || {}),\n '@payload-config': [`./${isSrcDir ? 'src/' : ''}payload.config.ts`],\n }\n await writeFile(tsConfigPath, stringify(userTsConfig, null, 2), { encoding: 'utf8' })\n }\n}\n\nfunction installAndConfigurePayload(\n args: InitNextArgs & { nextAppDetails: NextAppDetails; useDistFiles?: boolean },\n):\n | { payloadConfigPath: string; success: true }\n | { payloadConfigPath?: string; reason: string; success: false } {\n const {\n '--debug': debug,\n nextAppDetails: { isSrcDir, nextAppDir, nextConfigPath } = {},\n projectDir,\n useDistFiles,\n } = args\n\n if (!nextAppDir || !nextConfigPath) {\n return {\n reason: 'Could not find app directory or next.config.js',\n success: false,\n }\n }\n\n const logDebug = (message: string) => {\n if (debug) origDebug(message)\n }\n\n if (!fs.existsSync(projectDir)) {\n return {\n reason: `Could not find specified project directory at ${projectDir}`,\n success: false,\n }\n }\n\n const templateFilesPath =\n dirname.endsWith('dist') || useDistFiles\n ? path.resolve(dirname, '../..', 'dist/template')\n : path.resolve(dirname, '../../../../templates/blank-3.0')\n\n logDebug(`Using template files from: ${templateFilesPath}`)\n\n if (!fs.existsSync(templateFilesPath)) {\n return {\n reason: `Could not find template source files from ${templateFilesPath}`,\n success: false,\n }\n } else {\n logDebug('Found template source files')\n }\n\n logDebug(`Copying template files from ${templateFilesPath} to ${nextAppDir}`)\n\n const templateSrcDir = path.resolve(templateFilesPath, isSrcDir ? '' : 'src')\n\n logDebug(`templateSrcDir: ${templateSrcDir}`)\n logDebug(`nextAppDir: ${nextAppDir}`)\n logDebug(`projectDir: ${projectDir}`)\n logDebug(`nextConfigPath: ${nextConfigPath}`)\n\n logDebug(\n `isSrcDir: ${isSrcDir}. source: ${templateSrcDir}. dest: ${path.dirname(nextConfigPath)}`,\n )\n\n // This is a little clunky and needs to account for isSrcDir\n copyRecursiveSync(templateSrcDir, path.dirname(nextConfigPath), debug)\n\n // Wrap next.config.js with withPayload\n wrapNextConfig({ nextConfigPath })\n\n return {\n payloadConfigPath: path.resolve(nextAppDir, '../payload.config.ts'),\n success: true,\n }\n}\n\nasync function installDeps(projectDir: string, packageManager: PackageManager, dbType: DbType) {\n const packagesToInstall = ['payload', '@payloadcms/next', '@payloadcms/richtext-lexical'].map(\n (pkg) => `${pkg}@alpha`,\n )\n\n packagesToInstall.push(`@payloadcms/db-${dbType}@alpha`)\n\n let exitCode = 0\n switch (packageManager) {\n case 'npm': {\n ;({ exitCode } = await execa('npm', ['install', '--save', ...packagesToInstall], {\n cwd: projectDir,\n }))\n break\n }\n case 'yarn':\n case 'pnpm': {\n ;({ exitCode } = await execa(packageManager, ['add', ...packagesToInstall], {\n cwd: projectDir,\n }))\n break\n }\n case 'bun': {\n warning('Bun support is untested.')\n ;({ exitCode } = await execa('bun', ['add', ...packagesToInstall], { cwd: projectDir }))\n break\n }\n }\n\n return { success: exitCode === 0 }\n}\n\ntype NextAppDetails = {\n hasTopLevelLayout: boolean\n isSrcDir: boolean\n nextAppDir?: string\n nextConfigPath?: string\n}\n\nexport async function getNextAppDetails(projectDir: string): Promise<NextAppDetails> {\n const isSrcDir = fs.existsSync(path.resolve(projectDir, 'src'))\n\n const nextConfigPath: string | undefined = (\n await globby('next.config.*js', { absolute: true, cwd: projectDir })\n )?.[0]\n if (!nextConfigPath || nextConfigPath.length === 0) {\n return {\n hasTopLevelLayout: false,\n isSrcDir,\n nextConfigPath: undefined,\n }\n }\n\n let nextAppDir: string | undefined = (\n await globby(['**/app'], {\n absolute: true,\n cwd: projectDir,\n onlyDirectories: true,\n })\n )?.[0]\n\n if (!nextAppDir || nextAppDir.length === 0) {\n nextAppDir = undefined\n }\n\n const hasTopLevelLayout = nextAppDir\n ? fs.existsSync(path.resolve(nextAppDir, 'layout.tsx'))\n : false\n\n return { hasTopLevelLayout, isSrcDir, nextAppDir, nextConfigPath }\n}\n"],"names":["p","parse","stringify","execa","fs","globby","path","promisify","readFile","writeFile","filename","fileURLToPath","url","dirname","copyRecursiveSync","debug","origDebug","warning","moveMessage","wrapNextConfig","initNext","args","dbType","packageManager","projectDir","nextAppDetails","getNextAppDetails","hasTopLevelLayout","isSrcDir","nextAppDir","reason","success","log","warn","installSpinner","spinner","start","configurationResult","installAndConfigurePayload","useDistFiles","stop","installSuccess","installDeps","addPayloadConfigToTsConfig","tsConfigPath","resolve","userTsConfigContent","encoding","userTsConfig","compilerOptions","paths","nextConfigPath","logDebug","message","existsSync","templateFilesPath","endsWith","templateSrcDir","payloadConfigPath","packagesToInstall","map","pkg","push","exitCode","cwd","absolute","length","undefined","onlyDirectories"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/init-next.ts"],"sourcesContent":["import type { CompilerOptions } from 'typescript'\n\nimport * as p from '@clack/prompts'\nimport { parse, stringify } from 'comment-json'\nimport execa from 'execa'\nimport fs from 'fs'\nimport fse from 'fs-extra'\nimport globby from 'globby'\nimport path from 'path'\nimport { promisify } from 'util'\n\nconst readFile = promisify(fs.readFile)\nconst writeFile = promisify(fs.writeFile)\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\nimport { fileURLToPath } from 'node:url'\n\nimport type { CliArgs, DbType, PackageManager } from '../types.js'\n\nimport { copyRecursiveSync } from '../utils/copy-recursive-sync.js'\nimport { debug as origDebug, warning } from '../utils/log.js'\nimport { moveMessage } from '../utils/messages.js'\nimport { wrapNextConfig } from './wrap-next-config.js'\n\ntype InitNextArgs = Pick<CliArgs, '--debug'> & {\n dbType: DbType\n nextAppDetails?: NextAppDetails\n packageManager: PackageManager\n projectDir: string\n useDistFiles?: boolean\n}\n\ntype NextConfigType = 'cjs' | 'esm'\n\ntype InitNextResult =\n | {\n isSrcDir: boolean\n nextAppDir: string\n payloadConfigPath: string\n success: true\n }\n | { isSrcDir: boolean; nextAppDir?: string; reason: string; success: false }\n\nexport async function initNext(args: InitNextArgs): Promise<InitNextResult> {\n const { dbType: dbType, packageManager, projectDir } = args\n\n const nextAppDetails = args.nextAppDetails || (await getNextAppDetails(projectDir))\n\n if (!nextAppDetails.nextAppDir) {\n warning(`Could not find app directory in ${projectDir}, creating...`)\n const createdAppDir = path.resolve(projectDir, nextAppDetails.isSrcDir ? 'src/app' : 'app')\n fse.mkdirSync(createdAppDir, { recursive: true })\n nextAppDetails.nextAppDir = createdAppDir\n }\n\n const { hasTopLevelLayout, isSrcDir, nextAppDir, nextConfigType } = nextAppDetails\n\n if (!nextConfigType) {\n return {\n isSrcDir,\n nextAppDir,\n reason: `Could not determine Next Config type in ${projectDir}. Possibly try renaming next.config.js to next.config.cjs or next.config.mjs.`,\n success: false,\n }\n }\n\n if (hasTopLevelLayout) {\n // Output directions for user to move all files from app to top-level directory named `(app)`\n p.log.warn(moveMessage({ nextAppDir, projectDir }))\n return {\n isSrcDir,\n nextAppDir,\n reason: 'Found existing layout.tsx in app directory',\n success: false,\n }\n }\n\n const installSpinner = p.spinner()\n installSpinner.start('Installing Payload and dependencies...')\n\n const configurationResult = installAndConfigurePayload({\n ...args,\n nextAppDetails,\n nextConfigType,\n useDistFiles: true, // Requires running 'pnpm pack-template-files' in cpa\n })\n\n if (configurationResult.success === false) {\n installSpinner.stop(configurationResult.reason, 1)\n return { ...configurationResult, isSrcDir, success: false }\n }\n\n const { success: installSuccess } = await installDeps(projectDir, packageManager, dbType)\n if (!installSuccess) {\n installSpinner.stop('Failed to install dependencies', 1)\n return {\n ...configurationResult,\n isSrcDir,\n reason: 'Failed to install dependencies',\n success: false,\n }\n }\n\n // Add `@payload-config` to tsconfig.json `paths`\n await addPayloadConfigToTsConfig(projectDir, isSrcDir)\n installSpinner.stop('Successfully installed Payload and dependencies')\n return { ...configurationResult, isSrcDir, nextAppDir, success: true }\n}\n\nasync function addPayloadConfigToTsConfig(projectDir: string, isSrcDir: boolean) {\n const tsConfigPath = path.resolve(projectDir, 'tsconfig.json')\n\n // Check if tsconfig.json exists\n if (!fs.existsSync(tsConfigPath)) {\n warning(`Could not find tsconfig.json to add @payload-config path.`)\n return\n }\n const userTsConfigContent = await readFile(tsConfigPath, {\n encoding: 'utf8',\n })\n const userTsConfig = parse(userTsConfigContent) as {\n compilerOptions?: CompilerOptions\n }\n\n const hasBaseUrl =\n userTsConfig?.compilerOptions?.baseUrl && userTsConfig?.compilerOptions?.baseUrl !== '.'\n const baseUrl = hasBaseUrl ? userTsConfig?.compilerOptions?.baseUrl : './'\n\n if (!userTsConfig.compilerOptions && !('extends' in userTsConfig)) {\n userTsConfig.compilerOptions = {}\n }\n\n if (\n !userTsConfig.compilerOptions?.paths?.['@payload-config'] &&\n userTsConfig.compilerOptions?.paths\n ) {\n userTsConfig.compilerOptions.paths = {\n ...(userTsConfig.compilerOptions.paths || {}),\n '@payload-config': [`${baseUrl}${isSrcDir ? 'src/' : ''}payload.config.ts`],\n }\n await writeFile(tsConfigPath, stringify(userTsConfig, null, 2), { encoding: 'utf8' })\n }\n}\n\nfunction installAndConfigurePayload(\n args: InitNextArgs & {\n nextAppDetails: NextAppDetails\n nextConfigType: NextConfigType\n useDistFiles?: boolean\n },\n):\n | { payloadConfigPath: string; success: true }\n | { payloadConfigPath?: string; reason: string; success: false } {\n const {\n '--debug': debug,\n nextAppDetails: { isSrcDir, nextAppDir, nextConfigPath } = {},\n nextConfigType,\n projectDir,\n useDistFiles,\n } = args\n\n if (!nextAppDir || !nextConfigPath) {\n return {\n reason: 'Could not find app directory or next.config.js',\n success: false,\n }\n }\n\n const logDebug = (message: string) => {\n if (debug) origDebug(message)\n }\n\n if (!fs.existsSync(projectDir)) {\n return {\n reason: `Could not find specified project directory at ${projectDir}`,\n success: false,\n }\n }\n\n const templateFilesPath =\n dirname.endsWith('dist') || useDistFiles\n ? path.resolve(dirname, '../..', 'dist/template')\n : path.resolve(dirname, '../../../../templates/blank-3.0')\n\n logDebug(`Using template files from: ${templateFilesPath}`)\n\n if (!fs.existsSync(templateFilesPath)) {\n return {\n reason: `Could not find template source files from ${templateFilesPath}`,\n success: false,\n }\n } else {\n logDebug('Found template source files')\n }\n\n logDebug(`Copying template files from ${templateFilesPath} to ${nextAppDir}`)\n\n const templateSrcDir = path.resolve(templateFilesPath, isSrcDir ? '' : 'src')\n\n logDebug(`templateSrcDir: ${templateSrcDir}`)\n logDebug(`nextAppDir: ${nextAppDir}`)\n logDebug(`projectDir: ${projectDir}`)\n logDebug(`nextConfigPath: ${nextConfigPath}`)\n logDebug(`payloadConfigPath: ${path.resolve(projectDir, 'payload.config.ts')}`)\n\n logDebug(\n `isSrcDir: ${isSrcDir}. source: ${templateSrcDir}. dest: ${path.dirname(nextConfigPath)}`,\n )\n\n // This is a little clunky and needs to account for isSrcDir\n copyRecursiveSync(templateSrcDir, path.dirname(nextConfigPath), debug)\n\n // Wrap next.config.js with withPayload\n wrapNextConfig({ nextConfigPath, nextConfigType })\n\n return {\n payloadConfigPath: path.resolve(nextAppDir, '../payload.config.ts'),\n success: true,\n }\n}\n\nasync function installDeps(projectDir: string, packageManager: PackageManager, dbType: DbType) {\n const packagesToInstall = ['payload', '@payloadcms/next', '@payloadcms/richtext-lexical'].map(\n (pkg) => `${pkg}@beta`,\n )\n\n packagesToInstall.push(`@payloadcms/db-${dbType}@beta`)\n\n let exitCode = 0\n switch (packageManager) {\n case 'npm': {\n ;({ exitCode } = await execa('npm', ['install', '--save', ...packagesToInstall], {\n cwd: projectDir,\n }))\n break\n }\n case 'yarn':\n case 'pnpm': {\n ;({ exitCode } = await execa(packageManager, ['add', ...packagesToInstall], {\n cwd: projectDir,\n }))\n break\n }\n case 'bun': {\n warning('Bun support is untested.')\n ;({ exitCode } = await execa('bun', ['add', ...packagesToInstall], { cwd: projectDir }))\n break\n }\n }\n\n return { success: exitCode === 0 }\n}\n\ntype NextAppDetails = {\n hasTopLevelLayout: boolean\n isSrcDir: boolean\n nextAppDir?: string\n nextConfigPath?: string\n nextConfigType?: NextConfigType\n}\n\nexport async function getNextAppDetails(projectDir: string): Promise<NextAppDetails> {\n const isSrcDir = fs.existsSync(path.resolve(projectDir, 'src'))\n\n const nextConfigPath: string | undefined = (\n await globby('next.config.*js', { absolute: true, cwd: projectDir })\n )?.[0]\n if (!nextConfigPath || nextConfigPath.length === 0) {\n return {\n hasTopLevelLayout: false,\n isSrcDir,\n nextConfigPath: undefined,\n }\n }\n\n let nextAppDir: string | undefined = (\n await globby(['**/app'], {\n absolute: true,\n cwd: projectDir,\n ignore: ['**/node_modules/**'],\n onlyDirectories: true,\n })\n )?.[0]\n\n if (!nextAppDir || nextAppDir.length === 0) {\n nextAppDir = undefined\n }\n\n const configType = await getProjectType(projectDir, nextConfigPath)\n\n const hasTopLevelLayout = nextAppDir\n ? fs.existsSync(path.resolve(nextAppDir, 'layout.tsx'))\n : false\n\n return { hasTopLevelLayout, isSrcDir, nextAppDir, nextConfigPath, nextConfigType: configType }\n}\n\nasync function getProjectType(projectDir: string, nextConfigPath: string): Promise<'cjs' | 'esm'> {\n if (nextConfigPath.endsWith('.mjs')) {\n return 'esm'\n }\n if (nextConfigPath.endsWith('.cjs')) {\n return 'cjs'\n }\n\n const packageObj = await fse.readJson(path.resolve(projectDir, 'package.json'))\n const packageJsonType = packageObj.type\n if (packageJsonType === 'module') {\n return 'esm'\n }\n if (packageJsonType === 'commonjs') {\n return 'cjs'\n }\n\n return 'cjs'\n}\n"],"names":["p","parse","stringify","execa","fs","fse","globby","path","promisify","readFile","writeFile","filename","fileURLToPath","url","dirname","copyRecursiveSync","debug","origDebug","warning","moveMessage","wrapNextConfig","initNext","args","dbType","packageManager","projectDir","nextAppDetails","getNextAppDetails","nextAppDir","createdAppDir","resolve","isSrcDir","mkdirSync","recursive","hasTopLevelLayout","nextConfigType","reason","success","log","warn","installSpinner","spinner","start","configurationResult","installAndConfigurePayload","useDistFiles","stop","installSuccess","installDeps","addPayloadConfigToTsConfig","tsConfigPath","existsSync","userTsConfigContent","encoding","userTsConfig","hasBaseUrl","compilerOptions","baseUrl","paths","nextConfigPath","logDebug","message","templateFilesPath","endsWith","templateSrcDir","payloadConfigPath","packagesToInstall","map","pkg","push","exitCode","cwd","absolute","length","undefined","ignore","onlyDirectories","configType","getProjectType","packageObj","readJson","packageJsonType","type"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"packages.d.ts","sourceRoot":"","sources":["../../src/lib/packages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,KAAK,oBAAoB,GAAG;IAC1B,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,iBAAiB,EAAE,MAAM,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAqBD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAG/D,CAAA"}
1
+ {"version":3,"file":"packages.d.ts","sourceRoot":"","sources":["../../src/lib/packages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,KAAK,oBAAoB,GAAG;IAC1B,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,iBAAiB,EAAE,MAAM,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAyBD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAG/D,CAAA"}
@@ -4,7 +4,7 @@ const mongodbReplacement = {
4
4
  // Replacement between `// database-adapter-config-start` and `// database-adapter-config-end`
5
5
  configReplacement: [
6
6
  ' db: mongooseAdapter({',
7
- ' url: process.env.DATABASE_URI,',
7
+ " url: process.env.DATABASE_URI || '',",
8
8
  ' }),'
9
9
  ]
10
10
  };
@@ -12,7 +12,7 @@ const postgresReplacement = {
12
12
  configReplacement: [
13
13
  ' db: postgresAdapter({',
14
14
  ' pool: {',
15
- ' connectionString: process.env.DATABASE_URI,',
15
+ " connectionString: process.env.DATABASE_URI || '',",
16
16
  ' },',
17
17
  ' }),'
18
18
  ],
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/packages.ts"],"sourcesContent":["import type { DbType } from '../types.js'\n\ntype DbAdapterReplacement = {\n configReplacement: string[]\n importReplacement: string\n packageName: string\n}\n\nconst mongodbReplacement: DbAdapterReplacement = {\n importReplacement: \"import { mongooseAdapter } from '@payloadcms/db-mongodb'\",\n packageName: '@payloadcms/db-mongodb',\n // Replacement between `// database-adapter-config-start` and `// database-adapter-config-end`\n configReplacement: [' db: mongooseAdapter({', ' url: process.env.DATABASE_URI,', ' }),'],\n}\n\nconst postgresReplacement: DbAdapterReplacement = {\n configReplacement: [\n ' db: postgresAdapter({',\n ' pool: {',\n ' connectionString: process.env.DATABASE_URI,',\n ' },',\n ' }),',\n ],\n importReplacement: \"import { postgresAdapter } from '@payloadcms/db-postgres'\",\n packageName: '@payloadcms/db-postgres',\n}\n\nexport const dbReplacements: Record<DbType, DbAdapterReplacement> = {\n mongodb: mongodbReplacement,\n postgres: postgresReplacement,\n}\n"],"names":["mongodbReplacement","importReplacement","packageName","configReplacement","postgresReplacement","dbReplacements","mongodb","postgres"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAQA,MAAMA,qBAA2C;IAC/CC,mBAAmB;IACnBC,aAAa;IACb,8FAA8F;IAC9FC,mBAAmB;QAAC;QAA2B;QAAsC;KAAQ;AAC/F;AAEA,MAAMC,sBAA4C;IAChDD,mBAAmB;QACjB;QACA;QACA;QACA;QACA;KACD;IACDF,mBAAmB;IACnBC,aAAa;AACf;AAEA,OAAO,MAAMG,iBAAuD;IAClEC,SAASN;IACTO,UAAUH;AACZ,EAAC"}
1
+ {"version":3,"sources":["../../src/lib/packages.ts"],"sourcesContent":["import type { DbType } from '../types.js'\n\ntype DbAdapterReplacement = {\n configReplacement: string[]\n importReplacement: string\n packageName: string\n}\n\nconst mongodbReplacement: DbAdapterReplacement = {\n importReplacement: \"import { mongooseAdapter } from '@payloadcms/db-mongodb'\",\n packageName: '@payloadcms/db-mongodb',\n // Replacement between `// database-adapter-config-start` and `// database-adapter-config-end`\n configReplacement: [\n ' db: mongooseAdapter({',\n \" url: process.env.DATABASE_URI || '',\",\n ' }),',\n ],\n}\n\nconst postgresReplacement: DbAdapterReplacement = {\n configReplacement: [\n ' db: postgresAdapter({',\n ' pool: {',\n \" connectionString: process.env.DATABASE_URI || '',\",\n ' },',\n ' }),',\n ],\n importReplacement: \"import { postgresAdapter } from '@payloadcms/db-postgres'\",\n packageName: '@payloadcms/db-postgres',\n}\n\nexport const dbReplacements: Record<DbType, DbAdapterReplacement> = {\n mongodb: mongodbReplacement,\n postgres: postgresReplacement,\n}\n"],"names":["mongodbReplacement","importReplacement","packageName","configReplacement","postgresReplacement","dbReplacements","mongodb","postgres"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAQA,MAAMA,qBAA2C;IAC/CC,mBAAmB;IACnBC,aAAa;IACb,8FAA8F;IAC9FC,mBAAmB;QACjB;QACA;QACA;KACD;AACH;AAEA,MAAMC,sBAA4C;IAChDD,mBAAmB;QACjB;QACA;QACA;QACA;QACA;KACD;IACDF,mBAAmB;IACnBC,aAAa;AACf;AAEA,OAAO,MAAMG,iBAAuD;IAClEC,SAASN;IACTO,UAAUH;AACZ,EAAC"}
@@ -7,7 +7,7 @@ const dbChoiceRecord = {
7
7
  value: 'mongodb'
8
8
  },
9
9
  postgres: {
10
- dbConnectionPrefix: 'postgres://127.0.0.1:5432/',
10
+ dbConnectionPrefix: 'postgres://postgres:<password>@127.0.0.1:5432/',
11
11
  title: 'PostgreSQL (beta)',
12
12
  value: 'postgres'
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/select-db.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport slugify from '@sindresorhus/slugify'\n\nimport type { CliArgs, DbDetails, DbType } from '../types.js'\n\ntype DbChoice = {\n dbConnectionPrefix: `${string}/`\n title: string\n value: DbType\n}\n\nconst dbChoiceRecord: Record<DbType, DbChoice> = {\n mongodb: {\n dbConnectionPrefix: 'mongodb://127.0.0.1/',\n title: 'MongoDB',\n value: 'mongodb',\n },\n postgres: {\n dbConnectionPrefix: 'postgres://127.0.0.1:5432/',\n title: 'PostgreSQL (beta)',\n value: 'postgres',\n },\n}\n\nexport async function selectDb(args: CliArgs, projectName: string): Promise<DbDetails> {\n let dbType: DbType | symbol | undefined = undefined\n if (args['--db']) {\n if (!Object.values(dbChoiceRecord).some((dbChoice) => dbChoice.value === args['--db'])) {\n throw new Error(\n `Invalid database type given. Valid types are: ${Object.values(dbChoiceRecord)\n .map((dbChoice) => dbChoice.value)\n .join(', ')}`,\n )\n }\n dbType = args['--db'] as DbType\n } else {\n dbType = await p.select<{ label: string; value: DbType }[], DbType>({\n initialValue: 'mongodb',\n message: `Select a database`,\n options: [\n { label: 'MongoDB', value: 'mongodb' },\n { label: 'Postgres', value: 'postgres' },\n ],\n })\n if (p.isCancel(dbType)) process.exit(0)\n }\n\n const dbChoice = dbChoiceRecord[dbType]\n\n let dbUri: string | symbol | undefined = undefined\n const initialDbUri = `${dbChoice.dbConnectionPrefix}${\n projectName === '.' ? `payload-${getRandomDigitSuffix()}` : slugify(projectName)\n }`\n\n if (args['--db-accept-recommended']) {\n dbUri = initialDbUri\n } else if (args['--db-connection-string']) {\n dbUri = args['--db-connection-string']\n } else {\n dbUri = await p.text({\n initialValue: initialDbUri,\n message: `Enter ${dbChoice.title.split(' ')[0]} connection string`, // strip beta from title\n })\n if (p.isCancel(dbUri)) process.exit(0)\n }\n\n return {\n type: dbChoice.value,\n dbUri,\n }\n}\n\nfunction getRandomDigitSuffix(): string {\n return (Math.random() * Math.pow(10, 6)).toFixed(0)\n}\n"],"names":["p","slugify","dbChoiceRecord","mongodb","dbConnectionPrefix","title","value","postgres","selectDb","args","projectName","dbType","undefined","Object","values","some","dbChoice","Error","map","join","select","initialValue","message","options","label","isCancel","process","exit","dbUri","initialDbUri","getRandomDigitSuffix","text","split","type","Math","random","pow","toFixed"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,YAAYA,OAAO,iBAAgB;AACnC,OAAOC,aAAa,wBAAuB;AAU3C,MAAMC,iBAA2C;IAC/CC,SAAS;QACPC,oBAAoB;QACpBC,OAAO;QACPC,OAAO;IACT;IACAC,UAAU;QACRH,oBAAoB;QACpBC,OAAO;QACPC,OAAO;IACT;AACF;AAEA,OAAO,eAAeE,SAASC,IAAa,EAAEC,WAAmB;IAC/D,IAAIC,SAAsCC;IAC1C,IAAIH,IAAI,CAAC,OAAO,EAAE;QAChB,IAAI,CAACI,OAAOC,MAAM,CAACZ,gBAAgBa,IAAI,CAAC,CAACC,WAAaA,SAASV,KAAK,KAAKG,IAAI,CAAC,OAAO,GAAG;YACtF,MAAM,IAAIQ,MACR,CAAC,8CAA8C,EAAEJ,OAAOC,MAAM,CAACZ,gBAC5DgB,GAAG,CAAC,CAACF,WAAaA,SAASV,KAAK,EAChCa,IAAI,CAAC,MAAM,CAAC;QAEnB;QACAR,SAASF,IAAI,CAAC,OAAO;IACvB,OAAO;QACLE,SAAS,MAAMX,EAAEoB,MAAM,CAA6C;YAClEC,cAAc;YACdC,SAAS,CAAC,iBAAiB,CAAC;YAC5BC,SAAS;gBACP;oBAAEC,OAAO;oBAAWlB,OAAO;gBAAU;gBACrC;oBAAEkB,OAAO;oBAAYlB,OAAO;gBAAW;aACxC;QACH;QACA,IAAIN,EAAEyB,QAAQ,CAACd,SAASe,QAAQC,IAAI,CAAC;IACvC;IAEA,MAAMX,WAAWd,cAAc,CAACS,OAAO;IAEvC,IAAIiB,QAAqChB;IACzC,MAAMiB,eAAe,CAAC,EAAEb,SAASZ,kBAAkB,CAAC,EAClDM,gBAAgB,MAAM,CAAC,QAAQ,EAAEoB,uBAAuB,CAAC,GAAG7B,QAAQS,aACrE,CAAC;IAEF,IAAID,IAAI,CAAC,0BAA0B,EAAE;QACnCmB,QAAQC;IACV,OAAO,IAAIpB,IAAI,CAAC,yBAAyB,EAAE;QACzCmB,QAAQnB,IAAI,CAAC,yBAAyB;IACxC,OAAO;QACLmB,QAAQ,MAAM5B,EAAE+B,IAAI,CAAC;YACnBV,cAAcQ;YACdP,SAAS,CAAC,MAAM,EAAEN,SAASX,KAAK,CAAC2B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC;QACpE;QACA,IAAIhC,EAAEyB,QAAQ,CAACG,QAAQF,QAAQC,IAAI,CAAC;IACtC;IAEA,OAAO;QACLM,MAAMjB,SAASV,KAAK;QACpBsB;IACF;AACF;AAEA,SAASE;IACP,OAAO,AAACI,CAAAA,KAAKC,MAAM,KAAKD,KAAKE,GAAG,CAAC,IAAI,EAAC,EAAGC,OAAO,CAAC;AACnD"}
1
+ {"version":3,"sources":["../../src/lib/select-db.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport slugify from '@sindresorhus/slugify'\n\nimport type { CliArgs, DbDetails, DbType } from '../types.js'\n\ntype DbChoice = {\n dbConnectionPrefix: `${string}/`\n title: string\n value: DbType\n}\n\nconst dbChoiceRecord: Record<DbType, DbChoice> = {\n mongodb: {\n dbConnectionPrefix: 'mongodb://127.0.0.1/',\n title: 'MongoDB',\n value: 'mongodb',\n },\n postgres: {\n dbConnectionPrefix: 'postgres://postgres:<password>@127.0.0.1:5432/',\n title: 'PostgreSQL (beta)',\n value: 'postgres',\n },\n}\n\nexport async function selectDb(args: CliArgs, projectName: string): Promise<DbDetails> {\n let dbType: DbType | symbol | undefined = undefined\n if (args['--db']) {\n if (!Object.values(dbChoiceRecord).some((dbChoice) => dbChoice.value === args['--db'])) {\n throw new Error(\n `Invalid database type given. Valid types are: ${Object.values(dbChoiceRecord)\n .map((dbChoice) => dbChoice.value)\n .join(', ')}`,\n )\n }\n dbType = args['--db'] as DbType\n } else {\n dbType = await p.select<{ label: string; value: DbType }[], DbType>({\n initialValue: 'mongodb',\n message: `Select a database`,\n options: [\n { label: 'MongoDB', value: 'mongodb' },\n { label: 'Postgres', value: 'postgres' },\n ],\n })\n if (p.isCancel(dbType)) process.exit(0)\n }\n\n const dbChoice = dbChoiceRecord[dbType]\n\n let dbUri: string | symbol | undefined = undefined\n const initialDbUri = `${dbChoice.dbConnectionPrefix}${\n projectName === '.' ? `payload-${getRandomDigitSuffix()}` : slugify(projectName)\n }`\n\n if (args['--db-accept-recommended']) {\n dbUri = initialDbUri\n } else if (args['--db-connection-string']) {\n dbUri = args['--db-connection-string']\n } else {\n dbUri = await p.text({\n initialValue: initialDbUri,\n message: `Enter ${dbChoice.title.split(' ')[0]} connection string`, // strip beta from title\n })\n if (p.isCancel(dbUri)) process.exit(0)\n }\n\n return {\n type: dbChoice.value,\n dbUri,\n }\n}\n\nfunction getRandomDigitSuffix(): string {\n return (Math.random() * Math.pow(10, 6)).toFixed(0)\n}\n"],"names":["p","slugify","dbChoiceRecord","mongodb","dbConnectionPrefix","title","value","postgres","selectDb","args","projectName","dbType","undefined","Object","values","some","dbChoice","Error","map","join","select","initialValue","message","options","label","isCancel","process","exit","dbUri","initialDbUri","getRandomDigitSuffix","text","split","type","Math","random","pow","toFixed"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,YAAYA,OAAO,iBAAgB;AACnC,OAAOC,aAAa,wBAAuB;AAU3C,MAAMC,iBAA2C;IAC/CC,SAAS;QACPC,oBAAoB;QACpBC,OAAO;QACPC,OAAO;IACT;IACAC,UAAU;QACRH,oBAAoB;QACpBC,OAAO;QACPC,OAAO;IACT;AACF;AAEA,OAAO,eAAeE,SAASC,IAAa,EAAEC,WAAmB;IAC/D,IAAIC,SAAsCC;IAC1C,IAAIH,IAAI,CAAC,OAAO,EAAE;QAChB,IAAI,CAACI,OAAOC,MAAM,CAACZ,gBAAgBa,IAAI,CAAC,CAACC,WAAaA,SAASV,KAAK,KAAKG,IAAI,CAAC,OAAO,GAAG;YACtF,MAAM,IAAIQ,MACR,CAAC,8CAA8C,EAAEJ,OAAOC,MAAM,CAACZ,gBAC5DgB,GAAG,CAAC,CAACF,WAAaA,SAASV,KAAK,EAChCa,IAAI,CAAC,MAAM,CAAC;QAEnB;QACAR,SAASF,IAAI,CAAC,OAAO;IACvB,OAAO;QACLE,SAAS,MAAMX,EAAEoB,MAAM,CAA6C;YAClEC,cAAc;YACdC,SAAS,CAAC,iBAAiB,CAAC;YAC5BC,SAAS;gBACP;oBAAEC,OAAO;oBAAWlB,OAAO;gBAAU;gBACrC;oBAAEkB,OAAO;oBAAYlB,OAAO;gBAAW;aACxC;QACH;QACA,IAAIN,EAAEyB,QAAQ,CAACd,SAASe,QAAQC,IAAI,CAAC;IACvC;IAEA,MAAMX,WAAWd,cAAc,CAACS,OAAO;IAEvC,IAAIiB,QAAqChB;IACzC,MAAMiB,eAAe,CAAC,EAAEb,SAASZ,kBAAkB,CAAC,EAClDM,gBAAgB,MAAM,CAAC,QAAQ,EAAEoB,uBAAuB,CAAC,GAAG7B,QAAQS,aACrE,CAAC;IAEF,IAAID,IAAI,CAAC,0BAA0B,EAAE;QACnCmB,QAAQC;IACV,OAAO,IAAIpB,IAAI,CAAC,yBAAyB,EAAE;QACzCmB,QAAQnB,IAAI,CAAC,yBAAyB;IACxC,OAAO;QACLmB,QAAQ,MAAM5B,EAAE+B,IAAI,CAAC;YACnBV,cAAcQ;YACdP,SAAS,CAAC,MAAM,EAAEN,SAASX,KAAK,CAAC2B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC;QACpE;QACA,IAAIhC,EAAEyB,QAAQ,CAACG,QAAQF,QAAQC,IAAI,CAAC;IACtC;IAEA,OAAO;QACLM,MAAMjB,SAASV,KAAK;QACpBsB;IACF;AACF;AAEA,SAASE;IACP,OAAO,AAACI,CAAAA,KAAKC,MAAM,KAAKD,KAAKE,GAAG,CAAC,IAAI,EAAC,EAAGC,OAAO,CAAC;AACnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAIlD,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAQ9D;AAED,wBAAgB,iBAAiB,IAAI,eAAe,EAAE,CA6CrD"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAIlD,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAQ9D;AAED,wBAAgB,iBAAiB,IAAI,eAAe,EAAE,CAgDrD"}
@@ -14,43 +14,32 @@ export function getValidTemplates() {
14
14
  name: 'blank-3.0',
15
15
  type: 'starter',
16
16
  description: 'Blank 3.0 Template',
17
- url: 'https://github.com/payloadcms/payload/templates/blank-3.0'
18
- },
19
- {
20
- name: 'blank',
21
- type: 'starter',
22
- description: 'Blank Template',
23
- url: 'https://github.com/payloadcms/payload/templates/blank'
24
- },
25
- {
26
- name: 'website',
27
- type: 'starter',
28
- description: 'Website Template',
29
- url: 'https://github.com/payloadcms/payload/templates/website'
30
- },
31
- {
32
- name: 'ecommerce',
33
- type: 'starter',
34
- description: 'E-commerce Template',
35
- url: 'https://github.com/payloadcms/payload/templates/ecommerce'
17
+ url: 'https://github.com/payloadcms/payload/templates/blank-3.0#beta'
36
18
  },
19
+ // Remove these until they have been updated for 3.0
20
+ // {
21
+ // name: 'blank',
22
+ // type: 'starter',
23
+ // description: 'Blank Template',
24
+ // url: 'https://github.com/payloadcms/payload/templates/blank',
25
+ // },
26
+ // {
27
+ // name: 'website',
28
+ // type: 'starter',
29
+ // description: 'Website Template',
30
+ // url: 'https://github.com/payloadcms/payload/templates/website',
31
+ // },
32
+ // {
33
+ // name: 'ecommerce',
34
+ // type: 'starter',
35
+ // description: 'E-commerce Template',
36
+ // url: 'https://github.com/payloadcms/payload/templates/ecommerce',
37
+ // },
37
38
  {
38
39
  name: 'plugin',
39
40
  type: 'plugin',
40
41
  description: 'Template for creating a Payload plugin',
41
- url: 'https://github.com/payloadcms/payload-plugin-template'
42
- },
43
- {
44
- name: 'payload-demo',
45
- type: 'starter',
46
- description: 'Payload demo site at https://demo.payloadcms.com',
47
- url: 'https://github.com/payloadcms/public-demo'
48
- },
49
- {
50
- name: 'payload-website',
51
- type: 'starter',
52
- description: 'Payload website CMS at https://payloadcms.com',
53
- url: 'https://github.com/payloadcms/website-cms'
42
+ url: 'https://github.com/payloadcms/payload-plugin-template#beta'
54
43
  }
55
44
  ];
56
45
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/templates.ts"],"sourcesContent":["import type { ProjectTemplate } from '../types.js'\n\nimport { error, info } from '../utils/log.js'\n\nexport function validateTemplate(templateName: string): boolean {\n const validTemplates = getValidTemplates()\n if (!validTemplates.map((t) => t.name).includes(templateName)) {\n error(`'${templateName}' is not a valid template.`)\n info(`Valid templates: ${validTemplates.map((t) => t.name).join(', ')}`)\n return false\n }\n return true\n}\n\nexport function getValidTemplates(): ProjectTemplate[] {\n return [\n {\n name: 'blank-3.0',\n type: 'starter',\n description: 'Blank 3.0 Template',\n url: 'https://github.com/payloadcms/payload/templates/blank-3.0',\n },\n {\n name: 'blank',\n type: 'starter',\n description: 'Blank Template',\n url: 'https://github.com/payloadcms/payload/templates/blank',\n },\n {\n name: 'website',\n type: 'starter',\n description: 'Website Template',\n url: 'https://github.com/payloadcms/payload/templates/website',\n },\n {\n name: 'ecommerce',\n type: 'starter',\n description: 'E-commerce Template',\n url: 'https://github.com/payloadcms/payload/templates/ecommerce',\n },\n {\n name: 'plugin',\n type: 'plugin',\n description: 'Template for creating a Payload plugin',\n url: 'https://github.com/payloadcms/payload-plugin-template',\n },\n {\n name: 'payload-demo',\n type: 'starter',\n description: 'Payload demo site at https://demo.payloadcms.com',\n url: 'https://github.com/payloadcms/public-demo',\n },\n {\n name: 'payload-website',\n type: 'starter',\n description: 'Payload website CMS at https://payloadcms.com',\n url: 'https://github.com/payloadcms/website-cms',\n },\n ]\n}\n"],"names":["error","info","validateTemplate","templateName","validTemplates","getValidTemplates","map","t","name","includes","join","type","description","url"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAEA,SAASA,KAAK,EAAEC,IAAI,QAAQ,kBAAiB;AAE7C,OAAO,SAASC,iBAAiBC,YAAoB;IACnD,MAAMC,iBAAiBC;IACvB,IAAI,CAACD,eAAeE,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,EAAEC,QAAQ,CAACN,eAAe;QAC7DH,MAAM,CAAC,CAAC,EAAEG,aAAa,0BAA0B,CAAC;QAClDF,KAAK,CAAC,iBAAiB,EAAEG,eAAeE,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,EAAEE,IAAI,CAAC,MAAM,CAAC;QACvE,OAAO;IACT;IACA,OAAO;AACT;AAEA,OAAO,SAASL;IACd,OAAO;QACL;YACEG,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK;QACP;QACA;YACEL,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK;QACP;QACA;YACEL,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK;QACP;QACA;YACEL,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK;QACP;QACA;YACEL,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK;QACP;QACA;YACEL,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK;QACP;QACA;YACEL,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK;QACP;KACD;AACH"}
1
+ {"version":3,"sources":["../../src/lib/templates.ts"],"sourcesContent":["import type { ProjectTemplate } from '../types.js'\n\nimport { error, info } from '../utils/log.js'\n\nexport function validateTemplate(templateName: string): boolean {\n const validTemplates = getValidTemplates()\n if (!validTemplates.map((t) => t.name).includes(templateName)) {\n error(`'${templateName}' is not a valid template.`)\n info(`Valid templates: ${validTemplates.map((t) => t.name).join(', ')}`)\n return false\n }\n return true\n}\n\nexport function getValidTemplates(): ProjectTemplate[] {\n return [\n {\n name: 'blank-3.0',\n type: 'starter',\n description: 'Blank 3.0 Template',\n url: 'https://github.com/payloadcms/payload/templates/blank-3.0#beta',\n },\n\n // Remove these until they have been updated for 3.0\n\n // {\n // name: 'blank',\n // type: 'starter',\n // description: 'Blank Template',\n // url: 'https://github.com/payloadcms/payload/templates/blank',\n // },\n // {\n // name: 'website',\n // type: 'starter',\n // description: 'Website Template',\n // url: 'https://github.com/payloadcms/payload/templates/website',\n // },\n // {\n // name: 'ecommerce',\n // type: 'starter',\n // description: 'E-commerce Template',\n // url: 'https://github.com/payloadcms/payload/templates/ecommerce',\n // },\n {\n name: 'plugin',\n type: 'plugin',\n description: 'Template for creating a Payload plugin',\n url: 'https://github.com/payloadcms/payload-plugin-template#beta',\n },\n // {\n // name: 'payload-demo',\n // type: 'starter',\n // description: 'Payload demo site at https://demo.payloadcms.com',\n // url: 'https://github.com/payloadcms/public-demo',\n // },\n // {\n // name: 'payload-website',\n // type: 'starter',\n // description: 'Payload website CMS at https://payloadcms.com',\n // url: 'https://github.com/payloadcms/website-cms',\n // },\n ]\n}\n"],"names":["error","info","validateTemplate","templateName","validTemplates","getValidTemplates","map","t","name","includes","join","type","description","url"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAEA,SAASA,KAAK,EAAEC,IAAI,QAAQ,kBAAiB;AAE7C,OAAO,SAASC,iBAAiBC,YAAoB;IACnD,MAAMC,iBAAiBC;IACvB,IAAI,CAACD,eAAeE,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,EAAEC,QAAQ,CAACN,eAAe;QAC7DH,MAAM,CAAC,CAAC,EAAEG,aAAa,0BAA0B,CAAC;QAClDF,KAAK,CAAC,iBAAiB,EAAEG,eAAeE,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,EAAEE,IAAI,CAAC,MAAM,CAAC;QACvE,OAAO;IACT;IACA,OAAO;AACT;AAEA,OAAO,SAASL;IACd,OAAO;QACL;YACEG,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK;QACP;QAEA,oDAAoD;QAEpD,IAAI;QACJ,mBAAmB;QACnB,qBAAqB;QACrB,mCAAmC;QACnC,kEAAkE;QAClE,KAAK;QACL,IAAI;QACJ,qBAAqB;QACrB,qBAAqB;QACrB,qCAAqC;QACrC,oEAAoE;QACpE,KAAK;QACL,IAAI;QACJ,uBAAuB;QACvB,qBAAqB;QACrB,wCAAwC;QACxC,sEAAsE;QACtE,KAAK;QACL;YACEL,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK;QACP;KAaD;AACH"}
@@ -1,12 +1,18 @@
1
- export declare const withPayloadImportStatement = "import { withPayload } from '@payloadcms/next'\n";
1
+ export declare const withPayloadStatement: {
2
+ cjs: string;
3
+ esm: string;
4
+ };
5
+ type NextConfigType = 'cjs' | 'esm';
2
6
  export declare const wrapNextConfig: (args: {
3
7
  nextConfigPath: string;
8
+ nextConfigType: NextConfigType;
4
9
  }) => void;
5
10
  /**
6
11
  * Parses config content with AST and wraps it with withPayload function
7
12
  */
8
- export declare function parseAndModifyConfigContent(content: string): {
13
+ export declare function parseAndModifyConfigContent(content: string, configType: NextConfigType): {
9
14
  modifiedConfigContent: string;
10
15
  success: boolean;
11
16
  };
17
+ export {};
12
18
  //# sourceMappingURL=wrap-next-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wrap-next-config.d.ts","sourceRoot":"","sources":["../../src/lib/wrap-next-config.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,0BAA0B,qDAAqD,CAAA;AAE5F,eAAO,MAAM,cAAc,SAAU;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,SAU9D,CAAA;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG;IAC5D,qBAAqB,EAAE,MAAM,CAAA;IAC7B,OAAO,EAAE,OAAO,CAAA;CACjB,CAgDA"}
1
+ {"version":3,"file":"wrap-next-config.d.ts","sourceRoot":"","sources":["../../src/lib/wrap-next-config.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,oBAAoB;;;CAGhC,CAAA;AAED,KAAK,cAAc,GAAG,KAAK,GAAG,KAAK,CAAA;AAEnC,eAAO,MAAM,cAAc,SAAU;IACnC,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,cAAc,CAAA;CAC/B,SAaA,CAAA;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,cAAc,GACzB;IAAE,qBAAqB,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAiGrD"}
@@ -1,13 +1,16 @@
1
1
  import chalk from 'chalk';
2
- import { parseModule } from 'esprima';
2
+ import { Syntax, parseModule } from 'esprima-next';
3
3
  import fs from 'fs';
4
4
  import { warning } from '../utils/log.js';
5
5
  import { log } from '../utils/log.js';
6
- export const withPayloadImportStatement = `import { withPayload } from '@payloadcms/next'\n`;
6
+ export const withPayloadStatement = {
7
+ cjs: `const { withPayload } = require('@payloadcms/next/withPayload')\n`,
8
+ esm: `import { withPayload } from '@payloadcms/next/withPayload'\n`
9
+ };
7
10
  export const wrapNextConfig = (args)=>{
8
- const { nextConfigPath } = args;
11
+ const { nextConfigPath, nextConfigType: configType } = args;
9
12
  const configContent = fs.readFileSync(nextConfigPath, 'utf8');
10
- const { modifiedConfigContent: newConfig, success } = parseAndModifyConfigContent(configContent);
13
+ const { modifiedConfigContent: newConfig, success } = parseAndModifyConfigContent(configContent, configType);
11
14
  if (!success) {
12
15
  return;
13
16
  }
@@ -15,54 +18,88 @@ export const wrapNextConfig = (args)=>{
15
18
  };
16
19
  /**
17
20
  * Parses config content with AST and wraps it with withPayload function
18
- */ export function parseAndModifyConfigContent(content) {
19
- content = withPayloadImportStatement + content;
20
- const ast = parseModule(content, {
21
- loc: true
22
- });
23
- const exportDefaultDeclaration = ast.body.find((p)=>p.type === 'ExportDefaultDeclaration');
24
- const exportNamedDeclaration = ast.body.find((p)=>p.type === 'ExportNamedDeclaration');
25
- if (!exportDefaultDeclaration && !exportNamedDeclaration) {
26
- throw new Error('Could not find ExportDefaultDeclaration in next.config.js');
21
+ */ export function parseAndModifyConfigContent(content, configType) {
22
+ content = withPayloadStatement[configType] + content;
23
+ let ast;
24
+ try {
25
+ ast = parseModule(content, {
26
+ loc: true
27
+ });
28
+ } catch (error) {
29
+ if (error instanceof Error) {
30
+ warning(`Unable to parse Next config. Error: ${error.message} `);
31
+ warnUserWrapNotSuccessful(configType);
32
+ }
33
+ return {
34
+ modifiedConfigContent: content,
35
+ success: false
36
+ };
27
37
  }
28
- if (exportDefaultDeclaration && exportDefaultDeclaration.declaration?.loc) {
29
- const modifiedConfigContent = insertBeforeAndAfter(content, exportDefaultDeclaration.declaration.loc);
38
+ if (configType === 'esm') {
39
+ const exportDefaultDeclaration = ast.body.find((p)=>p.type === Syntax.ExportDefaultDeclaration);
40
+ const exportNamedDeclaration = ast.body.find((p)=>p.type === Syntax.ExportNamedDeclaration);
41
+ if (!exportDefaultDeclaration && !exportNamedDeclaration) {
42
+ throw new Error('Could not find ExportDefaultDeclaration in next.config.js');
43
+ }
44
+ if (exportDefaultDeclaration && exportDefaultDeclaration.declaration?.loc) {
45
+ const modifiedConfigContent = insertBeforeAndAfter(content, exportDefaultDeclaration.declaration.loc);
46
+ return {
47
+ modifiedConfigContent,
48
+ success: true
49
+ };
50
+ } else if (exportNamedDeclaration) {
51
+ const exportSpecifier = exportNamedDeclaration.specifiers.find((s)=>s.type === 'ExportSpecifier' && s.exported?.name === 'default' && s.local?.type === 'Identifier' && s.local?.name);
52
+ if (exportSpecifier) {
53
+ warning('Could not automatically wrap next.config.js with withPayload.');
54
+ warning('Automatic wrapping of named exports as default not supported yet.');
55
+ warnUserWrapNotSuccessful(configType);
56
+ return {
57
+ modifiedConfigContent: content,
58
+ success: false
59
+ };
60
+ }
61
+ }
62
+ warning('Could not automatically wrap Next config with withPayload.');
63
+ warnUserWrapNotSuccessful(configType);
30
64
  return {
31
- modifiedConfigContent,
32
- success: true
65
+ modifiedConfigContent: content,
66
+ success: false
33
67
  };
34
- } else if (exportNamedDeclaration) {
35
- const exportSpecifier = exportNamedDeclaration.specifiers.find((s)=>s.type === 'ExportSpecifier' && s.exported?.name === 'default' && s.local?.type === 'Identifier' && s.local?.name);
36
- if (exportSpecifier) {
37
- warning('Could not automatically wrap next.config.js with withPayload.');
38
- warning('Automatic wrapping of named exports as default not supported yet.');
39
- warnUserWrapNotSuccessful();
68
+ } else if (configType === 'cjs') {
69
+ // Find `module.exports = X`
70
+ const moduleExports = ast.body.find((p)=>p.type === Syntax.ExpressionStatement && p.expression?.type === Syntax.AssignmentExpression && p.expression.left?.type === Syntax.MemberExpression && p.expression.left.object?.type === Syntax.Identifier && p.expression.left.object.name === 'module' && p.expression.left.property?.type === Syntax.Identifier && p.expression.left.property.name === 'exports');
71
+ if (moduleExports && moduleExports.expression.right?.loc) {
72
+ const modifiedConfigContent = insertBeforeAndAfter(content, moduleExports.expression.right.loc);
40
73
  return {
41
- modifiedConfigContent: content,
42
- success: false
74
+ modifiedConfigContent,
75
+ success: true
43
76
  };
44
77
  }
78
+ return {
79
+ modifiedConfigContent: content,
80
+ success: false
81
+ };
45
82
  }
46
- warning('Could not automatically wrap next.config.js with withPayload.');
47
- warnUserWrapNotSuccessful();
83
+ warning('Could not automatically wrap Next config with withPayload.');
84
+ warnUserWrapNotSuccessful(configType);
48
85
  return {
49
86
  modifiedConfigContent: content,
50
87
  success: false
51
88
  };
52
89
  }
53
- function warnUserWrapNotSuccessful() {
90
+ function warnUserWrapNotSuccessful(configType) {
54
91
  // Output directions for user to update next.config.js
55
92
  const withPayloadMessage = `
56
93
 
57
94
  ${chalk.bold(`Please manually wrap your existing next.config.js with the withPayload function. Here is an example:`)}
58
95
 
59
- import withPayload from '@payloadcms/next/withPayload'
96
+ ${withPayloadStatement[configType]}
60
97
 
61
98
  const nextConfig = {
62
99
  // Your Next.js config here
63
100
  }
64
101
 
65
- export default withPayload(nextConfig)
102
+ ${configType === 'esm' ? 'export default withPayload(nextConfig)' : 'module.exports = withPayload(nextConfig)'}
66
103
 
67
104
  `;
68
105
  log(withPayloadMessage);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/wrap-next-config.ts"],"sourcesContent":["import chalk from 'chalk'\nimport { parseModule } from 'esprima'\nimport fs from 'fs'\n\nimport { warning } from '../utils/log.js'\nimport { log } from '../utils/log.js'\n\nexport const withPayloadImportStatement = `import { withPayload } from '@payloadcms/next'\\n`\n\nexport const wrapNextConfig = (args: { nextConfigPath: string }) => {\n const { nextConfigPath } = args\n const configContent = fs.readFileSync(nextConfigPath, 'utf8')\n const { modifiedConfigContent: newConfig, success } = parseAndModifyConfigContent(configContent)\n\n if (!success) {\n return\n }\n\n fs.writeFileSync(nextConfigPath, newConfig)\n}\n\n/**\n * Parses config content with AST and wraps it with withPayload function\n */\nexport function parseAndModifyConfigContent(content: string): {\n modifiedConfigContent: string\n success: boolean\n} {\n content = withPayloadImportStatement + content\n const ast = parseModule(content, { loc: true })\n const exportDefaultDeclaration = ast.body.find((p) => p.type === 'ExportDefaultDeclaration') as\n | Directive\n | undefined\n\n const exportNamedDeclaration = ast.body.find((p) => p.type === 'ExportNamedDeclaration') as\n | ExportNamedDeclaration\n | undefined\n\n if (!exportDefaultDeclaration && !exportNamedDeclaration) {\n throw new Error('Could not find ExportDefaultDeclaration in next.config.js')\n }\n\n if (exportDefaultDeclaration && exportDefaultDeclaration.declaration?.loc) {\n const modifiedConfigContent = insertBeforeAndAfter(\n content,\n exportDefaultDeclaration.declaration.loc,\n )\n return { modifiedConfigContent, success: true }\n } else if (exportNamedDeclaration) {\n const exportSpecifier = exportNamedDeclaration.specifiers.find(\n (s) =>\n s.type === 'ExportSpecifier' &&\n s.exported?.name === 'default' &&\n s.local?.type === 'Identifier' &&\n s.local?.name,\n )\n\n if (exportSpecifier) {\n warning('Could not automatically wrap next.config.js with withPayload.')\n warning('Automatic wrapping of named exports as default not supported yet.')\n\n warnUserWrapNotSuccessful()\n return {\n modifiedConfigContent: content,\n success: false,\n }\n }\n }\n\n warning('Could not automatically wrap next.config.js with withPayload.')\n warnUserWrapNotSuccessful()\n return {\n modifiedConfigContent: content,\n success: false,\n }\n}\n\nfunction warnUserWrapNotSuccessful() {\n // Output directions for user to update next.config.js\n const withPayloadMessage = `\n\n ${chalk.bold(`Please manually wrap your existing next.config.js with the withPayload function. Here is an example:`)}\n\n import withPayload from '@payloadcms/next/withPayload'\n\n const nextConfig = {\n // Your Next.js config here\n }\n\n export default withPayload(nextConfig)\n\n`\n\n log(withPayloadMessage)\n}\n\ntype Directive = {\n declaration?: {\n loc: Loc\n }\n}\n\ntype ExportNamedDeclaration = {\n declaration: null\n loc: Loc\n specifiers: {\n exported: {\n loc: Loc\n name: string\n type: string\n }\n loc: Loc\n local: {\n loc: Loc\n name: string\n type: string\n }\n type: string\n }[]\n type: string\n}\n\ntype Loc = {\n end: { column: number; line: number }\n start: { column: number; line: number }\n}\n\nfunction insertBeforeAndAfter(content: string, loc: Loc) {\n const { end, start } = loc\n const lines = content.split('\\n')\n\n const insert = (line: string, column: number, text: string) => {\n return line.slice(0, column) + text + line.slice(column)\n }\n\n // insert ) after end\n lines[end.line - 1] = insert(lines[end.line - 1], end.column, ')')\n // insert withPayload before start\n if (start.line === end.line) {\n lines[end.line - 1] = insert(lines[end.line - 1], start.column, 'withPayload(')\n } else {\n lines[start.line - 1] = insert(lines[start.line - 1], start.column, 'withPayload(')\n }\n\n return lines.join('\\n')\n}\n"],"names":["chalk","parseModule","fs","warning","log","withPayloadImportStatement","wrapNextConfig","args","nextConfigPath","configContent","readFileSync","modifiedConfigContent","newConfig","success","parseAndModifyConfigContent","writeFileSync","content","ast","loc","exportDefaultDeclaration","body","find","p","type","exportNamedDeclaration","Error","declaration","insertBeforeAndAfter","exportSpecifier","specifiers","s","exported","name","local","warnUserWrapNotSuccessful","withPayloadMessage","bold","end","start","lines","split","insert","line","column","text","slice","join"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/wrap-next-config.ts"],"sourcesContent":["import type { Program } from 'esprima-next'\n\nimport chalk from 'chalk'\nimport { Syntax, parseModule } from 'esprima-next'\nimport fs from 'fs'\n\nimport { warning } from '../utils/log.js'\nimport { log } from '../utils/log.js'\n\nexport const withPayloadStatement = {\n cjs: `const { withPayload } = require('@payloadcms/next/withPayload')\\n`,\n esm: `import { withPayload } from '@payloadcms/next/withPayload'\\n`,\n}\n\ntype NextConfigType = 'cjs' | 'esm'\n\nexport const wrapNextConfig = (args: {\n nextConfigPath: string\n nextConfigType: NextConfigType\n}) => {\n const { nextConfigPath, nextConfigType: configType } = args\n const configContent = fs.readFileSync(nextConfigPath, 'utf8')\n const { modifiedConfigContent: newConfig, success } = parseAndModifyConfigContent(\n configContent,\n configType,\n )\n\n if (!success) {\n return\n }\n\n fs.writeFileSync(nextConfigPath, newConfig)\n}\n\n/**\n * Parses config content with AST and wraps it with withPayload function\n */\nexport function parseAndModifyConfigContent(\n content: string,\n configType: NextConfigType,\n): { modifiedConfigContent: string; success: boolean } {\n content = withPayloadStatement[configType] + content\n\n let ast: Program | undefined\n try {\n ast = parseModule(content, { loc: true })\n } catch (error: unknown) {\n if (error instanceof Error) {\n warning(`Unable to parse Next config. Error: ${error.message} `)\n warnUserWrapNotSuccessful(configType)\n }\n return {\n modifiedConfigContent: content,\n success: false,\n }\n }\n\n if (configType === 'esm') {\n const exportDefaultDeclaration = ast.body.find(\n (p) => p.type === Syntax.ExportDefaultDeclaration,\n ) as Directive | undefined\n\n const exportNamedDeclaration = ast.body.find(\n (p) => p.type === Syntax.ExportNamedDeclaration,\n ) as ExportNamedDeclaration | undefined\n\n if (!exportDefaultDeclaration && !exportNamedDeclaration) {\n throw new Error('Could not find ExportDefaultDeclaration in next.config.js')\n }\n\n if (exportDefaultDeclaration && exportDefaultDeclaration.declaration?.loc) {\n const modifiedConfigContent = insertBeforeAndAfter(\n content,\n exportDefaultDeclaration.declaration.loc,\n )\n return { modifiedConfigContent, success: true }\n } else if (exportNamedDeclaration) {\n const exportSpecifier = exportNamedDeclaration.specifiers.find(\n (s) =>\n s.type === 'ExportSpecifier' &&\n s.exported?.name === 'default' &&\n s.local?.type === 'Identifier' &&\n s.local?.name,\n )\n\n if (exportSpecifier) {\n warning('Could not automatically wrap next.config.js with withPayload.')\n warning('Automatic wrapping of named exports as default not supported yet.')\n\n warnUserWrapNotSuccessful(configType)\n return {\n modifiedConfigContent: content,\n success: false,\n }\n }\n }\n\n warning('Could not automatically wrap Next config with withPayload.')\n warnUserWrapNotSuccessful(configType)\n return {\n modifiedConfigContent: content,\n success: false,\n }\n } else if (configType === 'cjs') {\n // Find `module.exports = X`\n const moduleExports = ast.body.find(\n (p) =>\n p.type === Syntax.ExpressionStatement &&\n p.expression?.type === Syntax.AssignmentExpression &&\n p.expression.left?.type === Syntax.MemberExpression &&\n p.expression.left.object?.type === Syntax.Identifier &&\n p.expression.left.object.name === 'module' &&\n p.expression.left.property?.type === Syntax.Identifier &&\n p.expression.left.property.name === 'exports',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as any\n\n if (moduleExports && moduleExports.expression.right?.loc) {\n const modifiedConfigContent = insertBeforeAndAfter(\n content,\n moduleExports.expression.right.loc,\n )\n return { modifiedConfigContent, success: true }\n }\n\n return {\n modifiedConfigContent: content,\n success: false,\n }\n }\n\n warning('Could not automatically wrap Next config with withPayload.')\n warnUserWrapNotSuccessful(configType)\n return {\n modifiedConfigContent: content,\n success: false,\n }\n}\n\nfunction warnUserWrapNotSuccessful(configType: NextConfigType) {\n // Output directions for user to update next.config.js\n const withPayloadMessage = `\n\n ${chalk.bold(`Please manually wrap your existing next.config.js with the withPayload function. Here is an example:`)}\n\n ${withPayloadStatement[configType]}\n\n const nextConfig = {\n // Your Next.js config here\n }\n\n ${configType === 'esm' ? 'export default withPayload(nextConfig)' : 'module.exports = withPayload(nextConfig)'}\n\n`\n\n log(withPayloadMessage)\n}\n\ntype Directive = {\n declaration?: {\n loc: Loc\n }\n}\n\ntype ExportNamedDeclaration = {\n declaration: null\n loc: Loc\n specifiers: {\n exported: {\n loc: Loc\n name: string\n type: string\n }\n loc: Loc\n local: {\n loc: Loc\n name: string\n type: string\n }\n type: string\n }[]\n type: string\n}\n\ntype Loc = {\n end: { column: number; line: number }\n start: { column: number; line: number }\n}\n\nfunction insertBeforeAndAfter(content: string, loc: Loc) {\n const { end, start } = loc\n const lines = content.split('\\n')\n\n const insert = (line: string, column: number, text: string) => {\n return line.slice(0, column) + text + line.slice(column)\n }\n\n // insert ) after end\n lines[end.line - 1] = insert(lines[end.line - 1], end.column, ')')\n // insert withPayload before start\n if (start.line === end.line) {\n lines[end.line - 1] = insert(lines[end.line - 1], start.column, 'withPayload(')\n } else {\n lines[start.line - 1] = insert(lines[start.line - 1], start.column, 'withPayload(')\n }\n\n return lines.join('\\n')\n}\n"],"names":["chalk","Syntax","parseModule","fs","warning","log","withPayloadStatement","cjs","esm","wrapNextConfig","args","nextConfigPath","nextConfigType","configType","configContent","readFileSync","modifiedConfigContent","newConfig","success","parseAndModifyConfigContent","writeFileSync","content","ast","loc","error","Error","message","warnUserWrapNotSuccessful","exportDefaultDeclaration","body","find","p","type","ExportDefaultDeclaration","exportNamedDeclaration","ExportNamedDeclaration","declaration","insertBeforeAndAfter","exportSpecifier","specifiers","s","exported","name","local","moduleExports","ExpressionStatement","expression","AssignmentExpression","left","MemberExpression","object","Identifier","property","right","withPayloadMessage","bold","end","start","lines","split","insert","line","column","text","slice","join"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1,52 +1,115 @@
1
- import { parseAndModifyConfigContent, withPayloadImportStatement } from './wrap-next-config.js';
1
+ import { parseAndModifyConfigContent, withPayloadStatement } from './wrap-next-config.js';
2
2
  import * as p from '@clack/prompts';
3
- const defaultNextConfig = `/** @type {import('next').NextConfig} */
3
+ const esmConfigs = {
4
+ defaultNextConfig: `/** @type {import('next').NextConfig} */
4
5
  const nextConfig = {};
5
-
6
6
  export default nextConfig;
7
- `;
8
- const nextConfigWithFunc = `const nextConfig = {
9
- // Your Next.js config here
10
- }
11
-
12
- export default someFunc(nextConfig)
13
- `;
14
- const nextConfigWithFuncMultiline = `const nextConfig = {
15
- // Your Next.js config here
16
- }
17
-
7
+ `,
8
+ nextConfigWithFunc: `const nextConfig = {};
9
+ export default someFunc(nextConfig);
10
+ `,
11
+ nextConfigWithFuncMultiline: `const nextConfig = {};;
18
12
  export default someFunc(
19
13
  nextConfig
20
- )
21
- `;
22
- const nextConfigExportNamedDefault = `const nextConfig = {
23
- // Your Next.js config here
24
- }
25
- const wrapped = someFunc(asdf)
26
- export { wrapped as default }
27
- `;
14
+ );
15
+ `,
16
+ nextConfigExportNamedDefault: `const nextConfig = {};
17
+ const wrapped = someFunc(asdf);
18
+ export { wrapped as default };
19
+ `,
20
+ nextConfigWithSpread: `const nextConfig = {
21
+ ...someConfig,
22
+ };
23
+ export default nextConfig;
24
+ `
25
+ };
26
+ const cjsConfigs = {
27
+ defaultNextConfig: `
28
+ /** @type {import('next').NextConfig} */
29
+ const nextConfig = {};
30
+ module.exports = nextConfig;
31
+ `,
32
+ anonConfig: `module.exports = {};`,
33
+ nextConfigWithFunc: `const nextConfig = {};
34
+ module.exports = someFunc(nextConfig);
35
+ `,
36
+ nextConfigWithFuncMultiline: `const nextConfig = {};
37
+ module.exports = someFunc(
38
+ nextConfig
39
+ );
40
+ `,
41
+ nextConfigExportNamedDefault: `const nextConfig = {};
42
+ const wrapped = someFunc(asdf);
43
+ module.exports = wrapped;
44
+ `,
45
+ nextConfigWithSpread: `const nextConfig = { ...someConfig };
46
+ module.exports = nextConfig;
47
+ `
48
+ };
28
49
  describe('parseAndInsertWithPayload', ()=>{
29
- it('should parse the default next config', ()=>{
30
- const { modifiedConfigContent } = parseAndModifyConfigContent(defaultNextConfig);
31
- expect(modifiedConfigContent).toContain(withPayloadImportStatement);
32
- expect(modifiedConfigContent).toContain('withPayload(nextConfig)');
33
- });
34
- it('should parse the config with a function', ()=>{
35
- const { modifiedConfigContent } = parseAndModifyConfigContent(nextConfigWithFunc);
36
- expect(modifiedConfigContent).toContain('withPayload(someFunc(nextConfig))');
37
- });
38
- it('should parse the config with a function on a new line', ()=>{
39
- const { modifiedConfigContent } = parseAndModifyConfigContent(nextConfigWithFuncMultiline);
40
- expect(modifiedConfigContent).toContain(withPayloadImportStatement);
41
- expect(modifiedConfigContent).toMatch(/withPayload\(someFunc\(\n nextConfig\n\)\)/);
50
+ describe('esm', ()=>{
51
+ const configType = 'esm';
52
+ const importStatement = withPayloadStatement[configType];
53
+ it('should parse the default next config', ()=>{
54
+ const { modifiedConfigContent } = parseAndModifyConfigContent(esmConfigs.defaultNextConfig, configType);
55
+ expect(modifiedConfigContent).toContain(importStatement);
56
+ expect(modifiedConfigContent).toContain('withPayload(nextConfig)');
57
+ });
58
+ it('should parse the config with a function', ()=>{
59
+ const { modifiedConfigContent } = parseAndModifyConfigContent(esmConfigs.nextConfigWithFunc, configType);
60
+ expect(modifiedConfigContent).toContain('withPayload(someFunc(nextConfig))');
61
+ });
62
+ it('should parse the config with a function on a new line', ()=>{
63
+ const { modifiedConfigContent } = parseAndModifyConfigContent(esmConfigs.nextConfigWithFuncMultiline, configType);
64
+ expect(modifiedConfigContent).toContain(importStatement);
65
+ expect(modifiedConfigContent).toMatch(/withPayload\(someFunc\(\n nextConfig\n\)\)/);
66
+ });
67
+ it('should parse the config with a spread', ()=>{
68
+ const { modifiedConfigContent } = parseAndModifyConfigContent(esmConfigs.nextConfigWithSpread, configType);
69
+ expect(modifiedConfigContent).toContain(importStatement);
70
+ expect(modifiedConfigContent).toContain('withPayload(nextConfig)');
71
+ });
72
+ // Unsupported: export { wrapped as default }
73
+ it('should give warning with a named export as default', ()=>{
74
+ const warnLogSpy = jest.spyOn(p.log, 'warn').mockImplementation(()=>{});
75
+ const { modifiedConfigContent, success } = parseAndModifyConfigContent(esmConfigs.nextConfigExportNamedDefault, configType);
76
+ expect(modifiedConfigContent).toContain(importStatement);
77
+ expect(success).toBe(false);
78
+ expect(warnLogSpy).toHaveBeenCalledWith(expect.stringContaining('Could not automatically wrap'));
79
+ });
42
80
  });
43
- // Unsupported: export { wrapped as default }
44
- it('should give warning with a named export as default', ()=>{
45
- const warnLogSpy = jest.spyOn(p.log, 'warn').mockImplementation(()=>{});
46
- const { modifiedConfigContent, success } = parseAndModifyConfigContent(nextConfigExportNamedDefault);
47
- expect(modifiedConfigContent).toContain(withPayloadImportStatement);
48
- expect(success).toBe(false);
49
- expect(warnLogSpy).toHaveBeenCalledWith(expect.stringContaining('Could not automatically wrap'));
81
+ describe('cjs', ()=>{
82
+ const configType = 'cjs';
83
+ const requireStatement = withPayloadStatement[configType];
84
+ it('should parse the default next config', ()=>{
85
+ const { modifiedConfigContent } = parseAndModifyConfigContent(cjsConfigs.defaultNextConfig, configType);
86
+ expect(modifiedConfigContent).toContain(requireStatement);
87
+ expect(modifiedConfigContent).toContain('withPayload(nextConfig)');
88
+ });
89
+ it('should parse anonymous default config', ()=>{
90
+ const { modifiedConfigContent } = parseAndModifyConfigContent(cjsConfigs.anonConfig, configType);
91
+ expect(modifiedConfigContent).toContain(requireStatement);
92
+ expect(modifiedConfigContent).toContain('withPayload({})');
93
+ });
94
+ it('should parse the config with a function', ()=>{
95
+ const { modifiedConfigContent } = parseAndModifyConfigContent(cjsConfigs.nextConfigWithFunc, configType);
96
+ expect(modifiedConfigContent).toContain('withPayload(someFunc(nextConfig))');
97
+ });
98
+ it('should parse the config with a function on a new line', ()=>{
99
+ const { modifiedConfigContent } = parseAndModifyConfigContent(cjsConfigs.nextConfigWithFuncMultiline, configType);
100
+ expect(modifiedConfigContent).toContain(requireStatement);
101
+ expect(modifiedConfigContent).toMatch(/withPayload\(someFunc\(\n nextConfig\n\)\)/);
102
+ });
103
+ it('should parse the config with a named export as default', ()=>{
104
+ const { modifiedConfigContent } = parseAndModifyConfigContent(cjsConfigs.nextConfigExportNamedDefault, configType);
105
+ expect(modifiedConfigContent).toContain(requireStatement);
106
+ expect(modifiedConfigContent).toContain('withPayload(wrapped)');
107
+ });
108
+ it('should parse the config with a spread', ()=>{
109
+ const { modifiedConfigContent } = parseAndModifyConfigContent(cjsConfigs.nextConfigWithSpread, configType);
110
+ expect(modifiedConfigContent).toContain(requireStatement);
111
+ expect(modifiedConfigContent).toContain('withPayload(nextConfig)');
112
+ });
50
113
  });
51
114
  });
52
115
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/wrap-next-config.spec.ts"],"sourcesContent":["import { parseAndModifyConfigContent, withPayloadImportStatement } from './wrap-next-config.js'\nimport * as p from '@clack/prompts'\n\nconst defaultNextConfig = `/** @type {import('next').NextConfig} */\nconst nextConfig = {};\n\nexport default nextConfig;\n`\n\nconst nextConfigWithFunc = `const nextConfig = {\n // Your Next.js config here\n}\n\nexport default someFunc(nextConfig)\n`\nconst nextConfigWithFuncMultiline = `const nextConfig = {\n // Your Next.js config here\n}\n\nexport default someFunc(\n nextConfig\n)\n`\n\nconst nextConfigExportNamedDefault = `const nextConfig = {\n // Your Next.js config here\n}\nconst wrapped = someFunc(asdf)\nexport { wrapped as default }\n`\n\ndescribe('parseAndInsertWithPayload', () => {\n it('should parse the default next config', () => {\n const { modifiedConfigContent } = parseAndModifyConfigContent(defaultNextConfig)\n expect(modifiedConfigContent).toContain(withPayloadImportStatement)\n expect(modifiedConfigContent).toContain('withPayload(nextConfig)')\n })\n it('should parse the config with a function', () => {\n const { modifiedConfigContent } = parseAndModifyConfigContent(nextConfigWithFunc)\n expect(modifiedConfigContent).toContain('withPayload(someFunc(nextConfig))')\n })\n\n it('should parse the config with a function on a new line', () => {\n const { modifiedConfigContent } = parseAndModifyConfigContent(nextConfigWithFuncMultiline)\n expect(modifiedConfigContent).toContain(withPayloadImportStatement)\n expect(modifiedConfigContent).toMatch(/withPayload\\(someFunc\\(\\n nextConfig\\n\\)\\)/)\n })\n\n // Unsupported: export { wrapped as default }\n it('should give warning with a named export as default', () => {\n const warnLogSpy = jest.spyOn(p.log, 'warn').mockImplementation(() => {})\n\n const { modifiedConfigContent, success } = parseAndModifyConfigContent(\n nextConfigExportNamedDefault,\n )\n expect(modifiedConfigContent).toContain(withPayloadImportStatement)\n expect(success).toBe(false)\n\n expect(warnLogSpy).toHaveBeenCalledWith(expect.stringContaining('Could not automatically wrap'))\n })\n})\n"],"names":["parseAndModifyConfigContent","withPayloadImportStatement","p","defaultNextConfig","nextConfigWithFunc","nextConfigWithFuncMultiline","nextConfigExportNamedDefault","describe","it","modifiedConfigContent","expect","toContain","toMatch","warnLogSpy","jest","spyOn","log","mockImplementation","success","toBe","toHaveBeenCalledWith","stringContaining"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,2BAA2B,EAAEC,0BAA0B,QAAQ,wBAAuB;AAC/F,YAAYC,OAAO,iBAAgB;AAEnC,MAAMC,oBAAoB,CAAC;;;;AAI3B,CAAC;AAED,MAAMC,qBAAqB,CAAC;;;;;AAK5B,CAAC;AACD,MAAMC,8BAA8B,CAAC;;;;;;;AAOrC,CAAC;AAED,MAAMC,+BAA+B,CAAC;;;;;AAKtC,CAAC;AAEDC,SAAS,6BAA6B;IACpCC,GAAG,wCAAwC;QACzC,MAAM,EAAEC,qBAAqB,EAAE,GAAGT,4BAA4BG;QAC9DO,OAAOD,uBAAuBE,SAAS,CAACV;QACxCS,OAAOD,uBAAuBE,SAAS,CAAC;IAC1C;IACAH,GAAG,2CAA2C;QAC5C,MAAM,EAAEC,qBAAqB,EAAE,GAAGT,4BAA4BI;QAC9DM,OAAOD,uBAAuBE,SAAS,CAAC;IAC1C;IAEAH,GAAG,yDAAyD;QAC1D,MAAM,EAAEC,qBAAqB,EAAE,GAAGT,4BAA4BK;QAC9DK,OAAOD,uBAAuBE,SAAS,CAACV;QACxCS,OAAOD,uBAAuBG,OAAO,CAAC;IACxC;IAEA,6CAA6C;IAC7CJ,GAAG,sDAAsD;QACvD,MAAMK,aAAaC,KAAKC,KAAK,CAACb,EAAEc,GAAG,EAAE,QAAQC,kBAAkB,CAAC,KAAO;QAEvE,MAAM,EAAER,qBAAqB,EAAES,OAAO,EAAE,GAAGlB,4BACzCM;QAEFI,OAAOD,uBAAuBE,SAAS,CAACV;QACxCS,OAAOQ,SAASC,IAAI,CAAC;QAErBT,OAAOG,YAAYO,oBAAoB,CAACV,OAAOW,gBAAgB,CAAC;IAClE;AACF"}
1
+ {"version":3,"sources":["../../src/lib/wrap-next-config.spec.ts"],"sourcesContent":["import { parseAndModifyConfigContent, withPayloadStatement } from './wrap-next-config.js'\nimport * as p from '@clack/prompts'\n\nconst esmConfigs = {\n defaultNextConfig: `/** @type {import('next').NextConfig} */\nconst nextConfig = {};\nexport default nextConfig;\n`,\n nextConfigWithFunc: `const nextConfig = {};\nexport default someFunc(nextConfig);\n`,\n nextConfigWithFuncMultiline: `const nextConfig = {};;\nexport default someFunc(\n nextConfig\n);\n`,\n nextConfigExportNamedDefault: `const nextConfig = {};\nconst wrapped = someFunc(asdf);\nexport { wrapped as default };\n`,\n nextConfigWithSpread: `const nextConfig = {\n ...someConfig,\n};\nexport default nextConfig;\n`,\n}\n\nconst cjsConfigs = {\n defaultNextConfig: `\n /** @type {import('next').NextConfig} */\nconst nextConfig = {};\nmodule.exports = nextConfig;\n`,\n anonConfig: `module.exports = {};`,\n nextConfigWithFunc: `const nextConfig = {};\nmodule.exports = someFunc(nextConfig);\n`,\n nextConfigWithFuncMultiline: `const nextConfig = {};\nmodule.exports = someFunc(\n nextConfig\n);\n`,\n nextConfigExportNamedDefault: `const nextConfig = {};\nconst wrapped = someFunc(asdf);\nmodule.exports = wrapped;\n`,\n nextConfigWithSpread: `const nextConfig = { ...someConfig };\nmodule.exports = nextConfig;\n`,\n}\n\ndescribe('parseAndInsertWithPayload', () => {\n describe('esm', () => {\n const configType = 'esm'\n const importStatement = withPayloadStatement[configType]\n it('should parse the default next config', () => {\n const { modifiedConfigContent } = parseAndModifyConfigContent(\n esmConfigs.defaultNextConfig,\n configType,\n )\n expect(modifiedConfigContent).toContain(importStatement)\n expect(modifiedConfigContent).toContain('withPayload(nextConfig)')\n })\n it('should parse the config with a function', () => {\n const { modifiedConfigContent } = parseAndModifyConfigContent(\n esmConfigs.nextConfigWithFunc,\n configType,\n )\n expect(modifiedConfigContent).toContain('withPayload(someFunc(nextConfig))')\n })\n\n it('should parse the config with a function on a new line', () => {\n const { modifiedConfigContent } = parseAndModifyConfigContent(\n esmConfigs.nextConfigWithFuncMultiline,\n configType,\n )\n expect(modifiedConfigContent).toContain(importStatement)\n expect(modifiedConfigContent).toMatch(/withPayload\\(someFunc\\(\\n nextConfig\\n\\)\\)/)\n })\n\n it('should parse the config with a spread', () => {\n const { modifiedConfigContent } = parseAndModifyConfigContent(\n esmConfigs.nextConfigWithSpread,\n configType,\n )\n expect(modifiedConfigContent).toContain(importStatement)\n expect(modifiedConfigContent).toContain('withPayload(nextConfig)')\n })\n\n // Unsupported: export { wrapped as default }\n it('should give warning with a named export as default', () => {\n const warnLogSpy = jest.spyOn(p.log, 'warn').mockImplementation(() => {})\n\n const { modifiedConfigContent, success } = parseAndModifyConfigContent(\n esmConfigs.nextConfigExportNamedDefault,\n configType,\n )\n expect(modifiedConfigContent).toContain(importStatement)\n expect(success).toBe(false)\n\n expect(warnLogSpy).toHaveBeenCalledWith(\n expect.stringContaining('Could not automatically wrap'),\n )\n })\n })\n\n describe('cjs', () => {\n const configType = 'cjs'\n const requireStatement = withPayloadStatement[configType]\n it('should parse the default next config', () => {\n const { modifiedConfigContent } = parseAndModifyConfigContent(\n cjsConfigs.defaultNextConfig,\n configType,\n )\n expect(modifiedConfigContent).toContain(requireStatement)\n expect(modifiedConfigContent).toContain('withPayload(nextConfig)')\n })\n it('should parse anonymous default config', () => {\n const { modifiedConfigContent } = parseAndModifyConfigContent(\n cjsConfigs.anonConfig,\n configType,\n )\n expect(modifiedConfigContent).toContain(requireStatement)\n expect(modifiedConfigContent).toContain('withPayload({})')\n })\n it('should parse the config with a function', () => {\n const { modifiedConfigContent } = parseAndModifyConfigContent(\n cjsConfigs.nextConfigWithFunc,\n configType,\n )\n expect(modifiedConfigContent).toContain('withPayload(someFunc(nextConfig))')\n })\n it('should parse the config with a function on a new line', () => {\n const { modifiedConfigContent } = parseAndModifyConfigContent(\n cjsConfigs.nextConfigWithFuncMultiline,\n configType,\n )\n expect(modifiedConfigContent).toContain(requireStatement)\n expect(modifiedConfigContent).toMatch(/withPayload\\(someFunc\\(\\n nextConfig\\n\\)\\)/)\n })\n it('should parse the config with a named export as default', () => {\n const { modifiedConfigContent } = parseAndModifyConfigContent(\n cjsConfigs.nextConfigExportNamedDefault,\n configType,\n )\n expect(modifiedConfigContent).toContain(requireStatement)\n expect(modifiedConfigContent).toContain('withPayload(wrapped)')\n })\n\n it('should parse the config with a spread', () => {\n const { modifiedConfigContent } = parseAndModifyConfigContent(\n cjsConfigs.nextConfigWithSpread,\n configType,\n )\n expect(modifiedConfigContent).toContain(requireStatement)\n expect(modifiedConfigContent).toContain('withPayload(nextConfig)')\n })\n })\n})\n"],"names":["parseAndModifyConfigContent","withPayloadStatement","p","esmConfigs","defaultNextConfig","nextConfigWithFunc","nextConfigWithFuncMultiline","nextConfigExportNamedDefault","nextConfigWithSpread","cjsConfigs","anonConfig","describe","configType","importStatement","it","modifiedConfigContent","expect","toContain","toMatch","warnLogSpy","jest","spyOn","log","mockImplementation","success","toBe","toHaveBeenCalledWith","stringContaining","requireStatement"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"write-env-file.d.ts","sourceRoot":"","sources":["../../src/lib/write-env-file.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAI3D,wDAAwD;AACxD,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,eAAe,CAAA;CAC3B,GAAG,OAAO,CAAC,IAAI,CAAC,CA6ChB"}
1
+ {"version":3,"file":"write-env-file.d.ts","sourceRoot":"","sources":["../../src/lib/write-env-file.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAI3D,wDAAwD;AACxD,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,eAAe,CAAA;CAC3B,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDhB"}
@@ -7,25 +7,32 @@ import { debug, error } from '../utils/log.js';
7
7
  debug(`DRY RUN: .env file created`);
8
8
  return;
9
9
  }
10
+ const envOutputPath = path.join(projectDir, '.env');
10
11
  try {
11
- if (template?.type === 'starter' && fs.existsSync(path.join(projectDir, '.env.example'))) {
12
- // Parse .env file into key/value pairs
13
- const envFile = await fs.readFile(path.join(projectDir, '.env.example'), 'utf8');
14
- const envWithValues = envFile.split('\n').filter((e)=>e).map((line)=>{
15
- if (line.startsWith('#') || !line.includes('=')) return line;
16
- const split = line.split('=');
17
- const key = split[0];
18
- let value = split[1];
19
- if (key === 'MONGODB_URI' || key === 'MONGO_URL' || key === 'DATABASE_URI') {
20
- value = databaseUri;
21
- }
22
- if (key === 'PAYLOAD_SECRET' || key === 'PAYLOAD_SECRET_KEY') {
23
- value = payloadSecret;
24
- }
25
- return `${key}=${value}`;
26
- });
27
- // Write new .env file
28
- await fs.writeFile(path.join(projectDir, '.env'), envWithValues.join('\n'));
12
+ if (fs.existsSync(envOutputPath)) {
13
+ if (template?.type === 'starter') {
14
+ // Parse .env file into key/value pairs
15
+ const envFile = await fs.readFile(path.join(projectDir, '.env.example'), 'utf8');
16
+ const envWithValues = envFile.split('\n').filter((e)=>e).map((line)=>{
17
+ if (line.startsWith('#') || !line.includes('=')) return line;
18
+ const split = line.split('=');
19
+ const key = split[0];
20
+ let value = split[1];
21
+ if (key === 'MONGODB_URI' || key === 'MONGO_URL' || key === 'DATABASE_URI') {
22
+ value = databaseUri;
23
+ }
24
+ if (key === 'PAYLOAD_SECRET' || key === 'PAYLOAD_SECRET_KEY') {
25
+ value = payloadSecret;
26
+ }
27
+ return `${key}=${value}`;
28
+ });
29
+ // Write new .env file
30
+ await fs.writeFile(envOutputPath, envWithValues.join('\n'));
31
+ } else {
32
+ const existingEnv = await fs.readFile(envOutputPath, 'utf8');
33
+ const newEnv = existingEnv + `\nDATABASE_URI=${databaseUri}\nPAYLOAD_SECRET=${payloadSecret}\n`;
34
+ await fs.writeFile(envOutputPath, newEnv);
35
+ }
29
36
  } else {
30
37
  const content = `DATABASE_URI=${databaseUri}\nPAYLOAD_SECRET=${payloadSecret}`;
31
38
  await fs.outputFile(`${projectDir}/.env`, content);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/write-env-file.ts"],"sourcesContent":["import fs from 'fs-extra'\nimport path from 'path'\n\nimport type { CliArgs, ProjectTemplate } from '../types.js'\n\nimport { debug, error } from '../utils/log.js'\n\n/** Parse and swap .env.example values and write .env */\nexport async function writeEnvFile(args: {\n cliArgs: CliArgs\n databaseUri: string\n payloadSecret: string\n projectDir: string\n template?: ProjectTemplate\n}): Promise<void> {\n const { cliArgs, databaseUri, payloadSecret, projectDir, template } = args\n\n if (cliArgs['--dry-run']) {\n debug(`DRY RUN: .env file created`)\n return\n }\n\n try {\n if (template?.type === 'starter' && fs.existsSync(path.join(projectDir, '.env.example'))) {\n // Parse .env file into key/value pairs\n const envFile = await fs.readFile(path.join(projectDir, '.env.example'), 'utf8')\n const envWithValues: string[] = envFile\n .split('\\n')\n .filter((e) => e)\n .map((line) => {\n if (line.startsWith('#') || !line.includes('=')) return line\n\n const split = line.split('=')\n const key = split[0]\n let value = split[1]\n\n if (key === 'MONGODB_URI' || key === 'MONGO_URL' || key === 'DATABASE_URI') {\n value = databaseUri\n }\n if (key === 'PAYLOAD_SECRET' || key === 'PAYLOAD_SECRET_KEY') {\n value = payloadSecret\n }\n\n return `${key}=${value}`\n })\n\n // Write new .env file\n await fs.writeFile(path.join(projectDir, '.env'), envWithValues.join('\\n'))\n } else {\n const content = `DATABASE_URI=${databaseUri}\\nPAYLOAD_SECRET=${payloadSecret}`\n await fs.outputFile(`${projectDir}/.env`, content)\n }\n } catch (err: unknown) {\n error('Unable to write .env file')\n if (err instanceof Error) {\n error(err.message)\n }\n process.exit(1)\n }\n}\n"],"names":["fs","path","debug","error","writeEnvFile","args","cliArgs","databaseUri","payloadSecret","projectDir","template","type","existsSync","join","envFile","readFile","envWithValues","split","filter","e","map","line","startsWith","includes","key","value","writeFile","content","outputFile","err","Error","message","process","exit"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,OAAOA,QAAQ,WAAU;AACzB,OAAOC,UAAU,OAAM;AAIvB,SAASC,KAAK,EAAEC,KAAK,QAAQ,kBAAiB;AAE9C,sDAAsD,GACtD,OAAO,eAAeC,aAAaC,IAMlC;IACC,MAAM,EAAEC,OAAO,EAAEC,WAAW,EAAEC,aAAa,EAAEC,UAAU,EAAEC,QAAQ,EAAE,GAAGL;IAEtE,IAAIC,OAAO,CAAC,YAAY,EAAE;QACxBJ,MAAM,CAAC,0BAA0B,CAAC;QAClC;IACF;IAEA,IAAI;QACF,IAAIQ,UAAUC,SAAS,aAAaX,GAAGY,UAAU,CAACX,KAAKY,IAAI,CAACJ,YAAY,kBAAkB;YACxF,uCAAuC;YACvC,MAAMK,UAAU,MAAMd,GAAGe,QAAQ,CAACd,KAAKY,IAAI,CAACJ,YAAY,iBAAiB;YACzE,MAAMO,gBAA0BF,QAC7BG,KAAK,CAAC,MACNC,MAAM,CAAC,CAACC,IAAMA,GACdC,GAAG,CAAC,CAACC;gBACJ,IAAIA,KAAKC,UAAU,CAAC,QAAQ,CAACD,KAAKE,QAAQ,CAAC,MAAM,OAAOF;gBAExD,MAAMJ,QAAQI,KAAKJ,KAAK,CAAC;gBACzB,MAAMO,MAAMP,KAAK,CAAC,EAAE;gBACpB,IAAIQ,QAAQR,KAAK,CAAC,EAAE;gBAEpB,IAAIO,QAAQ,iBAAiBA,QAAQ,eAAeA,QAAQ,gBAAgB;oBAC1EC,QAAQlB;gBACV;gBACA,IAAIiB,QAAQ,oBAAoBA,QAAQ,sBAAsB;oBAC5DC,QAAQjB;gBACV;gBAEA,OAAO,CAAC,EAAEgB,IAAI,CAAC,EAAEC,MAAM,CAAC;YAC1B;YAEF,sBAAsB;YACtB,MAAMzB,GAAG0B,SAAS,CAACzB,KAAKY,IAAI,CAACJ,YAAY,SAASO,cAAcH,IAAI,CAAC;QACvE,OAAO;YACL,MAAMc,UAAU,CAAC,aAAa,EAAEpB,YAAY,iBAAiB,EAAEC,cAAc,CAAC;YAC9E,MAAMR,GAAG4B,UAAU,CAAC,CAAC,EAAEnB,WAAW,KAAK,CAAC,EAAEkB;QAC5C;IACF,EAAE,OAAOE,KAAc;QACrB1B,MAAM;QACN,IAAI0B,eAAeC,OAAO;YACxB3B,MAAM0B,IAAIE,OAAO;QACnB;QACAC,QAAQC,IAAI,CAAC;IACf;AACF"}
1
+ {"version":3,"sources":["../../src/lib/write-env-file.ts"],"sourcesContent":["import fs from 'fs-extra'\nimport path from 'path'\n\nimport type { CliArgs, ProjectTemplate } from '../types.js'\n\nimport { debug, error } from '../utils/log.js'\n\n/** Parse and swap .env.example values and write .env */\nexport async function writeEnvFile(args: {\n cliArgs: CliArgs\n databaseUri: string\n payloadSecret: string\n projectDir: string\n template?: ProjectTemplate\n}): Promise<void> {\n const { cliArgs, databaseUri, payloadSecret, projectDir, template } = args\n\n if (cliArgs['--dry-run']) {\n debug(`DRY RUN: .env file created`)\n return\n }\n\n const envOutputPath = path.join(projectDir, '.env')\n\n try {\n if (fs.existsSync(envOutputPath)) {\n if (template?.type === 'starter') {\n // Parse .env file into key/value pairs\n const envFile = await fs.readFile(path.join(projectDir, '.env.example'), 'utf8')\n const envWithValues: string[] = envFile\n .split('\\n')\n .filter((e) => e)\n .map((line) => {\n if (line.startsWith('#') || !line.includes('=')) return line\n\n const split = line.split('=')\n const key = split[0]\n let value = split[1]\n\n if (key === 'MONGODB_URI' || key === 'MONGO_URL' || key === 'DATABASE_URI') {\n value = databaseUri\n }\n if (key === 'PAYLOAD_SECRET' || key === 'PAYLOAD_SECRET_KEY') {\n value = payloadSecret\n }\n\n return `${key}=${value}`\n })\n\n // Write new .env file\n await fs.writeFile(envOutputPath, envWithValues.join('\\n'))\n } else {\n const existingEnv = await fs.readFile(envOutputPath, 'utf8')\n const newEnv =\n existingEnv + `\\nDATABASE_URI=${databaseUri}\\nPAYLOAD_SECRET=${payloadSecret}\\n`\n await fs.writeFile(envOutputPath, newEnv)\n }\n } else {\n const content = `DATABASE_URI=${databaseUri}\\nPAYLOAD_SECRET=${payloadSecret}`\n await fs.outputFile(`${projectDir}/.env`, content)\n }\n } catch (err: unknown) {\n error('Unable to write .env file')\n if (err instanceof Error) {\n error(err.message)\n }\n process.exit(1)\n }\n}\n"],"names":["fs","path","debug","error","writeEnvFile","args","cliArgs","databaseUri","payloadSecret","projectDir","template","envOutputPath","join","existsSync","type","envFile","readFile","envWithValues","split","filter","e","map","line","startsWith","includes","key","value","writeFile","existingEnv","newEnv","content","outputFile","err","Error","message","process","exit"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,OAAOA,QAAQ,WAAU;AACzB,OAAOC,UAAU,OAAM;AAIvB,SAASC,KAAK,EAAEC,KAAK,QAAQ,kBAAiB;AAE9C,sDAAsD,GACtD,OAAO,eAAeC,aAAaC,IAMlC;IACC,MAAM,EAAEC,OAAO,EAAEC,WAAW,EAAEC,aAAa,EAAEC,UAAU,EAAEC,QAAQ,EAAE,GAAGL;IAEtE,IAAIC,OAAO,CAAC,YAAY,EAAE;QACxBJ,MAAM,CAAC,0BAA0B,CAAC;QAClC;IACF;IAEA,MAAMS,gBAAgBV,KAAKW,IAAI,CAACH,YAAY;IAE5C,IAAI;QACF,IAAIT,GAAGa,UAAU,CAACF,gBAAgB;YAChC,IAAID,UAAUI,SAAS,WAAW;gBAChC,uCAAuC;gBACvC,MAAMC,UAAU,MAAMf,GAAGgB,QAAQ,CAACf,KAAKW,IAAI,CAACH,YAAY,iBAAiB;gBACzE,MAAMQ,gBAA0BF,QAC7BG,KAAK,CAAC,MACNC,MAAM,CAAC,CAACC,IAAMA,GACdC,GAAG,CAAC,CAACC;oBACJ,IAAIA,KAAKC,UAAU,CAAC,QAAQ,CAACD,KAAKE,QAAQ,CAAC,MAAM,OAAOF;oBAExD,MAAMJ,QAAQI,KAAKJ,KAAK,CAAC;oBACzB,MAAMO,MAAMP,KAAK,CAAC,EAAE;oBACpB,IAAIQ,QAAQR,KAAK,CAAC,EAAE;oBAEpB,IAAIO,QAAQ,iBAAiBA,QAAQ,eAAeA,QAAQ,gBAAgB;wBAC1EC,QAAQnB;oBACV;oBACA,IAAIkB,QAAQ,oBAAoBA,QAAQ,sBAAsB;wBAC5DC,QAAQlB;oBACV;oBAEA,OAAO,CAAC,EAAEiB,IAAI,CAAC,EAAEC,MAAM,CAAC;gBAC1B;gBAEF,sBAAsB;gBACtB,MAAM1B,GAAG2B,SAAS,CAAChB,eAAeM,cAAcL,IAAI,CAAC;YACvD,OAAO;gBACL,MAAMgB,cAAc,MAAM5B,GAAGgB,QAAQ,CAACL,eAAe;gBACrD,MAAMkB,SACJD,cAAc,CAAC,eAAe,EAAErB,YAAY,iBAAiB,EAAEC,cAAc,EAAE,CAAC;gBAClF,MAAMR,GAAG2B,SAAS,CAAChB,eAAekB;YACpC;QACF,OAAO;YACL,MAAMC,UAAU,CAAC,aAAa,EAAEvB,YAAY,iBAAiB,EAAEC,cAAc,CAAC;YAC9E,MAAMR,GAAG+B,UAAU,CAAC,CAAC,EAAEtB,WAAW,KAAK,CAAC,EAAEqB;QAC5C;IACF,EAAE,OAAOE,KAAc;QACrB7B,MAAM;QACN,IAAI6B,eAAeC,OAAO;YACxB9B,MAAM6B,IAAIE,OAAO;QACnB;QACAC,QAAQC,IAAI,CAAC;IACf;AACF"}
@@ -1,6 +1,6 @@
1
1
  import { mongooseAdapter } from '@payloadcms/db-mongodb' // database-adapter-import
2
2
  // import { payloadCloud } from '@payloadcms/plugin-cloud'
3
- import { lexicalEditor } from '@payloadcms/richtext-lexical' // editor-import
3
+ import { lexicalEditor } from '@payloadcms/richtext-lexical'
4
4
  import path from 'path'
5
5
  import { buildConfig } from 'payload/config'
6
6
  // import sharp from 'sharp'
@@ -27,6 +27,7 @@ export default buildConfig({
27
27
  url: process.env.DATABASE_URI || '',
28
28
  }),
29
29
  // database-adapter-config-end
30
+
30
31
  // Sharp is now an optional dependency -
31
32
  // if you want to resize images, crop, set focal point, etc.
32
33
  // make sure to install it and pass it to the config.
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/utils/messages.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAMjD,eAAO,MAAM,cAAc,QAE1B,CAAA;AAID,wBAAgB,WAAW,IAAI,IAAI,CAsBlC;AAQD,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,MAAM,CAsBzF;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAO3C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAapF;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/utils/messages.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAMjD,eAAO,MAAM,cAAc,QAE1B,CAAA;AAID,wBAAgB,WAAW,IAAI,IAAI,CA4BlC;AAQD,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,MAAM,CAsBzF;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAO3C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAgBpF;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -12,6 +12,12 @@ export function helpMessage() {
12
12
  console.log(chalk`
13
13
  {bold USAGE}
14
14
 
15
+ {dim Inside of an existing Next.js project}
16
+
17
+ {dim $} {bold npx create-payload-app}
18
+
19
+ {dim Create a new project from scratch}
20
+
15
21
  {dim $} {bold npx create-payload-app}
16
22
  {dim $} {bold npx create-payload-app} my-project
17
23
  {dim $} {bold npx create-payload-app} -n my-project -t template-name
@@ -54,7 +60,7 @@ export function successfulNextInit() {
54
60
  `;
55
61
  }
56
62
  export function moveMessage(args) {
57
- const relativePath = path.relative(process.cwd(), args.nextAppDir);
63
+ const relativeAppDir = path.relative(process.cwd(), args.nextAppDir);
58
64
  return `
59
65
  ${header('Next Steps:')}
60
66
 
@@ -62,7 +68,10 @@ Payload does not support a top-level layout.tsx file in the app directory.
62
68
 
63
69
  ${chalk.bold('To continue:')}
64
70
 
65
- Move all files from ./${relativePath} to a named directory such as ./${relativePath}/${chalk.bold('(app)')}
71
+ - Create a new directory in ./${relativeAppDir} such as ./${relativeAppDir}/${chalk.bold('(app)')}
72
+ - Move all files from ./${relativeAppDir} into that directory
73
+
74
+ It is recommended to do this from your IDE if your app has existing file references.
66
75
 
67
76
  Once moved, rerun the create-payload-app command again.
68
77
  `;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/messages.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport chalk from 'chalk'\nimport path from 'path'\nimport terminalLink from 'terminal-link'\n\nimport type { ProjectTemplate } from '../types.js'\nimport type { PackageManager } from '../types.js'\n\nimport { getValidTemplates } from '../lib/templates.js'\n\nconst header = (message: string): string => chalk.bold(message)\n\nexport const welcomeMessage = chalk`\n {green Welcome to Payload. Let's create a project! }\n`\n\nconst spacer = ' '.repeat(8)\n\nexport function helpMessage(): void {\n const validTemplates = getValidTemplates()\n console.log(chalk`\n {bold USAGE}\n\n {dim $} {bold npx create-payload-app}\n {dim $} {bold npx create-payload-app} my-project\n {dim $} {bold npx create-payload-app} -n my-project -t template-name\n\n {bold OPTIONS}\n\n -n {underline my-payload-app} Set project name\n -t {underline template_name} Choose specific template\n\n {dim Available templates: ${formatTemplates(validTemplates)}}\n\n --use-npm Use npm to install dependencies\n --use-yarn Use yarn to install dependencies\n --use-pnpm Use pnpm to install dependencies\n --no-deps Do not install any dependencies\n -h Show help\n`)\n}\n\nfunction formatTemplates(templates: ProjectTemplate[]) {\n return `\\n\\n${spacer}${templates\n .map((t) => `${t.name}${' '.repeat(28 - t.name.length)}${t.description}`)\n .join(`\\n${spacer}`)}`\n}\n\nexport function successMessage(projectDir: string, packageManager: PackageManager): string {\n const relativePath = path.relative(process.cwd(), projectDir)\n return `\n${header('Launch Application:')}\n\n - cd ./${relativePath}\n - ${\n packageManager === 'npm' ? 'npm run' : packageManager\n } dev or follow directions in ${createTerminalLink(\n 'README.md',\n `file://${path.resolve(projectDir, 'README.md')}`,\n )}\n\n${header('Documentation:')}\n\n - ${createTerminalLink(\n 'Getting Started',\n 'https://payloadcms.com/docs/getting-started/what-is-payload',\n )}\n - ${createTerminalLink('Configuration', 'https://payloadcms.com/docs/configuration/overview')}\n\n`\n}\n\nexport function successfulNextInit(): string {\n return `- ${createTerminalLink(\n 'Getting Started',\n 'https://payloadcms.com/docs/getting-started/what-is-payload',\n )}\n- ${createTerminalLink('Configuration', 'https://payloadcms.com/docs/configuration/overview')}\n`\n}\n\nexport function moveMessage(args: { nextAppDir: string; projectDir: string }): string {\n const relativePath = path.relative(process.cwd(), args.nextAppDir)\n return `\n${header('Next Steps:')}\n\nPayload does not support a top-level layout.tsx file in the app directory.\n\n${chalk.bold('To continue:')}\n\nMove all files from ./${relativePath} to a named directory such as ./${relativePath}/${chalk.bold('(app)')}\n\nOnce moved, rerun the create-payload-app command again.\n`\n}\n\nexport function feedbackOutro(): string {\n return `${chalk.bgCyan(chalk.black(' Have feedback? '))} Visit us on ${createTerminalLink('GitHub', 'https://github.com/payloadcms/payload')}.`\n}\n\n// Create terminalLink with fallback for unsupported terminals\nfunction createTerminalLink(text: string, url: string) {\n return terminalLink(text, url, {\n fallback: (text, url) => `${text}: ${url}`,\n })\n}\n"],"names":["chalk","path","terminalLink","getValidTemplates","header","message","bold","welcomeMessage","spacer","repeat","helpMessage","validTemplates","console","log","formatTemplates","templates","map","t","name","length","description","join","successMessage","projectDir","packageManager","relativePath","relative","process","cwd","createTerminalLink","resolve","successfulNextInit","moveMessage","args","nextAppDir","feedbackOutro","bgCyan","black","text","url","fallback"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,6BAA6B,GAC7B,OAAOA,WAAW,QAAO;AACzB,OAAOC,UAAU,OAAM;AACvB,OAAOC,kBAAkB,gBAAe;AAKxC,SAASC,iBAAiB,QAAQ,sBAAqB;AAEvD,MAAMC,SAAS,CAACC,UAA4BL,MAAMM,IAAI,CAACD;AAEvD,OAAO,MAAME,iBAAiBP,KAAK,CAAC;;AAEpC,CAAC,CAAA;AAED,MAAMQ,SAAS,IAAIC,MAAM,CAAC;AAE1B,OAAO,SAASC;IACd,MAAMC,iBAAiBR;IACvBS,QAAQC,GAAG,CAACb,KAAK,CAAC;;;;;;;;;;;;kCAYc,EAAEc,gBAAgBH,gBAAgB;;;;;;;AAOpE,CAAC;AACD;AAEA,SAASG,gBAAgBC,SAA4B;IACnD,OAAO,CAAC,IAAI,EAAEP,OAAO,EAAEO,UACpBC,GAAG,CAAC,CAACC,IAAM,CAAC,EAAEA,EAAEC,IAAI,CAAC,EAAE,IAAIT,MAAM,CAAC,KAAKQ,EAAEC,IAAI,CAACC,MAAM,EAAE,EAAEF,EAAEG,WAAW,CAAC,CAAC,EACvEC,IAAI,CAAC,CAAC,EAAE,EAAEb,OAAO,CAAC,EAAE,CAAC;AAC1B;AAEA,OAAO,SAASc,eAAeC,UAAkB,EAAEC,cAA8B;IAC/E,MAAMC,eAAexB,KAAKyB,QAAQ,CAACC,QAAQC,GAAG,IAAIL;IAClD,OAAO,CAAC;AACV,EAAEnB,OAAO,uBAAuB;;SAEvB,EAAEqB,aAAa;IACpB,EACAD,mBAAmB,QAAQ,YAAYA,eACxC,6BAA6B,EAAEK,mBAC9B,aACA,CAAC,OAAO,EAAE5B,KAAK6B,OAAO,CAACP,YAAY,aAAa,CAAC,EACjD;;AAEJ,EAAEnB,OAAO,kBAAkB;;IAEvB,EAAEyB,mBACF,mBACA,+DACA;IACA,EAAEA,mBAAmB,iBAAiB,sDAAsD;;AAEhG,CAAC;AACD;AAEA,OAAO,SAASE;IACd,OAAO,CAAC,EAAE,EAAEF,mBACV,mBACA,+DACA;EACF,EAAEA,mBAAmB,iBAAiB,sDAAsD;AAC9F,CAAC;AACD;AAEA,OAAO,SAASG,YAAYC,IAAgD;IAC1E,MAAMR,eAAexB,KAAKyB,QAAQ,CAACC,QAAQC,GAAG,IAAIK,KAAKC,UAAU;IACjE,OAAO,CAAC;AACV,EAAE9B,OAAO,eAAe;;;;AAIxB,EAAEJ,MAAMM,IAAI,CAAC,gBAAgB;;sBAEP,EAAEmB,aAAa,gCAAgC,EAAEA,aAAa,CAAC,EAAEzB,MAAMM,IAAI,CAAC,SAAS;;;AAG3G,CAAC;AACD;AAEA,OAAO,SAAS6B;IACd,OAAO,CAAC,EAAEnC,MAAMoC,MAAM,CAACpC,MAAMqC,KAAK,CAAC,qBAAqB,aAAa,EAAER,mBAAmB,UAAU,yCAAyC,CAAC,CAAC;AACjJ;AAEA,8DAA8D;AAC9D,SAASA,mBAAmBS,IAAY,EAAEC,GAAW;IACnD,OAAOrC,aAAaoC,MAAMC,KAAK;QAC7BC,UAAU,CAACF,MAAMC,MAAQ,CAAC,EAAED,KAAK,EAAE,EAAEC,IAAI,CAAC;IAC5C;AACF"}
1
+ {"version":3,"sources":["../../src/utils/messages.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport chalk from 'chalk'\nimport path from 'path'\nimport terminalLink from 'terminal-link'\n\nimport type { ProjectTemplate } from '../types.js'\nimport type { PackageManager } from '../types.js'\n\nimport { getValidTemplates } from '../lib/templates.js'\n\nconst header = (message: string): string => chalk.bold(message)\n\nexport const welcomeMessage = chalk`\n {green Welcome to Payload. Let's create a project! }\n`\n\nconst spacer = ' '.repeat(8)\n\nexport function helpMessage(): void {\n const validTemplates = getValidTemplates()\n console.log(chalk`\n {bold USAGE}\n\n {dim Inside of an existing Next.js project}\n\n {dim $} {bold npx create-payload-app}\n\n {dim Create a new project from scratch}\n\n {dim $} {bold npx create-payload-app}\n {dim $} {bold npx create-payload-app} my-project\n {dim $} {bold npx create-payload-app} -n my-project -t template-name\n\n {bold OPTIONS}\n\n -n {underline my-payload-app} Set project name\n -t {underline template_name} Choose specific template\n\n {dim Available templates: ${formatTemplates(validTemplates)}}\n\n --use-npm Use npm to install dependencies\n --use-yarn Use yarn to install dependencies\n --use-pnpm Use pnpm to install dependencies\n --no-deps Do not install any dependencies\n -h Show help\n`)\n}\n\nfunction formatTemplates(templates: ProjectTemplate[]) {\n return `\\n\\n${spacer}${templates\n .map((t) => `${t.name}${' '.repeat(28 - t.name.length)}${t.description}`)\n .join(`\\n${spacer}`)}`\n}\n\nexport function successMessage(projectDir: string, packageManager: PackageManager): string {\n const relativePath = path.relative(process.cwd(), projectDir)\n return `\n${header('Launch Application:')}\n\n - cd ./${relativePath}\n - ${\n packageManager === 'npm' ? 'npm run' : packageManager\n } dev or follow directions in ${createTerminalLink(\n 'README.md',\n `file://${path.resolve(projectDir, 'README.md')}`,\n )}\n\n${header('Documentation:')}\n\n - ${createTerminalLink(\n 'Getting Started',\n 'https://payloadcms.com/docs/getting-started/what-is-payload',\n )}\n - ${createTerminalLink('Configuration', 'https://payloadcms.com/docs/configuration/overview')}\n\n`\n}\n\nexport function successfulNextInit(): string {\n return `- ${createTerminalLink(\n 'Getting Started',\n 'https://payloadcms.com/docs/getting-started/what-is-payload',\n )}\n- ${createTerminalLink('Configuration', 'https://payloadcms.com/docs/configuration/overview')}\n`\n}\n\nexport function moveMessage(args: { nextAppDir: string; projectDir: string }): string {\n const relativeAppDir = path.relative(process.cwd(), args.nextAppDir)\n return `\n${header('Next Steps:')}\n\nPayload does not support a top-level layout.tsx file in the app directory.\n\n${chalk.bold('To continue:')}\n\n- Create a new directory in ./${relativeAppDir} such as ./${relativeAppDir}/${chalk.bold('(app)')}\n- Move all files from ./${relativeAppDir} into that directory\n\nIt is recommended to do this from your IDE if your app has existing file references.\n\nOnce moved, rerun the create-payload-app command again.\n`\n}\n\nexport function feedbackOutro(): string {\n return `${chalk.bgCyan(chalk.black(' Have feedback? '))} Visit us on ${createTerminalLink('GitHub', 'https://github.com/payloadcms/payload')}.`\n}\n\n// Create terminalLink with fallback for unsupported terminals\nfunction createTerminalLink(text: string, url: string) {\n return terminalLink(text, url, {\n fallback: (text, url) => `${text}: ${url}`,\n })\n}\n"],"names":["chalk","path","terminalLink","getValidTemplates","header","message","bold","welcomeMessage","spacer","repeat","helpMessage","validTemplates","console","log","formatTemplates","templates","map","t","name","length","description","join","successMessage","projectDir","packageManager","relativePath","relative","process","cwd","createTerminalLink","resolve","successfulNextInit","moveMessage","args","relativeAppDir","nextAppDir","feedbackOutro","bgCyan","black","text","url","fallback"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,6BAA6B,GAC7B,OAAOA,WAAW,QAAO;AACzB,OAAOC,UAAU,OAAM;AACvB,OAAOC,kBAAkB,gBAAe;AAKxC,SAASC,iBAAiB,QAAQ,sBAAqB;AAEvD,MAAMC,SAAS,CAACC,UAA4BL,MAAMM,IAAI,CAACD;AAEvD,OAAO,MAAME,iBAAiBP,KAAK,CAAC;;AAEpC,CAAC,CAAA;AAED,MAAMQ,SAAS,IAAIC,MAAM,CAAC;AAE1B,OAAO,SAASC;IACd,MAAMC,iBAAiBR;IACvBS,QAAQC,GAAG,CAACb,KAAK,CAAC;;;;;;;;;;;;;;;;;;kCAkBc,EAAEc,gBAAgBH,gBAAgB;;;;;;;AAOpE,CAAC;AACD;AAEA,SAASG,gBAAgBC,SAA4B;IACnD,OAAO,CAAC,IAAI,EAAEP,OAAO,EAAEO,UACpBC,GAAG,CAAC,CAACC,IAAM,CAAC,EAAEA,EAAEC,IAAI,CAAC,EAAE,IAAIT,MAAM,CAAC,KAAKQ,EAAEC,IAAI,CAACC,MAAM,EAAE,EAAEF,EAAEG,WAAW,CAAC,CAAC,EACvEC,IAAI,CAAC,CAAC,EAAE,EAAEb,OAAO,CAAC,EAAE,CAAC;AAC1B;AAEA,OAAO,SAASc,eAAeC,UAAkB,EAAEC,cAA8B;IAC/E,MAAMC,eAAexB,KAAKyB,QAAQ,CAACC,QAAQC,GAAG,IAAIL;IAClD,OAAO,CAAC;AACV,EAAEnB,OAAO,uBAAuB;;SAEvB,EAAEqB,aAAa;IACpB,EACAD,mBAAmB,QAAQ,YAAYA,eACxC,6BAA6B,EAAEK,mBAC9B,aACA,CAAC,OAAO,EAAE5B,KAAK6B,OAAO,CAACP,YAAY,aAAa,CAAC,EACjD;;AAEJ,EAAEnB,OAAO,kBAAkB;;IAEvB,EAAEyB,mBACF,mBACA,+DACA;IACA,EAAEA,mBAAmB,iBAAiB,sDAAsD;;AAEhG,CAAC;AACD;AAEA,OAAO,SAASE;IACd,OAAO,CAAC,EAAE,EAAEF,mBACV,mBACA,+DACA;EACF,EAAEA,mBAAmB,iBAAiB,sDAAsD;AAC9F,CAAC;AACD;AAEA,OAAO,SAASG,YAAYC,IAAgD;IAC1E,MAAMC,iBAAiBjC,KAAKyB,QAAQ,CAACC,QAAQC,GAAG,IAAIK,KAAKE,UAAU;IACnE,OAAO,CAAC;AACV,EAAE/B,OAAO,eAAe;;;;AAIxB,EAAEJ,MAAMM,IAAI,CAAC,gBAAgB;;8BAEC,EAAE4B,eAAe,WAAW,EAAEA,eAAe,CAAC,EAAElC,MAAMM,IAAI,CAAC,SAAS;wBAC1E,EAAE4B,eAAe;;;;;AAKzC,CAAC;AACD;AAEA,OAAO,SAASE;IACd,OAAO,CAAC,EAAEpC,MAAMqC,MAAM,CAACrC,MAAMsC,KAAK,CAAC,qBAAqB,aAAa,EAAET,mBAAmB,UAAU,yCAAyC,CAAC,CAAC;AACjJ;AAEA,8DAA8D;AAC9D,SAASA,mBAAmBU,IAAY,EAAEC,GAAW;IACnD,OAAOtC,aAAaqC,MAAMC,KAAK;QAC7BC,UAAU,CAACF,MAAMC,MAAQ,CAAC,EAAED,KAAK,EAAE,EAAEC,IAAI,CAAC;IAC5C;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-payload-app",
3
- "version": "3.0.0-alpha.61",
3
+ "version": "3.0.0-alpha.63",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "homepage": "https://payloadcms.com",
@@ -26,7 +26,7 @@
26
26
  "comment-json": "^4.2.3",
27
27
  "degit": "^2.8.4",
28
28
  "detect-package-manager": "^3.0.1",
29
- "esprima": "^4.0.1",
29
+ "esprima-next": "^6.0.3",
30
30
  "execa": "^5.0.0",
31
31
  "figures": "^6.1.0",
32
32
  "fs-extra": "^9.0.1",