create-payload-app 4.0.0-internal.c7d5de4 → 4.0.0-internal.cb69780

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 (123) hide show
  1. package/README.md +5 -0
  2. package/dist/commands.d.ts +4 -0
  3. package/dist/commands.d.ts.map +1 -0
  4. package/dist/commands.js +5 -0
  5. package/dist/commands.js.map +1 -0
  6. package/dist/lib/agent-config.d.ts +12 -0
  7. package/dist/lib/agent-config.d.ts.map +1 -0
  8. package/dist/lib/agent-config.js +15 -0
  9. package/dist/lib/agent-config.js.map +1 -0
  10. package/dist/lib/ast/package-json.d.ts +9 -0
  11. package/dist/lib/ast/package-json.d.ts.map +1 -1
  12. package/dist/lib/ast/package-json.js +34 -8
  13. package/dist/lib/ast/package-json.js.map +1 -1
  14. package/dist/lib/configure-payload-tsconfig.d.ts +5 -0
  15. package/dist/lib/configure-payload-tsconfig.d.ts.map +1 -0
  16. package/dist/lib/configure-payload-tsconfig.js +26 -0
  17. package/dist/lib/configure-payload-tsconfig.js.map +1 -0
  18. package/dist/lib/create-project.d.ts +1 -2
  19. package/dist/lib/create-project.d.ts.map +1 -1
  20. package/dist/lib/create-project.js +56 -29
  21. package/dist/lib/create-project.js.map +1 -1
  22. package/dist/lib/generate-secret.js +1 -1
  23. package/dist/lib/generate-secret.js.map +1 -1
  24. package/dist/lib/get-package-manager.d.ts +9 -0
  25. package/dist/lib/get-package-manager.d.ts.map +1 -1
  26. package/dist/lib/get-package-manager.js +20 -0
  27. package/dist/lib/get-package-manager.js.map +1 -1
  28. package/dist/lib/init-next.d.ts.map +1 -1
  29. package/dist/lib/init-next.js +5 -34
  30. package/dist/lib/init-next.js.map +1 -1
  31. package/dist/lib/init-tanstack.d.ts +18 -0
  32. package/dist/lib/init-tanstack.d.ts.map +1 -0
  33. package/dist/lib/init-tanstack.js +150 -0
  34. package/dist/lib/init-tanstack.js.map +1 -0
  35. package/dist/lib/tanstack/detect.d.ts +5 -0
  36. package/dist/lib/tanstack/detect.d.ts.map +1 -0
  37. package/dist/lib/tanstack/detect.js +131 -0
  38. package/dist/lib/tanstack/detect.js.map +1 -0
  39. package/dist/lib/tanstack/prepare.d.ts +23 -0
  40. package/dist/lib/tanstack/prepare.d.ts.map +1 -0
  41. package/dist/lib/tanstack/prepare.js +114 -0
  42. package/dist/lib/tanstack/prepare.js.map +1 -0
  43. package/dist/lib/tanstack/template-files.d.ts +50 -0
  44. package/dist/lib/tanstack/template-files.d.ts.map +1 -0
  45. package/dist/lib/tanstack/template-files.js +64 -0
  46. package/dist/lib/tanstack/template-files.js.map +1 -0
  47. package/dist/lib/tanstack/transform-root-route.d.ts +7 -0
  48. package/dist/lib/tanstack/transform-root-route.d.ts.map +1 -0
  49. package/dist/lib/tanstack/transform-root-route.js +747 -0
  50. package/dist/lib/tanstack/transform-root-route.js.map +1 -0
  51. package/dist/lib/tanstack/transform-router.d.ts +5 -0
  52. package/dist/lib/tanstack/transform-router.d.ts.map +1 -0
  53. package/dist/lib/tanstack/transform-router.js +301 -0
  54. package/dist/lib/tanstack/transform-router.js.map +1 -0
  55. package/dist/lib/tanstack/transform-vite-config.d.ts +14 -0
  56. package/dist/lib/tanstack/transform-vite-config.d.ts.map +1 -0
  57. package/dist/lib/tanstack/transform-vite-config.js +576 -0
  58. package/dist/lib/tanstack/transform-vite-config.js.map +1 -0
  59. package/dist/lib/templates.d.ts.map +1 -1
  60. package/dist/lib/templates.js +6 -0
  61. package/dist/lib/templates.js.map +1 -1
  62. package/dist/lib/update-payload-in-project.d.ts +18 -3
  63. package/dist/lib/update-payload-in-project.d.ts.map +1 -1
  64. package/dist/lib/update-payload-in-project.js +98 -18
  65. package/dist/lib/update-payload-in-project.js.map +1 -1
  66. package/dist/main.d.ts +20 -1
  67. package/dist/main.d.ts.map +1 -1
  68. package/dist/main.js +120 -30
  69. package/dist/main.js.map +1 -1
  70. package/dist/scripts/pack-template-files.js +18 -0
  71. package/dist/scripts/pack-template-files.js.map +1 -1
  72. package/dist/template/src/app/(frontend)/styles.css +8 -1
  73. package/dist/template/src/app/(payload)/admin/[[...segments]]/not-found.tsx +1 -2
  74. package/dist/template/src/app/(payload)/admin/[[...segments]]/page.tsx +1 -2
  75. package/dist/template/src/app/(payload)/api/[...slug]/route.ts +1 -2
  76. package/dist/template/src/app/(payload)/api/graphql/route.ts +1 -2
  77. package/dist/template/src/app/(payload)/api/graphql-playground/route.ts +1 -2
  78. package/dist/template/src/app/(payload)/layout.tsx +2 -3
  79. package/dist/template-tanstack/routes/_payload/admin.$.tsx +8 -0
  80. package/dist/template-tanstack/routes/_payload/admin.index.tsx +8 -0
  81. package/dist/template-tanstack/routes/_payload/api.$.ts +10 -0
  82. package/dist/template-tanstack/routes/_payload/importMap.js +32 -0
  83. package/dist/template-tanstack/routes/_payload/server.functions.ts +49 -0
  84. package/dist/template-tanstack/routes/_payload.tsx +30 -0
  85. package/dist/template-tanstack/src/collections/Folders.ts +16 -0
  86. package/dist/template-tanstack/src/collections/Media.ts +20 -0
  87. package/dist/template-tanstack/src/collections/Tags.ts +16 -0
  88. package/dist/template-tanstack/src/collections/Users.ts +14 -0
  89. package/dist/template-tanstack/src/payload.config.ts +40 -0
  90. package/dist/template-tanstack/src/payload.css +1 -0
  91. package/dist/types.d.ts +22 -3
  92. package/dist/types.d.ts.map +1 -1
  93. package/dist/types.js.map +1 -1
  94. package/dist/utils/messages.d.ts +1 -0
  95. package/dist/utils/messages.d.ts.map +1 -1
  96. package/dist/utils/messages.js +8 -6
  97. package/dist/utils/messages.js.map +1 -1
  98. package/package.json +5 -5
  99. package/dist/ast-integration.spec.js +0 -132
  100. package/dist/ast-integration.spec.js.map +0 -1
  101. package/dist/lib/ast/package-json.spec.js +0 -67
  102. package/dist/lib/ast/package-json.spec.js.map +0 -1
  103. package/dist/lib/ast/payload-config.spec.js +0 -365
  104. package/dist/lib/ast/payload-config.spec.js.map +0 -1
  105. package/dist/lib/ast/utils.spec.js +0 -226
  106. package/dist/lib/ast/utils.spec.js.map +0 -1
  107. package/dist/lib/create-project.spec.js +0 -190
  108. package/dist/lib/create-project.spec.js.map +0 -1
  109. package/dist/lib/download-skill.d.ts +0 -8
  110. package/dist/lib/download-skill.d.ts.map +0 -1
  111. package/dist/lib/download-skill.js +0 -35
  112. package/dist/lib/download-skill.js.map +0 -1
  113. package/dist/lib/manage-env-files.spec.js +0 -118
  114. package/dist/lib/manage-env-files.spec.js.map +0 -1
  115. package/dist/lib/select-agent.d.ts +0 -16
  116. package/dist/lib/select-agent.d.ts.map +0 -1
  117. package/dist/lib/select-agent.js +0 -67
  118. package/dist/lib/select-agent.js.map +0 -1
  119. package/dist/lib/wrap-next-config.spec.js +0 -167
  120. package/dist/lib/wrap-next-config.spec.js.map +0 -1
  121. package/dist/utils/resolvePackageVersion.spec.js +0 -77
  122. package/dist/utils/resolvePackageVersion.spec.js.map +0 -1
  123. /package/dist/template/src/app/(payload)/{custom.scss → custom.css} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAIlD,wBAAgB,gBAAgB,CAAC,EAAE,YAAY,EAAE,EAAE;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAQpF;AAED,wBAAgB,iBAAiB,IAAI,eAAe,EAAE,CAmCrD"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAIlD,wBAAgB,gBAAgB,CAAC,EAAE,YAAY,EAAE,EAAE;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAQpF;AAED,wBAAgB,iBAAiB,IAAI,eAAe,EAAE,CAyCrD"}
