create-payload-app 3.0.0-canary.92e4997 → 3.0.0-canary.a78fca3

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 (59) hide show
  1. package/dist/lib/configure-payload-config.d.ts +8 -2
  2. package/dist/lib/configure-payload-config.d.ts.map +1 -1
  3. package/dist/lib/configure-payload-config.js +74 -25
  4. package/dist/lib/configure-payload-config.js.map +1 -1
  5. package/dist/lib/create-project.d.ts.map +1 -1
  6. package/dist/lib/create-project.js +9 -2
  7. package/dist/lib/create-project.js.map +1 -1
  8. package/dist/lib/create-project.spec.js +9 -12
  9. package/dist/lib/create-project.spec.js.map +1 -1
  10. package/dist/lib/get-package-manager.d.ts +6 -0
  11. package/dist/lib/get-package-manager.d.ts.map +1 -0
  12. package/dist/lib/get-package-manager.js +29 -0
  13. package/dist/lib/get-package-manager.js.map +1 -0
  14. package/dist/lib/init-next.d.ts +1 -9
  15. package/dist/lib/init-next.d.ts.map +1 -1
  16. package/dist/lib/init-next.js +31 -50
  17. package/dist/lib/init-next.js.map +1 -1
  18. package/dist/lib/install-packages.d.ts +9 -0
  19. package/dist/lib/install-packages.d.ts.map +1 -0
  20. package/dist/lib/install-packages.js +43 -0
  21. package/dist/lib/install-packages.js.map +1 -0
  22. package/dist/lib/replacements.d.ts +27 -0
  23. package/dist/lib/replacements.d.ts.map +1 -0
  24. package/dist/lib/replacements.js +67 -0
  25. package/dist/lib/replacements.js.map +1 -0
  26. package/dist/lib/templates.js +1 -26
  27. package/dist/lib/templates.js.map +1 -1
  28. package/dist/lib/update-payload-in-project.d.ts +6 -0
  29. package/dist/lib/update-payload-in-project.d.ts.map +1 -0
  30. package/dist/lib/update-payload-in-project.js +71 -0
  31. package/dist/lib/update-payload-in-project.js.map +1 -0
  32. package/dist/lib/wrap-next-config.d.ts.map +1 -1
  33. package/dist/lib/wrap-next-config.js +1 -2
  34. package/dist/lib/wrap-next-config.js.map +1 -1
  35. package/dist/lib/wrap-next-config.spec.js +1 -0
  36. package/dist/lib/wrap-next-config.spec.js.map +1 -1
  37. package/dist/main.d.ts.map +1 -1
  38. package/dist/main.js +28 -21
  39. package/dist/main.js.map +1 -1
  40. package/dist/template/src/collections/Media.ts +16 -0
  41. package/dist/template/src/payload.config.ts +9 -14
  42. package/dist/types.d.ts +11 -0
  43. package/dist/types.d.ts.map +1 -1
  44. package/dist/types.js.map +1 -1
  45. package/dist/utils/copy-recursive-sync.d.ts +2 -0
  46. package/dist/utils/copy-recursive-sync.d.ts.map +1 -1
  47. package/dist/utils/copy-recursive-sync.js +2 -0
  48. package/dist/utils/copy-recursive-sync.js.map +1 -1
  49. package/dist/utils/git.d.ts +4 -0
  50. package/dist/utils/git.d.ts.map +1 -0
  51. package/dist/utils/git.js +46 -0
  52. package/dist/utils/git.js.map +1 -0
  53. package/dist/utils/messages.d.ts.map +1 -1
  54. package/dist/utils/messages.js.map +1 -1
  55. package/package.json +19 -7
  56. package/dist/lib/packages.d.ts +0 -9
  57. package/dist/lib/packages.d.ts.map +0 -1
  58. package/dist/lib/packages.js +0 -27
  59. package/dist/lib/packages.js.map +0 -1
@@ -1,11 +1,17 @@
1
- import type { DbDetails } from '../types.js';
1
+ import type { DbType, StorageAdapterType } from '../types.js';
2
2
  /** Update payload config with necessary imports and adapters */
3
3
  export declare function configurePayloadConfig(args: {
4
- dbDetails: DbDetails | undefined;
4
+ dbType?: DbType;
5
+ envNames?: {
6
+ dbUri: string;
7
+ };
8
+ packageJsonName?: string;
5
9
  projectDirOrConfigPath: {
6
10
  payloadConfigPath: string;
7
11
  } | {
8
12
  projectDir: string;
9
13
  };
14
+ sharp?: boolean;
15
+ storageAdapter?: StorageAdapterType;
10
16
  }): Promise<void>;
11
17
  //# sourceMappingURL=configure-payload-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"configure-payload-config.d.ts","sourceRoot":"","sources":["../../src/lib/configure-payload-config.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAK5C,gEAAgE;AAChE,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,SAAS,EAAE,SAAS,GAAG,SAAS,CAAA;IAChC,sBAAsB,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAA;CAC/E,GAAG,OAAO,CAAC,IAAI,CAAC,CAyFhB"}
