create-payload-app 3.91.0-internal.c1569dc → 4.0.0-beta.0
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/LICENSE.md +1 -1
- 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 +12 -0
- package/dist/lib/agent-config.d.ts.map +1 -0
- package/dist/lib/agent-config.js +15 -0
- package/dist/lib/agent-config.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/payload-config.js +1 -1
- package/dist/lib/ast/payload-config.js.map +1 -1
- package/dist/lib/ast/types.d.ts +3 -3
- 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/create-project.d.ts +1 -2
- package/dist/lib/create-project.d.ts.map +1 -1
- package/dist/lib/create-project.js +64 -79
- package/dist/lib/create-project.js.map +1 -1
- package/dist/lib/generate-secret.js +1 -1
- package/dist/lib/generate-secret.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/init-next.d.ts +6 -1
- package/dist/lib/init-next.d.ts.map +1 -1
- package/dist/lib/init-next.js +34 -41
- package/dist/lib/init-next.js.map +1 -1
- 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 +149 -0
- package/dist/lib/init-tanstack.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/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/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-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-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/templates.d.ts.map +1 -1
- package/dist/lib/templates.js +11 -5
- 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 +102 -21
- package/dist/lib/update-payload-in-project.js.map +1 -1
- 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 +127 -36
- package/dist/main.js.map +1 -1
- 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)/page.tsx +7 -4
- package/dist/template/src/app/(frontend)/styles.css +8 -1
- package/dist/template/src/app/(payload)/admin/[[...segments]]/not-found.tsx +1 -2
- package/dist/template/src/app/(payload)/admin/[[...segments]]/page.tsx +1 -2
- package/dist/template/src/app/(payload)/admin/importMap.js +30 -2
- package/dist/template/src/app/(payload)/api/[...slug]/route.ts +1 -2
- package/dist/template/src/app/(payload)/api/graphql/route.ts +1 -2
- package/dist/template/src/app/(payload)/api/graphql-playground/route.ts +1 -2
- package/dist/template/src/app/(payload)/custom.css +0 -0
- package/dist/template/src/app/(payload)/layout.tsx +9 -4
- package/dist/template/src/collections/Folders.ts +16 -0
- package/dist/template/src/collections/Media.ts +4 -0
- package/dist/template/src/collections/Tags.ts +16 -0
- package/dist/template/src/collections/Users.ts +1 -0
- package/dist/template/src/payload-types.ts +63 -9
- package/dist/template/src/payload.config.ts +14 -4
- package/dist/template-tanstack/routes/_payload/admin.$.tsx +25 -0
- package/dist/template-tanstack/routes/_payload/admin.index.tsx +25 -0
- package/dist/template-tanstack/routes/_payload/api.$.ts +11 -0
- package/dist/template-tanstack/routes/_payload/importMap.js +32 -0
- package/dist/template-tanstack/routes/_payload/server.functions.ts +50 -0
- package/dist/template-tanstack/routes/_payload.tsx +29 -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 +38 -0
- package/dist/types.d.ts +23 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.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 +10 -6
- package/dist/utils/messages.js.map +1 -1
- package/dist/utils/resolvePackageVersion.d.ts +35 -0
- package/dist/utils/resolvePackageVersion.d.ts.map +1 -0
- package/dist/utils/resolvePackageVersion.js +62 -0
- package/dist/utils/resolvePackageVersion.js.map +1 -0
- package/package.json +8 -8
- package/dist/ast-integration.spec.js +0 -132
- package/dist/ast-integration.spec.js.map +0 -1
- package/dist/lib/ast/package-json.spec.js +0 -67
- 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/create-project.spec.js +0 -190
- package/dist/lib/create-project.spec.js.map +0 -1
- 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/manage-env-files.spec.js +0 -118
- package/dist/lib/manage-env-files.spec.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/lib/wrap-next-config.spec.js +0 -167
- package/dist/lib/wrap-next-config.spec.js.map +0 -1
- package/dist/utils/getLatestPackageVersion.d.ts +0 -17
- package/dist/utils/getLatestPackageVersion.d.ts.map +0 -1
- package/dist/utils/getLatestPackageVersion.js +0 -20
- package/dist/utils/getLatestPackageVersion.js.map +0 -1
- /package/dist/{template/src/app/(payload)/custom.scss → template-tanstack/routes/_payload/custom.css} +0 -0
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { Project } from 'ts-morph';
|
|
3
|
-
import { addImportDeclaration, cleanupOrphanedImports, findImportDeclaration, isNamedImportUsed, removeImportDeclaration, removeNamedImports } from './utils';
|
|
4
|
-
describe('findImportDeclaration', ()=>{
|
|
5
|
-
it('finds import by module specifier', ()=>{
|
|
6
|
-
const project = new Project({
|
|
7
|
-
useInMemoryFileSystem: true
|
|
8
|
-
});
|
|
9
|
-
const sourceFile = project.createSourceFile('test.ts', `import { buildConfig } from 'payload'
|
|
10
|
-
import { mongooseAdapter } from '@payloadcms/db-mongodb'`);
|
|
11
|
-
const result = findImportDeclaration({
|
|
12
|
-
sourceFile,
|
|
13
|
-
moduleSpecifier: '@payloadcms/db-mongodb'
|
|
14
|
-
});
|
|
15
|
-
expect(result).toBeDefined();
|
|
16
|
-
expect(result?.getModuleSpecifierValue()).toBe('@payloadcms/db-mongodb');
|
|
17
|
-
});
|
|
18
|
-
});
|
|
19
|
-
describe('addImportDeclaration', ()=>{
|
|
20
|
-
it('adds new import when not present', ()=>{
|
|
21
|
-
const project = new Project({
|
|
22
|
-
useInMemoryFileSystem: true
|
|
23
|
-
});
|
|
24
|
-
const sourceFile = project.createSourceFile('test.ts', `import { buildConfig } from 'payload'`);
|
|
25
|
-
const result = addImportDeclaration({
|
|
26
|
-
sourceFile,
|
|
27
|
-
moduleSpecifier: '@payloadcms/db-postgres',
|
|
28
|
-
namedImports: [
|
|
29
|
-
'postgresAdapter'
|
|
30
|
-
]
|
|
31
|
-
});
|
|
32
|
-
const imports = result.getImportDeclarations();
|
|
33
|
-
expect(imports).toHaveLength(2);
|
|
34
|
-
expect(imports[1].getModuleSpecifierValue()).toBe('@payloadcms/db-postgres');
|
|
35
|
-
expect(imports[1].getNamedImports()[0].getName()).toBe('postgresAdapter');
|
|
36
|
-
});
|
|
37
|
-
it('does not duplicate existing import', ()=>{
|
|
38
|
-
const project = new Project({
|
|
39
|
-
useInMemoryFileSystem: true
|
|
40
|
-
});
|
|
41
|
-
const sourceFile = project.createSourceFile('test.ts', `import { mongooseAdapter } from '@payloadcms/db-mongodb'`);
|
|
42
|
-
const result = addImportDeclaration({
|
|
43
|
-
sourceFile,
|
|
44
|
-
moduleSpecifier: '@payloadcms/db-mongodb',
|
|
45
|
-
namedImports: [
|
|
46
|
-
'mongooseAdapter'
|
|
47
|
-
]
|
|
48
|
-
});
|
|
49
|
-
const imports = result.getImportDeclarations();
|
|
50
|
-
expect(imports).toHaveLength(1);
|
|
51
|
-
});
|
|
52
|
-
it('adds named import to existing module import', ()=>{
|
|
53
|
-
const project = new Project({
|
|
54
|
-
useInMemoryFileSystem: true
|
|
55
|
-
});
|
|
56
|
-
const sourceFile = project.createSourceFile('test.ts', `import { buildConfig } from 'payload'`);
|
|
57
|
-
const result = addImportDeclaration({
|
|
58
|
-
sourceFile,
|
|
59
|
-
moduleSpecifier: 'payload',
|
|
60
|
-
namedImports: [
|
|
61
|
-
'Field'
|
|
62
|
-
]
|
|
63
|
-
});
|
|
64
|
-
const imports = result.getImportDeclarations();
|
|
65
|
-
expect(imports).toHaveLength(1);
|
|
66
|
-
const namedImports = imports[0].getNamedImports().map((ni)=>ni.getName());
|
|
67
|
-
expect(namedImports).toContain('buildConfig');
|
|
68
|
-
expect(namedImports).toContain('Field');
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
describe('removeImportDeclaration', ()=>{
|
|
72
|
-
it('removes import by module specifier', ()=>{
|
|
73
|
-
const project = new Project({
|
|
74
|
-
useInMemoryFileSystem: true
|
|
75
|
-
});
|
|
76
|
-
const sourceFile = project.createSourceFile('test.ts', `import { buildConfig } from 'payload'
|
|
77
|
-
import sharp from 'sharp'`);
|
|
78
|
-
const result = removeImportDeclaration({
|
|
79
|
-
sourceFile,
|
|
80
|
-
moduleSpecifier: 'sharp'
|
|
81
|
-
});
|
|
82
|
-
expect(result.removedIndex).toBe(1);
|
|
83
|
-
const imports = result.sourceFile.getImportDeclarations();
|
|
84
|
-
expect(imports).toHaveLength(1);
|
|
85
|
-
expect(imports[0].getModuleSpecifierValue()).toBe('payload');
|
|
86
|
-
});
|
|
87
|
-
it('returns undefined removedIndex when import not found', ()=>{
|
|
88
|
-
const project = new Project({
|
|
89
|
-
useInMemoryFileSystem: true
|
|
90
|
-
});
|
|
91
|
-
const sourceFile = project.createSourceFile('test.ts', `import { buildConfig } from 'payload'`);
|
|
92
|
-
const result = removeImportDeclaration({
|
|
93
|
-
sourceFile,
|
|
94
|
-
moduleSpecifier: 'sharp'
|
|
95
|
-
});
|
|
96
|
-
expect(result.removedIndex).toBeUndefined();
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
describe('removeNamedImports', ()=>{
|
|
100
|
-
it('removes specific named imports', ()=>{
|
|
101
|
-
const project = new Project({
|
|
102
|
-
useInMemoryFileSystem: true
|
|
103
|
-
});
|
|
104
|
-
const sourceFile = project.createSourceFile('test.ts', `import { mongooseAdapter, SomeOtherType } from '@payloadcms/db-mongodb'`);
|
|
105
|
-
const importDecl = findImportDeclaration({
|
|
106
|
-
sourceFile,
|
|
107
|
-
moduleSpecifier: '@payloadcms/db-mongodb'
|
|
108
|
-
});
|
|
109
|
-
const result = removeNamedImports({
|
|
110
|
-
sourceFile,
|
|
111
|
-
importDeclaration: importDecl,
|
|
112
|
-
namedImportsToRemove: [
|
|
113
|
-
'mongooseAdapter'
|
|
114
|
-
]
|
|
115
|
-
});
|
|
116
|
-
expect(result.fullyRemoved).toBe(false);
|
|
117
|
-
const imports = result.sourceFile.getImportDeclarations();
|
|
118
|
-
expect(imports).toHaveLength(1);
|
|
119
|
-
const namedImports = imports[0].getNamedImports().map((ni)=>ni.getName());
|
|
120
|
-
expect(namedImports).toEqual([
|
|
121
|
-
'SomeOtherType'
|
|
122
|
-
]);
|
|
123
|
-
});
|
|
124
|
-
it('removes entire import when no named imports remain', ()=>{
|
|
125
|
-
const project = new Project({
|
|
126
|
-
useInMemoryFileSystem: true
|
|
127
|
-
});
|
|
128
|
-
const sourceFile = project.createSourceFile('test.ts', `import { buildConfig } from 'payload'
|
|
129
|
-
import { mongooseAdapter } from '@payloadcms/db-mongodb'`);
|
|
130
|
-
const importDecl = findImportDeclaration({
|
|
131
|
-
sourceFile,
|
|
132
|
-
moduleSpecifier: '@payloadcms/db-mongodb'
|
|
133
|
-
});
|
|
134
|
-
const result = removeNamedImports({
|
|
135
|
-
sourceFile,
|
|
136
|
-
importDeclaration: importDecl,
|
|
137
|
-
namedImportsToRemove: [
|
|
138
|
-
'mongooseAdapter'
|
|
139
|
-
]
|
|
140
|
-
});
|
|
141
|
-
expect(result.fullyRemoved).toBe(true);
|
|
142
|
-
expect(result.index).toBe(1);
|
|
143
|
-
const imports = result.sourceFile.getImportDeclarations();
|
|
144
|
-
expect(imports).toHaveLength(1);
|
|
145
|
-
expect(imports[0].getModuleSpecifierValue()).toBe('payload');
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
describe('isNamedImportUsed', ()=>{
|
|
149
|
-
it('detects used import in code', ()=>{
|
|
150
|
-
const project = new Project({
|
|
151
|
-
useInMemoryFileSystem: true
|
|
152
|
-
});
|
|
153
|
-
const sourceFile = project.createSourceFile('test.ts', `import { mongooseAdapter } from '@payloadcms/db-mongodb'
|
|
154
|
-
|
|
155
|
-
export default buildConfig({
|
|
156
|
-
db: mongooseAdapter({ url: '' })
|
|
157
|
-
})`);
|
|
158
|
-
const isUsed = isNamedImportUsed(sourceFile, 'mongooseAdapter');
|
|
159
|
-
expect(isUsed).toBe(true);
|
|
160
|
-
});
|
|
161
|
-
it('detects unused import', ()=>{
|
|
162
|
-
const project = new Project({
|
|
163
|
-
useInMemoryFileSystem: true
|
|
164
|
-
});
|
|
165
|
-
const sourceFile = project.createSourceFile('test.ts', `import { mongooseAdapter } from '@payloadcms/db-mongodb'
|
|
166
|
-
import { postgresAdapter } from '@payloadcms/db-postgres'
|
|
167
|
-
|
|
168
|
-
export default buildConfig({
|
|
169
|
-
db: postgresAdapter({ url: '' })
|
|
170
|
-
})`);
|
|
171
|
-
const isUsed = isNamedImportUsed(sourceFile, 'mongooseAdapter');
|
|
172
|
-
expect(isUsed).toBe(false);
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
describe('cleanupOrphanedImports', ()=>{
|
|
176
|
-
it('removes unused imports', ()=>{
|
|
177
|
-
const project = new Project({
|
|
178
|
-
useInMemoryFileSystem: true
|
|
179
|
-
});
|
|
180
|
-
const sourceFile = project.createSourceFile('test.ts', `import { mongooseAdapter } from '@payloadcms/db-mongodb'
|
|
181
|
-
import { postgresAdapter } from '@payloadcms/db-postgres'
|
|
182
|
-
|
|
183
|
-
export default buildConfig({
|
|
184
|
-
db: postgresAdapter({ url: '' })
|
|
185
|
-
})`);
|
|
186
|
-
const result = cleanupOrphanedImports({
|
|
187
|
-
sourceFile,
|
|
188
|
-
moduleSpecifier: '@payloadcms/db-mongodb',
|
|
189
|
-
importNames: [
|
|
190
|
-
'mongooseAdapter'
|
|
191
|
-
]
|
|
192
|
-
});
|
|
193
|
-
expect(result.removed).toEqual([
|
|
194
|
-
'mongooseAdapter'
|
|
195
|
-
]);
|
|
196
|
-
expect(result.kept).toEqual([]);
|
|
197
|
-
const imports = result.sourceFile.getImportDeclarations();
|
|
198
|
-
expect(imports).toHaveLength(1);
|
|
199
|
-
expect(imports[0].getModuleSpecifierValue()).toBe('@payloadcms/db-postgres');
|
|
200
|
-
});
|
|
201
|
-
it('keeps used imports', ()=>{
|
|
202
|
-
const project = new Project({
|
|
203
|
-
useInMemoryFileSystem: true
|
|
204
|
-
});
|
|
205
|
-
const sourceFile = project.createSourceFile('test.ts', `import { mongooseAdapter } from '@payloadcms/db-mongodb'
|
|
206
|
-
|
|
207
|
-
export default buildConfig({
|
|
208
|
-
db: mongooseAdapter({ url: '' })
|
|
209
|
-
})`);
|
|
210
|
-
const result = cleanupOrphanedImports({
|
|
211
|
-
sourceFile,
|
|
212
|
-
moduleSpecifier: '@payloadcms/db-mongodb',
|
|
213
|
-
importNames: [
|
|
214
|
-
'mongooseAdapter'
|
|
215
|
-
]
|
|
216
|
-
});
|
|
217
|
-
expect(result.removed).toEqual([]);
|
|
218
|
-
expect(result.kept).toEqual([
|
|
219
|
-
'mongooseAdapter'
|
|
220
|
-
]);
|
|
221
|
-
const imports = result.sourceFile.getImportDeclarations();
|
|
222
|
-
expect(imports).toHaveLength(1);
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
//# sourceMappingURL=utils.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/ast/utils.spec.ts"],"sourcesContent":["import { describe, it, expect } from 'vitest'\nimport { Project } from 'ts-morph'\nimport {\n addImportDeclaration,\n cleanupOrphanedImports,\n findImportDeclaration,\n isNamedImportUsed,\n removeImportDeclaration,\n removeNamedImports,\n} from './utils'\n\ndescribe('findImportDeclaration', () => {\n it('finds import by module specifier', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'test.ts',\n `import { buildConfig } from 'payload'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'`,\n )\n\n const result = findImportDeclaration({ sourceFile, moduleSpecifier: '@payloadcms/db-mongodb' })\n\n expect(result).toBeDefined()\n expect(result?.getModuleSpecifierValue()).toBe('@payloadcms/db-mongodb')\n })\n})\n\ndescribe('addImportDeclaration', () => {\n it('adds new import when not present', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile('test.ts', `import { buildConfig } from 'payload'`)\n\n const result = addImportDeclaration({\n sourceFile,\n moduleSpecifier: '@payloadcms/db-postgres',\n namedImports: ['postgresAdapter'],\n })\n\n const imports = result.getImportDeclarations()\n expect(imports).toHaveLength(2)\n expect(imports[1].getModuleSpecifierValue()).toBe('@payloadcms/db-postgres')\n expect(imports[1].getNamedImports()[0].getName()).toBe('postgresAdapter')\n })\n\n it('does not duplicate existing import', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'test.ts',\n `import { mongooseAdapter } from '@payloadcms/db-mongodb'`,\n )\n\n const result = addImportDeclaration({\n sourceFile,\n moduleSpecifier: '@payloadcms/db-mongodb',\n namedImports: ['mongooseAdapter'],\n })\n\n const imports = result.getImportDeclarations()\n expect(imports).toHaveLength(1)\n })\n\n it('adds named import to existing module import', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile('test.ts', `import { buildConfig } from 'payload'`)\n\n const result = addImportDeclaration({\n sourceFile,\n moduleSpecifier: 'payload',\n namedImports: ['Field'],\n })\n\n const imports = result.getImportDeclarations()\n expect(imports).toHaveLength(1)\n const namedImports = imports[0].getNamedImports().map((ni) => ni.getName())\n expect(namedImports).toContain('buildConfig')\n expect(namedImports).toContain('Field')\n })\n})\n\ndescribe('removeImportDeclaration', () => {\n it('removes import by module specifier', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'test.ts',\n `import { buildConfig } from 'payload'\nimport sharp from 'sharp'`,\n )\n\n const result = removeImportDeclaration({ sourceFile, moduleSpecifier: 'sharp' })\n\n expect(result.removedIndex).toBe(1)\n const imports = result.sourceFile.getImportDeclarations()\n expect(imports).toHaveLength(1)\n expect(imports[0].getModuleSpecifierValue()).toBe('payload')\n })\n\n it('returns undefined removedIndex when import not found', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile('test.ts', `import { buildConfig } from 'payload'`)\n\n const result = removeImportDeclaration({ sourceFile, moduleSpecifier: 'sharp' })\n\n expect(result.removedIndex).toBeUndefined()\n })\n})\n\ndescribe('removeNamedImports', () => {\n it('removes specific named imports', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'test.ts',\n `import { mongooseAdapter, SomeOtherType } from '@payloadcms/db-mongodb'`,\n )\n\n const importDecl = findImportDeclaration({\n sourceFile,\n moduleSpecifier: '@payloadcms/db-mongodb',\n })!\n\n const result = removeNamedImports({\n sourceFile,\n importDeclaration: importDecl,\n namedImportsToRemove: ['mongooseAdapter'],\n })\n\n expect(result.fullyRemoved).toBe(false)\n const imports = result.sourceFile.getImportDeclarations()\n expect(imports).toHaveLength(1)\n const namedImports = imports[0].getNamedImports().map((ni) => ni.getName())\n expect(namedImports).toEqual(['SomeOtherType'])\n })\n\n it('removes entire import when no named imports remain', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'test.ts',\n `import { buildConfig } from 'payload'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'`,\n )\n\n const importDecl = findImportDeclaration({\n sourceFile,\n moduleSpecifier: '@payloadcms/db-mongodb',\n })!\n\n const result = removeNamedImports({\n sourceFile,\n importDeclaration: importDecl,\n namedImportsToRemove: ['mongooseAdapter'],\n })\n\n expect(result.fullyRemoved).toBe(true)\n expect(result.index).toBe(1)\n const imports = result.sourceFile.getImportDeclarations()\n expect(imports).toHaveLength(1)\n expect(imports[0].getModuleSpecifierValue()).toBe('payload')\n })\n})\n\ndescribe('isNamedImportUsed', () => {\n it('detects used import in code', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'test.ts',\n `import { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: '' })\n})`,\n )\n\n const isUsed = isNamedImportUsed(sourceFile, 'mongooseAdapter')\n\n expect(isUsed).toBe(true)\n })\n\n it('detects unused import', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'test.ts',\n `import { mongooseAdapter } from '@payloadcms/db-mongodb'\nimport { postgresAdapter } from '@payloadcms/db-postgres'\n\nexport default buildConfig({\n db: postgresAdapter({ url: '' })\n})`,\n )\n\n const isUsed = isNamedImportUsed(sourceFile, 'mongooseAdapter')\n\n expect(isUsed).toBe(false)\n })\n})\n\ndescribe('cleanupOrphanedImports', () => {\n it('removes unused imports', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'test.ts',\n `import { mongooseAdapter } from '@payloadcms/db-mongodb'\nimport { postgresAdapter } from '@payloadcms/db-postgres'\n\nexport default buildConfig({\n db: postgresAdapter({ url: '' })\n})`,\n )\n\n const result = cleanupOrphanedImports({\n sourceFile,\n moduleSpecifier: '@payloadcms/db-mongodb',\n importNames: ['mongooseAdapter'],\n })\n\n expect(result.removed).toEqual(['mongooseAdapter'])\n expect(result.kept).toEqual([])\n const imports = result.sourceFile.getImportDeclarations()\n expect(imports).toHaveLength(1)\n expect(imports[0].getModuleSpecifierValue()).toBe('@payloadcms/db-postgres')\n })\n\n it('keeps used imports', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'test.ts',\n `import { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: '' })\n})`,\n )\n\n const result = cleanupOrphanedImports({\n sourceFile,\n moduleSpecifier: '@payloadcms/db-mongodb',\n importNames: ['mongooseAdapter'],\n })\n\n expect(result.removed).toEqual([])\n expect(result.kept).toEqual(['mongooseAdapter'])\n const imports = result.sourceFile.getImportDeclarations()\n expect(imports).toHaveLength(1)\n })\n})\n"],"names":["describe","it","expect","Project","addImportDeclaration","cleanupOrphanedImports","findImportDeclaration","isNamedImportUsed","removeImportDeclaration","removeNamedImports","project","useInMemoryFileSystem","sourceFile","createSourceFile","result","moduleSpecifier","toBeDefined","getModuleSpecifierValue","toBe","namedImports","imports","getImportDeclarations","toHaveLength","getNamedImports","getName","map","ni","toContain","removedIndex","toBeUndefined","importDecl","importDeclaration","namedImportsToRemove","fullyRemoved","toEqual","index","isUsed","importNames","removed","kept"],"mappings":"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"}
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import fse from 'fs-extra';
|
|
3
|
-
import globby from 'globby';
|
|
4
|
-
import * as os from 'node:os';
|
|
5
|
-
import path from 'path';
|
|
6
|
-
import { afterEach, beforeAll, beforeEach, describe, expect, it, vitest } from 'vitest';
|
|
7
|
-
import { createProject, updatePackageJSONDependencies } from './create-project.js';
|
|
8
|
-
import { getValidTemplates } from './templates.js';
|
|
9
|
-
describe('createProject', ()=>{
|
|
10
|
-
let projectDir;
|
|
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
|
-
});
|
|
19
|
-
afterEach(()=>{
|
|
20
|
-
if (fse.existsSync(projectDir)) {
|
|
21
|
-
fse.rmSync(projectDir, {
|
|
22
|
-
recursive: true
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
describe('#createProject', ()=>{
|
|
27
|
-
const args = {
|
|
28
|
-
_: [
|
|
29
|
-
'project-name'
|
|
30
|
-
],
|
|
31
|
-
'--db': 'mongodb',
|
|
32
|
-
'--local-template': 'blank',
|
|
33
|
-
'--no-deps': true
|
|
34
|
-
};
|
|
35
|
-
const packageManager = 'yarn';
|
|
36
|
-
it('creates plugin template', async ()=>{
|
|
37
|
-
const projectName = 'plugin';
|
|
38
|
-
const template = {
|
|
39
|
-
name: 'plugin',
|
|
40
|
-
type: 'plugin',
|
|
41
|
-
description: 'Template for creating a Payload plugin',
|
|
42
|
-
url: 'https://github.com/payloadcms/payload/templates/plugin'
|
|
43
|
-
};
|
|
44
|
-
await createProject({
|
|
45
|
-
cliArgs: {
|
|
46
|
-
...args,
|
|
47
|
-
'--local-template': 'plugin'
|
|
48
|
-
},
|
|
49
|
-
packageManager,
|
|
50
|
-
projectDir,
|
|
51
|
-
projectName,
|
|
52
|
-
template
|
|
53
|
-
});
|
|
54
|
-
const packageJsonPath = path.resolve(projectDir, 'package.json');
|
|
55
|
-
const packageJson = fse.readJsonSync(packageJsonPath);
|
|
56
|
-
// Check package name and description
|
|
57
|
-
expect(packageJson.name).toStrictEqual(projectName);
|
|
58
|
-
});
|
|
59
|
-
it('updates project name in plugin template importMap file', async ()=>{
|
|
60
|
-
const projectName = 'my-custom-plugin';
|
|
61
|
-
const template = {
|
|
62
|
-
name: 'plugin',
|
|
63
|
-
type: 'plugin',
|
|
64
|
-
description: 'Template for creating a Payload plugin',
|
|
65
|
-
url: 'https://github.com/payloadcms/payload/templates/plugin'
|
|
66
|
-
};
|
|
67
|
-
await createProject({
|
|
68
|
-
cliArgs: {
|
|
69
|
-
...args,
|
|
70
|
-
'--local-template': 'plugin'
|
|
71
|
-
},
|
|
72
|
-
packageManager,
|
|
73
|
-
projectDir,
|
|
74
|
-
projectName,
|
|
75
|
-
template
|
|
76
|
-
});
|
|
77
|
-
const importMapPath = path.resolve(projectDir, './dev/app/(payload)/admin/importMap.js');
|
|
78
|
-
const importMapFile = fse.readFileSync(importMapPath, 'utf-8');
|
|
79
|
-
expect(importMapFile).not.toContain('plugin-package-name-placeholder');
|
|
80
|
-
expect(importMapFile).toContain('my-custom-plugin');
|
|
81
|
-
});
|
|
82
|
-
it('creates example', async ()=>{
|
|
83
|
-
const projectName = 'custom-server-example';
|
|
84
|
-
const example = {
|
|
85
|
-
name: 'custom-server',
|
|
86
|
-
url: 'https://github.com/payloadcms/payload/examples/custom-server#3.x'
|
|
87
|
-
};
|
|
88
|
-
await createProject({
|
|
89
|
-
cliArgs: {
|
|
90
|
-
...args,
|
|
91
|
-
'--local-template': undefined,
|
|
92
|
-
'--local-example': 'custom-server'
|
|
93
|
-
},
|
|
94
|
-
packageManager,
|
|
95
|
-
projectDir,
|
|
96
|
-
projectName,
|
|
97
|
-
example
|
|
98
|
-
});
|
|
99
|
-
const packageJsonPath = path.resolve(projectDir, 'package.json');
|
|
100
|
-
const packageJson = fse.readJsonSync(packageJsonPath);
|
|
101
|
-
// Check package name and description
|
|
102
|
-
expect(packageJson.name).toStrictEqual(projectName);
|
|
103
|
-
}, 90_000);
|
|
104
|
-
describe('creates project from template', ()=>{
|
|
105
|
-
const templates = getValidTemplates();
|
|
106
|
-
it.each([
|
|
107
|
-
[
|
|
108
|
-
'blank',
|
|
109
|
-
'mongodb'
|
|
110
|
-
],
|
|
111
|
-
[
|
|
112
|
-
'blank',
|
|
113
|
-
'postgres'
|
|
114
|
-
]
|
|
115
|
-
])('update config and deps: %s, %s', async (templateName, db)=>{
|
|
116
|
-
const projectName = 'starter-project';
|
|
117
|
-
const template = templates.find((t)=>t.name === templateName);
|
|
118
|
-
const cliArgs = {
|
|
119
|
-
...args,
|
|
120
|
-
'--db': db,
|
|
121
|
-
'--local-template': templateName
|
|
122
|
-
};
|
|
123
|
-
await createProject({
|
|
124
|
-
cliArgs,
|
|
125
|
-
dbDetails: {
|
|
126
|
-
type: db,
|
|
127
|
-
dbUri: `${db}://localhost:27017/create-project-test`
|
|
128
|
-
},
|
|
129
|
-
packageManager,
|
|
130
|
-
projectDir,
|
|
131
|
-
projectName,
|
|
132
|
-
template: template
|
|
133
|
-
});
|
|
134
|
-
const packageJsonPath = path.resolve(projectDir, 'package.json');
|
|
135
|
-
const packageJson = fse.readJsonSync(packageJsonPath);
|
|
136
|
-
// Verify git was initialized
|
|
137
|
-
expect(fse.existsSync(path.resolve(projectDir, '.git'))).toBe(true);
|
|
138
|
-
// Should only have one db adapter
|
|
139
|
-
expect(Object.keys(packageJson.dependencies).filter((n)=>n.startsWith('@payloadcms/db-'))).toHaveLength(1);
|
|
140
|
-
const payloadConfigPath = (await globby('**/payload.config.ts', {
|
|
141
|
-
absolute: true,
|
|
142
|
-
cwd: projectDir
|
|
143
|
-
}))?.[0];
|
|
144
|
-
const content = fse.readFileSync(payloadConfigPath, 'utf-8');
|
|
145
|
-
// Check payload.config.ts doesn't have placeholder comments
|
|
146
|
-
expect(content).not.toContain('// database-adapter-import');
|
|
147
|
-
expect(content).not.toContain('// database-adapter-config-start');
|
|
148
|
-
expect(content).not.toContain('// database-adapter-config-end');
|
|
149
|
-
// Verify correct adapter import and usage based on db type
|
|
150
|
-
if (db === 'mongodb') {
|
|
151
|
-
expect(content).toContain("import { mongooseAdapter } from '@payloadcms/db-mongodb'");
|
|
152
|
-
expect(content).toContain('mongooseAdapter');
|
|
153
|
-
} else if (db === 'postgres') {
|
|
154
|
-
expect(content).toContain("import { postgresAdapter } from '@payloadcms/db-postgres'");
|
|
155
|
-
expect(content).toContain('postgresAdapter');
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
describe('updates package.json', ()=>{
|
|
160
|
-
it('updates package name and bumps workspace versions', async ()=>{
|
|
161
|
-
const latestVersion = '3.0.0';
|
|
162
|
-
const initialJSON = {
|
|
163
|
-
name: 'test-project',
|
|
164
|
-
version: '1.0.0',
|
|
165
|
-
dependencies: {
|
|
166
|
-
'@payloadcms/db-mongodb': 'workspace:*',
|
|
167
|
-
payload: 'workspace:*',
|
|
168
|
-
'@payloadcms/ui': 'workspace:*'
|
|
169
|
-
}
|
|
170
|
-
};
|
|
171
|
-
const correctlyModifiedJSON = {
|
|
172
|
-
name: 'test-project',
|
|
173
|
-
version: '1.0.0',
|
|
174
|
-
dependencies: {
|
|
175
|
-
'@payloadcms/db-mongodb': `${latestVersion}`,
|
|
176
|
-
payload: `${latestVersion}`,
|
|
177
|
-
'@payloadcms/ui': `${latestVersion}`
|
|
178
|
-
}
|
|
179
|
-
};
|
|
180
|
-
updatePackageJSONDependencies({
|
|
181
|
-
latestVersion,
|
|
182
|
-
packageJson: initialJSON
|
|
183
|
-
});
|
|
184
|
-
expect(initialJSON).toEqual(correctlyModifiedJSON);
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
//# sourceMappingURL=create-project.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/create-project.spec.ts"],"sourcesContent":["import fs from 'fs'\nimport fse from 'fs-extra'\nimport globby from 'globby'\nimport * as os from 'node:os'\nimport path from 'path'\nimport { afterEach, beforeAll, beforeEach, describe, expect, it, vitest } from 'vitest'\nimport type { CliArgs, DbType, ProjectExample, ProjectTemplate } from '../types.js'\n\nimport { createProject, updatePackageJSONDependencies } from './create-project.js'\nimport { getValidTemplates } from './templates.js'\n\ndescribe('createProject', () => {\n let projectDir: string\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\n afterEach(() => {\n if (fse.existsSync(projectDir)) {\n fse.rmSync(projectDir, { recursive: true })\n }\n })\n\n describe('#createProject', () => {\n const args = {\n _: ['project-name'],\n '--db': 'mongodb',\n '--local-template': 'blank',\n '--no-deps': true,\n } as CliArgs\n const packageManager = 'yarn'\n\n it('creates plugin template', async () => {\n const projectName = 'plugin'\n const template: ProjectTemplate = {\n name: 'plugin',\n type: 'plugin',\n description: 'Template for creating a Payload plugin',\n url: 'https://github.com/payloadcms/payload/templates/plugin',\n }\n\n await createProject({\n cliArgs: { ...args, '--local-template': 'plugin' } as CliArgs,\n packageManager,\n projectDir,\n projectName,\n template,\n })\n\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n const packageJson = fse.readJsonSync(packageJsonPath)\n\n // Check package name and description\n expect(packageJson.name).toStrictEqual(projectName)\n })\n\n it('updates project name in plugin template importMap file', async () => {\n const projectName = 'my-custom-plugin'\n const template: ProjectTemplate = {\n name: 'plugin',\n type: 'plugin',\n description: 'Template for creating a Payload plugin',\n url: 'https://github.com/payloadcms/payload/templates/plugin',\n }\n\n await createProject({\n cliArgs: { ...args, '--local-template': 'plugin' } as CliArgs,\n packageManager,\n projectDir,\n projectName,\n template,\n })\n\n const importMapPath = path.resolve(projectDir, './dev/app/(payload)/admin/importMap.js')\n const importMapFile = fse.readFileSync(importMapPath, 'utf-8')\n\n expect(importMapFile).not.toContain('plugin-package-name-placeholder')\n expect(importMapFile).toContain('my-custom-plugin')\n })\n\n it('creates example', async () => {\n const projectName = 'custom-server-example'\n const example: ProjectExample = {\n name: 'custom-server',\n url: 'https://github.com/payloadcms/payload/examples/custom-server#3.x',\n }\n\n await createProject({\n cliArgs: {\n ...args,\n '--local-template': undefined,\n '--local-example': 'custom-server',\n } as CliArgs,\n packageManager,\n projectDir,\n projectName,\n example,\n })\n\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n const packageJson = fse.readJsonSync(packageJsonPath)\n\n // Check package name and description\n expect(packageJson.name).toStrictEqual(projectName)\n }, 90_000)\n\n describe('creates project from template', () => {\n const templates = getValidTemplates()\n\n it.each([\n ['blank', 'mongodb'],\n ['blank', 'postgres'],\n\n // TODO: Re-enable these once 3.0 is stable and templates updated\n // ['website', 'mongodb'],\n // ['website', 'postgres'],\n // ['ecommerce', 'mongodb'],\n // ['ecommerce', 'postgres'],\n ])('update config and deps: %s, %s', async (templateName, db) => {\n const projectName = 'starter-project'\n\n const template = templates.find((t) => t.name === templateName)\n\n const cliArgs = {\n ...args,\n '--db': db,\n '--local-template': templateName,\n } as CliArgs\n\n await createProject({\n cliArgs,\n dbDetails: {\n type: db as DbType,\n dbUri: `${db}://localhost:27017/create-project-test`,\n },\n packageManager,\n projectDir,\n projectName,\n template: template as ProjectTemplate,\n })\n\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n const packageJson = fse.readJsonSync(packageJsonPath)\n\n // Verify git was initialized\n expect(fse.existsSync(path.resolve(projectDir, '.git'))).toBe(true)\n\n // Should only have one db adapter\n expect(\n Object.keys(packageJson.dependencies).filter((n) => n.startsWith('@payloadcms/db-')),\n ).toHaveLength(1)\n\n const payloadConfigPath = (\n await globby('**/payload.config.ts', {\n absolute: true,\n cwd: projectDir,\n })\n )?.[0]\n\n const content = fse.readFileSync(payloadConfigPath, 'utf-8')\n\n // Check payload.config.ts doesn't have placeholder comments\n expect(content).not.toContain('// database-adapter-import')\n expect(content).not.toContain('// database-adapter-config-start')\n expect(content).not.toContain('// database-adapter-config-end')\n\n // Verify correct adapter import and usage based on db type\n if (db === 'mongodb') {\n expect(content).toContain(\"import { mongooseAdapter } from '@payloadcms/db-mongodb'\")\n expect(content).toContain('mongooseAdapter')\n } else if (db === 'postgres') {\n expect(content).toContain(\"import { postgresAdapter } from '@payloadcms/db-postgres'\")\n expect(content).toContain('postgresAdapter')\n }\n })\n })\n\n describe('updates package.json', () => {\n it('updates package name and bumps workspace versions', async () => {\n const latestVersion = '3.0.0'\n const initialJSON = {\n name: 'test-project',\n version: '1.0.0',\n dependencies: {\n '@payloadcms/db-mongodb': 'workspace:*',\n payload: 'workspace:*',\n '@payloadcms/ui': 'workspace:*',\n },\n }\n\n const correctlyModifiedJSON = {\n name: 'test-project',\n version: '1.0.0',\n dependencies: {\n '@payloadcms/db-mongodb': `${latestVersion}`,\n payload: `${latestVersion}`,\n '@payloadcms/ui': `${latestVersion}`,\n },\n }\n\n updatePackageJSONDependencies({\n latestVersion,\n packageJson: initialJSON,\n })\n\n expect(initialJSON).toEqual(correctlyModifiedJSON)\n })\n })\n })\n})\n"],"names":["fs","fse","globby","os","path","afterEach","beforeAll","beforeEach","describe","expect","it","vitest","createProject","updatePackageJSONDependencies","getValidTemplates","projectDir","console","log","fn","tempDirectory","realpathSync","tmpdir","Math","random","toString","substring","existsSync","rmSync","recursive","args","_","packageManager","projectName","template","name","type","description","url","cliArgs","packageJsonPath","resolve","packageJson","readJsonSync","toStrictEqual","importMapPath","importMapFile","readFileSync","not","toContain","example","undefined","templates","each","templateName","db","find","t","dbDetails","dbUri","toBe","Object","keys","dependencies","filter","n","startsWith","toHaveLength","payloadConfigPath","absolute","cwd","content","latestVersion","initialJSON","version","payload","correctlyModifiedJSON","toEqual"],"mappings":"AAAA,OAAOA,QAAQ,KAAI;AACnB,OAAOC,SAAS,WAAU;AAC1B,OAAOC,YAAY,SAAQ;AAC3B,YAAYC,QAAQ,UAAS;AAC7B,OAAOC,UAAU,OAAM;AACvB,SAASC,SAAS,EAAEC,SAAS,EAAEC,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,MAAM,QAAQ,SAAQ;AAGvF,SAASC,aAAa,EAAEC,6BAA6B,QAAQ,sBAAqB;AAClF,SAASC,iBAAiB,QAAQ,iBAAgB;AAElDN,SAAS,iBAAiB;IACxB,IAAIO;IAEJT,UAAU;QACR,sCAAsC;QACtCU,QAAQC,GAAG,GAAGN,OAAOO,EAAE;IACzB;IAEAX,WAAW;QACT,MAAMY,gBAAgBnB,GAAGoB,YAAY,CAACjB,GAAGkB,MAAM;QAC/CN,aAAa,GAAGI,cAAc,CAAC,EAAEG,KAAKC,MAAM,GAAGC,QAAQ,CAAC,IAAIC,SAAS,CAAC,IAAI;IAC5E;IAEApB,UAAU;QACR,IAAIJ,IAAIyB,UAAU,CAACX,aAAa;YAC9Bd,IAAI0B,MAAM,CAACZ,YAAY;gBAAEa,WAAW;YAAK;QAC3C;IACF;IAEApB,SAAS,kBAAkB;QACzB,MAAMqB,OAAO;YACXC,GAAG;gBAAC;aAAe;YACnB,QAAQ;YACR,oBAAoB;YACpB,aAAa;QACf;QACA,MAAMC,iBAAiB;QAEvBrB,GAAG,2BAA2B;YAC5B,MAAMsB,cAAc;YACpB,MAAMC,WAA4B;gBAChCC,MAAM;gBACNC,MAAM;gBACNC,aAAa;gBACbC,KAAK;YACP;YAEA,MAAMzB,cAAc;gBAClB0B,SAAS;oBAAE,GAAGT,IAAI;oBAAE,oBAAoB;gBAAS;gBACjDE;gBACAhB;gBACAiB;gBACAC;YACF;YAEA,MAAMM,kBAAkBnC,KAAKoC,OAAO,CAACzB,YAAY;YACjD,MAAM0B,cAAcxC,IAAIyC,YAAY,CAACH;YAErC,qCAAqC;YACrC9B,OAAOgC,YAAYP,IAAI,EAAES,aAAa,CAACX;QACzC;QAEAtB,GAAG,0DAA0D;YAC3D,MAAMsB,cAAc;YACpB,MAAMC,WAA4B;gBAChCC,MAAM;gBACNC,MAAM;gBACNC,aAAa;gBACbC,KAAK;YACP;YAEA,MAAMzB,cAAc;gBAClB0B,SAAS;oBAAE,GAAGT,IAAI;oBAAE,oBAAoB;gBAAS;gBACjDE;gBACAhB;gBACAiB;gBACAC;YACF;YAEA,MAAMW,gBAAgBxC,KAAKoC,OAAO,CAACzB,YAAY;YAC/C,MAAM8B,gBAAgB5C,IAAI6C,YAAY,CAACF,eAAe;YAEtDnC,OAAOoC,eAAeE,GAAG,CAACC,SAAS,CAAC;YACpCvC,OAAOoC,eAAeG,SAAS,CAAC;QAClC;QAEAtC,GAAG,mBAAmB;YACpB,MAAMsB,cAAc;YACpB,MAAMiB,UAA0B;gBAC9Bf,MAAM;gBACNG,KAAK;YACP;YAEA,MAAMzB,cAAc;gBAClB0B,SAAS;oBACP,GAAGT,IAAI;oBACP,oBAAoBqB;oBACpB,mBAAmB;gBACrB;gBACAnB;gBACAhB;gBACAiB;gBACAiB;YACF;YAEA,MAAMV,kBAAkBnC,KAAKoC,OAAO,CAACzB,YAAY;YACjD,MAAM0B,cAAcxC,IAAIyC,YAAY,CAACH;YAErC,qCAAqC;YACrC9B,OAAOgC,YAAYP,IAAI,EAAES,aAAa,CAACX;QACzC,GAAG;QAEHxB,SAAS,iCAAiC;YACxC,MAAM2C,YAAYrC;YAElBJ,GAAG0C,IAAI,CAAC;gBACN;oBAAC;oBAAS;iBAAU;gBACpB;oBAAC;oBAAS;iBAAW;aAOtB,EAAE,kCAAkC,OAAOC,cAAcC;gBACxD,MAAMtB,cAAc;gBAEpB,MAAMC,WAAWkB,UAAUI,IAAI,CAAC,CAACC,IAAMA,EAAEtB,IAAI,KAAKmB;gBAElD,MAAMf,UAAU;oBACd,GAAGT,IAAI;oBACP,QAAQyB;oBACR,oBAAoBD;gBACtB;gBAEA,MAAMzC,cAAc;oBAClB0B;oBACAmB,WAAW;wBACTtB,MAAMmB;wBACNI,OAAO,GAAGJ,GAAG,sCAAsC,CAAC;oBACtD;oBACAvB;oBACAhB;oBACAiB;oBACAC,UAAUA;gBACZ;gBAEA,MAAMM,kBAAkBnC,KAAKoC,OAAO,CAACzB,YAAY;gBACjD,MAAM0B,cAAcxC,IAAIyC,YAAY,CAACH;gBAErC,6BAA6B;gBAC7B9B,OAAOR,IAAIyB,UAAU,CAACtB,KAAKoC,OAAO,CAACzB,YAAY,UAAU4C,IAAI,CAAC;gBAE9D,kCAAkC;gBAClClD,OACEmD,OAAOC,IAAI,CAACpB,YAAYqB,YAAY,EAAEC,MAAM,CAAC,CAACC,IAAMA,EAAEC,UAAU,CAAC,qBACjEC,YAAY,CAAC;gBAEf,MAAMC,oBACJ,CAAA,MAAMjE,OAAO,wBAAwB;oBACnCkE,UAAU;oBACVC,KAAKtD;gBACP,EAAC,GACA,CAAC,EAAE;gBAEN,MAAMuD,UAAUrE,IAAI6C,YAAY,CAACqB,mBAAmB;gBAEpD,4DAA4D;gBAC5D1D,OAAO6D,SAASvB,GAAG,CAACC,SAAS,CAAC;gBAC9BvC,OAAO6D,SAASvB,GAAG,CAACC,SAAS,CAAC;gBAC9BvC,OAAO6D,SAASvB,GAAG,CAACC,SAAS,CAAC;gBAE9B,2DAA2D;gBAC3D,IAAIM,OAAO,WAAW;oBACpB7C,OAAO6D,SAAStB,SAAS,CAAC;oBAC1BvC,OAAO6D,SAAStB,SAAS,CAAC;gBAC5B,OAAO,IAAIM,OAAO,YAAY;oBAC5B7C,OAAO6D,SAAStB,SAAS,CAAC;oBAC1BvC,OAAO6D,SAAStB,SAAS,CAAC;gBAC5B;YACF;QACF;QAEAxC,SAAS,wBAAwB;YAC/BE,GAAG,qDAAqD;gBACtD,MAAM6D,gBAAgB;gBACtB,MAAMC,cAAc;oBAClBtC,MAAM;oBACNuC,SAAS;oBACTX,cAAc;wBACZ,0BAA0B;wBAC1BY,SAAS;wBACT,kBAAkB;oBACpB;gBACF;gBAEA,MAAMC,wBAAwB;oBAC5BzC,MAAM;oBACNuC,SAAS;oBACTX,cAAc;wBACZ,0BAA0B,GAAGS,eAAe;wBAC5CG,SAAS,GAAGH,eAAe;wBAC3B,kBAAkB,GAAGA,eAAe;oBACtC;gBACF;gBAEA1D,8BAA8B;oBAC5B0D;oBACA9B,aAAa+B;gBACf;gBAEA/D,OAAO+D,aAAaI,OAAO,CAACD;YAC9B;QACF;IACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"download-skill.d.ts","sourceRoot":"","sources":["../../src/lib/download-skill.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAK5C,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoChB"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import fse from 'fs-extra';
|
|
2
|
-
import { Readable } from 'node:stream';
|
|
3
|
-
import { pipeline } from 'node:stream/promises';
|
|
4
|
-
import path from 'path';
|
|
5
|
-
import { x } from 'tar';
|
|
6
|
-
import { debug as debugLog } from '../utils/log.js';
|
|
7
|
-
import { getSkillsDir } from './select-agent.js';
|
|
8
|
-
export async function downloadSkill(args) {
|
|
9
|
-
const { agentType, branch = '3.x', debug, projectDir } = args;
|
|
10
|
-
const skillsDir = getSkillsDir(agentType);
|
|
11
|
-
const destDir = path.join(projectDir, skillsDir, 'payload');
|
|
12
|
-
await fse.mkdirp(destDir);
|
|
13
|
-
const url = `https://codeload.github.com/payloadcms/payload/tar.gz/${branch}`;
|
|
14
|
-
const filter = `payload-${branch.replace(/^v/, '').replaceAll('/', '-')}/tools/claude-plugin/skills/payload/`;
|
|
15
|
-
if (debug) {
|
|
16
|
-
debugLog(`Downloading skill for agent: ${agentType}`);
|
|
17
|
-
debugLog(`Skill codeload url: ${url}`);
|
|
18
|
-
debugLog(`Skill filter: ${filter}`);
|
|
19
|
-
debugLog(`Skill destination: ${destDir}`);
|
|
20
|
-
}
|
|
21
|
-
const res = await fetch(url);
|
|
22
|
-
if (!res.ok) {
|
|
23
|
-
throw new Error(`Failed to download skill: ${res.status} ${res.statusText} from ${url}`);
|
|
24
|
-
}
|
|
25
|
-
if (!res.body) {
|
|
26
|
-
throw new Error(`Failed to download skill: empty response from ${url}`);
|
|
27
|
-
}
|
|
28
|
-
await pipeline(Readable.from(res.body), x({
|
|
29
|
-
cwd: destDir,
|
|
30
|
-
filter: (p)=>p.includes(filter),
|
|
31
|
-
strip: filter.split('/').length - 1
|
|
32
|
-
}));
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
//# sourceMappingURL=download-skill.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/download-skill.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport { Readable } from 'node:stream'\nimport { pipeline } from 'node:stream/promises'\nimport path from 'path'\nimport { x } from 'tar'\n\nimport type { AgentType } from '../types.js'\n\nimport { debug as debugLog } from '../utils/log.js'\nimport { getSkillsDir } from './select-agent.js'\n\nexport async function downloadSkill(args: {\n agentType: AgentType\n branch?: string\n debug?: boolean\n projectDir: string\n}): Promise<void> {\n const { agentType, branch = '3.x', debug, projectDir } = args\n\n const skillsDir = getSkillsDir(agentType)\n const destDir = path.join(projectDir, skillsDir, 'payload')\n\n await fse.mkdirp(destDir)\n\n const url = `https://codeload.github.com/payloadcms/payload/tar.gz/${branch}`\n const filter = `payload-${branch.replace(/^v/, '').replaceAll('/', '-')}/tools/claude-plugin/skills/payload/`\n\n if (debug) {\n debugLog(`Downloading skill for agent: ${agentType}`)\n debugLog(`Skill codeload url: ${url}`)\n debugLog(`Skill filter: ${filter}`)\n debugLog(`Skill destination: ${destDir}`)\n }\n\n const res = await fetch(url)\n\n if (!res.ok) {\n throw new Error(`Failed to download skill: ${res.status} ${res.statusText} from ${url}`)\n }\n\n if (!res.body) {\n throw new Error(`Failed to download skill: empty response from ${url}`)\n }\n\n await pipeline(\n Readable.from(res.body as unknown as NodeJS.ReadableStream),\n x({\n cwd: destDir,\n filter: (p) => p.includes(filter),\n strip: filter.split('/').length - 1,\n }),\n )\n}\n"],"names":["fse","Readable","pipeline","path","x","debug","debugLog","getSkillsDir","downloadSkill","args","agentType","branch","projectDir","skillsDir","destDir","join","mkdirp","url","filter","replace","replaceAll","res","fetch","ok","Error","status","statusText","body","from","cwd","p","includes","strip","split","length"],"mappings":"AAAA,OAAOA,SAAS,WAAU;AAC1B,SAASC,QAAQ,QAAQ,cAAa;AACtC,SAASC,QAAQ,QAAQ,uBAAsB;AAC/C,OAAOC,UAAU,OAAM;AACvB,SAASC,CAAC,QAAQ,MAAK;AAIvB,SAASC,SAASC,QAAQ,QAAQ,kBAAiB;AACnD,SAASC,YAAY,QAAQ,oBAAmB;AAEhD,OAAO,eAAeC,cAAcC,IAKnC;IACC,MAAM,EAAEC,SAAS,EAAEC,SAAS,KAAK,EAAEN,KAAK,EAAEO,UAAU,EAAE,GAAGH;IAEzD,MAAMI,YAAYN,aAAaG;IAC/B,MAAMI,UAAUX,KAAKY,IAAI,CAACH,YAAYC,WAAW;IAEjD,MAAMb,IAAIgB,MAAM,CAACF;IAEjB,MAAMG,MAAM,CAAC,sDAAsD,EAAEN,QAAQ;IAC7E,MAAMO,SAAS,CAAC,QAAQ,EAAEP,OAAOQ,OAAO,CAAC,MAAM,IAAIC,UAAU,CAAC,KAAK,KAAK,oCAAoC,CAAC;IAE7G,IAAIf,OAAO;QACTC,SAAS,CAAC,6BAA6B,EAAEI,WAAW;QACpDJ,SAAS,CAAC,oBAAoB,EAAEW,KAAK;QACrCX,SAAS,CAAC,cAAc,EAAEY,QAAQ;QAClCZ,SAAS,CAAC,mBAAmB,EAAEQ,SAAS;IAC1C;IAEA,MAAMO,MAAM,MAAMC,MAAML;IAExB,IAAI,CAACI,IAAIE,EAAE,EAAE;QACX,MAAM,IAAIC,MAAM,CAAC,0BAA0B,EAAEH,IAAII,MAAM,CAAC,CAAC,EAAEJ,IAAIK,UAAU,CAAC,MAAM,EAAET,KAAK;IACzF;IAEA,IAAI,CAACI,IAAIM,IAAI,EAAE;QACb,MAAM,IAAIH,MAAM,CAAC,8CAA8C,EAAEP,KAAK;IACxE;IAEA,MAAMf,SACJD,SAAS2B,IAAI,CAACP,IAAIM,IAAI,GACtBvB,EAAE;QACAyB,KAAKf;QACLI,QAAQ,CAACY,IAAMA,EAAEC,QAAQ,CAACb;QAC1Bc,OAAOd,OAAOe,KAAK,CAAC,KAAKC,MAAM,GAAG;IACpC;AAEJ"}
|
|
@@ -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
|