templates: set packageManager pnpm version for vercel templates (#11992)
There have been issues with deploying our templates to Vercel when we rely on `engines.pnpm` configuration. Vercel's deployments work best when we specify a `packageManager` in `package.json` since we ship our templates without lockfiles that would help Vercel determine the right package manager to use. This PR adjusts the script so that it adds a `packageManager` with the latest version of `pnpm` to our Vercel templates and removes the `engines.pnpm` only for those variants.
This commit is contained in:
@@ -68,9 +68,9 @@
|
|||||||
"tailwindcss": "^3.4.3",
|
"tailwindcss": "^3.4.3",
|
||||||
"typescript": "5.7.3"
|
"typescript": "5.7.3"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@10.3.0",
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^18.20.2 || >=20.9.0"
|
"node": "^18.20.2 || >=20.9.0",
|
||||||
|
"pnpm": "^9"
|
||||||
},
|
},
|
||||||
"pnpm": {
|
"pnpm": {
|
||||||
"onlyBuiltDependencies": [
|
"onlyBuiltDependencies": [
|
||||||
|
|||||||
@@ -6,27 +6,27 @@
|
|||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "cross-env NODE_OPTIONS=--no-deprecation next build",
|
"build": "cross-env NODE_OPTIONS=--no-deprecation next build",
|
||||||
|
"ci": "payload migrate && pnpm build",
|
||||||
"dev": "cross-env NODE_OPTIONS=--no-deprecation next dev",
|
"dev": "cross-env NODE_OPTIONS=--no-deprecation next dev",
|
||||||
"devsafe": "rm -rf .next && cross-env NODE_OPTIONS=--no-deprecation next dev",
|
"devsafe": "rm -rf .next && cross-env NODE_OPTIONS=--no-deprecation next dev",
|
||||||
"generate:importmap": "cross-env NODE_OPTIONS=--no-deprecation payload generate:importmap",
|
"generate:importmap": "cross-env NODE_OPTIONS=--no-deprecation payload generate:importmap",
|
||||||
"generate:types": "cross-env NODE_OPTIONS=--no-deprecation payload generate:types",
|
"generate:types": "cross-env NODE_OPTIONS=--no-deprecation payload generate:types",
|
||||||
"lint": "cross-env NODE_OPTIONS=--no-deprecation next lint",
|
"lint": "cross-env NODE_OPTIONS=--no-deprecation next lint",
|
||||||
"payload": "cross-env NODE_OPTIONS=--no-deprecation payload",
|
"payload": "cross-env NODE_OPTIONS=--no-deprecation payload",
|
||||||
"start": "cross-env NODE_OPTIONS=--no-deprecation next start",
|
"start": "cross-env NODE_OPTIONS=--no-deprecation next start"
|
||||||
"ci": "payload migrate && pnpm build"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@payloadcms/next": "3.31.0",
|
"@payloadcms/db-postgres": "3.32.0",
|
||||||
"@payloadcms/payload-cloud": "3.31.0",
|
"@payloadcms/next": "3.32.0",
|
||||||
"@payloadcms/richtext-lexical": "3.31.0",
|
"@payloadcms/payload-cloud": "3.32.0",
|
||||||
|
"@payloadcms/richtext-lexical": "3.32.0",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"graphql": "^16.8.1",
|
"graphql": "^16.8.1",
|
||||||
"next": "15.2.3",
|
"next": "15.2.3",
|
||||||
"payload": "3.31.0",
|
"payload": "3.32.0",
|
||||||
"react": "19.0.0",
|
"react": "19.0.0",
|
||||||
"react-dom": "19.0.0",
|
"react-dom": "19.0.0",
|
||||||
"sharp": "0.32.6",
|
"sharp": "0.32.6"
|
||||||
"@payloadcms/db-postgres": "3.31.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/eslintrc": "^3.2.0",
|
"@eslint/eslintrc": "^3.2.0",
|
||||||
|
|||||||
@@ -6,27 +6,27 @@
|
|||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "cross-env NODE_OPTIONS=--no-deprecation next build",
|
"build": "cross-env NODE_OPTIONS=--no-deprecation next build",
|
||||||
|
"ci": "payload migrate && pnpm build",
|
||||||
"dev": "cross-env NODE_OPTIONS=--no-deprecation next dev",
|
"dev": "cross-env NODE_OPTIONS=--no-deprecation next dev",
|
||||||
"devsafe": "rm -rf .next && cross-env NODE_OPTIONS=--no-deprecation next dev",
|
"devsafe": "rm -rf .next && cross-env NODE_OPTIONS=--no-deprecation next dev",
|
||||||
"generate:importmap": "cross-env NODE_OPTIONS=--no-deprecation payload generate:importmap",
|
"generate:importmap": "cross-env NODE_OPTIONS=--no-deprecation payload generate:importmap",
|
||||||
"generate:types": "cross-env NODE_OPTIONS=--no-deprecation payload generate:types",
|
"generate:types": "cross-env NODE_OPTIONS=--no-deprecation payload generate:types",
|
||||||
"lint": "cross-env NODE_OPTIONS=--no-deprecation next lint",
|
"lint": "cross-env NODE_OPTIONS=--no-deprecation next lint",
|
||||||
"payload": "cross-env NODE_OPTIONS=--no-deprecation payload",
|
"payload": "cross-env NODE_OPTIONS=--no-deprecation payload",
|
||||||
"start": "cross-env NODE_OPTIONS=--no-deprecation next start",
|
"start": "cross-env NODE_OPTIONS=--no-deprecation next start"
|
||||||
"ci": "payload migrate && pnpm build"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@payloadcms/next": "3.31.0",
|
"@payloadcms/db-vercel-postgres": "3.32.0",
|
||||||
"@payloadcms/payload-cloud": "3.31.0",
|
"@payloadcms/next": "3.32.0",
|
||||||
"@payloadcms/richtext-lexical": "3.31.0",
|
"@payloadcms/payload-cloud": "3.32.0",
|
||||||
|
"@payloadcms/richtext-lexical": "3.32.0",
|
||||||
|
"@payloadcms/storage-vercel-blob": "3.32.0",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"graphql": "^16.8.1",
|
"graphql": "^16.8.1",
|
||||||
"next": "15.2.3",
|
"next": "15.2.3",
|
||||||
"payload": "3.31.0",
|
"payload": "3.32.0",
|
||||||
"react": "19.0.0",
|
"react": "19.0.0",
|
||||||
"react-dom": "19.0.0",
|
"react-dom": "19.0.0"
|
||||||
"@payloadcms/db-vercel-postgres": "3.31.0",
|
|
||||||
"@payloadcms/storage-vercel-blob": "3.31.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/eslintrc": "^3.2.0",
|
"@eslint/eslintrc": "^3.2.0",
|
||||||
@@ -38,9 +38,9 @@
|
|||||||
"prettier": "^3.4.2",
|
"prettier": "^3.4.2",
|
||||||
"typescript": "5.7.3"
|
"typescript": "5.7.3"
|
||||||
},
|
},
|
||||||
|
"packageManager": "pnpm@10.7.1",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^18.20.2 || >=20.9.0",
|
"node": "^18.20.2 || >=20.9.0"
|
||||||
"pnpm": "^9"
|
|
||||||
},
|
},
|
||||||
"pnpm": {
|
"pnpm": {
|
||||||
"onlyBuiltDependencies": [
|
"onlyBuiltDependencies": [
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "cross-env NODE_OPTIONS=--no-deprecation next build",
|
"build": "cross-env NODE_OPTIONS=--no-deprecation next build",
|
||||||
"postbuild": "next-sitemap --config next-sitemap.config.cjs",
|
"postbuild": "next-sitemap --config next-sitemap.config.cjs",
|
||||||
|
"ci": "payload migrate && pnpm build",
|
||||||
"dev": "cross-env NODE_OPTIONS=--no-deprecation next dev",
|
"dev": "cross-env NODE_OPTIONS=--no-deprecation next dev",
|
||||||
"dev:prod": "cross-env NODE_OPTIONS=--no-deprecation rm -rf .next && pnpm build && pnpm start",
|
"dev:prod": "cross-env NODE_OPTIONS=--no-deprecation rm -rf .next && pnpm build && pnpm start",
|
||||||
"generate:importmap": "cross-env NODE_OPTIONS=--no-deprecation payload generate:importmap",
|
"generate:importmap": "cross-env NODE_OPTIONS=--no-deprecation payload generate:importmap",
|
||||||
@@ -16,21 +17,22 @@
|
|||||||
"lint:fix": "cross-env NODE_OPTIONS=--no-deprecation next lint --fix",
|
"lint:fix": "cross-env NODE_OPTIONS=--no-deprecation next lint --fix",
|
||||||
"payload": "cross-env NODE_OPTIONS=--no-deprecation payload",
|
"payload": "cross-env NODE_OPTIONS=--no-deprecation payload",
|
||||||
"reinstall": "cross-env NODE_OPTIONS=--no-deprecation rm -rf node_modules && rm pnpm-lock.yaml && pnpm --ignore-workspace install",
|
"reinstall": "cross-env NODE_OPTIONS=--no-deprecation rm -rf node_modules && rm pnpm-lock.yaml && pnpm --ignore-workspace install",
|
||||||
"start": "cross-env NODE_OPTIONS=--no-deprecation next start",
|
"start": "cross-env NODE_OPTIONS=--no-deprecation next start"
|
||||||
"ci": "payload migrate && pnpm build"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@payloadcms/admin-bar": "3.31.0",
|
"@payloadcms/admin-bar": "3.32.0",
|
||||||
"@payloadcms/live-preview-react": "3.31.0",
|
"@payloadcms/db-vercel-postgres": "3.32.0",
|
||||||
"@payloadcms/next": "3.31.0",
|
"@payloadcms/live-preview-react": "3.32.0",
|
||||||
"@payloadcms/payload-cloud": "3.31.0",
|
"@payloadcms/next": "3.32.0",
|
||||||
"@payloadcms/plugin-form-builder": "3.31.0",
|
"@payloadcms/payload-cloud": "3.32.0",
|
||||||
"@payloadcms/plugin-nested-docs": "3.31.0",
|
"@payloadcms/plugin-form-builder": "3.32.0",
|
||||||
"@payloadcms/plugin-redirects": "3.31.0",
|
"@payloadcms/plugin-nested-docs": "3.32.0",
|
||||||
"@payloadcms/plugin-search": "3.31.0",
|
"@payloadcms/plugin-redirects": "3.32.0",
|
||||||
"@payloadcms/plugin-seo": "3.31.0",
|
"@payloadcms/plugin-search": "3.32.0",
|
||||||
"@payloadcms/richtext-lexical": "3.31.0",
|
"@payloadcms/plugin-seo": "3.32.0",
|
||||||
"@payloadcms/ui": "3.31.0",
|
"@payloadcms/richtext-lexical": "3.32.0",
|
||||||
|
"@payloadcms/storage-vercel-blob": "3.32.0",
|
||||||
|
"@payloadcms/ui": "3.32.0",
|
||||||
"@radix-ui/react-checkbox": "^1.0.4",
|
"@radix-ui/react-checkbox": "^1.0.4",
|
||||||
"@radix-ui/react-label": "^2.0.2",
|
"@radix-ui/react-label": "^2.0.2",
|
||||||
"@radix-ui/react-select": "^2.0.0",
|
"@radix-ui/react-select": "^2.0.0",
|
||||||
@@ -43,16 +45,14 @@
|
|||||||
"lucide-react": "^0.378.0",
|
"lucide-react": "^0.378.0",
|
||||||
"next": "15.2.3",
|
"next": "15.2.3",
|
||||||
"next-sitemap": "^4.2.3",
|
"next-sitemap": "^4.2.3",
|
||||||
"payload": "3.31.0",
|
"payload": "3.32.0",
|
||||||
"prism-react-renderer": "^2.3.1",
|
"prism-react-renderer": "^2.3.1",
|
||||||
"react": "19.0.0",
|
"react": "19.0.0",
|
||||||
"react-dom": "19.0.0",
|
"react-dom": "19.0.0",
|
||||||
"react-hook-form": "7.45.4",
|
"react-hook-form": "7.45.4",
|
||||||
"sharp": "0.32.6",
|
"sharp": "0.32.6",
|
||||||
"tailwind-merge": "^2.3.0",
|
"tailwind-merge": "^2.3.0",
|
||||||
"tailwindcss-animate": "^1.0.7",
|
"tailwindcss-animate": "^1.0.7"
|
||||||
"@payloadcms/db-vercel-postgres": "3.31.0",
|
|
||||||
"@payloadcms/storage-vercel-blob": "3.31.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/eslintrc": "^3.2.0",
|
"@eslint/eslintrc": "^3.2.0",
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
"tailwindcss": "^3.4.3",
|
"tailwindcss": "^3.4.3",
|
||||||
"typescript": "5.7.3"
|
"typescript": "5.7.3"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@10.3.0",
|
"packageManager": "pnpm@10.7.1",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^18.20.2 || >=20.9.0"
|
"node": "^18.20.2 || >=20.9.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -45,6 +45,13 @@ type TemplateVariation = {
|
|||||||
skipReadme?: boolean
|
skipReadme?: boolean
|
||||||
storage: StorageAdapterType
|
storage: StorageAdapterType
|
||||||
vercelDeployButtonLink?: string
|
vercelDeployButtonLink?: string
|
||||||
|
/**
|
||||||
|
* Identify where this template is intended to be deployed.
|
||||||
|
* Useful for making some modifications like PNPM's engines config for Vercel.
|
||||||
|
*
|
||||||
|
* @default 'default'
|
||||||
|
*/
|
||||||
|
targetDeployment?: 'default' | 'vercel'
|
||||||
}
|
}
|
||||||
|
|
||||||
main().catch((error) => {
|
main().catch((error) => {
|
||||||
@@ -72,6 +79,7 @@ async function main() {
|
|||||||
sharp: false,
|
sharp: false,
|
||||||
skipDockerCompose: true,
|
skipDockerCompose: true,
|
||||||
storage: 'vercelBlobStorage',
|
storage: 'vercelBlobStorage',
|
||||||
|
targetDeployment: 'vercel',
|
||||||
vercelDeployButtonLink:
|
vercelDeployButtonLink:
|
||||||
`https://vercel.com/new/clone?repository-url=` +
|
`https://vercel.com/new/clone?repository-url=` +
|
||||||
encodeURI(
|
encodeURI(
|
||||||
@@ -95,6 +103,7 @@ async function main() {
|
|||||||
skipDockerCompose: true,
|
skipDockerCompose: true,
|
||||||
skipReadme: true,
|
skipReadme: true,
|
||||||
storage: 'vercelBlobStorage',
|
storage: 'vercelBlobStorage',
|
||||||
|
targetDeployment: 'vercel',
|
||||||
vercelDeployButtonLink:
|
vercelDeployButtonLink:
|
||||||
`https://vercel.com/new/clone?repository-url=` +
|
`https://vercel.com/new/clone?repository-url=` +
|
||||||
encodeURI(
|
encodeURI(
|
||||||
@@ -122,6 +131,7 @@ async function main() {
|
|||||||
},
|
},
|
||||||
sharp: false,
|
sharp: false,
|
||||||
storage: 'vercelBlobStorage',
|
storage: 'vercelBlobStorage',
|
||||||
|
targetDeployment: 'vercel',
|
||||||
vercelDeployButtonLink:
|
vercelDeployButtonLink:
|
||||||
`https://vercel.com/new/clone?repository-url=` +
|
`https://vercel.com/new/clone?repository-url=` +
|
||||||
encodeURI(
|
encodeURI(
|
||||||
@@ -186,6 +196,7 @@ async function main() {
|
|||||||
skipReadme = false,
|
skipReadme = false,
|
||||||
storage,
|
storage,
|
||||||
vercelDeployButtonLink,
|
vercelDeployButtonLink,
|
||||||
|
targetDeployment = 'default',
|
||||||
} = variation
|
} = variation
|
||||||
|
|
||||||
header(`Generating ${name}...`)
|
header(`Generating ${name}...`)
|
||||||
@@ -239,12 +250,12 @@ async function main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Fetch latest npm version of payload package:
|
// Fetch latest npm version of payload package:
|
||||||
const version = await getLatestPayloadVersion()
|
const payloadVersion = await getLatestPackageVersion({ packageName: 'payload' })
|
||||||
|
|
||||||
// Bump package.json versions
|
// Bump package.json versions
|
||||||
await bumpPackageJson({
|
await bumpPackageJson({
|
||||||
templateDir: destDir,
|
templateDir: destDir,
|
||||||
latestVersion: version,
|
latestVersion: payloadVersion,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (generateLockfile) {
|
if (generateLockfile) {
|
||||||
@@ -284,6 +295,13 @@ async function main() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (targetDeployment) {
|
||||||
|
await handleDeploymentTarget({
|
||||||
|
targetDeployment,
|
||||||
|
destDir,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// Generate importmap
|
// Generate importmap
|
||||||
log('Generating import map')
|
log('Generating import map')
|
||||||
execSyncSafe(`pnpm --ignore-workspace generate:importmap`, { cwd: destDir })
|
execSyncSafe(`pnpm --ignore-workspace generate:importmap`, { cwd: destDir })
|
||||||
@@ -337,6 +355,30 @@ ${description}
|
|||||||
log('Generated README.md')
|
log('Generated README.md')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function handleDeploymentTarget({
|
||||||
|
targetDeployment,
|
||||||
|
destDir,
|
||||||
|
}: {
|
||||||
|
targetDeployment: TemplateVariation['targetDeployment']
|
||||||
|
destDir: string
|
||||||
|
}) {
|
||||||
|
if (targetDeployment === 'vercel') {
|
||||||
|
// Add Vercel specific settings to package.json
|
||||||
|
const packageJsonPath = path.join(destDir, 'package.json')
|
||||||
|
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'))
|
||||||
|
|
||||||
|
if (packageJson.engines?.pnpm) {
|
||||||
|
delete packageJson.engines.pnpm
|
||||||
|
}
|
||||||
|
|
||||||
|
const pnpmVersion = await getLatestPackageVersion({ packageName: 'pnpm' })
|
||||||
|
|
||||||
|
packageJson.packageManager = `pnpm@${pnpmVersion}`
|
||||||
|
|
||||||
|
await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function writeEnvExample({
|
async function writeEnvExample({
|
||||||
dbType,
|
dbType,
|
||||||
destDir,
|
destDir,
|
||||||
@@ -450,9 +492,20 @@ async function bumpPackageJson({
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getLatestPayloadVersion() {
|
async function getLatestPackageVersion({
|
||||||
|
packageName = 'payload',
|
||||||
|
}: {
|
||||||
|
/**
|
||||||
|
* Package name to fetch the latest version for based on the NPM registry URL
|
||||||
|
*
|
||||||
|
* Eg. for `'payload'`, it will fetch the version from `https://registry.npmjs.org/payload`
|
||||||
|
*
|
||||||
|
* @default 'payload'
|
||||||
|
*/
|
||||||
|
packageName?: string
|
||||||
|
}) {
|
||||||
try {
|
try {
|
||||||
const response = await fetch('https://registry.npmjs.org/payload')
|
const response = await fetch(`https://registry.npmjs.org/${packageName}`)
|
||||||
const data = await response.json()
|
const data = await response.json()
|
||||||
const latestVersion = data['dist-tags'].latest
|
const latestVersion = data['dist-tags'].latest
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user