create-payload-app 3.91.0-internal.c1569dc → 4.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +5 -0
  3. package/dist/commands.d.ts +4 -0
  4. package/dist/commands.d.ts.map +1 -0
  5. package/dist/commands.js +5 -0
  6. package/dist/commands.js.map +1 -0
  7. package/dist/lib/agent-config.d.ts +12 -0
  8. package/dist/lib/agent-config.d.ts.map +1 -0
  9. package/dist/lib/agent-config.js +15 -0
  10. package/dist/lib/agent-config.js.map +1 -0
  11. package/dist/lib/ast/adapter-config.d.ts.map +1 -1
  12. package/dist/lib/ast/adapter-config.js +0 -10
  13. package/dist/lib/ast/adapter-config.js.map +1 -1
  14. package/dist/lib/ast/package-json.d.ts +9 -0
  15. package/dist/lib/ast/package-json.d.ts.map +1 -1
  16. package/dist/lib/ast/package-json.js +34 -8
  17. package/dist/lib/ast/package-json.js.map +1 -1
  18. package/dist/lib/ast/payload-config.js +1 -1
  19. package/dist/lib/ast/payload-config.js.map +1 -1
  20. package/dist/lib/ast/types.d.ts +3 -3
  21. package/dist/lib/ast/types.d.ts.map +1 -1
  22. package/dist/lib/ast/types.js +0 -1
  23. package/dist/lib/ast/types.js.map +1 -1
  24. package/dist/lib/configure-payload-tsconfig.d.ts +5 -0
  25. package/dist/lib/configure-payload-tsconfig.d.ts.map +1 -0
  26. package/dist/lib/configure-payload-tsconfig.js +26 -0
  27. package/dist/lib/configure-payload-tsconfig.js.map +1 -0
  28. package/dist/lib/create-project.d.ts +1 -2
  29. package/dist/lib/create-project.d.ts.map +1 -1
  30. package/dist/lib/create-project.js +64 -79
  31. package/dist/lib/create-project.js.map +1 -1
  32. package/dist/lib/generate-secret.js +1 -1
  33. package/dist/lib/generate-secret.js.map +1 -1
  34. package/dist/lib/get-package-manager.d.ts +9 -0
  35. package/dist/lib/get-package-manager.d.ts.map +1 -1
  36. package/dist/lib/get-package-manager.js +20 -0
  37. package/dist/lib/get-package-manager.js.map +1 -1
  38. package/dist/lib/init-next.d.ts +6 -1
  39. package/dist/lib/init-next.d.ts.map +1 -1
  40. package/dist/lib/init-next.js +34 -41
  41. package/dist/lib/init-next.js.map +1 -1
  42. package/dist/lib/init-tanstack.d.ts +18 -0
  43. package/dist/lib/init-tanstack.d.ts.map +1 -0
  44. package/dist/lib/init-tanstack.js +149 -0
  45. package/dist/lib/init-tanstack.js.map +1 -0
  46. package/dist/lib/tanstack/detect.d.ts +5 -0
  47. package/dist/lib/tanstack/detect.d.ts.map +1 -0
  48. package/dist/lib/tanstack/detect.js +131 -0
  49. package/dist/lib/tanstack/detect.js.map +1 -0
  50. package/dist/lib/tanstack/prepare.d.ts +23 -0
  51. package/dist/lib/tanstack/prepare.d.ts.map +1 -0
  52. package/dist/lib/tanstack/prepare.js +114 -0
  53. package/dist/lib/tanstack/prepare.js.map +1 -0
  54. package/dist/lib/tanstack/template-files.d.ts +50 -0
  55. package/dist/lib/tanstack/template-files.d.ts.map +1 -0
  56. package/dist/lib/tanstack/template-files.js +64 -0
  57. package/dist/lib/tanstack/template-files.js.map +1 -0
  58. package/dist/lib/tanstack/transform-root-route.d.ts +7 -0
  59. package/dist/lib/tanstack/transform-root-route.d.ts.map +1 -0
  60. package/dist/lib/tanstack/transform-root-route.js +747 -0
  61. package/dist/lib/tanstack/transform-root-route.js.map +1 -0
  62. package/dist/lib/tanstack/transform-router.d.ts +5 -0
  63. package/dist/lib/tanstack/transform-router.d.ts.map +1 -0
  64. package/dist/lib/tanstack/transform-router.js +301 -0
  65. package/dist/lib/tanstack/transform-router.js.map +1 -0
  66. package/dist/lib/tanstack/transform-vite-config.d.ts +14 -0
  67. package/dist/lib/tanstack/transform-vite-config.d.ts.map +1 -0
  68. package/dist/lib/tanstack/transform-vite-config.js +576 -0
  69. package/dist/lib/tanstack/transform-vite-config.js.map +1 -0
  70. package/dist/lib/templates.d.ts.map +1 -1
  71. package/dist/lib/templates.js +11 -5
  72. package/dist/lib/templates.js.map +1 -1
  73. package/dist/lib/update-payload-in-project.d.ts +18 -3
  74. package/dist/lib/update-payload-in-project.d.ts.map +1 -1
  75. package/dist/lib/update-payload-in-project.js +102 -21
  76. package/dist/lib/update-payload-in-project.js.map +1 -1
  77. package/dist/lib/wrap-next-config.d.ts.map +1 -1
  78. package/dist/main.d.ts +20 -1
  79. package/dist/main.d.ts.map +1 -1
  80. package/dist/main.js +127 -36
  81. package/dist/main.js.map +1 -1
  82. package/dist/scripts/pack-template-files.js +18 -0
  83. package/dist/scripts/pack-template-files.js.map +1 -1
  84. package/dist/template/src/app/(frontend)/page.tsx +7 -4
  85. package/dist/template/src/app/(frontend)/styles.css +8 -1
  86. package/dist/template/src/app/(payload)/admin/[[...segments]]/not-found.tsx +1 -2
  87. package/dist/template/src/app/(payload)/admin/[[...segments]]/page.tsx +1 -2
  88. package/dist/template/src/app/(payload)/admin/importMap.js +30 -2
  89. package/dist/template/src/app/(payload)/api/[...slug]/route.ts +1 -2
  90. package/dist/template/src/app/(payload)/api/graphql/route.ts +1 -2
  91. package/dist/template/src/app/(payload)/api/graphql-playground/route.ts +1 -2
  92. package/dist/template/src/app/(payload)/custom.css +0 -0
  93. package/dist/template/src/app/(payload)/layout.tsx +9 -4
  94. package/dist/template/src/collections/Folders.ts +16 -0
  95. package/dist/template/src/collections/Media.ts +4 -0
  96. package/dist/template/src/collections/Tags.ts +16 -0
  97. package/dist/template/src/collections/Users.ts +1 -0
  98. package/dist/template/src/payload-types.ts +63 -9
  99. package/dist/template/src/payload.config.ts +14 -4
  100. package/dist/template-tanstack/routes/_payload/admin.$.tsx +25 -0
  101. package/dist/template-tanstack/routes/_payload/admin.index.tsx +25 -0
  102. package/dist/template-tanstack/routes/_payload/api.$.ts +11 -0
  103. package/dist/template-tanstack/routes/_payload/importMap.js +32 -0
  104. package/dist/template-tanstack/routes/_payload/server.functions.ts +50 -0
  105. package/dist/template-tanstack/routes/_payload.tsx +29 -0
  106. package/dist/template-tanstack/src/collections/Folders.ts +16 -0
  107. package/dist/template-tanstack/src/collections/Media.ts +20 -0
  108. package/dist/template-tanstack/src/collections/Tags.ts +16 -0
  109. package/dist/template-tanstack/src/collections/Users.ts +14 -0
  110. package/dist/template-tanstack/src/payload.config.ts +38 -0
  111. package/dist/types.d.ts +23 -4
  112. package/dist/types.d.ts.map +1 -1
  113. package/dist/types.js.map +1 -1
  114. package/dist/utils/messages.d.ts +1 -0
  115. package/dist/utils/messages.d.ts.map +1 -1
  116. package/dist/utils/messages.js +10 -6
  117. package/dist/utils/messages.js.map +1 -1
  118. package/dist/utils/resolvePackageVersion.d.ts +35 -0
  119. package/dist/utils/resolvePackageVersion.d.ts.map +1 -0
  120. package/dist/utils/resolvePackageVersion.js +62 -0
  121. package/dist/utils/resolvePackageVersion.js.map +1 -0
  122. package/package.json +8 -8
  123. package/dist/ast-integration.spec.js +0 -132
  124. package/dist/ast-integration.spec.js.map +0 -1
  125. package/dist/lib/ast/package-json.spec.js +0 -67
  126. package/dist/lib/ast/package-json.spec.js.map +0 -1
  127. package/dist/lib/ast/payload-config.spec.js +0 -365
  128. package/dist/lib/ast/payload-config.spec.js.map +0 -1
  129. package/dist/lib/ast/utils.spec.js +0 -226
  130. package/dist/lib/ast/utils.spec.js.map +0 -1
  131. package/dist/lib/create-project.spec.js +0 -190
  132. package/dist/lib/create-project.spec.js.map +0 -1
  133. package/dist/lib/download-skill.d.ts +0 -8
  134. package/dist/lib/download-skill.d.ts.map +0 -1
  135. package/dist/lib/download-skill.js +0 -35
  136. package/dist/lib/download-skill.js.map +0 -1
  137. package/dist/lib/manage-env-files.spec.js +0 -118
  138. package/dist/lib/manage-env-files.spec.js.map +0 -1
  139. package/dist/lib/select-agent.d.ts +0 -16
  140. package/dist/lib/select-agent.d.ts.map +0 -1
  141. package/dist/lib/select-agent.js +0 -67
  142. package/dist/lib/select-agent.js.map +0 -1
  143. package/dist/lib/wrap-next-config.spec.js +0 -167
  144. package/dist/lib/wrap-next-config.spec.js.map +0 -1
  145. package/dist/utils/getLatestPackageVersion.d.ts +0 -17
  146. package/dist/utils/getLatestPackageVersion.d.ts.map +0 -1
  147. package/dist/utils/getLatestPackageVersion.js +0 -20
  148. package/dist/utils/getLatestPackageVersion.js.map +0 -1
  149. /package/dist/{template/src/app/(payload)/custom.scss → template-tanstack/routes/_payload/custom.css} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure-payload-tsconfig.d.ts","sourceRoot":"","sources":["../../src/lib/configure-payload-tsconfig.ts"],"names":[],"mappings":"AAaA,wBAAsB,wBAAwB,CAAC,EAC7C,UAAU,EACV,iBAAiB,GAClB,EAAE;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BhB"}
