Skip to content

Commit e8140ed

Browse files
authored
feat(cpa): add cloudflare template to create-payload-app command (#14091)
Adds the D1 Cloudlfare template to the CPA command - if the D1 adapter is selected then it won't prompt for a DB connection string since this database doesn't use one
1 parent abebd24 commit e8140ed

File tree

8 files changed

+34
-23
lines changed

8 files changed

+34
-23
lines changed

packages/create-payload-app/src/lib/init-next.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -222,12 +222,9 @@ async function installAndConfigurePayload(
222222
}
223223

224224
async function installDeps(projectDir: string, packageManager: PackageManager, dbType: DbType) {
225-
const packagesToInstall = [
226-
'payload',
227-
'@payloadcms/next',
228-
'@payloadcms/richtext-lexical',
229-
'@payloadcms/payload-cloud',
230-
].map((pkg) => `${pkg}@latest`)
225+
const packagesToInstall = ['payload', '@payloadcms/next', '@payloadcms/richtext-lexical'].map(
226+
(pkg) => `${pkg}@latest`,
227+
)
231228

232229
packagesToInstall.push(`@payloadcms/db-${dbType}@latest`)
233230

packages/create-payload-app/src/lib/manage-env-files.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ const sanitizeEnv = ({
2525
if (
2626
!contents.includes('DATABASE_URI') &&
2727
!contents.includes('POSTGRES_URL') &&
28-
!contents.includes('MONGODB_URI')
28+
!contents.includes('MONGODB_URI') &&
29+
databaseType !== 'd1-sqlite'
2930
) {
3031
withDefaults += '\nDATABASE_URI=your-connection-string-here'
3132
}

packages/create-payload-app/src/lib/replacements.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,16 @@ const sqliteReplacement: DbAdapterReplacement = {
5353
packageName: '@payloadcms/db-sqlite',
5454
}
5555

56+
const d1SqliteReplacement: DbAdapterReplacement = {
57+
configReplacement: (envName = 'DATABASE_URI') => [
58+
'db: sqliteD1Adapter({ binding: cloudflare.env.D1 }),',
59+
],
60+
importReplacement: "import { sqliteD1Adapter } from '@payloadcms/db-d1-sqlite'",
61+
packageName: '@payloadcms/db-d1-sqlite',
62+
}
63+
5664
export const dbReplacements: Record<DbType, DbAdapterReplacement> = {
65+
'd1-sqlite': d1SqliteReplacement,
5766
mongodb: mongodbReplacement,
5867
postgres: postgresReplacement,
5968
sqlite: sqliteReplacement,
@@ -80,12 +89,6 @@ const vercelBlobStorageReplacement: StorageAdapterReplacement = {
8089
packageName: '@payloadcms/storage-vercel-blob',
8190
}
8291

83-
const payloadCloudReplacement: StorageAdapterReplacement = {
84-
configReplacement: [' payloadCloudPlugin(),'],
85-
importReplacement: "import { payloadCloudPlugin } from '@payloadcms/payload-cloud'",
86-
packageName: '@payloadcms/payload-cloud',
87-
}
88-
8992
// Removes placeholders
9093
const diskReplacement: StorageAdapterReplacement = {
9194
configReplacement: [],
@@ -94,7 +97,6 @@ const diskReplacement: StorageAdapterReplacement = {
9497

9598
export const storageReplacements: Record<StorageAdapterType, StorageAdapterReplacement> = {
9699
localDisk: diskReplacement,
97-
payloadCloud: payloadCloudReplacement,
98100
vercelBlobStorage: vercelBlobStorageReplacement,
99101
}
100102

packages/create-payload-app/src/lib/select-db.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@ import slugify from '@sindresorhus/slugify'
44
import type { CliArgs, DbDetails, DbType } from '../types.js'
55

66
type DbChoice = {
7-
dbConnectionPrefix: `${string}/`
7+
dbConnectionPrefix?: `${string}/`
88
dbConnectionSuffix?: string
99
title: string
1010
value: DbType
1111
}
1212

1313
export const dbChoiceRecord: Record<DbType, DbChoice> = {
14+
'd1-sqlite': {
15+
title: 'Cloudflare D1 SQlite',
16+
value: 'd1-sqlite',
17+
},
1418
mongodb: {
1519
dbConnectionPrefix: 'mongodb://127.0.0.1/',
1620
title: 'MongoDB',
@@ -70,7 +74,8 @@ export async function selectDb(args: CliArgs, projectName: string): Promise<DbDe
7074
dbUri = initialDbUri
7175
} else if (args['--db-connection-string']) {
7276
dbUri = args['--db-connection-string']
73-
} else {
77+
// D1 Sqlite does not use a connection string so skip this prompt for this database
78+
} else if (dbType !== 'd1-sqlite') {
7479
dbUri = await p.text({
7580
initialValue: initialDbUri,
7681
message: `Enter ${dbChoice.title.split(' ')[0]} connection string`, // strip beta from title

packages/create-payload-app/src/lib/templates.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ export function getValidTemplates(): ProjectTemplate[] {
3333
description: 'Ecommerce template',
3434
url: 'https://github.com/payloadcms/payload/templates/ecommerce#main',
3535
},
36+
{
37+
name: 'with-cloudflare-d1',
38+
type: 'starter',
39+
description: 'Blank template with Cloudflare D1 and Workers integration',
40+
url: 'https://github.com/payloadcms/payload/templates/with-cloudflare-d1#main',
41+
},
3642
{
3743
name: 'plugin',
3844
type: 'plugin',

packages/create-payload-app/src/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,10 @@ interface Template {
6767

6868
export type PackageManager = 'bun' | 'npm' | 'pnpm' | 'yarn'
6969

70-
export type DbType = 'mongodb' | 'postgres' | 'sqlite' | 'vercel-postgres'
70+
export type DbType = 'd1-sqlite' | 'mongodb' | 'postgres' | 'sqlite' | 'vercel-postgres'
7171

7272
export type DbDetails = {
73-
dbUri: string
73+
dbUri?: string
7474
type: DbType
7575
}
7676

@@ -89,4 +89,4 @@ export type NextAppDetails = {
8989

9090
export type NextConfigType = 'cjs' | 'esm' | 'ts'
9191

92-
export type StorageAdapterType = 'localDisk' | 'payloadCloud' | 'vercelBlobStorage'
92+
export type StorageAdapterType = 'localDisk' | 'vercelBlobStorage'

templates/with-cloudflare-d1/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
"@opennextjs/cloudflare": "^1.6.5",
2929
"@payloadcms/db-d1-sqlite": "3.58.0",
3030
"@payloadcms/next": "3.58.0",
31-
"@payloadcms/payload-cloud": "3.58.0",
3231
"@payloadcms/richtext-lexical": "3.58.0",
3332
"@payloadcms/storage-r2": "3.58.0",
3433
"@payloadcms/ui": "3.58.0",

templates/with-cloudflare-d1/src/payload.config.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// storage-adapter-import-placeholder
2-
import { sqliteD1Adapter } from '@payloadcms/db-d1-sqlite'
3-
import { payloadCloudPlugin } from '@payloadcms/payload-cloud'
2+
import { sqliteD1Adapter } from '@payloadcms/db-d1-sqlite' // database-adapter-import
43
import { lexicalEditor } from '@payloadcms/richtext-lexical'
54
import path from 'path'
65
import { buildConfig } from 'payload'
@@ -34,9 +33,11 @@ export default buildConfig({
3433
typescript: {
3534
outputFile: path.resolve(dirname, 'payload-types.ts'),
3635
},
36+
// database-adapter-config-start
3737
db: sqliteD1Adapter({ binding: cloudflare.env.D1 }),
38+
// database-adapter-config-end
3839
plugins: [
39-
payloadCloudPlugin(),
40+
// storage-adapter-placeholder
4041
r2Storage({
4142
bucket: cloudflare.env.R2,
4243
collections: { media: true },

0 commit comments

Comments
 (0)