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:
Paul
2025-04-04 18:30:04 +01:00
committed by GitHub
parent f7ed8e90e1
commit b76844dac9
5 changed files with 96 additions and 43 deletions

View File

@@ -45,6 +45,13 @@ type TemplateVariation = {
skipReadme?: boolean
storage: StorageAdapterType
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) => {
@@ -72,6 +79,7 @@ async function main() {
sharp: false,
skipDockerCompose: true,
storage: 'vercelBlobStorage',
targetDeployment: 'vercel',
vercelDeployButtonLink:
`https://vercel.com/new/clone?repository-url=` +
encodeURI(
@@ -95,6 +103,7 @@ async function main() {
skipDockerCompose: true,
skipReadme: true,
storage: 'vercelBlobStorage',
targetDeployment: 'vercel',
vercelDeployButtonLink:
`https://vercel.com/new/clone?repository-url=` +
encodeURI(
@@ -122,6 +131,7 @@ async function main() {
},
sharp: false,
storage: 'vercelBlobStorage',
targetDeployment: 'vercel',
vercelDeployButtonLink:
`https://vercel.com/new/clone?repository-url=` +
encodeURI(
@@ -186,6 +196,7 @@ async function main() {
skipReadme = false,
storage,
vercelDeployButtonLink,
targetDeployment = 'default',
} = variation
header(`Generating ${name}...`)
@@ -239,12 +250,12 @@ async function main() {
}
// Fetch latest npm version of payload package:
const version = await getLatestPayloadVersion()
const payloadVersion = await getLatestPackageVersion({ packageName: 'payload' })
// Bump package.json versions
await bumpPackageJson({
templateDir: destDir,
latestVersion: version,
latestVersion: payloadVersion,
})
if (generateLockfile) {
@@ -284,6 +295,13 @@ async function main() {
})
}
if (targetDeployment) {
await handleDeploymentTarget({
targetDeployment,
destDir,
})
}
// Generate importmap
log('Generating import map')
execSyncSafe(`pnpm --ignore-workspace generate:importmap`, { cwd: destDir })
@@ -337,6 +355,30 @@ ${description}
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({
dbType,
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 {
const response = await fetch('https://registry.npmjs.org/payload')
const response = await fetch(`https://registry.npmjs.org/${packageName}`)
const data = await response.json()
const latestVersion = data['dist-tags'].latest