create-payload-app 4.0.0-internal.fa345ef → 4.0.0-internal.fec2230

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 (135) 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 +15 -0
  7. package/dist/lib/agent-config.d.ts.map +1 -0
  8. package/dist/lib/agent-config.js +22 -0
  9. package/dist/lib/agent-config.js.map +1 -0
  10. package/dist/lib/agent-config.spec.js +23 -0
  11. package/dist/lib/agent-config.spec.js.map +1 -0
  12. package/dist/lib/ast/adapter-config.d.ts.map +1 -1
  13. package/dist/lib/ast/adapter-config.js +0 -10
  14. package/dist/lib/ast/adapter-config.js.map +1 -1
  15. package/dist/lib/ast/package-json.d.ts +9 -0
  16. package/dist/lib/ast/package-json.d.ts.map +1 -1
  17. package/dist/lib/ast/package-json.js +34 -8
  18. package/dist/lib/ast/package-json.js.map +1 -1
  19. package/dist/lib/ast/package-json.spec.js +73 -1
  20. package/dist/lib/ast/package-json.spec.js.map +1 -1
  21. package/dist/lib/ast/types.d.ts +2 -2
  22. package/dist/lib/ast/types.d.ts.map +1 -1
  23. package/dist/lib/ast/types.js +0 -1
  24. package/dist/lib/ast/types.js.map +1 -1
  25. package/dist/lib/configure-payload-tsconfig.d.ts +5 -0
  26. package/dist/lib/configure-payload-tsconfig.d.ts.map +1 -0
  27. package/dist/lib/configure-payload-tsconfig.js +26 -0
  28. package/dist/lib/configure-payload-tsconfig.js.map +1 -0
  29. package/dist/lib/configure-payload-tsconfig.spec.js +135 -0
  30. package/dist/lib/configure-payload-tsconfig.spec.js.map +1 -0
  31. package/dist/lib/configure-plugin-project.d.ts.map +1 -1
  32. package/dist/lib/create-project.d.ts +1 -2
  33. package/dist/lib/create-project.d.ts.map +1 -1
  34. package/dist/lib/create-project.js +5 -21
  35. package/dist/lib/create-project.js.map +1 -1
  36. package/dist/lib/create-project.spec.js +9 -0
  37. package/dist/lib/create-project.spec.js.map +1 -1
  38. package/dist/lib/generate-secret.js +1 -1
  39. package/dist/lib/generate-secret.js.map +1 -1
  40. package/dist/lib/init-next.d.ts.map +1 -1
  41. package/dist/lib/init-next.js +5 -34
  42. package/dist/lib/init-next.js.map +1 -1
  43. package/dist/lib/init-tanstack-default-template.spec.js +121 -0
  44. package/dist/lib/init-tanstack-default-template.spec.js.map +1 -0
  45. package/dist/lib/init-tanstack.d.ts +18 -0
  46. package/dist/lib/init-tanstack.d.ts.map +1 -0
  47. package/dist/lib/init-tanstack.js +150 -0
  48. package/dist/lib/init-tanstack.js.map +1 -0
  49. package/dist/lib/init-tanstack.spec.js +394 -0
  50. package/dist/lib/init-tanstack.spec.js.map +1 -0
  51. package/dist/lib/tanstack/detect.d.ts +5 -0
  52. package/dist/lib/tanstack/detect.d.ts.map +1 -0
  53. package/dist/lib/tanstack/detect.js +131 -0
  54. package/dist/lib/tanstack/detect.js.map +1 -0
  55. package/dist/lib/tanstack/detect.spec.js +227 -0
  56. package/dist/lib/tanstack/detect.spec.js.map +1 -0
  57. package/dist/lib/tanstack/prepare.d.ts +23 -0
  58. package/dist/lib/tanstack/prepare.d.ts.map +1 -0
  59. package/dist/lib/tanstack/prepare.js +114 -0
  60. package/dist/lib/tanstack/prepare.js.map +1 -0
  61. package/dist/lib/tanstack/prepare.spec.js +288 -0
  62. package/dist/lib/tanstack/prepare.spec.js.map +1 -0
  63. package/dist/lib/tanstack/template-files.d.ts +50 -0
  64. package/dist/lib/tanstack/template-files.d.ts.map +1 -0
  65. package/dist/lib/tanstack/template-files.js +64 -0
  66. package/dist/lib/tanstack/template-files.js.map +1 -0
  67. package/dist/lib/tanstack/transform-root-route.d.ts +7 -0
  68. package/dist/lib/tanstack/transform-root-route.d.ts.map +1 -0
  69. package/dist/lib/tanstack/transform-root-route.js +747 -0
  70. package/dist/lib/tanstack/transform-root-route.js.map +1 -0
  71. package/dist/lib/tanstack/transform-root-route.spec.js +484 -0
  72. package/dist/lib/tanstack/transform-root-route.spec.js.map +1 -0
  73. package/dist/lib/tanstack/transform-router.d.ts +5 -0
  74. package/dist/lib/tanstack/transform-router.d.ts.map +1 -0
  75. package/dist/lib/tanstack/transform-router.js +301 -0
  76. package/dist/lib/tanstack/transform-router.js.map +1 -0
  77. package/dist/lib/tanstack/transform-router.spec.js +264 -0
  78. package/dist/lib/tanstack/transform-router.spec.js.map +1 -0
  79. package/dist/lib/tanstack/transform-vite-config.d.ts +14 -0
  80. package/dist/lib/tanstack/transform-vite-config.d.ts.map +1 -0
  81. package/dist/lib/tanstack/transform-vite-config.js +576 -0
  82. package/dist/lib/tanstack/transform-vite-config.js.map +1 -0
  83. package/dist/lib/tanstack/transform-vite-config.spec.js +456 -0
  84. package/dist/lib/tanstack/transform-vite-config.spec.js.map +1 -0
  85. package/dist/lib/templates.d.ts.map +1 -1
  86. package/dist/lib/templates.js +6 -0
  87. package/dist/lib/templates.js.map +1 -1
  88. package/dist/lib/update-payload-in-project.d.ts +18 -3
  89. package/dist/lib/update-payload-in-project.d.ts.map +1 -1
  90. package/dist/lib/update-payload-in-project.js +98 -18
  91. package/dist/lib/update-payload-in-project.js.map +1 -1
  92. package/dist/lib/update-payload-in-project.spec.js +262 -0
  93. package/dist/lib/update-payload-in-project.spec.js.map +1 -0
  94. package/dist/lib/wrap-next-config.d.ts.map +1 -1
  95. package/dist/main.d.ts +20 -1
  96. package/dist/main.d.ts.map +1 -1
  97. package/dist/main.js +120 -29
  98. package/dist/main.js.map +1 -1
  99. package/dist/main.spec.js +102 -0
  100. package/dist/main.spec.js.map +1 -0
  101. package/dist/scripts/pack-template-files.js +18 -0
  102. package/dist/scripts/pack-template-files.js.map +1 -1
  103. package/dist/template/src/app/(frontend)/styles.css +1 -1
  104. package/dist/template/src/app/(payload)/layout.tsx +8 -2
  105. package/dist/template-tanstack/routes/_payload/admin.$.tsx +8 -0
  106. package/dist/template-tanstack/routes/_payload/admin.index.tsx +8 -0
  107. package/dist/template-tanstack/routes/_payload/api.$.ts +10 -0
  108. package/dist/template-tanstack/routes/_payload/importMap.js +32 -0
  109. package/dist/template-tanstack/routes/_payload/server.functions.ts +49 -0
  110. package/dist/template-tanstack/routes/_payload.tsx +30 -0
  111. package/dist/template-tanstack/src/collections/Folders.ts +16 -0
  112. package/dist/template-tanstack/src/collections/Media.ts +20 -0
  113. package/dist/template-tanstack/src/collections/Tags.ts +16 -0
  114. package/dist/template-tanstack/src/collections/Users.ts +14 -0
  115. package/dist/template-tanstack/src/payload.config.ts +40 -0
  116. package/dist/template-tanstack/src/payload.css +1 -0
  117. package/dist/types.d.ts +22 -3
  118. package/dist/types.d.ts.map +1 -1
  119. package/dist/types.js.map +1 -1
  120. package/dist/utils/casing.d.ts.map +1 -1
  121. package/dist/utils/log.d.ts.map +1 -1
  122. package/dist/utils/messages.d.ts +1 -0
  123. package/dist/utils/messages.d.ts.map +1 -1
  124. package/dist/utils/messages.js +8 -6
  125. package/dist/utils/messages.js.map +1 -1
  126. package/package.json +4 -4
  127. package/dist/lib/download-skill.d.ts +0 -8
  128. package/dist/lib/download-skill.d.ts.map +0 -1
  129. package/dist/lib/download-skill.js +0 -35
  130. package/dist/lib/download-skill.js.map +0 -1
  131. package/dist/lib/select-agent.d.ts +0 -16
  132. package/dist/lib/select-agent.d.ts.map +0 -1
  133. package/dist/lib/select-agent.js +0 -67
  134. package/dist/lib/select-agent.js.map +0 -1
  135. /package/dist/template/src/app/(payload)/{custom.scss → custom.css} +0 -0
