create-payload-app 3.0.0-canary.f1db24e → 3.0.0-canary.f1f97ff

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. package/dist/index.js.map +1 -1
  2. package/dist/lib/configure-payload-config.d.ts +8 -2
  3. package/dist/lib/configure-payload-config.d.ts.map +1 -1
  4. package/dist/lib/configure-payload-config.js +74 -25
  5. package/dist/lib/configure-payload-config.js.map +1 -1
  6. package/dist/lib/create-project.d.ts.map +1 -1
  7. package/dist/lib/create-project.js +1 -1
  8. package/dist/lib/create-project.js.map +1 -1
  9. package/dist/lib/create-project.spec.js +19 -17
  10. package/dist/lib/create-project.spec.js.map +1 -1
  11. package/dist/lib/generate-secret.js.map +1 -1
  12. package/dist/lib/get-package-manager.d.ts.map +1 -1
  13. package/dist/lib/get-package-manager.js +31 -10
  14. package/dist/lib/get-package-manager.js.map +1 -1
  15. package/dist/lib/init-next.d.ts +2 -2
  16. package/dist/lib/init-next.d.ts.map +1 -1
  17. package/dist/lib/init-next.js +47 -7
  18. package/dist/lib/init-next.js.map +1 -1
  19. package/dist/lib/install-packages.js.map +1 -1
  20. package/dist/lib/parse-project-name.js.map +1 -1
  21. package/dist/lib/parse-template.js.map +1 -1
  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 +68 -0
  25. package/dist/lib/replacements.js.map +1 -0
  26. package/dist/lib/select-db.js.map +1 -1
  27. package/dist/lib/templates.js +6 -0
  28. package/dist/lib/templates.js.map +1 -1
  29. package/dist/lib/update-payload-in-project.js.map +1 -1
  30. package/dist/lib/wrap-next-config.d.ts +5 -5
  31. package/dist/lib/wrap-next-config.d.ts.map +1 -1
  32. package/dist/lib/wrap-next-config.js +123 -60
  33. package/dist/lib/wrap-next-config.js.map +1 -1
  34. package/dist/lib/wrap-next-config.spec.js +85 -34
  35. package/dist/lib/wrap-next-config.spec.js.map +1 -1
  36. package/dist/lib/write-env-file.d.ts.map +1 -1
  37. package/dist/lib/write-env-file.js +25 -25
  38. package/dist/lib/write-env-file.js.map +1 -1
  39. package/dist/main.d.ts.map +1 -1
  40. package/dist/main.js +8 -3
  41. package/dist/main.js.map +1 -1
  42. package/dist/scripts/pack-template-files.js.map +1 -1
  43. package/dist/template/src/collections/Media.ts +16 -0
  44. package/dist/template/src/collections/Users.ts +1 -1
  45. package/dist/template/src/payload.config.ts +10 -15
  46. package/dist/types.d.ts +4 -1
  47. package/dist/types.d.ts.map +1 -1
  48. package/dist/types.js.map +1 -1
  49. package/dist/utils/copy-recursive-sync.d.ts +2 -0
  50. package/dist/utils/copy-recursive-sync.d.ts.map +1 -1
  51. package/dist/utils/copy-recursive-sync.js +2 -0
  52. package/dist/utils/copy-recursive-sync.js.map +1 -1
  53. package/dist/utils/git.js.map +1 -1
  54. package/dist/utils/log.d.ts.map +1 -1
  55. package/dist/utils/log.js +1 -1
  56. package/dist/utils/log.js.map +1 -1
  57. package/dist/utils/messages.d.ts.map +1 -1
  58. package/dist/utils/messages.js.map +1 -1
  59. package/package.json +19 -7
  60. package/dist/lib/packages.d.ts +0 -9
  61. package/dist/lib/packages.d.ts.map +0 -1
  62. package/dist/lib/packages.js +0 -27
  63. package/dist/lib/packages.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { Main } from './main.js'\nimport { error } from './utils/log.js'\n\nexport async function main(): Promise<void> {\n try {\n await new Main().init()\n } catch (e) {\n if (e instanceof Error) {\n error(e.message)\n }\n }\n}\n"],"names":["Main","error","main","init","e","Error","message"],"rangeMappings":";;;;;;;;;;","mappings":"AAAA,SAASA,IAAI,QAAQ,YAAW;AAChC,SAASC,KAAK,QAAQ,iBAAgB;AAEtC,OAAO,eAAeC;IACpB,IAAI;QACF,MAAM,IAAIF,OAAOG,IAAI;IACvB,EAAE,OAAOC,GAAG;QACV,IAAIA,aAAaC,OAAO;YACtBJ,MAAMG,EAAEE,OAAO;QACjB;IACF;AACF"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { Main } from './main.js'\nimport { error } from './utils/log.js'\n\nexport async function main(): Promise<void> {\n try {\n await new Main().init()\n } catch (e) {\n if (e instanceof Error) {\n error(e.message)\n }\n }\n}\n"],"names":["Main","error","main","init","e","Error","message"],"mappings":"AAAA,SAASA,IAAI,QAAQ,YAAW;AAChC,SAASC,KAAK,QAAQ,iBAAgB;AAEtC,OAAO,eAAeC;IACpB,IAAI;QACF,MAAM,IAAIF,OAAOG,IAAI;IACvB,EAAE,OAAOC,GAAG;QACV,IAAIA,aAAaC,OAAO;YACtBJ,MAAMG,EAAEE,OAAO;QACjB;IACF;AACF"}