@@ -0,0 +1,26 @@
1
+ import { parse, stringify } from 'comment-json';
2
+ import fse from 'fs-extra';
3
+ import path from 'node:path';
4
+ import { warning } from '../utils/log.js';
5
+ export async function configurePayloadTsConfig({ configPath, payloadConfigPath }) {
6
+ if (!await fse.pathExists(configPath)) {
7
+ warning('Could not find tsconfig.json to add @payload-config path.');
8
+ return;
9
+ }
10
+ const content = await fse.readFile(configPath, 'utf8');
11
+ const tsConfig = parse(content);
12
+ tsConfig.compilerOptions ??= {};
13
+ tsConfig.compilerOptions.paths ??= {};
14
+ if (tsConfig.compilerOptions.paths['@payload-config']) {
15
+ return;
16
+ }
17
+ const baseUrlPath = path.resolve(path.dirname(configPath), tsConfig.compilerOptions.baseUrl ?? '.');
18
+ const relativePayloadConfigPath = path.relative(baseUrlPath, payloadConfigPath).split(path.sep).join('/');
19
+ const payloadAliasPath = relativePayloadConfigPath.startsWith('.') ? relativePayloadConfigPath : `./${relativePayloadConfigPath}`;
20
+ tsConfig.compilerOptions.paths['@payload-config'] = [
21
+ payloadAliasPath
22
+ ];
23
+ await fse.writeFile(configPath, stringify(tsConfig, null, 2), 'utf8');
24
+ }
25
+
26
+ //# sourceMappingURL=configure-payload-tsconfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/configure-payload-tsconfig.ts"],"sourcesContent":["import { parse, stringify } from 'comment-json'\nimport fse from 'fs-extra'\nimport path from 'node:path'\n\nimport { warning } from '../utils/log.js'\n\ntype TsConfig = {\n compilerOptions?: {\n baseUrl?: string\n paths?: Record<string, string[]>\n }\n}\n\nexport async function configurePayloadTsConfig({\n configPath,\n payloadConfigPath,\n}: {\n configPath: string\n payloadConfigPath: string\n}): Promise<void> {\n if (!(await fse.pathExists(configPath))) {\n warning('Could not find tsconfig.json to add @payload-config path.')\n return\n }\n\n const content = await fse.readFile(configPath, 'utf8')\n const tsConfig = parse(content) as TsConfig\n\n tsConfig.compilerOptions ??= {}\n tsConfig.compilerOptions.paths ??= {}\n\n if (tsConfig.compilerOptions.paths['@payload-config']) {\n return\n }\n\n const baseUrlPath = path.resolve(\n path.dirname(configPath),\n tsConfig.compilerOptions.baseUrl ?? '.',\n )\n const relativePayloadConfigPath = path\n .relative(baseUrlPath, payloadConfigPath)\n .split(path.sep)\n .join('/')\n const payloadAliasPath = relativePayloadConfigPath.startsWith('.')\n ? relativePayloadConfigPath\n : `./${relativePayloadConfigPath}`\n\n tsConfig.compilerOptions.paths['@payload-config'] = [payloadAliasPath]\n await fse.writeFile(configPath, stringify(tsConfig, null, 2), 'utf8')\n}\n"],"names":["parse","stringify","fse","path","warning","configurePayloadTsConfig","configPath","payloadConfigPath","pathExists","content","readFile","tsConfig","compilerOptions","paths","baseUrlPath","resolve","dirname","baseUrl","relativePayloadConfigPath","relative","split","sep","join","payloadAliasPath","startsWith","writeFile"],"mappings":"AAAA,SAASA,KAAK,EAAEC,SAAS,QAAQ,eAAc;AAC/C,OAAOC,SAAS,WAAU;AAC1B,OAAOC,UAAU,YAAW;AAE5B,SAASC,OAAO,QAAQ,kBAAiB;AASzC,OAAO,eAAeC,yBAAyB,EAC7CC,UAAU,EACVC,iBAAiB,EAIlB;IACC,IAAI,CAAE,MAAML,IAAIM,UAAU,CAACF,aAAc;QACvCF,QAAQ;QACR;IACF;IAEA,MAAMK,UAAU,MAAMP,IAAIQ,QAAQ,CAACJ,YAAY;IAC/C,MAAMK,WAAWX,MAAMS;IAEvBE,SAASC,eAAe,KAAK,CAAC;IAC9BD,SAASC,eAAe,CAACC,KAAK,KAAK,CAAC;IAEpC,IAAIF,SAASC,eAAe,CAACC,KAAK,CAAC,kBAAkB,EAAE;QACrD;IACF;IAEA,MAAMC,cAAcX,KAAKY,OAAO,CAC9BZ,KAAKa,OAAO,CAACV,aACbK,SAASC,eAAe,CAACK,OAAO,IAAI;IAEtC,MAAMC,4BAA4Bf,KAC/BgB,QAAQ,CAACL,aAAaP,mBACtBa,KAAK,CAACjB,KAAKkB,GAAG,EACdC,IAAI,CAAC;IACR,MAAMC,mBAAmBL,0BAA0BM,UAAU,CAAC,OAC1DN,4BACA,CAAC,EAAE,EAAEA,2BAA2B;IAEpCP,SAASC,eAAe,CAACC,KAAK,CAAC,kBAAkB,GAAG;QAACU;KAAiB;IACtE,MAAMrB,IAAIuB,SAAS,CAACnB,YAAYL,UAAUU,UAAU,MAAM,IAAI;AAChE"}
@@ -1,11 +1,10 @@
1
- import type { AgentType, CliArgs, DbDetails, PackageManager, ProjectExample, ProjectTemplate } from '../types.js';
1
+ import type { CliArgs, DbDetails, PackageManager, ProjectExample, ProjectTemplate } from '../types.js';
2
2
  type TemplateOrExample = {
3
3
  example: ProjectExample;
4
4
  } | {
5
5
  template: ProjectTemplate;
6
6
  };
