create-payload-app 4.0.0-internal.e7d4ebc → 4.0.0-internal.ea6e8f8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/commands.d.ts +4 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +5 -0
- package/dist/commands.js.map +1 -0
- package/dist/lib/agent-config.d.ts +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/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/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 +56 -29
- 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 +5 -0
- package/dist/lib/init-next.d.ts.map +1 -1
- package/dist/lib/init-next.js +19 -37
- 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 +6 -0
- package/dist/lib/templates.js.map +1 -1
- package/dist/lib/update-payload-in-project.d.ts +18 -3
- package/dist/lib/update-payload-in-project.d.ts.map +1 -1
- package/dist/lib/update-payload-in-project.js +98 -18
- package/dist/lib/update-payload-in-project.js.map +1 -1
- package/dist/main.d.ts +20 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +121 -31
- 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)/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 +15 -0
- 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 +2 -3
- package/dist/template/src/payload.config.ts +5 -3
- 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 +22 -3
- 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 +8 -6
- package/dist/utils/messages.js.map +1 -1
- package/package.json +6 -6
- 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/resolvePackageVersion.spec.js +0 -77
- package/dist/utils/resolvePackageVersion.spec.js.map +0 -1
- /package/dist/{template/src/app/(payload)/custom.scss → template-tanstack/routes/_payload/custom.css} +0 -0
|
@@ -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#main'
|
|
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#main',\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":"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"}
|
|
@@ -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 = 'main', 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 = 'main', 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,MAAM,EAAEN,KAAK,EAAEO,UAAU,EAAE,GAAGH;IAE1D,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
|
|
@@ -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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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { AgentType, CliArgs } from '../types.js';
|
|
2
|
-
type AgentChoice = {
|
|
3
|
-
/** File to write at project root pointing agents to the skill */
|
|
4
|
-
configFile: 'AGENTS.md' | 'CLAUDE.md';
|
|
5
|
-
label: string;
|
|
6
|
-
skillsDir: string;
|
|
7
|
-
value: AgentType;
|
|
8
|
-
};
|
|
9
|
-
export declare const agentChoices: AgentChoice[];
|
|
10
|
-
export declare function getAgentChoice(agentType: AgentType): AgentChoice;
|
|
11
|
-
export declare function getSkillsDir(agentType: AgentType): string;
|
|
12
|
-
export declare function selectAgent(args: {
|
|
13
|
-
cliArgs: CliArgs;
|
|
14
|
-
}): Promise<AgentType | undefined>;
|
|
15
|
-
export {};
|
|
16
|
-
//# sourceMappingURL=select-agent.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select-agent.d.ts","sourceRoot":"","sources":["../../src/lib/select-agent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErD,KAAK,WAAW,GAAG;IACjB,iEAAiE;IACjE,UAAU,EAAE,WAAW,GAAG,WAAW,CAAA;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,SAAS,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,WAAW,EAIrC,CAAA;AAID,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW,CAMhE;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAEzD;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAwC5F"}
|
package/dist/lib/select-agent.js
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import * as p from '@clack/prompts';
|
|
2
|
-
export const agentChoices = [
|
|
3
|
-
{
|
|
4
|
-
configFile: 'CLAUDE.md',
|
|
5
|
-
label: 'Claude Code',
|
|
6
|
-
skillsDir: '.claude/skills',
|
|
7
|
-
value: 'claude'
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
configFile: 'AGENTS.md',
|
|
11
|
-
label: 'Codex',
|
|
12
|
-
skillsDir: '.agents/skills',
|
|
13
|
-
value: 'codex'
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
configFile: 'AGENTS.md',
|
|
17
|
-
label: 'Cursor',
|
|
18
|
-
skillsDir: '.agents/skills',
|
|
19
|
-
value: 'cursor'
|
|
20
|
-
}
|
|
21
|
-
];
|
|
22
|
-
const validAgentValues = agentChoices.map((c)=>c.value);
|
|
23
|
-
export function getAgentChoice(agentType) {
|
|
24
|
-
const choice = agentChoices.find((c)=>c.value === agentType);
|
|
25
|
-
if (!choice) {
|
|
26
|
-
throw new Error(`Unknown agent type: ${agentType}`);
|
|
27
|
-
}
|
|
28
|
-
return choice;
|
|
29
|
-
}
|
|
30
|
-
export function getSkillsDir(agentType) {
|
|
31
|
-
return getAgentChoice(agentType).skillsDir;
|
|
32
|
-
}
|
|
33
|
-
export async function selectAgent(args) {
|
|
34
|
-
const { cliArgs } = args;
|
|
35
|
-
if (cliArgs['--no-agent']) {
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
38
|
-
if (cliArgs['--agent']) {
|
|
39
|
-
const value = cliArgs['--agent'];
|
|
40
|
-
if (!validAgentValues.includes(value)) {
|
|
41
|
-
throw new Error(`Invalid agent type: ${cliArgs['--agent']}. Valid types are: ${validAgentValues.join(', ')}`);
|
|
42
|
-
}
|
|
43
|
-
return value;
|
|
44
|
-
}
|
|
45
|
-
const selected = await p.select({
|
|
46
|
-
message: 'Select a coding agent to install the Payload skill for',
|
|
47
|
-
options: [
|
|
48
|
-
...agentChoices.map((choice)=>({
|
|
49
|
-
label: choice.label,
|
|
50
|
-
value: choice.value
|
|
51
|
-
})),
|
|
52
|
-
{
|
|
53
|
-
label: 'None',
|
|
54
|
-
value: 'none'
|
|
55
|
-
}
|
|
56
|
-
]
|
|
57
|
-
});
|
|
58
|
-
if (p.isCancel(selected)) {
|
|
59
|
-
process.exit(0);
|
|
60
|
-
}
|
|
61
|
-
if (selected === 'none') {
|
|
62
|
-
return undefined;
|
|
63
|
-
}
|
|
64
|
-
return selected;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
//# sourceMappingURL=select-agent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/select-agent.ts"],"sourcesContent":["import * as p from '@clack/prompts'\n\nimport type { AgentType, CliArgs } from '../types.js'\n\ntype AgentChoice = {\n /** File to write at project root pointing agents to the skill */\n configFile: 'AGENTS.md' | 'CLAUDE.md'\n label: string\n skillsDir: string\n value: AgentType\n}\n\nexport const agentChoices: AgentChoice[] = [\n { configFile: 'CLAUDE.md', label: 'Claude Code', skillsDir: '.claude/skills', value: 'claude' },\n { configFile: 'AGENTS.md', label: 'Codex', skillsDir: '.agents/skills', value: 'codex' },\n { configFile: 'AGENTS.md', label: 'Cursor', skillsDir: '.agents/skills', value: 'cursor' },\n]\n\nconst validAgentValues = agentChoices.map((c) => c.value)\n\nexport function getAgentChoice(agentType: AgentType): AgentChoice {\n const choice = agentChoices.find((c) => c.value === agentType)\n if (!choice) {\n throw new Error(`Unknown agent type: ${agentType}`)\n }\n return choice\n}\n\nexport function getSkillsDir(agentType: AgentType): string {\n return getAgentChoice(agentType).skillsDir\n}\n\nexport async function selectAgent(args: { cliArgs: CliArgs }): Promise<AgentType | undefined> {\n const { cliArgs } = args\n\n if (cliArgs['--no-agent']) {\n return undefined\n }\n\n if (cliArgs['--agent']) {\n const value = cliArgs['--agent'] as AgentType\n if (!validAgentValues.includes(value)) {\n throw new Error(\n `Invalid agent type: ${cliArgs['--agent']}. Valid types are: ${validAgentValues.join(', ')}`,\n )\n }\n return value\n }\n\n const selected = await p.select<\n { label: string; value: 'none' | AgentType }[],\n 'none' | AgentType\n >({\n message: 'Select a coding agent to install the Payload skill for',\n options: [\n ...agentChoices.map((choice) => ({\n label: choice.label,\n value: choice.value,\n })),\n { label: 'None', value: 'none' as const },\n ],\n })\n\n if (p.isCancel(selected)) {\n process.exit(0)\n }\n\n if (selected === 'none') {\n return undefined\n }\n\n return selected\n}\n"],"names":["p","agentChoices","configFile","label","skillsDir","value","validAgentValues","map","c","getAgentChoice","agentType","choice","find","Error","getSkillsDir","selectAgent","args","cliArgs","undefined","includes","join","selected","select","message","options","isCancel","process","exit"],"mappings":"AAAA,YAAYA,OAAO,iBAAgB;AAYnC,OAAO,MAAMC,eAA8B;IACzC;QAAEC,YAAY;QAAaC,OAAO;QAAeC,WAAW;QAAkBC,OAAO;IAAS;IAC9F;QAAEH,YAAY;QAAaC,OAAO;QAASC,WAAW;QAAkBC,OAAO;IAAQ;IACvF;QAAEH,YAAY;QAAaC,OAAO;QAAUC,WAAW;QAAkBC,OAAO;IAAS;CAC1F,CAAA;AAED,MAAMC,mBAAmBL,aAAaM,GAAG,CAAC,CAACC,IAAMA,EAAEH,KAAK;AAExD,OAAO,SAASI,eAAeC,SAAoB;IACjD,MAAMC,SAASV,aAAaW,IAAI,CAAC,CAACJ,IAAMA,EAAEH,KAAK,KAAKK;IACpD,IAAI,CAACC,QAAQ;QACX,MAAM,IAAIE,MAAM,CAAC,oBAAoB,EAAEH,WAAW;IACpD;IACA,OAAOC;AACT;AAEA,OAAO,SAASG,aAAaJ,SAAoB;IAC/C,OAAOD,eAAeC,WAAWN,SAAS;AAC5C;AAEA,OAAO,eAAeW,YAAYC,IAA0B;IAC1D,MAAM,EAAEC,OAAO,EAAE,GAAGD;IAEpB,IAAIC,OAAO,CAAC,aAAa,EAAE;QACzB,OAAOC;IACT;IAEA,IAAID,OAAO,CAAC,UAAU,EAAE;QACtB,MAAMZ,QAAQY,OAAO,CAAC,UAAU;QAChC,IAAI,CAACX,iBAAiBa,QAAQ,CAACd,QAAQ;YACrC,MAAM,IAAIQ,MACR,CAAC,oBAAoB,EAAEI,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAEX,iBAAiBc,IAAI,CAAC,OAAO;QAEhG;QACA,OAAOf;IACT;IAEA,MAAMgB,WAAW,MAAMrB,EAAEsB,MAAM,CAG7B;QACAC,SAAS;QACTC,SAAS;eACJvB,aAAaM,GAAG,CAAC,CAACI,SAAY,CAAA;oBAC/BR,OAAOQ,OAAOR,KAAK;oBACnBE,OAAOM,OAAON,KAAK;gBACrB,CAAA;YACA;gBAAEF,OAAO;gBAAQE,OAAO;YAAgB;SACzC;IACH;IAEA,IAAIL,EAAEyB,QAAQ,CAACJ,WAAW;QACxBK,QAAQC,IAAI,CAAC;IACf;IAEA,IAAIN,aAAa,QAAQ;QACvB,OAAOH;IACT;IAEA,OAAOG;AACT"}
|