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.
- package/README.md +5 -0
- package/dist/commands.d.ts +4 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +5 -0
- package/dist/commands.js.map +1 -0
- package/dist/lib/agent-config.d.ts +15 -0
- package/dist/lib/agent-config.d.ts.map +1 -0
- package/dist/lib/agent-config.js +22 -0
- package/dist/lib/agent-config.js.map +1 -0
- package/dist/lib/agent-config.spec.js +23 -0
- package/dist/lib/agent-config.spec.js.map +1 -0
- package/dist/lib/ast/adapter-config.d.ts.map +1 -1
- package/dist/lib/ast/adapter-config.js +0 -10
- package/dist/lib/ast/adapter-config.js.map +1 -1
- package/dist/lib/ast/package-json.d.ts +9 -0
- package/dist/lib/ast/package-json.d.ts.map +1 -1
- package/dist/lib/ast/package-json.js +34 -8
- package/dist/lib/ast/package-json.js.map +1 -1
- package/dist/lib/ast/package-json.spec.js +73 -1
- package/dist/lib/ast/package-json.spec.js.map +1 -1
- package/dist/lib/ast/types.d.ts +2 -2
- package/dist/lib/ast/types.d.ts.map +1 -1
- package/dist/lib/ast/types.js +0 -1
- package/dist/lib/ast/types.js.map +1 -1
- package/dist/lib/configure-payload-tsconfig.d.ts +5 -0
- package/dist/lib/configure-payload-tsconfig.d.ts.map +1 -0
- package/dist/lib/configure-payload-tsconfig.js +26 -0
- package/dist/lib/configure-payload-tsconfig.js.map +1 -0
- package/dist/lib/configure-payload-tsconfig.spec.js +135 -0
- package/dist/lib/configure-payload-tsconfig.spec.js.map +1 -0
- package/dist/lib/configure-plugin-project.d.ts.map +1 -1
- package/dist/lib/create-project.d.ts +1 -2
- package/dist/lib/create-project.d.ts.map +1 -1
- package/dist/lib/create-project.js +5 -21
- package/dist/lib/create-project.js.map +1 -1
- package/dist/lib/create-project.spec.js +9 -0
- package/dist/lib/create-project.spec.js.map +1 -1
- package/dist/lib/generate-secret.js +1 -1
- package/dist/lib/generate-secret.js.map +1 -1
- package/dist/lib/init-next.d.ts.map +1 -1
- package/dist/lib/init-next.js +5 -34
- package/dist/lib/init-next.js.map +1 -1
- package/dist/lib/init-tanstack-default-template.spec.js +121 -0
- package/dist/lib/init-tanstack-default-template.spec.js.map +1 -0
- package/dist/lib/init-tanstack.d.ts +18 -0
- package/dist/lib/init-tanstack.d.ts.map +1 -0
- package/dist/lib/init-tanstack.js +150 -0
- package/dist/lib/init-tanstack.js.map +1 -0
- package/dist/lib/init-tanstack.spec.js +394 -0
- package/dist/lib/init-tanstack.spec.js.map +1 -0
- package/dist/lib/tanstack/detect.d.ts +5 -0
- package/dist/lib/tanstack/detect.d.ts.map +1 -0
- package/dist/lib/tanstack/detect.js +131 -0
- package/dist/lib/tanstack/detect.js.map +1 -0
- package/dist/lib/tanstack/detect.spec.js +227 -0
- package/dist/lib/tanstack/detect.spec.js.map +1 -0
- package/dist/lib/tanstack/prepare.d.ts +23 -0
- package/dist/lib/tanstack/prepare.d.ts.map +1 -0
- package/dist/lib/tanstack/prepare.js +114 -0
- package/dist/lib/tanstack/prepare.js.map +1 -0
- package/dist/lib/tanstack/prepare.spec.js +288 -0
- package/dist/lib/tanstack/prepare.spec.js.map +1 -0
- package/dist/lib/tanstack/template-files.d.ts +50 -0
- package/dist/lib/tanstack/template-files.d.ts.map +1 -0
- package/dist/lib/tanstack/template-files.js +64 -0
- package/dist/lib/tanstack/template-files.js.map +1 -0
- package/dist/lib/tanstack/transform-root-route.d.ts +7 -0
- package/dist/lib/tanstack/transform-root-route.d.ts.map +1 -0
- package/dist/lib/tanstack/transform-root-route.js +747 -0
- package/dist/lib/tanstack/transform-root-route.js.map +1 -0
- package/dist/lib/tanstack/transform-root-route.spec.js +484 -0
- package/dist/lib/tanstack/transform-root-route.spec.js.map +1 -0
- package/dist/lib/tanstack/transform-router.d.ts +5 -0
- package/dist/lib/tanstack/transform-router.d.ts.map +1 -0
- package/dist/lib/tanstack/transform-router.js +301 -0
- package/dist/lib/tanstack/transform-router.js.map +1 -0
- package/dist/lib/tanstack/transform-router.spec.js +264 -0
- package/dist/lib/tanstack/transform-router.spec.js.map +1 -0
- package/dist/lib/tanstack/transform-vite-config.d.ts +14 -0
- package/dist/lib/tanstack/transform-vite-config.d.ts.map +1 -0
- package/dist/lib/tanstack/transform-vite-config.js +576 -0
- package/dist/lib/tanstack/transform-vite-config.js.map +1 -0
- package/dist/lib/tanstack/transform-vite-config.spec.js +456 -0
- package/dist/lib/tanstack/transform-vite-config.spec.js.map +1 -0
- package/dist/lib/templates.d.ts.map +1 -1
- package/dist/lib/templates.js +6 -0
- package/dist/lib/templates.js.map +1 -1
- package/dist/lib/update-payload-in-project.d.ts +18 -3
- package/dist/lib/update-payload-in-project.d.ts.map +1 -1
- package/dist/lib/update-payload-in-project.js +98 -18
- package/dist/lib/update-payload-in-project.js.map +1 -1
- package/dist/lib/update-payload-in-project.spec.js +262 -0
- package/dist/lib/update-payload-in-project.spec.js.map +1 -0
- package/dist/lib/wrap-next-config.d.ts.map +1 -1
- package/dist/main.d.ts +20 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +120 -29
- package/dist/main.js.map +1 -1
- package/dist/main.spec.js +102 -0
- package/dist/main.spec.js.map +1 -0
- package/dist/scripts/pack-template-files.js +18 -0
- package/dist/scripts/pack-template-files.js.map +1 -1
- package/dist/template/src/app/(frontend)/styles.css +1 -1
- package/dist/template/src/app/(payload)/layout.tsx +8 -2
- package/dist/template-tanstack/routes/_payload/admin.$.tsx +8 -0
- package/dist/template-tanstack/routes/_payload/admin.index.tsx +8 -0
- package/dist/template-tanstack/routes/_payload/api.$.ts +10 -0
- package/dist/template-tanstack/routes/_payload/importMap.js +32 -0
- package/dist/template-tanstack/routes/_payload/server.functions.ts +49 -0
- package/dist/template-tanstack/routes/_payload.tsx +30 -0
- package/dist/template-tanstack/src/collections/Folders.ts +16 -0
- package/dist/template-tanstack/src/collections/Media.ts +20 -0
- package/dist/template-tanstack/src/collections/Tags.ts +16 -0
- package/dist/template-tanstack/src/collections/Users.ts +14 -0
- package/dist/template-tanstack/src/payload.config.ts +40 -0
- package/dist/template-tanstack/src/payload.css +1 -0
- package/dist/types.d.ts +22 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/casing.d.ts.map +1 -1
- package/dist/utils/log.d.ts.map +1 -1
- package/dist/utils/messages.d.ts +1 -0
- package/dist/utils/messages.d.ts.map +1 -1
- package/dist/utils/messages.js +8 -6
- package/dist/utils/messages.js.map +1 -1
- package/package.json +4 -4
- package/dist/lib/download-skill.d.ts +0 -8
- package/dist/lib/download-skill.d.ts.map +0 -1
- package/dist/lib/download-skill.js +0 -35
- package/dist/lib/download-skill.js.map +0 -1
- package/dist/lib/select-agent.d.ts +0 -16
- package/dist/lib/select-agent.d.ts.map +0 -1
- package/dist/lib/select-agent.js +0 -67
- package/dist/lib/select-agent.js.map +0 -1
- /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
|
-
|
|
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
|
|
98
|
+
if (!packageObj.dependencies && !packageObj.devDependencies) {
|
|
21
99
|
throw new Error('No package.json found in this project');
|
|
22
100
|
}
|
|
23
|
-
const
|
|
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 (
|
|
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
|
-
|
|
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((
|
|
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((
|
|
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
|
|
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
|
package/dist/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,
|
|
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"}
|