7
7
  export declare function createProject(args: {
8
- agentType?: AgentType;
9
8
  cliArgs: CliArgs;
10
9
  dbDetails?: DbDetails;
11
10
  packageManager: PackageManager;
@@ -1 +1 @@
1
- {"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/lib/create-project.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EACP,SAAS,EACT,cAAc,EACd,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAA;AAwDpB,KAAK,iBAAiB,GAClB;IACE,OAAO,EAAE,cAAc,CAAA;CACxB,GACD;IACE,QAAQ,EAAE,eAAe,CAAA;CAC1B,CAAA;AAEL,wBAAsB,aAAa,CACjC,IAAI,EAAE;IACJ,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,iBAAiB,GACpB,OAAO,CAAC,IAAI,CAAC,CAqIf;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC,GAAG,IAAI,CAiBP"}
1
+ {"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/lib/create-project.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,cAAc,EACd,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAA;AA+GpB,KAAK,iBAAiB,GAClB;IACE,OAAO,EAAE,cAAc,CAAA;CACxB,GACD;IACE,QAAQ,EAAE,eAAe,CAAA;CAC1B,CAAA;AAEL,wBAAsB,aAAa,CACjC,IAAI,EAAE;IACJ,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,iBAAiB,GACpB,OAAO,CAAC,IAAI,CAAC,CA4Gf;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC,GAAG,IAAI,CAiBP"}
@@ -6,15 +6,16 @@ import { fileURLToPath } from 'node:url';
6
6
  import path from 'path';
7
7
  import { tryInitRepoAndCommit } from '../utils/git.js';
8
8
  import { debug, error, info, warning } from '../utils/log.js';
9
+ import { DEFAULT_PAYLOAD_VERSION_TAG, resolvePackageVersion } from '../utils/resolvePackageVersion.js';
10
+ import { buildAgentConfigFiles } from './agent-config.js';
9
11
  import { configurePayloadConfig } from './configure-payload-config.js';
10
12
  import { configurePluginProject } from './configure-plugin-project.js';
11
13
  import { ensurePnpmBuildApprovals } from './configure-pnpm-builds.js';
12
14
  import { downloadExample } from './download-example.js';
13
- import { downloadSkill } from './download-skill.js';
14
15
  import { downloadTemplate } from './download-template.js';
15
16
  import { generateSecret } from './generate-secret.js';
17
+ import { getInstallCommand, getRunCommand } from './get-package-manager.js';
16
18
  import { manageEnvFiles } from './manage-env-files.js';
17
- import { getAgentChoice } from './select-agent.js';
18
19
  const filename = fileURLToPath(import.meta.url);
19
20
  const dirname = path.dirname(filename);
20
21
  async function createOrFindProjectDir(projectDir) {
@@ -28,14 +29,7 @@ async function installDeps(args) {
28
29
  if (cliArgs['--no-deps']) {
29
30
  return true;
30
31
  }
31
- let installCmd = 'npm install --legacy-peer-deps';
32
- if (packageManager === 'yarn') {
33
- installCmd = 'yarn';
34
- } else if (packageManager === 'pnpm') {
35
- installCmd = 'pnpm install';
36
- } else if (packageManager === 'bun') {
37
- installCmd = 'bun install';
38
- }
32
+ const installCmd = getInstallCommand(packageManager);
39
33
  await ensurePnpmBuildApprovals({
40
34
  packageManager,
41
35
  projectDir
@@ -50,8 +44,52 @@ async function installDeps(args) {
50
44
  return false;
51
45
  }
52
46
  }
47
+ async function runPayloadCommand(args) {
48
+ const { command, packageManager, projectDir } = args;
49
+ try {
50
+ await execa.command(`${getRunCommand(packageManager)} ${command}`, {
51
+ cwd: path.resolve(projectDir)
52
+ });
53
+ return {
54
+ ok: true
55
+ };
56
+ } catch (err) {
57
+ return {
58
+ error: err instanceof Error ? err.message : String(err),
59
+ ok: false
60
+ };
61
+ }
62
+ }
63
+ /** Non-fatal: on failure, warn with the command to run later. */ async function runPayloadGenerate(args) {
64
+ const { artifact, command, packageManager, projectDir, spinner } = args;
65
+ spinner.start(`Generating ${artifact}...`);
66
+ const result = await runPayloadCommand({
67
+ command,
68
+ packageManager,
69
+ projectDir
70
+ });
71
+ const capitalized = artifact.charAt(0).toUpperCase() + artifact.slice(1);
72
+ if (result.ok) {
73
+ spinner.stop(`${capitalized} generated`);
74
+ return;
75
+ }
76
+ spinner.stop(`Could not generate ${artifact}`, 1);
77
+ warning(`Run '${getRunCommand(packageManager)} ${command}' later. ${result.error}`);
78
+ }
79
+ async function runProjectCodegen(args) {
80
+ await runPayloadGenerate({
81
+ ...args,
82
+ artifact: 'import map',
83
+ command: 'generate:importmap'
84
+ });
85
+ await runPayloadGenerate({
86
+ ...args,
87
+ artifact: 'types',
88
+ command: 'generate:types'
89
+ });
90
+ }
53
91
  export async function createProject(args) {
54
- const { agentType, cliArgs, dbDetails, packageManager, projectDir, projectName } = args;
92
+ const { cliArgs, dbDetails, packageManager, projectDir, projectName } = args;
55
93
  if (cliArgs['--dry-run']) {
56
94
  debug(`Dry run: Creating project in ${chalk.green(projectDir)}`);
57
95
  return;
@@ -87,23 +125,14 @@ export async function createProject(args) {
87
125
  projectDir
88
126
  });
89
127
  }
128
+ const versionOrTag = cliArgs['--payload-version'] ?? DEFAULT_PAYLOAD_VERSION_TAG;
90
129
  const spinner = p.spinner();
91
- spinner.start('Checking latest Payload version...');
92
- // Allows overriding the installed Payload version instead of installing the latest
93
- const versionFromCli = cliArgs['--version'];
94
- let payloadVersion;
95
- if (versionFromCli) {
96
- await verifyVersionForPackage({
97
- version: versionFromCli
98
- });
99
- payloadVersion = versionFromCli;
100
- spinner.stop(`Using provided version of Payload ${payloadVersion}`);
101
- } else {
102
- payloadVersion = await getLatestPackageVersion({
103
- packageName: 'payload'
104
- });
105
- spinner.stop(`Found latest version of Payload ${payloadVersion}`);
106
- }
130
+ spinner.start(`Resolving Payload version (${versionOrTag})...`);
131
+ const payloadVersion = await resolvePackageVersion({
132
+ packageName: 'payload',
133
+ versionOrTag
134
+ });
135
+ spinner.stop(`Using Payload version ${payloadVersion}`);
107
136
  await updatePackageJSON({
108
137
  latestVersion: payloadVersion,
109
138
  projectDir,
@@ -134,24 +163,9 @@ export async function createProject(args) {
134
163
  projectDir,
135
164
  template: 'template' in args ? args.template : undefined
136
165
  });
137
- if (agentType) {
138
- spinner.message('Installing agent skill...');
139
- try {
140
- await downloadSkill({
141
- agentType,
142
- branch: cliArgs['--branch'] || undefined,
143
- debug: cliArgs['--debug'],
144
- projectDir
145
- });
146
- const { configFile, skillsDir } = getAgentChoice(agentType);
147
- const skillPath = `${skillsDir}/payload`;
148
- const configContent = configFile === 'CLAUDE.md' ? `# Claude Code\n\nThis project uses the Payload CMS skill at \`${skillPath}/\`.\nStart with \`${skillPath}/SKILL.md\` for a quick reference, then see \`${skillPath}/reference/\` for detailed docs.\n` : `# Agents\n\nThis project uses the Payload CMS skill at \`${skillPath}/\`.\nStart with \`${skillPath}/SKILL.md\` for a quick reference, then see \`${skillPath}/reference/\` for detailed docs.\n`;
149
- await fse.writeFile(path.resolve(projectDir, configFile), configContent);
150
- } catch (err) {
151
- if (cliArgs['--debug'] && err instanceof Error) {
152
- debug(`Failed to download skill: ${err.message}`);
153
- }
154
- warning('Could not download agent skill. You can install it manually later.');
166
+ if (!cliArgs['--no-agent']) {
167
+ for (const { content, fileName } of buildAgentConfigFiles()){
168
+ await fse.writeFile(path.resolve(projectDir, fileName), content);
155
169
  }
156
170
  }
157
171
  if (!cliArgs['--no-deps']) {
@@ -164,6 +178,11 @@ export async function createProject(args) {
164
178
  });
165
179
  if (result) {
166
180
  spinner.stop('Successfully installed Payload and dependencies');
181
+ await runProjectCodegen({
182
+ packageManager,
183
+ projectDir,
184
+ spinner
185
+ });
167
186
  } else {
168
187
  spinner.stop('Error installing dependencies', 1);
169
188
  }
@@ -216,39 +235,5 @@ export async function createProject(args) {
216
235
  }, {});
217
236
  packageJson.dependencies = updatedDependencies;
218
237
  }
219
- /**
220
- * Fetches the latest version of a package from the NPM registry.
221
- *
222
- * Used in determining the latest version of Payload to use in the generated templates.
223
- */ async function getLatestPackageVersion({ packageName = 'payload' }) {
224
- try {
225
- const response = await fetch(`https://registry.npmjs.org/-/package/${packageName}/dist-tags`);
226
- const data = await response.json();
227
- // Monster chaining for type safety just checking for data.latest
228
- const latestVersion = data && typeof data === 'object' && 'latest' in data && data.latest && typeof data.latest === 'string' ? data.latest : null;
229
- if (!latestVersion) {
230
- throw new Error(`No latest version found for package: ${packageName}`);
231
- }
232
- return latestVersion;
233
- } catch (error) {
234
- console.error('Error fetching Payload version:', error);
235
- throw error;
236
- }
237
- }
238
- /**
239
- * Verifies that the specified version of a package exists on the NPM registry.
240
- *
241
- * Throws an error if the version does not exist.
242
- */ async function verifyVersionForPackage({ packageName = 'payload', version }) {
243
- try {
244
- const response = await fetch(`https://registry.npmjs.org/${packageName}/${version}`);
245
- if (response.status !== 200) {
246
- throw new Error(`No ${version} version found for package: ${packageName}`);
247
- }
248
- } catch (error) {
249
- console.error('Error verifying Payload version:', error);
250
- throw error;
251
- }
252
- }
253
238
 
254
239
  //# sourceMappingURL=create-project.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/create-project.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport chalk from 'chalk'\nimport execa from 'execa'\nimport fse from 'fs-extra'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\n\nimport type {\n AgentType,\n CliArgs,\n DbDetails,\n PackageManager,\n ProjectExample,\n ProjectTemplate,\n} from '../types.js'\n\nimport { tryInitRepoAndCommit } from '../utils/git.js'\nimport { debug, error, info, warning } from '../utils/log.js'\nimport { configurePayloadConfig } from './configure-payload-config.js'\nimport { configurePluginProject } from './configure-plugin-project.js'\nimport { ensurePnpmBuildApprovals } from './configure-pnpm-builds.js'\nimport { downloadExample } from './download-example.js'\nimport { downloadSkill } from './download-skill.js'\nimport { downloadTemplate } from './download-template.js'\nimport { generateSecret } from './generate-secret.js'\nimport { manageEnvFiles } from './manage-env-files.js'\nimport { getAgentChoice } from './select-agent.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\nasync function createOrFindProjectDir(projectDir: string): Promise<void> {\n const pathExists = await fse.pathExists(projectDir)\n if (!pathExists) {\n await fse.mkdir(projectDir)\n }\n}\n\nasync function installDeps(args: {\n cliArgs: CliArgs\n packageManager: PackageManager\n projectDir: string\n}): Promise<boolean> {\n const { cliArgs, packageManager, projectDir } = args\n if (cliArgs['--no-deps']) {\n return true\n }\n let installCmd = 'npm install --legacy-peer-deps'\n\n if (packageManager === 'yarn') {\n installCmd = 'yarn'\n } else if (packageManager === 'pnpm') {\n installCmd = 'pnpm install'\n } else if (packageManager === 'bun') {\n installCmd = 'bun install'\n }\n\n await ensurePnpmBuildApprovals({ packageManager, projectDir })\n\n try {\n await execa.command(installCmd, {\n cwd: path.resolve(projectDir),\n })\n return true\n } catch (err: unknown) {\n error(`Error installing dependencies${err instanceof Error ? `: ${err.message}` : ''}.`)\n return false\n }\n}\n\ntype TemplateOrExample =\n | {\n example: ProjectExample\n }\n | {\n template: ProjectTemplate\n }\n\nexport async function createProject(\n args: {\n agentType?: AgentType\n cliArgs: CliArgs\n dbDetails?: DbDetails\n packageManager: PackageManager\n projectDir: string\n projectName: string\n } & TemplateOrExample,\n): Promise<void> {\n const { agentType, cliArgs, dbDetails, packageManager, projectDir, projectName } = args\n\n if (cliArgs['--dry-run']) {\n debug(`Dry run: Creating project in ${chalk.green(projectDir)}`)\n return\n }\n\n await createOrFindProjectDir(projectDir)\n\n if (cliArgs['--local-example']) {\n // Copy example from local path. For development purposes.\n const localExample = path.resolve(dirname, '../../../../examples/', cliArgs['--local-example'])\n await fse.copy(localExample, projectDir)\n }\n\n if (cliArgs['--local-template']) {\n // Copy template from local path. For development purposes.\n const localTemplate = path.resolve(\n dirname,\n '../../../../templates/',\n cliArgs['--local-template'],\n )\n await fse.copy(localTemplate, projectDir)\n } else if ('template' in args && 'url' in args.template) {\n const { template } = args\n if (cliArgs['--branch']) {\n template.url = `${template.url.split('#')?.[0]}#${cliArgs['--branch']}`\n }\n\n await downloadTemplate({\n debug: cliArgs['--debug'],\n projectDir,\n template,\n })\n } else if ('example' in args && 'url' in args.example) {\n const { example } = args\n if (cliArgs['--branch']) {\n example.url = `${example.url.split('#')?.[0]}#${cliArgs['--branch']}`\n }\n\n await downloadExample({\n debug: cliArgs['--debug'],\n example,\n projectDir,\n })\n }\n\n const spinner = p.spinner()\n spinner.start('Checking latest Payload version...')\n\n // Allows overriding the installed Payload version instead of installing the latest\n const versionFromCli = cliArgs['--version']\n\n let payloadVersion: string\n\n if (versionFromCli) {\n await verifyVersionForPackage({ version: versionFromCli })\n\n payloadVersion = versionFromCli\n\n spinner.stop(`Using provided version of Payload ${payloadVersion}`)\n } else {\n payloadVersion = await getLatestPackageVersion({ packageName: 'payload' })\n\n spinner.stop(`Found latest version of Payload ${payloadVersion}`)\n }\n\n await updatePackageJSON({ latestVersion: payloadVersion, projectDir, projectName })\n\n if ('template' in args) {\n if (args.template.type === 'plugin') {\n spinner.message('Configuring Plugin...')\n configurePluginProject({ projectDirPath: projectDir, projectName })\n } else {\n spinner.message('Configuring Payload...')\n await configurePayloadConfig({\n dbType: dbDetails?.type,\n projectDirOrConfigPath: { projectDir },\n })\n }\n }\n\n await manageEnvFiles({\n cliArgs,\n databaseType: dbDetails?.type,\n databaseUri: dbDetails?.dbUri,\n payloadSecret: generateSecret(),\n projectDir,\n template: 'template' in args ? args.template : undefined,\n })\n\n if (agentType) {\n spinner.message('Installing agent skill...')\n try {\n await downloadSkill({\n agentType,\n branch: cliArgs['--branch'] || undefined,\n debug: cliArgs['--debug'],\n projectDir,\n })\n\n const { configFile, skillsDir } = getAgentChoice(agentType)\n const skillPath = `${skillsDir}/payload`\n const configContent =\n configFile === 'CLAUDE.md'\n ? `# Claude Code\\n\\nThis project uses the Payload CMS skill at \\`${skillPath}/\\`.\\nStart with \\`${skillPath}/SKILL.md\\` for a quick reference, then see \\`${skillPath}/reference/\\` for detailed docs.\\n`\n : `# Agents\\n\\nThis project uses the Payload CMS skill at \\`${skillPath}/\\`.\\nStart with \\`${skillPath}/SKILL.md\\` for a quick reference, then see \\`${skillPath}/reference/\\` for detailed docs.\\n`\n await fse.writeFile(path.resolve(projectDir, configFile), configContent)\n } catch (err) {\n if (cliArgs['--debug'] && err instanceof Error) {\n debug(`Failed to download skill: ${err.message}`)\n }\n warning('Could not download agent skill. You can install it manually later.')\n }\n }\n\n if (!cliArgs['--no-deps']) {\n info(`Using ${packageManager}.\\n`)\n spinner.message('Installing dependencies...')\n const result = await installDeps({ cliArgs, packageManager, projectDir })\n if (result) {\n spinner.stop('Successfully installed Payload and dependencies')\n } else {\n spinner.stop('Error installing dependencies', 1)\n }\n } else {\n spinner.stop('Dependency installation skipped')\n }\n\n if (!cliArgs['--no-git']) {\n tryInitRepoAndCommit({ cwd: projectDir })\n }\n}\n\n/**\n * Reads the package.json file into an object and then does the following:\n * - Sets the `name` property to the provided `projectName`.\n * - Bumps the payload packages from workspace:* to the latest version.\n * - Writes the updated object back to the package.json file.\n */\nexport async function updatePackageJSON(args: {\n /**\n * The latest version of Payload to use in the package.json.\n */\n latestVersion: string\n projectDir: string\n /**\n * The name of the project to set in package.json.\n */\n projectName: string\n}): Promise<void> {\n const { latestVersion, projectDir, projectName } = args\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n try {\n const packageObj = await fse.readJson(packageJsonPath)\n packageObj.name = projectName\n\n updatePackageJSONDependencies({\n latestVersion,\n packageJson: packageObj,\n })\n\n await fse.writeJson(packageJsonPath, packageObj, { spaces: 2 })\n } catch (err: unknown) {\n warning(`Unable to update name in package.json. ${err instanceof Error ? err.message : ''}`)\n }\n}\n\n/**\n * Recursively updates a JSON object to replace all instances of `workspace:` with the latest version pinned.\n *\n * Does not return and instead modifies the `packageJson` object in place.\n */\nexport function updatePackageJSONDependencies(args: {\n latestVersion: string\n packageJson: Record<string, unknown>\n}): void {\n const { latestVersion, packageJson } = args\n\n const updatedDependencies = Object.entries(packageJson.dependencies || {}).reduce(\n (acc, [key, value]) => {\n if (typeof value === 'string' && value.startsWith('workspace:')) {\n acc[key] = `${latestVersion}`\n } else if (key === 'payload' || key.startsWith('@payloadcms')) {\n acc[key] = `${latestVersion}`\n } else {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n packageJson.dependencies = updatedDependencies\n}\n\n/**\n * Fetches the latest version of a package from the NPM registry.\n *\n * Used in determining the latest version of Payload to use in the generated templates.\n */\nasync function getLatestPackageVersion({\n packageName = 'payload',\n}: {\n /**\n * Package name to fetch the latest version for based on the NPM registry URL\n *\n * Eg. for `'payload'`, it will fetch the version from `https://registry.npmjs.org/payload`\n *\n * @default 'payload'\n */\n packageName?: string\n}): Promise<string> {\n try {\n const response = await fetch(`https://registry.npmjs.org/-/package/${packageName}/dist-tags`)\n const data = await response.json()\n\n // Monster chaining for type safety just checking for data.latest\n const latestVersion =\n data &&\n typeof data === 'object' &&\n 'latest' in data &&\n data.latest &&\n typeof data.latest === 'string'\n ? data.latest\n : null\n\n if (!latestVersion) {\n throw new Error(`No latest version found for package: ${packageName}`)\n }\n\n return latestVersion\n } catch (error) {\n console.error('Error fetching Payload version:', error)\n throw error\n }\n}\n\n/**\n * Verifies that the specified version of a package exists on the NPM registry.\n *\n * Throws an error if the version does not exist.\n */\nasync function verifyVersionForPackage({\n packageName = 'payload',\n version,\n}: {\n /**\n * Package name to fetch the latest version for based on the NPM registry URL\n *\n * Eg. for `'payload'`, it will fetch the version from `https://registry.npmjs.org/payload`\n *\n * @default 'payload'\n */\n packageName?: string\n version: string\n}): Promise<void> {\n try {\n const response = await fetch(`https://registry.npmjs.org/${packageName}/${version}`)\n\n if (response.status !== 200) {\n throw new Error(`No ${version} version found for package: ${packageName}`)\n }\n } catch (error) {\n console.error('Error verifying Payload version:', error)\n throw error\n }\n}\n"],"names":["p","chalk","execa","fse","fileURLToPath","path","tryInitRepoAndCommit","debug","error","info","warning","configurePayloadConfig","configurePluginProject","ensurePnpmBuildApprovals","downloadExample","downloadSkill","downloadTemplate","generateSecret","manageEnvFiles","getAgentChoice","filename","url","dirname","createOrFindProjectDir","projectDir","pathExists","mkdir","installDeps","args","cliArgs","packageManager","installCmd","command","cwd","resolve","err","Error","message","createProject","agentType","dbDetails","projectName","green","localExample","copy","localTemplate","template","split","example","spinner","start","versionFromCli","payloadVersion","verifyVersionForPackage","version","stop","getLatestPackageVersion","packageName","updatePackageJSON","latestVersion","type","projectDirPath","dbType","projectDirOrConfigPath","databaseType","databaseUri","dbUri","payloadSecret","undefined","branch","configFile","skillsDir","skillPath","configContent","writeFile","result","packageJsonPath","packageObj","readJson","name","updatePackageJSONDependencies","packageJson","writeJson","spaces","updatedDependencies","Object","entries","dependencies","reduce","acc","key","value","startsWith","response","fetch","data","json","latest","console","status"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/create-project.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport chalk from 'chalk'\nimport execa from 'execa'\nimport fse from 'fs-extra'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\n\nimport type {\n CliArgs,\n DbDetails,\n PackageManager,\n ProjectExample,\n ProjectTemplate,\n} from '../types.js'\n\nimport { tryInitRepoAndCommit } from '../utils/git.js'\nimport { debug, error, info, warning } from '../utils/log.js'\nimport {\n DEFAULT_PAYLOAD_VERSION_TAG,\n resolvePackageVersion,\n} from '../utils/resolvePackageVersion.js'\nimport { buildAgentConfigFiles } from './agent-config.js'\nimport { configurePayloadConfig } from './configure-payload-config.js'\nimport { configurePluginProject } from './configure-plugin-project.js'\nimport { ensurePnpmBuildApprovals } from './configure-pnpm-builds.js'\nimport { downloadExample } from './download-example.js'\nimport { downloadTemplate } from './download-template.js'\nimport { generateSecret } from './generate-secret.js'\nimport { getInstallCommand, getRunCommand } from './get-package-manager.js'\nimport { manageEnvFiles } from './manage-env-files.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\nasync function createOrFindProjectDir(projectDir: string): Promise<void> {\n const pathExists = await fse.pathExists(projectDir)\n if (!pathExists) {\n await fse.mkdir(projectDir)\n }\n}\n\nasync function installDeps(args: {\n cliArgs: CliArgs\n packageManager: PackageManager\n projectDir: string\n}): Promise<boolean> {\n const { cliArgs, packageManager, projectDir } = args\n if (cliArgs['--no-deps']) {\n return true\n }\n const installCmd = getInstallCommand(packageManager)\n\n await ensurePnpmBuildApprovals({ packageManager, projectDir })\n\n try {\n await execa.command(installCmd, {\n cwd: path.resolve(projectDir),\n })\n return true\n } catch (err: unknown) {\n error(`Error installing dependencies${err instanceof Error ? `: ${err.message}` : ''}.`)\n return false\n }\n}\n\ntype PayloadGenerateResult = { error: string; ok: false } | { ok: true }\n\nasync function runPayloadCommand(args: {\n command: string\n packageManager: PackageManager\n projectDir: string\n}): Promise<PayloadGenerateResult> {\n const { command, packageManager, projectDir } = args\n\n try {\n await execa.command(`${getRunCommand(packageManager)} ${command}`, {\n cwd: path.resolve(projectDir),\n })\n return { ok: true }\n } catch (err: unknown) {\n return { error: err instanceof Error ? err.message : String(err), ok: false }\n }\n}\n\n/** Non-fatal: on failure, warn with the command to run later. */\nasync function runPayloadGenerate(args: {\n artifact: string\n command: string\n packageManager: PackageManager\n projectDir: string\n spinner: ReturnType<typeof p.spinner>\n}): Promise<void> {\n const { artifact, command, packageManager, projectDir, spinner } = args\n\n spinner.start(`Generating ${artifact}...`)\n const result = await runPayloadCommand({ command, packageManager, projectDir })\n const capitalized = artifact.charAt(0).toUpperCase() + artifact.slice(1)\n\n if (result.ok) {\n spinner.stop(`${capitalized} generated`)\n return\n }\n\n spinner.stop(`Could not generate ${artifact}`, 1)\n warning(`Run '${getRunCommand(packageManager)} ${command}' later. ${result.error}`)\n}\n\nasync function runProjectCodegen(args: {\n packageManager: PackageManager\n projectDir: string\n spinner: ReturnType<typeof p.spinner>\n}): Promise<void> {\n await runPayloadGenerate({\n ...args,\n artifact: 'import map',\n command: 'generate:importmap',\n })\n await runPayloadGenerate({\n ...args,\n artifact: 'types',\n command: 'generate:types',\n })\n}\n\ntype TemplateOrExample =\n | {\n example: ProjectExample\n }\n | {\n template: ProjectTemplate\n }\n\nexport async function createProject(\n args: {\n cliArgs: CliArgs\n dbDetails?: DbDetails\n packageManager: PackageManager\n projectDir: string\n projectName: string\n } & TemplateOrExample,\n): Promise<void> {\n const { cliArgs, dbDetails, packageManager, projectDir, projectName } = args\n\n if (cliArgs['--dry-run']) {\n debug(`Dry run: Creating project in ${chalk.green(projectDir)}`)\n return\n }\n\n await createOrFindProjectDir(projectDir)\n\n if (cliArgs['--local-example']) {\n // Copy example from local path. For development purposes.\n const localExample = path.resolve(dirname, '../../../../examples/', cliArgs['--local-example'])\n await fse.copy(localExample, projectDir)\n }\n\n if (cliArgs['--local-template']) {\n // Copy template from local path. For development purposes.\n const localTemplate = path.resolve(\n dirname,\n '../../../../templates/',\n cliArgs['--local-template'],\n )\n await fse.copy(localTemplate, projectDir)\n } else if ('template' in args && 'url' in args.template) {\n const { template } = args\n if (cliArgs['--branch']) {\n template.url = `${template.url.split('#')?.[0]}#${cliArgs['--branch']}`\n }\n\n await downloadTemplate({\n debug: cliArgs['--debug'],\n projectDir,\n template,\n })\n } else if ('example' in args && 'url' in args.example) {\n const { example } = args\n if (cliArgs['--branch']) {\n example.url = `${example.url.split('#')?.[0]}#${cliArgs['--branch']}`\n }\n\n await downloadExample({\n debug: cliArgs['--debug'],\n example,\n projectDir,\n })\n }\n\n const versionOrTag = cliArgs['--payload-version'] ?? DEFAULT_PAYLOAD_VERSION_TAG\n\n const spinner = p.spinner()\n spinner.start(`Resolving Payload version (${versionOrTag})...`)\n\n const payloadVersion = await resolvePackageVersion({\n packageName: 'payload',\n versionOrTag,\n })\n\n spinner.stop(`Using Payload version ${payloadVersion}`)\n\n await updatePackageJSON({ latestVersion: payloadVersion, projectDir, projectName })\n\n if ('template' in args) {\n if (args.template.type === 'plugin') {\n spinner.message('Configuring Plugin...')\n configurePluginProject({ projectDirPath: projectDir, projectName })\n } else {\n spinner.message('Configuring Payload...')\n await configurePayloadConfig({\n dbType: dbDetails?.type,\n projectDirOrConfigPath: { projectDir },\n })\n }\n }\n\n await manageEnvFiles({\n cliArgs,\n databaseType: dbDetails?.type,\n databaseUri: dbDetails?.dbUri,\n payloadSecret: generateSecret(),\n projectDir,\n template: 'template' in args ? args.template : undefined,\n })\n\n if (!cliArgs['--no-agent']) {\n for (const { content, fileName } of buildAgentConfigFiles()) {\n await fse.writeFile(path.resolve(projectDir, fileName), content)\n }\n }\n\n if (!cliArgs['--no-deps']) {\n info(`Using ${packageManager}.\\n`)\n spinner.message('Installing dependencies...')\n const result = await installDeps({ cliArgs, packageManager, projectDir })\n if (result) {\n spinner.stop('Successfully installed Payload and dependencies')\n\n await runProjectCodegen({ packageManager, projectDir, spinner })\n } else {\n spinner.stop('Error installing dependencies', 1)\n }\n } else {\n spinner.stop('Dependency installation skipped')\n }\n\n if (!cliArgs['--no-git']) {\n tryInitRepoAndCommit({ cwd: projectDir })\n }\n}\n\n/**\n * Reads the package.json file into an object and then does the following:\n * - Sets the `name` property to the provided `projectName`.\n * - Bumps the payload packages from workspace:* to the latest version.\n * - Writes the updated object back to the package.json file.\n */\nexport async function updatePackageJSON(args: {\n /**\n * The latest version of Payload to use in the package.json.\n */\n latestVersion: string\n projectDir: string\n /**\n * The name of the project to set in package.json.\n */\n projectName: string\n}): Promise<void> {\n const { latestVersion, projectDir, projectName } = args\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n try {\n const packageObj = await fse.readJson(packageJsonPath)\n packageObj.name = projectName\n\n updatePackageJSONDependencies({\n latestVersion,\n packageJson: packageObj,\n })\n\n await fse.writeJson(packageJsonPath, packageObj, { spaces: 2 })\n } catch (err: unknown) {\n warning(`Unable to update name in package.json. ${err instanceof Error ? err.message : ''}`)\n }\n}\n\n/**\n * Recursively updates a JSON object to replace all instances of `workspace:` with the latest version pinned.\n *\n * Does not return and instead modifies the `packageJson` object in place.\n */\nexport function updatePackageJSONDependencies(args: {\n latestVersion: string\n packageJson: Record<string, unknown>\n}): void {\n const { latestVersion, packageJson } = args\n\n const updatedDependencies = Object.entries(packageJson.dependencies || {}).reduce(\n (acc, [key, value]) => {\n if (typeof value === 'string' && value.startsWith('workspace:')) {\n acc[key] = `${latestVersion}`\n } else if (key === 'payload' || key.startsWith('@payloadcms')) {\n acc[key] = `${latestVersion}`\n } else {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n packageJson.dependencies = updatedDependencies\n}\n"],"names":["p","chalk","execa","fse","fileURLToPath","path","tryInitRepoAndCommit","debug","error","info","warning","DEFAULT_PAYLOAD_VERSION_TAG","resolvePackageVersion","buildAgentConfigFiles","configurePayloadConfig","configurePluginProject","ensurePnpmBuildApprovals","downloadExample","downloadTemplate","generateSecret","getInstallCommand","getRunCommand","manageEnvFiles","filename","url","dirname","createOrFindProjectDir","projectDir","pathExists","mkdir","installDeps","args","cliArgs","packageManager","installCmd","command","cwd","resolve","err","Error","message","runPayloadCommand","ok","String","runPayloadGenerate","artifact","spinner","start","result","capitalized","charAt","toUpperCase","slice","stop","runProjectCodegen","createProject","dbDetails","projectName","green","localExample","copy","localTemplate","template","split","example","versionOrTag","payloadVersion","packageName","updatePackageJSON","latestVersion","type","projectDirPath","dbType","projectDirOrConfigPath","databaseType","databaseUri","dbUri","payloadSecret","undefined","content","fileName","writeFile","packageJsonPath","packageObj","readJson","name","updatePackageJSONDependencies","packageJson","writeJson","spaces","updatedDependencies","Object","entries","dependencies","reduce","acc","key","value","startsWith"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { randomBytes } from 'crypto';
2
2
  export function generateSecret() {
3
- return randomBytes(32).toString('hex').slice(0, 24);
3
+ return randomBytes(32).toString('hex');
4
4
  }
5
5
 
6
6
  //# sourceMappingURL=generate-secret.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/generate-secret.ts"],"sourcesContent":["import { randomBytes } from 'crypto'\n\nexport function generateSecret(): string {\n return randomBytes(32).toString('hex').slice(0, 24)\n}\n"],"names":["randomBytes","generateSecret","toString","slice"],"mappings":"AAAA,SAASA,WAAW,QAAQ,SAAQ;AAEpC,OAAO,SAASC;IACd,OAAOD,YAAY,IAAIE,QAAQ,CAAC,OAAOC,KAAK,CAAC,GAAG;AAClD"}
1
+ {"version":3,"sources":["../../src/lib/generate-secret.ts"],"sourcesContent":["import { randomBytes } from 'crypto'\n\nexport function generateSecret(): string {\n return randomBytes(32).toString('hex')\n}\n"],"names":["randomBytes","generateSecret","toString"],"mappings":"AAAA,SAASA,WAAW,QAAQ,SAAQ;AAEpC,OAAO,SAASC;IACd,OAAOD,YAAY,IAAIE,QAAQ,CAAC;AAClC"}
@@ -3,4 +3,13 @@ export declare function getPackageManager(args: {
3
3
  cliArgs?: CliArgs;
4
4
  projectDir: string;
5
5
  }): Promise<PackageManager>;
6
+ /**
7
+ * The command that installs every dependency listed in package.json.
8
+ */
9
+ export declare function getInstallCommand(packageManager: PackageManager): string;
10
+ /**
11
+ * The prefix that runs a package.json script. npm needs `npm run <script>`, while
12
+ * pnpm, yarn, and bun run scripts directly.
13
+ */
14
+ export declare function getRunCommand(packageManager: PackageManager): string;
6
15
  //# sourceMappingURL=get-package-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-package-manager.d.ts","sourceRoot":"","sources":["../../src/lib/get-package-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE1D,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB,GAAG,OAAO,CAAC,cAAc,CAAC,CA0B1B"}
1
+ {"version":3,"file":"get-package-manager.d.ts","sourceRoot":"","sources":["../../src/lib/get-package-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE1D,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB,GAAG,OAAO,CAAC,cAAc,CAAC,CA0B1B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,CAWxE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,CAEpE"}
@@ -25,6 +25,26 @@ export async function getPackageManager(args) {
25
25
  return 'npm';
26
26
  }
27
27
  }
28
+ /**
29
+ * The command that installs every dependency listed in package.json.
30
+ */ export function getInstallCommand(packageManager) {
31
+ if (packageManager === 'yarn') {
32
+ return 'yarn';
33
+ }
34
+ if (packageManager === 'pnpm') {
35
+ return 'pnpm install';
36
+ }
37
+ if (packageManager === 'bun') {
38
+ return 'bun install';
39
+ }
40
+ return 'npm install --legacy-peer-deps';
41
+ }
42
+ /**
43
+ * The prefix that runs a package.json script. npm needs `npm run <script>`, while
44
+ * pnpm, yarn, and bun run scripts directly.
45
+ */ export function getRunCommand(packageManager) {
46
+ return packageManager === 'npm' ? 'npm run' : packageManager;
47
+ }
28
48
  function getEnvironmentPackageManager() {
29
49
  const userAgent = process.env.npm_config_user_agent || '';
30
50
  if (userAgent.startsWith('yarn')) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/get-package-manager.ts"],"sourcesContent":["import execa from 'execa'\nimport fse from 'fs-extra'\n\nimport type { CliArgs, PackageManager } from '../types.js'\n\nexport async function getPackageManager(args: {\n cliArgs?: CliArgs\n projectDir: string\n}): Promise<PackageManager> {\n const { cliArgs, projectDir } = args\n\n try {\n // Check for flag or lockfile\n let detected: PackageManager = 'npm'\n if (cliArgs?.['--use-pnpm'] || fse.existsSync(`${projectDir}/pnpm-lock.yaml`)) {\n detected = 'pnpm'\n } else if (cliArgs?.['--use-yarn'] || fse.existsSync(`${projectDir}/yarn.lock`)) {\n detected = 'yarn'\n } else if (cliArgs?.['--use-npm'] || fse.existsSync(`${projectDir}/package-lock.json`)) {\n detected = 'npm'\n } else if (cliArgs?.['--use-bun'] || fse.existsSync(`${projectDir}/bun.lockb`)) {\n detected = 'bun'\n } else if (await commandExists('pnpm')) {\n // Prefer pnpm if it's installed\n detected = 'pnpm'\n } else {\n // Otherwise check the execution environment\n detected = getEnvironmentPackageManager()\n }\n\n return detected\n } catch (ignore) {\n return 'npm'\n }\n}\n\nfunction getEnvironmentPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent || ''\n\n if (userAgent.startsWith('yarn')) {\n return 'yarn'\n }\n\n if (userAgent.startsWith('pnpm')) {\n return 'pnpm'\n }\n\n if (userAgent.startsWith('bun')) {\n return 'bun'\n }\n\n return 'npm'\n}\n\nasync function commandExists(command: string): Promise<boolean> {\n try {\n await execa.command(process.platform === 'win32' ? `where ${command}` : `command -v ${command}`)\n return true\n } catch {\n return false\n }\n}\n"],"names":["execa","fse","getPackageManager","args","cliArgs","projectDir","detected","existsSync","commandExists","getEnvironmentPackageManager","ignore","userAgent","process","env","npm_config_user_agent","startsWith","command","platform"],"mappings":"AAAA,OAAOA,WAAW,QAAO;AACzB,OAAOC,SAAS,WAAU;AAI1B,OAAO,eAAeC,kBAAkBC,IAGvC;IACC,MAAM,EAAEC,OAAO,EAAEC,UAAU,EAAE,GAAGF;IAEhC,IAAI;QACF,6BAA6B;QAC7B,IAAIG,WAA2B;QAC/B,IAAIF,SAAS,CAAC,aAAa,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,eAAe,CAAC,GAAG;YAC7EC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,aAAa,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,UAAU,CAAC,GAAG;YAC/EC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,YAAY,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,kBAAkB,CAAC,GAAG;YACtFC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,YAAY,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,UAAU,CAAC,GAAG;YAC9EC,WAAW;QACb,OAAO,IAAI,MAAME,cAAc,SAAS;YACtC,gCAAgC;YAChCF,WAAW;QACb,OAAO;YACL,4CAA4C;YAC5CA,WAAWG;QACb;QAEA,OAAOH;IACT,EAAE,OAAOI,QAAQ;QACf,OAAO;IACT;AACF;AAEA,SAASD;IACP,MAAME,YAAYC,QAAQC,GAAG,CAACC,qBAAqB,IAAI;IAEvD,IAAIH,UAAUI,UAAU,CAAC,SAAS;QAChC,OAAO;IACT;IAEA,IAAIJ,UAAUI,UAAU,CAAC,SAAS;QAChC,OAAO;IACT;IAEA,IAAIJ,UAAUI,UAAU,CAAC,QAAQ;QAC/B,OAAO;IACT;IAEA,OAAO;AACT;AAEA,eAAeP,cAAcQ,OAAe;IAC1C,IAAI;QACF,MAAMhB,MAAMgB,OAAO,CAACJ,QAAQK,QAAQ,KAAK,UAAU,CAAC,MAAM,EAAED,SAAS,GAAG,CAAC,WAAW,EAAEA,SAAS;QAC/F,OAAO;IACT,EAAE,OAAM;QACN,OAAO;IACT;AACF"}
1
+ {"version":3,"sources":["../../src/lib/get-package-manager.ts"],"sourcesContent":["import execa from 'execa'\nimport fse from 'fs-extra'\n\nimport type { CliArgs, PackageManager } from '../types.js'\n\nexport async function getPackageManager(args: {\n cliArgs?: CliArgs\n projectDir: string\n}): Promise<PackageManager> {\n const { cliArgs, projectDir } = args\n\n try {\n // Check for flag or lockfile\n let detected: PackageManager = 'npm'\n if (cliArgs?.['--use-pnpm'] || fse.existsSync(`${projectDir}/pnpm-lock.yaml`)) {\n detected = 'pnpm'\n } else if (cliArgs?.['--use-yarn'] || fse.existsSync(`${projectDir}/yarn.lock`)) {\n detected = 'yarn'\n } else if (cliArgs?.['--use-npm'] || fse.existsSync(`${projectDir}/package-lock.json`)) {\n detected = 'npm'\n } else if (cliArgs?.['--use-bun'] || fse.existsSync(`${projectDir}/bun.lockb`)) {\n detected = 'bun'\n } else if (await commandExists('pnpm')) {\n // Prefer pnpm if it's installed\n detected = 'pnpm'\n } else {\n // Otherwise check the execution environment\n detected = getEnvironmentPackageManager()\n }\n\n return detected\n } catch (ignore) {\n return 'npm'\n }\n}\n\n/**\n * The command that installs every dependency listed in package.json.\n */\nexport function getInstallCommand(packageManager: PackageManager): string {\n if (packageManager === 'yarn') {\n return 'yarn'\n }\n if (packageManager === 'pnpm') {\n return 'pnpm install'\n }\n if (packageManager === 'bun') {\n return 'bun install'\n }\n return 'npm install --legacy-peer-deps'\n}\n\n/**\n * The prefix that runs a package.json script. npm needs `npm run <script>`, while\n * pnpm, yarn, and bun run scripts directly.\n */\nexport function getRunCommand(packageManager: PackageManager): string {\n return packageManager === 'npm' ? 'npm run' : packageManager\n}\n\nfunction getEnvironmentPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent || ''\n\n if (userAgent.startsWith('yarn')) {\n return 'yarn'\n }\n\n if (userAgent.startsWith('pnpm')) {\n return 'pnpm'\n }\n\n if (userAgent.startsWith('bun')) {\n return 'bun'\n }\n\n return 'npm'\n}\n\nasync function commandExists(command: string): Promise<boolean> {\n try {\n await execa.command(process.platform === 'win32' ? `where ${command}` : `command -v ${command}`)\n return true\n } catch {\n return false\n }\n}\n"],"names":["execa","fse","getPackageManager","args","cliArgs","projectDir","detected","existsSync","commandExists","getEnvironmentPackageManager","ignore","getInstallCommand","packageManager","getRunCommand","userAgent","process","env","npm_config_user_agent","startsWith","command","platform"],"mappings":"AAAA,OAAOA,WAAW,QAAO;AACzB,OAAOC,SAAS,WAAU;AAI1B,OAAO,eAAeC,kBAAkBC,IAGvC;IACC,MAAM,EAAEC,OAAO,EAAEC,UAAU,EAAE,GAAGF;IAEhC,IAAI;QACF,6BAA6B;QAC7B,IAAIG,WAA2B;QAC/B,IAAIF,SAAS,CAAC,aAAa,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,eAAe,CAAC,GAAG;YAC7EC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,aAAa,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,UAAU,CAAC,GAAG;YAC/EC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,YAAY,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,kBAAkB,CAAC,GAAG;YACtFC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,YAAY,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,UAAU,CAAC,GAAG;YAC9EC,WAAW;QACb,OAAO,IAAI,MAAME,cAAc,SAAS;YACtC,gCAAgC;YAChCF,WAAW;QACb,OAAO;YACL,4CAA4C;YAC5CA,WAAWG;QACb;QAEA,OAAOH;IACT,EAAE,OAAOI,QAAQ;QACf,OAAO;IACT;AACF;AAEA;;CAEC,GACD,OAAO,SAASC,kBAAkBC,cAA8B;IAC9D,IAAIA,mBAAmB,QAAQ;QAC7B,OAAO;IACT;IACA,IAAIA,mBAAmB,QAAQ;QAC7B,OAAO;IACT;IACA,IAAIA,mBAAmB,OAAO;QAC5B,OAAO;IACT;IACA,OAAO;AACT;AAEA;;;CAGC,GACD,OAAO,SAASC,cAAcD,cAA8B;IAC1D,OAAOA,mBAAmB,QAAQ,YAAYA;AAChD;AAEA,SAASH;IACP,MAAMK,YAAYC,QAAQC,GAAG,CAACC,qBAAqB,IAAI;IAEvD,IAAIH,UAAUI,UAAU,CAAC,SAAS;QAChC,OAAO;IACT;IAEA,IAAIJ,UAAUI,UAAU,CAAC,SAAS;QAChC,OAAO;IACT;IAEA,IAAIJ,UAAUI,UAAU,CAAC,QAAQ;QAC/B,OAAO;IACT;IAEA,OAAO;AACT;AAEA,eAAeV,cAAcW,OAAe;IAC1C,IAAI;QACF,MAAMnB,MAAMmB,OAAO,CAACJ,QAAQK,QAAQ,KAAK,UAAU,CAAC,MAAM,EAAED,SAAS,GAAG,CAAC,WAAW,EAAEA,SAAS;QAC/F,OAAO;IACT,EAAE,OAAM;QACN,OAAO;IACT;AACF"}
@@ -1,11 +1,16 @@
1
1
  import type { CliArgs, DbType, NextAppDetails, PackageManager } from '../types.js';
2
+ /** Keep in sync with the `next` peer dependency range of `@payloadcms/next`. */
3
+ export declare const minimumNextVersion: {
4
+ major: number;
5
+ minor: number;
6
+ };
2
7
  type InitNextArgs = {
3
8
  dbType: DbType;
4
9
  nextAppDetails?: NextAppDetails;
5
10
  packageManager: PackageManager;
6
11
  projectDir: string;
7
12
  useDistFiles?: boolean;
8
- } & Pick<CliArgs, '--debug'>;
13
+ } & Pick<CliArgs, '--debug' | '--payload-version'>;
9
14
  type InitNextResult = {
10
15
  isSrcDir: boolean;
11
16
  nextAppDir?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"init-next.d.ts","sourceRoot":"","sources":["../../src/lib/init-next.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAkB,cAAc,EAAE,MAAM,aAAa,CAAA;AAelG,KAAK,YAAY,GAAG;IAClB,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,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;AAE5B,KAAK,cAAc,GACf;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,GAC1E;IACE,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,IAAI,CAAA;CACd,CAAA;AAEL,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAgE1E;AAsID,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA2FnF"}
1
+ {"version":3,"file":"init-next.d.ts","sourceRoot":"","sources":["../../src/lib/init-next.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAkB,cAAc,EAAE,MAAM,aAAa,CAAA;AAiBlG,gFAAgF;AAChF,eAAO,MAAM,kBAAkB;IAAK,KAAK;IAAM,KAAK;CAAK,CAAA;AAEzD,KAAK,YAAY,GAAG;IAClB,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,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,mBAAmB,CAAC,CAAA;AAElD,KAAK,cAAc,GACf;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,GAC1E;IACE,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,IAAI,CAAA;CACd,CAAA;AAEL,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAuE1E;AA2GD,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAwGnF"}
@@ -1,21 +1,23 @@
1
1
  import * as p from '@clack/prompts';
2
- import { parse, stringify } from 'comment-json';
3
2
  import fs from 'fs';
4
3
  import fse from 'fs-extra';
5
4
  import globby from 'globby';
6
5
  import { fileURLToPath } from 'node:url';
7
6
  import path from 'path';
8
- import { promisify } from 'util';
9
7
  import { copyRecursiveSync } from '../utils/copy-recursive-sync.js';
10
8
  import { debug as origDebug, warning } from '../utils/log.js';
11
9
  import { moveMessage } from '../utils/messages.js';
10
+ import { DEFAULT_PAYLOAD_VERSION_TAG, resolvePackageVersion } from '../utils/resolvePackageVersion.js';
11
+ import { configurePayloadTsConfig } from './configure-payload-tsconfig.js';
12
12
  import { ensurePnpmBuildApprovals } from './configure-pnpm-builds.js';
13
13
  import { installPackages } from './install-packages.js';
14
14
  import { wrapNextConfig } from './wrap-next-config.js';
15
- const readFile = promisify(fs.readFile);
16
- const writeFile = promisify(fs.writeFile);
17
15
  const filename = fileURLToPath(import.meta.url);
18
16
  const dirname = path.dirname(filename);
17
+ /** Keep in sync with the `next` peer dependency range of `@payloadcms/next`. */ export const minimumNextVersion = {
18
+ major: 16,
19
+ minor: 4
20
+ };
19
21
  export async function initNext(args) {
20
22
  const { dbType: dbType, packageManager, projectDir } = args;
21
23
  const nextAppDetails = args.nextAppDetails || await getNextAppDetails(projectDir);
@@ -65,7 +67,12 @@ export async function initNext(args) {
65
67
  success: false
66
68
  };
67
69
  }
68
- const { success: installSuccess } = await installDeps(projectDir, packageManager, dbType);
70
+ const { success: installSuccess } = await installDeps({
71
+ dbType,
72
+ packageManager,
73
+ projectDir,
74
+ versionOrTag: args['--payload-version'] ?? DEFAULT_PAYLOAD_VERSION_TAG
75
+ });
69
76
  if (!installSuccess) {
70
77
  installSpinner.stop('Failed to install dependencies', 1);
71
78
  return {
@@ -75,8 +82,10 @@ export async function initNext(args) {
75
82
  success: false
76
83
  };
77
84
  }
78
- // Add `@payload-config` to tsconfig.json `paths`
79
- await addPayloadConfigToTsConfig(projectDir, isSrcDir);
85
+ await configurePayloadTsConfig({
86
+ configPath: path.resolve(projectDir, 'tsconfig.json'),
87
+ payloadConfigPath: configurationResult.payloadConfigPath
88
+ });
80
89
  installSpinner.stop('Successfully installed Payload and dependencies');
81
90
  return {
82
91
  ...configurationResult,
@@ -85,34 +94,6 @@ export async function initNext(args) {
85
94
  success: true
86
95
  };
87
96
  }
88
- async function addPayloadConfigToTsConfig(projectDir, isSrcDir) {
89
- const tsConfigPath = path.resolve(projectDir, 'tsconfig.json');
90
- // Check if tsconfig.json exists
91
- if (!fs.existsSync(tsConfigPath)) {
92
- warning(`Could not find tsconfig.json to add @payload-config path.`);
93
- return;
94
- }
95
- const userTsConfigContent = await readFile(tsConfigPath, {
96
- encoding: 'utf8'
97
- });
98
- const userTsConfig = parse(userTsConfigContent);
99
- const hasBaseUrl = userTsConfig?.compilerOptions?.baseUrl && userTsConfig?.compilerOptions?.baseUrl !== '.';
100
- const baseUrl = hasBaseUrl ? userTsConfig?.compilerOptions?.baseUrl : './';
101
- if (!userTsConfig.compilerOptions && !('extends' in userTsConfig)) {
102
- userTsConfig.compilerOptions = {};
103
- }
104
- if (!userTsConfig.compilerOptions?.paths?.['@payload-config'] && userTsConfig.compilerOptions?.paths) {
105
- userTsConfig.compilerOptions.paths = {
106
- ...userTsConfig.compilerOptions.paths || {},
107
- '@payload-config': [
108
- `${baseUrl}${isSrcDir ? 'src/' : ''}payload.config.ts`
109
- ]
110
- };
111
- await writeFile(tsConfigPath, stringify(userTsConfig, null, 2), {
112
- encoding: 'utf8'
113
- });
114
- }
115
- }
116
97
  async function installAndConfigurePayload(args) {
117
98
  const { '--debug': debug, nextAppDetails: { isSrcDir, nextAppDir, nextConfigPath } = {}, nextConfigType, projectDir, useDistFiles } = args;
118
99
  if (!nextAppDir || !nextConfigPath) {
@@ -162,14 +143,19 @@ async function installAndConfigurePayload(args) {
162
143
  success: true
163
144
  };
164
145
  }
165
- async function installDeps(projectDir, packageManager, dbType) {
146
+ async function installDeps(args) {
147
+ const { dbType, packageManager, projectDir, versionOrTag } = args;
166
148
  const { getDbPackageName } = await import('./ast/adapter-config.js');
149
+ const version = await resolvePackageVersion({
150
+ packageName: 'payload',
151
+ versionOrTag
152
+ });
167
153
  const packagesToInstall = [
168
154
  'payload',
169
155
  '@payloadcms/next',
170
156
  '@payloadcms/richtext-lexical'
171
- ].map((pkg)=>`${pkg}@latest`);
172
- packagesToInstall.push(`${getDbPackageName(dbType)}@latest`);
157
+ ].map((pkg)=>`${pkg}@${version}`);
158
+ packagesToInstall.push(`${getDbPackageName(dbType)}@${version}`);
173
159
  // Match graphql version of @payloadcms/next
174
160
  packagesToInstall.push('graphql@^16.8.1');
175
161
  await ensurePnpmBuildApprovals({
@@ -204,7 +190,7 @@ export async function getNextAppDetails(projectDir) {
204
190
  if (packageObj.dependencies?.next) {
205
191
  nextVersion = packageObj.dependencies.next;
206
192
  // Match versions using regex matching groups
207
- const versionMatch = /(?<major>\d+)/.exec(nextVersion);
193
+ const versionMatch = /(?<major>\d+)(?:\.(?<minor>\d+))?/.exec(nextVersion);
208
194
  if (!versionMatch) {
209
195
  p.log.warn(`Could not determine Next.js version from ${nextVersion}`);
210
196
  return {
@@ -215,9 +201,9 @@ export async function getNextAppDetails(projectDir) {
215
201
  nextVersion
216
202
  };
217
203
  }
218
- const { major } = versionMatch.groups;
204
+ const { major, minor } = versionMatch.groups;
219
205
  const majorVersion = parseInt(major);
220
- if (majorVersion < 15) {
206
+ if (majorVersion < minimumNextVersion.major) {
221
207
  return {
222
208
  hasTopLevelLayout: false,
223
209
  isSrcDir,
@@ -226,6 +212,13 @@ export async function getNextAppDetails(projectDir) {
226
212
  nextVersion
227
213
  };
228
214
  }
215
+ // TODO: Older minor versions of the minimum major are only warned about, not rejected, to make
216
+ // migrating easier. This can be turned into a hard requirement in the future.
217
+ // A specifier without a minor version (e.g. `^16`) can resolve to any minor, so it is not warned about.
218
+ const isBelowMinimumMinor = majorVersion === minimumNextVersion.major && minor !== undefined && parseInt(minor) < minimumNextVersion.minor;
219
+ if (isBelowMinimumMinor) {
220
+ p.log.warn(`Next.js v${nextVersion} is not supported. Upgrade to Next.js >= ${minimumNextVersion.major}.${minimumNextVersion.minor} to use Payload.`);
221
+ }
229
222
  }
230
223
  const isSupportedNextVersion = true;
231
224
  // Check if Payload already installed