Files
vercel/utils/update-remix-run-dev.js
Nathan Rajlich d1b0dbe3a7 [remix] Install @vercel/remix-run-dev at build-time instead of using symlink (#9784)
Instead of including the fork `@remix-run/dev` package as a regular dependency of `@vercel/remix-builder`, install it at build-time by modifying the project's `package.json` file. The reasons for this are:

* Avoids deprecation warnings from a few packages that currently exist on the `@remix-run/dev` package when installing Vercel CLI (those warnings already show up in the build logs anyways, so nothing new there).
* Allows us to install a version as close as possible to the version specified in the user's `package.json` (similar to how we do when auto-injecting the `@vercel/remix` package). This will be especially important once Remix v2 is released, which will have breaking changes compared to v1.

**Note:** `@vercel/remix-run-dev` is still a _dev_ dependency, so that we can use TypeScript types from it, as well as, at runtime, we use the version in the Builder's `package.json` to determine the maximum versions of `@vercel/remix-run-dev` and/or `@vercel/remix` which can safely be installed.

Fixes #10027.
Fixes #10222.
2023-07-28 20:49:32 +00:00

80 lines
2.2 KiB
JavaScript
Vendored

const { execSync } = require('child_process');
const path = require('path');
const fs = require('fs');
module.exports = async ({ github, context }, newVersion) => {
execSync('git config --global user.email infra+release@vercel.com');
execSync('git config --global user.name vercel-release-bot');
execSync('git checkout main');
const repoRootPath = path.join(__dirname, '..');
const packagePath = path.join(repoRootPath, 'packages', 'remix');
const oldVersion = JSON.parse(
fs.readFileSync(path.join(packagePath, 'package.json'), 'utf-8')
).devDependencies['@remix-run/dev'];
if (newVersion === '') {
newVersion = execSync('npm view @vercel/remix-run-dev dist-tags.latest', {
encoding: 'utf-8',
});
}
newVersion = newVersion.trim();
if (oldVersion === newVersion) {
// eslint-disable-next-line no-console
console.log(
`@vercel/remix-run-dev version ${newVersion} did not change, skipping update.`
);
return;
}
const branch = `vercel-remix-run-dev-${newVersion.replaceAll('.', '-')}`;
if (
execSync(`git ls-remote --heads origin ${branch}`, { encoding: 'utf-8' })
.toString()
.trim()
) {
// eslint-disable-next-line no-console
console.log(`Branch ${branch} already exists, skipping update.`);
return;
}
execSync(
`pnpm install @remix-run/dev@npm:@vercel/remix-run-dev@${newVersion} --save-exact --save-dev --lockfile-only`,
{ cwd: packagePath }
);
const changesetName = path.join(repoRootPath, `.changeset/${branch}.md`);
fs.writeFileSync(
changesetName,
`---
'@vercel/remix-builder': patch
---
Update \`@remix-run/dev\` fork to v${newVersion}
`
);
execSync(`git checkout -b ${branch}`);
execSync('git add -A');
execSync(`git commit -m ${branch}`);
execSync(`git push origin ${branch}`);
const { repo, owner } = context.repo;
const pr = await github.rest.pulls.create({
owner,
repo,
head: branch,
base: 'main',
title: `[remix] Update \`@remix-run/dev\` to v${newVersion}`,
body: `This auto-generated PR updates \`@remix-run/dev\` to version ${newVersion}.`,
});
await github.rest.issues.addLabels({
owner,
repo,
issue_number: pr.data.number,
labels: ['area: remix', 'semver: patch', 'pr: automerge'],
});
};