@@ -17,6 +17,12 @@ export function getValidTemplates() {
17
17
  description: 'Blank 3.0 Template',
18
18
  url: `https://github.com/payloadcms/payload/templates/blank#main`
19
19
  },
20
+ {
21
+ name: 'blank-tanstack',
22
+ type: 'starter',
23
+ description: 'Blank TanStack Start Template',
24
+ url: 'https://github.com/payloadcms/payload/templates/blank-tanstack#main'
25
+ },
20
26
  {
21
27
  name: 'website',
22
28
  type: 'starter',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/templates.ts"],"sourcesContent":["import type { ProjectTemplate } from '../types.js'\n\nimport { error, info } from '../utils/log.js'\n\nexport function validateTemplate({ templateName }: { templateName: string }): boolean {\n const validTemplates = getValidTemplates()\n if (!validTemplates.map((t) => t.name).includes(templateName)) {\n error(`'${templateName}' is not a valid template.`)\n info(`Valid templates: ${validTemplates.map((t) => t.name).join(', ')}`)\n return false\n }\n return true\n}\n\nexport function getValidTemplates(): ProjectTemplate[] {\n // Starters _must_ be a valid template name from the templates/ directory\n return [\n {\n name: 'blank',\n type: 'starter',\n description: 'Blank 3.0 Template',\n url: `https://github.com/payloadcms/payload/templates/blank#main`,\n },\n {\n name: 'website',\n type: 'starter',\n description: 'Website Template',\n url: `https://github.com/payloadcms/payload/templates/website#main`,\n },\n {\n name: 'ecommerce',\n type: 'starter',\n description: 'Ecommerce template',\n url: 'https://github.com/payloadcms/payload/templates/ecommerce#main',\n },\n {\n name: 'with-cloudflare-d1',\n type: 'starter',\n dbType: 'd1-sqlite',\n description: 'Blank template with Cloudflare D1 and Workers integration',\n url: 'https://github.com/payloadcms/payload/templates/with-cloudflare-d1#main',\n },\n {\n name: 'plugin',\n type: 'plugin',\n description: 'Template for creating a Payload plugin',\n url: 'https://github.com/payloadcms/payload/templates/plugin#main',\n },\n ]\n}\n"],"names":["error","info","validateTemplate","templateName","validTemplates","getValidTemplates","map","t","name","includes","join","type","description","url","dbType"],"mappings":"AAEA,SAASA,KAAK,EAAEC,IAAI,QAAQ,kBAAiB;AAE7C,OAAO,SAASC,iBAAiB,EAAEC,YAAY,EAA4B;IACzE,MAAMC,iBAAiBC;IACvB,IAAI,CAACD,eAAeE,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,EAAEC,QAAQ,CAACN,eAAe;QAC7DH,MAAM,CAAC,CAAC,EAAEG,aAAa,0BAA0B,CAAC;QAClDF,KAAK,CAAC,iBAAiB,EAAEG,eAAeE,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,EAAEE,IAAI,CAAC,OAAO;QACvE,OAAO;IACT;IACA,OAAO;AACT;AAEA,OAAO,SAASL;IACd,yEAAyE;IACzE,OAAO;QACL;YACEG,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK,CAAC,0DAA0D,CAAC;QACnE;QACA;YACEL,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK,CAAC,4DAA4D,CAAC;QACrE;QACA;YACEL,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK;QACP;QACA;YACEL,MAAM;YACNG,MAAM;YACNG,QAAQ;YACRF,aAAa;YACbC,KAAK;QACP;QACA;YACEL,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK;QACP;KACD;AACH"}
1
+ {"version":3,"sources":["../../src/lib/templates.ts"],"sourcesContent":["import type { ProjectTemplate } from '../types.js'\n\nimport { error, info } from '../utils/log.js'\n\nexport function validateTemplate({ templateName }: { templateName: string }): boolean {\n const validTemplates = getValidTemplates()\n if (!validTemplates.map((t) => t.name).includes(templateName)) {\n error(`'${templateName}' is not a valid template.`)\n info(`Valid templates: ${validTemplates.map((t) => t.name).join(', ')}`)\n return false\n }\n return true\n}\n\nexport function getValidTemplates(): ProjectTemplate[] {\n // Starters _must_ be a valid template name from the templates/ directory\n return [\n {\n name: 'blank',\n type: 'starter',\n description: 'Blank 3.0 Template',\n url: `https://github.com/payloadcms/payload/templates/blank#main`,\n },\n {\n name: 'blank-tanstack',\n type: 'starter',\n description: 'Blank TanStack Start Template',\n url: 'https://github.com/payloadcms/payload/templates/blank-tanstack#main',\n },\n {\n name: 'website',\n type: 'starter',\n description: 'Website Template',\n url: `https://github.com/payloadcms/payload/templates/website#main`,\n },\n {\n name: 'ecommerce',\n type: 'starter',\n description: 'Ecommerce template',\n url: 'https://github.com/payloadcms/payload/templates/ecommerce#main',\n },\n {\n name: 'with-cloudflare-d1',\n type: 'starter',\n dbType: 'd1-sqlite',\n description: 'Blank template with Cloudflare D1 and Workers integration',\n url: 'https://github.com/payloadcms/payload/templates/with-cloudflare-d1#main',\n },\n {\n name: 'plugin',\n type: 'plugin',\n description: 'Template for creating a Payload plugin',\n url: 'https://github.com/payloadcms/payload/templates/plugin#main',\n },\n ]\n}\n"],"names":["error","info","validateTemplate","templateName","validTemplates","getValidTemplates","map","t","name","includes","join","type","description","url","dbType"],"mappings":"AAEA,SAASA,KAAK,EAAEC,IAAI,QAAQ,kBAAiB;AAE7C,OAAO,SAASC,iBAAiB,EAAEC,YAAY,EAA4B;IACzE,MAAMC,iBAAiBC;IACvB,IAAI,CAACD,eAAeE,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,EAAEC,QAAQ,CAACN,eAAe;QAC7DH,MAAM,CAAC,CAAC,EAAEG,aAAa,0BAA0B,CAAC;QAClDF,KAAK,CAAC,iBAAiB,EAAEG,eAAeE,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI,EAAEE,IAAI,CAAC,OAAO;QACvE,OAAO;IACT;IACA,OAAO;AACT;AAEA,OAAO,SAASL;IACd,yEAAyE;IACzE,OAAO;QACL;YACEG,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK,CAAC,0DAA0D,CAAC;QACnE;QACA;YACEL,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK;QACP;QACA;YACEL,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK,CAAC,4DAA4D,CAAC;QACrE;QACA;YACEL,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK;QACP;QACA;YACEL,MAAM;YACNG,MAAM;YACNG,QAAQ;YACRF,aAAa;YACbC,KAAK;QACP;QACA;YACEL,MAAM;YACNG,MAAM;YACNC,aAAa;YACbC,KAAK;QACP;KACD;AACH"}
@@ -1,6 +1,21 @@
1
- import type { NextAppDetails } from '../types.js';
2
- export declare function updatePayloadInProject(appDetails: NextAppDetails, versionOrTag?: string): Promise<{
1
+ import type { NextAppDetails, TanStackAppDetails } from '../types.js';
2
+ type UpdateResult = {
3
3
  message: string;
4
4
  success: boolean;
5
- }>;
5
+ };
6
+ export declare function updatePayloadPackages({ projectDir, versionOrTag, }: {
7
+ projectDir: string;
8
+ versionOrTag?: string;
9
+ }): Promise<UpdateResult>;
10
+ export declare function updatePayloadInNextProject({ appDetails, versionOrTag, }: {
11
+ appDetails: NextAppDetails;
12
+ versionOrTag?: string;
13
+ }): Promise<UpdateResult>;
14
+ export declare function updatePayloadInTanStackProject({ appDetails, templateRoot, versionOrTag, }: {
15
+ appDetails: TanStackAppDetails;
16
+ templateRoot?: string;
17
+ versionOrTag?: string;
18
+ }): Promise<UpdateResult>;
19
+ export declare function updatePayloadInProject(appDetails: NextAppDetails, versionOrTag?: string): Promise<UpdateResult>;
20
+ export {};
6
21
  //# sourceMappingURL=update-payload-in-project.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-payload-in-project.d.ts","sourceRoot":"","sources":["../../src/lib/update-payload-in-project.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAQjD,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,cAAc,EAC1B,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAqEhD"}
1
+ {"version":3,"file":"update-payload-in-project.d.ts","sourceRoot":"","sources":["../../src/lib/update-payload-in-project.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAYrE,KAAK,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAA;AAIzD,wBAAsB,qBAAqB,CAAC,EAC1C,UAAU,EACV,YAAY,GACb,EAAE;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAIxB;AAED,wBAAsB,0BAA0B,CAAC,EAC/C,UAAU,EACV,YAAY,GACb,EAAE;IACD,UAAU,EAAE,cAAc,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAuCxB;AAED,wBAAsB,8BAA8B,CAAC,EACnD,UAAU,EACV,YAA4C,EAC5C,YAAY,GACb,EAAE;IACD,UAAU,EAAE,kBAAkB,CAAA;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CAqCxB;AAED,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,cAAc,EAC1B,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,YAAY,CAAC,CAEvB"}
@@ -1,14 +1,25 @@
1
1
  import fse from 'fs-extra';
2
2
  import { fileURLToPath } from 'node:url';
3
3
  import path from 'path';
4
- const filename = fileURLToPath(import.meta.url);
5
- const dirname = path.dirname(filename);
6
4
  import { copyRecursiveSync } from '../utils/copy-recursive-sync.js';
7
5
  import { info } from '../utils/log.js';
8
6
  import { resolvePackageVersion } from '../utils/resolvePackageVersion.js';
9
7
  import { getPackageManager } from './get-package-manager.js';
10
8
  import { installPackages } from './install-packages.js';
11
- export async function updatePayloadInProject(appDetails, versionOrTag) {
9
+ import { TANSTACK_TEMPLATE_FILES } from './tanstack/template-files.js';
10
+ const filename = fileURLToPath(import.meta.url);
11
+ const dirname = path.dirname(filename);
12
+ export async function updatePayloadPackages({ projectDir, versionOrTag }) {
13
+ const result = await performPayloadPackageUpdate({
14
+ projectDir,
15
+ versionOrTag
16
+ });
17
+ return {
18
+ message: result.message,
19
+ success: result.success
20
+ };
21
+ }
22
+ export async function updatePayloadInNextProject({ appDetails, versionOrTag }) {
12
23
  if (!appDetails.nextConfigPath) {
13
24
  return {
14
25
  message: 'No Next.js config found',
@@ -16,37 +27,108 @@ export async function updatePayloadInProject(appDetails, versionOrTag) {
16
27
  };
17
28
  }
18
29
  const projectDir = path.dirname(appDetails.nextConfigPath);
30
+ const packageUpdate = await performPayloadPackageUpdate({
31
+ projectDir,
32
+ versionOrTag
33
+ });
34
+ if (!packageUpdate.isUpdated) {
35
+ return {
36
+ message: packageUpdate.message,
37
+ success: packageUpdate.success
38
+ };
39
+ }
40
+ info(`Updating Payload Next.js files...`);
41
+ const templateFilesPath = process.env.JEST_WORKER_ID !== undefined ? path.resolve(dirname, '../../../../templates/blank') : path.resolve(dirname, '../..', 'dist/template');
42
+ const templateSrcDir = path.resolve(templateFilesPath, 'src/app/(payload)');
43
+ const payloadDirPath = path.resolve(projectDir, appDetails.isSrcDir ? 'src/app' : 'app', '(payload)');
44
+ const legacyCustomStylesPath = path.resolve(payloadDirPath, 'custom.scss');
45
+ const customCssPath = path.resolve(payloadDirPath, 'custom.css');
46
+ if (fse.existsSync(legacyCustomStylesPath) && !fse.existsSync(customCssPath)) {
47
+ fse.renameSync(legacyCustomStylesPath, customCssPath);
48
+ info('Renamed `(payload)/custom.scss` to `custom.css`. If it contained Sass syntax (nesting, `$variables`, `@mixin`, etc.), convert it to plain CSS — it is no longer transpiled.');
49
+ }
50
+ copyRecursiveSync(templateSrcDir, payloadDirPath, [
51
+ 'custom.css$'
52
+ ]);
53
+ return {
54
+ message: packageUpdate.message,
55
+ success: packageUpdate.success
56
+ };
57
+ }
58
+ export async function updatePayloadInTanStackProject({ appDetails, templateRoot = resolveTanStackTemplateRoot(), versionOrTag }) {
59
+ const packageUpdate = await performPayloadPackageUpdate({
60
+ projectDir: appDetails.projectDir,
61
+ versionOrTag
62
+ });
63
+ if (!packageUpdate.isUpdated) {
64
+ return {
65
+ message: packageUpdate.message,
66
+ success: packageUpdate.success
67
+ };
68
+ }
69
+ info(`Updating Payload TanStack files...`);
70
+ const hasPackedTemplateLayout = fse.existsSync(path.join(templateRoot, 'routes'));
71
+ for (const { destination, relativePath, sourcePath } of TANSTACK_TEMPLATE_FILES){
72
+ const isPayloadRoute = destination === 'routes' && relativePath.startsWith('_payload');
73
+ const isPayloadStyles = destination === 'src' && relativePath === 'payload.css';
74
+ if (!isPayloadRoute && !isPayloadStyles) {
75
+ continue;
76
+ }
77
+ const destinationPath = path.join(destination === 'routes' ? appDetails.routesDir : appDetails.sourceDir, relativePath);
78
+ if (isPayloadStyles && fse.existsSync(destinationPath)) {
79
+ continue;
80
+ }
81
+ const templatePath = hasPackedTemplateLayout ? path.join(templateRoot, destination, relativePath) : path.join(templateRoot, sourcePath);
82
+ fse.ensureDirSync(path.dirname(destinationPath));
83
+ fse.copyFileSync(templatePath, destinationPath);
84
+ }
85
+ return {
86
+ message: packageUpdate.message,
87
+ success: packageUpdate.success
88
+ };
89
+ }
90
+ export async function updatePayloadInProject(appDetails, versionOrTag) {
91
+ return updatePayloadInNextProject({
92
+ appDetails,
93
+ versionOrTag
94
+ });
95
+ }
96
+ async function performPayloadPackageUpdate({ projectDir, versionOrTag }) {
19
97
  const packageObj = await fse.readJson(path.resolve(projectDir, 'package.json'));
20
- if (!packageObj?.dependencies) {
98
+ if (!packageObj.dependencies && !packageObj.devDependencies) {
21
99
  throw new Error('No package.json found in this project');
22
100
  }
23
- const payloadVersion = packageObj.dependencies?.payload;
101
+ const dependencyGroups = [
102
+ packageObj.dependencies,
103
+ packageObj.devDependencies
104
+ ].filter((dependencies)=>Boolean(dependencies));
105
+ const payloadPackageEntries = dependencyGroups.flatMap((dependencies)=>Object.entries(dependencies).filter(([packageName])=>packageName === 'payload' || packageName.startsWith('@payloadcms/')));
106
+ const payloadVersion = payloadPackageEntries.find(([packageName])=>packageName === 'payload')?.[1];
24
107
  if (!payloadVersion) {
25
108
  throw new Error('Payload is not installed in this project');
26
109
  }
27
110
  const packageManager = await getPackageManager({
28
111
  projectDir
29
112
  });
30
- // Resolve the requested Payload version (dist-tag or explicit version)
31
113
  const latestPayloadVersion = await resolvePackageVersion({
32
114
  packageName: 'payload',
33
115
  versionOrTag
34
116
  });
35
- if (payloadVersion === latestPayloadVersion) {
117
+ if (payloadPackageEntries.every(([, version])=>version === latestPayloadVersion)) {
36
118
  return {
119
+ isUpdated: false,
37
120
  message: `Payload v${payloadVersion} is already up to date.`,
38
121
  success: true
39
122
  };
40
123
  }
41
- // Update all existing Payload packages
42
- const payloadPackages = Object.keys(packageObj.dependencies).filter((dep)=>dep.startsWith('@payloadcms/'));
124
+ const payloadPackages = payloadPackageEntries.map(([packageName])=>packageName).filter((packageName)=>packageName.startsWith('@payloadcms/'));
43
125
  const packageNames = [
44
126
  'payload',
45
- ...payloadPackages
127
+ ...new Set(payloadPackages)
46
128
  ];
47
- const packagesToUpdate = packageNames.map((pkg)=>`${pkg}@${latestPayloadVersion}`);
129
+ const packagesToUpdate = packageNames.map((packageName)=>`${packageName}@${latestPayloadVersion}`);
48
130
  info(`Using ${packageManager}.\n`);
49
- info(`Updating ${packagesToUpdate.length} Payload packages to v${latestPayloadVersion}...\n\n${packageNames.map((p)=>` - ${p}`).join('\n')}`);
131
+ info(`Updating ${packagesToUpdate.length} Payload packages to v${latestPayloadVersion}...\n\n${packageNames.map((packageName)=>` - ${packageName}`).join('\n')}`);
50
132
  const { success: updateSuccess } = await installPackages({
51
133
  packageManager,
52
134
  packagesToInstall: packagesToUpdate,
@@ -56,16 +138,14 @@ export async function updatePayloadInProject(appDetails, versionOrTag) {
56
138
  throw new Error('Failed to update Payload packages');
57
139
  }
58
140
  info('Payload packages updated successfully.');
59
- info(`Updating Payload Next.js files...`);
60
- const templateFilesPath = process.env.JEST_WORKER_ID !== undefined ? path.resolve(dirname, '../../../../templates/blank') : path.resolve(dirname, '../..', 'dist/template');
61
- const templateSrcDir = path.resolve(templateFilesPath, 'src/app/(payload)');
62
- copyRecursiveSync(templateSrcDir, path.resolve(projectDir, appDetails.isSrcDir ? 'src/app' : 'app', '(payload)'), [
63
- 'custom.scss$'
64
- ]);
65
141
  return {
142
+ isUpdated: true,
66
143
  message: 'Payload updated successfully.',
67
144
  success: true
68
145
  };
69
146
  }
147
+ function resolveTanStackTemplateRoot() {
148
+ return path.basename(path.dirname(dirname)) === 'dist' ? path.resolve(dirname, '../template-tanstack') : path.resolve(dirname, '../../../../templates/blank-tanstack/src');
149
+ }
70
150
 
71
151
  //# sourceMappingURL=update-payload-in-project.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/update-payload-in-project.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\nimport type { NextAppDetails } from '../types.js'\n\nimport { copyRecursiveSync } from '../utils/copy-recursive-sync.js'\nimport { info } from '../utils/log.js'\nimport { resolvePackageVersion } from '../utils/resolvePackageVersion.js'\nimport { getPackageManager } from './get-package-manager.js'\nimport { installPackages } from './install-packages.js'\n\nexport async function updatePayloadInProject(\n appDetails: NextAppDetails,\n versionOrTag?: string,\n): Promise<{ message: string; success: boolean }> {\n if (!appDetails.nextConfigPath) {\n return { message: 'No Next.js config found', success: false }\n }\n\n const projectDir = path.dirname(appDetails.nextConfigPath)\n\n const packageObj = (await fse.readJson(path.resolve(projectDir, 'package.json'))) as {\n dependencies?: Record<string, string>\n }\n if (!packageObj?.dependencies) {\n throw new Error('No package.json found in this project')\n }\n\n const payloadVersion = packageObj.dependencies?.payload\n if (!payloadVersion) {\n throw new Error('Payload is not installed in this project')\n }\n\n const packageManager = await getPackageManager({ projectDir })\n\n // Resolve the requested Payload version (dist-tag or explicit version)\n const latestPayloadVersion = await resolvePackageVersion({ packageName: 'payload', versionOrTag })\n\n if (payloadVersion === latestPayloadVersion) {\n return { message: `Payload v${payloadVersion} is already up to date.`, success: true }\n }\n\n // Update all existing Payload packages\n const payloadPackages = Object.keys(packageObj.dependencies).filter((dep) =>\n dep.startsWith('@payloadcms/'),\n )\n\n const packageNames = ['payload', ...payloadPackages]\n\n const packagesToUpdate = packageNames.map((pkg) => `${pkg}@${latestPayloadVersion}`)\n\n info(`Using ${packageManager}.\\n`)\n info(\n `Updating ${packagesToUpdate.length} Payload packages to v${latestPayloadVersion}...\\n\\n${packageNames.map((p) => ` - ${p}`).join('\\n')}`,\n )\n\n const { success: updateSuccess } = await installPackages({\n packageManager,\n packagesToInstall: packagesToUpdate,\n projectDir,\n })\n\n if (!updateSuccess) {\n throw new Error('Failed to update Payload packages')\n }\n info('Payload packages updated successfully.')\n\n info(`Updating Payload Next.js files...`)\n\n const templateFilesPath =\n process.env.JEST_WORKER_ID !== undefined\n ? path.resolve(dirname, '../../../../templates/blank')\n : path.resolve(dirname, '../..', 'dist/template')\n\n const templateSrcDir = path.resolve(templateFilesPath, 'src/app/(payload)')\n\n copyRecursiveSync(\n templateSrcDir,\n path.resolve(projectDir, appDetails.isSrcDir ? 'src/app' : 'app', '(payload)'),\n ['custom.scss$'], // Do not overwrite user's custom.scss\n )\n\n return { message: 'Payload updated successfully.', success: true }\n}\n"],"names":["fse","fileURLToPath","path","filename","url","dirname","copyRecursiveSync","info","resolvePackageVersion","getPackageManager","installPackages","updatePayloadInProject","appDetails","versionOrTag","nextConfigPath","message","success","projectDir","packageObj","readJson","resolve","dependencies","Error","payloadVersion","payload","packageManager","latestPayloadVersion","packageName","payloadPackages","Object","keys","filter","dep","startsWith","packageNames","packagesToUpdate","map","pkg","length","p","join","updateSuccess","packagesToInstall","templateFilesPath","process","env","JEST_WORKER_ID","undefined","templateSrcDir","isSrcDir"],"mappings":"AAAA,OAAOA,SAAS,WAAU;AAC1B,SAASC,aAAa,QAAQ,WAAU;AACxC,OAAOC,UAAU,OAAM;AAEvB,MAAMC,WAAWF,cAAc,YAAYG,GAAG;AAC9C,MAAMC,UAAUH,KAAKG,OAAO,CAACF;AAI7B,SAASG,iBAAiB,QAAQ,kCAAiC;AACnE,SAASC,IAAI,QAAQ,kBAAiB;AACtC,SAASC,qBAAqB,QAAQ,oCAAmC;AACzE,SAASC,iBAAiB,QAAQ,2BAA0B;AAC5D,SAASC,eAAe,QAAQ,wBAAuB;AAEvD,OAAO,eAAeC,uBACpBC,UAA0B,EAC1BC,YAAqB;IAErB,IAAI,CAACD,WAAWE,cAAc,EAAE;QAC9B,OAAO;YAAEC,SAAS;YAA2BC,SAAS;QAAM;IAC9D;IAEA,MAAMC,aAAaf,KAAKG,OAAO,CAACO,WAAWE,cAAc;IAEzD,MAAMI,aAAc,MAAMlB,IAAImB,QAAQ,CAACjB,KAAKkB,OAAO,CAACH,YAAY;IAGhE,IAAI,CAACC,YAAYG,cAAc;QAC7B,MAAM,IAAIC,MAAM;IAClB;IAEA,MAAMC,iBAAiBL,WAAWG,YAAY,EAAEG;IAChD,IAAI,CAACD,gBAAgB;QACnB,MAAM,IAAID,MAAM;IAClB;IAEA,MAAMG,iBAAiB,MAAMhB,kBAAkB;QAAEQ;IAAW;IAE5D,uEAAuE;IACvE,MAAMS,uBAAuB,MAAMlB,sBAAsB;QAAEmB,aAAa;QAAWd;IAAa;IAEhG,IAAIU,mBAAmBG,sBAAsB;QAC3C,OAAO;YAAEX,SAAS,CAAC,SAAS,EAAEQ,eAAe,uBAAuB,CAAC;YAAEP,SAAS;QAAK;IACvF;IAEA,uCAAuC;IACvC,MAAMY,kBAAkBC,OAAOC,IAAI,CAACZ,WAAWG,YAAY,EAAEU,MAAM,CAAC,CAACC,MACnEA,IAAIC,UAAU,CAAC;IAGjB,MAAMC,eAAe;QAAC;WAAcN;KAAgB;IAEpD,MAAMO,mBAAmBD,aAAaE,GAAG,CAAC,CAACC,MAAQ,GAAGA,IAAI,CAAC,EAAEX,sBAAsB;IAEnFnB,KAAK,CAAC,MAAM,EAAEkB,eAAe,GAAG,CAAC;IACjClB,KACE,CAAC,SAAS,EAAE4B,iBAAiBG,MAAM,CAAC,sBAAsB,EAAEZ,qBAAqB,OAAO,EAAEQ,aAAaE,GAAG,CAAC,CAACG,IAAM,CAAC,IAAI,EAAEA,GAAG,EAAEC,IAAI,CAAC,OAAO;IAG5I,MAAM,EAAExB,SAASyB,aAAa,EAAE,GAAG,MAAM/B,gBAAgB;QACvDe;QACAiB,mBAAmBP;QACnBlB;IACF;IAEA,IAAI,CAACwB,eAAe;QAClB,MAAM,IAAInB,MAAM;IAClB;IACAf,KAAK;IAELA,KAAK,CAAC,iCAAiC,CAAC;IAExC,MAAMoC,oBACJC,QAAQC,GAAG,CAACC,cAAc,KAAKC,YAC3B7C,KAAKkB,OAAO,CAACf,SAAS,iCACtBH,KAAKkB,OAAO,CAACf,SAAS,SAAS;IAErC,MAAM2C,iBAAiB9C,KAAKkB,OAAO,CAACuB,mBAAmB;IAEvDrC,kBACE0C,gBACA9C,KAAKkB,OAAO,CAACH,YAAYL,WAAWqC,QAAQ,GAAG,YAAY,OAAO,cAClE;QAAC;KAAe;IAGlB,OAAO;QAAElC,SAAS;QAAiCC,SAAS;IAAK;AACnE"}
1
+ {"version":3,"sources":["../../src/lib/update-payload-in-project.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\n\nimport type { NextAppDetails, TanStackAppDetails } from '../types.js'\n\nimport { copyRecursiveSync } from '../utils/copy-recursive-sync.js'\nimport { info } from '../utils/log.js'\nimport { resolvePackageVersion } from '../utils/resolvePackageVersion.js'\nimport { getPackageManager } from './get-package-manager.js'\nimport { installPackages } from './install-packages.js'\nimport { TANSTACK_TEMPLATE_FILES } from './tanstack/template-files.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\ntype UpdateResult = { message: string; success: boolean }\n\ntype PackageUpdateResult = { isUpdated: boolean } & UpdateResult\n\nexport async function updatePayloadPackages({\n projectDir,\n versionOrTag,\n}: {\n projectDir: string\n versionOrTag?: string\n}): Promise<UpdateResult> {\n const result = await performPayloadPackageUpdate({ projectDir, versionOrTag })\n\n return { message: result.message, success: result.success }\n}\n\nexport async function updatePayloadInNextProject({\n appDetails,\n versionOrTag,\n}: {\n appDetails: NextAppDetails\n versionOrTag?: string\n}): Promise<UpdateResult> {\n if (!appDetails.nextConfigPath) {\n return { message: 'No Next.js config found', success: false }\n }\n\n const projectDir = path.dirname(appDetails.nextConfigPath)\n const packageUpdate = await performPayloadPackageUpdate({ projectDir, versionOrTag })\n\n if (!packageUpdate.isUpdated) {\n return { message: packageUpdate.message, success: packageUpdate.success }\n }\n\n info(`Updating Payload Next.js files...`)\n\n const templateFilesPath =\n process.env.JEST_WORKER_ID !== undefined\n ? path.resolve(dirname, '../../../../templates/blank')\n : path.resolve(dirname, '../..', 'dist/template')\n\n const templateSrcDir = path.resolve(templateFilesPath, 'src/app/(payload)')\n const payloadDirPath = path.resolve(\n projectDir,\n appDetails.isSrcDir ? 'src/app' : 'app',\n '(payload)',\n )\n\n const legacyCustomStylesPath = path.resolve(payloadDirPath, 'custom.scss')\n const customCssPath = path.resolve(payloadDirPath, 'custom.css')\n\n if (fse.existsSync(legacyCustomStylesPath) && !fse.existsSync(customCssPath)) {\n fse.renameSync(legacyCustomStylesPath, customCssPath)\n info(\n 'Renamed `(payload)/custom.scss` to `custom.css`. If it contained Sass syntax (nesting, `$variables`, `@mixin`, etc.), convert it to plain CSS — it is no longer transpiled.',\n )\n }\n\n copyRecursiveSync(templateSrcDir, payloadDirPath, ['custom.css$'])\n\n return { message: packageUpdate.message, success: packageUpdate.success }\n}\n\nexport async function updatePayloadInTanStackProject({\n appDetails,\n templateRoot = resolveTanStackTemplateRoot(),\n versionOrTag,\n}: {\n appDetails: TanStackAppDetails\n templateRoot?: string\n versionOrTag?: string\n}): Promise<UpdateResult> {\n const packageUpdate = await performPayloadPackageUpdate({\n projectDir: appDetails.projectDir,\n versionOrTag,\n })\n\n if (!packageUpdate.isUpdated) {\n return { message: packageUpdate.message, success: packageUpdate.success }\n }\n\n info(`Updating Payload TanStack files...`)\n const hasPackedTemplateLayout = fse.existsSync(path.join(templateRoot, 'routes'))\n\n for (const { destination, relativePath, sourcePath } of TANSTACK_TEMPLATE_FILES) {\n const isPayloadRoute = destination === 'routes' && relativePath.startsWith('_payload')\n const isPayloadStyles = destination === 'src' && relativePath === 'payload.css'\n\n if (!isPayloadRoute && !isPayloadStyles) {\n continue\n }\n\n const destinationPath = path.join(\n destination === 'routes' ? appDetails.routesDir : appDetails.sourceDir,\n relativePath,\n )\n if (isPayloadStyles && fse.existsSync(destinationPath)) {\n continue\n }\n\n const templatePath = hasPackedTemplateLayout\n ? path.join(templateRoot, destination, relativePath)\n : path.join(templateRoot, sourcePath)\n fse.ensureDirSync(path.dirname(destinationPath))\n fse.copyFileSync(templatePath, destinationPath)\n }\n\n return { message: packageUpdate.message, success: packageUpdate.success }\n}\n\nexport async function updatePayloadInProject(\n appDetails: NextAppDetails,\n versionOrTag?: string,\n): Promise<UpdateResult> {\n return updatePayloadInNextProject({ appDetails, versionOrTag })\n}\n\nasync function performPayloadPackageUpdate({\n projectDir,\n versionOrTag,\n}: {\n projectDir: string\n versionOrTag?: string\n}): Promise<PackageUpdateResult> {\n const packageObj = (await fse.readJson(path.resolve(projectDir, 'package.json'))) as {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n }\n if (!packageObj.dependencies && !packageObj.devDependencies) {\n throw new Error('No package.json found in this project')\n }\n\n const dependencyGroups = [packageObj.dependencies, packageObj.devDependencies].filter(\n (dependencies): dependencies is Record<string, string> => Boolean(dependencies),\n )\n const payloadPackageEntries = dependencyGroups.flatMap((dependencies) =>\n Object.entries(dependencies).filter(\n ([packageName]) => packageName === 'payload' || packageName.startsWith('@payloadcms/'),\n ),\n )\n const payloadVersion = payloadPackageEntries.find(\n ([packageName]) => packageName === 'payload',\n )?.[1]\n if (!payloadVersion) {\n throw new Error('Payload is not installed in this project')\n }\n\n const packageManager = await getPackageManager({ projectDir })\n const latestPayloadVersion = await resolvePackageVersion({ packageName: 'payload', versionOrTag })\n\n if (payloadPackageEntries.every(([, version]) => version === latestPayloadVersion)) {\n return {\n isUpdated: false,\n message: `Payload v${payloadVersion} is already up to date.`,\n success: true,\n }\n }\n\n const payloadPackages = payloadPackageEntries\n .map(([packageName]) => packageName)\n .filter((packageName) => packageName.startsWith('@payloadcms/'))\n const packageNames = ['payload', ...new Set(payloadPackages)]\n const packagesToUpdate = packageNames.map(\n (packageName) => `${packageName}@${latestPayloadVersion}`,\n )\n\n info(`Using ${packageManager}.\\n`)\n info(\n `Updating ${packagesToUpdate.length} Payload packages to v${latestPayloadVersion}...\\n\\n${packageNames.map((packageName) => ` - ${packageName}`).join('\\n')}`,\n )\n\n const { success: updateSuccess } = await installPackages({\n packageManager,\n packagesToInstall: packagesToUpdate,\n projectDir,\n })\n\n if (!updateSuccess) {\n throw new Error('Failed to update Payload packages')\n }\n info('Payload packages updated successfully.')\n\n return { isUpdated: true, message: 'Payload updated successfully.', success: true }\n}\n\nfunction resolveTanStackTemplateRoot(): string {\n return path.basename(path.dirname(dirname)) === 'dist'\n ? path.resolve(dirname, '../template-tanstack')\n : path.resolve(dirname, '../../../../templates/blank-tanstack/src')\n}\n"],"names":["fse","fileURLToPath","path","copyRecursiveSync","info","resolvePackageVersion","getPackageManager","installPackages","TANSTACK_TEMPLATE_FILES","filename","url","dirname","updatePayloadPackages","projectDir","versionOrTag","result","performPayloadPackageUpdate","message","success","updatePayloadInNextProject","appDetails","nextConfigPath","packageUpdate","isUpdated","templateFilesPath","process","env","JEST_WORKER_ID","undefined","resolve","templateSrcDir","payloadDirPath","isSrcDir","legacyCustomStylesPath","customCssPath","existsSync","renameSync","updatePayloadInTanStackProject","templateRoot","resolveTanStackTemplateRoot","hasPackedTemplateLayout","join","destination","relativePath","sourcePath","isPayloadRoute","startsWith","isPayloadStyles","destinationPath","routesDir","sourceDir","templatePath","ensureDirSync","copyFileSync","updatePayloadInProject","packageObj","readJson","dependencies","devDependencies","Error","dependencyGroups","filter","Boolean","payloadPackageEntries","flatMap","Object","entries","packageName","payloadVersion","find","packageManager","latestPayloadVersion","every","version","payloadPackages","map","packageNames","Set","packagesToUpdate","length","updateSuccess","packagesToInstall","basename"],"mappings":"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"}
package/dist/main.d.ts CHANGED
@@ -1,7 +1,26 @@
1
- import type { CliArgs } from './types.js';
1
+ import type { CliArgs, NextAppDetails, TanStackAppDetails, TanStackDetectionResult } from './types.js';
2
2
  export declare class Main {
3
3
  args: CliArgs;
4
4
  constructor();
5
5
  init(): Promise<void>;
6
6
  }
7
+ type AppFramework = {
8
+ appDetails: NextAppDetails;
9
+ kind: 'next';
10
+ } | {
11
+ appDetails: TanStackAppDetails;
12
+ kind: 'tanstack';
13
+ } | {
14
+ kind: 'ambiguous';
15
+ } | {
16
+ kind: 'none';
17
+ } | {
18
+ kind: 'unsupported-tanstack';
19
+ reason: string;
20
+ };
21
+ export declare function resolveAppFramework({ nextAppDetails, tanStackDetection, }: {
22
+ nextAppDetails: NextAppDetails;
23
+ tanStackDetection: TanStackDetectionResult;
24
+ }): AppFramework;
25
+ export {};
7
26
  //# sourceMappingURL=main.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AA4BzC,qBAAa,IAAI;IACf,IAAI,EAAE,OAAO,CAAA;IAEb,cAgDC;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA8N1B;CACF"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,YAAY,CAAA;AAiCnB,qBAAa,IAAI;IACf,IAAI,EAAE,OAAO,CAAA;IAEb,cA8CC;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAwS1B;CACF;AAED,KAAK,YAAY,GACb;IAAE,UAAU,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,UAAU,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAEpD,wBAAgB,mBAAmB,CAAC,EAClC,cAAc,EACd,iBAAiB,GAClB,EAAE;IACD,cAAc,EAAE,cAAc,CAAA;IAC9B,iBAAiB,EAAE,uBAAuB,CAAA;CAC3C,GAAG,YAAY,CAkBf"}
package/dist/main.js CHANGED
@@ -10,22 +10,22 @@ import { parseExample } from './lib/examples.js';
10
10
  import { generateSecret } from './lib/generate-secret.js';
11
11
  import { getPackageManager } from './lib/get-package-manager.js';
12
12
  import { getNextAppDetails, initNext } from './lib/init-next.js';
13
+ import { initTanStack } from './lib/init-tanstack.js';
13
14
  import { manageEnvFiles } from './lib/manage-env-files.js';
14
15
  import { parseProjectName } from './lib/parse-project-name.js';
15
16
  import { parseTemplate } from './lib/parse-template.js';
16
- import { selectAgent } from './lib/select-agent.js';
17
17
  import { selectDb } from './lib/select-db.js';
18
+ import { getTanStackAppDetails } from './lib/tanstack/detect.js';
18
19
  import { getValidTemplates, validateTemplate } from './lib/templates.js';
19
- import { updatePayloadInProject } from './lib/update-payload-in-project.js';
20
+ import { updatePayloadInNextProject, updatePayloadInTanStackProject } from './lib/update-payload-in-project.js';
20
21
  import { debug, error, info } from './utils/log.js';
21
- import { feedbackOutro, helpMessage, moveMessage, successfulNextInit, successMessage } from './utils/messages.js';
22
+ import { feedbackOutro, helpMessage, moveMessage, successfulNextInit, successfulTanStackInit, successMessage } from './utils/messages.js';
22
23
  import { DEFAULT_PAYLOAD_VERSION_TAG, resolvePackageVersion } from './utils/resolvePackageVersion.js';
23
24
  export class Main {
24
25
  args;
25
26
  constructor(){
26
27
  // @ts-expect-error bad typings
27
28
  this.args = arg({
28
- '--agent': String,
29
29
  '--branch': String,
30
30
  '--db': String,
31
31
  '--db-accept-recommended': Boolean,
@@ -54,7 +54,6 @@ export class Main {
54
54
  '--debug': Boolean,
55
55
  '--dry-run': Boolean,
56
56
  // Aliases
57
- '-a': '--agent',
58
57
  '-d': '--db',
59
58
  '-e': '--example',
60
59
  '-h': '--help',
@@ -84,23 +83,46 @@ export class Main {
84
83
  console.log('\n');
85
84
  p.intro(chalk.bgCyan(chalk.black(' create-payload-app ')));
86
85
  p.note("Welcome to Payload. Let's create a project!");
87
- // Detect if inside Next.js project
86
+ const tanStackDetection = await getTanStackAppDetails({
87
+ projectDir: process.cwd()
88
+ });
88
89
  const nextAppDetails = await getNextAppDetails(process.cwd());
89
- const { hasTopLevelLayout, isPayloadInstalled, isSupportedNextVersion, nextAppDir, nextConfigPath, nextVersion } = nextAppDetails;
90
- if (nextConfigPath && !isSupportedNextVersion) {
91
- p.log.warn(`Next.js v${nextVersion} is unsupported. Next.js >= 15 is required to use Payload.`);
90
+ const appFramework = resolveAppFramework({
91
+ nextAppDetails,
92
+ tanStackDetection
93
+ });
94
+ if (appFramework.kind === 'ambiguous') {
95
+ p.log.warn('Both Next.js and TanStack project markers were detected. Remove one framework before installing Payload.');
96
+ p.outro(feedbackOutro());
97
+ return;
98
+ }
99
+ if (appFramework.kind === 'unsupported-tanstack') {
100
+ p.log.warn(appFramework.reason);
101
+ p.outro(feedbackOutro());
102
+ return;
103
+ }
104
+ if (appFramework.kind === 'next' && !appFramework.appDetails.isSupportedNextVersion) {
105
+ p.log.warn(`Next.js v${appFramework.appDetails.nextVersion} is unsupported. Next.js >= 15 is required to use Payload.`);
92
106
  p.outro(feedbackOutro());
93
107
  process.exit(0);
94
108
  }
95
- // Upgrade Payload in existing project
96
- if (isPayloadInstalled && nextConfigPath) {
109
+ const hasPayload = appFramework.kind !== 'none' && appFramework.appDetails.isPayloadInstalled;
110
+ if (hasPayload) {
97
111
  p.log.warn(`Payload installation detected in current project.`);
98
112
  const shouldUpdate = await p.confirm({
99
113
  initialValue: false,
100
114
  message: chalk.bold(`Upgrade Payload in this project?`)
101
115
  });
102
116
  if (!p.isCancel(shouldUpdate) && shouldUpdate) {
103
- const { message, success: updateSuccess } = await updatePayloadInProject(nextAppDetails, this.args['--payload-version'] ?? DEFAULT_PAYLOAD_VERSION_TAG);
117
+ const versionOrTag = this.args['--payload-version'] ?? DEFAULT_PAYLOAD_VERSION_TAG;
118
+ const updateResult = appFramework.kind === 'next' ? await updatePayloadInNextProject({
119
+ appDetails: appFramework.appDetails,
120
+ versionOrTag
121
+ }) : await updatePayloadInTanStackProject({
122
+ appDetails: appFramework.appDetails,
123
+ versionOrTag
124
+ });
125
+ const { message, success: updateSuccess } = updateResult;
104
126
  if (updateSuccess) {
105
127
  info(message);
106
128
  } else {
@@ -108,18 +130,28 @@ export class Main {
108
130
  }
109
131
  }
110
132
  p.outro(feedbackOutro());
111
- process.exit(0);
133
+ return;
112
134
  }
113
- if (nextConfigPath) {
114
- this.args['--name'] = slugify(path.basename(path.dirname(nextConfigPath)));
135
+ if (appFramework.kind === 'next') {
136
+ this.args['--name'] = slugify(path.basename(path.dirname(appFramework.appDetails.nextConfigPath)));
137
+ } else if (appFramework.kind === 'tanstack') {
138
+ this.args['--name'] = slugify(path.basename(appFramework.appDetails.projectDir));
115
139
  }
116
140
  const projectName = await parseProjectName(this.args);
117
- const projectDir = nextConfigPath ? path.dirname(nextConfigPath) : path.resolve(process.cwd(), slugify(projectName));
141
+ let projectDir;
142
+ if (appFramework.kind === 'next') {
143
+ projectDir = path.dirname(appFramework.appDetails.nextConfigPath);
144
+ } else if (appFramework.kind === 'tanstack') {
145
+ projectDir = appFramework.appDetails.projectDir;
146
+ } else {
147
+ projectDir = path.resolve(process.cwd(), slugify(projectName));
148
+ }
118
149
  const packageManager = await getPackageManager({
119
150
  cliArgs: this.args,
120
151
  projectDir
121
152
  });
122
- if (nextConfigPath) {
153
+ if (appFramework.kind === 'next') {
154
+ const { hasTopLevelLayout, nextAppDir } = appFramework.appDetails;
123
155
  p.log.step(chalk.bold(`${chalk.bgBlack(` ${figures.triangleUp} Next.js `)} project detected!`));
124
156
  const proceed = await p.confirm({
125
157
  initialValue: true,
@@ -142,7 +174,7 @@ export class Main {
142
174
  const result = await initNext({
143
175
  ...this.args,
144
176
  dbType: dbDetails.type,
145
- nextAppDetails,
177
+ nextAppDetails: appFramework.appDetails,
146
178
  packageManager,
147
179
  projectDir
148
180
  });
@@ -168,6 +200,48 @@ export class Main {
168
200
  p.outro(feedbackOutro());
169
201
  return;
170
202
  }
203
+ if (appFramework.kind === 'tanstack') {
204
+ const frameworkName = appFramework.appDetails.kind === 'start' ? 'TanStack Start' : 'TanStack Router';
205
+ p.log.step(chalk.bold(`${chalk.bgBlack(` ${frameworkName} `)} project detected!`));
206
+ const proceed = await p.confirm({
207
+ initialValue: true,
208
+ message: chalk.bold(appFramework.appDetails.kind === 'start' ? 'Install Payload in this TanStack Start project?' : 'Convert this project to TanStack Start and install Payload?')
209
+ });
210
+ if (p.isCancel(proceed) || !proceed) {
211
+ p.outro(feedbackOutro());
212
+ process.exit(0);
213
+ }
214
+ const dbDetails = await selectDb(this.args, projectName);
215
+ const result = await initTanStack({
216
+ ...this.args,
217
+ appDetails: appFramework.appDetails,
218
+ dbType: dbDetails.type,
219
+ packageManager,
220
+ projectDir
221
+ });
222
+ if (result.success === false) {
223
+ p.log.error(result.reason);
224
+ p.outro(feedbackOutro());
225
+ process.exit(1);
226
+ }
227
+ await configurePayloadConfig({
228
+ dbType: dbDetails.type,
229
+ projectDirOrConfigPath: {
230
+ payloadConfigPath: result.payloadConfigPath
231
+ }
232
+ });
233
+ await manageEnvFiles({
234
+ cliArgs: this.args,
235
+ databaseType: dbDetails.type,
236
+ databaseUri: dbDetails.dbUri,
237
+ payloadSecret: generateSecret(),
238
+ projectDir
239
+ });
240
+ info('Payload project successfully initialized!');
241
+ p.note(successfulTanStackInit(), chalk.bgGreen(chalk.black(' TanStack Start initialized ')));
242
+ p.outro(feedbackOutro());
243
+ return;
244
+ }
171
245
  const templateArg = this.args['--template'];
172
246
  if (templateArg) {
173
247
  const valid = validateTemplate({
@@ -188,11 +262,7 @@ export class Main {
188
262
  helpMessage();
189
263
  process.exit(1);
190
264
  }
191
- const agentType = await selectAgent({
192
- cliArgs: this.args
193
- });
194
265
  await createProject({
195
- agentType,
196
266
  cliArgs: this.args,
197
267
  example,
198
268
  packageManager,
@@ -214,11 +284,7 @@ export class Main {
214
284
  switch(template.type){
215
285
  case 'plugin':
216
286
  {
217
- const agentType = await selectAgent({
218
- cliArgs: this.args
219
- });
220
287
  await createProject({
221
- agentType,
222
288
  cliArgs: this.args,
223
289
  packageManager,
224
290
  projectDir,
@@ -230,11 +296,7 @@ export class Main {
230
296
  case 'starter':
231
297
  {
232
298
  const dbDetails = await selectDb(this.args, projectName, template);
233
- const agentType = await selectAgent({
234
- cliArgs: this.args
235
- });
236
299
  await createProject({
237
- agentType,
238
300
  cliArgs: this.args,
239
301
  dbDetails,
240
302
  packageManager,
@@ -255,5 +317,33 @@ export class Main {
255
317
  }
256
318
  }
257
319
  }
320
+ export function resolveAppFramework({ nextAppDetails, tanStackDetection }) {
321
+ if (nextAppDetails.nextConfigPath && tanStackDetection.detected) {
322
+ return {
323
+ kind: 'ambiguous'
324
+ };
325
+ }
326
+ if (nextAppDetails.nextConfigPath) {
327
+ return {
328
+ appDetails: nextAppDetails,
329
+ kind: 'next'
330
+ };
331
+ }
332
+ if (!tanStackDetection.detected) {
333
+ return {
334
+ kind: 'none'
335
+ };
336
+ }
337
+ if (!tanStackDetection.compatible) {
338
+ return {
339
+ kind: 'unsupported-tanstack',
340
+ reason: tanStackDetection.reason
341
+ };
342
+ }
343
+ return {
344
+ appDetails: tanStackDetection.details,
345
+ kind: 'tanstack'
346
+ };
347
+ }
258
348
 
259
349
  //# sourceMappingURL=main.js.map