@@ -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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"}
@@ -0,0 +1,262 @@
1
+ import fse from 'fs-extra';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
6
+ import { updatePayloadInNextProject, updatePayloadInTanStackProject, updatePayloadPackages } from './update-payload-in-project.js';
7
+ const dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ const mocks = vi.hoisted(()=>({
9
+ getPackageManager: vi.fn(),
10
+ installPackages: vi.fn(),
11
+ resolvePackageVersion: vi.fn()
12
+ }));
13
+ vi.mock('../utils/resolvePackageVersion.js', async (importOriginal)=>({
14
+ ...await importOriginal(),
15
+ resolvePackageVersion: mocks.resolvePackageVersion
16
+ }));
17
+ vi.mock('./get-package-manager.js', ()=>({
18
+ getPackageManager: mocks.getPackageManager
19
+ }));
20
+ vi.mock('./install-packages.js', ()=>({
21
+ installPackages: mocks.installPackages
22
+ }));
23
+ describe('Payload project updates', ()=>{
24
+ let projectDir;
25
+ let templateRoot;
26
+ beforeEach(()=>{
27
+ vi.clearAllMocks();
28
+ projectDir = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-update-project-'));
29
+ templateRoot = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-update-template-'));
30
+ mocks.getPackageManager.mockResolvedValue('pnpm');
31
+ mocks.installPackages.mockResolvedValue({
32
+ success: true
33
+ });
34
+ mocks.resolvePackageVersion.mockResolvedValue('4.2.0');
35
+ });
36
+ afterEach(()=>{
37
+ fse.removeSync(projectDir);
38
+ fse.removeSync(templateRoot);
39
+ });
40
+ it('should update every installed Payload dependency to one version without a Next config', async ()=>{
41
+ fse.writeJsonSync(path.join(projectDir, 'package.json'), {
42
+ dependencies: {
43
+ '@payloadcms/db-mongodb': '^3.0.0',
44
+ '@payloadcms/richtext-lexical': '^3.0.0',
45
+ payload: '^3.0.0',
46
+ react: '^19.0.0'
47
+ }
48
+ });
49
+ const result = await updatePayloadPackages({
50
+ projectDir,
51
+ versionOrTag: 'beta'
52
+ });
53
+ expect(result).toEqual({
54
+ message: 'Payload updated successfully.',
55
+ success: true
56
+ });
57
+ expect(mocks.resolvePackageVersion).toHaveBeenCalledOnce();
58
+ expect(mocks.resolvePackageVersion).toHaveBeenCalledWith({
59
+ packageName: 'payload',
60
+ versionOrTag: 'beta'
61
+ });
62
+ expect(mocks.installPackages).toHaveBeenCalledWith({
63
+ packageManager: 'pnpm',
64
+ packagesToInstall: [
65
+ 'payload@4.2.0',
66
+ '@payloadcms/db-mongodb@4.2.0',
67
+ '@payloadcms/richtext-lexical@4.2.0'
68
+ ],
69
+ projectDir
70
+ });
71
+ });
72
+ it('should update a stale Payload package when payload is already at the target version', async ()=>{
73
+ fse.writeJsonSync(path.join(projectDir, 'package.json'), {
74
+ dependencies: {
75
+ '@payloadcms/ui': '4.1.0',
76
+ payload: '4.2.0'
77
+ }
78
+ });
79
+ const result = await updatePayloadPackages({
80
+ projectDir,
81
+ versionOrTag: 'beta'
82
+ });
83
+ expect(result).toEqual({
84
+ message: 'Payload updated successfully.',
85
+ success: true
86
+ });
87
+ expect(mocks.installPackages).toHaveBeenCalledWith({
88
+ packageManager: 'pnpm',
89
+ packagesToInstall: [
90
+ 'payload@4.2.0',
91
+ '@payloadcms/ui@4.2.0'
92
+ ],
93
+ projectDir
94
+ });
95
+ });
96
+ it('should update Payload packages installed as development dependencies', async ()=>{
97
+ fse.writeJsonSync(path.join(projectDir, 'package.json'), {
98
+ dependencies: {
99
+ '@payloadcms/ui': '4.1.0',
100
+ payload: '4.1.0'
101
+ },
102
+ devDependencies: {
103
+ '@payloadcms/graphql': '4.1.0',
104
+ vitest: '^4.0.0'
105
+ }
106
+ });
107
+ const result = await updatePayloadPackages({
108
+ projectDir,
109
+ versionOrTag: 'beta'
110
+ });
111
+ expect(result).toEqual({
112
+ message: 'Payload updated successfully.',
113
+ success: true
114
+ });
115
+ expect(mocks.installPackages).toHaveBeenCalledWith({
116
+ packageManager: 'pnpm',
117
+ packagesToInstall: [
118
+ 'payload@4.2.0',
119
+ '@payloadcms/ui@4.2.0',
120
+ '@payloadcms/graphql@4.2.0'
121
+ ],
122
+ projectDir
123
+ });
124
+ });
125
+ it('should refresh Next Payload routes without overwriting custom CSS', async ()=>{
126
+ writeProjectPackage(projectDir);
127
+ const nextConfigPath = path.join(projectDir, 'next.config.ts');
128
+ const payloadDir = path.join(projectDir, 'src/app/(payload)');
129
+ const importMapPath = path.join(payloadDir, 'admin/importMap.js');
130
+ const customCssPath = path.join(payloadDir, 'custom.css');
131
+ const sourceImportMapPath = path.resolve(dirname, '../../../../templates/blank/src/app/(payload)/admin/importMap.js');
132
+ fse.outputFileSync(importMapPath, 'stale import map\n');
133
+ fse.outputFileSync(customCssPath, '.custom { color: rebeccapurple; }\n');
134
+ const appDetails = {
135
+ hasTopLevelLayout: false,
136
+ isPayloadInstalled: true,
137
+ isSrcDir: true,
138
+ isSupportedNextVersion: true,
139
+ nextConfigPath,
140
+ nextVersion: '15.0.0'
141
+ };
142
+ const result = await updatePayloadInNextProject({
143
+ appDetails,
144
+ versionOrTag: 'beta'
145
+ });
146
+ expect(result).toEqual({
147
+ message: 'Payload updated successfully.',
148
+ success: true
149
+ });
150
+ expect(fse.readFileSync(importMapPath, 'utf8')).toBe(fse.readFileSync(sourceImportMapPath, 'utf8'));
151
+ expect(fse.readFileSync(customCssPath, 'utf8')).toBe('.custom { color: rebeccapurple; }\n');
152
+ });
153
+ it('should refresh Payload-owned TanStack files without overwriting custom styles', async ()=>{
154
+ writeProjectPackage(projectDir);
155
+ writeFiles({
156
+ files: {
157
+ 'routes/_payload.tsx': 'fresh payload layout\n',
158
+ 'routes/_payload/admin.$.tsx': 'fresh admin splat\n',
159
+ 'routes/_payload/admin.index.tsx': 'fresh admin index\n',
160
+ 'routes/_payload/api.$.ts': 'fresh API route\n',
161
+ 'routes/_payload/importMap.js': 'fresh import map\n',
162
+ 'routes/_payload/server.functions.ts': 'fresh server functions\n',
163
+ 'src/payload.css': 'template Payload route CSS\n',
164
+ 'src/payload.config.ts': 'template Payload config\n'
165
+ },
166
+ root: templateRoot
167
+ });
168
+ writeFiles({
169
+ files: {
170
+ 'src/router.tsx': 'custom router\n',
171
+ 'src/routes/__root.tsx': 'custom root route\n',
172
+ 'src/routes/_frontend.tsx': 'custom frontend layout\n',
173
+ 'src/routes/_frontend/index.tsx': 'custom frontend route\n',
174
+ 'src/routes/_payload.tsx': 'stale payload layout\n',
175
+ 'src/routes/_payload/admin.$.tsx': 'stale admin splat\n',
176
+ 'src/routes/_payload/admin.index.tsx': 'stale admin index\n',
177
+ 'src/routes/_payload/api.$.ts': 'stale API route\n',
178
+ 'src/routes/_payload/importMap.js': 'stale import map\n',
179
+ 'src/routes/_payload/server.functions.ts': 'stale server functions\n',
180
+ 'src/payload.css': 'custom Payload CSS\n',
181
+ 'src/styles.css': 'custom frontend CSS\n',
182
+ 'vite.config.ts': 'custom Vite config\n'
183
+ },
184
+ root: projectDir
185
+ });
186
+ const appDetails = {
187
+ isPayloadInstalled: true,
188
+ kind: 'start',
189
+ projectDir,
190
+ rootRoutePath: path.join(projectDir, 'src/routes/__root.tsx'),
191
+ routerPath: path.join(projectDir, 'src/router.tsx'),
192
+ routesDir: path.join(projectDir, 'src/routes'),
193
+ sourceDir: path.join(projectDir, 'src'),
194
+ viteConfigPath: path.join(projectDir, 'vite.config.ts')
195
+ };
196
+ const preservedFiles = [
197
+ appDetails.viteConfigPath,
198
+ appDetails.routerPath,
199
+ appDetails.rootRoutePath,
200
+ path.join(appDetails.routesDir, '_frontend.tsx'),
201
+ path.join(appDetails.routesDir, '_frontend/index.tsx'),
202
+ path.join(appDetails.sourceDir, 'payload.css'),
203
+ path.join(appDetails.sourceDir, 'styles.css')
204
+ ];
205
+ const before = new Map(preservedFiles.map((filePath)=>[
206
+ filePath,
207
+ fse.readFileSync(filePath, 'utf8')
208
+ ]));
209
+ const result = await updatePayloadInTanStackProject({
210
+ appDetails,
211
+ templateRoot,
212
+ versionOrTag: 'beta'
213
+ });
214
+ expect(result).toEqual({
215
+ message: 'Payload updated successfully.',
216
+ success: true
217
+ });
218
+ expect(fse.readFileSync(path.join(appDetails.routesDir, '_payload.tsx'), 'utf8')).toBe('fresh payload layout\n');
219
+ expect(fse.readFileSync(path.join(appDetails.routesDir, '_payload/server.functions.ts'), 'utf8')).toBe('fresh server functions\n');
220
+ for (const [filePath, content] of before){
221
+ expect(fse.readFileSync(filePath, 'utf8')).toBe(content);
222
+ }
223
+ });
224
+ it('should refresh TanStack routes from the source template by default', async ()=>{
225
+ writeProjectPackage(projectDir);
226
+ const payloadLayoutPath = path.join(projectDir, 'src/routes/_payload.tsx');
227
+ const sourcePayloadLayoutPath = path.resolve(dirname, '../../../../templates/blank-tanstack/src/app/_payload.tsx');
228
+ const sourcePayloadStylesPath = path.resolve(dirname, '../../../../templates/blank-tanstack/src/payload.css');
229
+ fse.outputFileSync(payloadLayoutPath, 'stale payload layout\n');
230
+ const appDetails = {
231
+ isPayloadInstalled: true,
232
+ kind: 'start',
233
+ projectDir,
234
+ rootRoutePath: path.join(projectDir, 'src/routes/__root.tsx'),
235
+ routerPath: path.join(projectDir, 'src/router.tsx'),
236
+ routesDir: path.join(projectDir, 'src/routes'),
237
+ sourceDir: path.join(projectDir, 'src'),
238
+ viteConfigPath: path.join(projectDir, 'vite.config.ts')
239
+ };
240
+ await updatePayloadInTanStackProject({
241
+ appDetails,
242
+ versionOrTag: 'beta'
243
+ });
244
+ expect(fse.readFileSync(payloadLayoutPath, 'utf8')).toBe(fse.readFileSync(sourcePayloadLayoutPath, 'utf8'));
245
+ expect(fse.readFileSync(path.join(appDetails.sourceDir, 'payload.css'), 'utf8')).toBe(fse.readFileSync(sourcePayloadStylesPath, 'utf8'));
246
+ });
247
+ });
248
+ function writeFiles({ files, root }) {
249
+ for (const [relativePath, content] of Object.entries(files)){
250
+ fse.outputFileSync(path.join(root, relativePath), content);
251
+ }
252
+ }
253
+ function writeProjectPackage(projectDir) {
254
+ fse.writeJsonSync(path.join(projectDir, 'package.json'), {
255
+ dependencies: {
256
+ '@payloadcms/ui': '^3.0.0',
257
+ payload: '^3.0.0'
258
+ }
259
+ });
260
+ }
261
+
262
+ //# sourceMappingURL=update-payload-in-project.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/update-payload-in-project.spec.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport type { NextAppDetails, TanStackAppDetails } from '../types.js'\n\nimport {\n updatePayloadInNextProject,\n updatePayloadInTanStackProject,\n updatePayloadPackages,\n} from './update-payload-in-project.js'\n\nconst dirname = path.dirname(fileURLToPath(import.meta.url))\n\nconst mocks = vi.hoisted(() => ({\n getPackageManager: vi.fn(),\n installPackages: vi.fn(),\n resolvePackageVersion: vi.fn(),\n}))\n\nvi.mock('../utils/resolvePackageVersion.js', async (importOriginal) => ({\n ...(await importOriginal()),\n resolvePackageVersion: mocks.resolvePackageVersion,\n}))\n\nvi.mock('./get-package-manager.js', () => ({\n getPackageManager: mocks.getPackageManager,\n}))\n\nvi.mock('./install-packages.js', () => ({\n installPackages: mocks.installPackages,\n}))\n\ndescribe('Payload project updates', () => {\n let projectDir: string\n let templateRoot: string\n\n beforeEach(() => {\n vi.clearAllMocks()\n projectDir = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-update-project-'))\n templateRoot = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-update-template-'))\n mocks.getPackageManager.mockResolvedValue('pnpm')\n mocks.installPackages.mockResolvedValue({ success: true })\n mocks.resolvePackageVersion.mockResolvedValue('4.2.0')\n })\n\n afterEach(() => {\n fse.removeSync(projectDir)\n fse.removeSync(templateRoot)\n })\n\n it('should update every installed Payload dependency to one version without a Next config', async () => {\n fse.writeJsonSync(path.join(projectDir, 'package.json'), {\n dependencies: {\n '@payloadcms/db-mongodb': '^3.0.0',\n '@payloadcms/richtext-lexical': '^3.0.0',\n payload: '^3.0.0',\n react: '^19.0.0',\n },\n })\n\n const result = await updatePayloadPackages({ projectDir, versionOrTag: 'beta' })\n\n expect(result).toEqual({ message: 'Payload updated successfully.', success: true })\n expect(mocks.resolvePackageVersion).toHaveBeenCalledOnce()\n expect(mocks.resolvePackageVersion).toHaveBeenCalledWith({\n packageName: 'payload',\n versionOrTag: 'beta',\n })\n expect(mocks.installPackages).toHaveBeenCalledWith({\n packageManager: 'pnpm',\n packagesToInstall: [\n 'payload@4.2.0',\n '@payloadcms/db-mongodb@4.2.0',\n '@payloadcms/richtext-lexical@4.2.0',\n ],\n projectDir,\n })\n })\n\n it('should update a stale Payload package when payload is already at the target version', async () => {\n fse.writeJsonSync(path.join(projectDir, 'package.json'), {\n dependencies: {\n '@payloadcms/ui': '4.1.0',\n payload: '4.2.0',\n },\n })\n\n const result = await updatePayloadPackages({ projectDir, versionOrTag: 'beta' })\n\n expect(result).toEqual({ message: 'Payload updated successfully.', success: true })\n expect(mocks.installPackages).toHaveBeenCalledWith({\n packageManager: 'pnpm',\n packagesToInstall: ['payload@4.2.0', '@payloadcms/ui@4.2.0'],\n projectDir,\n })\n })\n\n it('should update Payload packages installed as development dependencies', async () => {\n fse.writeJsonSync(path.join(projectDir, 'package.json'), {\n dependencies: {\n '@payloadcms/ui': '4.1.0',\n payload: '4.1.0',\n },\n devDependencies: {\n '@payloadcms/graphql': '4.1.0',\n vitest: '^4.0.0',\n },\n })\n\n const result = await updatePayloadPackages({ projectDir, versionOrTag: 'beta' })\n\n expect(result).toEqual({ message: 'Payload updated successfully.', success: true })\n expect(mocks.installPackages).toHaveBeenCalledWith({\n packageManager: 'pnpm',\n packagesToInstall: ['payload@4.2.0', '@payloadcms/ui@4.2.0', '@payloadcms/graphql@4.2.0'],\n projectDir,\n })\n })\n\n it('should refresh Next Payload routes without overwriting custom CSS', async () => {\n writeProjectPackage(projectDir)\n const nextConfigPath = path.join(projectDir, 'next.config.ts')\n const payloadDir = path.join(projectDir, 'src/app/(payload)')\n const importMapPath = path.join(payloadDir, 'admin/importMap.js')\n const customCssPath = path.join(payloadDir, 'custom.css')\n const sourceImportMapPath = path.resolve(\n dirname,\n '../../../../templates/blank/src/app/(payload)/admin/importMap.js',\n )\n fse.outputFileSync(importMapPath, 'stale import map\\n')\n fse.outputFileSync(customCssPath, '.custom { color: rebeccapurple; }\\n')\n\n const appDetails: NextAppDetails = {\n hasTopLevelLayout: false,\n isPayloadInstalled: true,\n isSrcDir: true,\n isSupportedNextVersion: true,\n nextConfigPath,\n nextVersion: '15.0.0',\n }\n\n const result = await updatePayloadInNextProject({ appDetails, versionOrTag: 'beta' })\n\n expect(result).toEqual({ message: 'Payload updated successfully.', success: true })\n expect(fse.readFileSync(importMapPath, 'utf8')).toBe(\n fse.readFileSync(sourceImportMapPath, 'utf8'),\n )\n expect(fse.readFileSync(customCssPath, 'utf8')).toBe('.custom { color: rebeccapurple; }\\n')\n })\n\n it('should refresh Payload-owned TanStack files without overwriting custom styles', async () => {\n writeProjectPackage(projectDir)\n writeFiles({\n files: {\n 'routes/_payload.tsx': 'fresh payload layout\\n',\n 'routes/_payload/admin.$.tsx': 'fresh admin splat\\n',\n 'routes/_payload/admin.index.tsx': 'fresh admin index\\n',\n 'routes/_payload/api.$.ts': 'fresh API route\\n',\n 'routes/_payload/importMap.js': 'fresh import map\\n',\n 'routes/_payload/server.functions.ts': 'fresh server functions\\n',\n 'src/payload.css': 'template Payload route CSS\\n',\n 'src/payload.config.ts': 'template Payload config\\n',\n },\n root: templateRoot,\n })\n writeFiles({\n files: {\n 'src/router.tsx': 'custom router\\n',\n 'src/routes/__root.tsx': 'custom root route\\n',\n 'src/routes/_frontend.tsx': 'custom frontend layout\\n',\n 'src/routes/_frontend/index.tsx': 'custom frontend route\\n',\n 'src/routes/_payload.tsx': 'stale payload layout\\n',\n 'src/routes/_payload/admin.$.tsx': 'stale admin splat\\n',\n 'src/routes/_payload/admin.index.tsx': 'stale admin index\\n',\n 'src/routes/_payload/api.$.ts': 'stale API route\\n',\n 'src/routes/_payload/importMap.js': 'stale import map\\n',\n 'src/routes/_payload/server.functions.ts': 'stale server functions\\n',\n 'src/payload.css': 'custom Payload CSS\\n',\n 'src/styles.css': 'custom frontend CSS\\n',\n 'vite.config.ts': 'custom Vite config\\n',\n },\n root: projectDir,\n })\n\n const appDetails: TanStackAppDetails = {\n isPayloadInstalled: true,\n kind: 'start',\n projectDir,\n rootRoutePath: path.join(projectDir, 'src/routes/__root.tsx'),\n routerPath: path.join(projectDir, 'src/router.tsx'),\n routesDir: path.join(projectDir, 'src/routes'),\n sourceDir: path.join(projectDir, 'src'),\n viteConfigPath: path.join(projectDir, 'vite.config.ts'),\n }\n\n const preservedFiles = [\n appDetails.viteConfigPath,\n appDetails.routerPath,\n appDetails.rootRoutePath,\n path.join(appDetails.routesDir, '_frontend.tsx'),\n path.join(appDetails.routesDir, '_frontend/index.tsx'),\n path.join(appDetails.sourceDir, 'payload.css'),\n path.join(appDetails.sourceDir, 'styles.css'),\n ]\n const before = new Map(\n preservedFiles.map((filePath) => [filePath, fse.readFileSync(filePath, 'utf8')]),\n )\n\n const result = await updatePayloadInTanStackProject({\n appDetails,\n templateRoot,\n versionOrTag: 'beta',\n })\n\n expect(result).toEqual({ message: 'Payload updated successfully.', success: true })\n expect(fse.readFileSync(path.join(appDetails.routesDir, '_payload.tsx'), 'utf8')).toBe(\n 'fresh payload layout\\n',\n )\n expect(\n fse.readFileSync(path.join(appDetails.routesDir, '_payload/server.functions.ts'), 'utf8'),\n ).toBe('fresh server functions\\n')\n for (const [filePath, content] of before) {\n expect(fse.readFileSync(filePath, 'utf8')).toBe(content)\n }\n })\n\n it('should refresh TanStack routes from the source template by default', async () => {\n writeProjectPackage(projectDir)\n const payloadLayoutPath = path.join(projectDir, 'src/routes/_payload.tsx')\n const sourcePayloadLayoutPath = path.resolve(\n dirname,\n '../../../../templates/blank-tanstack/src/app/_payload.tsx',\n )\n const sourcePayloadStylesPath = path.resolve(\n dirname,\n '../../../../templates/blank-tanstack/src/payload.css',\n )\n fse.outputFileSync(payloadLayoutPath, 'stale payload layout\\n')\n\n const appDetails: TanStackAppDetails = {\n isPayloadInstalled: true,\n kind: 'start',\n projectDir,\n rootRoutePath: path.join(projectDir, 'src/routes/__root.tsx'),\n routerPath: path.join(projectDir, 'src/router.tsx'),\n routesDir: path.join(projectDir, 'src/routes'),\n sourceDir: path.join(projectDir, 'src'),\n viteConfigPath: path.join(projectDir, 'vite.config.ts'),\n }\n\n await updatePayloadInTanStackProject({ appDetails, versionOrTag: 'beta' })\n\n expect(fse.readFileSync(payloadLayoutPath, 'utf8')).toBe(\n fse.readFileSync(sourcePayloadLayoutPath, 'utf8'),\n )\n expect(fse.readFileSync(path.join(appDetails.sourceDir, 'payload.css'), 'utf8')).toBe(\n fse.readFileSync(sourcePayloadStylesPath, 'utf8'),\n )\n })\n})\n\nfunction writeFiles({ files, root }: { files: Record<string, string>; root: string }): void {\n for (const [relativePath, content] of Object.entries(files)) {\n fse.outputFileSync(path.join(root, relativePath), content)\n }\n}\n\nfunction writeProjectPackage(projectDir: string): void {\n fse.writeJsonSync(path.join(projectDir, 'package.json'), {\n dependencies: {\n '@payloadcms/ui': '^3.0.0',\n payload: '^3.0.0',\n },\n })\n}\n"],"names":["fse","os","path","fileURLToPath","afterEach","beforeEach","describe","expect","it","vi","updatePayloadInNextProject","updatePayloadInTanStackProject","updatePayloadPackages","dirname","url","mocks","hoisted","getPackageManager","fn","installPackages","resolvePackageVersion","mock","importOriginal","projectDir","templateRoot","clearAllMocks","mkdtempSync","join","tmpdir","mockResolvedValue","success","removeSync","writeJsonSync","dependencies","payload","react","result","versionOrTag","toEqual","message","toHaveBeenCalledOnce","toHaveBeenCalledWith","packageName","packageManager","packagesToInstall","devDependencies","vitest","writeProjectPackage","nextConfigPath","payloadDir","importMapPath","customCssPath","sourceImportMapPath","resolve","outputFileSync","appDetails","hasTopLevelLayout","isPayloadInstalled","isSrcDir","isSupportedNextVersion","nextVersion","readFileSync","toBe","writeFiles","files","root","kind","rootRoutePath","routerPath","routesDir","sourceDir","viteConfigPath","preservedFiles","before","Map","map","filePath","content","payloadLayoutPath","sourcePayloadLayoutPath","sourcePayloadStylesPath","relativePath","Object","entries"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"wrap-next-config.d.ts","sourceRoot":"","sources":["../../src/lib/wrap-next-config.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAIjD,eAAO,MAAM,oBAAoB;;;;CAIhC,CAAA;AAED,eAAO,MAAM,cAAc,GAAU,MAAM;IACzC,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,cAAc,CAAA;CAC/B,kBAaA,CAAA;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC;IAAE,qBAAqB,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA4H9D"}
1
+ {"version":3,"file":"wrap-next-config.d.ts","sourceRoot":"","sources":["../../src/lib/wrap-next-config.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAIjD,eAAO,MAAM,oBAAoB;IAC/B,GAAG;IACH,GAAG;IACH,EAAE;CACH,CAAA;AAED,eAAO,MAAM,cAAc,SAAgB;IACzC,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,cAAc,CAAA;CAC/B,kBAaA,CAAA;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC;IAAE,qBAAqB,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA4H9D"}
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;;IAoDP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA+N5B"}
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,cA+CC;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"}