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.
- package/dist/lib/agent-config.d.ts +2 -5
- package/dist/lib/agent-config.d.ts.map +1 -1
- package/dist/lib/agent-config.js +1 -8
- package/dist/lib/agent-config.js.map +1 -1
- package/dist/lib/create-project.d.ts.map +1 -1
- package/dist/lib/create-project.js +51 -8
- package/dist/lib/create-project.js.map +1 -1
- package/dist/lib/get-package-manager.d.ts +9 -0
- package/dist/lib/get-package-manager.d.ts.map +1 -1
- package/dist/lib/get-package-manager.js +20 -0
- package/dist/lib/get-package-manager.js.map +1 -1
- package/dist/lib/tanstack/template-files.d.ts +2 -2
- package/dist/lib/tanstack/template-files.d.ts.map +1 -1
- package/dist/lib/tanstack/template-files.js +2 -2
- package/dist/lib/tanstack/template-files.js.map +1 -1
- package/dist/lib/update-payload-in-project.d.ts.map +1 -1
- package/dist/lib/update-payload-in-project.js +7 -2
- package/dist/lib/update-payload-in-project.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +0 -1
- package/dist/main.js.map +1 -1
- package/dist/template/src/app/(frontend)/styles.css +7 -0
- package/dist/template/src/app/(payload)/admin/importMap.js +17 -0
- package/dist/template/src/payload-types.ts +72 -1
- package/dist/template/src/payload.config.ts +8 -0
- package/dist/template-tanstack/routes/_payload.tsx +22 -5
- package/dist/template-tanstack/src/payload.css +1 -0
- package/dist/utils/messages.js +1 -1
- package/dist/utils/messages.js.map +1 -1
- package/package.json +2 -2
- package/dist/ast-integration.spec.js +0 -132
- package/dist/ast-integration.spec.js.map +0 -1
- package/dist/lib/agent-config.spec.js +0 -23
- package/dist/lib/agent-config.spec.js.map +0 -1
- package/dist/lib/ast/package-json.spec.js +0 -139
- package/dist/lib/ast/package-json.spec.js.map +0 -1
- package/dist/lib/ast/payload-config.spec.js +0 -365
- package/dist/lib/ast/payload-config.spec.js.map +0 -1
- package/dist/lib/ast/utils.spec.js +0 -226
- package/dist/lib/ast/utils.spec.js.map +0 -1
- package/dist/lib/configure-payload-tsconfig.spec.js +0 -135
- package/dist/lib/configure-payload-tsconfig.spec.js.map +0 -1
- package/dist/lib/create-project.spec.js +0 -199
- package/dist/lib/create-project.spec.js.map +0 -1
- package/dist/lib/init-tanstack-default-template.spec.js +0 -119
- package/dist/lib/init-tanstack-default-template.spec.js.map +0 -1
- package/dist/lib/init-tanstack.spec.js +0 -394
- package/dist/lib/init-tanstack.spec.js.map +0 -1
- package/dist/lib/manage-env-files.spec.js +0 -118
- package/dist/lib/manage-env-files.spec.js.map +0 -1
- package/dist/lib/tanstack/detect.spec.js +0 -227
- package/dist/lib/tanstack/detect.spec.js.map +0 -1
- package/dist/lib/tanstack/prepare.spec.js +0 -288
- package/dist/lib/tanstack/prepare.spec.js.map +0 -1
- package/dist/lib/tanstack/transform-root-route.spec.js +0 -484
- package/dist/lib/tanstack/transform-root-route.spec.js.map +0 -1
- package/dist/lib/tanstack/transform-router.spec.js +0 -264
- package/dist/lib/tanstack/transform-router.spec.js.map +0 -1
- package/dist/lib/tanstack/transform-vite-config.spec.js +0 -456
- package/dist/lib/tanstack/transform-vite-config.spec.js.map +0 -1
- package/dist/lib/update-payload-in-project.spec.js +0 -258
- package/dist/lib/update-payload-in-project.spec.js.map +0 -1
- package/dist/lib/wrap-next-config.spec.js +0 -167
- package/dist/lib/wrap-next-config.spec.js.map +0 -1
- package/dist/main.spec.js +0 -102
- package/dist/main.spec.js.map +0 -1
- package/dist/template-tanstack/src/payload-foundation.css +0 -10
- package/dist/utils/resolvePackageVersion.spec.js +0 -77
- 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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"}
|