66 * pnpm release major - Bump major version (11.0.0 -> 12.0.0)
77 * pnpm release minor - Bump minor version (11.0.0 -> 11.1.0)
88 * pnpm release patch - Bump patch version (11.0.0 -> 11.0.1)
9- * pnpm release preview - Create preview release (11.0.0 -> 11.1.0-preview.1)
9+ * pnpm release preview - Create preview release (11.0.0 -> 11.0.0-preview.1)
10+ * pnpm release preview 12.0.0-preview.1 - Create preview with specific version
1011 */
1112import fs from "fs/promises" ;
1213import { execSync } from "child_process" ;
@@ -45,9 +46,9 @@ function formatVersion({ major, minor, patch, prerelease, prereleaseNum }) {
4546 return version ;
4647}
4748
48- async function updateChangelog ( version ) {
49+ async function updateChangelog ( version , releaseType ) {
4950 const CHANGELOG = "CHANGELOG.md" ;
50- const isPrerelease = version . includes ( "-" ) ;
51+ const isPrerelease = releaseType === "preview" || version . includes ( "-" ) ;
5152
5253 if ( isPrerelease ) {
5354 console . log ( `Skipping changelog update for prerelease version ${ version } ` ) ;
@@ -126,11 +127,11 @@ function calculateNewVersion(currentVersion, releaseType) {
126127 prereleaseNum : v . prereleaseNum + 1 ,
127128 } ) ;
128129 }
129- // Otherwise, bump minor and start preview.1
130+ // Otherwise, keep the same version and add preview.1
130131 return formatVersion ( {
131132 major : v . major ,
132- minor : v . minor + 1 ,
133- patch : 0 ,
133+ minor : v . minor ,
134+ patch : v . patch ,
134135 prerelease : "preview" ,
135136 prereleaseNum : 1 ,
136137 } ) ;
@@ -142,18 +143,42 @@ function calculateNewVersion(currentVersion, releaseType) {
142143
143144async function main ( ) {
144145 const releaseType = process . argv [ 2 ] ;
146+ const manualVersion = process . argv [ 3 ] ;
145147
146148 if ( ! releaseType || ! RELEASE_TYPES . includes ( releaseType ) ) {
147- console . error ( "Usage: pnpm release <major|minor|patch|preview>" ) ;
149+ console . error ( "Usage: pnpm release <major|minor|patch|preview> [version] " ) ;
148150 console . error ( "" ) ;
149151 console . error ( "Examples:" ) ;
150152 console . error ( " pnpm release major - 11.0.0 -> 12.0.0" ) ;
151153 console . error ( " pnpm release minor - 11.0.0 -> 11.1.0" ) ;
152154 console . error ( " pnpm release patch - 11.0.0 -> 11.0.1" ) ;
153- console . error ( " pnpm release preview - 11.0.0 -> 11.1.0-preview.1" ) ;
155+ console . error ( " pnpm release preview - 11.0.0 -> 11.0.0-preview.1" ) ;
156+ console . error (
157+ " pnpm release preview 12.0.0-preview.1 - Use specific version" ,
158+ ) ;
154159 process . exit ( 1 ) ;
155160 }
156161
162+ // Validate manual version if provided
163+ if ( manualVersion ) {
164+ if ( releaseType !== "preview" ) {
165+ console . error (
166+ "Error: Manual version can only be specified with 'preview' release type." ,
167+ ) ;
168+ process . exit ( 1 ) ;
169+ }
170+ // Validate format
171+ try {
172+ parseVersion ( manualVersion ) ;
173+ } catch {
174+ console . error ( `Error: Invalid version format: ${ manualVersion } ` ) ;
175+ console . error (
176+ "Expected format: X.Y.Z or X.Y.Z-prerelease.N (e.g., 12.0.0-preview.1)" ,
177+ ) ;
178+ process . exit ( 1 ) ;
179+ }
180+ }
181+
157182 // Check for uncommitted changes
158183 const status = execQuiet ( "git status --porcelain" ) ;
159184 if ( status ) {
@@ -177,7 +202,8 @@ async function main() {
177202 // Read current version
178203 const packageJson = JSON . parse ( await fs . readFile ( "package.json" , "utf8" ) ) ;
179204 const currentVersion = packageJson . version ;
180- const newVersion = calculateNewVersion ( currentVersion , releaseType ) ;
205+ const newVersion =
206+ manualVersion || calculateNewVersion ( currentVersion , releaseType ) ;
181207
182208 console . log ( `\nRelease: ${ releaseType } ` ) ;
183209 console . log ( `Current version: ${ currentVersion } ` ) ;
@@ -192,7 +218,7 @@ async function main() {
192218 console . log ( "Updated package.json" ) ;
193219
194220 // Update changelog (skip for prereleases)
195- await updateChangelog ( newVersion ) ;
221+ await updateChangelog ( newVersion , releaseType ) ;
196222
197223 // Stage changes
198224 exec ( "git add package.json CHANGELOG.md" ) ;
0 commit comments