From 7ddc7c49fecc3a2bc9dd128f16e29c9e050e0281 Mon Sep 17 00:00:00 2001 From: Paul Popus Date: Tue, 7 Oct 2025 17:11:12 +0100 Subject: [PATCH 1/2] scripts: update generate-template-variations script to cover cloudflare template --- packages/create-payload-app/src/types.ts | 2 +- .../src/generate-template-variations.ts | 247 ++++++++++-------- 2 files changed, 133 insertions(+), 116 deletions(-) diff --git a/packages/create-payload-app/src/types.ts b/packages/create-payload-app/src/types.ts index 72cd45545f1..1c58c305156 100644 --- a/packages/create-payload-app/src/types.ts +++ b/packages/create-payload-app/src/types.ts @@ -89,4 +89,4 @@ export type NextAppDetails = { export type NextConfigType = 'cjs' | 'esm' | 'ts' -export type StorageAdapterType = 'localDisk' | 'vercelBlobStorage' +export type StorageAdapterType = 'localDisk' | 'r2Storage' | 'vercelBlobStorage' diff --git a/tools/scripts/src/generate-template-variations.ts b/tools/scripts/src/generate-template-variations.ts index baefe37dbed..72ed957f457 100644 --- a/tools/scripts/src/generate-template-variations.ts +++ b/tools/scripts/src/generate-template-variations.ts @@ -55,7 +55,7 @@ type TemplateVariation = { * * @default 'default' */ - targetDeployment?: 'default' | 'vercel' + targetDeployment?: 'cloudflare' | 'default' | 'vercel' } main().catch((error) => { @@ -72,129 +72,146 @@ async function main() { const templateRepoUrlBase = `https://github.com/payloadcms/payload/tree/main/templates` let variations: TemplateVariation[] = [ + // { + // name: 'with-vercel-postgres', + // db: 'vercel-postgres', + // dirname: 'with-vercel-postgres', + // envNames: { + // // This will replace the process.env.DATABASE_URI to process.env.POSTGRES_URL + // dbUri: 'POSTGRES_URL', + // }, + // sharp: false, + // skipDockerCompose: true, + // skipReadme: true, + // storage: 'vercelBlobStorage', + // targetDeployment: 'vercel', + // vercelDeployButtonLink: + // `https://vercel.com/new/clone?repository-url=` + + // encodeURI( + // `${templateRepoUrlBase}/with-vercel-postgres` + + // '&project-name=payload-project' + + // '&env=PAYLOAD_SECRET' + + // '&build-command=pnpm run ci' + + // '&stores=[{"type":"postgres"},{"type":"blob"}]', // Postgres and Vercel Blob Storage + // ), + // }, + // { + // name: 'with-vercel-website', + // base: 'website', // This is the base template to copy from + // db: 'vercel-postgres', + // dirname: 'with-vercel-website', + // envNames: { + // // This will replace the process.env.DATABASE_URI to process.env.POSTGRES_URL + // dbUri: 'POSTGRES_URL', + // }, + // sharp: true, + // skipDockerCompose: true, + // skipReadme: true, + // storage: 'vercelBlobStorage', + // targetDeployment: 'vercel', + // vercelDeployButtonLink: + // `https://vercel.com/new/clone?repository-url=` + + // encodeURI( + // `${templateRepoUrlBase}/with-vercel-website` + + // '&project-name=payload-project' + + // '&env=PAYLOAD_SECRET%2CCRON_SECRET' + + // '&build-command=pnpm run ci' + + // '&stores=[{"type":"postgres"},{"type":"blob"}]', // Postgres and Vercel Blob Storage + // ), + // }, + // { + // name: 'with-postgres', + // db: 'postgres', + // dirname: 'with-postgres', + // sharp: true, + // skipDockerCompose: true, + // storage: 'localDisk', + // }, + // { + // name: 'with-vercel-mongodb', + // db: 'mongodb', + // dirname: 'with-vercel-mongodb', + // envNames: { + // dbUri: 'MONGODB_URI', + // }, + // sharp: false, + // storage: 'vercelBlobStorage', + // skipReadme: true, + // targetDeployment: 'vercel', + // vercelDeployButtonLink: + // `https://vercel.com/new/clone?repository-url=` + + // encodeURI( + // `${templateRepoUrlBase}/with-vercel-mongodb` + + // '&project-name=payload-project' + + // '&env=PAYLOAD_SECRET' + + // '&build-command=pnpm run ci' + + // '&stores=[{"type":"blob"}]' + // Vercel Blob Storage + // '&integration-ids=oac_jnzmjqM10gllKmSrG0SGrHOH', // MongoDB Atlas + // ), + // }, + // { + // name: 'blank', + // db: 'mongodb', + // dirname: 'blank', + // generateLockfile: true, + // sharp: true, + // skipConfig: true, // Do not copy the payload.config.ts file from the base template + // skipReadme: true, // Do not copy the README.md file from the base template + // storage: 'localDisk', + // // The blank template is used as a base for create-payload-app functionality, + // // so we do not configure the payload.config.ts file, which leaves the placeholder comments. + // configureConfig: false, + // workspace: true, + // base: 'none', // Do not copy from the base _template directory + // }, + // { + // name: 'website', + // db: 'mongodb', + // dirname: 'website', + // generateLockfile: true, + // sharp: true, + // skipConfig: true, // Do not copy the payload.config.ts file from the base template + // storage: 'localDisk', + // // The blank template is used as a base for create-payload-app functionality, + // // so we do not configure the payload.config.ts file, which leaves the placeholder comments. + // configureConfig: false, + // base: 'none', + // skipDockerCompose: true, + // skipReadme: true, + // workspace: true, + // }, + // { + // name: 'ecommerce', + // db: 'mongodb', + // dirname: 'ecommerce', + // generateLockfile: true, + // sharp: true, + // skipConfig: true, // Do not copy the payload.config.ts file from the base template + // storage: 'localDisk', + // // The blank template is used as a base for create-payload-app functionality, + // // so we do not configure the payload.config.ts file, which leaves the placeholder comments. + // configureConfig: false, + // base: 'none', + // skipDockerCompose: true, + // skipReadme: true, + // workspace: true, + // }, { - name: 'with-vercel-postgres', - db: 'vercel-postgres', - dirname: 'with-vercel-postgres', - envNames: { - // This will replace the process.env.DATABASE_URI to process.env.POSTGRES_URL - dbUri: 'POSTGRES_URL', - }, + name: 'with-cloudflare-d1', + db: 'd1-sqlite', + dirname: 'with-cloudflare-d1', + generateLockfile: false, sharp: false, - skipDockerCompose: true, - skipReadme: true, - storage: 'vercelBlobStorage', - targetDeployment: 'vercel', - vercelDeployButtonLink: - `https://vercel.com/new/clone?repository-url=` + - encodeURI( - `${templateRepoUrlBase}/with-vercel-postgres` + - '&project-name=payload-project' + - '&env=PAYLOAD_SECRET' + - '&build-command=pnpm run ci' + - '&stores=[{"type":"postgres"},{"type":"blob"}]', // Postgres and Vercel Blob Storage - ), - }, - { - name: 'with-vercel-website', - base: 'website', // This is the base template to copy from - db: 'vercel-postgres', - dirname: 'with-vercel-website', - envNames: { - // This will replace the process.env.DATABASE_URI to process.env.POSTGRES_URL - dbUri: 'POSTGRES_URL', - }, - sharp: true, - skipDockerCompose: true, - skipReadme: true, - storage: 'vercelBlobStorage', - targetDeployment: 'vercel', - vercelDeployButtonLink: - `https://vercel.com/new/clone?repository-url=` + - encodeURI( - `${templateRepoUrlBase}/with-vercel-website` + - '&project-name=payload-project' + - '&env=PAYLOAD_SECRET%2CCRON_SECRET' + - '&build-command=pnpm run ci' + - '&stores=[{"type":"postgres"},{"type":"blob"}]', // Postgres and Vercel Blob Storage - ), - }, - { - name: 'with-postgres', - db: 'postgres', - dirname: 'with-postgres', - sharp: true, - skipDockerCompose: true, - storage: 'localDisk', - }, - { - name: 'with-vercel-mongodb', - db: 'mongodb', - dirname: 'with-vercel-mongodb', - envNames: { - dbUri: 'MONGODB_URI', - }, - sharp: false, - storage: 'vercelBlobStorage', - skipReadme: true, - targetDeployment: 'vercel', - vercelDeployButtonLink: - `https://vercel.com/new/clone?repository-url=` + - encodeURI( - `${templateRepoUrlBase}/with-vercel-mongodb` + - '&project-name=payload-project' + - '&env=PAYLOAD_SECRET' + - '&build-command=pnpm run ci' + - '&stores=[{"type":"blob"}]' + // Vercel Blob Storage - '&integration-ids=oac_jnzmjqM10gllKmSrG0SGrHOH', // MongoDB Atlas - ), - }, - { - name: 'blank', - db: 'mongodb', - dirname: 'blank', - generateLockfile: true, - sharp: true, - skipConfig: true, // Do not copy the payload.config.ts file from the base template - skipReadme: true, // Do not copy the README.md file from the base template - storage: 'localDisk', - // The blank template is used as a base for create-payload-app functionality, - // so we do not configure the payload.config.ts file, which leaves the placeholder comments. - configureConfig: false, - workspace: true, - base: 'none', // Do not copy from the base _template directory - }, - { - name: 'website', - db: 'mongodb', - dirname: 'website', - generateLockfile: true, - sharp: true, - skipConfig: true, // Do not copy the payload.config.ts file from the base template - storage: 'localDisk', - // The blank template is used as a base for create-payload-app functionality, - // so we do not configure the payload.config.ts file, which leaves the placeholder comments. - configureConfig: false, - base: 'none', - skipDockerCompose: true, - skipReadme: true, - workspace: true, - }, - { - name: 'ecommerce', - db: 'mongodb', - dirname: 'ecommerce', - generateLockfile: true, - sharp: true, skipConfig: true, // Do not copy the payload.config.ts file from the base template - storage: 'localDisk', + storage: 'r2Storage', // The blank template is used as a base for create-payload-app functionality, // so we do not configure the payload.config.ts file, which leaves the placeholder comments. configureConfig: false, base: 'none', skipDockerCompose: true, skipReadme: true, - workspace: true, + workspace: false, + targetDeployment: 'cloudflare', }, ] From 6d2c357155f6d8c4483139a671c663f140aa7b16 Mon Sep 17 00:00:00 2001 From: Paul Popus Date: Tue, 7 Oct 2025 17:19:15 +0100 Subject: [PATCH 2/2] fix negligence --- .../src/lib/replacements.ts | 13 + .../src/generate-template-variations.ts | 248 +++++++++--------- 2 files changed, 137 insertions(+), 124 deletions(-) diff --git a/packages/create-payload-app/src/lib/replacements.ts b/packages/create-payload-app/src/lib/replacements.ts index 971d0eff6e6..d320f518233 100644 --- a/packages/create-payload-app/src/lib/replacements.ts +++ b/packages/create-payload-app/src/lib/replacements.ts @@ -89,6 +89,18 @@ const vercelBlobStorageReplacement: StorageAdapterReplacement = { packageName: '@payloadcms/storage-vercel-blob', } +const r2StorageReplacement: StorageAdapterReplacement = { + // Replacement of `// storage-adapter-placeholder` + configReplacement: [ + ' r2Storage({', + ' bucket: cloudflare.env.R2,', + ' collections: { media: true },', + ' }),', + ], + importReplacement: "import { r2Storage } from '@payloadcms/storage-r2'", + packageName: '@payloadcms/storage-r2', +} + // Removes placeholders const diskReplacement: StorageAdapterReplacement = { configReplacement: [], @@ -97,6 +109,7 @@ const diskReplacement: StorageAdapterReplacement = { export const storageReplacements: Record = { localDisk: diskReplacement, + r2Storage: r2StorageReplacement, vercelBlobStorage: vercelBlobStorageReplacement, } diff --git a/tools/scripts/src/generate-template-variations.ts b/tools/scripts/src/generate-template-variations.ts index 72ed957f457..e8a1db839b3 100644 --- a/tools/scripts/src/generate-template-variations.ts +++ b/tools/scripts/src/generate-template-variations.ts @@ -72,130 +72,130 @@ async function main() { const templateRepoUrlBase = `https://github.com/payloadcms/payload/tree/main/templates` let variations: TemplateVariation[] = [ - // { - // name: 'with-vercel-postgres', - // db: 'vercel-postgres', - // dirname: 'with-vercel-postgres', - // envNames: { - // // This will replace the process.env.DATABASE_URI to process.env.POSTGRES_URL - // dbUri: 'POSTGRES_URL', - // }, - // sharp: false, - // skipDockerCompose: true, - // skipReadme: true, - // storage: 'vercelBlobStorage', - // targetDeployment: 'vercel', - // vercelDeployButtonLink: - // `https://vercel.com/new/clone?repository-url=` + - // encodeURI( - // `${templateRepoUrlBase}/with-vercel-postgres` + - // '&project-name=payload-project' + - // '&env=PAYLOAD_SECRET' + - // '&build-command=pnpm run ci' + - // '&stores=[{"type":"postgres"},{"type":"blob"}]', // Postgres and Vercel Blob Storage - // ), - // }, - // { - // name: 'with-vercel-website', - // base: 'website', // This is the base template to copy from - // db: 'vercel-postgres', - // dirname: 'with-vercel-website', - // envNames: { - // // This will replace the process.env.DATABASE_URI to process.env.POSTGRES_URL - // dbUri: 'POSTGRES_URL', - // }, - // sharp: true, - // skipDockerCompose: true, - // skipReadme: true, - // storage: 'vercelBlobStorage', - // targetDeployment: 'vercel', - // vercelDeployButtonLink: - // `https://vercel.com/new/clone?repository-url=` + - // encodeURI( - // `${templateRepoUrlBase}/with-vercel-website` + - // '&project-name=payload-project' + - // '&env=PAYLOAD_SECRET%2CCRON_SECRET' + - // '&build-command=pnpm run ci' + - // '&stores=[{"type":"postgres"},{"type":"blob"}]', // Postgres and Vercel Blob Storage - // ), - // }, - // { - // name: 'with-postgres', - // db: 'postgres', - // dirname: 'with-postgres', - // sharp: true, - // skipDockerCompose: true, - // storage: 'localDisk', - // }, - // { - // name: 'with-vercel-mongodb', - // db: 'mongodb', - // dirname: 'with-vercel-mongodb', - // envNames: { - // dbUri: 'MONGODB_URI', - // }, - // sharp: false, - // storage: 'vercelBlobStorage', - // skipReadme: true, - // targetDeployment: 'vercel', - // vercelDeployButtonLink: - // `https://vercel.com/new/clone?repository-url=` + - // encodeURI( - // `${templateRepoUrlBase}/with-vercel-mongodb` + - // '&project-name=payload-project' + - // '&env=PAYLOAD_SECRET' + - // '&build-command=pnpm run ci' + - // '&stores=[{"type":"blob"}]' + // Vercel Blob Storage - // '&integration-ids=oac_jnzmjqM10gllKmSrG0SGrHOH', // MongoDB Atlas - // ), - // }, - // { - // name: 'blank', - // db: 'mongodb', - // dirname: 'blank', - // generateLockfile: true, - // sharp: true, - // skipConfig: true, // Do not copy the payload.config.ts file from the base template - // skipReadme: true, // Do not copy the README.md file from the base template - // storage: 'localDisk', - // // The blank template is used as a base for create-payload-app functionality, - // // so we do not configure the payload.config.ts file, which leaves the placeholder comments. - // configureConfig: false, - // workspace: true, - // base: 'none', // Do not copy from the base _template directory - // }, - // { - // name: 'website', - // db: 'mongodb', - // dirname: 'website', - // generateLockfile: true, - // sharp: true, - // skipConfig: true, // Do not copy the payload.config.ts file from the base template - // storage: 'localDisk', - // // The blank template is used as a base for create-payload-app functionality, - // // so we do not configure the payload.config.ts file, which leaves the placeholder comments. - // configureConfig: false, - // base: 'none', - // skipDockerCompose: true, - // skipReadme: true, - // workspace: true, - // }, - // { - // name: 'ecommerce', - // db: 'mongodb', - // dirname: 'ecommerce', - // generateLockfile: true, - // sharp: true, - // skipConfig: true, // Do not copy the payload.config.ts file from the base template - // storage: 'localDisk', - // // The blank template is used as a base for create-payload-app functionality, - // // so we do not configure the payload.config.ts file, which leaves the placeholder comments. - // configureConfig: false, - // base: 'none', - // skipDockerCompose: true, - // skipReadme: true, - // workspace: true, - // }, + { + name: 'with-vercel-postgres', + db: 'vercel-postgres', + dirname: 'with-vercel-postgres', + envNames: { + // This will replace the process.env.DATABASE_URI to process.env.POSTGRES_URL + dbUri: 'POSTGRES_URL', + }, + sharp: false, + skipDockerCompose: true, + skipReadme: true, + storage: 'vercelBlobStorage', + targetDeployment: 'vercel', + vercelDeployButtonLink: + `https://vercel.com/new/clone?repository-url=` + + encodeURI( + `${templateRepoUrlBase}/with-vercel-postgres` + + '&project-name=payload-project' + + '&env=PAYLOAD_SECRET' + + '&build-command=pnpm run ci' + + '&stores=[{"type":"postgres"},{"type":"blob"}]', // Postgres and Vercel Blob Storage + ), + }, + { + name: 'with-vercel-website', + base: 'website', // This is the base template to copy from + db: 'vercel-postgres', + dirname: 'with-vercel-website', + envNames: { + // This will replace the process.env.DATABASE_URI to process.env.POSTGRES_URL + dbUri: 'POSTGRES_URL', + }, + sharp: true, + skipDockerCompose: true, + skipReadme: true, + storage: 'vercelBlobStorage', + targetDeployment: 'vercel', + vercelDeployButtonLink: + `https://vercel.com/new/clone?repository-url=` + + encodeURI( + `${templateRepoUrlBase}/with-vercel-website` + + '&project-name=payload-project' + + '&env=PAYLOAD_SECRET%2CCRON_SECRET' + + '&build-command=pnpm run ci' + + '&stores=[{"type":"postgres"},{"type":"blob"}]', // Postgres and Vercel Blob Storage + ), + }, + { + name: 'with-postgres', + db: 'postgres', + dirname: 'with-postgres', + sharp: true, + skipDockerCompose: true, + storage: 'localDisk', + }, + { + name: 'with-vercel-mongodb', + db: 'mongodb', + dirname: 'with-vercel-mongodb', + envNames: { + dbUri: 'MONGODB_URI', + }, + sharp: false, + storage: 'vercelBlobStorage', + skipReadme: true, + targetDeployment: 'vercel', + vercelDeployButtonLink: + `https://vercel.com/new/clone?repository-url=` + + encodeURI( + `${templateRepoUrlBase}/with-vercel-mongodb` + + '&project-name=payload-project' + + '&env=PAYLOAD_SECRET' + + '&build-command=pnpm run ci' + + '&stores=[{"type":"blob"}]' + // Vercel Blob Storage + '&integration-ids=oac_jnzmjqM10gllKmSrG0SGrHOH', // MongoDB Atlas + ), + }, + { + name: 'blank', + db: 'mongodb', + dirname: 'blank', + generateLockfile: true, + sharp: true, + skipConfig: true, // Do not copy the payload.config.ts file from the base template + skipReadme: true, // Do not copy the README.md file from the base template + storage: 'localDisk', + // The blank template is used as a base for create-payload-app functionality, + // so we do not configure the payload.config.ts file, which leaves the placeholder comments. + configureConfig: false, + workspace: true, + base: 'none', // Do not copy from the base _template directory + }, + { + name: 'website', + db: 'mongodb', + dirname: 'website', + generateLockfile: true, + sharp: true, + skipConfig: true, // Do not copy the payload.config.ts file from the base template + storage: 'localDisk', + // The blank template is used as a base for create-payload-app functionality, + // so we do not configure the payload.config.ts file, which leaves the placeholder comments. + configureConfig: false, + base: 'none', + skipDockerCompose: true, + skipReadme: true, + workspace: true, + }, + { + name: 'ecommerce', + db: 'mongodb', + dirname: 'ecommerce', + generateLockfile: true, + sharp: true, + skipConfig: true, // Do not copy the payload.config.ts file from the base template + storage: 'localDisk', + // The blank template is used as a base for create-payload-app functionality, + // so we do not configure the payload.config.ts file, which leaves the placeholder comments. + configureConfig: false, + base: 'none', + skipDockerCompose: true, + skipReadme: true, + workspace: true, + }, { name: 'with-cloudflare-d1', db: 'd1-sqlite',