zard-cli 1.0.0-beta.11 → 1.0.0-beta.110
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 +39 -167
- package/commands/add/component-installer.d.ts +4 -1
- package/commands/add/component-installer.d.ts.map +1 -1
- package/commands/add/component-installer.js +33 -5
- package/commands/add/component-installer.js.map +1 -1
- package/commands/add/component-selector.d.ts +6 -0
- package/commands/add/component-selector.d.ts.map +1 -1
- package/commands/add/component-selector.js +9 -27
- package/commands/add/component-selector.js.map +1 -1
- package/commands/add/dark-mode-setup.d.ts +2 -0
- package/commands/add/dark-mode-setup.d.ts.map +1 -1
- package/commands/add/dark-mode-setup.js +5 -11
- package/commands/add/dark-mode-setup.js.map +1 -1
- package/commands/add/dependency-resolver.d.ts +3 -2
- package/commands/add/dependency-resolver.d.ts.map +1 -1
- package/commands/add/dependency-resolver.js +23 -9
- package/commands/add/dependency-resolver.js.map +1 -1
- package/commands/add/index.d.ts.map +1 -1
- package/commands/add/index.js +137 -85
- package/commands/add/index.js.map +1 -1
- package/commands/add/wizard.d.ts +31 -0
- package/commands/add/wizard.d.ts.map +1 -0
- package/commands/add/wizard.js +289 -0
- package/commands/add/wizard.js.map +1 -0
- package/commands/init/config-prompter.d.ts +61 -56
- package/commands/init/config-prompter.d.ts.map +1 -1
- package/commands/init/config-prompter.js +84 -74
- package/commands/init/config-prompter.js.map +1 -1
- package/commands/init/dependencies.d.ts +1 -8
- package/commands/init/dependencies.d.ts.map +1 -1
- package/commands/init/dependencies.js +47 -16
- package/commands/init/dependencies.js.map +1 -1
- package/commands/init/index.d.ts.map +1 -1
- package/commands/init/index.js +150 -86
- package/commands/init/index.js.map +1 -1
- package/commands/init/project-kind.d.ts +82 -0
- package/commands/init/project-kind.d.ts.map +1 -0
- package/commands/init/project-kind.js +166 -0
- package/commands/init/project-kind.js.map +1 -0
- package/commands/init/steps.d.ts +16 -0
- package/commands/init/steps.d.ts.map +1 -0
- package/commands/init/steps.js +153 -0
- package/commands/init/steps.js.map +1 -0
- package/commands/init/tailwind-setup.d.ts +9 -2
- package/commands/init/tailwind-setup.d.ts.map +1 -1
- package/commands/init/tailwind-setup.js +33 -9
- package/commands/init/tailwind-setup.js.map +1 -1
- package/commands/init/theme-loader.d.ts.map +1 -1
- package/commands/init/theme-loader.js +1 -3
- package/commands/init/theme-loader.js.map +1 -1
- package/commands/init/tsconfig-updater.d.ts +8 -1
- package/commands/init/tsconfig-updater.d.ts.map +1 -1
- package/commands/init/tsconfig-updater.js +30 -11
- package/commands/init/tsconfig-updater.js.map +1 -1
- package/commands/init/update-angular-config.d.ts.map +1 -1
- package/commands/init/update-angular-config.js +28 -47
- package/commands/init/update-angular-config.js.map +1 -1
- package/commands/init/vite-setup.d.ts +10 -0
- package/commands/init/vite-setup.d.ts.map +1 -0
- package/commands/init/vite-setup.js +60 -0
- package/commands/init/vite-setup.js.map +1 -0
- package/commands/init/wizard.d.ts +30 -0
- package/commands/init/wizard.d.ts.map +1 -0
- package/commands/init/wizard.js +560 -0
- package/commands/init/wizard.js.map +1 -0
- package/core/icons/families.d.ts +38 -0
- package/core/icons/families.d.ts.map +1 -0
- package/core/icons/families.js +26 -0
- package/core/icons/families.js.map +1 -0
- package/core/icons/icon-map.d.ts +24 -0
- package/core/icons/icon-map.d.ts.map +1 -0
- package/core/icons/icon-map.js +130 -0
- package/core/icons/icon-map.js.map +1 -0
- package/core/icons/index.d.ts +107 -0
- package/core/icons/index.d.ts.map +1 -0
- package/core/icons/index.js +183 -0
- package/core/icons/index.js.map +1 -0
- package/core/registry/registry-data.d.ts.map +1 -1
- package/core/registry/registry-data.js +571 -84
- package/core/registry/registry-data.js.map +1 -1
- package/core/themes/theme-definitions.d.ts +5 -5
- package/core/themes/theme-definitions.d.ts.map +1 -1
- package/core/themes/theme-definitions.js +65 -61
- package/core/themes/theme-definitions.js.map +1 -1
- package/index.js +40 -4
- package/index.js.map +1 -1
- package/package.json +4 -7
- package/ui/blocks.d.ts +70 -0
- package/ui/blocks.d.ts.map +1 -0
- package/ui/blocks.js +116 -0
- package/ui/blocks.js.map +1 -0
- package/ui/brand.d.ts +14 -0
- package/ui/brand.d.ts.map +1 -0
- package/ui/brand.js +35 -0
- package/ui/brand.js.map +1 -0
- package/ui/engine/animation/index.d.ts +39 -0
- package/ui/engine/animation/index.d.ts.map +1 -0
- package/ui/engine/animation/index.js +103 -0
- package/ui/engine/animation/index.js.map +1 -0
- package/ui/engine/ansi/index.d.ts +52 -0
- package/ui/engine/ansi/index.d.ts.map +1 -0
- package/ui/engine/ansi/index.js +117 -0
- package/ui/engine/ansi/index.js.map +1 -0
- package/ui/engine/components/index.d.ts +211 -0
- package/ui/engine/components/index.d.ts.map +1 -0
- package/ui/engine/components/index.js +109 -0
- package/ui/engine/components/index.js.map +1 -0
- package/ui/engine/cursor/index.d.ts +17 -0
- package/ui/engine/cursor/index.d.ts.map +1 -0
- package/ui/engine/cursor/index.js +41 -0
- package/ui/engine/cursor/index.js.map +1 -0
- package/ui/engine/diff/index.d.ts +27 -0
- package/ui/engine/diff/index.d.ts.map +1 -0
- package/ui/engine/diff/index.js +57 -0
- package/ui/engine/diff/index.js.map +1 -0
- package/ui/engine/events/index.d.ts +24 -0
- package/ui/engine/events/index.d.ts.map +1 -0
- package/ui/engine/events/index.js +60 -0
- package/ui/engine/events/index.js.map +1 -0
- package/ui/engine/focus/index.d.ts +25 -0
- package/ui/engine/focus/index.d.ts.map +1 -0
- package/ui/engine/focus/index.js +77 -0
- package/ui/engine/focus/index.js.map +1 -0
- package/ui/engine/frame/index.d.ts +48 -0
- package/ui/engine/frame/index.d.ts.map +1 -0
- package/ui/engine/frame/index.js +0 -0
- package/ui/engine/frame/index.js.map +1 -0
- package/ui/engine/index.d.ts +28 -0
- package/ui/engine/index.d.ts.map +1 -0
- package/ui/engine/index.js +28 -0
- package/ui/engine/index.js.map +1 -0
- package/ui/engine/input/index.d.ts +36 -0
- package/ui/engine/input/index.d.ts.map +1 -0
- package/ui/engine/input/index.js +224 -0
- package/ui/engine/input/index.js.map +1 -0
- package/ui/engine/layout/index.d.ts +42 -0
- package/ui/engine/layout/index.d.ts.map +1 -0
- package/ui/engine/layout/index.js +241 -0
- package/ui/engine/layout/index.js.map +1 -0
- package/ui/engine/renderer/index.d.ts +43 -0
- package/ui/engine/renderer/index.d.ts.map +1 -0
- package/ui/engine/renderer/index.js +619 -0
- package/ui/engine/renderer/index.js.map +1 -0
- package/ui/engine/scheduler/index.d.ts +22 -0
- package/ui/engine/scheduler/index.d.ts.map +1 -0
- package/ui/engine/scheduler/index.js +77 -0
- package/ui/engine/scheduler/index.js.map +1 -0
- package/ui/engine/screen/index.d.ts +39 -0
- package/ui/engine/screen/index.d.ts.map +1 -0
- package/ui/engine/screen/index.js +255 -0
- package/ui/engine/screen/index.js.map +1 -0
- package/ui/engine/terminal/index.d.ts +84 -0
- package/ui/engine/terminal/index.d.ts.map +1 -0
- package/ui/engine/terminal/index.js +235 -0
- package/ui/engine/terminal/index.js.map +1 -0
- package/ui/engine/testing/index.d.ts +27 -0
- package/ui/engine/testing/index.d.ts.map +1 -0
- package/ui/engine/testing/index.js +63 -0
- package/ui/engine/testing/index.js.map +1 -0
- package/ui/engine/theme/index.d.ts +27 -0
- package/ui/engine/theme/index.d.ts.map +1 -0
- package/ui/engine/theme/index.js +129 -0
- package/ui/engine/theme/index.js.map +1 -0
- package/ui/engine/utils/index.d.ts +12 -0
- package/ui/engine/utils/index.d.ts.map +1 -0
- package/ui/engine/utils/index.js +143 -0
- package/ui/engine/utils/index.js.map +1 -0
- package/ui/gate.d.ts +19 -0
- package/ui/gate.d.ts.map +1 -0
- package/ui/gate.js +36 -0
- package/ui/gate.js.map +1 -0
- package/ui/index.d.ts +18 -0
- package/ui/index.d.ts.map +1 -0
- package/ui/index.js +18 -0
- package/ui/index.js.map +1 -0
- package/ui/log-sink.d.ts +24 -0
- package/ui/log-sink.d.ts.map +1 -0
- package/ui/log-sink.js +35 -0
- package/ui/log-sink.js.map +1 -0
- package/ui/output.d.ts +14 -0
- package/ui/output.d.ts.map +1 -0
- package/ui/output.js +28 -0
- package/ui/output.js.map +1 -0
- package/ui/report.d.ts +30 -0
- package/ui/report.d.ts.map +1 -0
- package/ui/report.js +45 -0
- package/ui/report.js.map +1 -0
- package/ui/runner.d.ts +66 -0
- package/ui/runner.d.ts.map +1 -0
- package/ui/runner.js +135 -0
- package/ui/runner.js.map +1 -0
- package/ui/style.d.ts +24 -0
- package/ui/style.d.ts.map +1 -0
- package/ui/style.js +44 -0
- package/ui/style.js.map +1 -0
- package/ui/testing/fake-tty.d.ts +26 -0
- package/ui/testing/fake-tty.d.ts.map +1 -0
- package/ui/testing/fake-tty.js +61 -0
- package/ui/testing/fake-tty.js.map +1 -0
- package/ui/text-input.d.ts +30 -0
- package/ui/text-input.d.ts.map +1 -0
- package/ui/text-input.js +87 -0
- package/ui/text-input.js.map +1 -0
- package/ui/theme.d.ts +10 -0
- package/ui/theme.d.ts.map +1 -0
- package/ui/theme.js +20 -0
- package/ui/theme.js.map +1 -0
- package/utils/config.d.ts +52 -69
- package/utils/config.d.ts.map +1 -1
- package/utils/config.js +58 -7
- package/utils/config.js.map +1 -1
- package/utils/errors.d.ts +27 -0
- package/utils/errors.d.ts.map +1 -0
- package/utils/errors.js +45 -0
- package/utils/errors.js.map +1 -0
- package/utils/get-package-info.js +4 -4
- package/utils/get-package-info.js.map +1 -1
- package/utils/get-project-info.d.ts +30 -0
- package/utils/get-project-info.d.ts.map +1 -1
- package/utils/get-project-info.js +195 -6
- package/utils/get-project-info.js.map +1 -1
- package/utils/http-client.d.ts +8 -0
- package/utils/http-client.d.ts.map +1 -0
- package/utils/http-client.js +68 -0
- package/utils/http-client.js.map +1 -0
- package/utils/icon-catalog.d.ts +33 -0
- package/utils/icon-catalog.d.ts.map +1 -0
- package/utils/icon-catalog.js +62 -0
- package/utils/icon-catalog.js.map +1 -0
- package/utils/logger.d.ts +16 -1
- package/utils/logger.d.ts.map +1 -1
- package/utils/logger.js +104 -12
- package/utils/logger.js.map +1 -1
- package/utils/package-manager.d.ts +44 -1
- package/utils/package-manager.d.ts.map +1 -1
- package/utils/package-manager.js +210 -14
- package/utils/package-manager.js.map +1 -1
- package/utils/registry.d.ts +44 -2
- package/utils/registry.d.ts.map +1 -1
- package/utils/registry.js +82 -27
- package/utils/registry.js.map +1 -1
- package/utils/schema-version.d.ts +20 -0
- package/utils/schema-version.d.ts.map +1 -0
- package/utils/schema-version.js +27 -0
- package/utils/schema-version.js.map +1 -0
- package/utils/source-file.d.ts +40 -0
- package/utils/source-file.d.ts.map +1 -0
- package/utils/source-file.js +104 -0
- package/utils/source-file.js.map +1 -0
- package/utils/theme-selector.d.ts +1 -1
- package/utils/theme-selector.d.ts.map +1 -1
- package/utils/theme-selector.js +6 -6
- package/utils/theme-selector.js.map +1 -1
- package/utils/fetch-component.d.ts +0 -3
- package/utils/fetch-component.d.ts.map +0 -1
- package/utils/fetch-component.js +0 -75
- package/utils/fetch-component.js.map +0 -1
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* utils — helpers puros de string/Unicode. Sem I/O, sem dependências.
|
|
3
|
+
* (Fatia vertical / PoC: implementação real, suficiente para ASCII + wide + emoji.)
|
|
4
|
+
*/
|
|
5
|
+
const SEG = typeof Intl.Segmenter === 'function'
|
|
6
|
+
? new Intl.Segmenter('en', { granularity: 'grapheme' })
|
|
7
|
+
: null;
|
|
8
|
+
export function graphemes(text) {
|
|
9
|
+
if (SEG) {
|
|
10
|
+
const out = [];
|
|
11
|
+
for (const s of SEG.segment(text))
|
|
12
|
+
out.push(s.segment);
|
|
13
|
+
return out;
|
|
14
|
+
}
|
|
15
|
+
return Array.from(text);
|
|
16
|
+
}
|
|
17
|
+
/** true se o code point ocupa 2 colunas (East Asian Wide/Fullwidth, emoji). */
|
|
18
|
+
function isWide(cp) {
|
|
19
|
+
return ((cp >= 0x1100 && cp <= 0x115f) || // Hangul Jamo
|
|
20
|
+
cp === 0x2329 ||
|
|
21
|
+
cp === 0x232a ||
|
|
22
|
+
(cp >= 0x2e80 && cp <= 0x303e) || // CJK radicals, Kangxi
|
|
23
|
+
(cp >= 0x3041 && cp <= 0x33ff) || // Hiragana … CJK symbols
|
|
24
|
+
(cp >= 0x3400 && cp <= 0x4dbf) || // CJK Ext A
|
|
25
|
+
(cp >= 0x4e00 && cp <= 0x9fff) || // CJK Unified
|
|
26
|
+
(cp >= 0xa000 && cp <= 0xa4cf) || // Yi
|
|
27
|
+
(cp >= 0xac00 && cp <= 0xd7a3) || // Hangul Syllables
|
|
28
|
+
(cp >= 0xf900 && cp <= 0xfaff) || // CJK Compat
|
|
29
|
+
(cp >= 0xfe10 && cp <= 0xfe19) ||
|
|
30
|
+
(cp >= 0xfe30 && cp <= 0xfe6f) ||
|
|
31
|
+
(cp >= 0xff00 && cp <= 0xff60) || // Fullwidth forms
|
|
32
|
+
(cp >= 0xffe0 && cp <= 0xffe6) ||
|
|
33
|
+
(cp >= 0x1f300 && cp <= 0x1faff) || // emoji & símbolos
|
|
34
|
+
(cp >= 0x20000 && cp <= 0x3fffd) // CJK Ext B+
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
/** true se combinante / largura zero. */
|
|
38
|
+
function isZeroWidth(cp) {
|
|
39
|
+
return ((cp >= 0x0300 && cp <= 0x036f) ||
|
|
40
|
+
(cp >= 0x1ab0 && cp <= 0x1aff) ||
|
|
41
|
+
(cp >= 0x1dc0 && cp <= 0x1dff) ||
|
|
42
|
+
(cp >= 0x200b && cp <= 0x200f) ||
|
|
43
|
+
(cp >= 0x20d0 && cp <= 0x20ff) ||
|
|
44
|
+
(cp >= 0xfe20 && cp <= 0xfe2f) ||
|
|
45
|
+
cp === 0xfeff);
|
|
46
|
+
}
|
|
47
|
+
export function charWidth(grapheme) {
|
|
48
|
+
const cp = grapheme.codePointAt(0);
|
|
49
|
+
if (cp === undefined)
|
|
50
|
+
return 0;
|
|
51
|
+
if (cp < 0x20 || (cp >= 0x7f && cp <= 0x9f))
|
|
52
|
+
return 0; // controle
|
|
53
|
+
if (isZeroWidth(cp))
|
|
54
|
+
return 0;
|
|
55
|
+
if (isWide(cp))
|
|
56
|
+
return 2;
|
|
57
|
+
return 1;
|
|
58
|
+
}
|
|
59
|
+
export function stringWidth(text) {
|
|
60
|
+
let w = 0;
|
|
61
|
+
for (const g of graphemes(stripAnsi(text)))
|
|
62
|
+
w += charWidth(g);
|
|
63
|
+
return w;
|
|
64
|
+
}
|
|
65
|
+
export function wrapText(text, width) {
|
|
66
|
+
if (width <= 0)
|
|
67
|
+
return [text];
|
|
68
|
+
const out = [];
|
|
69
|
+
for (const rawLine of text.split('\n')) {
|
|
70
|
+
let line = '';
|
|
71
|
+
let lineW = 0;
|
|
72
|
+
for (const word of splitWords(rawLine)) {
|
|
73
|
+
const ww = stringWidth(word);
|
|
74
|
+
if (lineW + ww > width && lineW > 0) {
|
|
75
|
+
out.push(line);
|
|
76
|
+
line = '';
|
|
77
|
+
lineW = 0;
|
|
78
|
+
}
|
|
79
|
+
if (ww > width) {
|
|
80
|
+
// palavra maior que a largura: quebra dura por grapheme
|
|
81
|
+
if (line) {
|
|
82
|
+
out.push(line);
|
|
83
|
+
line = '';
|
|
84
|
+
lineW = 0;
|
|
85
|
+
}
|
|
86
|
+
for (const g of graphemes(word)) {
|
|
87
|
+
const gw = charWidth(g);
|
|
88
|
+
if (lineW + gw > width) {
|
|
89
|
+
out.push(line);
|
|
90
|
+
line = '';
|
|
91
|
+
lineW = 0;
|
|
92
|
+
}
|
|
93
|
+
line += g;
|
|
94
|
+
lineW += gw;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
line += word;
|
|
99
|
+
lineW += ww;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
out.push(line);
|
|
103
|
+
}
|
|
104
|
+
return out.length ? out : [''];
|
|
105
|
+
}
|
|
106
|
+
function splitWords(line) {
|
|
107
|
+
// mantém os espaços agregados à palavra seguinte para preservar recuos simples
|
|
108
|
+
return line.length ? (line.match(/\s*\S+\s*|\s+/g) ?? [line]) : [''];
|
|
109
|
+
}
|
|
110
|
+
export function truncate(text, width, ellipsis = '…') {
|
|
111
|
+
if (stringWidth(text) <= width)
|
|
112
|
+
return text;
|
|
113
|
+
const ew = stringWidth(ellipsis);
|
|
114
|
+
const budget = Math.max(0, width - ew);
|
|
115
|
+
let out = '';
|
|
116
|
+
let w = 0;
|
|
117
|
+
for (const g of graphemes(text)) {
|
|
118
|
+
const gw = charWidth(g);
|
|
119
|
+
if (w + gw > budget)
|
|
120
|
+
break;
|
|
121
|
+
out += g;
|
|
122
|
+
w += gw;
|
|
123
|
+
}
|
|
124
|
+
return out + ellipsis;
|
|
125
|
+
}
|
|
126
|
+
export function sliceByWidth(text, start, end) {
|
|
127
|
+
let out = '';
|
|
128
|
+
let col = 0;
|
|
129
|
+
for (const g of graphemes(text)) {
|
|
130
|
+
const gw = charWidth(g);
|
|
131
|
+
if (col >= start && col + gw <= end)
|
|
132
|
+
out += g;
|
|
133
|
+
col += gw;
|
|
134
|
+
if (col >= end)
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
return out;
|
|
138
|
+
}
|
|
139
|
+
const ANSI_RE = /\x1b\[[0-9;?]*[ -/]*[@-~]/g;
|
|
140
|
+
export function stripAnsi(text) {
|
|
141
|
+
return text.replace(ANSI_RE, '');
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/engine/utils/index.ts"],"names":[],"mappings":"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"}
|
package/ui/gate.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gate — deixa um fluxo async esperar por uma resposta do teclado.
|
|
3
|
+
*
|
|
4
|
+
* Wizards lineares (escolher → resolver → confirmar → instalar) ficam muito
|
|
5
|
+
* mais legíveis escritos como uma função async do que como uma máquina de
|
|
6
|
+
* estados no `onKey`. O gate é a peça que falta: o fluxo aguarda `wait()`, o
|
|
7
|
+
* handler de teclado chama `settle()` quando o usuário decide.
|
|
8
|
+
*/
|
|
9
|
+
export interface Gate<T> {
|
|
10
|
+
wait(): Promise<T>;
|
|
11
|
+
/** Entrega a resposta. Chamadas seguintes são ignoradas. */
|
|
12
|
+
settle(value: T): void;
|
|
13
|
+
/** Interrompe quem espera, propagando o erro. */
|
|
14
|
+
fail(error: unknown): void;
|
|
15
|
+
/** true enquanto alguém aguarda uma resposta. */
|
|
16
|
+
readonly pending: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function createGate<T>(): Gate<T>;
|
|
19
|
+
//# sourceMappingURL=gate.d.ts.map
|
package/ui/gate.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/ui/gate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,IAAI,CAAC,CAAC;IACrB,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,4DAA4D;IAC5D,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACvB,iDAAiD;IACjD,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,UAAU,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CA2BvC"}
|
package/ui/gate.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gate — deixa um fluxo async esperar por uma resposta do teclado.
|
|
3
|
+
*
|
|
4
|
+
* Wizards lineares (escolher → resolver → confirmar → instalar) ficam muito
|
|
5
|
+
* mais legíveis escritos como uma função async do que como uma máquina de
|
|
6
|
+
* estados no `onKey`. O gate é a peça que falta: o fluxo aguarda `wait()`, o
|
|
7
|
+
* handler de teclado chama `settle()` quando o usuário decide.
|
|
8
|
+
*/
|
|
9
|
+
export function createGate() {
|
|
10
|
+
let resolveFn = null;
|
|
11
|
+
let rejectFn = null;
|
|
12
|
+
return {
|
|
13
|
+
wait() {
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
resolveFn = resolve;
|
|
16
|
+
rejectFn = reject;
|
|
17
|
+
});
|
|
18
|
+
},
|
|
19
|
+
settle(value) {
|
|
20
|
+
const resolve = resolveFn;
|
|
21
|
+
resolveFn = null;
|
|
22
|
+
rejectFn = null;
|
|
23
|
+
resolve?.(value);
|
|
24
|
+
},
|
|
25
|
+
fail(error) {
|
|
26
|
+
const reject = rejectFn;
|
|
27
|
+
resolveFn = null;
|
|
28
|
+
rejectFn = null;
|
|
29
|
+
reject?.(error);
|
|
30
|
+
},
|
|
31
|
+
get pending() {
|
|
32
|
+
return resolveFn !== null;
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=gate.js.map
|
package/ui/gate.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/ui/gate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,MAAM,UAAU,UAAU;IACxB,IAAI,SAAS,GAAgC,IAAI,CAAC;IAClD,IAAI,QAAQ,GAAsC,IAAI,CAAC;IAEvD,OAAO;QACL,IAAI;YACF,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACxC,SAAS,GAAG,OAAO,CAAC;gBACpB,QAAQ,GAAG,MAAM,CAAC;YACpB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,KAAK;YACV,MAAM,OAAO,GAAG,SAAS,CAAC;YAC1B,SAAS,GAAG,IAAI,CAAC;YACjB,QAAQ,GAAG,IAAI,CAAC;YAChB,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,KAAK;YACR,MAAM,MAAM,GAAG,QAAQ,CAAC;YACxB,SAAS,GAAG,IAAI,CAAC;YACjB,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,OAAO;YACT,OAAO,SAAS,KAAK,IAAI,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/ui/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Superfície pública da UI da CLI.
|
|
3
|
+
*
|
|
4
|
+
* Os comandos importam daqui — nunca de `./engine` diretamente — para que a
|
|
5
|
+
* troca ou atualização da engine fique contida nesta camada.
|
|
6
|
+
*/
|
|
7
|
+
export * from './engine/index.js';
|
|
8
|
+
export * from './blocks.js';
|
|
9
|
+
export * from './brand.js';
|
|
10
|
+
export * from './gate.js';
|
|
11
|
+
export * from './log-sink.js';
|
|
12
|
+
export * from './output.js';
|
|
13
|
+
export * from './report.js';
|
|
14
|
+
export * from './runner.js';
|
|
15
|
+
export * from './style.js';
|
|
16
|
+
export * from './text-input.js';
|
|
17
|
+
export * from './theme.js';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC"}
|
package/ui/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Superfície pública da UI da CLI.
|
|
3
|
+
*
|
|
4
|
+
* Os comandos importam daqui — nunca de `./engine` diretamente — para que a
|
|
5
|
+
* troca ou atualização da engine fique contida nesta camada.
|
|
6
|
+
*/
|
|
7
|
+
export * from './engine/index.js';
|
|
8
|
+
export * from './blocks.js';
|
|
9
|
+
export * from './brand.js';
|
|
10
|
+
export * from './gate.js';
|
|
11
|
+
export * from './log-sink.js';
|
|
12
|
+
export * from './output.js';
|
|
13
|
+
export * from './report.js';
|
|
14
|
+
export * from './runner.js';
|
|
15
|
+
export * from './style.js';
|
|
16
|
+
export * from './text-input.js';
|
|
17
|
+
export * from './theme.js';
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
package/ui/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC"}
|
package/ui/log-sink.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sink de mensagens — desvia a saída do logger enquanto a tela interativa está
|
|
3
|
+
* montada.
|
|
4
|
+
*
|
|
5
|
+
* Em alt-screen, qualquer `console.log` disparado por um módulo interno
|
|
6
|
+
* (tsconfig-updater, theme-loader, package manager…) rasgaria o frame que a
|
|
7
|
+
* engine acabou de pintar. Durante a captura as mensagens ficam retidas aqui e
|
|
8
|
+
* são reemitidas no histórico do terminal depois do unmount, junto do resumo.
|
|
9
|
+
*/
|
|
10
|
+
export type LogLevel = 'info' | 'warn' | 'error' | 'success' | 'debug';
|
|
11
|
+
export interface LogRecord {
|
|
12
|
+
readonly level: LogLevel;
|
|
13
|
+
readonly message: string;
|
|
14
|
+
}
|
|
15
|
+
/** Passa a reter as mensagens do logger em vez de escrevê-las no terminal. */
|
|
16
|
+
export declare function beginCapture(): void;
|
|
17
|
+
/** Encerra a captura e devolve o que foi retido, na ordem em que chegou. */
|
|
18
|
+
export declare function endCapture(): LogRecord[];
|
|
19
|
+
export declare function isCapturing(): boolean;
|
|
20
|
+
/** Retém uma mensagem. Devolve false quando não há captura ativa. */
|
|
21
|
+
export declare function capture(level: LogLevel, message: string): boolean;
|
|
22
|
+
/** Mensagens retidas até agora, sem encerrar a captura (para exibir na UI). */
|
|
23
|
+
export declare function captured(): readonly LogRecord[];
|
|
24
|
+
//# sourceMappingURL=log-sink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-sink.d.ts","sourceRoot":"","sources":["../../src/ui/log-sink.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAID,8EAA8E;AAC9E,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,4EAA4E;AAC5E,wBAAgB,UAAU,IAAI,SAAS,EAAE,CAIxC;AAED,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED,qEAAqE;AACrE,wBAAgB,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAIjE;AAED,+EAA+E;AAC/E,wBAAgB,QAAQ,IAAI,SAAS,SAAS,EAAE,CAE/C"}
|
package/ui/log-sink.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sink de mensagens — desvia a saída do logger enquanto a tela interativa está
|
|
3
|
+
* montada.
|
|
4
|
+
*
|
|
5
|
+
* Em alt-screen, qualquer `console.log` disparado por um módulo interno
|
|
6
|
+
* (tsconfig-updater, theme-loader, package manager…) rasgaria o frame que a
|
|
7
|
+
* engine acabou de pintar. Durante a captura as mensagens ficam retidas aqui e
|
|
8
|
+
* são reemitidas no histórico do terminal depois do unmount, junto do resumo.
|
|
9
|
+
*/
|
|
10
|
+
let buffer = null;
|
|
11
|
+
/** Passa a reter as mensagens do logger em vez de escrevê-las no terminal. */
|
|
12
|
+
export function beginCapture() {
|
|
13
|
+
buffer = [];
|
|
14
|
+
}
|
|
15
|
+
/** Encerra a captura e devolve o que foi retido, na ordem em que chegou. */
|
|
16
|
+
export function endCapture() {
|
|
17
|
+
const captured = buffer ?? [];
|
|
18
|
+
buffer = null;
|
|
19
|
+
return captured;
|
|
20
|
+
}
|
|
21
|
+
export function isCapturing() {
|
|
22
|
+
return buffer !== null;
|
|
23
|
+
}
|
|
24
|
+
/** Retém uma mensagem. Devolve false quando não há captura ativa. */
|
|
25
|
+
export function capture(level, message) {
|
|
26
|
+
if (buffer === null)
|
|
27
|
+
return false;
|
|
28
|
+
buffer.push({ level, message });
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
/** Mensagens retidas até agora, sem encerrar a captura (para exibir na UI). */
|
|
32
|
+
export function captured() {
|
|
33
|
+
return buffer ?? [];
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=log-sink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-sink.js","sourceRoot":"","sources":["../../src/ui/log-sink.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,IAAI,MAAM,GAAuB,IAAI,CAAC;AAEtC,8EAA8E;AAC9E,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,EAAE,CAAC;AACd,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,UAAU;IACxB,MAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAC;IAC9B,MAAM,GAAG,IAAI,CAAC;IACd,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,MAAM,KAAK,IAAI,CAAC;AACzB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,OAAO,CAAC,KAAe,EAAE,OAAe;IACtD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAClC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,QAAQ;IACtB,OAAO,MAAM,IAAI,EAAE,CAAC;AACtB,CAAC"}
|
package/ui/output.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Saída em linha — a única porta por onde a CLI escreve texto solto no
|
|
3
|
+
* terminal, fora da tela interativa.
|
|
4
|
+
*
|
|
5
|
+
* Concentrar a escrita aqui garante que o logger, o resumo final e as
|
|
6
|
+
* mensagens reemitidas do sink usem exatamente a mesma marcação de nível e a
|
|
7
|
+
* mesma paleta.
|
|
8
|
+
*/
|
|
9
|
+
import { type LogRecord } from './log-sink.js';
|
|
10
|
+
export declare function writeLine(text?: string): void;
|
|
11
|
+
export declare function formatRecord(record: LogRecord): string;
|
|
12
|
+
/** Reemite no histórico do terminal as mensagens retidas durante a tela. */
|
|
13
|
+
export declare function flushRecords(records: readonly LogRecord[]): void;
|
|
14
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/ui/output.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,eAAe,CAAC;AAW9D,wBAAgB,SAAS,CAAC,IAAI,SAAK,GAAG,IAAI,CAEzC;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAEtD;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAEhE"}
|
package/ui/output.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Saída em linha — a única porta por onde a CLI escreve texto solto no
|
|
3
|
+
* terminal, fora da tela interativa.
|
|
4
|
+
*
|
|
5
|
+
* Concentrar a escrita aqui garante que o logger, o resumo final e as
|
|
6
|
+
* mensagens reemitidas do sink usem exatamente a mesma marcação de nível e a
|
|
7
|
+
* mesma paleta.
|
|
8
|
+
*/
|
|
9
|
+
import { style } from './style.js';
|
|
10
|
+
const MARKS = {
|
|
11
|
+
info: text => `${style.primary('›')} ${text}`,
|
|
12
|
+
success: text => `${style.success('✔')} ${text}`,
|
|
13
|
+
warn: text => `${style.warning('⚠')} ${text}`,
|
|
14
|
+
error: text => `${style.danger('✖')} ${text}`,
|
|
15
|
+
debug: text => style.dim(`[debug] ${text}`),
|
|
16
|
+
};
|
|
17
|
+
export function writeLine(text = '') {
|
|
18
|
+
process.stdout.write(`${text}\n`);
|
|
19
|
+
}
|
|
20
|
+
export function formatRecord(record) {
|
|
21
|
+
return MARKS[record.level](record.message);
|
|
22
|
+
}
|
|
23
|
+
/** Reemite no histórico do terminal as mensagens retidas durante a tela. */
|
|
24
|
+
export function flushRecords(records) {
|
|
25
|
+
for (const record of records)
|
|
26
|
+
writeLine(formatRecord(record));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=output.js.map
|
package/ui/output.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/ui/output.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,KAAK,GAA+C;IACxD,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;IAC7C,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;IAChD,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;IAC7C,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;IAC7C,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;CAC5C,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,IAAI,GAAG,EAAE;IACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC5C,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,YAAY,CAAC,OAA6B;IACxD,KAAK,MAAM,MAAM,IAAI,OAAO;QAAE,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;AAChE,CAAC"}
|
package/ui/report.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resumo pós-execução — o que permanece no histórico depois do alt-screen.
|
|
3
|
+
*
|
|
4
|
+
* Ao sair da tela cheia, tudo que o wizard desenhou desaparece. O que o usuário
|
|
5
|
+
* precisa reter (o que foi escrito, o que rodar em seguida, o que deu errado)
|
|
6
|
+
* é reimpresso aqui, no fluxo normal do terminal, onde continua rolável e
|
|
7
|
+
* copiável depois que o comando termina.
|
|
8
|
+
*/
|
|
9
|
+
import { type LogRecord } from './log-sink.js';
|
|
10
|
+
export type ReportStatus = 'success' | 'cancelled' | 'error';
|
|
11
|
+
export interface ReportCommand {
|
|
12
|
+
readonly command: string;
|
|
13
|
+
/** Trecho final destacado, como o `[component]` de `zard-cli add`. */
|
|
14
|
+
readonly argument?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface Report {
|
|
17
|
+
readonly status: ReportStatus;
|
|
18
|
+
/** Uma frase: o desfecho do comando. */
|
|
19
|
+
readonly headline: string;
|
|
20
|
+
/** Itens do que foi efetivamente feito. */
|
|
21
|
+
readonly items?: readonly string[];
|
|
22
|
+
/** Texto de apoio, exibido em tom secundário. */
|
|
23
|
+
readonly notes?: readonly string[];
|
|
24
|
+
/** Próximos passos sugeridos. */
|
|
25
|
+
readonly commands?: readonly ReportCommand[];
|
|
26
|
+
/** Mensagens retidas enquanto a tela estava montada. */
|
|
27
|
+
readonly logs?: readonly LogRecord[];
|
|
28
|
+
}
|
|
29
|
+
export declare function printReport(report: Report): void;
|
|
30
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/ui/report.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAI/C,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,wCAAwC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,iDAAiD;IACjD,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,iCAAiC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC7C,wDAAwD;IACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;CACtC;AAQD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CA+BhD"}
|
package/ui/report.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resumo pós-execução — o que permanece no histórico depois do alt-screen.
|
|
3
|
+
*
|
|
4
|
+
* Ao sair da tela cheia, tudo que o wizard desenhou desaparece. O que o usuário
|
|
5
|
+
* precisa reter (o que foi escrito, o que rodar em seguida, o que deu errado)
|
|
6
|
+
* é reimpresso aqui, no fluxo normal do terminal, onde continua rolável e
|
|
7
|
+
* copiável depois que o comando termina.
|
|
8
|
+
*/
|
|
9
|
+
import { flushRecords, writeLine } from './output.js';
|
|
10
|
+
import { style } from './style.js';
|
|
11
|
+
const HEADLINE = {
|
|
12
|
+
success: text => `${style.success('✔')} ${style.bold(text)}`,
|
|
13
|
+
cancelled: text => `${style.warning('■')} ${style.bold(text)}`,
|
|
14
|
+
error: text => `${style.danger('✖')} ${style.bold(text)}`,
|
|
15
|
+
};
|
|
16
|
+
export function printReport(report) {
|
|
17
|
+
writeLine();
|
|
18
|
+
writeLine(HEADLINE[report.status](report.headline));
|
|
19
|
+
if (report.logs?.length) {
|
|
20
|
+
writeLine();
|
|
21
|
+
flushRecords(report.logs);
|
|
22
|
+
}
|
|
23
|
+
if (report.items?.length) {
|
|
24
|
+
writeLine();
|
|
25
|
+
for (const item of report.items)
|
|
26
|
+
writeLine(` ${style.success('✔')} ${item}`);
|
|
27
|
+
}
|
|
28
|
+
if (report.notes?.length) {
|
|
29
|
+
writeLine();
|
|
30
|
+
for (const note of report.notes)
|
|
31
|
+
writeLine(` ${style.muted(note)}`);
|
|
32
|
+
}
|
|
33
|
+
if (report.commands?.length) {
|
|
34
|
+
writeLine();
|
|
35
|
+
for (const { command, argument } of report.commands) {
|
|
36
|
+
const suffix = argument ? ` ${style.primary(argument)}` : '';
|
|
37
|
+
writeLine(` ${style.foreground(command)}${suffix}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Duas linhas, não uma: o prompt do shell volta logo abaixo e, colado, o
|
|
41
|
+
// último comando sugerido parece parte dele.
|
|
42
|
+
writeLine();
|
|
43
|
+
writeLine();
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=report.js.map
|
package/ui/report.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/ui/report.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAwBnC,MAAM,QAAQ,GAAmD;IAC/D,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;IAC5D,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;IAC9D,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;CAC1D,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,SAAS,EAAE,CAAC;IACZ,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEpD,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QACxB,SAAS,EAAE,CAAC;QACZ,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACzB,SAAS,EAAE,CAAC;QACZ,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK;YAAE,SAAS,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACzB,SAAS,EAAE,CAAC;QACZ,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK;YAAE,SAAS,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAC5B,SAAS,EAAE,CAAC;QACZ,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,SAAS,CAAC,KAAK,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,6CAA6C;IAC7C,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,CAAC;AACd,CAAC"}
|
package/ui/runner.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runner — a ponte entre o loop de frames da engine e o fluxo async da CLI.
|
|
3
|
+
*
|
|
4
|
+
* Os comandos são sequenciais (`const config = await promptForConfig(...)`),
|
|
5
|
+
* enquanto a engine é um laço de render dirigido por eventos. O runner concilia
|
|
6
|
+
* os dois: monta a tela, entrega o controle ao `onKey`/`run` e resolve uma
|
|
7
|
+
* Promise quando o fluxo chama `done()`.
|
|
8
|
+
*
|
|
9
|
+
* Três invariantes valem para qualquer wizard:
|
|
10
|
+
* 1. o terminal é restaurado em todos os caminhos de saída — inclusive erro,
|
|
11
|
+
* SIGINT e crash do processo;
|
|
12
|
+
* 2. sem TTY a tela nunca é montada: quem chamou recebe NonInteractiveError e
|
|
13
|
+
* segue pelo caminho headless;
|
|
14
|
+
* 3. o que o logger escreveria durante a montagem fica retido no sink e é
|
|
15
|
+
* reemitido depois, para não rasgar o frame.
|
|
16
|
+
*/
|
|
17
|
+
import { type KeyEvent, type Node, type Screen, type TerminalStreams } from './engine/index.js';
|
|
18
|
+
import { type LogRecord } from './log-sink.js';
|
|
19
|
+
/** Sinaliza que o comando precisa seguir sem UI interativa (CI, pipe, --yes). */
|
|
20
|
+
export declare class NonInteractiveError extends Error {
|
|
21
|
+
constructor(message?: string);
|
|
22
|
+
}
|
|
23
|
+
/** O usuário abandonou o wizard (Ctrl+C ou um passo que cancela o fluxo). */
|
|
24
|
+
export declare class WizardCancelledError extends Error {
|
|
25
|
+
constructor(message?: string);
|
|
26
|
+
}
|
|
27
|
+
export interface WizardContext<T> {
|
|
28
|
+
/** Encerra a tela e resolve o wizard com este valor. */
|
|
29
|
+
done(value: T): void;
|
|
30
|
+
/** Encerra a tela e rejeita com WizardCancelledError. */
|
|
31
|
+
cancel(message?: string): void;
|
|
32
|
+
/** Agenda um novo frame depois de alterar o estado. */
|
|
33
|
+
refresh(): void;
|
|
34
|
+
/** Acesso à tela para casos que precisam do scheduler ou das capacidades. */
|
|
35
|
+
readonly screen: Screen;
|
|
36
|
+
}
|
|
37
|
+
export interface WizardOptions<T> {
|
|
38
|
+
/** View pura reconstruída a cada frame. */
|
|
39
|
+
view: () => Node;
|
|
40
|
+
/** Teclas que a view trata por conta própria. */
|
|
41
|
+
onKey?: (event: KeyEvent, ctx: WizardContext<T>) => void;
|
|
42
|
+
/**
|
|
43
|
+
* Trabalho assíncrono executado com a tela viva — instalar pacotes, escrever
|
|
44
|
+
* arquivos. A UI continua animando enquanto a promise não resolve.
|
|
45
|
+
*/
|
|
46
|
+
run?: (ctx: WizardContext<T>) => Promise<void> | void;
|
|
47
|
+
fps?: number;
|
|
48
|
+
/** Como achar o terminal. Injetável para teste; o padrão resolve sozinho. */
|
|
49
|
+
resolveStreams?: () => TerminalStreams | null;
|
|
50
|
+
}
|
|
51
|
+
export interface WizardResult<T> {
|
|
52
|
+
readonly value: T;
|
|
53
|
+
/** Mensagens que o logger reteve enquanto a tela estava montada. */
|
|
54
|
+
readonly logs: readonly LogRecord[];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* true quando existe um terminal onde montar a tela.
|
|
58
|
+
*
|
|
59
|
+
* Não basta olhar `process.stdout.isTTY && process.stdin.isTTY`: era isso que
|
|
60
|
+
* fazia `npx zard-cli init` sair em modo texto no macOS e no Linux, onde o npm
|
|
61
|
+
* executa o binário por um shell e entrega o stdin como pipe. O terminal de
|
|
62
|
+
* controle continua alcançável, e é ele que decide.
|
|
63
|
+
*/
|
|
64
|
+
export declare function isInteractive(resolve?: () => TerminalStreams | null): boolean;
|
|
65
|
+
export declare function runWizard<T>(options: WizardOptions<T>): Promise<WizardResult<T>>;
|
|
66
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/ui/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,IAAI,EACT,KAAK,MAAM,EACX,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAIzE,iFAAiF;AACjF,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,SAAsC;CAI1D;AAED,6EAA6E;AAC7E,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,SAAyB;CAI7C;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,wDAAwD;IACxD,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACrB,yDAAyD;IACzD,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,uDAAuD;IACvD,OAAO,IAAI,IAAI,CAAC;IAChB,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,iDAAiD;IACjD,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACzD;;;OAGG;IACH,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,eAAe,GAAG,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;CACrC;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,MAAM,eAAe,GAAG,IAA6B,GAAG,OAAO,CAMrG;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAwFtF"}
|