microgit-cli 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +257 -2
- package/package.json +26 -4
- package/src/api/index.js +111 -0
- package/src/api/index.js.map +1 -0
- package/src/cli/index.js +32 -0
- package/src/cli/index.js.map +1 -0
- package/src/cli/repl.js +312 -0
- package/src/cli/repl.js.map +1 -0
- package/src/commands/auth.js +305 -0
- package/src/commands/auth.js.map +1 -0
- package/src/commands/config.js +91 -0
- package/src/commands/config.js.map +1 -0
- package/src/commands/git.js +159 -0
- package/src/commands/git.js.map +1 -0
- package/src/commands/registry.js +139 -0
- package/src/commands/registry.js.map +1 -0
- package/src/commands/repos.js +256 -0
- package/src/commands/repos.js.map +1 -0
- package/src/config/index.js +124 -0
- package/src/config/index.js.map +1 -0
- package/src/config/settings.js +34 -0
- package/src/config/settings.js.map +1 -0
- package/src/error/index.js +14 -0
- package/src/error/index.js.map +1 -0
- package/src/git/index.js +163 -0
- package/src/git/index.js.map +1 -0
- package/src/help/index.js +52 -0
- package/src/help/index.js.map +1 -0
- package/src/index.js +9 -0
- package/src/index.js.map +1 -0
- package/src/theme/banner.js +44 -0
- package/src/theme/banner.js.map +1 -0
- package/src/theme/index.js +5 -0
- package/src/theme/index.js.map +1 -0
- package/src/theme/logo.js +36 -0
- package/src/theme/logo.js.map +1 -0
- package/src/theme/palette.js +32 -0
- package/src/theme/palette.js.map +1 -0
- package/src/ui/index.js +100 -0
- package/src/ui/index.js.map +1 -0
- package/src/util/index.js +30 -0
- package/src/util/index.js.map +1 -0
package/src/ui/index.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import readline from 'node:readline';
|
|
2
|
+
import { CliError } from '../error/index.js';
|
|
3
|
+
import { faint, dim, bold, red, green, yellow, cyan, visibleWidth, box } from '../theme/palette.js';
|
|
4
|
+
export { faint, dim, bold, red, green, yellow, cyan, visibleWidth, box };
|
|
5
|
+
/** A successful step. */
|
|
6
|
+
export function ok(message) {
|
|
7
|
+
console.log(`${green('✓')} ${message}`);
|
|
8
|
+
}
|
|
9
|
+
/** A neutral next step or piece of information. */
|
|
10
|
+
export function info(message) {
|
|
11
|
+
console.log(`${cyan('→')} ${message}`);
|
|
12
|
+
}
|
|
13
|
+
/** A warning that does not stop the command. */
|
|
14
|
+
export function warn(message) {
|
|
15
|
+
console.error(`${yellow('!')} ${message}`);
|
|
16
|
+
}
|
|
17
|
+
/** Stop the command with a readable error. */
|
|
18
|
+
export function fail(message) {
|
|
19
|
+
throw new CliError(message);
|
|
20
|
+
}
|
|
21
|
+
export function printJson(value) {
|
|
22
|
+
console.log(JSON.stringify(value, null, 2));
|
|
23
|
+
}
|
|
24
|
+
let promptHandlers = null;
|
|
25
|
+
/** Install or remove the prompt handlers used by `ask`/`askSecret`. */
|
|
26
|
+
export function usePromptHandlers(handlers) {
|
|
27
|
+
promptHandlers = handlers;
|
|
28
|
+
}
|
|
29
|
+
function askWith(rl, question) {
|
|
30
|
+
return new Promise((resolve) => {
|
|
31
|
+
rl.question(question, resolve);
|
|
32
|
+
rl.once('close', () => resolve(''));
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/** Read one line from the terminal, trimmed. */
|
|
36
|
+
export async function ask(question) {
|
|
37
|
+
if (promptHandlers)
|
|
38
|
+
return promptHandlers.ask(question);
|
|
39
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
40
|
+
try {
|
|
41
|
+
return (await askWith(rl, question)).trim();
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
rl.close();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Read a password without echoing it; falls back to a normal line off a TTY. */
|
|
48
|
+
export async function askSecret(question) {
|
|
49
|
+
if (promptHandlers)
|
|
50
|
+
return promptHandlers.askSecret(question);
|
|
51
|
+
if (!process.stdin.isTTY)
|
|
52
|
+
return ask(question);
|
|
53
|
+
process.stdout.write(question);
|
|
54
|
+
const rl = readline.createInterface({
|
|
55
|
+
input: process.stdin,
|
|
56
|
+
output: process.stdout,
|
|
57
|
+
terminal: true,
|
|
58
|
+
});
|
|
59
|
+
const internal = rl;
|
|
60
|
+
internal._writeToOutput = () => { };
|
|
61
|
+
try {
|
|
62
|
+
const answer = await askWith(rl, '');
|
|
63
|
+
process.stdout.write('\n');
|
|
64
|
+
return answer;
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
rl.close();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/** Ask a yes/no question; non-interactive runs use the fallback. */
|
|
71
|
+
export async function confirm(question, fallback = false) {
|
|
72
|
+
if (!process.stdin.isTTY)
|
|
73
|
+
return fallback;
|
|
74
|
+
const answer = (await ask(`${question} ${fallback ? '[Y/n]' : '[y/N]'} `)).toLowerCase();
|
|
75
|
+
if (answer === '')
|
|
76
|
+
return fallback;
|
|
77
|
+
return answer === 'y' || answer === 'yes';
|
|
78
|
+
}
|
|
79
|
+
/** A small aligned table with a dashed header underline. */
|
|
80
|
+
export function table(headers, rows) {
|
|
81
|
+
const widths = headers.map((header, index) => Math.max(header.length, ...rows.map((row) => (row[index] ?? '').length)));
|
|
82
|
+
const pad = (cells) => cells.map((cell, index) => cell.padEnd(widths[index] ?? 0));
|
|
83
|
+
const line = (cells) => pad(cells).join(' ').trimEnd();
|
|
84
|
+
return [
|
|
85
|
+
pad(headers)
|
|
86
|
+
.map((cell) => bold(cell))
|
|
87
|
+
.join(' ')
|
|
88
|
+
.trimEnd(),
|
|
89
|
+
widths.map((width) => faint('─'.repeat(width))).join(' '),
|
|
90
|
+
...rows.map(line),
|
|
91
|
+
].join('\n');
|
|
92
|
+
}
|
|
93
|
+
/** Short, local representation of an ISO timestamp. */
|
|
94
|
+
export function formatDate(iso) {
|
|
95
|
+
if (!iso)
|
|
96
|
+
return '-';
|
|
97
|
+
const date = new Date(iso);
|
|
98
|
+
return Number.isNaN(date.getTime()) ? iso : date.toLocaleString();
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { CliError } from '../error/index.js';
|
|
2
|
+
export function text(value) {
|
|
3
|
+
return typeof value === 'string' && value !== '' ? value : undefined;
|
|
4
|
+
}
|
|
5
|
+
export function trimmed(value) {
|
|
6
|
+
const valueText = text(value)?.trim();
|
|
7
|
+
return valueText === '' ? undefined : valueText;
|
|
8
|
+
}
|
|
9
|
+
/** Parse a positive integer option, or fail with a useful message. */
|
|
10
|
+
export function positiveInt(value, option, fallback) {
|
|
11
|
+
const raw = trimmed(value);
|
|
12
|
+
if (raw === undefined)
|
|
13
|
+
return fallback;
|
|
14
|
+
const parsed = Number.parseInt(raw, 10);
|
|
15
|
+
if (!Number.isInteger(parsed) || parsed < 1) {
|
|
16
|
+
throw new CliError(`${option} must be a positive integer.`);
|
|
17
|
+
}
|
|
18
|
+
return parsed;
|
|
19
|
+
}
|
|
20
|
+
/** `name`, `name.git`, `owner/name` and `owner/name.git` all work. */
|
|
21
|
+
export function parseTarget(raw) {
|
|
22
|
+
const cleaned = raw.trim().replace(/\.git$/i, '');
|
|
23
|
+
const parts = cleaned.split('/').filter((part) => part !== '');
|
|
24
|
+
if (parts.length === 1)
|
|
25
|
+
return { name: parts[0] ?? '' };
|
|
26
|
+
if (parts.length === 2)
|
|
27
|
+
return { owner: parts[0], name: parts[1] ?? '' };
|
|
28
|
+
throw new CliError(`Expected <name> or <owner/name>, got '${raw}'.`);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,MAAM,UAAU,IAAI,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACtC,OAAO,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,MAAc,EAAE,QAAgB;IAC1E,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,QAAQ,CAAC,GAAG,MAAM,8BAA8B,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAOD,sEAAsE;AACtE,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACzE,MAAM,IAAI,QAAQ,CAAC,yCAAyC,GAAG,IAAI,CAAC,CAAC;AACvE,CAAC"}
|