create-payload-app 4.0.0-internal.af6aad0 → 4.0.0-internal.b8a92d2

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 (69) hide show
  1. package/dist/lib/agent-config.d.ts +2 -5
  2. package/dist/lib/agent-config.d.ts.map +1 -1
  3. package/dist/lib/agent-config.js +1 -8
  4. package/dist/lib/agent-config.js.map +1 -1
  5. package/dist/lib/create-project.d.ts.map +1 -1
  6. package/dist/lib/create-project.js +51 -8
  7. package/dist/lib/create-project.js.map +1 -1
  8. package/dist/lib/get-package-manager.d.ts +9 -0
  9. package/dist/lib/get-package-manager.d.ts.map +1 -1
  10. package/dist/lib/get-package-manager.js +20 -0
  11. package/dist/lib/get-package-manager.js.map +1 -1
  12. package/dist/lib/tanstack/template-files.d.ts +2 -2
  13. package/dist/lib/tanstack/template-files.d.ts.map +1 -1
  14. package/dist/lib/tanstack/template-files.js +2 -2
  15. package/dist/lib/tanstack/template-files.js.map +1 -1
  16. package/dist/lib/update-payload-in-project.d.ts.map +1 -1
  17. package/dist/lib/update-payload-in-project.js +7 -2
  18. package/dist/lib/update-payload-in-project.js.map +1 -1
  19. package/dist/main.d.ts.map +1 -1
  20. package/dist/main.js +0 -1
  21. package/dist/main.js.map +1 -1
  22. package/dist/template/src/app/(frontend)/styles.css +7 -0
  23. package/dist/template/src/app/(payload)/admin/importMap.js +17 -0
  24. package/dist/template/src/payload-types.ts +72 -1
  25. package/dist/template/src/payload.config.ts +8 -0
  26. package/dist/template-tanstack/routes/_payload.tsx +22 -5
  27. package/dist/template-tanstack/src/payload.css +1 -0
  28. package/dist/utils/messages.js +1 -1
  29. package/dist/utils/messages.js.map +1 -1
  30. package/package.json +2 -2
  31. package/dist/ast-integration.spec.js +0 -132
  32. package/dist/ast-integration.spec.js.map +0 -1
  33. package/dist/lib/agent-config.spec.js +0 -23
  34. package/dist/lib/agent-config.spec.js.map +0 -1
  35. package/dist/lib/ast/package-json.spec.js +0 -139
  36. package/dist/lib/ast/package-json.spec.js.map +0 -1
  37. package/dist/lib/ast/payload-config.spec.js +0 -365
  38. package/dist/lib/ast/payload-config.spec.js.map +0 -1
  39. package/dist/lib/ast/utils.spec.js +0 -226
  40. package/dist/lib/ast/utils.spec.js.map +0 -1
  41. package/dist/lib/configure-payload-tsconfig.spec.js +0 -135
  42. package/dist/lib/configure-payload-tsconfig.spec.js.map +0 -1
  43. package/dist/lib/create-project.spec.js +0 -199
  44. package/dist/lib/create-project.spec.js.map +0 -1
  45. package/dist/lib/init-tanstack-default-template.spec.js +0 -119
  46. package/dist/lib/init-tanstack-default-template.spec.js.map +0 -1
  47. package/dist/lib/init-tanstack.spec.js +0 -394
  48. package/dist/lib/init-tanstack.spec.js.map +0 -1
  49. package/dist/lib/manage-env-files.spec.js +0 -118
  50. package/dist/lib/manage-env-files.spec.js.map +0 -1
  51. package/dist/lib/tanstack/detect.spec.js +0 -227
  52. package/dist/lib/tanstack/detect.spec.js.map +0 -1
  53. package/dist/lib/tanstack/prepare.spec.js +0 -288
  54. package/dist/lib/tanstack/prepare.spec.js.map +0 -1
  55. package/dist/lib/tanstack/transform-root-route.spec.js +0 -484
  56. package/dist/lib/tanstack/transform-root-route.spec.js.map +0 -1
  57. package/dist/lib/tanstack/transform-router.spec.js +0 -264
  58. package/dist/lib/tanstack/transform-router.spec.js.map +0 -1
  59. package/dist/lib/tanstack/transform-vite-config.spec.js +0 -456
  60. package/dist/lib/tanstack/transform-vite-config.spec.js.map +0 -1
  61. package/dist/lib/update-payload-in-project.spec.js +0 -258
  62. package/dist/lib/update-payload-in-project.spec.js.map +0 -1
  63. package/dist/lib/wrap-next-config.spec.js +0 -167
  64. package/dist/lib/wrap-next-config.spec.js.map +0 -1
  65. package/dist/main.spec.js +0 -102
  66. package/dist/main.spec.js.map +0 -1
  67. package/dist/template-tanstack/src/payload-foundation.css +0 -10
  68. package/dist/utils/resolvePackageVersion.spec.js +0 -77
  69. package/dist/utils/resolvePackageVersion.spec.js.map +0 -1