1
+ {"version":3,"file":"configure-payload-config.d.ts","sourceRoot":"","sources":["../../src/lib/configure-payload-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAK7D,gEAAgE;AAChE,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE;QACT,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,sBAAsB,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9E,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,cAAc,CAAC,EAAE,kBAAkB,CAAA;CACpC,GAAG,OAAO,CAAC,IAAI,CAAC,CA8HhB"}
@@ -1,13 +1,10 @@
1
1
  import fse from 'fs-extra';
2
2
  import globby from 'globby';
3
- import { fileURLToPath } from 'node:url';
4
3
  import path from 'path';
5
- const filename = fileURLToPath(import.meta.url);
6
- const dirname = path.dirname(filename);
7
4
  import { warning } from '../utils/log.js';
8
- import { dbReplacements } from './packages.js';
5
+ import { dbReplacements, storageReplacements } from './replacements.js';
9
6
  /** Update payload config with necessary imports and adapters */ export async function configurePayloadConfig(args) {
10
- if (!args.dbDetails) {
7
+ if (!args.dbType) {
11
8
  return;
12
9
  }
13
10
  // Update package.json
@@ -15,7 +12,7 @@ import { dbReplacements } from './packages.js';
15
12
  if (packageJsonPath && fse.existsSync(packageJsonPath)) {
16
13
  try {
17
14
  const packageObj = await fse.readJson(packageJsonPath);
18
- const dbPackage = dbReplacements[args.dbDetails.type];
15
+ const dbPackage = dbReplacements[args.dbType];
19
16
  // Delete all other db adapters
20
17
  Object.values(dbReplacements).forEach((p)=>{
21
18
  if (p.packageName !== dbPackage.packageName) {
@@ -24,6 +21,20 @@ import { dbReplacements } from './packages.js';
24
21
  });
25
22
  // Set version of db adapter to match payload version
26
23
  packageObj.dependencies[dbPackage.packageName] = packageObj.dependencies['payload'];
24
+ if (args.storageAdapter) {
25
+ const storagePackage = storageReplacements[args.storageAdapter];
26
+ if (storagePackage?.packageName) {
27
+ // Set version of storage adapter to match payload version
28
+ packageObj.dependencies[storagePackage.packageName] = packageObj.dependencies['payload'];
29
+ }
30
+ }
31
+ // Sharp provided by default, only remove if explicitly set to false
32
+ if (args.sharp === false) {
33
+ delete packageObj.dependencies['sharp'];
34
+ }
35
+ if (args.packageJsonName) {
36
+ packageObj.name = args.packageJsonName;
37
+ }
27
38
  await fse.writeJson(packageJsonPath, packageObj, {
28
39
  spaces: 2
29
40
  });
@@ -47,31 +58,69 @@ import { dbReplacements } from './packages.js';
47
58
  return;
48
59
  }
49
60
  const configContent = fse.readFileSync(payloadConfigPath, 'utf-8');
50
- const configLines = configContent.split('\n');
51
- const dbReplacement = dbReplacements[args.dbDetails.type];
52
- let dbConfigStartLineIndex;
53
- let dbConfigEndLineIndex;
54
- configLines.forEach((l, i)=>{
55
- if (l.includes('// database-adapter-import')) {
56
- configLines[i] = dbReplacement.importReplacement;
57
- }
58
- if (l.includes('// database-adapter-config-start')) {
59
- dbConfigStartLineIndex = i;
60
- }
61
- if (l.includes('// database-adapter-config-end')) {
62
- dbConfigEndLineIndex = i;
63
- }
61
+ let configLines = configContent.split('\n');
62
+ // DB Replacement
63
+ const dbReplacement = dbReplacements[args.dbType];
64
+ configLines = replaceInConfigLines({
65
+ endMatch: `// database-adapter-config-end`,
66
+ lines: configLines,
67
+ replacement: dbReplacement.configReplacement(args.envNames?.dbUri),
68
+ startMatch: `// database-adapter-config-start`
64
69
  });
65
- if (!dbConfigStartLineIndex || !dbConfigEndLineIndex) {
66
- warning('Unable to update payload.config.ts with database adapter import');
67
- } else {
68
- // Replaces lines between `// database-adapter-config-start` and `// database-adapter-config-end`
69
- configLines.splice(dbConfigStartLineIndex, dbConfigEndLineIndex - dbConfigStartLineIndex + 1, ...dbReplacement.configReplacement);
70
+ configLines = replaceInConfigLines({
71
+ lines: configLines,
72
+ replacement: [
73
+ dbReplacement.importReplacement
74
+ ],
75
+ startMatch: '// database-adapter-import'
76
+ });
77
+ // Storage Adapter Replacement
78
+ if (args.storageAdapter) {
79
+ const replacement = storageReplacements[args.storageAdapter];
80
+ configLines = replaceInConfigLines({
81
+ lines: configLines,
82
+ replacement: replacement.configReplacement,
83
+ startMatch: '// storage-adapter-placeholder'
84
+ });
85
+ if (replacement?.importReplacement) {
86
+ configLines = replaceInConfigLines({
87
+ lines: configLines,
88
+ replacement: [
89
+ replacement.importReplacement
90
+ ],
91
+ startMatch: '// storage-adapter-import-placeholder'
92
+ });
93
+ }
94
+ }
95
+ // Sharp Replacement (provided by default, only remove if explicitly set to false)
96
+ if (args.sharp === false) {
97
+ configLines = replaceInConfigLines({
98
+ lines: configLines,
99
+ replacement: [],
100
+ startMatch: 'sharp,'
101
+ });
102
+ configLines = replaceInConfigLines({
103
+ lines: configLines,
104
+ replacement: [],
105
+ startMatch: "import sharp from 'sharp'"
106
+ });
70
107
  }
71
108
  fse.writeFileSync(payloadConfigPath, configLines.join('\n'));
72
109
  } catch (err) {
73
110
  warning(`Unable to update payload.config.ts with plugins: ${err instanceof Error ? err.message : ''}`);
74
111
  }
75
112
  }
113
+ function replaceInConfigLines({ endMatch, lines, replacement, startMatch }) {
114
+ if (!replacement) {
115
+ return lines;
116
+ }
117
+ const startIndex = lines.findIndex((l)=>l.includes(startMatch));
118
+ const endIndex = endMatch ? lines.findIndex((l)=>l.includes(endMatch)) : startIndex;
119
+ if (startIndex === -1 || endIndex === -1) {
120
+ return lines;
121
+ }
122
+ lines.splice(startIndex, endIndex - startIndex + 1, ...replacement);
123
+ return lines;
124
+ }
76
125
 
77
126
  //# sourceMappingURL=configure-payload-config.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/configure-payload-config.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport globby from 'globby'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\nimport type { DbDetails } from '../types.js'\n\nimport { warning } from '../utils/log.js'\nimport { dbReplacements } from './packages.js'\n\n/** Update payload config with necessary imports and adapters */\nexport async function configurePayloadConfig(args: {\n dbDetails: DbDetails | undefined\n projectDirOrConfigPath: { payloadConfigPath: string } | { projectDir: string }\n}): Promise<void> {\n if (!args.dbDetails) {\n return\n }\n\n // Update package.json\n const packageJsonPath =\n 'projectDir' in args.projectDirOrConfigPath &&\n path.resolve(args.projectDirOrConfigPath.projectDir, 'package.json')\n\n if (packageJsonPath && fse.existsSync(packageJsonPath)) {\n try {\n const packageObj = await fse.readJson(packageJsonPath)\n\n const dbPackage = dbReplacements[args.dbDetails.type]\n\n // Delete all other db adapters\n Object.values(dbReplacements).forEach((p) => {\n if (p.packageName !== dbPackage.packageName) {\n delete packageObj.dependencies[p.packageName]\n }\n })\n\n // Set version of db adapter to match payload version\n packageObj.dependencies[dbPackage.packageName] = packageObj.dependencies['payload']\n\n await fse.writeJson(packageJsonPath, packageObj, { spaces: 2 })\n } catch (err: unknown) {\n warning(`Unable to configure Payload in package.json`)\n warning(err instanceof Error ? err.message : '')\n }\n }\n\n try {\n let payloadConfigPath: string | undefined\n if (!('payloadConfigPath' in args.projectDirOrConfigPath)) {\n payloadConfigPath = (\n await globby('**/payload.config.ts', {\n absolute: true,\n cwd: args.projectDirOrConfigPath.projectDir,\n })\n )?.[0]\n } else {\n payloadConfigPath = args.projectDirOrConfigPath.payloadConfigPath\n }\n\n if (!payloadConfigPath) {\n warning('Unable to update payload.config.ts with plugins. Could not find payload.config.ts.')\n return\n }\n\n const configContent = fse.readFileSync(payloadConfigPath, 'utf-8')\n const configLines = configContent.split('\\n')\n\n const dbReplacement = dbReplacements[args.dbDetails.type]\n\n let dbConfigStartLineIndex: number | undefined\n let dbConfigEndLineIndex: number | undefined\n\n configLines.forEach((l, i) => {\n if (l.includes('// database-adapter-import')) {\n configLines[i] = dbReplacement.importReplacement\n }\n\n if (l.includes('// database-adapter-config-start')) {\n dbConfigStartLineIndex = i\n }\n if (l.includes('// database-adapter-config-end')) {\n dbConfigEndLineIndex = i\n }\n })\n\n if (!dbConfigStartLineIndex || !dbConfigEndLineIndex) {\n warning('Unable to update payload.config.ts with database adapter import')\n } else {\n // Replaces lines between `// database-adapter-config-start` and `// database-adapter-config-end`\n configLines.splice(\n dbConfigStartLineIndex,\n dbConfigEndLineIndex - dbConfigStartLineIndex + 1,\n ...dbReplacement.configReplacement,\n )\n }\n\n fse.writeFileSync(payloadConfigPath, configLines.join('\\n'))\n } catch (err: unknown) {\n warning(\n `Unable to update payload.config.ts with plugins: ${err instanceof Error ? err.message : ''}`,\n )\n }\n}\n"],"names":["fse","globby","fileURLToPath","path","filename","url","dirname","warning","dbReplacements","configurePayloadConfig","args","dbDetails","packageJsonPath","projectDirOrConfigPath","resolve","projectDir","existsSync","packageObj","readJson","dbPackage","type","Object","values","forEach","p","packageName","dependencies","writeJson","spaces","err","Error","message","payloadConfigPath","absolute","cwd","configContent","readFileSync","configLines","split","dbReplacement","dbConfigStartLineIndex","dbConfigEndLineIndex","l","i","includes","importReplacement","splice","configReplacement","writeFileSync","join"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,OAAOA,SAAS,WAAU;AAC1B,OAAOC,YAAY,SAAQ;AAC3B,SAASC,aAAa,QAAQ,WAAU;AACxC,OAAOC,UAAU,OAAM;AACvB,MAAMC,WAAWF,cAAc,YAAYG,GAAG;AAC9C,MAAMC,UAAUH,KAAKG,OAAO,CAACF;AAI7B,SAASG,OAAO,QAAQ,kBAAiB;AACzC,SAASC,cAAc,QAAQ,gBAAe;AAE9C,8DAA8D,GAC9D,OAAO,eAAeC,uBAAuBC,IAG5C;IACC,IAAI,CAACA,KAAKC,SAAS,EAAE;QACnB;IACF;IAEA,sBAAsB;IACtB,MAAMC,kBACJ,gBAAgBF,KAAKG,sBAAsB,IAC3CV,KAAKW,OAAO,CAACJ,KAAKG,sBAAsB,CAACE,UAAU,EAAE;IAEvD,IAAIH,mBAAmBZ,IAAIgB,UAAU,CAACJ,kBAAkB;QACtD,IAAI;YACF,MAAMK,aAAa,MAAMjB,IAAIkB,QAAQ,CAACN;YAEtC,MAAMO,YAAYX,cAAc,CAACE,KAAKC,SAAS,CAACS,IAAI,CAAC;YAErD,+BAA+B;YAC/BC,OAAOC,MAAM,CAACd,gBAAgBe,OAAO,CAAC,CAACC;gBACrC,IAAIA,EAAEC,WAAW,KAAKN,UAAUM,WAAW,EAAE;oBAC3C,OAAOR,WAAWS,YAAY,CAACF,EAAEC,WAAW,CAAC;gBAC/C;YACF;YAEA,qDAAqD;YACrDR,WAAWS,YAAY,CAACP,UAAUM,WAAW,CAAC,GAAGR,WAAWS,YAAY,CAAC,UAAU;YAEnF,MAAM1B,IAAI2B,SAAS,CAACf,iBAAiBK,YAAY;gBAAEW,QAAQ;YAAE;QAC/D,EAAE,OAAOC,KAAc;YACrBtB,QAAQ,CAAC,2CAA2C,CAAC;YACrDA,QAAQsB,eAAeC,QAAQD,IAAIE,OAAO,GAAG;QAC/C;IACF;IAEA,IAAI;QACF,IAAIC;QACJ,IAAI,CAAE,CAAA,uBAAuBtB,KAAKG,sBAAsB,AAAD,GAAI;YACzDmB,oBACE,CAAA,MAAM/B,OAAO,wBAAwB;gBACnCgC,UAAU;gBACVC,KAAKxB,KAAKG,sBAAsB,CAACE,UAAU;YAC7C,EAAC,GACA,CAAC,EAAE;QACR,OAAO;YACLiB,oBAAoBtB,KAAKG,sBAAsB,CAACmB,iBAAiB;QACnE;QAEA,IAAI,CAACA,mBAAmB;YACtBzB,QAAQ;YACR;QACF;QAEA,MAAM4B,gBAAgBnC,IAAIoC,YAAY,CAACJ,mBAAmB;QAC1D,MAAMK,cAAcF,cAAcG,KAAK,CAAC;QAExC,MAAMC,gBAAgB/B,cAAc,CAACE,KAAKC,SAAS,CAACS,IAAI,CAAC;QAEzD,IAAIoB;QACJ,IAAIC;QAEJJ,YAAYd,OAAO,CAAC,CAACmB,GAAGC;YACtB,IAAID,EAAEE,QAAQ,CAAC,+BAA+B;gBAC5CP,WAAW,CAACM,EAAE,GAAGJ,cAAcM,iBAAiB;YAClD;YAEA,IAAIH,EAAEE,QAAQ,CAAC,qCAAqC;gBAClDJ,yBAAyBG;YAC3B;YACA,IAAID,EAAEE,QAAQ,CAAC,mCAAmC;gBAChDH,uBAAuBE;YACzB;QACF;QAEA,IAAI,CAACH,0BAA0B,CAACC,sBAAsB;YACpDlC,QAAQ;QACV,OAAO;YACL,iGAAiG;YACjG8B,YAAYS,MAAM,CAChBN,wBACAC,uBAAuBD,yBAAyB,MAC7CD,cAAcQ,iBAAiB;QAEtC;QAEA/C,IAAIgD,aAAa,CAAChB,mBAAmBK,YAAYY,IAAI,CAAC;IACxD,EAAE,OAAOpB,KAAc;QACrBtB,QACE,CAAC,iDAAiD,EAAEsB,eAAeC,QAAQD,IAAIE,OAAO,GAAG,GAAG,CAAC;IAEjG;AACF"}
1
+ {"version":3,"sources":["../../src/lib/configure-payload-config.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport globby from 'globby'\nimport path from 'path'\n\nimport type { DbType, StorageAdapterType } from '../types.js'\n\nimport { warning } from '../utils/log.js'\nimport { dbReplacements, storageReplacements } from './replacements.js'\n\n/** Update payload config with necessary imports and adapters */\nexport async function configurePayloadConfig(args: {\n dbType?: DbType\n envNames?: {\n dbUri: string\n }\n packageJsonName?: string\n projectDirOrConfigPath: { payloadConfigPath: string } | { projectDir: string }\n sharp?: boolean\n storageAdapter?: StorageAdapterType\n}): Promise<void> {\n if (!args.dbType) {\n return\n }\n\n // Update package.json\n const packageJsonPath =\n 'projectDir' in args.projectDirOrConfigPath &&\n path.resolve(args.projectDirOrConfigPath.projectDir, 'package.json')\n\n if (packageJsonPath && fse.existsSync(packageJsonPath)) {\n try {\n const packageObj = await fse.readJson(packageJsonPath)\n\n const dbPackage = dbReplacements[args.dbType]\n\n // Delete all other db adapters\n Object.values(dbReplacements).forEach((p) => {\n if (p.packageName !== dbPackage.packageName) {\n delete packageObj.dependencies[p.packageName]\n }\n })\n\n // Set version of db adapter to match payload version\n packageObj.dependencies[dbPackage.packageName] = packageObj.dependencies['payload']\n\n if (args.storageAdapter) {\n const storagePackage = storageReplacements[args.storageAdapter]\n\n if (storagePackage?.packageName) {\n // Set version of storage adapter to match payload version\n packageObj.dependencies[storagePackage.packageName] = packageObj.dependencies['payload']\n }\n }\n\n // Sharp provided by default, only remove if explicitly set to false\n if (args.sharp === false) {\n delete packageObj.dependencies['sharp']\n }\n\n if (args.packageJsonName) {\n packageObj.name = args.packageJsonName\n }\n\n await fse.writeJson(packageJsonPath, packageObj, { spaces: 2 })\n } catch (err: unknown) {\n warning(`Unable to configure Payload in package.json`)\n warning(err instanceof Error ? err.message : '')\n }\n }\n\n try {\n let payloadConfigPath: string | undefined\n if (!('payloadConfigPath' in args.projectDirOrConfigPath)) {\n payloadConfigPath = (\n await globby('**/payload.config.ts', {\n absolute: true,\n cwd: args.projectDirOrConfigPath.projectDir,\n })\n )?.[0]\n } else {\n payloadConfigPath = args.projectDirOrConfigPath.payloadConfigPath\n }\n\n if (!payloadConfigPath) {\n warning('Unable to update payload.config.ts with plugins. Could not find payload.config.ts.')\n return\n }\n\n const configContent = fse.readFileSync(payloadConfigPath, 'utf-8')\n let configLines = configContent.split('\\n')\n\n // DB Replacement\n const dbReplacement = dbReplacements[args.dbType]\n\n configLines = replaceInConfigLines({\n endMatch: `// database-adapter-config-end`,\n lines: configLines,\n replacement: dbReplacement.configReplacement(args.envNames?.dbUri),\n startMatch: `// database-adapter-config-start`,\n })\n\n configLines = replaceInConfigLines({\n lines: configLines,\n replacement: [dbReplacement.importReplacement],\n startMatch: '// database-adapter-import',\n })\n\n // Storage Adapter Replacement\n if (args.storageAdapter) {\n const replacement = storageReplacements[args.storageAdapter]\n configLines = replaceInConfigLines({\n lines: configLines,\n replacement: replacement.configReplacement,\n startMatch: '// storage-adapter-placeholder',\n })\n\n if (replacement?.importReplacement) {\n configLines = replaceInConfigLines({\n lines: configLines,\n replacement: [replacement.importReplacement],\n startMatch: '// storage-adapter-import-placeholder',\n })\n }\n }\n\n // Sharp Replacement (provided by default, only remove if explicitly set to false)\n if (args.sharp === false) {\n configLines = replaceInConfigLines({\n lines: configLines,\n replacement: [],\n startMatch: 'sharp,',\n })\n configLines = replaceInConfigLines({\n lines: configLines,\n replacement: [],\n startMatch: \"import sharp from 'sharp'\",\n })\n }\n\n fse.writeFileSync(payloadConfigPath, configLines.join('\\n'))\n } catch (err: unknown) {\n warning(\n `Unable to update payload.config.ts with plugins: ${err instanceof Error ? err.message : ''}`,\n )\n }\n}\n\nfunction replaceInConfigLines({\n endMatch,\n lines,\n replacement,\n startMatch,\n}: {\n /** Optional endMatch to replace multiple lines */\n endMatch?: string\n lines: string[]\n replacement: string[]\n startMatch: string\n}) {\n if (!replacement) {\n return lines\n }\n\n const startIndex = lines.findIndex((l) => l.includes(startMatch))\n const endIndex = endMatch ? lines.findIndex((l) => l.includes(endMatch)) : startIndex\n\n if (startIndex === -1 || endIndex === -1) {\n return lines\n }\n\n lines.splice(startIndex, endIndex - startIndex + 1, ...replacement)\n return lines\n}\n"],"names":["fse","globby","path","warning","dbReplacements","storageReplacements","configurePayloadConfig","args","dbType","packageJsonPath","projectDirOrConfigPath","resolve","projectDir","existsSync","packageObj","readJson","dbPackage","Object","values","forEach","p","packageName","dependencies","storageAdapter","storagePackage","sharp","packageJsonName","name","writeJson","spaces","err","Error","message","payloadConfigPath","absolute","cwd","configContent","readFileSync","configLines","split","dbReplacement","replaceInConfigLines","endMatch","lines","replacement","configReplacement","envNames","dbUri","startMatch","importReplacement","writeFileSync","join","startIndex","findIndex","l","includes","endIndex","splice"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/lib/create-project.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AA2CtF,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,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;IACnB,QAAQ,EAAE,eAAe,CAAA;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDhB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhB"}
1
+ {"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/lib/create-project.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AA4CtF,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,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;IACnB,QAAQ,EAAE,eAAe,CAAA;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DhB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhB"}
@@ -5,7 +5,8 @@ import execa from 'execa';
5
5
  import fse from 'fs-extra';
6
6
  import { fileURLToPath } from 'node:url';
7
7
  import path from 'path';
8
- import { debug, error, warning } from '../utils/log.js';
8
+ import { tryInitRepoAndCommit } from '../utils/git.js';
9
+ import { debug, error, info, warning } from '../utils/log.js';
9
10
  import { configurePayloadConfig } from './configure-payload-config.js';
10
11
  const filename = fileURLToPath(import.meta.url);
11
12
  const dirname = path.dirname(filename);
@@ -64,7 +65,7 @@ export async function createProject(args) {
64
65
  });
65
66
  spinner.message('Configuring Payload...');
66
67
  await configurePayloadConfig({
67
- dbDetails,
68
+ dbType: dbDetails?.type,
68
69
  projectDirOrConfigPath: {
69
70
  projectDir
70
71
  }
@@ -75,6 +76,7 @@ export async function createProject(args) {
75
76
  await fse.remove(lockPath);
76
77
  }
77
78
  if (!cliArgs['--no-deps']) {
79
+ info(`Using ${packageManager}.\n`);
78
80
  spinner.message('Installing dependencies...');
79
81
  const result = await installDeps({
80
82
  cliArgs,
@@ -89,6 +91,11 @@ export async function createProject(args) {
89
91
  } else {
90
92
  spinner.stop('Dependency installation skipped');
91
93
  }
94
+ if (!cliArgs['--no-git']) {
95
+ tryInitRepoAndCommit({
96
+ cwd: projectDir
97
+ });
98
+ }
92
99
  }
93
100
  export async function updatePackageJSON(args) {
94
101
  const { projectDir, projectName } = args;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/create-project.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport chalk from 'chalk'\nimport degit from 'degit'\nimport execa from 'execa'\nimport fse from 'fs-extra'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\n\nimport type { CliArgs, DbDetails, PackageManager, ProjectTemplate } from '../types.js'\n\nimport { debug, error, warning } from '../utils/log.js'\nimport { configurePayloadConfig } from './configure-payload-config.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 }\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\nexport async function createProject(args: {\n cliArgs: CliArgs\n dbDetails?: DbDetails\n packageManager: PackageManager\n projectDir: string\n projectName: string\n template: ProjectTemplate\n}): Promise<void> {\n const { cliArgs, dbDetails, packageManager, projectDir, projectName, template } = 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-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 ('url' in template) {\n let templateUrl = template.url\n if (cliArgs['--template-branch']) {\n templateUrl = `${template.url}#${cliArgs['--template-branch']}`\n debug(`Using template url: ${templateUrl}`)\n }\n const emitter = degit(templateUrl)\n await emitter.clone(projectDir)\n }\n\n const spinner = p.spinner()\n spinner.start('Checking latest Payload version...')\n\n await updatePackageJSON({ projectDir, projectName })\n spinner.message('Configuring Payload...')\n await configurePayloadConfig({ dbDetails, projectDirOrConfigPath: { projectDir } })\n\n // Remove yarn.lock file. This is only desired in Payload Cloud.\n const lockPath = path.resolve(projectDir, 'yarn.lock')\n if (fse.existsSync(lockPath)) {\n await fse.remove(lockPath)\n }\n\n if (!cliArgs['--no-deps']) {\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\nexport async function updatePackageJSON(args: {\n projectDir: string\n projectName: string\n}): Promise<void> {\n const { 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 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"],"names":["p","chalk","degit","execa","fse","fileURLToPath","path","debug","error","warning","configurePayloadConfig","filename","url","dirname","createOrFindProjectDir","projectDir","pathExists","mkdir","installDeps","args","cliArgs","packageManager","installCmd","command","cwd","resolve","err","Error","message","createProject","dbDetails","projectName","template","green","localTemplate","copy","templateUrl","emitter","clone","spinner","start","updatePackageJSON","projectDirOrConfigPath","lockPath","existsSync","remove","result","stop","packageJsonPath","packageObj","readJson","name","writeJson","spaces"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","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 degit from 'degit'\nimport execa from 'execa'\nimport fse from 'fs-extra'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\n\nimport type { CliArgs, DbDetails, PackageManager, ProjectTemplate } 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'\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 }\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\nexport async function createProject(args: {\n cliArgs: CliArgs\n dbDetails?: DbDetails\n packageManager: PackageManager\n projectDir: string\n projectName: string\n template: ProjectTemplate\n}): Promise<void> {\n const { cliArgs, dbDetails, packageManager, projectDir, projectName, template } = 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-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 ('url' in template) {\n let templateUrl = template.url\n if (cliArgs['--template-branch']) {\n templateUrl = `${template.url}#${cliArgs['--template-branch']}`\n debug(`Using template url: ${templateUrl}`)\n }\n const emitter = degit(templateUrl)\n await emitter.clone(projectDir)\n }\n\n const spinner = p.spinner()\n spinner.start('Checking latest Payload version...')\n\n await updatePackageJSON({ projectDir, projectName })\n spinner.message('Configuring Payload...')\n await configurePayloadConfig({\n dbType: dbDetails?.type,\n projectDirOrConfigPath: { projectDir },\n })\n\n // Remove yarn.lock file. This is only desired in Payload Cloud.\n const lockPath = path.resolve(projectDir, 'yarn.lock')\n if (fse.existsSync(lockPath)) {\n await fse.remove(lockPath)\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\nexport async function updatePackageJSON(args: {\n projectDir: string\n projectName: string\n}): Promise<void> {\n const { 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 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"],"names":["p","chalk","degit","execa","fse","fileURLToPath","path","tryInitRepoAndCommit","debug","error","info","warning","configurePayloadConfig","filename","url","dirname","createOrFindProjectDir","projectDir","pathExists","mkdir","installDeps","args","cliArgs","packageManager","installCmd","command","cwd","resolve","err","Error","message","createProject","dbDetails","projectName","template","green","localTemplate","copy","templateUrl","emitter","clone","spinner","start","updatePackageJSON","dbType","type","projectDirOrConfigPath","lockPath","existsSync","remove","result","stop","packageJsonPath","packageObj","readJson","name","writeJson","spaces"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1,23 +1,18 @@
1
1
  import fse from 'fs-extra';
2
2
  import path from 'path';
3
3
  import { createProject } from './create-project.js';
4
- import { fileURLToPath } from 'node:url';
5
- import { dbReplacements } from './packages.js';
4
+ import { dbReplacements } from './replacements.js';
6
5
  import { getValidTemplates } from './templates.js';
7
6
  import globby from 'globby';
8
- const filename = fileURLToPath(import.meta.url);
9
- const dirname = path.dirname(filename);
10
- const projectDir = path.resolve(dirname, './tmp');
7
+ import { jest } from '@jest/globals';
8
+ import tempDirectory from 'temp-dir';
11
9
  describe('createProject', ()=>{
10
+ let projectDir;
12
11
  beforeAll(()=>{
13
12
  console.log = jest.fn();
14
13
  });
15
14
  beforeEach(()=>{
16
- if (fse.existsSync(projectDir)) {
17
- fse.rmdirSync(projectDir, {
18
- recursive: true
19
- });
20
- }
15
+ projectDir = `${tempDirectory}/${Math.random().toString(36).substring(7)}`;
21
16
  });
22
17
  afterEach(()=>{
23
18
  if (fse.existsSync(projectDir)) {
@@ -33,7 +28,7 @@ describe('createProject', ()=>{
33
28
  'project-name'
34
29
  ],
35
30
  '--db': 'mongodb',
36
- '--local-template': 'blank',
31
+ '--local-template': 'blank-3.0',
37
32
  '--no-deps': true
38
33
  };
39
34
  const packageManager = 'yarn';
@@ -90,6 +85,8 @@ describe('createProject', ()=>{
90
85
  const dbReplacement = dbReplacements[db];
91
86
  const packageJsonPath = path.resolve(projectDir, 'package.json');
92
87
  const packageJson = fse.readJsonSync(packageJsonPath);
88
+ // Verify git was initialized
89
+ expect(fse.existsSync(path.resolve(projectDir, '.git'))).toBe(true);
93
90
  // Should only have one db adapter
94
91
  expect(Object.keys(packageJson.dependencies).filter((n)=>n.startsWith('@payloadcms/db-'))).toHaveLength(1);
95
92
  const payloadConfigPath = (await globby('**/payload.config.ts', {
@@ -105,7 +102,7 @@ describe('createProject', ()=>{
105
102
  expect(content).toContain(dbReplacement.importReplacement);
106
103
  expect(content).not.toContain('// database-adapter-config-start');
107
104
  expect(content).not.toContain('// database-adapter-config-end');
108
- expect(content).toContain(dbReplacement.configReplacement.join('\n'));
105
+ expect(content).toContain(dbReplacement.configReplacement().join('\n'));
109
106
  });
110
107
  });
111
108
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/create-project.spec.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport path from 'path'\nimport type { CliArgs, DbType, ProjectTemplate } from '../types.js'\nimport { createProject } from './create-project.js'\nimport { fileURLToPath } from 'node:url'\nimport { dbReplacements } from './packages.js'\nimport { getValidTemplates } from './templates.js'\nimport globby from 'globby'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\nconst projectDir = path.resolve(dirname, './tmp')\ndescribe('createProject', () => {\n beforeAll(() => {\n console.log = jest.fn()\n })\n\n beforeEach(() => {\n if (fse.existsSync(projectDir)) {\n fse.rmdirSync(projectDir, { recursive: true })\n }\n })\n afterEach(() => {\n if (fse.existsSync(projectDir)) {\n fse.rmSync(projectDir, { recursive: true })\n }\n })\n\n describe('#createProject', () => {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const args = {\n _: ['project-name'],\n '--db': 'mongodb',\n '--local-template': 'blank',\n '--no-deps': true,\n } as CliArgs\n const packageManager = 'yarn'\n\n it('creates plugin template', async () => {\n const projectName = 'plugin'\n const template: ProjectTemplate = {\n name: 'plugin',\n type: 'plugin',\n url: 'https://github.com/payloadcms/payload-plugin-template',\n description: 'Template for creating a Payload plugin',\n }\n await createProject({\n cliArgs: args,\n projectName,\n projectDir,\n template,\n packageManager,\n })\n\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n const packageJson = fse.readJsonSync(packageJsonPath)\n\n // Check package name and description\n expect(packageJson.name).toEqual(projectName)\n })\n\n describe('creates project from template', () => {\n const templates = getValidTemplates()\n\n it.each([\n ['blank-3.0', 'mongodb'],\n ['blank-3.0', 'postgres'],\n\n // TODO: Re-enable these once 3.0 is stable and templates updated\n // ['website', 'mongodb'],\n // ['website', 'postgres'],\n // ['ecommerce', 'mongodb'],\n // ['ecommerce', 'postgres'],\n ])('update config and deps: %s, %s', async (templateName, db) => {\n const projectName = 'starter-project'\n\n const template = templates.find((t) => t.name === templateName)\n\n const cliArgs = {\n ...args,\n '--db': db,\n '--local-template': templateName,\n } as CliArgs\n\n await createProject({\n cliArgs,\n projectName,\n projectDir,\n template: template as ProjectTemplate,\n packageManager,\n dbDetails: {\n dbUri: `${db}://localhost:27017/create-project-test`,\n type: db as DbType,\n },\n })\n\n const dbReplacement = dbReplacements[db as DbType]\n\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n const packageJson = fse.readJsonSync(packageJsonPath)\n\n // Should only have one db adapter\n expect(\n Object.keys(packageJson.dependencies).filter((n) => n.startsWith('@payloadcms/db-')),\n ).toHaveLength(1)\n\n const payloadConfigPath = (\n await globby('**/payload.config.ts', {\n absolute: true,\n cwd: projectDir,\n })\n )?.[0]\n\n if (!payloadConfigPath) {\n throw new Error(`Could not find payload.config.ts inside ${projectDir}`)\n }\n\n const content = fse.readFileSync(payloadConfigPath, 'utf-8')\n\n // Check payload.config.ts\n expect(content).not.toContain('// database-adapter-import')\n expect(content).toContain(dbReplacement.importReplacement)\n\n expect(content).not.toContain('// database-adapter-config-start')\n expect(content).not.toContain('// database-adapter-config-end')\n expect(content).toContain(dbReplacement.configReplacement.join('\\n'))\n })\n })\n })\n})\n"],"names":["fse","path","createProject","fileURLToPath","dbReplacements","getValidTemplates","globby","filename","url","dirname","projectDir","resolve","describe","beforeAll","console","log","jest","fn","beforeEach","existsSync","rmdirSync","recursive","afterEach","rmSync","args","_","packageManager","it","projectName","template","name","type","description","cliArgs","packageJsonPath","packageJson","readJsonSync","expect","toEqual","templates","each","templateName","db","find","t","dbDetails","dbUri","dbReplacement","Object","keys","dependencies","filter","n","startsWith","toHaveLength","payloadConfigPath","absolute","cwd","Error","content","readFileSync","not","toContain","importReplacement","configReplacement","join"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/create-project.spec.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport path from 'path'\nimport type { CliArgs, DbType, ProjectTemplate } from '../types.js'\nimport { createProject } from './create-project.js'\nimport { dbReplacements } from './replacements.js'\nimport { getValidTemplates } from './templates.js'\nimport globby from 'globby'\nimport { jest } from '@jest/globals'\n\nimport tempDirectory from 'temp-dir'\n\ndescribe('createProject', () => {\n let projectDir: string\n beforeAll(() => {\n console.log = jest.fn()\n })\n\n beforeEach(() => {\n projectDir = `${tempDirectory}/${Math.random().toString(36).substring(7)}`\n })\n\n afterEach(() => {\n if (fse.existsSync(projectDir)) {\n fse.rmSync(projectDir, { recursive: true })\n }\n })\n\n describe('#createProject', () => {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const args = {\n _: ['project-name'],\n '--db': 'mongodb',\n '--local-template': 'blank-3.0',\n '--no-deps': true,\n } as CliArgs\n const packageManager = 'yarn'\n\n it('creates plugin template', async () => {\n const projectName = 'plugin'\n const template: ProjectTemplate = {\n name: 'plugin',\n type: 'plugin',\n url: 'https://github.com/payloadcms/payload-plugin-template',\n description: 'Template for creating a Payload plugin',\n }\n await createProject({\n cliArgs: args,\n projectName,\n projectDir,\n template,\n packageManager,\n })\n\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n const packageJson = fse.readJsonSync(packageJsonPath)\n\n // Check package name and description\n expect(packageJson.name).toEqual(projectName)\n })\n\n describe('creates project from template', () => {\n const templates = getValidTemplates()\n\n it.each([\n ['blank-3.0', 'mongodb'],\n ['blank-3.0', 'postgres'],\n\n // TODO: Re-enable these once 3.0 is stable and templates updated\n // ['website', 'mongodb'],\n // ['website', 'postgres'],\n // ['ecommerce', 'mongodb'],\n // ['ecommerce', 'postgres'],\n ])('update config and deps: %s, %s', async (templateName, db) => {\n const projectName = 'starter-project'\n\n const template = templates.find((t) => t.name === templateName)\n\n const cliArgs = {\n ...args,\n '--db': db,\n '--local-template': templateName,\n } as CliArgs\n\n await createProject({\n cliArgs,\n projectName,\n projectDir,\n template: template as ProjectTemplate,\n packageManager,\n dbDetails: {\n dbUri: `${db}://localhost:27017/create-project-test`,\n type: db as DbType,\n },\n })\n\n const dbReplacement = dbReplacements[db as DbType]\n\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n const packageJson = fse.readJsonSync(packageJsonPath)\n\n // Verify git was initialized\n expect(fse.existsSync(path.resolve(projectDir, '.git'))).toBe(true)\n\n // Should only have one db adapter\n expect(\n Object.keys(packageJson.dependencies).filter((n) => n.startsWith('@payloadcms/db-')),\n ).toHaveLength(1)\n\n const payloadConfigPath = (\n await globby('**/payload.config.ts', {\n absolute: true,\n cwd: projectDir,\n })\n )?.[0]\n\n if (!payloadConfigPath) {\n throw new Error(`Could not find payload.config.ts inside ${projectDir}`)\n }\n\n const content = fse.readFileSync(payloadConfigPath, 'utf-8')\n\n // Check payload.config.ts\n expect(content).not.toContain('// database-adapter-import')\n expect(content).toContain(dbReplacement.importReplacement)\n\n expect(content).not.toContain('// database-adapter-config-start')\n expect(content).not.toContain('// database-adapter-config-end')\n expect(content).toContain(dbReplacement.configReplacement().join('\\n'))\n })\n })\n })\n})\n"],"names":["fse","path","createProject","dbReplacements","getValidTemplates","globby","jest","tempDirectory","describe","projectDir","beforeAll","console","log","fn","beforeEach","Math","random","toString","substring","afterEach","existsSync","rmSync","recursive","args","_","packageManager","it","projectName","template","name","type","url","description","cliArgs","packageJsonPath","resolve","packageJson","readJsonSync","expect","toEqual","templates","each","templateName","db","find","t","dbDetails","dbUri","dbReplacement","toBe","Object","keys","dependencies","filter","n","startsWith","toHaveLength","payloadConfigPath","absolute","cwd","Error","content","readFileSync","not","toContain","importReplacement","configReplacement","join"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { CliArgs, PackageManager } from '../types.js';
2
+ export declare function getPackageManager(args: {
3
+ cliArgs?: CliArgs;
4
+ projectDir: string;
5
+ }): Promise<PackageManager>;
6
+ //# sourceMappingURL=get-package-manager.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,29 @@
1
+ import execa from 'execa';
2
+ import fse from 'fs-extra';
3
+ export async function getPackageManager(args) {
4
+ const { cliArgs, projectDir } = args;
5
+ try {
6
+ // Check for yarn.lock, package-lock.json, or pnpm-lock.yaml
7
+ let detected = 'npm';
8
+ if (cliArgs?.['--use-pnpm'] || fse.existsSync(`${projectDir}/pnpm-lock.yaml`) || await commandExists('pnpm')) {
9
+ detected = 'pnpm';
10
+ } else if (cliArgs?.['--use-yarn'] || fse.existsSync(`${projectDir}/yarn.lock`) || await commandExists('yarn')) {
11
+ detected = 'yarn';
12
+ } else if (cliArgs?.['--use-npm'] || fse.existsSync(`${projectDir}/package-lock.json`)) {
13
+ detected = 'npm';
14
+ }
15
+ return detected;
16
+ } catch (error) {
17
+ return 'npm';
18
+ }
19
+ }
20
+ async function commandExists(command) {
21
+ try {
22
+ await execa.command(`command -v ${command}`);
23
+ return true;
24
+ } catch {
25
+ return false;
26
+ }
27
+ }
28
+
29
+ //# sourceMappingURL=get-package-manager.js.map
@@ -0,0 +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 yarn.lock, package-lock.json, or pnpm-lock.yaml\n let detected: PackageManager = 'npm'\n if (\n cliArgs?.['--use-pnpm'] ||\n fse.existsSync(`${projectDir}/pnpm-lock.yaml`) ||\n (await commandExists('pnpm'))\n ) {\n detected = 'pnpm'\n } else if (\n cliArgs?.['--use-yarn'] ||\n fse.existsSync(`${projectDir}/yarn.lock`) ||\n (await commandExists('yarn'))\n ) {\n detected = 'yarn'\n } else if (cliArgs?.['--use-npm'] || fse.existsSync(`${projectDir}/package-lock.json`)) {\n detected = 'npm'\n }\n\n return detected\n } catch (error) {\n return 'npm'\n }\n}\n\nasync function commandExists(command: string): Promise<boolean> {\n try {\n await execa.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","error","command"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;","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,4DAA4D;QAC5D,IAAIG,WAA2B;QAC/B,IACEF,SAAS,CAAC,aAAa,IACvBH,IAAIM,UAAU,CAAC,CAAC,EAAEF,WAAW,eAAe,CAAC,KAC5C,MAAMG,cAAc,SACrB;YACAF,WAAW;QACb,OAAO,IACLF,SAAS,CAAC,aAAa,IACvBH,IAAIM,UAAU,CAAC,CAAC,EAAEF,WAAW,UAAU,CAAC,KACvC,MAAMG,cAAc,SACrB;YACAF,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,YAAY,IAAIH,IAAIM,UAAU,CAAC,CAAC,EAAEF,WAAW,kBAAkB,CAAC,GAAG;YACtFC,WAAW;QACb;QAEA,OAAOA;IACT,EAAE,OAAOG,OAAO;QACd,OAAO;IACT;AACF;AAEA,eAAeD,cAAcE,OAAe;IAC1C,IAAI;QACF,MAAMV,MAAMU,OAAO,CAAC,CAAC,WAAW,EAAEA,QAAQ,CAAC;QAC3C,OAAO;IACT,EAAE,OAAM;QACN,OAAO;IACT;AACF"}
@@ -1,4 +1,4 @@
1
- import type { CliArgs, DbType, PackageManager } from '../types.js';
1
+ import type { CliArgs, DbType, NextAppDetails, PackageManager } from '../types.js';
2
2
  type InitNextArgs = Pick<CliArgs, '--debug'> & {
3
3
  dbType: DbType;
4
4
  nextAppDetails?: NextAppDetails;
@@ -6,7 +6,6 @@ type InitNextArgs = Pick<CliArgs, '--debug'> & {
6
6
  projectDir: string;
7
7
  useDistFiles?: boolean;
8
8
  };
9
- type NextConfigType = 'cjs' | 'esm';
10
9
  type InitNextResult = {
11
10
  isSrcDir: boolean;
12
11
  nextAppDir: string;
@@ -19,13 +18,6 @@ type InitNextResult = {
19
18
  success: false;
20
19
  };
21
20
  export declare function initNext(args: InitNextArgs): Promise<InitNextResult>;
22
- type NextAppDetails = {
23
- hasTopLevelLayout: boolean;
24
- isSrcDir: boolean;
25
- nextAppDir?: string;
26
- nextConfigPath?: string;
27
- nextConfigType?: NextConfigType;
28
- };
29
21
  export declare function getNextAppDetails(projectDir: string): Promise<NextAppDetails>;
30
22
  export {};
31
23
  //# sourceMappingURL=init-next.d.ts.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"init-next.d.ts","sourceRoot":"","sources":["../../src/lib/init-next.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAkB,cAAc,EAAE,MAAM,aAAa,CAAA;AAclG,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,CAiE1E;AAkID,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA6CnF"}
@@ -1,20 +1,20 @@
1
1
  import * as p from '@clack/prompts';
2
2
  import { parse, stringify } from 'comment-json';
3
- import execa from 'execa';
4
3
  import fs from 'fs';
5
4
  import fse from 'fs-extra';
6
5
  import globby from 'globby';
6
+ import { fileURLToPath } from 'node:url';
7
7
  import path from 'path';
8
8
  import { promisify } from 'util';
9
- const readFile = promisify(fs.readFile);
10
- const writeFile = promisify(fs.writeFile);
11
- const filename = fileURLToPath(import.meta.url);
12
- const dirname = path.dirname(filename);
13
- import { fileURLToPath } from 'node:url';
14
9
  import { copyRecursiveSync } from '../utils/copy-recursive-sync.js';
15
10
  import { debug as origDebug, warning } from '../utils/log.js';
16
11
  import { moveMessage } from '../utils/messages.js';
12
+ import { installPackages } from './install-packages.js';
17
13
  import { wrapNextConfig } from './wrap-next-config.js';
14
+ const readFile = promisify(fs.readFile);
15
+ const writeFile = promisify(fs.writeFile);
16
+ const filename = fileURLToPath(import.meta.url);
17
+ const dirname = path.dirname(filename);
18
18
  export async function initNext(args) {
19
19
  const { dbType: dbType, packageManager, projectDir } = args;
20
20
  const nextAppDetails = args.nextAppDetails || await getNextAppDetails(projectDir);
@@ -26,7 +26,7 @@ export async function initNext(args) {
26
26
  });
27
27
  nextAppDetails.nextAppDir = createdAppDir;
28
28
  }
29
- const { hasTopLevelLayout, isSrcDir, nextAppDir, nextConfigType } = nextAppDetails;
29
+ const { hasTopLevelLayout, isPayloadInstalled, isSrcDir, nextAppDir, nextConfigType } = nextAppDetails;
30
30
  if (!nextConfigType) {
31
31
  return {
32
32
  isSrcDir,
@@ -163,48 +163,17 @@ async function installDeps(projectDir, packageManager, dbType) {
163
163
  const packagesToInstall = [
164
164
  'payload',
165
165
  '@payloadcms/next',
166
- '@payloadcms/richtext-lexical'
166
+ '@payloadcms/richtext-lexical',
167
+ '@payloadcms/plugin-cloud'
167
168
  ].map((pkg)=>`${pkg}@beta`);
168
169
  packagesToInstall.push(`@payloadcms/db-${dbType}@beta`);
169
- let exitCode = 0;
170
- switch(packageManager){
171
- case 'npm':
172
- {
173
- ({ exitCode } = await execa('npm', [
174
- 'install',
175
- '--save',
176
- ...packagesToInstall
177
- ], {
178
- cwd: projectDir
179
- }));
180
- break;
181
- }
182
- case 'yarn':
183
- case 'pnpm':
184
- {
185
- ({ exitCode } = await execa(packageManager, [
186
- 'add',
187
- ...packagesToInstall
188
- ], {
189
- cwd: projectDir
190
- }));
191
- break;
192
- }
193
- case 'bun':
194
- {
195
- warning('Bun support is untested.');
196
- ({ exitCode } = await execa('bun', [
197
- 'add',
198
- ...packagesToInstall
199
- ], {
200
- cwd: projectDir
201
- }));
202
- break;
203
- }
204
- }
205
- return {
206
- success: exitCode === 0
207
- };
170
+ // Match graphql version of @payloadcms/next
171
+ packagesToInstall.push('graphql@^16.8.1');
172
+ return await installPackages({
173
+ packageManager,
174
+ packagesToInstall,
175
+ projectDir
176
+ });
208
177
  }
209
178
  export async function getNextAppDetails(projectDir) {
210
179
  const isSrcDir = fs.existsSync(path.resolve(projectDir, 'src'));
@@ -219,6 +188,15 @@ export async function getNextAppDetails(projectDir) {
219
188
  nextConfigPath: undefined
220
189
  };
221
190
  }
191
+ const packageObj = await fse.readJson(path.resolve(projectDir, 'package.json'));
192
+ if (packageObj.dependencies?.payload) {
193
+ return {
194
+ hasTopLevelLayout: false,
195
+ isPayloadInstalled: true,
196
+ isSrcDir,
197
+ nextConfigPath
198
+ };
199
+ }
222
200
  let nextAppDir = (await globby([
223
201
  '**/app'
224
202
  ], {
@@ -232,7 +210,10 @@ export async function getNextAppDetails(projectDir) {
232
210
  if (!nextAppDir || nextAppDir.length === 0) {
233
211
  nextAppDir = undefined;
234
212
  }
235
- const configType = await getProjectType(projectDir, nextConfigPath);
213
+ const configType = getProjectType({
214
+ nextConfigPath,
215
+ packageObj
216
+ });
236
217
  const hasTopLevelLayout = nextAppDir ? fs.existsSync(path.resolve(nextAppDir, 'layout.tsx')) : false;
237
218
  return {
238
219
  hasTopLevelLayout,
@@ -242,14 +223,14 @@ export async function getNextAppDetails(projectDir) {
242
223
  nextConfigType: configType
243
224
  };
244
225
  }
245
- async function getProjectType(projectDir, nextConfigPath) {
226
+ function getProjectType(args) {
227
+ const { nextConfigPath, packageObj } = args;
246
228
  if (nextConfigPath.endsWith('.mjs')) {
247
229
  return 'esm';
248
230
  }
249
231
  if (nextConfigPath.endsWith('.cjs')) {
250
232
  return 'cjs';
251
233
  }
252
- const packageObj = await fse.readJson(path.resolve(projectDir, 'package.json'));
253
234
  const packageJsonType = packageObj.type;
254
235
  if (packageJsonType === 'module') {
255
236
  return 'esm';