diff --git a/package-lock.json b/package-lock.json index da46664..c044fc3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,8 @@ "apps/*" ], "dependencies": { - "prettier-plugin-astro": "^0.7.0" + "prettier-plugin-astro": "^0.7.0", + "prompt-sync": "^4.2.0" }, "devDependencies": { "eslint-config-turbo": "^0.0.4", @@ -6412,6 +6413,33 @@ "node": ">=6" } }, + "node_modules/prompt-sync": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz", + "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==", + "dependencies": { + "strip-ansi": "^5.0.0" + } + }, + "node_modules/prompt-sync/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompt-sync/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -13229,6 +13257,29 @@ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" }, + "prompt-sync": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz", + "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==", + "requires": { + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", diff --git a/package.json b/package.json index dd27842..767a1e3 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "patch": "npm version patch -w", "minor": "npm version minor -w", "major": "npm version major -w", - "publish": "turbo run lint build check test && npm publish --access public -w" + "publish": "turbo run lint build check test && npm publish --access public -w", + "release": "node ./packages/pr-updater.js" }, "license": "ISC", "workspaces": [ @@ -36,7 +37,8 @@ "apps/*" ], "dependencies": { - "prettier-plugin-astro": "^0.7.0" + "prettier-plugin-astro": "^0.7.0", + "prompt-sync": "^4.2.0" }, "devDependencies": { "eslint-config-turbo": "^0.0.4", diff --git a/packages/pr-updater.js b/packages/pr-updater.js new file mode 100644 index 0000000..4074489 --- /dev/null +++ b/packages/pr-updater.js @@ -0,0 +1,107 @@ +import fs from 'fs'; +import { fileURLToPath } from 'url'; +import * as path from 'path'; +import promptSync from 'prompt-sync'; + +const prompt = promptSync({sigint: true}); + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +function writeReleaseMD(releaseFile, featuresArr, fixesArr) { + var formattedMessage = ""; + + if (featuresArr.length != 0) { + formattedMessage += "Features"; + for (var line of featuresArr) { + formattedMessage += "\n\t- " + line; + } + formattedMessage += "\n\n"; + } + + if (fixesArr.length != 0) + { + formattedMessage += "Fixes"; + for (var line of fixesArr) { + formattedMessage += "\n\t- " + line; + } + formattedMessage += "\n\n"; + } + + //write file + var oldRelease = fs.readFileSync(releaseFile); + var fd = fs.openSync(releaseFile, 'w+'); + + fs.writeSync(fd, formattedMessage, 0, formattedMessage.length, 0); + fs.writeSync(fd, oldRelease, 0, oldRelease.length, formattedMessage.length); + fs.close(fd); +} + +function main() { + console.log("Astro Reactive PR Release Updater (ctrl-c to exit)"); + + var noChanged, feature, fix, breakExisting; + var featuresArr = []; + var fixesArr = []; + + do { + console.log(`What package is changed? + 1. Common + 2. Form + 3. Validator`); + noChanged = prompt(": "); + } while (isNaN(noChanged) || parseInt(noChanged) < 1 || parseInt(noChanged) > 3); + + do { + console.log("Description of feature (q to finish): "); + feature = prompt(": "); + + if (feature != "q") { + console.log("Will this code change break existing examples and/or demo applications? Y/N"); + breakExisting = prompt(": "); + if (breakExisting == "Y" || breakExisting == "y") { + feature += " (BREAKING CHANGE)"; + } + featuresArr.push(feature); + } + } while (feature != "q"); + + do { + console.log("Description of fix (q to finish): "); + fix = prompt(": "); + + if (fix != "q") { + console.log("Will this code change break existing examples and/or demo applications? Y/N"); + breakExisting = prompt(": "); + if (breakExisting == "Y" || breakExisting == "y") { + fix += " (BREAKING CHANGE)"; + } + fixesArr.push(fix); + } + } while (fix != "q"); + + switch (noChanged) { + case '1': + var releaseFile = path.resolve(__dirname, './common/RELEASE.md'); + writeReleaseMD(releaseFile, featuresArr, fixesArr); + break; + case '2': + var releaseFile = path.resolve(__dirname, './form/RELEASE.md'); + writeReleaseMD(releaseFile, featuresArr, fixesArr); + break; + case '3': + var releaseFile = path.resolve(__dirname, './validator/RELEASE.md'); + writeReleaseMD(releaseFile, featuresArr, fixesArr); + break; + default: + console.log("Invalid package specified."); + } +} + +var continueScript; + +do { + main(); + console.log("Do you want to update another package release? (Y to continue)"); + continueScript = prompt(": "); +} while (continueScript == 'Y' || continueScript == 'y'); \ No newline at end of file