@@ -1,394 +0,0 @@
1
- import fse from 'fs-extra';
2
- import os from 'node:os';
3
- import path from 'node:path';
4
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
5
- import { initTanStack } from './init-tanstack.js';
6
- const mocks = vi.hoisted(()=>({
7
- applyPreparedWrites: vi.fn(),
8
- configurePayloadTsConfig: vi.fn(),
9
- ensurePnpmBuildApprovals: vi.fn(),
10
- getTanStackAppDetails: vi.fn(),
11
- installPackages: vi.fn(),
12
- prepareTanStackInit: vi.fn(),
13
- resolvePackageVersion: vi.fn()
14
- }));
15
- vi.mock('../utils/resolvePackageVersion.js', async (importOriginal)=>({
16
- ...await importOriginal(),
17
- resolvePackageVersion: mocks.resolvePackageVersion
18
- }));
19
- vi.mock('./configure-payload-tsconfig.js', ()=>({
20
- configurePayloadTsConfig: mocks.configurePayloadTsConfig
21
- }));
22
- vi.mock('./configure-pnpm-builds.js', ()=>({
23
- ensurePnpmBuildApprovals: mocks.ensurePnpmBuildApprovals
24
- }));
25
- vi.mock('./install-packages.js', ()=>({
26
- installPackages: mocks.installPackages
27
- }));
28
- vi.mock('./tanstack/detect.js', ()=>({
29
- getTanStackAppDetails: mocks.getTanStackAppDetails
30
- }));
31
- vi.mock('./tanstack/prepare.js', ()=>({
32
- applyPreparedWrites: mocks.applyPreparedWrites,
33
- prepareTanStackInit: mocks.prepareTanStackInit
34
- }));
35
- describe('initTanStack', ()=>{
36
- const templateRoot = '/tmp/tanstack-template';
37
- let appDetails;
38
- let preparedWrites;
39
- let projectDir;
40
- beforeEach(()=>{
41
- vi.clearAllMocks();
42
- projectDir = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-init-tanstack-'));
43
- appDetails = createAppDetails({
44
- kind: 'start',
45
- projectDir
46
- });
47
- preparedWrites = [
48
- {
49
- content: 'export default {}\n',
50
- filePath: path.join(projectDir, 'src/payload.config.ts')
51
- }
52
- ];
53
- mocks.prepareTanStackInit.mockResolvedValue({
54
- success: true,
55
- writes: preparedWrites
56
- });
57
- mocks.applyPreparedWrites.mockResolvedValue(undefined);
58
- mocks.ensurePnpmBuildApprovals.mockResolvedValue(undefined);
59
- mocks.installPackages.mockResolvedValue({
60
- success: true
61
- });
62
- mocks.configurePayloadTsConfig.mockResolvedValue(undefined);
63
- mocks.resolvePackageVersion.mockResolvedValue('4.2.0');
64
- mocks.getTanStackAppDetails.mockResolvedValue({
65
- compatible: true,
66
- details: appDetails,
67
- detected: true
68
- });
69
- });
70
- afterEach(()=>{
71
- fse.removeSync(projectDir);
72
- });
73
- it('should prepare, apply, install, and configure in order', async ()=>{
74
- const result = await initTanStack({
75
- '--debug': true,
76
- '--payload-version': 'beta',
77
- appDetails,
78
- dbType: 'mongodb',
79
- packageManager: 'pnpm',
80
- projectDir,
81
- templateRoot
82
- });
83
- expect(result).toEqual({
84
- payloadConfigPath: path.join(projectDir, 'src/payload.config.ts'),
85
- success: true
86
- });
87
- expect(mocks.prepareTanStackInit).toHaveBeenCalledWith({
88
- appDetails,
89
- templateRoot
90
- });
91
- expect(mocks.applyPreparedWrites).toHaveBeenCalledWith({
92
- writes: preparedWrites
93
- });
94
- expect(mocks.prepareTanStackInit).toHaveBeenCalledBefore(mocks.applyPreparedWrites);
95
- expect(mocks.applyPreparedWrites).toHaveBeenCalledBefore(mocks.installPackages);
96
- expect(mocks.resolvePackageVersion).toHaveBeenCalledWith({
97
- debug: true,
98
- packageName: 'payload',
99
- versionOrTag: 'beta'
100
- });
101
- expect(mocks.ensurePnpmBuildApprovals).toHaveBeenCalledWith({
102
- packageManager: 'pnpm',
103
- projectDir
104
- });
105
- expect(mocks.configurePayloadTsConfig).toHaveBeenCalledWith({
106
- configPath: path.join(projectDir, 'tsconfig.json'),
107
- payloadConfigPath: path.join(projectDir, 'src/payload.config.ts')
108
- });
109
- });
110
- it.each([
111
- [
112
- 'mongodb',
113
- '@payloadcms/db-mongodb@4.2.0'
114
- ],
115
- [
116
- 'postgres',
117
- '@payloadcms/db-postgres@4.2.0'
118
- ],
119
- [
120
- 'sqlite',
121
- '@payloadcms/db-sqlite@4.2.0'
122
- ]
123
- ])('should install the exact Payload dependencies for %s', async (dbType, databasePackage)=>{
124
- await initTanStack({
125
- appDetails,
126
- dbType,
127
- packageManager: 'npm',
128
- projectDir,
129
- templateRoot
130
- });
131
- expect(mocks.installPackages).toHaveBeenCalledWith({
132
- packageManager: 'npm',
133
- packagesToInstall: [
134
- '@payloadcms/plugin-mcp@4.2.0',
135
- '@payloadcms/richtext-lexical@4.2.0',
136
- '@payloadcms/tanstack-start@4.2.0',
137
- '@payloadcms/ui@4.2.0',
138
- '@vitejs/plugin-rsc@^0.5.21',
139
- databasePackage,
140
- 'graphql@^16.8.1',
141
- 'payload@4.2.0',
142
- 'sharp@0.34.2'
143
- ],
144
- projectDir
145
- });
146
- });
147
- it('should replace Router-only plugin package metadata', async ()=>{
148
- appDetails = createAppDetails({
149
- kind: 'router-only',
150
- projectDir
151
- });
152
- const packageJsonPath = path.join(projectDir, 'package.json');
153
- const originalPackageContent = `{
154
- "name": "router-app",
155
- "scripts": {
156
- "dev": "vite"
157
- },
158
- "dependencies": {
159
- "@tanstack/router-plugin": "^1.0.0",
160
- "payload": "^4.0.0"
161
- },
162
- "devDependencies": {
163
- "@tanstack/router-plugin": "^1.0.0",
164
- "typescript": "^6.0.0"
165
- }
166
- }`;
167
- fse.writeFileSync(packageJsonPath, originalPackageContent);
168
- await initTanStack({
169
- appDetails,
170
- dbType: 'mongodb',
171
- packageManager: 'yarn',
172
- projectDir,
173
- templateRoot
174
- });
175
- expect(mocks.applyPreparedWrites).toHaveBeenCalledWith({
176
- writes: [
177
- ...preparedWrites,
178
- {
179
- content: `{
180
- "name": "router-app",
181
- "scripts": {
182
- "dev": "vite"
183
- },
184
- "dependencies": {
185
- "payload": "^4.0.0"
186
- },
187
- "devDependencies": {
188
- "typescript": "^6.0.0"
189
- }
190
- }\n`,
191
- filePath: packageJsonPath
192
- }
193
- ]
194
- });
195
- expect(fse.readFileSync(packageJsonPath, 'utf8')).toBe(originalPackageContent);
196
- expect(mocks.installPackages).toHaveBeenCalledWith({
197
- packageManager: 'yarn',
198
- packagesToInstall: [
199
- '@payloadcms/plugin-mcp@4.2.0',
200
- '@payloadcms/richtext-lexical@4.2.0',
201
- '@payloadcms/tanstack-start@4.2.0',
202
- '@payloadcms/ui@4.2.0',
203
- '@vitejs/plugin-rsc@^0.5.21',
204
- '@payloadcms/db-mongodb@4.2.0',
205
- 'graphql@^16.8.1',
206
- 'payload@4.2.0',
207
- 'sharp@0.34.2',
208
- '@tanstack/react-start@^1.168.26'
209
- ],
210
- projectDir
211
- });
212
- });
213
- it('should reject malformed Router package metadata before applying host writes', async ()=>{
214
- appDetails = createAppDetails({
215
- kind: 'router-only',
216
- projectDir
217
- });
218
- const packageJsonPath = path.join(projectDir, 'package.json');
219
- const malformedPackageContent = '{ "dependencies": {';
220
- fse.writeFileSync(packageJsonPath, malformedPackageContent);
221
- const result = await initTanStack({
222
- appDetails,
223
- dbType: 'mongodb',
224
- packageManager: 'pnpm',
225
- projectDir,
226
- templateRoot
227
- });
228
- expect(result.success).toBe(false);
229
- if (result.success) {
230
- throw new Error('Expected malformed package metadata to fail preparation.');
231
- }
232
- expect(result.reason).toContain('Could not prepare package.json');
233
- expect(fse.readFileSync(packageJsonPath, 'utf8')).toBe(malformedPackageContent);
234
- expect(mocks.applyPreparedWrites).not.toHaveBeenCalled();
235
- expect(mocks.installPackages).not.toHaveBeenCalled();
236
- });
237
- it.each([
238
- {
239
- existingDependencies: {
240
- '@tanstack/react-router': '^1.200.0',
241
- '@tanstack/react-start': '^1.200.0',
242
- react: '^19.0.0'
243
- },
244
- existingDevDependencies: {
245
- vite: '^7.0.0'
246
- },
247
- expectedDependencies: {
248
- '@payloadcms/db-postgres': '4.2.0',
249
- '@payloadcms/plugin-mcp': '4.2.0',
250
- '@payloadcms/richtext-lexical': '4.2.0',
251
- '@payloadcms/tanstack-start': '4.2.0',
252
- '@payloadcms/ui': '4.2.0',
253
- '@tanstack/react-router': '^1.200.0',
254
- '@tanstack/react-start': '^1.200.0',
255
- '@vitejs/plugin-rsc': '^0.5.21',
256
- graphql: '^16.8.1',
257
- payload: '4.2.0',
258
- react: '^19.0.0',
259
- sharp: '0.34.2'
260
- },
261
- expectedDevDependencies: {
262
- vite: '^7.0.0'
263
- },
264
- kind: 'start'
265
- },
266
- {
267
- existingDependencies: {
268
- '@tanstack/react-router': '^1.200.0',
269
- react: '^19.0.0'
270
- },
271
- existingDevDependencies: {
272
- '@tanstack/router-plugin': '^1.200.0',
273
- vite: '^7.0.0'
274
- },
275
- expectedDependencies: {
276
- '@payloadcms/db-postgres': '4.2.0',
277
- '@payloadcms/plugin-mcp': '4.2.0',
278
- '@payloadcms/richtext-lexical': '4.2.0',
279
- '@payloadcms/tanstack-start': '4.2.0',
280
- '@payloadcms/ui': '4.2.0',
281
- '@tanstack/react-router': '^1.200.0',
282
- '@tanstack/react-start': '^1.168.26',
283
- '@vitejs/plugin-rsc': '^0.5.21',
284
- graphql: '^16.8.1',
285
- payload: '4.2.0',
286
- react: '^19.0.0',
287
- sharp: '0.34.2'
288
- },
289
- expectedDevDependencies: {
290
- vite: '^7.0.0'
291
- },
292
- kind: 'router-only'
293
- }
294
- ])('should record required dependencies without installing them for a $kind project with --no-deps', async ({ existingDependencies, existingDevDependencies, expectedDependencies, expectedDevDependencies, kind })=>{
295
- appDetails = createAppDetails({
296
- kind,
297
- projectDir
298
- });
299
- const packageJsonPath = path.join(projectDir, 'package.json');
300
- fse.writeJsonSync(packageJsonPath, {
301
- dependencies: existingDependencies,
302
- devDependencies: existingDevDependencies,
303
- name: `${kind}-app`
304
- });
305
- const result = await initTanStack({
306
- '--no-deps': true,
307
- appDetails,
308
- dbType: 'postgres',
309
- packageManager: 'pnpm',
310
- projectDir,
311
- templateRoot
312
- });
313
- expect(result.success).toBe(true);
314
- expect(mocks.resolvePackageVersion).toHaveBeenCalledWith({
315
- debug: undefined,
316
- packageName: 'payload',
317
- versionOrTag: 'canary'
318
- });
319
- expect(mocks.ensurePnpmBuildApprovals).not.toHaveBeenCalled();
320
- expect(mocks.installPackages).not.toHaveBeenCalled();
321
- expect(mocks.configurePayloadTsConfig).toHaveBeenCalledOnce();
322
- const appliedWrites = mocks.applyPreparedWrites.mock.calls[0]?.[0].writes;
323
- const packageJsonWrite = appliedWrites.find(({ filePath })=>filePath === packageJsonPath);
324
- expect(JSON.parse(packageJsonWrite?.content ?? '{}')).toEqual({
325
- dependencies: expectedDependencies,
326
- devDependencies: expectedDevDependencies,
327
- name: `${kind}-app`
328
- });
329
- });
330
- it('should return the preparation failure without applying writes', async ()=>{
331
- mocks.prepareTanStackInit.mockResolvedValue({
332
- reason: 'unsafe host transform',
333
- success: false
334
- });
335
- const result = await initTanStack({
336
- appDetails,
337
- dbType: 'sqlite',
338
- packageManager: 'bun',
339
- projectDir,
340
- templateRoot
341
- });
342
- expect(result).toEqual({
343
- reason: 'unsafe host transform',
344
- success: false
345
- });
346
- expect(mocks.applyPreparedWrites).not.toHaveBeenCalled();
347
- expect(mocks.installPackages).not.toHaveBeenCalled();
348
- });
349
- it('should return a failure when dependency installation rejects', async ()=>{
350
- mocks.installPackages.mockRejectedValue(new Error('Command failed with exit code 1'));
351
- const result = await initTanStack({
352
- appDetails,
353
- dbType: 'mongodb',
354
- packageManager: 'npm',
355
- projectDir,
356
- templateRoot
357
- });
358
- expect(result).toEqual({
359
- reason: 'Failed to install dependencies',
360
- success: false
361
- });
362
- expect(mocks.configurePayloadTsConfig).not.toHaveBeenCalled();
363
- });
364
- it('should detect app details when none are provided', async ()=>{
365
- const result = await initTanStack({
366
- dbType: 'mongodb',
367
- packageManager: 'npm',
368
- projectDir,
369
- templateRoot
370
- });
371
- expect(result.success).toBe(true);
372
- expect(mocks.getTanStackAppDetails).toHaveBeenCalledWith({
373
- projectDir
374
- });
375
- expect(mocks.prepareTanStackInit).toHaveBeenCalledWith({
376
- appDetails,
377
- templateRoot
378
- });
379
- });
380
- });
381
- function createAppDetails({ kind, projectDir }) {
382
- return {
383
- isPayloadInstalled: false,
384
- kind,
385
- projectDir,
386
- rootRoutePath: path.join(projectDir, 'src/routes/__root.tsx'),
387
- routerPath: path.join(projectDir, 'src/router.tsx'),
388
- routesDir: path.join(projectDir, 'src/routes'),
389
- sourceDir: path.join(projectDir, 'src'),
390
- viteConfigPath: path.join(projectDir, 'vite.config.ts')
391
- };
392
- }
393
-
394
- //# sourceMappingURL=init-tanstack.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/lib/init-tanstack.spec.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport type { DbType, TanStackAppDetails } from '../types.js'\n\nimport { initTanStack } from './init-tanstack.js'\n\nconst mocks = vi.hoisted(() => ({\n applyPreparedWrites: vi.fn(),\n configurePayloadTsConfig: vi.fn(),\n ensurePnpmBuildApprovals: vi.fn(),\n getTanStackAppDetails: vi.fn(),\n installPackages: vi.fn(),\n prepareTanStackInit: 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('./configure-payload-tsconfig.js', () => ({\n configurePayloadTsConfig: mocks.configurePayloadTsConfig,\n}))\n\nvi.mock('./configure-pnpm-builds.js', () => ({\n ensurePnpmBuildApprovals: mocks.ensurePnpmBuildApprovals,\n}))\n\nvi.mock('./install-packages.js', () => ({\n installPackages: mocks.installPackages,\n}))\n\nvi.mock('./tanstack/detect.js', () => ({\n getTanStackAppDetails: mocks.getTanStackAppDetails,\n}))\n\nvi.mock('./tanstack/prepare.js', () => ({\n applyPreparedWrites: mocks.applyPreparedWrites,\n prepareTanStackInit: mocks.prepareTanStackInit,\n}))\n\ndescribe('initTanStack', () => {\n const templateRoot = '/tmp/tanstack-template'\n let appDetails: TanStackAppDetails\n let preparedWrites: Array<{ content: string; filePath: string }>\n let projectDir: string\n\n beforeEach(() => {\n vi.clearAllMocks()\n projectDir = fse.mkdtempSync(path.join(os.tmpdir(), 'cpa-init-tanstack-'))\n appDetails = createAppDetails({ kind: 'start', projectDir })\n preparedWrites = [\n {\n content: 'export default {}\\n',\n filePath: path.join(projectDir, 'src/payload.config.ts'),\n },\n ]\n mocks.prepareTanStackInit.mockResolvedValue({ success: true, writes: preparedWrites })\n mocks.applyPreparedWrites.mockResolvedValue(undefined)\n mocks.ensurePnpmBuildApprovals.mockResolvedValue(undefined)\n mocks.installPackages.mockResolvedValue({ success: true })\n mocks.configurePayloadTsConfig.mockResolvedValue(undefined)\n mocks.resolvePackageVersion.mockResolvedValue('4.2.0')\n mocks.getTanStackAppDetails.mockResolvedValue({\n compatible: true,\n details: appDetails,\n detected: true,\n })\n })\n\n afterEach(() => {\n fse.removeSync(projectDir)\n })\n\n it('should prepare, apply, install, and configure in order', async () => {\n const result = await initTanStack({\n '--debug': true,\n '--payload-version': 'beta',\n appDetails,\n dbType: 'mongodb',\n packageManager: 'pnpm',\n projectDir,\n templateRoot,\n })\n\n expect(result).toEqual({\n payloadConfigPath: path.join(projectDir, 'src/payload.config.ts'),\n success: true,\n })\n expect(mocks.prepareTanStackInit).toHaveBeenCalledWith({ appDetails, templateRoot })\n expect(mocks.applyPreparedWrites).toHaveBeenCalledWith({ writes: preparedWrites })\n expect(mocks.prepareTanStackInit).toHaveBeenCalledBefore(mocks.applyPreparedWrites)\n expect(mocks.applyPreparedWrites).toHaveBeenCalledBefore(mocks.installPackages)\n expect(mocks.resolvePackageVersion).toHaveBeenCalledWith({\n debug: true,\n packageName: 'payload',\n versionOrTag: 'beta',\n })\n expect(mocks.ensurePnpmBuildApprovals).toHaveBeenCalledWith({\n packageManager: 'pnpm',\n projectDir,\n })\n expect(mocks.configurePayloadTsConfig).toHaveBeenCalledWith({\n configPath: path.join(projectDir, 'tsconfig.json'),\n payloadConfigPath: path.join(projectDir, 'src/payload.config.ts'),\n })\n })\n\n it.each<[DbType, string]>([\n ['mongodb', '@payloadcms/db-mongodb@4.2.0'],\n ['postgres', '@payloadcms/db-postgres@4.2.0'],\n ['sqlite', '@payloadcms/db-sqlite@4.2.0'],\n ])('should install the exact Payload dependencies for %s', async (dbType, databasePackage) => {\n await initTanStack({\n appDetails,\n dbType,\n packageManager: 'npm',\n projectDir,\n templateRoot,\n })\n\n expect(mocks.installPackages).toHaveBeenCalledWith({\n packageManager: 'npm',\n packagesToInstall: [\n '@payloadcms/plugin-mcp@4.2.0',\n '@payloadcms/richtext-lexical@4.2.0',\n '@payloadcms/tanstack-start@4.2.0',\n '@payloadcms/ui@4.2.0',\n '@vitejs/plugin-rsc@^0.5.21',\n databasePackage,\n 'graphql@^16.8.1',\n 'payload@4.2.0',\n 'sharp@0.34.2',\n ],\n projectDir,\n })\n })\n\n it('should replace Router-only plugin package metadata', async () => {\n appDetails = createAppDetails({ kind: 'router-only', projectDir })\n const packageJsonPath = path.join(projectDir, 'package.json')\n const originalPackageContent = `{\n \"name\": \"router-app\",\n \"scripts\": {\n \"dev\": \"vite\"\n },\n \"dependencies\": {\n \"@tanstack/router-plugin\": \"^1.0.0\",\n \"payload\": \"^4.0.0\"\n },\n \"devDependencies\": {\n \"@tanstack/router-plugin\": \"^1.0.0\",\n \"typescript\": \"^6.0.0\"\n }\n}`\n fse.writeFileSync(packageJsonPath, originalPackageContent)\n\n await initTanStack({\n appDetails,\n dbType: 'mongodb',\n packageManager: 'yarn',\n projectDir,\n templateRoot,\n })\n\n expect(mocks.applyPreparedWrites).toHaveBeenCalledWith({\n writes: [\n ...preparedWrites,\n {\n content: `{\n \"name\": \"router-app\",\n \"scripts\": {\n \"dev\": \"vite\"\n },\n \"dependencies\": {\n \"payload\": \"^4.0.0\"\n },\n \"devDependencies\": {\n \"typescript\": \"^6.0.0\"\n }\n}\\n`,\n filePath: packageJsonPath,\n },\n ],\n })\n expect(fse.readFileSync(packageJsonPath, 'utf8')).toBe(originalPackageContent)\n expect(mocks.installPackages).toHaveBeenCalledWith({\n packageManager: 'yarn',\n packagesToInstall: [\n '@payloadcms/plugin-mcp@4.2.0',\n '@payloadcms/richtext-lexical@4.2.0',\n '@payloadcms/tanstack-start@4.2.0',\n '@payloadcms/ui@4.2.0',\n '@vitejs/plugin-rsc@^0.5.21',\n '@payloadcms/db-mongodb@4.2.0',\n 'graphql@^16.8.1',\n 'payload@4.2.0',\n 'sharp@0.34.2',\n '@tanstack/react-start@^1.168.26',\n ],\n projectDir,\n })\n })\n\n it('should reject malformed Router package metadata before applying host writes', async () => {\n appDetails = createAppDetails({ kind: 'router-only', projectDir })\n const packageJsonPath = path.join(projectDir, 'package.json')\n const malformedPackageContent = '{ \"dependencies\": {'\n fse.writeFileSync(packageJsonPath, malformedPackageContent)\n\n const result = await initTanStack({\n appDetails,\n dbType: 'mongodb',\n packageManager: 'pnpm',\n projectDir,\n templateRoot,\n })\n\n expect(result.success).toBe(false)\n if (result.success) {\n throw new Error('Expected malformed package metadata to fail preparation.')\n }\n expect(result.reason).toContain('Could not prepare package.json')\n expect(fse.readFileSync(packageJsonPath, 'utf8')).toBe(malformedPackageContent)\n expect(mocks.applyPreparedWrites).not.toHaveBeenCalled()\n expect(mocks.installPackages).not.toHaveBeenCalled()\n })\n\n it.each([\n {\n existingDependencies: {\n '@tanstack/react-router': '^1.200.0',\n '@tanstack/react-start': '^1.200.0',\n react: '^19.0.0',\n },\n existingDevDependencies: { vite: '^7.0.0' },\n expectedDependencies: {\n '@payloadcms/db-postgres': '4.2.0',\n '@payloadcms/plugin-mcp': '4.2.0',\n '@payloadcms/richtext-lexical': '4.2.0',\n '@payloadcms/tanstack-start': '4.2.0',\n '@payloadcms/ui': '4.2.0',\n '@tanstack/react-router': '^1.200.0',\n '@tanstack/react-start': '^1.200.0',\n '@vitejs/plugin-rsc': '^0.5.21',\n graphql: '^16.8.1',\n payload: '4.2.0',\n react: '^19.0.0',\n sharp: '0.34.2',\n },\n expectedDevDependencies: { vite: '^7.0.0' },\n kind: 'start' as const,\n },\n {\n existingDependencies: {\n '@tanstack/react-router': '^1.200.0',\n react: '^19.0.0',\n },\n existingDevDependencies: {\n '@tanstack/router-plugin': '^1.200.0',\n vite: '^7.0.0',\n },\n expectedDependencies: {\n '@payloadcms/db-postgres': '4.2.0',\n '@payloadcms/plugin-mcp': '4.2.0',\n '@payloadcms/richtext-lexical': '4.2.0',\n '@payloadcms/tanstack-start': '4.2.0',\n '@payloadcms/ui': '4.2.0',\n '@tanstack/react-router': '^1.200.0',\n '@tanstack/react-start': '^1.168.26',\n '@vitejs/plugin-rsc': '^0.5.21',\n graphql: '^16.8.1',\n payload: '4.2.0',\n react: '^19.0.0',\n sharp: '0.34.2',\n },\n expectedDevDependencies: { vite: '^7.0.0' },\n kind: 'router-only' as const,\n },\n ])(\n 'should record required dependencies without installing them for a $kind project with --no-deps',\n async ({\n existingDependencies,\n existingDevDependencies,\n expectedDependencies,\n expectedDevDependencies,\n kind,\n }) => {\n appDetails = createAppDetails({ kind, projectDir })\n const packageJsonPath = path.join(projectDir, 'package.json')\n fse.writeJsonSync(packageJsonPath, {\n dependencies: existingDependencies,\n devDependencies: existingDevDependencies,\n name: `${kind}-app`,\n })\n\n const result = await initTanStack({\n '--no-deps': true,\n appDetails,\n dbType: 'postgres',\n packageManager: 'pnpm',\n projectDir,\n templateRoot,\n })\n\n expect(result.success).toBe(true)\n expect(mocks.resolvePackageVersion).toHaveBeenCalledWith({\n debug: undefined,\n packageName: 'payload',\n versionOrTag: 'canary',\n })\n expect(mocks.ensurePnpmBuildApprovals).not.toHaveBeenCalled()\n expect(mocks.installPackages).not.toHaveBeenCalled()\n expect(mocks.configurePayloadTsConfig).toHaveBeenCalledOnce()\n\n const appliedWrites = mocks.applyPreparedWrites.mock.calls[0]?.[0].writes as Array<{\n content: string\n filePath: string\n }>\n const packageJsonWrite = appliedWrites.find(({ filePath }) => filePath === packageJsonPath)\n\n expect(JSON.parse(packageJsonWrite?.content ?? '{}')).toEqual({\n dependencies: expectedDependencies,\n devDependencies: expectedDevDependencies,\n name: `${kind}-app`,\n })\n },\n )\n\n it('should return the preparation failure without applying writes', async () => {\n mocks.prepareTanStackInit.mockResolvedValue({ reason: 'unsafe host transform', success: false })\n\n const result = await initTanStack({\n appDetails,\n dbType: 'sqlite',\n packageManager: 'bun',\n projectDir,\n templateRoot,\n })\n\n expect(result).toEqual({ reason: 'unsafe host transform', success: false })\n expect(mocks.applyPreparedWrites).not.toHaveBeenCalled()\n expect(mocks.installPackages).not.toHaveBeenCalled()\n })\n\n it('should return a failure when dependency installation rejects', async () => {\n mocks.installPackages.mockRejectedValue(new Error('Command failed with exit code 1'))\n\n const result = await initTanStack({\n appDetails,\n dbType: 'mongodb',\n packageManager: 'npm',\n projectDir,\n templateRoot,\n })\n\n expect(result).toEqual({ reason: 'Failed to install dependencies', success: false })\n expect(mocks.configurePayloadTsConfig).not.toHaveBeenCalled()\n })\n\n it('should detect app details when none are provided', async () => {\n const result = await initTanStack({\n dbType: 'mongodb',\n packageManager: 'npm',\n projectDir,\n templateRoot,\n })\n\n expect(result.success).toBe(true)\n expect(mocks.getTanStackAppDetails).toHaveBeenCalledWith({ projectDir })\n expect(mocks.prepareTanStackInit).toHaveBeenCalledWith({ appDetails, templateRoot })\n })\n})\n\nfunction createAppDetails({\n kind,\n projectDir,\n}: {\n kind: TanStackAppDetails['kind']\n projectDir: string\n}): TanStackAppDetails {\n return {\n isPayloadInstalled: false,\n kind,\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"],"names":["fse","os","path","afterEach","beforeEach","describe","expect","it","vi","initTanStack","mocks","hoisted","applyPreparedWrites","fn","configurePayloadTsConfig","ensurePnpmBuildApprovals","getTanStackAppDetails","installPackages","prepareTanStackInit","resolvePackageVersion","mock","importOriginal","templateRoot","appDetails","preparedWrites","projectDir","clearAllMocks","mkdtempSync","join","tmpdir","createAppDetails","kind","content","filePath","mockResolvedValue","success","writes","undefined","compatible","details","detected","removeSync","result","dbType","packageManager","toEqual","payloadConfigPath","toHaveBeenCalledWith","toHaveBeenCalledBefore","debug","packageName","versionOrTag","configPath","each","databasePackage","packagesToInstall","packageJsonPath","originalPackageContent","writeFileSync","readFileSync","toBe","malformedPackageContent","Error","reason","toContain","not","toHaveBeenCalled","existingDependencies","react","existingDevDependencies","vite","expectedDependencies","graphql","payload","sharp","expectedDevDependencies","writeJsonSync","dependencies","devDependencies","name","toHaveBeenCalledOnce","appliedWrites","calls","packageJsonWrite","find","JSON","parse","mockRejectedValue","isPayloadInstalled","rootRoutePath","routerPath","routesDir","sourceDir","viteConfigPath"],"mappings":"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"}
@@ -1,118 +0,0 @@
1
- import fs from 'fs';
2
- import fse from 'fs-extra';
3
- import * as os from 'node:os';
4
- import path from 'path';
5
- import { afterEach, beforeAll, beforeEach, describe, expect, it, vitest } from 'vitest';
6
- import { manageEnvFiles } from './manage-env-files.js';
7
- describe('createProject', ()=>{
8
- let projectDir;
9
- let envFilePath = '';
10
- let envExampleFilePath = '';
11
- beforeAll(()=>{
12
- // eslint-disable-next-line no-console
13
- console.log = vitest.fn();
14
- });
15
- beforeEach(()=>{
16
- const tempDirectory = fs.realpathSync(os.tmpdir());
17
- projectDir = `${tempDirectory}/${Math.random().toString(36).substring(7)}`;
18
- envFilePath = path.join(projectDir, '.env');
19
- envExampleFilePath = path.join(projectDir, '.env.example');
20
- if (fse.existsSync(envFilePath)) {
21
- fse.removeSync(envFilePath);
22
- }
23
- fse.ensureDirSync(projectDir);
24
- });
25
- afterEach(()=>{
26
- if (fse.existsSync(projectDir)) {
27
- fse.rmSync(projectDir, {
28
- recursive: true
29
- });
30
- }
31
- });
32
- it('generates .env using defaults (not from .env.example)', async ()=>{
33
- // ensure no .env.example exists so that the default values are used
34
- // the `manageEnvFiles` function will look for .env.example in the file system
35
- if (fse.existsSync(envExampleFilePath)) {
36
- fse.removeSync(envExampleFilePath);
37
- }
38
- await manageEnvFiles({
39
- cliArgs: {
40
- '--debug': true
41
- },
42
- databaseUri: '',
43
- payloadSecret: '',
44
- projectDir,
45
- template: undefined
46
- });
47
- expect(fse.existsSync(envFilePath)).toBe(true);
48
- const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8');
49
- expect(updatedEnvContent).toBe(`# Added by Payload\nPAYLOAD_SECRET=YOUR_SECRET_HERE\nDATABASE_URL=your-connection-string-here`);
50
- });
51
- it('generates .env from .env.example', async ()=>{
52
- // create or override the .env.example file with a connection string that will NOT be overridden
53
- fse.ensureFileSync(envExampleFilePath);
54
- fse.writeFileSync(envExampleFilePath, `DATABASE_URL=example-connection-string\nCUSTOM_VAR=custom-value\n`);
55
- await manageEnvFiles({
56
- cliArgs: {
57
- '--debug': true
58
- },
59
- databaseUri: '',
60
- payloadSecret: '',
61
- projectDir,
62
- template: undefined
63
- });
64
- expect(fse.existsSync(envFilePath)).toBe(true);
65
- const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8');
66
- expect(updatedEnvContent).toBe(`DATABASE_URL=example-connection-string\nCUSTOM_VAR=custom-value\nPAYLOAD_SECRET=YOUR_SECRET_HERE\n# Added by Payload`);
67
- });
68
- it('updates existing .env without overriding vars', async ()=>{
69
- // create an existing .env file with some custom variables that should NOT be overridden
70
- fse.ensureFileSync(envFilePath);
71
- fse.writeFileSync(envFilePath, `CUSTOM_VAR=custom-value\nDATABASE_URL=example-connection-string\n`);
72
- // create an .env.example file to ensure that its contents DO NOT override existing .env vars
73
- fse.ensureFileSync(envExampleFilePath);
74
- fse.writeFileSync(envExampleFilePath, `CUSTOM_VAR=custom-value-2\nDATABASE_URL=example-connection-string-2\n`);
75
- await manageEnvFiles({
76
- cliArgs: {
77
- '--debug': true
78
- },
79
- databaseUri: '',
80
- payloadSecret: '',
81
- projectDir,
82
- template: undefined
83
- });
84
- expect(fse.existsSync(envFilePath)).toBe(true);
85
- const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8');
86
- expect(updatedEnvContent).toBe(`# Added by Payload\nPAYLOAD_SECRET=YOUR_SECRET_HERE\nDATABASE_URL=example-connection-string\nCUSTOM_VAR=custom-value`);
87
- });
88
- it('sanitizes .env based on selected database type', async ()=>{
89
- await manageEnvFiles({
90
- cliArgs: {
91
- '--debug': true
92
- },
93
- databaseType: 'mongodb',
94
- databaseUri: 'mongodb://localhost:27017/test',
95
- payloadSecret: 'test-secret',
96
- projectDir,
97
- template: undefined
98
- });
99
- const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8');
100
- expect(updatedEnvContent).toBe(`# Added by Payload\nPAYLOAD_SECRET=test-secret\nDATABASE_URL=mongodb://localhost:27017/test`);
101
- // delete the generated .env file and do it again, but this time, omit the databaseUri to ensure the default is generated
102
- fse.removeSync(envFilePath);
103
- await manageEnvFiles({
104
- cliArgs: {
105
- '--debug': true
106
- },
107
- databaseType: 'mongodb',
108
- databaseUri: '',
109
- payloadSecret: 'test-secret',
110
- projectDir,
111
- template: undefined
112
- });
113
- const updatedEnvContentWithDefault = fse.readFileSync(envFilePath, 'utf-8');
114
- expect(updatedEnvContentWithDefault).toBe(`# Added by Payload\nPAYLOAD_SECRET=test-secret\nDATABASE_URL=mongodb://127.0.0.1/your-database-name`);
115
- });
116
- });
117
-
118
- //# sourceMappingURL=manage-env-files.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/lib/manage-env-files.spec.ts"],"sourcesContent":["import fs from 'fs'\nimport fse from 'fs-extra'\nimport * as os from 'node:os'\nimport path from 'path'\nimport { afterEach, beforeAll, beforeEach, describe, expect, it, vitest } from 'vitest'\n\nimport type { CliArgs } from '../types.js'\n\nimport { manageEnvFiles } from './manage-env-files.js'\n\ndescribe('createProject', () => {\n let projectDir: string\n let envFilePath = ''\n let envExampleFilePath = ''\n\n beforeAll(() => {\n // eslint-disable-next-line no-console\n console.log = vitest.fn()\n })\n\n beforeEach(() => {\n const tempDirectory = fs.realpathSync(os.tmpdir())\n projectDir = `${tempDirectory}/${Math.random().toString(36).substring(7)}`\n\n envFilePath = path.join(projectDir, '.env')\n envExampleFilePath = path.join(projectDir, '.env.example')\n\n if (fse.existsSync(envFilePath)) {\n fse.removeSync(envFilePath)\n }\n\n fse.ensureDirSync(projectDir)\n })\n\n afterEach(() => {\n if (fse.existsSync(projectDir)) {\n fse.rmSync(projectDir, { recursive: true })\n }\n })\n\n it('generates .env using defaults (not from .env.example)', async () => {\n // ensure no .env.example exists so that the default values are used\n // the `manageEnvFiles` function will look for .env.example in the file system\n if (fse.existsSync(envExampleFilePath)) {\n fse.removeSync(envExampleFilePath)\n }\n\n await manageEnvFiles({\n cliArgs: {\n '--debug': true,\n } as CliArgs,\n databaseUri: '', // omitting this will ensure the default vars are used\n payloadSecret: '', // omitting this will ensure the default vars are used\n projectDir,\n template: undefined,\n })\n\n expect(fse.existsSync(envFilePath)).toBe(true)\n\n const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8')\n\n expect(updatedEnvContent).toBe(\n `# Added by Payload\\nPAYLOAD_SECRET=YOUR_SECRET_HERE\\nDATABASE_URL=your-connection-string-here`,\n )\n })\n\n it('generates .env from .env.example', async () => {\n // create or override the .env.example file with a connection string that will NOT be overridden\n fse.ensureFileSync(envExampleFilePath)\n fse.writeFileSync(\n envExampleFilePath,\n `DATABASE_URL=example-connection-string\\nCUSTOM_VAR=custom-value\\n`,\n )\n\n await manageEnvFiles({\n cliArgs: {\n '--debug': true,\n } as CliArgs,\n databaseUri: '', // omitting this will ensure the `.env.example` vars are used\n payloadSecret: '', // omitting this will ensure the `.env.example` vars are used\n projectDir,\n template: undefined,\n })\n\n expect(fse.existsSync(envFilePath)).toBe(true)\n\n const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8')\n\n expect(updatedEnvContent).toBe(\n `DATABASE_URL=example-connection-string\\nCUSTOM_VAR=custom-value\\nPAYLOAD_SECRET=YOUR_SECRET_HERE\\n# Added by Payload`,\n )\n })\n\n it('updates existing .env without overriding vars', async () => {\n // create an existing .env file with some custom variables that should NOT be overridden\n fse.ensureFileSync(envFilePath)\n fse.writeFileSync(\n envFilePath,\n `CUSTOM_VAR=custom-value\\nDATABASE_URL=example-connection-string\\n`,\n )\n\n // create an .env.example file to ensure that its contents DO NOT override existing .env vars\n fse.ensureFileSync(envExampleFilePath)\n fse.writeFileSync(\n envExampleFilePath,\n `CUSTOM_VAR=custom-value-2\\nDATABASE_URL=example-connection-string-2\\n`,\n )\n\n await manageEnvFiles({\n cliArgs: {\n '--debug': true,\n } as CliArgs,\n databaseUri: '', // omitting this will ensure the `.env` vars are kept\n payloadSecret: '', // omitting this will ensure the `.env` vars are kept\n projectDir,\n template: undefined,\n })\n\n expect(fse.existsSync(envFilePath)).toBe(true)\n\n const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8')\n\n expect(updatedEnvContent).toBe(\n `# Added by Payload\\nPAYLOAD_SECRET=YOUR_SECRET_HERE\\nDATABASE_URL=example-connection-string\\nCUSTOM_VAR=custom-value`,\n )\n })\n\n it('sanitizes .env based on selected database type', async () => {\n await manageEnvFiles({\n cliArgs: {\n '--debug': true,\n } as CliArgs,\n databaseType: 'mongodb', // this mimics the CLI selection and will be used as the DATABASE_URL\n databaseUri: 'mongodb://localhost:27017/test', // this mimics the CLI selection and will be used as the DATABASE_URL\n payloadSecret: 'test-secret', // this mimics the CLI selection and will be used as the PAYLOAD_SECRET\n projectDir,\n template: undefined,\n })\n\n const updatedEnvContent = fse.readFileSync(envFilePath, 'utf-8')\n\n expect(updatedEnvContent).toBe(\n `# Added by Payload\\nPAYLOAD_SECRET=test-secret\\nDATABASE_URL=mongodb://localhost:27017/test`,\n )\n\n // delete the generated .env file and do it again, but this time, omit the databaseUri to ensure the default is generated\n fse.removeSync(envFilePath)\n\n await manageEnvFiles({\n cliArgs: {\n '--debug': true,\n } as CliArgs,\n databaseType: 'mongodb', // this mimics the CLI selection and will be used as the DATABASE_URL\n databaseUri: '', // omit this to ensure the default is generated based on the selected database type\n payloadSecret: 'test-secret',\n projectDir,\n template: undefined,\n })\n\n const updatedEnvContentWithDefault = fse.readFileSync(envFilePath, 'utf-8')\n expect(updatedEnvContentWithDefault).toBe(\n `# Added by Payload\\nPAYLOAD_SECRET=test-secret\\nDATABASE_URL=mongodb://127.0.0.1/your-database-name`,\n )\n })\n})\n"],"names":["fs","fse","os","path","afterEach","beforeAll","beforeEach","describe","expect","it","vitest","manageEnvFiles","projectDir","envFilePath","envExampleFilePath","console","log","fn","tempDirectory","realpathSync","tmpdir","Math","random","toString","substring","join","existsSync","removeSync","ensureDirSync","rmSync","recursive","cliArgs","databaseUri","payloadSecret","template","undefined","toBe","updatedEnvContent","readFileSync","ensureFileSync","writeFileSync","databaseType","updatedEnvContentWithDefault"],"mappings":"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"}