From bcd7a5a9686e3ececd63fb9afa07da2c01d2f203 Mon Sep 17 00:00:00 2001 From: Rasmus P Date: Thu, 30 Jan 2025 21:38:55 +0100 Subject: [PATCH] feature(command): restore files - add list function of git status - restore files command --- package-lock.json | 169 ++++++++++++++++++++++++++++++++++- package.json | 1 + src/commands/restoreFiles.js | 27 ++++++ src/index.js | 5 ++ src/utils/gitUtils.js | 19 ++++ 5 files changed, 218 insertions(+), 3 deletions(-) create mode 100644 src/commands/restoreFiles.js diff --git a/package-lock.json b/package-lock.json index a2a515c..a6fa97e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@inquirer/prompts": "^7.2.4", "commander": "^13.1.0", "consola": "^3.4.0", + "inquirer-select-pro": "^1.0.0-alpha.9", "simple-git": "^3.27.0" }, "bin": { @@ -269,16 +270,30 @@ "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", "license": "MIT" }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "22.12.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz", "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.20.0" } }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "license": "MIT" + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -318,12 +333,36 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "license": "MIT" }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -392,6 +431,18 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -418,6 +469,113 @@ "node": ">=0.10.0" } }, + "node_modules/inquirer-select-pro": { + "version": "1.0.0-alpha.9", + "resolved": "https://registry.npmjs.org/inquirer-select-pro/-/inquirer-select-pro-1.0.0-alpha.9.tgz", + "integrity": "sha512-zoEDYAWy84xW3Lm8zXFT1zKbhY6gA69mDRT5FdD5e0mJUxYpQ517CdjF1kxCkXD8gJ6DHeg/xu1LOvzO985PpA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^8.1.0", + "@inquirer/figures": "^1.0.1", + "@inquirer/type": "^1.3.1", + "ansi-escapes": "^7.0.0", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=18.0.0", + "pnpm": ">=8.15.4" + } + }, + "node_modules/inquirer-select-pro/node_modules/@inquirer/core": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-8.2.4.tgz", + "integrity": "sha512-7vsXSfxtrrbwMTirfaKwPcjqJy7pzeuF/bP62yo1NQrRJ5HjmMlrhZml/Ljm9ODc1RnbhJlTeSnCkjtFddKjwA==", + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.3", + "@inquirer/type": "^1.3.3", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.9", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "picocolors": "^1.0.1", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/inquirer-select-pro/node_modules/@inquirer/core/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer-select-pro/node_modules/@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/inquirer-select-pro/node_modules/@types/node": { + "version": "20.17.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.16.tgz", + "integrity": "sha512-vOTpLduLkZXePLxHiHsBLp98mHGnl8RptV4YAO3HfKO5UHjDvySGbxKtpYfy8Sx5+WKcgc45qNreJJRVM3L6mw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/inquirer-select-pro/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer-select-pro/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/inquirer-select-pro/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -451,6 +609,12 @@ "node": ">=0.10.0" } }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -538,8 +702,7 @@ "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/wrap-ansi": { "version": "6.2.0", diff --git a/package.json b/package.json index e3db193..91e4a20 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "@inquirer/prompts": "^7.2.4", "commander": "^13.1.0", "consola": "^3.4.0", + "inquirer-select-pro": "^1.0.0-alpha.9", "simple-git": "^3.27.0" } } diff --git a/src/commands/restoreFiles.js b/src/commands/restoreFiles.js new file mode 100644 index 0000000..03635f4 --- /dev/null +++ b/src/commands/restoreFiles.js @@ -0,0 +1,27 @@ +import {consola} from "consola"; +import {listOfFiles} from "../utils/gitUtils.js"; +import {select} from 'inquirer-select-pro'; + + +export async function restoreFiles() { + try { + const files = await listOfFiles() + + const answers = { + selectedFiles: await select({ + multiple: true, + message: 'Select files', + options: files + }) + } + + console.log(answers.selectedFiles); + } catch (error) { + if (error instanceof Error && error.name === 'ExitPromptError') { + console.log('👋 until next time!'); + return + } + + consola.error(error); + } +} \ No newline at end of file diff --git a/src/index.js b/src/index.js index cba0228..380f910 100755 --- a/src/index.js +++ b/src/index.js @@ -3,6 +3,7 @@ import {program} from "commander"; import {createCommit} from "./commands/createCommit.js"; import {appendToCommit, goHome} from "./utils/gitUtils.js"; import {createBranch} from "./commands/createBranch.js"; +import {restoreFiles} from "./commands/restoreFiles.js"; program .command("commit", { @@ -26,4 +27,8 @@ program.command("gohome").action(async () => { await goHome() }) +program.command("restore").action(async () => { + await restoreFiles() +}) + program.parse(process.argv); \ No newline at end of file diff --git a/src/utils/gitUtils.js b/src/utils/gitUtils.js index a45b4bf..8f56c2e 100644 --- a/src/utils/gitUtils.js +++ b/src/utils/gitUtils.js @@ -130,6 +130,25 @@ export async function goHome() { consola.success('Welcome home'); + } catch (error) { + consola.error(error); + } +} + +export async function listOfFiles() { + try { + const files = await git.raw(['status', '--short']); + + return files.split('\n').filter(line => line.trim() !== '').map(line => { + const [status, ...filePath] = line.trim().split(' ') + const file = filePath.join(' ') + + return { + name: `(${status}) ${file}`, + value: file + } + }); + } catch (error) { consola.error(error); }