From 338310e438be8bac2efcb1db4da313c046d45eef Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Fri, 4 Sep 2026 02:43:26 +0800 Subject: [PATCH] Replace `enquirer` with `@clack/prompts` (#19975) --- package.json | 2 +- scripts/generate-changelog.js | 94 ++++++++++++++++++++--------------- yarn.lock | 57 ++++++++++++++------- 3 files changed, 95 insertions(+), 58 deletions(-) diff --git a/package.json b/package.json index 7fb8c48f0..a1f9600ba 100644 --- a/package.json +++ b/package.json @@ -135,6 +135,7 @@ }, "devDependencies": { "@babel/generator": "8.0.0", + "@clack/prompts": "1.7.0", "@eslint/js": "10.0.1", "@stylistic/eslint-plugin": "5.10.0", "@types/jsesc": "3.0.3", @@ -149,7 +150,6 @@ "commonmark-test-suite": "0.1.0", "cross-env": "10.1.0", "cspell": "10.1.1", - "enquirer": "2.4.1", "esbuild": "0.28.2", "esbuild-visualizer": "0.7.0", "eslint": "10.9.1", diff --git a/scripts/generate-changelog.js b/scripts/generate-changelog.js index e3d78565e..284ed8eae 100755 --- a/scripts/generate-changelog.js +++ b/scripts/generate-changelog.js @@ -10,46 +10,70 @@ */ import fs from "node:fs/promises"; -import enquirer from "enquirer"; +import * as prompts from "@clack/prompts"; import openEditor from "open-editor"; -import { CHANGELOG_CATEGORIES } from "./utilities/changelog.js"; +import { categories } from "./utilities/changelog.js"; -const prNumberPrompt = new enquirer.NumberPrompt({ - message: "Input your Pull Request number:", -}); -const prNumber = await prNumberPrompt.run(); +async function generateChangelog() { + let prNumber = await prompts.text({ + message: "Pull request number:", + initialValue: "", + validate(value) { + value = value.trim(); -const categoryPrompt = new enquirer.AutoComplete({ - message: "Input category of your Pull Request:", - limit: CHANGELOG_CATEGORIES.length, - // The array passed to `choices` will be broken, so copy it. - choices: [...CHANGELOG_CATEGORIES], -}); -const category = (await categoryPrompt.run()).trim(); + if (!value) { + return "Pull request number is required."; + } -if (!prNumber || !category) { - throw new Error("Two args are required."); -} -assertCategory(category); + if (!/^\d{4,}$/.test(value)) { + return "Invalid pull request number."; + } + }, + withGuide: false, + }); -const { title, user } = await getPr(prNumber); + if (prompts.isCancel(prNumber)) { + return; + } -const content = await createChangelog(title, user, prNumber, category); + const category = await prompts.autocomplete({ + message: "Category:", + options: categories.map((category) => ({ + value: category.dir, + label: category.title, + })), + withGuide: false, + }); -const file = await addNewChangelog(prNumber, category, content); + if (prompts.isCancel(category)) { + return; + } -const relativePath = file.href.slice( - new URL("../", import.meta.url).href.length, -); + prNumber = prNumber.trim(); -console.log("Generated changelog file: " + relativePath); + const { title, user } = await getPr(prNumber); -const shouldOpenChangelog = await new enquirer.Confirm({ - message: "Open changelog file?", - initial: true, -}).run(); + const content = await createChangelog(title, user, prNumber, category); + + const file = await addNewChangelog(prNumber, category, content); + + const relativePath = file.href.slice( + new URL("../", import.meta.url).href.length, + ); + + console.log("Generated changelog file: " + relativePath); + + const shouldOpenChangelog = await prompts.confirm({ + message: "Open changelog file?", + initialValue: true, + vertical: true, + withGuide: false, + }); + + if (prompts.isCancel(shouldOpenChangelog) || !shouldOpenChangelog) { + return; + } -if (shouldOpenChangelog) { try { openEditor([file]); } catch (error) { @@ -58,7 +82,7 @@ if (shouldOpenChangelog) { } /** - * @param {number} prNumber + * @param {string} prNumber * @returns {Promise<{ title: string; user: string }>} */ async function getPr(prNumber) { @@ -199,12 +223,4 @@ function generateComment(syntax, comment) { } } -/** - * @param {unknown} - * @returns {void} - */ -function assertCategory(category) { - if (!CHANGELOG_CATEGORIES.includes(category)) { - throw new Error(`${category} is invalid category`); - } -} +await generateChangelog(); diff --git a/yarn.lock b/yarn.lock index 2159c38a5..4f6a25b0b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -507,6 +507,28 @@ __metadata: languageName: node linkType: hard +"@clack/core@npm:1.4.3": + version: 1.4.3 + resolution: "@clack/core@npm:1.4.3" + dependencies: + fast-wrap-ansi: "npm:^0.2.0" + sisteransi: "npm:^1.0.5" + checksum: 10/9d875718cb161e0eca97c3ed3ba3063211436c4224a04556b840e045f18505c8fdb645754d9459181069b3a3b6699962d0f47e38e2502cb0acfef1649b3557b3 + languageName: node + linkType: hard + +"@clack/prompts@npm:1.7.0": + version: 1.7.0 + resolution: "@clack/prompts@npm:1.7.0" + dependencies: + "@clack/core": "npm:1.4.3" + fast-string-width: "npm:^3.0.2" + fast-wrap-ansi: "npm:^0.2.0" + sisteransi: "npm:^1.0.5" + checksum: 10/2bfc89d6755a1e10166a3b7a6cc883a09c1d4d82c08fbe98763284d522f256a58ed20c5ee4ab36f2a6e06bc1b3f0c16b02657159f7d593dab12c55260755f0c2 + languageName: node + linkType: hard + "@cspell/cspell-bundled-dicts@npm:10.1.1": version: 10.1.1 resolution: "@cspell/cspell-bundled-dicts@npm:10.1.1" @@ -3309,13 +3331,6 @@ __metadata: languageName: node linkType: hard -"ansi-colors@npm:^4.1.1": - version: 4.1.3 - resolution: "ansi-colors@npm:4.1.3" - checksum: 10/43d6e2fc7b1c6e4dc373de708ee76311ec2e0433e7e8bd3194e7ff123ea6a747428fc61afdcf5969da5be3a5f0fd054602bec56fc0ebe249ce2fcde6e649e3c2 - languageName: node - linkType: hard - "ansi-escapes@npm:^4.3.2": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" @@ -4414,16 +4429,6 @@ __metadata: languageName: node linkType: hard -"enquirer@npm:2.4.1": - version: 2.4.1 - resolution: "enquirer@npm:2.4.1" - dependencies: - ansi-colors: "npm:^4.1.1" - strip-ansi: "npm:^6.0.1" - checksum: 10/b3726486cd98f0d458a851a03326a2a5dd4d84f37ff94ff2a2960c915e0fc865865da3b78f0877dc36ac5c1189069eca603e82ec63d5bc6b0dd9985bf6426d7a - languageName: node - linkType: hard - "entities@npm:^8.0.0": version: 8.0.0 resolution: "entities@npm:8.0.0" @@ -5052,6 +5057,15 @@ __metadata: languageName: node linkType: hard +"fast-wrap-ansi@npm:^0.2.0": + version: 0.2.2 + resolution: "fast-wrap-ansi@npm:0.2.2" + dependencies: + fast-string-width: "npm:^3.0.2" + checksum: 10/c72272e4ee9c047ec4609adea9beb779f058e0aaee37d9e99d2306c401b34ad2b158ba6969860e35f8be7a0b0ba7512b71315d403e58a45a9f0eba0dc5b4befd + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.20.2 resolution: "fastq@npm:1.20.2" @@ -8285,6 +8299,7 @@ __metadata: "@braindb/mdast-util-wiki-link": "npm:0.2.0" "@braindb/micromark-extension-wiki-link": "npm:0.1.0" "@bybrave/json5": "npm:3.1.0" + "@clack/prompts": "npm:1.7.0" "@eslint/js": "npm:10.0.1" "@glimmer/syntax": "npm:0.95.0" "@prettier/cli": "npm:0.12.0" @@ -8321,7 +8336,6 @@ __metadata: diff: "npm:9.0.0" editorconfig-without-wasm: "npm:0.0.7" emoji-regex: "npm:10.6.0" - enquirer: "npm:2.4.1" esbuild: "npm:0.28.2" esbuild-visualizer: "npm:0.7.0" escape-string-regexp: "npm:5.0.0" @@ -8816,6 +8830,13 @@ __metadata: languageName: node linkType: hard +"sisteransi@npm:^1.0.5": + version: 1.0.5 + resolution: "sisteransi@npm:1.0.5" + checksum: 10/aba6438f46d2bfcef94cf112c835ab395172c75f67453fe05c340c770d3c402363018ae1ab4172a1026a90c47eaccf3af7b6ff6fa749a680c2929bd7fa2b37a4 + languageName: node + linkType: hard + "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0"