Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"packageManager": "pnpm@10.24.0",
"displayName": "Prettier - Code formatter",
"description": "Code formatter using prettier",
"version": "11.1.0-preview.1",
"version": "12.0.0",
"publisher": "prettier",
"author": "Prettier <@prettiercode>",
"galleryBanner": {
Expand Down
46 changes: 36 additions & 10 deletions scripts/release.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
* pnpm release major - Bump major version (11.0.0 -> 12.0.0)
* pnpm release minor - Bump minor version (11.0.0 -> 11.1.0)
* pnpm release patch - Bump patch version (11.0.0 -> 11.0.1)
* pnpm release preview - Create preview release (11.0.0 -> 11.1.0-preview.1)
* pnpm release preview - Create preview release (11.0.0 -> 11.0.0-preview.1)
* pnpm release preview 12.0.0-preview.1 - Create preview with specific version
*/
import fs from "fs/promises";
import { execSync } from "child_process";
Expand Down Expand Up @@ -45,9 +46,9 @@ function formatVersion({ major, minor, patch, prerelease, prereleaseNum }) {
return version;
}

async function updateChangelog(version) {
async function updateChangelog(version, releaseType) {
const CHANGELOG = "CHANGELOG.md";
const isPrerelease = version.includes("-");
const isPrerelease = releaseType === "preview" || version.includes("-");
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The prerelease detection logic may incorrectly classify releases when using manual versions. If a user provides pnpm release preview 12.0.0 (without prerelease suffix), the changelog will be skipped because releaseType === "preview", even though the version format indicates a stable release.

Consider determining prerelease status solely from the version format: const isPrerelease = version.includes("-"); or add validation to ensure manual versions for "preview" release type must contain a prerelease suffix.

Suggested change
const isPrerelease = releaseType === "preview" || version.includes("-");
const isPrerelease = version.includes("-");

Copilot uses AI. Check for mistakes.

if (isPrerelease) {
console.log(`Skipping changelog update for prerelease version ${version}`);
Expand Down Expand Up @@ -126,11 +127,11 @@ function calculateNewVersion(currentVersion, releaseType) {
prereleaseNum: v.prereleaseNum + 1,
});
}
// Otherwise, bump minor and start preview.1
// Otherwise, keep the same version and add preview.1
return formatVersion({
major: v.major,
minor: v.minor + 1,
patch: 0,
minor: v.minor,
patch: v.patch,
prerelease: "preview",
prereleaseNum: 1,
});
Expand All @@ -142,18 +143,42 @@ function calculateNewVersion(currentVersion, releaseType) {

async function main() {
const releaseType = process.argv[2];
const manualVersion = process.argv[3];

if (!releaseType || !RELEASE_TYPES.includes(releaseType)) {
console.error("Usage: pnpm release <major|minor|patch|preview>");
console.error("Usage: pnpm release <major|minor|patch|preview> [version]");
console.error("");
console.error("Examples:");
console.error(" pnpm release major - 11.0.0 -> 12.0.0");
console.error(" pnpm release minor - 11.0.0 -> 11.1.0");
console.error(" pnpm release patch - 11.0.0 -> 11.0.1");
console.error(" pnpm release preview - 11.0.0 -> 11.1.0-preview.1");
console.error(" pnpm release preview - 11.0.0 -> 11.0.0-preview.1");
console.error(
" pnpm release preview 12.0.0-preview.1 - Use specific version",
);
process.exit(1);
}

// Validate manual version if provided
if (manualVersion) {
if (releaseType !== "preview") {
console.error(
"Error: Manual version can only be specified with 'preview' release type.",
);
process.exit(1);
}
// Validate format
try {
parseVersion(manualVersion);
} catch {
console.error(`Error: Invalid version format: ${manualVersion}`);
console.error(
"Expected format: X.Y.Z or X.Y.Z-prerelease.N (e.g., 12.0.0-preview.1)",
);
process.exit(1);
}
}
Comment on lines +162 to +180
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The manual version validation doesn't enforce that manual versions provided with releaseType === "preview" must actually be prerelease versions. This allows users to specify stable versions like 12.0.0 with the preview release type, which could lead to confusing behavior.

Consider adding a check after parseVersion(manualVersion) to ensure the version contains a prerelease suffix:

const parsed = parseVersion(manualVersion);
if (!parsed.prerelease) {
  console.error("Error: Manual version for preview releases must include a prerelease suffix (e.g., 12.0.0-preview.1)");
  process.exit(1);
}

Copilot uses AI. Check for mistakes.

// Check for uncommitted changes
const status = execQuiet("git status --porcelain");
if (status) {
Expand All @@ -177,7 +202,8 @@ async function main() {
// Read current version
const packageJson = JSON.parse(await fs.readFile("package.json", "utf8"));
const currentVersion = packageJson.version;
const newVersion = calculateNewVersion(currentVersion, releaseType);
const newVersion =
manualVersion || calculateNewVersion(currentVersion, releaseType);

console.log(`\nRelease: ${releaseType}`);
console.log(`Current version: ${currentVersion}`);
Expand All @@ -192,7 +218,7 @@ async function main() {
console.log("Updated package.json");

// Update changelog (skip for prereleases)
await updateChangelog(newVersion);
await updateChangelog(newVersion, releaseType);

// Stage changes
exec("git add package.json CHANGELOG.md");
Expand Down
Loading