@@ -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 !== undefined) {
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 !== undefined) {\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","undefined","writeFileSync","join","startIndex","findIndex","l","includes","endIndex","splice"],"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;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,CAyDhB;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"}
@@ -65,7 +65,7 @@ export async function createProject(args) {
65
65
  });
66
66
  spinner.message('Configuring Payload...');
67
67
  await configurePayloadConfig({
68
- dbDetails,
68
+ dbType: dbDetails?.type,
69
69
  projectDirOrConfigPath: {
70
70
  projectDir
71
71
  }
@@ -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 { 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({ 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 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","projectDirOrConfigPath","lockPath","existsSync","remove","result","stop","packageJsonPath","packageObj","readJson","name","writeJson","spaces"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,YAAYA,OAAO,iBAAgB;AACnC,OAAOC,WAAW,QAAO;AACzB,OAAOC,WAAW,QAAO;AACzB,OAAOC,WAAW,QAAO;AACzB,OAAOC,SAAS,WAAU;AAC1B,SAASC,aAAa,QAAQ,WAAU;AACxC,OAAOC,UAAU,OAAM;AAIvB,SAASC,oBAAoB,QAAQ,kBAAiB;AACtD,SAASC,KAAK,EAAEC,KAAK,EAAEC,IAAI,EAAEC,OAAO,QAAQ,kBAAiB;AAC7D,SAASC,sBAAsB,QAAQ,gCAA+B;AAEtE,MAAMC,WAAWR,cAAc,YAAYS,GAAG;AAC9C,MAAMC,UAAUT,KAAKS,OAAO,CAACF;AAE7B,eAAeG,uBAAuBC,UAAkB;IACtD,MAAMC,aAAa,MAAMd,IAAIc,UAAU,CAACD;IACxC,IAAI,CAACC,YAAY;QACf,MAAMd,IAAIe,KAAK,CAACF;IAClB;AACF;AAEA,eAAeG,YAAYC,IAI1B;IACC,MAAM,EAAEC,OAAO,EAAEC,cAAc,EAAEN,UAAU,EAAE,GAAGI;IAChD,IAAIC,OAAO,CAAC,YAAY,EAAE;QACxB,OAAO;IACT;IACA,IAAIE,aAAa;IAEjB,IAAID,mBAAmB,QAAQ;QAC7BC,aAAa;IACf,OAAO,IAAID,mBAAmB,QAAQ;QACpCC,aAAa;IACf;IAEA,IAAI;QACF,MAAMrB,MAAMsB,OAAO,CAACD,YAAY;YAC9BE,KAAKpB,KAAKqB,OAAO,CAACV;QACpB;QACA,OAAO;IACT,EAAE,OAAOW,KAAc;QACrBnB,MAAM,CAAC,6BAA6B,EAAEmB,eAAeC,QAAQ,CAAC,EAAE,EAAED,IAAIE,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACvF,OAAO;IACT;AACF;AAEA,OAAO,eAAeC,cAAcV,IAOnC;IACC,MAAM,EAAEC,OAAO,EAAEU,SAAS,EAAET,cAAc,EAAEN,UAAU,EAAEgB,WAAW,EAAEC,QAAQ,EAAE,GAAGb;IAElF,IAAIC,OAAO,CAAC,YAAY,EAAE;QACxBd,MAAM,CAAC,6BAA6B,EAAEP,MAAMkC,KAAK,CAAClB,YAAY,CAAC;QAC/D;IACF;IAEA,MAAMD,uBAAuBC;IAE7B,IAAIK,OAAO,CAAC,mBAAmB,EAAE;QAC/B,2DAA2D;QAC3D,MAAMc,gBAAgB9B,KAAKqB,OAAO,CAChCZ,SACA,0BACAO,OAAO,CAAC,mBAAmB;QAE7B,MAAMlB,IAAIiC,IAAI,CAACD,eAAenB;IAChC,OAAO,IAAI,SAASiB,UAAU;QAC5B,IAAII,cAAcJ,SAASpB,GAAG;QAC9B,IAAIQ,OAAO,CAAC,oBAAoB,EAAE;YAChCgB,cAAc,CAAC,EAAEJ,SAASpB,GAAG,CAAC,CAAC,EAAEQ,OAAO,CAAC,oBAAoB,CAAC,CAAC;YAC/Dd,MAAM,CAAC,oBAAoB,EAAE8B,YAAY,CAAC;QAC5C;QACA,MAAMC,UAAUrC,MAAMoC;QACtB,MAAMC,QAAQC,KAAK,CAACvB;IACtB;IAEA,MAAMwB,UAAUzC,EAAEyC,OAAO;IACzBA,QAAQC,KAAK,CAAC;IAEd,MAAMC,kBAAkB;QAAE1B;QAAYgB;IAAY;IAClDQ,QAAQX,OAAO,CAAC;IAChB,MAAMlB,uBAAuB;QAAEoB;QAAWY,wBAAwB;YAAE3B;QAAW;IAAE;IAEjF,gEAAgE;IAChE,MAAM4B,WAAWvC,KAAKqB,OAAO,CAACV,YAAY;IAC1C,IAAIb,IAAI0C,UAAU,CAACD,WAAW;QAC5B,MAAMzC,IAAI2C,MAAM,CAACF;IACnB;IAEA,IAAI,CAACvB,OAAO,CAAC,YAAY,EAAE;QACzBZ,KAAK,CAAC,MAAM,EAAEa,eAAe,GAAG,CAAC;QACjCkB,QAAQX,OAAO,CAAC;QAChB,MAAMkB,SAAS,MAAM5B,YAAY;YAAEE;YAASC;YAAgBN;QAAW;QACvE,IAAI+B,QAAQ;YACVP,QAAQQ,IAAI,CAAC;QACf,OAAO;YACLR,QAAQQ,IAAI,CAAC,iCAAiC;QAChD;IACF,OAAO;QACLR,QAAQQ,IAAI,CAAC;IACf;IAEA,IAAI,CAAC3B,OAAO,CAAC,WAAW,EAAE;QACxBf,qBAAqB;YAAEmB,KAAKT;QAAW;IACzC;AACF;AAEA,OAAO,eAAe0B,kBAAkBtB,IAGvC;IACC,MAAM,EAAEJ,UAAU,EAAEgB,WAAW,EAAE,GAAGZ;IACpC,MAAM6B,kBAAkB5C,KAAKqB,OAAO,CAACV,YAAY;IACjD,IAAI;QACF,MAAMkC,aAAa,MAAM/C,IAAIgD,QAAQ,CAACF;QACtCC,WAAWE,IAAI,GAAGpB;QAClB,MAAM7B,IAAIkD,SAAS,CAACJ,iBAAiBC,YAAY;YAAEI,QAAQ;QAAE;IAC/D,EAAE,OAAO3B,KAAc;QACrBjB,QAAQ,CAAC,uCAAuC,EAAEiB,eAAeC,QAAQD,IAAIE,OAAO,GAAG,GAAG,CAAC;IAC7F;AACF"}
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"],"mappings":"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"}
@@ -1,16 +1,19 @@
1
+ import { jest } from '@jest/globals';
2
+ import fs from 'fs';
1
3
  import fse from 'fs-extra';
4
+ import globby from 'globby';
5
+ import * as os from 'node:os';
2
6
  import path from 'path';
3
7
  import { createProject } from './create-project.js';
4
- import { dbReplacements } from './packages.js';
8
+ import { dbReplacements } from './replacements.js';
5
9
  import { getValidTemplates } from './templates.js';
6
- import globby from 'globby';
7
- import tempDirectory from 'temp-dir';
8
10
  describe('createProject', ()=>{
9
11
  let projectDir;
10
12
  beforeAll(()=>{
11
13
  console.log = jest.fn();
12
14
  });
13
15
  beforeEach(()=>{
16
+ const tempDirectory = fs.realpathSync(os.tmpdir());
14
17
  projectDir = `${tempDirectory}/${Math.random().toString(36).substring(7)}`;
15
18
  });
16
19
  afterEach(()=>{
@@ -21,7 +24,6 @@ describe('createProject', ()=>{
21
24
  }
22
25
  });
23
26
  describe('#createProject', ()=>{
24
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
25
27
  const args = {
26
28
  _: [
27
29
  'project-name'
@@ -36,15 +38,15 @@ describe('createProject', ()=>{
36
38
  const template = {
37
39
  name: 'plugin',
38
40
  type: 'plugin',
39
- url: 'https://github.com/payloadcms/payload-plugin-template',
40
- description: 'Template for creating a Payload plugin'
41
+ description: 'Template for creating a Payload plugin',
42
+ url: 'https://github.com/payloadcms/payload-plugin-template'
41
43
  };
42
44
  await createProject({
43
45
  cliArgs: args,
44
- projectName,
46
+ packageManager,
45
47
  projectDir,
46
- template,
47
- packageManager
48
+ projectName,
49
+ template
48
50
  });
49
51
  const packageJsonPath = path.resolve(projectDir, 'package.json');
50
52
  const packageJson = fse.readJsonSync(packageJsonPath);
@@ -72,14 +74,14 @@ describe('createProject', ()=>{
72
74
  };
73
75
  await createProject({
74
76
  cliArgs,
75
- projectName,
76
- projectDir,
77
- template: template,
78
- packageManager,
79
77
  dbDetails: {
80
- dbUri: `${db}://localhost:27017/create-project-test`,
81
- type: db
82
- }
78
+ type: db,
79
+ dbUri: `${db}://localhost:27017/create-project-test`
80
+ },
81
+ packageManager,
82
+ projectDir,
83
+ projectName,
84
+ template: template
83
85
  });
84
86
  const dbReplacement = dbReplacements[db];
85
87
  const packageJsonPath = path.resolve(projectDir, 'package.json');
@@ -101,7 +103,7 @@ describe('createProject', ()=>{
101
103
  expect(content).toContain(dbReplacement.importReplacement);
102
104
  expect(content).not.toContain('// database-adapter-config-start');
103
105
  expect(content).not.toContain('// database-adapter-config-end');
104
- expect(content).toContain(dbReplacement.configReplacement.join('\n'));
106
+ expect(content).toContain(dbReplacement.configReplacement().join('\n'));
105
107
  });
106
108
  });
107
109
  });
@@ -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 { dbReplacements } from './packages.js'\nimport { getValidTemplates } from './templates.js'\nimport globby from 'globby'\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","tempDirectory","describe","projectDir","beforeAll","console","log","jest","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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"}
1
+ {"version":3,"sources":["../../src/lib/create-project.spec.ts"],"sourcesContent":["import { jest } from '@jest/globals'\nimport fs from 'fs'\nimport fse from 'fs-extra'\nimport globby from 'globby'\nimport * as os from 'node:os'\nimport path from 'path'\n\nimport type { CliArgs, DbType, ProjectTemplate } from '../types.js'\n\nimport { createProject } from './create-project.js'\nimport { dbReplacements } from './replacements.js'\nimport { getValidTemplates } from './templates.js'\n\ndescribe('createProject', () => {\n let projectDir: string\n beforeAll(() => {\n console.log = jest.fn()\n })\n\n beforeEach(() => {\n const tempDirectory = fs.realpathSync(os.tmpdir())\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 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 description: 'Template for creating a Payload plugin',\n url: 'https://github.com/payloadcms/payload-plugin-template',\n }\n await createProject({\n cliArgs: args,\n packageManager,\n projectDir,\n projectName,\n template,\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 dbDetails: {\n type: db as DbType,\n dbUri: `${db}://localhost:27017/create-project-test`,\n },\n packageManager,\n projectDir,\n projectName,\n template: template as ProjectTemplate,\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":["jest","fs","fse","globby","os","path","createProject","dbReplacements","getValidTemplates","describe","projectDir","beforeAll","console","log","fn","beforeEach","tempDirectory","realpathSync","tmpdir","Math","random","toString","substring","afterEach","existsSync","rmSync","recursive","args","_","packageManager","it","projectName","template","name","type","description","url","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"],"mappings":"AAAA,SAASA,IAAI,QAAQ,gBAAe;AACpC,OAAOC,QAAQ,KAAI;AACnB,OAAOC,SAAS,WAAU;AAC1B,OAAOC,YAAY,SAAQ;AAC3B,YAAYC,QAAQ,UAAS;AAC7B,OAAOC,UAAU,OAAM;AAIvB,SAASC,aAAa,QAAQ,sBAAqB;AACnD,SAASC,cAAc,QAAQ,oBAAmB;AAClD,SAASC,iBAAiB,QAAQ,iBAAgB;AAElDC,SAAS,iBAAiB;IACxB,IAAIC;IACJC,UAAU;QACRC,QAAQC,GAAG,GAAGb,KAAKc,EAAE;IACvB;IAEAC,WAAW;QACT,MAAMC,gBAAgBf,GAAGgB,YAAY,CAACb,GAAGc,MAAM;QAC/CR,aAAa,CAAC,EAAEM,cAAc,CAAC,EAAEG,KAAKC,MAAM,GAAGC,QAAQ,CAAC,IAAIC,SAAS,CAAC,GAAG,CAAC;IAC5E;IAEAC,UAAU;QACR,IAAIrB,IAAIsB,UAAU,CAACd,aAAa;YAC9BR,IAAIuB,MAAM,CAACf,YAAY;gBAAEgB,WAAW;YAAK;QAC3C;IACF;IAEAjB,SAAS,kBAAkB;QACzB,MAAMkB,OAAO;YACXC,GAAG;gBAAC;aAAe;YACnB,QAAQ;YACR,oBAAoB;YACpB,aAAa;QACf;QACA,MAAMC,iBAAiB;QAEvBC,GAAG,2BAA2B;YAC5B,MAAMC,cAAc;YACpB,MAAMC,WAA4B;gBAChCC,MAAM;gBACNC,MAAM;gBACNC,aAAa;gBACbC,KAAK;YACP;YACA,MAAM9B,cAAc;gBAClB+B,SAASV;gBACTE;gBACAnB;gBACAqB;gBACAC;YACF;YAEA,MAAMM,kBAAkBjC,KAAKkC,OAAO,CAAC7B,YAAY;YACjD,MAAM8B,cAActC,IAAIuC,YAAY,CAACH;YAErC,qCAAqC;YACrCI,OAAOF,YAAYP,IAAI,EAAEU,OAAO,CAACZ;QACnC;QAEAtB,SAAS,iCAAiC;YACxC,MAAMmC,YAAYpC;YAElBsB,GAAGe,IAAI,CAAC;gBACN;oBAAC;oBAAa;iBAAU;gBACxB;oBAAC;oBAAa;iBAAW;aAO1B,EAAE,kCAAkC,OAAOC,cAAcC;gBACxD,MAAMhB,cAAc;gBAEpB,MAAMC,WAAWY,UAAUI,IAAI,CAAC,CAACC,IAAMA,EAAEhB,IAAI,KAAKa;gBAElD,MAAMT,UAAU;oBACd,GAAGV,IAAI;oBACP,QAAQoB;oBACR,oBAAoBD;gBACtB;gBAEA,MAAMxC,cAAc;oBAClB+B;oBACAa,WAAW;wBACThB,MAAMa;wBACNI,OAAO,CAAC,EAAEJ,GAAG,sCAAsC,CAAC;oBACtD;oBACAlB;oBACAnB;oBACAqB;oBACAC,UAAUA;gBACZ;gBAEA,MAAMoB,gBAAgB7C,cAAc,CAACwC,GAAa;gBAElD,MAAMT,kBAAkBjC,KAAKkC,OAAO,CAAC7B,YAAY;gBACjD,MAAM8B,cAActC,IAAIuC,YAAY,CAACH;gBAErC,6BAA6B;gBAC7BI,OAAOxC,IAAIsB,UAAU,CAACnB,KAAKkC,OAAO,CAAC7B,YAAY,UAAU2C,IAAI,CAAC;gBAE9D,kCAAkC;gBAClCX,OACEY,OAAOC,IAAI,CAACf,YAAYgB,YAAY,EAAEC,MAAM,CAAC,CAACC,IAAMA,EAAEC,UAAU,CAAC,qBACjEC,YAAY,CAAC;gBAEf,MAAMC,oBACJ,CAAA,MAAM1D,OAAO,wBAAwB;oBACnC2D,UAAU;oBACVC,KAAKrD;gBACP,EAAC,GACA,CAAC,EAAE;gBAEN,IAAI,CAACmD,mBAAmB;oBACtB,MAAM,IAAIG,MAAM,CAAC,wCAAwC,EAAEtD,WAAW,CAAC;gBACzE;gBAEA,MAAMuD,UAAU/D,IAAIgE,YAAY,CAACL,mBAAmB;gBAEpD,0BAA0B;gBAC1BnB,OAAOuB,SAASE,GAAG,CAACC,SAAS,CAAC;gBAC9B1B,OAAOuB,SAASG,SAAS,CAAChB,cAAciB,iBAAiB;gBAEzD3B,OAAOuB,SAASE,GAAG,CAACC,SAAS,CAAC;gBAC9B1B,OAAOuB,SAASE,GAAG,CAACC,SAAS,CAAC;gBAC9B1B,OAAOuB,SAASG,SAAS,CAAChB,cAAckB,iBAAiB,GAAGC,IAAI,CAAC;YACnE;QACF;IACF;AACF"}
@@ -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"],"rangeMappings":";;;","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').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 +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,CAqB1B"}
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,CA2B1B"}
@@ -1,17 +1,38 @@
1
- import commandExists from 'command-exists';
1
+ import execa from 'execa';
2
2
  import fse from 'fs-extra';
3
3
  export async function getPackageManager(args) {
4
4
  const { cliArgs, projectDir } = args;
5
- // Check for yarn.lock, package-lock.json, or pnpm-lock.yaml
6
- let detected = 'npm';
7
- if (cliArgs?.['--use-pnpm'] || fse.existsSync(`${projectDir}/pnpm-lock.yaml`) || await commandExists('pnpm')) {
8
- detected = 'pnpm';
9
- } else if (cliArgs?.['--use-yarn'] || fse.existsSync(`${projectDir}/yarn.lock`) || await commandExists('yarn')) {
10
- detected = 'yarn';
11
- } else if (cliArgs?.['--use-npm'] || fse.existsSync(`${projectDir}/package-lock.json`)) {
12
- detected = 'npm';
5
+ try {
6
+ // Check for flag or lockfile
7
+ let detected = 'npm';
8
+ if (cliArgs?.['--use-pnpm'] || fse.existsSync(`${projectDir}/pnpm-lock.yaml`)) {
9
+ detected = 'pnpm';
10
+ } else if (cliArgs?.['--use-yarn'] || fse.existsSync(`${projectDir}/yarn.lock`)) {
11
+ detected = 'yarn';
12
+ } else if (cliArgs?.['--use-npm'] || fse.existsSync(`${projectDir}/package-lock.json`)) {
13
+ detected = 'npm';
14
+ } else {
15
+ // Otherwise check for existing commands
16
+ if (await commandExists('pnpm')) {
17
+ detected = 'pnpm';
18
+ } else if (await commandExists('yarn')) {
19
+ detected = 'yarn';
20
+ } else {
21
+ detected = 'npm';
22
+ }
23
+ }
24
+ return detected;
25
+ } catch (error) {
26
+ return 'npm';
27
+ }
28
+ }
29
+ async function commandExists(command) {
30
+ try {
31
+ await execa.command(`command -v ${command}`);
32
+ return true;
33
+ } catch {
34
+ return false;
13
35
  }
14
- return detected || 'npm';
15
36
  }
16
37
 
17
38
  //# sourceMappingURL=get-package-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/get-package-manager.ts"],"sourcesContent":["import commandExists from 'command-exists'\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 // 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 return detected || 'npm'\n}\n"],"names":["commandExists","fse","getPackageManager","args","cliArgs","projectDir","detected","existsSync"],"rangeMappings":";;;;;;;;;;;;;;","mappings":"AAAA,OAAOA,mBAAmB,iBAAgB;AAC1C,OAAOC,SAAS,WAAU;AAI1B,OAAO,eAAeC,kBAAkBC,IAGvC;IACC,MAAM,EAAEC,OAAO,EAAEC,UAAU,EAAE,GAAGF;IAEhC,4DAA4D;IAC5D,IAAIG,WAA2B;IAC/B,IACEF,SAAS,CAAC,aAAa,IACvBH,IAAIM,UAAU,CAAC,CAAC,EAAEF,WAAW,eAAe,CAAC,KAC5C,MAAML,cAAc,SACrB;QACAM,WAAW;IACb,OAAO,IACLF,SAAS,CAAC,aAAa,IACvBH,IAAIM,UAAU,CAAC,CAAC,EAAEF,WAAW,UAAU,CAAC,KACvC,MAAML,cAAc,SACrB;QACAM,WAAW;IACb,OAAO,IAAIF,SAAS,CAAC,YAAY,IAAIH,IAAIM,UAAU,CAAC,CAAC,EAAEF,WAAW,kBAAkB,CAAC,GAAG;QACtFC,WAAW;IACb;IACA,OAAOA,YAAY;AACrB"}
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 {\n // Otherwise check for existing commands\n if (await commandExists('pnpm')) {\n detected = 'pnpm'\n } else if (await commandExists('yarn')) {\n detected = 'yarn'\n } else {\n detected = 'npm'\n }\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"],"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,CAAC,EAAEF,WAAW,eAAe,CAAC,GAAG;YAC7EC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,aAAa,IAAIH,IAAIM,UAAU,CAAC,CAAC,EAAEF,WAAW,UAAU,CAAC,GAAG;YAC/EC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,YAAY,IAAIH,IAAIM,UAAU,CAAC,CAAC,EAAEF,WAAW,kBAAkB,CAAC,GAAG;YACtFC,WAAW;QACb,OAAO;YACL,wCAAwC;YACxC,IAAI,MAAME,cAAc,SAAS;gBAC/BF,WAAW;YACb,OAAO,IAAI,MAAME,cAAc,SAAS;gBACtCF,WAAW;YACb,OAAO;gBACLA,WAAW;YACb;QACF;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,11 +1,11 @@
1
1
  import type { CliArgs, DbType, NextAppDetails, PackageManager } from '../types.js';
2
- type InitNextArgs = Pick<CliArgs, '--debug'> & {
2
+ type InitNextArgs = {
3
3
  dbType: DbType;
4
4
  nextAppDetails?: NextAppDetails;
5
5
  packageManager: PackageManager;
6
6
  projectDir: string;
7
7
  useDistFiles?: boolean;
8
- };
8
+ } & Pick<CliArgs, '--debug'>;
9
9
  type InitNextResult = {
10
10
  isSrcDir: boolean;
11
11
  nextAppDir: string;
@@ -1 +1 @@
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
+ {"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;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;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;AAmID,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA2FnF"}
@@ -50,7 +50,7 @@ export async function initNext(args) {
50
50
  }
51
51
  const installSpinner = p.spinner();
52
52
  installSpinner.start('Installing Payload and dependencies...');
53
- const configurationResult = installAndConfigurePayload({
53
+ const configurationResult = await installAndConfigurePayload({
54
54
  ...args,
55
55
  nextAppDetails,
56
56
  nextConfigType,
@@ -112,7 +112,7 @@ async function addPayloadConfigToTsConfig(projectDir, isSrcDir) {
112
112
  });
113
113
  }
114
114
  }
115
- function installAndConfigurePayload(args) {
115
+ async function installAndConfigurePayload(args) {
116
116
  const { '--debug': debug, nextAppDetails: { isSrcDir, nextAppDir, nextConfigPath } = {}, nextConfigType, projectDir, useDistFiles } = args;
117
117
  if (!nextAppDir || !nextConfigPath) {
118
118
  return {
@@ -150,7 +150,7 @@ function installAndConfigurePayload(args) {
150
150
  // This is a little clunky and needs to account for isSrcDir
151
151
  copyRecursiveSync(templateSrcDir, path.dirname(nextConfigPath), debug);
152
152
  // Wrap next.config.js with withPayload
153
- wrapNextConfig({
153
+ await wrapNextConfig({
154
154
  nextConfigPath,
155
155
  nextConfigType
156
156
  });
@@ -177,7 +177,8 @@ async function installDeps(projectDir, packageManager, dbType) {
177
177
  }
178
178
  export async function getNextAppDetails(projectDir) {
179
179
  const isSrcDir = fs.existsSync(path.resolve(projectDir, 'src'));
180
- const nextConfigPath = (await globby('next.config.*js', {
180
+ // Match next.config.js, next.config.ts, next.config.mjs, next.config.cjs
181
+ const nextConfigPath = (await globby('next.config.(\\w)?(t|j)s', {
181
182
  absolute: true,
182
183
  cwd: projectDir
183
184
  }))?.[0];
@@ -185,16 +186,50 @@ export async function getNextAppDetails(projectDir) {
185
186
  return {
186
187
  hasTopLevelLayout: false,
187
188
  isSrcDir,
188
- nextConfigPath: undefined
189
+ isSupportedNextVersion: false,
190
+ nextConfigPath: undefined,
191
+ nextVersion: null
189
192
  };
190
193
  }
191
194
  const packageObj = await fse.readJson(path.resolve(projectDir, 'package.json'));
195
+ // Check if Next.js version is new enough
196
+ let nextVersion = null;
197
+ if (packageObj.dependencies?.next) {
198
+ nextVersion = packageObj.dependencies.next;
199
+ // Match versions using regex matching groups
200
+ const versionMatch = /(?<major>\d+)/.exec(nextVersion);
201
+ if (!versionMatch) {
202
+ p.log.warn(`Could not determine Next.js version from ${nextVersion}`);
203
+ return {
204
+ hasTopLevelLayout: false,
205
+ isSrcDir,
206
+ isSupportedNextVersion: false,
207
+ nextConfigPath,
208
+ nextVersion
209
+ };
210
+ }
211
+ const { major } = versionMatch.groups;
212
+ const majorVersion = parseInt(major);
213
+ if (majorVersion < 15) {
214
+ return {
215
+ hasTopLevelLayout: false,
216
+ isSrcDir,
217
+ isSupportedNextVersion: false,
218
+ nextConfigPath,
219
+ nextVersion
220
+ };
221
+ }
222
+ }
223
+ const isSupportedNextVersion = true;
224
+ // Check if Payload already installed
192
225
  if (packageObj.dependencies?.payload) {
193
226
  return {
194
227
  hasTopLevelLayout: false,
195
228
  isPayloadInstalled: true,
196
229
  isSrcDir,
197
- nextConfigPath
230
+ isSupportedNextVersion,
231
+ nextConfigPath,
232
+ nextVersion
198
233
  };
199
234
  }
200
235
  let nextAppDir = (await globby([
@@ -218,13 +253,18 @@ export async function getNextAppDetails(projectDir) {
218
253
  return {
219
254
  hasTopLevelLayout,
220
255
  isSrcDir,
256
+ isSupportedNextVersion,
221
257
  nextAppDir,
222
258
  nextConfigPath,
223
- nextConfigType: configType
259
+ nextConfigType: configType,
260
+ nextVersion
224
261
  };
225
262
  }
226
263
  function getProjectType(args) {
227
264
  const { nextConfigPath, packageObj } = args;
265
+ if (nextConfigPath.endsWith('.ts')) {
266
+ return 'ts';
267
+ }
228
268
  if (nextConfigPath.endsWith('.mjs')) {
229
269
  return 'esm';
230
270
  }