create-payload-app 3.91.0-internal.c1569dc → 4.0.0-beta.1
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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure-payload-tsconfig.d.ts","sourceRoot":"","sources":["../../src/lib/configure-payload-tsconfig.ts"],"names":[],"mappings":"AAaA,wBAAsB,wBAAwB,CAAC,EAC7C,UAAU,EACV,iBAAiB,GAClB,EAAE;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BhB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { parse, stringify } from 'comment-json';
|
|
2
|
+
import fse from 'fs-extra';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { warning } from '../utils/log.js';
|
|
5
|
+
export async function configurePayloadTsConfig({ configPath, payloadConfigPath }) {
|
|
6
|
+
if (!await fse.pathExists(configPath)) {
|
|
7
|
+
warning('Could not find tsconfig.json to add @payload-config path.');
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const content = await fse.readFile(configPath, 'utf8');
|
|
11
|
+
const tsConfig = parse(content);
|
|
12
|
+
tsConfig.compilerOptions ??= {};
|
|
13
|
+
tsConfig.compilerOptions.paths ??= {};
|
|
14
|
+
if (tsConfig.compilerOptions.paths['@payload-config']) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const baseUrlPath = path.resolve(path.dirname(configPath), tsConfig.compilerOptions.baseUrl ?? '.');
|
|
18
|
+
const relativePayloadConfigPath = path.relative(baseUrlPath, payloadConfigPath).split(path.sep).join('/');
|
|
19
|
+
const payloadAliasPath = relativePayloadConfigPath.startsWith('.') ? relativePayloadConfigPath : `./${relativePayloadConfigPath}`;
|
|
20
|
+
tsConfig.compilerOptions.paths['@payload-config'] = [
|
|
21
|
+
payloadAliasPath
|
|
22
|
+
];
|
|
23
|
+
await fse.writeFile(configPath, stringify(tsConfig, null, 2), 'utf8');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=configure-payload-tsconfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/configure-payload-tsconfig.ts"],"sourcesContent":["import { parse, stringify } from 'comment-json'\nimport fse from 'fs-extra'\nimport path from 'node:path'\n\nimport { warning } from '../utils/log.js'\n\ntype TsConfig = {\n compilerOptions?: {\n baseUrl?: string\n paths?: Record<string, string[]>\n }\n}\n\nexport async function configurePayloadTsConfig({\n configPath,\n payloadConfigPath,\n}: {\n configPath: string\n payloadConfigPath: string\n}): Promise<void> {\n if (!(await fse.pathExists(configPath))) {\n warning('Could not find tsconfig.json to add @payload-config path.')\n return\n }\n\n const content = await fse.readFile(configPath, 'utf8')\n const tsConfig = parse(content) as TsConfig\n\n tsConfig.compilerOptions ??= {}\n tsConfig.compilerOptions.paths ??= {}\n\n if (tsConfig.compilerOptions.paths['@payload-config']) {\n return\n }\n\n const baseUrlPath = path.resolve(\n path.dirname(configPath),\n tsConfig.compilerOptions.baseUrl ?? '.',\n )\n const relativePayloadConfigPath = path\n .relative(baseUrlPath, payloadConfigPath)\n .split(path.sep)\n .join('/')\n const payloadAliasPath = relativePayloadConfigPath.startsWith('.')\n ? relativePayloadConfigPath\n : `./${relativePayloadConfigPath}`\n\n tsConfig.compilerOptions.paths['@payload-config'] = [payloadAliasPath]\n await fse.writeFile(configPath, stringify(tsConfig, null, 2), 'utf8')\n}\n"],"names":["parse","stringify","fse","path","warning","configurePayloadTsConfig","configPath","payloadConfigPath","pathExists","content","readFile","tsConfig","compilerOptions","paths","baseUrlPath","resolve","dirname","baseUrl","relativePayloadConfigPath","relative","split","sep","join","payloadAliasPath","startsWith","writeFile"],"mappings":"AAAA,SAASA,KAAK,EAAEC,SAAS,QAAQ,eAAc;AAC/C,OAAOC,SAAS,WAAU;AAC1B,OAAOC,UAAU,YAAW;AAE5B,SAASC,OAAO,QAAQ,kBAAiB;AASzC,OAAO,eAAeC,yBAAyB,EAC7CC,UAAU,EACVC,iBAAiB,EAIlB;IACC,IAAI,CAAE,MAAML,IAAIM,UAAU,CAACF,aAAc;QACvCF,QAAQ;QACR;IACF;IAEA,MAAMK,UAAU,MAAMP,IAAIQ,QAAQ,CAACJ,YAAY;IAC/C,MAAMK,WAAWX,MAAMS;IAEvBE,SAASC,eAAe,KAAK,CAAC;IAC9BD,SAASC,eAAe,CAACC,KAAK,KAAK,CAAC;IAEpC,IAAIF,SAASC,eAAe,CAACC,KAAK,CAAC,kBAAkB,EAAE;QACrD;IACF;IAEA,MAAMC,cAAcX,KAAKY,OAAO,CAC9BZ,KAAKa,OAAO,CAACV,aACbK,SAASC,eAAe,CAACK,OAAO,IAAI;IAEtC,MAAMC,4BAA4Bf,KAC/BgB,QAAQ,CAACL,aAAaP,mBACtBa,KAAK,CAACjB,KAAKkB,GAAG,EACdC,IAAI,CAAC;IACR,MAAMC,mBAAmBL,0BAA0BM,UAAU,CAAC,OAC1DN,4BACA,CAAC,EAAE,EAAEA,2BAA2B;IAEpCP,SAASC,eAAe,CAACC,KAAK,CAAC,kBAAkB,GAAG;QAACU;KAAiB;IACtE,MAAMrB,IAAIuB,SAAS,CAACnB,YAAYL,UAAUU,UAAU,MAAM,IAAI;AAChE"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CliArgs, DbDetails, PackageManager, ProjectExample, ProjectTemplate } from '../types.js';
|
|
2
2
|
type TemplateOrExample = {
|
|
3
3
|
example: ProjectExample;
|
|
4
4
|
} | {
|
|
5
5
|
template: ProjectTemplate;
|
|
6
6
|
};
|
|
7
7
|
export declare function createProject(args: {
|
|
8
|
-
agentType?: AgentType;
|
|
9
8
|
cliArgs: CliArgs;
|
|
10
9
|
dbDetails?: DbDetails;
|
|
11
10
|
packageManager: PackageManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/lib/create-project.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/lib/create-project.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,cAAc,EACd,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAA;AA+GpB,KAAK,iBAAiB,GAClB;IACE,OAAO,EAAE,cAAc,CAAA;CACxB,GACD;IACE,QAAQ,EAAE,eAAe,CAAA;CAC1B,CAAA;AAEL,wBAAsB,aAAa,CACjC,IAAI,EAAE;IACJ,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,iBAAiB,GACpB,OAAO,CAAC,IAAI,CAAC,CA4Gf;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC,GAAG,IAAI,CAiBP"}
|
|
@@ -6,15 +6,16 @@ import { fileURLToPath } from 'node:url';
|
|
|
6
6
|
import path from 'path';
|
|
7
7
|
import { tryInitRepoAndCommit } from '../utils/git.js';
|
|
8
8
|
import { debug, error, info, warning } from '../utils/log.js';
|
|
9
|
+
import { DEFAULT_PAYLOAD_VERSION_TAG, resolvePackageVersion } from '../utils/resolvePackageVersion.js';
|
|
10
|
+
import { buildAgentConfigFiles } from './agent-config.js';
|
|
9
11
|
import { configurePayloadConfig } from './configure-payload-config.js';
|
|
10
12
|
import { configurePluginProject } from './configure-plugin-project.js';
|
|
11
13
|
import { ensurePnpmBuildApprovals } from './configure-pnpm-builds.js';
|
|
12
14
|
import { downloadExample } from './download-example.js';
|
|
13
|
-
import { downloadSkill } from './download-skill.js';
|
|
14
15
|
import { downloadTemplate } from './download-template.js';
|
|
15
16
|
import { generateSecret } from './generate-secret.js';
|
|
17
|
+
import { getInstallCommand, getRunCommand } from './get-package-manager.js';
|
|
16
18
|
import { manageEnvFiles } from './manage-env-files.js';
|
|
17
|
-
import { getAgentChoice } from './select-agent.js';
|
|
18
19
|
const filename = fileURLToPath(import.meta.url);
|
|
19
20
|
const dirname = path.dirname(filename);
|
|
20
21
|
async function createOrFindProjectDir(projectDir) {
|
|
@@ -28,14 +29,7 @@ async function installDeps(args) {
|
|
|
28
29
|
if (cliArgs['--no-deps']) {
|
|
29
30
|
return true;
|
|
30
31
|
}
|
|
31
|
-
|
|
32
|
-
if (packageManager === 'yarn') {
|
|
33
|
-
installCmd = 'yarn';
|
|
34
|
-
} else if (packageManager === 'pnpm') {
|
|
35
|
-
installCmd = 'pnpm install';
|
|
36
|
-
} else if (packageManager === 'bun') {
|
|
37
|
-
installCmd = 'bun install';
|
|
38
|
-
}
|
|
32
|
+
const installCmd = getInstallCommand(packageManager);
|
|
39
33
|
await ensurePnpmBuildApprovals({
|
|
40
34
|
packageManager,
|
|
41
35
|
projectDir
|
|
@@ -50,8 +44,52 @@ async function installDeps(args) {
|
|
|
50
44
|
return false;
|
|
51
45
|
}
|
|
52
46
|
}
|
|
47
|
+
async function runPayloadCommand(args) {
|
|
48
|
+
const { command, packageManager, projectDir } = args;
|
|
49
|
+
try {
|
|
50
|
+
await execa.command(`${getRunCommand(packageManager)} ${command}`, {
|
|
51
|
+
cwd: path.resolve(projectDir)
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
ok: true
|
|
55
|
+
};
|
|
56
|
+
} catch (err) {
|
|
57
|
+
return {
|
|
58
|
+
error: err instanceof Error ? err.message : String(err),
|
|
59
|
+
ok: false
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Non-fatal: on failure, warn with the command to run later. */ async function runPayloadGenerate(args) {
|
|
64
|
+
const { artifact, command, packageManager, projectDir, spinner } = args;
|
|
65
|
+
spinner.start(`Generating ${artifact}...`);
|
|
66
|
+
const result = await runPayloadCommand({
|
|
67
|
+
command,
|
|
68
|
+
packageManager,
|
|
69
|
+
projectDir
|
|
70
|
+
});
|
|
71
|
+
const capitalized = artifact.charAt(0).toUpperCase() + artifact.slice(1);
|
|
72
|
+
if (result.ok) {
|
|
73
|
+
spinner.stop(`${capitalized} generated`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
spinner.stop(`Could not generate ${artifact}`, 1);
|
|
77
|
+
warning(`Run '${getRunCommand(packageManager)} ${command}' later. ${result.error}`);
|
|
78
|
+
}
|
|
79
|
+
async function runProjectCodegen(args) {
|
|
80
|
+
await runPayloadGenerate({
|
|
81
|
+
...args,
|
|
82
|
+
artifact: 'import map',
|
|
83
|
+
command: 'generate:importmap'
|
|
84
|
+
});
|
|
85
|
+
await runPayloadGenerate({
|
|
86
|
+
...args,
|
|
87
|
+
artifact: 'types',
|
|
88
|
+
command: 'generate:types'
|
|
89
|
+
});
|
|
90
|
+
}
|
|
53
91
|
export async function createProject(args) {
|
|
54
|
-
const {
|
|
92
|
+
const { cliArgs, dbDetails, packageManager, projectDir, projectName } = args;
|
|
55
93
|
if (cliArgs['--dry-run']) {
|
|
56
94
|
debug(`Dry run: Creating project in ${chalk.green(projectDir)}`);
|
|
57
95
|
return;
|
|
@@ -87,23 +125,14 @@ export async function createProject(args) {
|
|
|
87
125
|
projectDir
|
|
88
126
|
});
|
|
89
127
|
}
|
|
128
|
+
const versionOrTag = cliArgs['--payload-version'] ?? DEFAULT_PAYLOAD_VERSION_TAG;
|
|
90
129
|
const spinner = p.spinner();
|
|
91
|
-
spinner.start(
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
version: versionFromCli
|
|
98
|
-
});
|
|
99
|
-
payloadVersion = versionFromCli;
|
|
100
|
-
spinner.stop(`Using provided version of Payload ${payloadVersion}`);
|
|
101
|
-
} else {
|
|
102
|
-
payloadVersion = await getLatestPackageVersion({
|
|
103
|
-
packageName: 'payload'
|
|
104
|
-
});
|
|
105
|
-
spinner.stop(`Found latest version of Payload ${payloadVersion}`);
|
|
106
|
-
}
|
|
130
|
+
spinner.start(`Resolving Payload version (${versionOrTag})...`);
|
|
131
|
+
const payloadVersion = await resolvePackageVersion({
|
|
132
|
+
packageName: 'payload',
|
|
133
|
+
versionOrTag
|
|
134
|
+
});
|
|
135
|
+
spinner.stop(`Using Payload version ${payloadVersion}`);
|
|
107
136
|
await updatePackageJSON({
|
|
108
137
|
latestVersion: payloadVersion,
|
|
109
138
|
projectDir,
|
|
@@ -134,24 +163,9 @@ export async function createProject(args) {
|
|
|
134
163
|
projectDir,
|
|
135
164
|
template: 'template' in args ? args.template : undefined
|
|
136
165
|
});
|
|
137
|
-
if (
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
await downloadSkill({
|
|
141
|
-
agentType,
|
|
142
|
-
branch: cliArgs['--branch'] || undefined,
|
|
143
|
-
debug: cliArgs['--debug'],
|
|
144
|
-
projectDir
|
|
145
|
-
});
|
|
146
|
-
const { configFile, skillsDir } = getAgentChoice(agentType);
|
|
147
|
-
const skillPath = `${skillsDir}/payload`;
|
|
148
|
-
const configContent = configFile === 'CLAUDE.md' ? `# Claude Code\n\nThis project uses the Payload CMS skill at \`${skillPath}/\`.\nStart with \`${skillPath}/SKILL.md\` for a quick reference, then see \`${skillPath}/reference/\` for detailed docs.\n` : `# Agents\n\nThis project uses the Payload CMS skill at \`${skillPath}/\`.\nStart with \`${skillPath}/SKILL.md\` for a quick reference, then see \`${skillPath}/reference/\` for detailed docs.\n`;
|
|
149
|
-
await fse.writeFile(path.resolve(projectDir, configFile), configContent);
|
|
150
|
-
} catch (err) {
|
|
151
|
-
if (cliArgs['--debug'] && err instanceof Error) {
|
|
152
|
-
debug(`Failed to download skill: ${err.message}`);
|
|
153
|
-
}
|
|
154
|
-
warning('Could not download agent skill. You can install it manually later.');
|
|
166
|
+
if (!cliArgs['--no-agent']) {
|
|
167
|
+
for (const { content, fileName } of buildAgentConfigFiles()){
|
|
168
|
+
await fse.writeFile(path.resolve(projectDir, fileName), content);
|
|
155
169
|
}
|
|
156
170
|
}
|
|
157
171
|
if (!cliArgs['--no-deps']) {
|
|
@@ -164,6 +178,11 @@ export async function createProject(args) {
|
|
|
164
178
|
});
|
|
165
179
|
if (result) {
|
|
166
180
|
spinner.stop('Successfully installed Payload and dependencies');
|
|
181
|
+
await runProjectCodegen({
|
|
182
|
+
packageManager,
|
|
183
|
+
projectDir,
|
|
184
|
+
spinner
|
|
185
|
+
});
|
|
167
186
|
} else {
|
|
168
187
|
spinner.stop('Error installing dependencies', 1);
|
|
169
188
|
}
|
|
@@ -216,39 +235,5 @@ export async function createProject(args) {
|
|
|
216
235
|
}, {});
|
|
217
236
|
packageJson.dependencies = updatedDependencies;
|
|
218
237
|
}
|
|
219
|
-
/**
|
|
220
|
-
* Fetches the latest version of a package from the NPM registry.
|
|
221
|
-
*
|
|
222
|
-
* Used in determining the latest version of Payload to use in the generated templates.
|
|
223
|
-
*/ async function getLatestPackageVersion({ packageName = 'payload' }) {
|
|
224
|
-
try {
|
|
225
|
-
const response = await fetch(`https://registry.npmjs.org/-/package/${packageName}/dist-tags`);
|
|
226
|
-
const data = await response.json();
|
|
227
|
-
// Monster chaining for type safety just checking for data.latest
|
|
228
|
-
const latestVersion = data && typeof data === 'object' && 'latest' in data && data.latest && typeof data.latest === 'string' ? data.latest : null;
|
|
229
|
-
if (!latestVersion) {
|
|
230
|
-
throw new Error(`No latest version found for package: ${packageName}`);
|
|
231
|
-
}
|
|
232
|
-
return latestVersion;
|
|
233
|
-
} catch (error) {
|
|
234
|
-
console.error('Error fetching Payload version:', error);
|
|
235
|
-
throw error;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Verifies that the specified version of a package exists on the NPM registry.
|
|
240
|
-
*
|
|
241
|
-
* Throws an error if the version does not exist.
|
|
242
|
-
*/ async function verifyVersionForPackage({ packageName = 'payload', version }) {
|
|
243
|
-
try {
|
|
244
|
-
const response = await fetch(`https://registry.npmjs.org/${packageName}/${version}`);
|
|
245
|
-
if (response.status !== 200) {
|
|
246
|
-
throw new Error(`No ${version} version found for package: ${packageName}`);
|
|
247
|
-
}
|
|
248
|
-
} catch (error) {
|
|
249
|
-
console.error('Error verifying Payload version:', error);
|
|
250
|
-
throw error;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
238
|
|
|
254
239
|
//# sourceMappingURL=create-project.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/create-project.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport chalk from 'chalk'\nimport execa from 'execa'\nimport fse from 'fs-extra'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\n\nimport type {\n AgentType,\n CliArgs,\n DbDetails,\n PackageManager,\n ProjectExample,\n ProjectTemplate,\n} from '../types.js'\n\nimport { tryInitRepoAndCommit } from '../utils/git.js'\nimport { debug, error, info, warning } from '../utils/log.js'\nimport { configurePayloadConfig } from './configure-payload-config.js'\nimport { configurePluginProject } from './configure-plugin-project.js'\nimport { ensurePnpmBuildApprovals } from './configure-pnpm-builds.js'\nimport { downloadExample } from './download-example.js'\nimport { downloadSkill } from './download-skill.js'\nimport { downloadTemplate } from './download-template.js'\nimport { generateSecret } from './generate-secret.js'\nimport { manageEnvFiles } from './manage-env-files.js'\nimport { getAgentChoice } from './select-agent.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\nasync function createOrFindProjectDir(projectDir: string): Promise<void> {\n const pathExists = await fse.pathExists(projectDir)\n if (!pathExists) {\n await fse.mkdir(projectDir)\n }\n}\n\nasync function installDeps(args: {\n cliArgs: CliArgs\n packageManager: PackageManager\n projectDir: string\n}): Promise<boolean> {\n const { cliArgs, packageManager, projectDir } = args\n if (cliArgs['--no-deps']) {\n return true\n }\n let installCmd = 'npm install --legacy-peer-deps'\n\n if (packageManager === 'yarn') {\n installCmd = 'yarn'\n } else if (packageManager === 'pnpm') {\n installCmd = 'pnpm install'\n } else if (packageManager === 'bun') {\n installCmd = 'bun install'\n }\n\n await ensurePnpmBuildApprovals({ packageManager, projectDir })\n\n try {\n await execa.command(installCmd, {\n cwd: path.resolve(projectDir),\n })\n return true\n } catch (err: unknown) {\n error(`Error installing dependencies${err instanceof Error ? `: ${err.message}` : ''}.`)\n return false\n }\n}\n\ntype TemplateOrExample =\n | {\n example: ProjectExample\n }\n | {\n template: ProjectTemplate\n }\n\nexport async function createProject(\n args: {\n agentType?: AgentType\n cliArgs: CliArgs\n dbDetails?: DbDetails\n packageManager: PackageManager\n projectDir: string\n projectName: string\n } & TemplateOrExample,\n): Promise<void> {\n const { agentType, cliArgs, dbDetails, packageManager, projectDir, projectName } = args\n\n if (cliArgs['--dry-run']) {\n debug(`Dry run: Creating project in ${chalk.green(projectDir)}`)\n return\n }\n\n await createOrFindProjectDir(projectDir)\n\n if (cliArgs['--local-example']) {\n // Copy example from local path. For development purposes.\n const localExample = path.resolve(dirname, '../../../../examples/', cliArgs['--local-example'])\n await fse.copy(localExample, projectDir)\n }\n\n if (cliArgs['--local-template']) {\n // Copy template from local path. For development purposes.\n const localTemplate = path.resolve(\n dirname,\n '../../../../templates/',\n cliArgs['--local-template'],\n )\n await fse.copy(localTemplate, projectDir)\n } else if ('template' in args && 'url' in args.template) {\n const { template } = args\n if (cliArgs['--branch']) {\n template.url = `${template.url.split('#')?.[0]}#${cliArgs['--branch']}`\n }\n\n await downloadTemplate({\n debug: cliArgs['--debug'],\n projectDir,\n template,\n })\n } else if ('example' in args && 'url' in args.example) {\n const { example } = args\n if (cliArgs['--branch']) {\n example.url = `${example.url.split('#')?.[0]}#${cliArgs['--branch']}`\n }\n\n await downloadExample({\n debug: cliArgs['--debug'],\n example,\n projectDir,\n })\n }\n\n const spinner = p.spinner()\n spinner.start('Checking latest Payload version...')\n\n // Allows overriding the installed Payload version instead of installing the latest\n const versionFromCli = cliArgs['--version']\n\n let payloadVersion: string\n\n if (versionFromCli) {\n await verifyVersionForPackage({ version: versionFromCli })\n\n payloadVersion = versionFromCli\n\n spinner.stop(`Using provided version of Payload ${payloadVersion}`)\n } else {\n payloadVersion = await getLatestPackageVersion({ packageName: 'payload' })\n\n spinner.stop(`Found latest version of Payload ${payloadVersion}`)\n }\n\n await updatePackageJSON({ latestVersion: payloadVersion, projectDir, projectName })\n\n if ('template' in args) {\n if (args.template.type === 'plugin') {\n spinner.message('Configuring Plugin...')\n configurePluginProject({ projectDirPath: projectDir, projectName })\n } else {\n spinner.message('Configuring Payload...')\n await configurePayloadConfig({\n dbType: dbDetails?.type,\n projectDirOrConfigPath: { projectDir },\n })\n }\n }\n\n await manageEnvFiles({\n cliArgs,\n databaseType: dbDetails?.type,\n databaseUri: dbDetails?.dbUri,\n payloadSecret: generateSecret(),\n projectDir,\n template: 'template' in args ? args.template : undefined,\n })\n\n if (agentType) {\n spinner.message('Installing agent skill...')\n try {\n await downloadSkill({\n agentType,\n branch: cliArgs['--branch'] || undefined,\n debug: cliArgs['--debug'],\n projectDir,\n })\n\n const { configFile, skillsDir } = getAgentChoice(agentType)\n const skillPath = `${skillsDir}/payload`\n const configContent =\n configFile === 'CLAUDE.md'\n ? `# Claude Code\\n\\nThis project uses the Payload CMS skill at \\`${skillPath}/\\`.\\nStart with \\`${skillPath}/SKILL.md\\` for a quick reference, then see \\`${skillPath}/reference/\\` for detailed docs.\\n`\n : `# Agents\\n\\nThis project uses the Payload CMS skill at \\`${skillPath}/\\`.\\nStart with \\`${skillPath}/SKILL.md\\` for a quick reference, then see \\`${skillPath}/reference/\\` for detailed docs.\\n`\n await fse.writeFile(path.resolve(projectDir, configFile), configContent)\n } catch (err) {\n if (cliArgs['--debug'] && err instanceof Error) {\n debug(`Failed to download skill: ${err.message}`)\n }\n warning('Could not download agent skill. You can install it manually later.')\n }\n }\n\n if (!cliArgs['--no-deps']) {\n info(`Using ${packageManager}.\\n`)\n spinner.message('Installing dependencies...')\n const result = await installDeps({ cliArgs, packageManager, projectDir })\n if (result) {\n spinner.stop('Successfully installed Payload and dependencies')\n } else {\n spinner.stop('Error installing dependencies', 1)\n }\n } else {\n spinner.stop('Dependency installation skipped')\n }\n\n if (!cliArgs['--no-git']) {\n tryInitRepoAndCommit({ cwd: projectDir })\n }\n}\n\n/**\n * Reads the package.json file into an object and then does the following:\n * - Sets the `name` property to the provided `projectName`.\n * - Bumps the payload packages from workspace:* to the latest version.\n * - Writes the updated object back to the package.json file.\n */\nexport async function updatePackageJSON(args: {\n /**\n * The latest version of Payload to use in the package.json.\n */\n latestVersion: string\n projectDir: string\n /**\n * The name of the project to set in package.json.\n */\n projectName: string\n}): Promise<void> {\n const { latestVersion, projectDir, projectName } = args\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n try {\n const packageObj = await fse.readJson(packageJsonPath)\n packageObj.name = projectName\n\n updatePackageJSONDependencies({\n latestVersion,\n packageJson: packageObj,\n })\n\n await fse.writeJson(packageJsonPath, packageObj, { spaces: 2 })\n } catch (err: unknown) {\n warning(`Unable to update name in package.json. ${err instanceof Error ? err.message : ''}`)\n }\n}\n\n/**\n * Recursively updates a JSON object to replace all instances of `workspace:` with the latest version pinned.\n *\n * Does not return and instead modifies the `packageJson` object in place.\n */\nexport function updatePackageJSONDependencies(args: {\n latestVersion: string\n packageJson: Record<string, unknown>\n}): void {\n const { latestVersion, packageJson } = args\n\n const updatedDependencies = Object.entries(packageJson.dependencies || {}).reduce(\n (acc, [key, value]) => {\n if (typeof value === 'string' && value.startsWith('workspace:')) {\n acc[key] = `${latestVersion}`\n } else if (key === 'payload' || key.startsWith('@payloadcms')) {\n acc[key] = `${latestVersion}`\n } else {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n packageJson.dependencies = updatedDependencies\n}\n\n/**\n * Fetches the latest version of a package from the NPM registry.\n *\n * Used in determining the latest version of Payload to use in the generated templates.\n */\nasync function getLatestPackageVersion({\n packageName = 'payload',\n}: {\n /**\n * Package name to fetch the latest version for based on the NPM registry URL\n *\n * Eg. for `'payload'`, it will fetch the version from `https://registry.npmjs.org/payload`\n *\n * @default 'payload'\n */\n packageName?: string\n}): Promise<string> {\n try {\n const response = await fetch(`https://registry.npmjs.org/-/package/${packageName}/dist-tags`)\n const data = await response.json()\n\n // Monster chaining for type safety just checking for data.latest\n const latestVersion =\n data &&\n typeof data === 'object' &&\n 'latest' in data &&\n data.latest &&\n typeof data.latest === 'string'\n ? data.latest\n : null\n\n if (!latestVersion) {\n throw new Error(`No latest version found for package: ${packageName}`)\n }\n\n return latestVersion\n } catch (error) {\n console.error('Error fetching Payload version:', error)\n throw error\n }\n}\n\n/**\n * Verifies that the specified version of a package exists on the NPM registry.\n *\n * Throws an error if the version does not exist.\n */\nasync function verifyVersionForPackage({\n packageName = 'payload',\n version,\n}: {\n /**\n * Package name to fetch the latest version for based on the NPM registry URL\n *\n * Eg. for `'payload'`, it will fetch the version from `https://registry.npmjs.org/payload`\n *\n * @default 'payload'\n */\n packageName?: string\n version: string\n}): Promise<void> {\n try {\n const response = await fetch(`https://registry.npmjs.org/${packageName}/${version}`)\n\n if (response.status !== 200) {\n throw new Error(`No ${version} version found for package: ${packageName}`)\n }\n } catch (error) {\n console.error('Error verifying Payload version:', error)\n throw error\n }\n}\n"],"names":["p","chalk","execa","fse","fileURLToPath","path","tryInitRepoAndCommit","debug","error","info","warning","configurePayloadConfig","configurePluginProject","ensurePnpmBuildApprovals","downloadExample","downloadSkill","downloadTemplate","generateSecret","manageEnvFiles","getAgentChoice","filename","url","dirname","createOrFindProjectDir","projectDir","pathExists","mkdir","installDeps","args","cliArgs","packageManager","installCmd","command","cwd","resolve","err","Error","message","createProject","agentType","dbDetails","projectName","green","localExample","copy","localTemplate","template","split","example","spinner","start","versionFromCli","payloadVersion","verifyVersionForPackage","version","stop","getLatestPackageVersion","packageName","updatePackageJSON","latestVersion","type","projectDirPath","dbType","projectDirOrConfigPath","databaseType","databaseUri","dbUri","payloadSecret","undefined","branch","configFile","skillsDir","skillPath","configContent","writeFile","result","packageJsonPath","packageObj","readJson","name","updatePackageJSONDependencies","packageJson","writeJson","spaces","updatedDependencies","Object","entries","dependencies","reduce","acc","key","value","startsWith","response","fetch","data","json","latest","console","status"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/create-project.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport chalk from 'chalk'\nimport execa from 'execa'\nimport fse from 'fs-extra'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\n\nimport type {\n CliArgs,\n DbDetails,\n PackageManager,\n ProjectExample,\n ProjectTemplate,\n} from '../types.js'\n\nimport { tryInitRepoAndCommit } from '../utils/git.js'\nimport { debug, error, info, warning } from '../utils/log.js'\nimport {\n DEFAULT_PAYLOAD_VERSION_TAG,\n resolvePackageVersion,\n} from '../utils/resolvePackageVersion.js'\nimport { buildAgentConfigFiles } from './agent-config.js'\nimport { configurePayloadConfig } from './configure-payload-config.js'\nimport { configurePluginProject } from './configure-plugin-project.js'\nimport { ensurePnpmBuildApprovals } from './configure-pnpm-builds.js'\nimport { downloadExample } from './download-example.js'\nimport { downloadTemplate } from './download-template.js'\nimport { generateSecret } from './generate-secret.js'\nimport { getInstallCommand, getRunCommand } from './get-package-manager.js'\nimport { manageEnvFiles } from './manage-env-files.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\nasync function createOrFindProjectDir(projectDir: string): Promise<void> {\n const pathExists = await fse.pathExists(projectDir)\n if (!pathExists) {\n await fse.mkdir(projectDir)\n }\n}\n\nasync function installDeps(args: {\n cliArgs: CliArgs\n packageManager: PackageManager\n projectDir: string\n}): Promise<boolean> {\n const { cliArgs, packageManager, projectDir } = args\n if (cliArgs['--no-deps']) {\n return true\n }\n const installCmd = getInstallCommand(packageManager)\n\n await ensurePnpmBuildApprovals({ packageManager, projectDir })\n\n try {\n await execa.command(installCmd, {\n cwd: path.resolve(projectDir),\n })\n return true\n } catch (err: unknown) {\n error(`Error installing dependencies${err instanceof Error ? `: ${err.message}` : ''}.`)\n return false\n }\n}\n\ntype PayloadGenerateResult = { error: string; ok: false } | { ok: true }\n\nasync function runPayloadCommand(args: {\n command: string\n packageManager: PackageManager\n projectDir: string\n}): Promise<PayloadGenerateResult> {\n const { command, packageManager, projectDir } = args\n\n try {\n await execa.command(`${getRunCommand(packageManager)} ${command}`, {\n cwd: path.resolve(projectDir),\n })\n return { ok: true }\n } catch (err: unknown) {\n return { error: err instanceof Error ? err.message : String(err), ok: false }\n }\n}\n\n/** Non-fatal: on failure, warn with the command to run later. */\nasync function runPayloadGenerate(args: {\n artifact: string\n command: string\n packageManager: PackageManager\n projectDir: string\n spinner: ReturnType<typeof p.spinner>\n}): Promise<void> {\n const { artifact, command, packageManager, projectDir, spinner } = args\n\n spinner.start(`Generating ${artifact}...`)\n const result = await runPayloadCommand({ command, packageManager, projectDir })\n const capitalized = artifact.charAt(0).toUpperCase() + artifact.slice(1)\n\n if (result.ok) {\n spinner.stop(`${capitalized} generated`)\n return\n }\n\n spinner.stop(`Could not generate ${artifact}`, 1)\n warning(`Run '${getRunCommand(packageManager)} ${command}' later. ${result.error}`)\n}\n\nasync function runProjectCodegen(args: {\n packageManager: PackageManager\n projectDir: string\n spinner: ReturnType<typeof p.spinner>\n}): Promise<void> {\n await runPayloadGenerate({\n ...args,\n artifact: 'import map',\n command: 'generate:importmap',\n })\n await runPayloadGenerate({\n ...args,\n artifact: 'types',\n command: 'generate:types',\n })\n}\n\ntype TemplateOrExample =\n | {\n example: ProjectExample\n }\n | {\n template: ProjectTemplate\n }\n\nexport async function createProject(\n args: {\n cliArgs: CliArgs\n dbDetails?: DbDetails\n packageManager: PackageManager\n projectDir: string\n projectName: string\n } & TemplateOrExample,\n): Promise<void> {\n const { cliArgs, dbDetails, packageManager, projectDir, projectName } = args\n\n if (cliArgs['--dry-run']) {\n debug(`Dry run: Creating project in ${chalk.green(projectDir)}`)\n return\n }\n\n await createOrFindProjectDir(projectDir)\n\n if (cliArgs['--local-example']) {\n // Copy example from local path. For development purposes.\n const localExample = path.resolve(dirname, '../../../../examples/', cliArgs['--local-example'])\n await fse.copy(localExample, projectDir)\n }\n\n if (cliArgs['--local-template']) {\n // Copy template from local path. For development purposes.\n const localTemplate = path.resolve(\n dirname,\n '../../../../templates/',\n cliArgs['--local-template'],\n )\n await fse.copy(localTemplate, projectDir)\n } else if ('template' in args && 'url' in args.template) {\n const { template } = args\n if (cliArgs['--branch']) {\n template.url = `${template.url.split('#')?.[0]}#${cliArgs['--branch']}`\n }\n\n await downloadTemplate({\n debug: cliArgs['--debug'],\n projectDir,\n template,\n })\n } else if ('example' in args && 'url' in args.example) {\n const { example } = args\n if (cliArgs['--branch']) {\n example.url = `${example.url.split('#')?.[0]}#${cliArgs['--branch']}`\n }\n\n await downloadExample({\n debug: cliArgs['--debug'],\n example,\n projectDir,\n })\n }\n\n const versionOrTag = cliArgs['--payload-version'] ?? DEFAULT_PAYLOAD_VERSION_TAG\n\n const spinner = p.spinner()\n spinner.start(`Resolving Payload version (${versionOrTag})...`)\n\n const payloadVersion = await resolvePackageVersion({\n packageName: 'payload',\n versionOrTag,\n })\n\n spinner.stop(`Using Payload version ${payloadVersion}`)\n\n await updatePackageJSON({ latestVersion: payloadVersion, projectDir, projectName })\n\n if ('template' in args) {\n if (args.template.type === 'plugin') {\n spinner.message('Configuring Plugin...')\n configurePluginProject({ projectDirPath: projectDir, projectName })\n } else {\n spinner.message('Configuring Payload...')\n await configurePayloadConfig({\n dbType: dbDetails?.type,\n projectDirOrConfigPath: { projectDir },\n })\n }\n }\n\n await manageEnvFiles({\n cliArgs,\n databaseType: dbDetails?.type,\n databaseUri: dbDetails?.dbUri,\n payloadSecret: generateSecret(),\n projectDir,\n template: 'template' in args ? args.template : undefined,\n })\n\n if (!cliArgs['--no-agent']) {\n for (const { content, fileName } of buildAgentConfigFiles()) {\n await fse.writeFile(path.resolve(projectDir, fileName), content)\n }\n }\n\n if (!cliArgs['--no-deps']) {\n info(`Using ${packageManager}.\\n`)\n spinner.message('Installing dependencies...')\n const result = await installDeps({ cliArgs, packageManager, projectDir })\n if (result) {\n spinner.stop('Successfully installed Payload and dependencies')\n\n await runProjectCodegen({ packageManager, projectDir, spinner })\n } else {\n spinner.stop('Error installing dependencies', 1)\n }\n } else {\n spinner.stop('Dependency installation skipped')\n }\n\n if (!cliArgs['--no-git']) {\n tryInitRepoAndCommit({ cwd: projectDir })\n }\n}\n\n/**\n * Reads the package.json file into an object and then does the following:\n * - Sets the `name` property to the provided `projectName`.\n * - Bumps the payload packages from workspace:* to the latest version.\n * - Writes the updated object back to the package.json file.\n */\nexport async function updatePackageJSON(args: {\n /**\n * The latest version of Payload to use in the package.json.\n */\n latestVersion: string\n projectDir: string\n /**\n * The name of the project to set in package.json.\n */\n projectName: string\n}): Promise<void> {\n const { latestVersion, projectDir, projectName } = args\n const packageJsonPath = path.resolve(projectDir, 'package.json')\n try {\n const packageObj = await fse.readJson(packageJsonPath)\n packageObj.name = projectName\n\n updatePackageJSONDependencies({\n latestVersion,\n packageJson: packageObj,\n })\n\n await fse.writeJson(packageJsonPath, packageObj, { spaces: 2 })\n } catch (err: unknown) {\n warning(`Unable to update name in package.json. ${err instanceof Error ? err.message : ''}`)\n }\n}\n\n/**\n * Recursively updates a JSON object to replace all instances of `workspace:` with the latest version pinned.\n *\n * Does not return and instead modifies the `packageJson` object in place.\n */\nexport function updatePackageJSONDependencies(args: {\n latestVersion: string\n packageJson: Record<string, unknown>\n}): void {\n const { latestVersion, packageJson } = args\n\n const updatedDependencies = Object.entries(packageJson.dependencies || {}).reduce(\n (acc, [key, value]) => {\n if (typeof value === 'string' && value.startsWith('workspace:')) {\n acc[key] = `${latestVersion}`\n } else if (key === 'payload' || key.startsWith('@payloadcms')) {\n acc[key] = `${latestVersion}`\n } else {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n packageJson.dependencies = updatedDependencies\n}\n"],"names":["p","chalk","execa","fse","fileURLToPath","path","tryInitRepoAndCommit","debug","error","info","warning","DEFAULT_PAYLOAD_VERSION_TAG","resolvePackageVersion","buildAgentConfigFiles","configurePayloadConfig","configurePluginProject","ensurePnpmBuildApprovals","downloadExample","downloadTemplate","generateSecret","getInstallCommand","getRunCommand","manageEnvFiles","filename","url","dirname","createOrFindProjectDir","projectDir","pathExists","mkdir","installDeps","args","cliArgs","packageManager","installCmd","command","cwd","resolve","err","Error","message","runPayloadCommand","ok","String","runPayloadGenerate","artifact","spinner","start","result","capitalized","charAt","toUpperCase","slice","stop","runProjectCodegen","createProject","dbDetails","projectName","green","localExample","copy","localTemplate","template","split","example","versionOrTag","payloadVersion","packageName","updatePackageJSON","latestVersion","type","projectDirPath","dbType","projectDirOrConfigPath","databaseType","databaseUri","dbUri","payloadSecret","undefined","content","fileName","writeFile","packageJsonPath","packageObj","readJson","name","updatePackageJSONDependencies","packageJson","writeJson","spaces","updatedDependencies","Object","entries","dependencies","reduce","acc","key","value","startsWith"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/generate-secret.ts"],"sourcesContent":["import { randomBytes } from 'crypto'\n\nexport function generateSecret(): string {\n return randomBytes(32).toString('hex')
|
|
1
|
+
{"version":3,"sources":["../../src/lib/generate-secret.ts"],"sourcesContent":["import { randomBytes } from 'crypto'\n\nexport function generateSecret(): string {\n return randomBytes(32).toString('hex')\n}\n"],"names":["randomBytes","generateSecret","toString"],"mappings":"AAAA,SAASA,WAAW,QAAQ,SAAQ;AAEpC,OAAO,SAASC;IACd,OAAOD,YAAY,IAAIE,QAAQ,CAAC;AAClC"}
|
|
@@ -3,4 +3,13 @@ export declare function getPackageManager(args: {
|
|
|
3
3
|
cliArgs?: CliArgs;
|
|
4
4
|
projectDir: string;
|
|
5
5
|
}): Promise<PackageManager>;
|
|
6
|
+
/**
|
|
7
|
+
* The command that installs every dependency listed in package.json.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getInstallCommand(packageManager: PackageManager): string;
|
|
10
|
+
/**
|
|
11
|
+
* The prefix that runs a package.json script. npm needs `npm run <script>`, while
|
|
12
|
+
* pnpm, yarn, and bun run scripts directly.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getRunCommand(packageManager: PackageManager): string;
|
|
6
15
|
//# sourceMappingURL=get-package-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-package-manager.d.ts","sourceRoot":"","sources":["../../src/lib/get-package-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE1D,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB,GAAG,OAAO,CAAC,cAAc,CAAC,CA0B1B"}
|
|
1
|
+
{"version":3,"file":"get-package-manager.d.ts","sourceRoot":"","sources":["../../src/lib/get-package-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE1D,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB,GAAG,OAAO,CAAC,cAAc,CAAC,CA0B1B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,CAWxE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,CAEpE"}
|
|
@@ -25,6 +25,26 @@ export async function getPackageManager(args) {
|
|
|
25
25
|
return 'npm';
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* The command that installs every dependency listed in package.json.
|
|
30
|
+
*/ export function getInstallCommand(packageManager) {
|
|
31
|
+
if (packageManager === 'yarn') {
|
|
32
|
+
return 'yarn';
|
|
33
|
+
}
|
|
34
|
+
if (packageManager === 'pnpm') {
|
|
35
|
+
return 'pnpm install';
|
|
36
|
+
}
|
|
37
|
+
if (packageManager === 'bun') {
|
|
38
|
+
return 'bun install';
|
|
39
|
+
}
|
|
40
|
+
return 'npm install --legacy-peer-deps';
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The prefix that runs a package.json script. npm needs `npm run <script>`, while
|
|
44
|
+
* pnpm, yarn, and bun run scripts directly.
|
|
45
|
+
*/ export function getRunCommand(packageManager) {
|
|
46
|
+
return packageManager === 'npm' ? 'npm run' : packageManager;
|
|
47
|
+
}
|
|
28
48
|
function getEnvironmentPackageManager() {
|
|
29
49
|
const userAgent = process.env.npm_config_user_agent || '';
|
|
30
50
|
if (userAgent.startsWith('yarn')) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/get-package-manager.ts"],"sourcesContent":["import execa from 'execa'\nimport fse from 'fs-extra'\n\nimport type { CliArgs, PackageManager } from '../types.js'\n\nexport async function getPackageManager(args: {\n cliArgs?: CliArgs\n projectDir: string\n}): Promise<PackageManager> {\n const { cliArgs, projectDir } = args\n\n try {\n // Check for flag or lockfile\n let detected: PackageManager = 'npm'\n if (cliArgs?.['--use-pnpm'] || fse.existsSync(`${projectDir}/pnpm-lock.yaml`)) {\n detected = 'pnpm'\n } else if (cliArgs?.['--use-yarn'] || fse.existsSync(`${projectDir}/yarn.lock`)) {\n detected = 'yarn'\n } else if (cliArgs?.['--use-npm'] || fse.existsSync(`${projectDir}/package-lock.json`)) {\n detected = 'npm'\n } else if (cliArgs?.['--use-bun'] || fse.existsSync(`${projectDir}/bun.lockb`)) {\n detected = 'bun'\n } else if (await commandExists('pnpm')) {\n // Prefer pnpm if it's installed\n detected = 'pnpm'\n } else {\n // Otherwise check the execution environment\n detected = getEnvironmentPackageManager()\n }\n\n return detected\n } catch (ignore) {\n return 'npm'\n }\n}\n\nfunction getEnvironmentPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent || ''\n\n if (userAgent.startsWith('yarn')) {\n return 'yarn'\n }\n\n if (userAgent.startsWith('pnpm')) {\n return 'pnpm'\n }\n\n if (userAgent.startsWith('bun')) {\n return 'bun'\n }\n\n return 'npm'\n}\n\nasync function commandExists(command: string): Promise<boolean> {\n try {\n await execa.command(process.platform === 'win32' ? `where ${command}` : `command -v ${command}`)\n return true\n } catch {\n return false\n }\n}\n"],"names":["execa","fse","getPackageManager","args","cliArgs","projectDir","detected","existsSync","commandExists","getEnvironmentPackageManager","ignore","userAgent","process","env","npm_config_user_agent","startsWith","command","platform"],"mappings":"AAAA,OAAOA,WAAW,QAAO;AACzB,OAAOC,SAAS,WAAU;AAI1B,OAAO,eAAeC,kBAAkBC,IAGvC;IACC,MAAM,EAAEC,OAAO,EAAEC,UAAU,EAAE,GAAGF;IAEhC,IAAI;QACF,6BAA6B;QAC7B,IAAIG,WAA2B;QAC/B,IAAIF,SAAS,CAAC,aAAa,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,eAAe,CAAC,GAAG;YAC7EC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,aAAa,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,UAAU,CAAC,GAAG;YAC/EC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,YAAY,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,kBAAkB,CAAC,GAAG;YACtFC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,YAAY,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,UAAU,CAAC,GAAG;YAC9EC,WAAW;QACb,OAAO,IAAI,MAAME,cAAc,SAAS;YACtC,gCAAgC;YAChCF,WAAW;QACb,OAAO;YACL,4CAA4C;YAC5CA,WAAWG;QACb;QAEA,OAAOH;IACT,EAAE,OAAOI,QAAQ;QACf,OAAO;IACT;AACF;AAEA,
|
|
1
|
+
{"version":3,"sources":["../../src/lib/get-package-manager.ts"],"sourcesContent":["import execa from 'execa'\nimport fse from 'fs-extra'\n\nimport type { CliArgs, PackageManager } from '../types.js'\n\nexport async function getPackageManager(args: {\n cliArgs?: CliArgs\n projectDir: string\n}): Promise<PackageManager> {\n const { cliArgs, projectDir } = args\n\n try {\n // Check for flag or lockfile\n let detected: PackageManager = 'npm'\n if (cliArgs?.['--use-pnpm'] || fse.existsSync(`${projectDir}/pnpm-lock.yaml`)) {\n detected = 'pnpm'\n } else if (cliArgs?.['--use-yarn'] || fse.existsSync(`${projectDir}/yarn.lock`)) {\n detected = 'yarn'\n } else if (cliArgs?.['--use-npm'] || fse.existsSync(`${projectDir}/package-lock.json`)) {\n detected = 'npm'\n } else if (cliArgs?.['--use-bun'] || fse.existsSync(`${projectDir}/bun.lockb`)) {\n detected = 'bun'\n } else if (await commandExists('pnpm')) {\n // Prefer pnpm if it's installed\n detected = 'pnpm'\n } else {\n // Otherwise check the execution environment\n detected = getEnvironmentPackageManager()\n }\n\n return detected\n } catch (ignore) {\n return 'npm'\n }\n}\n\n/**\n * The command that installs every dependency listed in package.json.\n */\nexport function getInstallCommand(packageManager: PackageManager): string {\n if (packageManager === 'yarn') {\n return 'yarn'\n }\n if (packageManager === 'pnpm') {\n return 'pnpm install'\n }\n if (packageManager === 'bun') {\n return 'bun install'\n }\n return 'npm install --legacy-peer-deps'\n}\n\n/**\n * The prefix that runs a package.json script. npm needs `npm run <script>`, while\n * pnpm, yarn, and bun run scripts directly.\n */\nexport function getRunCommand(packageManager: PackageManager): string {\n return packageManager === 'npm' ? 'npm run' : packageManager\n}\n\nfunction getEnvironmentPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent || ''\n\n if (userAgent.startsWith('yarn')) {\n return 'yarn'\n }\n\n if (userAgent.startsWith('pnpm')) {\n return 'pnpm'\n }\n\n if (userAgent.startsWith('bun')) {\n return 'bun'\n }\n\n return 'npm'\n}\n\nasync function commandExists(command: string): Promise<boolean> {\n try {\n await execa.command(process.platform === 'win32' ? `where ${command}` : `command -v ${command}`)\n return true\n } catch {\n return false\n }\n}\n"],"names":["execa","fse","getPackageManager","args","cliArgs","projectDir","detected","existsSync","commandExists","getEnvironmentPackageManager","ignore","getInstallCommand","packageManager","getRunCommand","userAgent","process","env","npm_config_user_agent","startsWith","command","platform"],"mappings":"AAAA,OAAOA,WAAW,QAAO;AACzB,OAAOC,SAAS,WAAU;AAI1B,OAAO,eAAeC,kBAAkBC,IAGvC;IACC,MAAM,EAAEC,OAAO,EAAEC,UAAU,EAAE,GAAGF;IAEhC,IAAI;QACF,6BAA6B;QAC7B,IAAIG,WAA2B;QAC/B,IAAIF,SAAS,CAAC,aAAa,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,eAAe,CAAC,GAAG;YAC7EC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,aAAa,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,UAAU,CAAC,GAAG;YAC/EC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,YAAY,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,kBAAkB,CAAC,GAAG;YACtFC,WAAW;QACb,OAAO,IAAIF,SAAS,CAAC,YAAY,IAAIH,IAAIM,UAAU,CAAC,GAAGF,WAAW,UAAU,CAAC,GAAG;YAC9EC,WAAW;QACb,OAAO,IAAI,MAAME,cAAc,SAAS;YACtC,gCAAgC;YAChCF,WAAW;QACb,OAAO;YACL,4CAA4C;YAC5CA,WAAWG;QACb;QAEA,OAAOH;IACT,EAAE,OAAOI,QAAQ;QACf,OAAO;IACT;AACF;AAEA;;CAEC,GACD,OAAO,SAASC,kBAAkBC,cAA8B;IAC9D,IAAIA,mBAAmB,QAAQ;QAC7B,OAAO;IACT;IACA,IAAIA,mBAAmB,QAAQ;QAC7B,OAAO;IACT;IACA,IAAIA,mBAAmB,OAAO;QAC5B,OAAO;IACT;IACA,OAAO;AACT;AAEA;;;CAGC,GACD,OAAO,SAASC,cAAcD,cAA8B;IAC1D,OAAOA,mBAAmB,QAAQ,YAAYA;AAChD;AAEA,SAASH;IACP,MAAMK,YAAYC,QAAQC,GAAG,CAACC,qBAAqB,IAAI;IAEvD,IAAIH,UAAUI,UAAU,CAAC,SAAS;QAChC,OAAO;IACT;IAEA,IAAIJ,UAAUI,UAAU,CAAC,SAAS;QAChC,OAAO;IACT;IAEA,IAAIJ,UAAUI,UAAU,CAAC,QAAQ;QAC/B,OAAO;IACT;IAEA,OAAO;AACT;AAEA,eAAeV,cAAcW,OAAe;IAC1C,IAAI;QACF,MAAMnB,MAAMmB,OAAO,CAACJ,QAAQK,QAAQ,KAAK,UAAU,CAAC,MAAM,EAAED,SAAS,GAAG,CAAC,WAAW,EAAEA,SAAS;QAC/F,OAAO;IACT,EAAE,OAAM;QACN,OAAO;IACT;AACF"}
|
package/dist/lib/init-next.d.ts
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import type { CliArgs, DbType, NextAppDetails, PackageManager } from '../types.js';
|
|
2
|
+
/** Keep in sync with the `next` peer dependency range of `@payloadcms/next`. */
|
|
3
|
+
export declare const minimumNextVersion: {
|
|
4
|
+
major: number;
|
|
5
|
+
minor: number;
|
|
6
|
+
};
|
|
2
7
|
type InitNextArgs = {
|
|
3
8
|
dbType: DbType;
|
|
4
9
|
nextAppDetails?: NextAppDetails;
|
|
5
10
|
packageManager: PackageManager;
|
|
6
11
|
projectDir: string;
|
|
7
12
|
useDistFiles?: boolean;
|
|
8
|
-
} & Pick<CliArgs, '--debug'>;
|
|
13
|
+
} & Pick<CliArgs, '--debug' | '--payload-version'>;
|
|
9
14
|
type InitNextResult = {
|
|
10
15
|
isSrcDir: boolean;
|
|
11
16
|
nextAppDir?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-next.d.ts","sourceRoot":"","sources":["../../src/lib/init-next.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init-next.d.ts","sourceRoot":"","sources":["../../src/lib/init-next.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAkB,cAAc,EAAE,MAAM,aAAa,CAAA;AAiBlG,gFAAgF;AAChF,eAAO,MAAM,kBAAkB;IAAK,KAAK;IAAM,KAAK;CAAK,CAAA;AAEzD,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,mBAAmB,CAAC,CAAA;AAElD,KAAK,cAAc,GACf;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,GAC1E;IACE,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,IAAI,CAAA;CACd,CAAA;AAEL,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAuE1E;AA2GD,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAwGnF"}
|
package/dist/lib/init-next.js
CHANGED
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
import * as p from '@clack/prompts';
|
|
2
|
-
import { parse, stringify } from 'comment-json';
|
|
3
2
|
import fs from 'fs';
|
|
4
3
|
import fse from 'fs-extra';
|
|
5
4
|
import globby from 'globby';
|
|
6
5
|
import { fileURLToPath } from 'node:url';
|
|
7
6
|
import path from 'path';
|
|
8
|
-
import { promisify } from 'util';
|
|
9
7
|
import { copyRecursiveSync } from '../utils/copy-recursive-sync.js';
|
|
10
8
|
import { debug as origDebug, warning } from '../utils/log.js';
|
|
11
9
|
import { moveMessage } from '../utils/messages.js';
|
|
10
|
+
import { DEFAULT_PAYLOAD_VERSION_TAG, resolvePackageVersion } from '../utils/resolvePackageVersion.js';
|
|
11
|
+
import { configurePayloadTsConfig } from './configure-payload-tsconfig.js';
|
|
12
12
|
import { ensurePnpmBuildApprovals } from './configure-pnpm-builds.js';
|
|
13
13
|
import { installPackages } from './install-packages.js';
|
|
14
14
|
import { wrapNextConfig } from './wrap-next-config.js';
|
|
15
|
-
const readFile = promisify(fs.readFile);
|
|
16
|
-
const writeFile = promisify(fs.writeFile);
|
|
17
15
|
const filename = fileURLToPath(import.meta.url);
|
|
18
16
|
const dirname = path.dirname(filename);
|
|
17
|
+
/** Keep in sync with the `next` peer dependency range of `@payloadcms/next`. */ export const minimumNextVersion = {
|
|
18
|
+
major: 16,
|
|
19
|
+
minor: 4
|
|
20
|
+
};
|
|
19
21
|
export async function initNext(args) {
|
|
20
22
|
const { dbType: dbType, packageManager, projectDir } = args;
|
|
21
23
|
const nextAppDetails = args.nextAppDetails || await getNextAppDetails(projectDir);
|
|
@@ -65,7 +67,12 @@ export async function initNext(args) {
|
|
|
65
67
|
success: false
|
|
66
68
|
};
|
|
67
69
|
}
|
|
68
|
-
const { success: installSuccess } = await installDeps(
|
|
70
|
+
const { success: installSuccess } = await installDeps({
|
|
71
|
+
dbType,
|
|
72
|
+
packageManager,
|
|
73
|
+
projectDir,
|
|
74
|
+
versionOrTag: args['--payload-version'] ?? DEFAULT_PAYLOAD_VERSION_TAG
|
|
75
|
+
});
|
|
69
76
|
if (!installSuccess) {
|
|
70
77
|
installSpinner.stop('Failed to install dependencies', 1);
|
|
71
78
|
return {
|
|
@@ -75,8 +82,10 @@ export async function initNext(args) {
|
|
|
75
82
|
success: false
|
|
76
83
|
};
|
|
77
84
|
}
|
|
78
|
-
|
|
79
|
-
|
|
85
|
+
await configurePayloadTsConfig({
|
|
86
|
+
configPath: path.resolve(projectDir, 'tsconfig.json'),
|
|
87
|
+
payloadConfigPath: configurationResult.payloadConfigPath
|
|
88
|
+
});
|
|
80
89
|
installSpinner.stop('Successfully installed Payload and dependencies');
|
|
81
90
|
return {
|
|
82
91
|
...configurationResult,
|
|
@@ -85,34 +94,6 @@ export async function initNext(args) {
|
|
|
85
94
|
success: true
|
|
86
95
|
};
|
|
87
96
|
}
|
|
88
|
-
async function addPayloadConfigToTsConfig(projectDir, isSrcDir) {
|
|
89
|
-
const tsConfigPath = path.resolve(projectDir, 'tsconfig.json');
|
|
90
|
-
// Check if tsconfig.json exists
|
|
91
|
-
if (!fs.existsSync(tsConfigPath)) {
|
|
92
|
-
warning(`Could not find tsconfig.json to add @payload-config path.`);
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
const userTsConfigContent = await readFile(tsConfigPath, {
|
|
96
|
-
encoding: 'utf8'
|
|
97
|
-
});
|
|
98
|
-
const userTsConfig = parse(userTsConfigContent);
|
|
99
|
-
const hasBaseUrl = userTsConfig?.compilerOptions?.baseUrl && userTsConfig?.compilerOptions?.baseUrl !== '.';
|
|
100
|
-
const baseUrl = hasBaseUrl ? userTsConfig?.compilerOptions?.baseUrl : './';
|
|
101
|
-
if (!userTsConfig.compilerOptions && !('extends' in userTsConfig)) {
|
|
102
|
-
userTsConfig.compilerOptions = {};
|
|
103
|
-
}
|
|
104
|
-
if (!userTsConfig.compilerOptions?.paths?.['@payload-config'] && userTsConfig.compilerOptions?.paths) {
|
|
105
|
-
userTsConfig.compilerOptions.paths = {
|
|
106
|
-
...userTsConfig.compilerOptions.paths || {},
|
|
107
|
-
'@payload-config': [
|
|
108
|
-
`${baseUrl}${isSrcDir ? 'src/' : ''}payload.config.ts`
|
|
109
|
-
]
|
|
110
|
-
};
|
|
111
|
-
await writeFile(tsConfigPath, stringify(userTsConfig, null, 2), {
|
|
112
|
-
encoding: 'utf8'
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
97
|
async function installAndConfigurePayload(args) {
|
|
117
98
|
const { '--debug': debug, nextAppDetails: { isSrcDir, nextAppDir, nextConfigPath } = {}, nextConfigType, projectDir, useDistFiles } = args;
|
|
118
99
|
if (!nextAppDir || !nextConfigPath) {
|
|
@@ -162,14 +143,19 @@ async function installAndConfigurePayload(args) {
|
|
|
162
143
|
success: true
|
|
163
144
|
};
|
|
164
145
|
}
|
|
165
|
-
async function installDeps(
|
|
146
|
+
async function installDeps(args) {
|
|
147
|
+
const { dbType, packageManager, projectDir, versionOrTag } = args;
|
|
166
148
|
const { getDbPackageName } = await import('./ast/adapter-config.js');
|
|
149
|
+
const version = await resolvePackageVersion({
|
|
150
|
+
packageName: 'payload',
|
|
151
|
+
versionOrTag
|
|
152
|
+
});
|
|
167
153
|
const packagesToInstall = [
|
|
168
154
|
'payload',
|
|
169
155
|
'@payloadcms/next',
|
|
170
156
|
'@payloadcms/richtext-lexical'
|
|
171
|
-
].map((pkg)=>`${pkg}
|
|
172
|
-
packagesToInstall.push(`${getDbPackageName(dbType)}
|
|
157
|
+
].map((pkg)=>`${pkg}@${version}`);
|
|
158
|
+
packagesToInstall.push(`${getDbPackageName(dbType)}@${version}`);
|
|
173
159
|
// Match graphql version of @payloadcms/next
|
|
174
160
|
packagesToInstall.push('graphql@^16.8.1');
|
|
175
161
|
await ensurePnpmBuildApprovals({
|
|
@@ -204,7 +190,7 @@ export async function getNextAppDetails(projectDir) {
|
|
|
204
190
|
if (packageObj.dependencies?.next) {
|
|
205
191
|
nextVersion = packageObj.dependencies.next;
|
|
206
192
|
// Match versions using regex matching groups
|
|
207
|
-
const versionMatch = /(?<major>\d+)
|
|
193
|
+
const versionMatch = /(?<major>\d+)(?:\.(?<minor>\d+))?/.exec(nextVersion);
|
|
208
194
|
if (!versionMatch) {
|
|
209
195
|
p.log.warn(`Could not determine Next.js version from ${nextVersion}`);
|
|
210
196
|
return {
|
|
@@ -215,9 +201,9 @@ export async function getNextAppDetails(projectDir) {
|
|
|
215
201
|
nextVersion
|
|
216
202
|
};
|
|
217
203
|
}
|
|
218
|
-
const { major } = versionMatch.groups;
|
|
204
|
+
const { major, minor } = versionMatch.groups;
|
|
219
205
|
const majorVersion = parseInt(major);
|
|
220
|
-
if (majorVersion <
|
|
206
|
+
if (majorVersion < minimumNextVersion.major) {
|
|
221
207
|
return {
|
|
222
208
|
hasTopLevelLayout: false,
|
|
223
209
|
isSrcDir,
|
|
@@ -226,6 +212,13 @@ export async function getNextAppDetails(projectDir) {
|
|
|
226
212
|
nextVersion
|
|
227
213
|
};
|
|
228
214
|
}
|
|
215
|
+
// TODO: Older minor versions of the minimum major are only warned about, not rejected, to make
|
|
216
|
+
// migrating easier. This can be turned into a hard requirement in the future.
|
|
217
|
+
// A specifier without a minor version (e.g. `^16`) can resolve to any minor, so it is not warned about.
|
|
218
|
+
const isBelowMinimumMinor = majorVersion === minimumNextVersion.major && minor !== undefined && parseInt(minor) < minimumNextVersion.minor;
|
|
219
|
+
if (isBelowMinimumMinor) {
|
|
220
|
+
p.log.warn(`Next.js v${nextVersion} is not supported. Upgrade to Next.js >= ${minimumNextVersion.major}.${minimumNextVersion.minor} to use Payload.`);
|
|
221
|
+
}
|
|
229
222
|
}
|
|
230
223
|
const isSupportedNextVersion = true;
|
|
231
224
|
// Check if Payload already installed
|