ghagga 2.0.1 → 2.2.0
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 +90 -19
- package/dist/commands/hooks/index.d.ts +9 -0
- package/dist/commands/hooks/index.d.ts.map +1 -0
- package/dist/commands/hooks/index.js +16 -0
- package/dist/commands/hooks/index.js.map +1 -0
- package/dist/commands/hooks/install.d.ts +13 -0
- package/dist/commands/hooks/install.d.ts.map +1 -0
- package/dist/commands/hooks/install.js +64 -0
- package/dist/commands/hooks/install.js.map +1 -0
- package/dist/commands/hooks/install.test.d.ts +11 -0
- package/dist/commands/hooks/install.test.d.ts.map +1 -0
- package/dist/commands/hooks/install.test.js +157 -0
- package/dist/commands/hooks/install.test.js.map +1 -0
- package/dist/commands/hooks/status.d.ts +12 -0
- package/dist/commands/hooks/status.d.ts.map +1 -0
- package/dist/commands/hooks/status.js +38 -0
- package/dist/commands/hooks/status.js.map +1 -0
- package/dist/commands/hooks/status.test.d.ts +11 -0
- package/dist/commands/hooks/status.test.d.ts.map +1 -0
- package/dist/commands/hooks/status.test.js +123 -0
- package/dist/commands/hooks/status.test.js.map +1 -0
- package/dist/commands/hooks/uninstall.d.ts +12 -0
- package/dist/commands/hooks/uninstall.d.ts.map +1 -0
- package/dist/commands/hooks/uninstall.js +44 -0
- package/dist/commands/hooks/uninstall.js.map +1 -0
- package/dist/commands/hooks/uninstall.test.d.ts +10 -0
- package/dist/commands/hooks/uninstall.test.d.ts.map +1 -0
- package/dist/commands/hooks/uninstall.test.js +120 -0
- package/dist/commands/hooks/uninstall.test.js.map +1 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +17 -14
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/login.test.d.ts +9 -0
- package/dist/commands/login.test.d.ts.map +1 -0
- package/dist/commands/login.test.js +138 -0
- package/dist/commands/login.test.js.map +1 -0
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +4 -3
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/logout.test.d.ts +8 -0
- package/dist/commands/logout.test.d.ts.map +1 -0
- package/dist/commands/logout.test.js +61 -0
- package/dist/commands/logout.test.js.map +1 -0
- package/dist/commands/memory/clear.d.ts +11 -0
- package/dist/commands/memory/clear.d.ts.map +1 -0
- package/dist/commands/memory/clear.js +45 -0
- package/dist/commands/memory/clear.js.map +1 -0
- package/dist/commands/memory/clear.test.d.ts +11 -0
- package/dist/commands/memory/clear.test.d.ts.map +1 -0
- package/dist/commands/memory/clear.test.js +178 -0
- package/dist/commands/memory/clear.test.js.map +1 -0
- package/dist/commands/memory/delete.d.ts +11 -0
- package/dist/commands/memory/delete.d.ts.map +1 -0
- package/dist/commands/memory/delete.js +38 -0
- package/dist/commands/memory/delete.js.map +1 -0
- package/dist/commands/memory/delete.test.d.ts +11 -0
- package/dist/commands/memory/delete.test.d.ts.map +1 -0
- package/dist/commands/memory/delete.test.js +176 -0
- package/dist/commands/memory/delete.test.js.map +1 -0
- package/dist/commands/memory/index.d.ts +10 -0
- package/dist/commands/memory/index.d.ts.map +1 -0
- package/dist/commands/memory/index.js +23 -0
- package/dist/commands/memory/index.js.map +1 -0
- package/dist/commands/memory/list.d.ts +11 -0
- package/dist/commands/memory/list.d.ts.map +1 -0
- package/dist/commands/memory/list.js +47 -0
- package/dist/commands/memory/list.js.map +1 -0
- package/dist/commands/memory/list.test.d.ts +10 -0
- package/dist/commands/memory/list.test.d.ts.map +1 -0
- package/dist/commands/memory/list.test.js +135 -0
- package/dist/commands/memory/list.test.js.map +1 -0
- package/dist/commands/memory/search.d.ts +12 -0
- package/dist/commands/memory/search.d.ts.map +1 -0
- package/dist/commands/memory/search.js +44 -0
- package/dist/commands/memory/search.js.map +1 -0
- package/dist/commands/memory/search.test.d.ts +11 -0
- package/dist/commands/memory/search.test.d.ts.map +1 -0
- package/dist/commands/memory/search.test.js +122 -0
- package/dist/commands/memory/search.test.js.map +1 -0
- package/dist/commands/memory/show.d.ts +10 -0
- package/dist/commands/memory/show.d.ts.map +1 -0
- package/dist/commands/memory/show.js +51 -0
- package/dist/commands/memory/show.js.map +1 -0
- package/dist/commands/memory/show.test.d.ts +11 -0
- package/dist/commands/memory/show.test.d.ts.map +1 -0
- package/dist/commands/memory/show.test.js +156 -0
- package/dist/commands/memory/show.test.js.map +1 -0
- package/dist/commands/memory/stats.d.ts +11 -0
- package/dist/commands/memory/stats.d.ts.map +1 -0
- package/dist/commands/memory/stats.js +63 -0
- package/dist/commands/memory/stats.js.map +1 -0
- package/dist/commands/memory/stats.test.d.ts +10 -0
- package/dist/commands/memory/stats.test.d.ts.map +1 -0
- package/dist/commands/memory/stats.test.js +122 -0
- package/dist/commands/memory/stats.test.js.map +1 -0
- package/dist/commands/memory/utils.d.ts +44 -0
- package/dist/commands/memory/utils.d.ts.map +1 -0
- package/dist/commands/memory/utils.js +90 -0
- package/dist/commands/memory/utils.js.map +1 -0
- package/dist/commands/memory/utils.test.d.ts +10 -0
- package/dist/commands/memory/utils.test.d.ts.map +1 -0
- package/dist/commands/memory/utils.test.js +93 -0
- package/dist/commands/memory/utils.test.js.map +1 -0
- package/dist/commands/review-commit-msg.d.ts +28 -0
- package/dist/commands/review-commit-msg.d.ts.map +1 -0
- package/dist/commands/review-commit-msg.js +126 -0
- package/dist/commands/review-commit-msg.js.map +1 -0
- package/dist/commands/review-commit-msg.test.d.ts +11 -0
- package/dist/commands/review-commit-msg.test.d.ts.map +1 -0
- package/dist/commands/review-commit-msg.test.js +126 -0
- package/dist/commands/review-commit-msg.test.js.map +1 -0
- package/dist/commands/review.d.ts +7 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +138 -103
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/review.test.js +267 -1
- package/dist/commands/review.test.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +12 -11
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/status.test.d.ts +8 -0
- package/dist/commands/status.test.d.ts.map +1 -0
- package/dist/commands/status.test.js +106 -0
- package/dist/commands/status.test.js.map +1 -0
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +48 -16
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +1 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/config.test.d.ts +9 -0
- package/dist/lib/config.test.d.ts.map +1 -0
- package/dist/lib/config.test.js +181 -0
- package/dist/lib/config.test.js.map +1 -0
- package/dist/lib/git-hooks.d.ts +19 -0
- package/dist/lib/git-hooks.d.ts.map +1 -0
- package/dist/lib/git-hooks.js +129 -0
- package/dist/lib/git-hooks.js.map +1 -0
- package/dist/lib/git-hooks.test.d.ts +11 -0
- package/dist/lib/git-hooks.test.d.ts.map +1 -0
- package/dist/lib/git-hooks.test.js +178 -0
- package/dist/lib/git-hooks.test.js.map +1 -0
- package/dist/lib/git.d.ts +33 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +85 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/git.test.d.ts +2 -0
- package/dist/lib/git.test.d.ts.map +1 -0
- package/dist/lib/git.test.js +65 -0
- package/dist/lib/git.test.js.map +1 -0
- package/dist/lib/hook-templates.d.ts +12 -0
- package/dist/lib/hook-templates.d.ts.map +1 -0
- package/dist/lib/hook-templates.js +52 -0
- package/dist/lib/hook-templates.js.map +1 -0
- package/dist/lib/hook-templates.test.d.ts +11 -0
- package/dist/lib/hook-templates.test.d.ts.map +1 -0
- package/dist/lib/hook-templates.test.js +76 -0
- package/dist/lib/hook-templates.test.js.map +1 -0
- package/dist/lib/hooks-types.d.ts +30 -0
- package/dist/lib/hooks-types.d.ts.map +1 -0
- package/dist/lib/hooks-types.js +9 -0
- package/dist/lib/hooks-types.js.map +1 -0
- package/dist/lib/oauth.test.d.ts +8 -0
- package/dist/lib/oauth.test.d.ts.map +1 -0
- package/dist/lib/oauth.test.js +212 -0
- package/dist/lib/oauth.test.js.map +1 -0
- package/dist/ui/__tests__/format.test.d.ts +7 -0
- package/dist/ui/__tests__/format.test.d.ts.map +1 -0
- package/dist/ui/__tests__/format.test.js +220 -0
- package/dist/ui/__tests__/format.test.js.map +1 -0
- package/dist/ui/__tests__/theme.test.d.ts +7 -0
- package/dist/ui/__tests__/theme.test.d.ts.map +1 -0
- package/dist/ui/__tests__/theme.test.js +79 -0
- package/dist/ui/__tests__/theme.test.js.map +1 -0
- package/dist/ui/__tests__/tui.test.d.ts +9 -0
- package/dist/ui/__tests__/tui.test.d.ts.map +1 -0
- package/dist/ui/__tests__/tui.test.js +222 -0
- package/dist/ui/__tests__/tui.test.js.map +1 -0
- package/dist/ui/format.d.ts +38 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +136 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/theme.d.ts +26 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +63 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/tui.d.ts +44 -0
- package/dist/ui/tui.d.ts.map +1 -0
- package/dist/ui/tui.js +121 -0
- package/dist/ui/tui.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI facade tests.
|
|
3
|
+
*
|
|
4
|
+
* Tests the init/isPlain mode resolution, intro/outro, log.* methods,
|
|
5
|
+
* and spinner() in both plain and styled modes.
|
|
6
|
+
* Mocks @clack/prompts and console.log/error.
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
9
|
+
// ─── Mock @clack/prompts ────────────────────────────────────────
|
|
10
|
+
const mockClackIntro = vi.hoisted(() => vi.fn());
|
|
11
|
+
const mockClackOutro = vi.hoisted(() => vi.fn());
|
|
12
|
+
const mockClackLog = vi.hoisted(() => ({
|
|
13
|
+
info: vi.fn(),
|
|
14
|
+
success: vi.fn(),
|
|
15
|
+
warn: vi.fn(),
|
|
16
|
+
error: vi.fn(),
|
|
17
|
+
step: vi.fn(),
|
|
18
|
+
message: vi.fn(),
|
|
19
|
+
}));
|
|
20
|
+
const mockClackSpinner = vi.hoisted(() => vi.fn());
|
|
21
|
+
vi.mock('@clack/prompts', () => ({
|
|
22
|
+
intro: mockClackIntro,
|
|
23
|
+
outro: mockClackOutro,
|
|
24
|
+
log: mockClackLog,
|
|
25
|
+
spinner: mockClackSpinner,
|
|
26
|
+
}));
|
|
27
|
+
// ─── Tests ──────────────────────────────────────────────────────
|
|
28
|
+
describe('TUI facade', () => {
|
|
29
|
+
let logSpy;
|
|
30
|
+
let errorSpy;
|
|
31
|
+
beforeEach(() => {
|
|
32
|
+
vi.clearAllMocks();
|
|
33
|
+
logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
34
|
+
errorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
35
|
+
});
|
|
36
|
+
afterEach(() => {
|
|
37
|
+
logSpy.mockRestore();
|
|
38
|
+
errorSpy.mockRestore();
|
|
39
|
+
});
|
|
40
|
+
// We need a fresh module for each test to reset the _plain state
|
|
41
|
+
async function freshTui() {
|
|
42
|
+
vi.resetModules();
|
|
43
|
+
return import('../tui.js');
|
|
44
|
+
}
|
|
45
|
+
describe('init() and isPlain()', () => {
|
|
46
|
+
it('defaults to plain mode (non-TTY test environment)', async () => {
|
|
47
|
+
const tui = await freshTui();
|
|
48
|
+
tui.init();
|
|
49
|
+
expect(tui.isPlain()).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
it('init({ plain: true }) forces plain mode', async () => {
|
|
52
|
+
const tui = await freshTui();
|
|
53
|
+
tui.init({ plain: true });
|
|
54
|
+
expect(tui.isPlain()).toBe(true);
|
|
55
|
+
});
|
|
56
|
+
it('isPlain() returns true before init() is called (default state)', async () => {
|
|
57
|
+
const tui = await freshTui();
|
|
58
|
+
// _plain defaults to true
|
|
59
|
+
expect(tui.isPlain()).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
it('detects CI environment as plain', async () => {
|
|
62
|
+
const originalCI = process.env['CI'];
|
|
63
|
+
process.env['CI'] = 'true';
|
|
64
|
+
const tui = await freshTui();
|
|
65
|
+
tui.init();
|
|
66
|
+
expect(tui.isPlain()).toBe(true);
|
|
67
|
+
if (originalCI === undefined) {
|
|
68
|
+
delete process.env['CI'];
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
process.env['CI'] = originalCI;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe('plain mode — intro/outro', () => {
|
|
76
|
+
it('intro() prints with ═══ prefix via console.log', async () => {
|
|
77
|
+
const tui = await freshTui();
|
|
78
|
+
tui.init({ plain: true });
|
|
79
|
+
tui.intro('GHAGGA Review');
|
|
80
|
+
expect(logSpy).toHaveBeenCalledWith('═══ GHAGGA Review ═══');
|
|
81
|
+
expect(mockClackIntro).not.toHaveBeenCalled();
|
|
82
|
+
});
|
|
83
|
+
it('outro() prints with ─── prefix via console.log', async () => {
|
|
84
|
+
const tui = await freshTui();
|
|
85
|
+
tui.init({ plain: true });
|
|
86
|
+
tui.outro('Done!');
|
|
87
|
+
expect(logSpy).toHaveBeenCalledWith('─── Done! ───');
|
|
88
|
+
expect(mockClackOutro).not.toHaveBeenCalled();
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('plain mode — log methods', () => {
|
|
92
|
+
it('log.info delegates to console.log', async () => {
|
|
93
|
+
const tui = await freshTui();
|
|
94
|
+
tui.init({ plain: true });
|
|
95
|
+
tui.log.info('info message');
|
|
96
|
+
expect(logSpy).toHaveBeenCalledWith('info message');
|
|
97
|
+
});
|
|
98
|
+
it('log.success delegates to console.log', async () => {
|
|
99
|
+
const tui = await freshTui();
|
|
100
|
+
tui.init({ plain: true });
|
|
101
|
+
tui.log.success('success message');
|
|
102
|
+
expect(logSpy).toHaveBeenCalledWith('success message');
|
|
103
|
+
});
|
|
104
|
+
it('log.warn delegates to console.log', async () => {
|
|
105
|
+
const tui = await freshTui();
|
|
106
|
+
tui.init({ plain: true });
|
|
107
|
+
tui.log.warn('warn message');
|
|
108
|
+
expect(logSpy).toHaveBeenCalledWith('warn message');
|
|
109
|
+
});
|
|
110
|
+
it('log.error delegates to console.error', async () => {
|
|
111
|
+
const tui = await freshTui();
|
|
112
|
+
tui.init({ plain: true });
|
|
113
|
+
tui.log.error('error message');
|
|
114
|
+
expect(errorSpy).toHaveBeenCalledWith('error message');
|
|
115
|
+
expect(logSpy).not.toHaveBeenCalledWith('error message');
|
|
116
|
+
});
|
|
117
|
+
it('log.step delegates to console.log', async () => {
|
|
118
|
+
const tui = await freshTui();
|
|
119
|
+
tui.init({ plain: true });
|
|
120
|
+
tui.log.step('step message');
|
|
121
|
+
expect(logSpy).toHaveBeenCalledWith('step message');
|
|
122
|
+
});
|
|
123
|
+
it('log.message delegates to console.log', async () => {
|
|
124
|
+
const tui = await freshTui();
|
|
125
|
+
tui.init({ plain: true });
|
|
126
|
+
tui.log.message('message text');
|
|
127
|
+
expect(logSpy).toHaveBeenCalledWith('message text');
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
describe('plain mode — spinner', () => {
|
|
131
|
+
it('start() and message() are no-ops', async () => {
|
|
132
|
+
const tui = await freshTui();
|
|
133
|
+
tui.init({ plain: true });
|
|
134
|
+
const s = tui.spinner();
|
|
135
|
+
// Should not throw
|
|
136
|
+
s.start('loading...');
|
|
137
|
+
s.message('still loading...');
|
|
138
|
+
expect(logSpy).not.toHaveBeenCalled();
|
|
139
|
+
});
|
|
140
|
+
it('stop(msg) calls console.log with the message', async () => {
|
|
141
|
+
const tui = await freshTui();
|
|
142
|
+
tui.init({ plain: true });
|
|
143
|
+
const s = tui.spinner();
|
|
144
|
+
s.stop('Done!');
|
|
145
|
+
expect(logSpy).toHaveBeenCalledWith('Done!');
|
|
146
|
+
});
|
|
147
|
+
it('stop() without message does not call console.log', async () => {
|
|
148
|
+
const tui = await freshTui();
|
|
149
|
+
tui.init({ plain: true });
|
|
150
|
+
const s = tui.spinner();
|
|
151
|
+
s.stop();
|
|
152
|
+
expect(logSpy).not.toHaveBeenCalled();
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
describe('styled mode — delegates to @clack/prompts', () => {
|
|
156
|
+
// For styled mode we need isTTY=true and no CI
|
|
157
|
+
async function styledTui() {
|
|
158
|
+
const originalTTY = process.stdout.isTTY;
|
|
159
|
+
const originalCI = process.env['CI'];
|
|
160
|
+
Object.defineProperty(process.stdout, 'isTTY', { value: true, configurable: true });
|
|
161
|
+
delete process.env['CI'];
|
|
162
|
+
const tui = await freshTui();
|
|
163
|
+
tui.init(); // should detect TTY, no CI → styled
|
|
164
|
+
// Restore immediately after init
|
|
165
|
+
Object.defineProperty(process.stdout, 'isTTY', { value: originalTTY, configurable: true });
|
|
166
|
+
if (originalCI !== undefined)
|
|
167
|
+
process.env['CI'] = originalCI;
|
|
168
|
+
return tui;
|
|
169
|
+
}
|
|
170
|
+
it('isPlain() returns false in styled mode', async () => {
|
|
171
|
+
const tui = await styledTui();
|
|
172
|
+
expect(tui.isPlain()).toBe(false);
|
|
173
|
+
});
|
|
174
|
+
it('intro() delegates to clack.intro()', async () => {
|
|
175
|
+
const tui = await styledTui();
|
|
176
|
+
tui.intro('Review');
|
|
177
|
+
expect(mockClackIntro).toHaveBeenCalledWith('Review');
|
|
178
|
+
expect(logSpy).not.toHaveBeenCalled();
|
|
179
|
+
});
|
|
180
|
+
it('outro() delegates to clack.outro()', async () => {
|
|
181
|
+
const tui = await styledTui();
|
|
182
|
+
tui.outro('All done');
|
|
183
|
+
expect(mockClackOutro).toHaveBeenCalledWith('All done');
|
|
184
|
+
expect(logSpy).not.toHaveBeenCalled();
|
|
185
|
+
});
|
|
186
|
+
it('log.* methods delegate to clack.log.*', async () => {
|
|
187
|
+
const tui = await styledTui();
|
|
188
|
+
tui.log.info('i');
|
|
189
|
+
tui.log.success('s');
|
|
190
|
+
tui.log.warn('w');
|
|
191
|
+
tui.log.error('e');
|
|
192
|
+
tui.log.step('st');
|
|
193
|
+
tui.log.message('m');
|
|
194
|
+
expect(mockClackLog.info).toHaveBeenCalledWith('i');
|
|
195
|
+
expect(mockClackLog.success).toHaveBeenCalledWith('s');
|
|
196
|
+
expect(mockClackLog.warn).toHaveBeenCalledWith('w');
|
|
197
|
+
expect(mockClackLog.error).toHaveBeenCalledWith('e');
|
|
198
|
+
expect(mockClackLog.step).toHaveBeenCalledWith('st');
|
|
199
|
+
expect(mockClackLog.message).toHaveBeenCalledWith('m');
|
|
200
|
+
});
|
|
201
|
+
it('spinner() delegates to clack.spinner()', async () => {
|
|
202
|
+
const mockStart = vi.fn();
|
|
203
|
+
const mockMessage = vi.fn();
|
|
204
|
+
const mockStop = vi.fn();
|
|
205
|
+
mockClackSpinner.mockReturnValue({
|
|
206
|
+
start: mockStart,
|
|
207
|
+
message: mockMessage,
|
|
208
|
+
stop: mockStop,
|
|
209
|
+
});
|
|
210
|
+
const tui = await styledTui();
|
|
211
|
+
const s = tui.spinner();
|
|
212
|
+
s.start('loading');
|
|
213
|
+
s.message('updating');
|
|
214
|
+
s.stop('done');
|
|
215
|
+
expect(mockClackSpinner).toHaveBeenCalled();
|
|
216
|
+
expect(mockStart).toHaveBeenCalledWith('loading');
|
|
217
|
+
expect(mockMessage).toHaveBeenCalledWith('updating');
|
|
218
|
+
expect(mockStop).toHaveBeenCalledWith('done');
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
//# sourceMappingURL=tui.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.test.js","sourceRoot":"","sources":["../../../src/ui/__tests__/tui.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure formatting functions — string in, string out, no I/O.
|
|
3
|
+
*
|
|
4
|
+
* Contains formatting helpers moved from memory/utils.ts and review.ts
|
|
5
|
+
* plus new shared formatters. All functions are pure (CC2).
|
|
6
|
+
*/
|
|
7
|
+
import type { ReviewResult } from 'ghagga-core';
|
|
8
|
+
/**
|
|
9
|
+
* Format a plain-text table with headers, separator, and padded columns.
|
|
10
|
+
* Moved from memory/utils.ts — same signature, same behavior.
|
|
11
|
+
*/
|
|
12
|
+
export declare function formatTable(headers: string[], rows: string[][], widths: number[]): string;
|
|
13
|
+
/**
|
|
14
|
+
* Format bytes as human-readable size.
|
|
15
|
+
* < 1024: "N bytes", < 1MB: "N.N KB", else "N.N MB"
|
|
16
|
+
*/
|
|
17
|
+
export declare function formatSize(bytes: number): string;
|
|
18
|
+
/**
|
|
19
|
+
* Format observation ID as 8-char zero-padded string.
|
|
20
|
+
* ID 42 -> "00000042"
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatId(id: number): string;
|
|
23
|
+
/**
|
|
24
|
+
* Truncate a string to maxLen characters, appending "..." if truncated.
|
|
25
|
+
*/
|
|
26
|
+
export declare function truncate(str: string, maxLen: number): string;
|
|
27
|
+
/**
|
|
28
|
+
* Format a key-value pair with padded label.
|
|
29
|
+
* Used by status and memory show commands.
|
|
30
|
+
* Example: formatKeyValue('Provider', 'github') → " Provider: github"
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatKeyValue(label: string, value: string, indent?: number): string;
|
|
33
|
+
/**
|
|
34
|
+
* Format a ReviewResult as a human-readable markdown string for the terminal.
|
|
35
|
+
* Moved from review.ts — same output, uses theme constants.
|
|
36
|
+
*/
|
|
37
|
+
export declare function formatMarkdownResult(result: ReviewResult): string;
|
|
38
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,aAAa,CAAC;AAK/E;;;GAGG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,MAAM,EAAE,MAAM,EAAE,GACf,MAAM,CAeR;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG5D;AAID;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,MAAU,GACjB,MAAM,CAGR;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAiFjE"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure formatting functions — string in, string out, no I/O.
|
|
3
|
+
*
|
|
4
|
+
* Contains formatting helpers moved from memory/utils.ts and review.ts
|
|
5
|
+
* plus new shared formatters. All functions are pure (CC2).
|
|
6
|
+
*/
|
|
7
|
+
import { STATUS_EMOJI, SEVERITY_EMOJI, SOURCE_LABELS } from './theme.js';
|
|
8
|
+
// ─── Table & Value Formatting ───────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Format a plain-text table with headers, separator, and padded columns.
|
|
11
|
+
* Moved from memory/utils.ts — same signature, same behavior.
|
|
12
|
+
*/
|
|
13
|
+
export function formatTable(headers, rows, widths) {
|
|
14
|
+
const lines = [];
|
|
15
|
+
// Header row
|
|
16
|
+
lines.push(headers.map((h, i) => h.padEnd(widths[i])).join(' '));
|
|
17
|
+
// Separator row
|
|
18
|
+
lines.push(widths.map((w) => '─'.repeat(w)).join(' '));
|
|
19
|
+
// Data rows
|
|
20
|
+
for (const row of rows) {
|
|
21
|
+
lines.push(row.map((cell, i) => cell.padEnd(widths[i])).join(' '));
|
|
22
|
+
}
|
|
23
|
+
return lines.join('\n');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Format bytes as human-readable size.
|
|
27
|
+
* < 1024: "N bytes", < 1MB: "N.N KB", else "N.N MB"
|
|
28
|
+
*/
|
|
29
|
+
export function formatSize(bytes) {
|
|
30
|
+
if (bytes < 1024)
|
|
31
|
+
return `${bytes} bytes`;
|
|
32
|
+
if (bytes < 1024 * 1024)
|
|
33
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
34
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Format observation ID as 8-char zero-padded string.
|
|
38
|
+
* ID 42 -> "00000042"
|
|
39
|
+
*/
|
|
40
|
+
export function formatId(id) {
|
|
41
|
+
return String(id).padStart(8, '0');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Truncate a string to maxLen characters, appending "..." if truncated.
|
|
45
|
+
*/
|
|
46
|
+
export function truncate(str, maxLen) {
|
|
47
|
+
if (str.length <= maxLen)
|
|
48
|
+
return str;
|
|
49
|
+
return str.slice(0, maxLen - 3) + '...';
|
|
50
|
+
}
|
|
51
|
+
// ─── Key-Value Formatting ───────────────────────────────────────
|
|
52
|
+
/**
|
|
53
|
+
* Format a key-value pair with padded label.
|
|
54
|
+
* Used by status and memory show commands.
|
|
55
|
+
* Example: formatKeyValue('Provider', 'github') → " Provider: github"
|
|
56
|
+
*/
|
|
57
|
+
export function formatKeyValue(label, value, indent = 3) {
|
|
58
|
+
const pad = ' '.repeat(indent);
|
|
59
|
+
return `${pad}${label.padEnd(12)} ${value}`;
|
|
60
|
+
}
|
|
61
|
+
// ─── Review Result Formatting ───────────────────────────────────
|
|
62
|
+
/**
|
|
63
|
+
* Format a ReviewResult as a human-readable markdown string for the terminal.
|
|
64
|
+
* Moved from review.ts — same output, uses theme constants.
|
|
65
|
+
*/
|
|
66
|
+
export function formatMarkdownResult(result) {
|
|
67
|
+
const status = STATUS_EMOJI[result.status] ?? result.status;
|
|
68
|
+
const timeSeconds = (result.metadata.executionTimeMs / 1000).toFixed(1);
|
|
69
|
+
const lines = [];
|
|
70
|
+
// Header
|
|
71
|
+
lines.push('---');
|
|
72
|
+
lines.push(`🤖 GHAGGA Code Review | ${status}`);
|
|
73
|
+
lines.push(`Mode: ${result.metadata.mode} | Model: ${result.metadata.model} | Time: ${timeSeconds}s | Tokens: ${result.metadata.tokensUsed}`);
|
|
74
|
+
lines.push('---');
|
|
75
|
+
lines.push('');
|
|
76
|
+
// Summary
|
|
77
|
+
lines.push('## Summary');
|
|
78
|
+
lines.push(result.summary);
|
|
79
|
+
lines.push('');
|
|
80
|
+
// Findings grouped by source
|
|
81
|
+
if (result.findings.length > 0) {
|
|
82
|
+
lines.push(`## Findings (${result.findings.length})`);
|
|
83
|
+
lines.push('');
|
|
84
|
+
// Group findings by source
|
|
85
|
+
const grouped = new Map();
|
|
86
|
+
for (const finding of result.findings) {
|
|
87
|
+
const src = finding.source ?? 'ai';
|
|
88
|
+
if (!grouped.has(src))
|
|
89
|
+
grouped.set(src, []);
|
|
90
|
+
grouped.get(src).push(finding);
|
|
91
|
+
}
|
|
92
|
+
// Render order: static tools first, then AI
|
|
93
|
+
const renderOrder = ['semgrep', 'trivy', 'cpd', 'ai'];
|
|
94
|
+
for (const src of renderOrder) {
|
|
95
|
+
const findings = grouped.get(src);
|
|
96
|
+
if (!findings || findings.length === 0)
|
|
97
|
+
continue;
|
|
98
|
+
const label = SOURCE_LABELS[src] ?? src;
|
|
99
|
+
lines.push(`### ${label} (${findings.length})`);
|
|
100
|
+
lines.push('');
|
|
101
|
+
for (const finding of findings) {
|
|
102
|
+
const emoji = SEVERITY_EMOJI[finding.severity] ?? '';
|
|
103
|
+
const location = finding.line
|
|
104
|
+
? `${finding.file}:${finding.line}`
|
|
105
|
+
: finding.file;
|
|
106
|
+
lines.push(`${emoji} [${finding.severity.toUpperCase()}] ${finding.category}`);
|
|
107
|
+
lines.push(` ${location}`);
|
|
108
|
+
lines.push(` ${finding.message}`);
|
|
109
|
+
if (finding.suggestion) {
|
|
110
|
+
lines.push(` 💡 ${finding.suggestion}`);
|
|
111
|
+
}
|
|
112
|
+
lines.push('');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
lines.push('No findings. Nice work! 🎉');
|
|
118
|
+
lines.push('');
|
|
119
|
+
}
|
|
120
|
+
// Static analysis summary
|
|
121
|
+
const { toolsRun, toolsSkipped } = result.metadata;
|
|
122
|
+
if (toolsRun.length > 0 || toolsSkipped.length > 0) {
|
|
123
|
+
lines.push('## Static Analysis');
|
|
124
|
+
if (toolsRun.length > 0) {
|
|
125
|
+
lines.push(`✅ Tools run: ${toolsRun.join(', ')}`);
|
|
126
|
+
}
|
|
127
|
+
if (toolsSkipped.length > 0) {
|
|
128
|
+
lines.push(`⏭️ Tools skipped: ${toolsSkipped.join(', ')}`);
|
|
129
|
+
}
|
|
130
|
+
lines.push('');
|
|
131
|
+
}
|
|
132
|
+
lines.push('---');
|
|
133
|
+
lines.push('Powered by GHAGGA — AI Code Review');
|
|
134
|
+
return lines.join('\n');
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme constants — icons, emojis, labels, and brand identity.
|
|
3
|
+
*
|
|
4
|
+
* All visual constants live here so command files never define
|
|
5
|
+
* inline emoji maps or ANSI color codes (CC3).
|
|
6
|
+
*/
|
|
7
|
+
import type { ReviewStatus, FindingSeverity } from 'ghagga-core';
|
|
8
|
+
/** Brand identity for intro/outro. */
|
|
9
|
+
export declare const BRAND: {
|
|
10
|
+
readonly name: "GHAGGA";
|
|
11
|
+
readonly tagline: "AI Code Review";
|
|
12
|
+
};
|
|
13
|
+
/** Status display with emoji. */
|
|
14
|
+
export declare const STATUS_EMOJI: Record<ReviewStatus, string>;
|
|
15
|
+
/** Severity indicator with colored emoji. */
|
|
16
|
+
export declare const SEVERITY_EMOJI: Record<FindingSeverity, string>;
|
|
17
|
+
/** Step icons for verbose progress output. */
|
|
18
|
+
export declare const STEP_ICON: Record<string, string>;
|
|
19
|
+
/** Source labels for review findings. */
|
|
20
|
+
export declare const SOURCE_LABELS: Record<string, string>;
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the icon for a progress step.
|
|
23
|
+
* Known steps use STEP_ICON, dynamic steps get fallback icons.
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolveStepIcon(step: string): string;
|
|
26
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE,sCAAsC;AACtC,eAAO,MAAM,KAAK;;;CAGR,CAAC;AAEX,iCAAiC;AACjC,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAKrD,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAM1D,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAc5C,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKhD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKpD"}
|
package/dist/ui/theme.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme constants — icons, emojis, labels, and brand identity.
|
|
3
|
+
*
|
|
4
|
+
* All visual constants live here so command files never define
|
|
5
|
+
* inline emoji maps or ANSI color codes (CC3).
|
|
6
|
+
*/
|
|
7
|
+
/** Brand identity for intro/outro. */
|
|
8
|
+
export const BRAND = {
|
|
9
|
+
name: 'GHAGGA',
|
|
10
|
+
tagline: 'AI Code Review',
|
|
11
|
+
};
|
|
12
|
+
/** Status display with emoji. */
|
|
13
|
+
export const STATUS_EMOJI = {
|
|
14
|
+
PASSED: '✅ PASSED',
|
|
15
|
+
FAILED: '❌ FAILED',
|
|
16
|
+
NEEDS_HUMAN_REVIEW: '⚠️ NEEDS HUMAN REVIEW',
|
|
17
|
+
SKIPPED: '⏭️ SKIPPED',
|
|
18
|
+
};
|
|
19
|
+
/** Severity indicator with colored emoji. */
|
|
20
|
+
export const SEVERITY_EMOJI = {
|
|
21
|
+
critical: '🔴',
|
|
22
|
+
high: '🟠',
|
|
23
|
+
medium: '🟡',
|
|
24
|
+
low: '🟢',
|
|
25
|
+
info: '🟣',
|
|
26
|
+
};
|
|
27
|
+
/** Step icons for verbose progress output. */
|
|
28
|
+
export const STEP_ICON = {
|
|
29
|
+
'validate': '🔍',
|
|
30
|
+
'parse-diff': '📄',
|
|
31
|
+
'detect-stacks': '🧩',
|
|
32
|
+
'token-budget': '📊',
|
|
33
|
+
'static-analysis': '🛡️',
|
|
34
|
+
'static-results': '📋',
|
|
35
|
+
'agent-start': '🤖',
|
|
36
|
+
'simple-call': '💬',
|
|
37
|
+
'simple-done': '✅',
|
|
38
|
+
'workflow-start': '🔄',
|
|
39
|
+
'workflow-synthesis': '🧬',
|
|
40
|
+
'consensus-start': '🗳️',
|
|
41
|
+
'consensus-voting': '🏛️',
|
|
42
|
+
};
|
|
43
|
+
/** Source labels for review findings. */
|
|
44
|
+
export const SOURCE_LABELS = {
|
|
45
|
+
semgrep: '🔍 Semgrep',
|
|
46
|
+
trivy: '🛡️ Trivy',
|
|
47
|
+
cpd: '📋 CPD',
|
|
48
|
+
ai: '🤖 AI Review',
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Resolve the icon for a progress step.
|
|
52
|
+
* Known steps use STEP_ICON, dynamic steps get fallback icons.
|
|
53
|
+
*/
|
|
54
|
+
export function resolveStepIcon(step) {
|
|
55
|
+
if (STEP_ICON[step])
|
|
56
|
+
return STEP_ICON[step];
|
|
57
|
+
if (step.startsWith('specialist-'))
|
|
58
|
+
return '👤';
|
|
59
|
+
if (step.startsWith('vote-'))
|
|
60
|
+
return '🗳️';
|
|
61
|
+
return '▸';
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,sCAAsC;AACtC,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,gBAAgB;CACjB,CAAC;AAEX,iCAAiC;AACjC,MAAM,CAAC,MAAM,YAAY,GAAiC;IACxD,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,UAAU;IAClB,kBAAkB,EAAE,wBAAwB;IAC5C,OAAO,EAAE,aAAa;CACvB,CAAC;AAEF,6CAA6C;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAoC;IAC7D,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,IAAI;CACX,CAAC;AAEF,8CAA8C;AAC9C,MAAM,CAAC,MAAM,SAAS,GAA2B;IAC/C,UAAU,EAAW,IAAI;IACzB,YAAY,EAAS,IAAI;IACzB,eAAe,EAAM,IAAI;IACzB,cAAc,EAAO,IAAI;IACzB,iBAAiB,EAAI,KAAK;IAC1B,gBAAgB,EAAK,IAAI;IACzB,aAAa,EAAQ,IAAI;IACzB,aAAa,EAAQ,IAAI;IACzB,aAAa,EAAQ,GAAG;IACxB,gBAAgB,EAAK,IAAI;IACzB,oBAAoB,EAAE,IAAI;IAC1B,iBAAiB,EAAI,KAAK;IAC1B,kBAAkB,EAAG,KAAK;CAC3B,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,OAAO,EAAE,YAAY;IACrB,KAAK,EAAE,WAAW;IAClB,GAAG,EAAE,QAAQ;IACb,EAAE,EAAE,cAAc;CACnB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,SAAS,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/ui/tui.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI facade — thin wrapper over @clack/prompts.
|
|
3
|
+
*
|
|
4
|
+
* Commands import from this module only (Design AD1).
|
|
5
|
+
* The mode is resolved once at init() and never changes (R2).
|
|
6
|
+
* In plain mode, all calls delegate to console.* with zero ANSI (R8, R10).
|
|
7
|
+
*/
|
|
8
|
+
export type TuiMode = 'styled' | 'plain';
|
|
9
|
+
export interface TuiInitOptions {
|
|
10
|
+
/** User explicitly passed --plain */
|
|
11
|
+
plain?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface TuiSpinner {
|
|
14
|
+
/** Start the spinner with an initial message. */
|
|
15
|
+
start(message?: string): void;
|
|
16
|
+
/** Update the spinner's message while it's spinning. */
|
|
17
|
+
message(message: string): void;
|
|
18
|
+
/** Stop the spinner with a final message (shown as success). */
|
|
19
|
+
stop(message?: string): void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Initialize the TUI mode. Must be called once before any output.
|
|
23
|
+
* Auto-detects styled vs. plain based on TTY, CI, and --plain flag.
|
|
24
|
+
*/
|
|
25
|
+
export declare function init(opts?: TuiInitOptions): void;
|
|
26
|
+
/** Returns true when the current mode is plain. */
|
|
27
|
+
export declare function isPlain(): boolean;
|
|
28
|
+
export declare function intro(title: string): void;
|
|
29
|
+
export declare function outro(message: string): void;
|
|
30
|
+
export declare const log: {
|
|
31
|
+
info(message: string): void;
|
|
32
|
+
success(message: string): void;
|
|
33
|
+
warn(message: string): void;
|
|
34
|
+
error(message: string): void;
|
|
35
|
+
step(message: string): void;
|
|
36
|
+
message(message: string): void;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Create a spinner instance.
|
|
40
|
+
* Styled: animated clack spinner.
|
|
41
|
+
* Plain: no-op start/message, stop() prints the final message.
|
|
42
|
+
*/
|
|
43
|
+
export declare function spinner(): TuiSpinner;
|
|
44
|
+
//# sourceMappingURL=tui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/ui/tui.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzC,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,iDAAiD;IACjD,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wDAAwD;IACxD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gEAAgE;IAChE,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAQD;;;GAGG;AACH,wBAAgB,IAAI,CAAC,IAAI,CAAC,EAAE,cAAc,GAAG,IAAI,CAEhD;AAED,mDAAmD;AACnD,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAID,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAMzC;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAM3C;AAID,eAAO,MAAM,GAAG;kBACA,MAAM,GAAG,IAAI;qBAQV,MAAM,GAAG,IAAI;kBAQhB,MAAM,GAAG,IAAI;mBAQZ,MAAM,GAAG,IAAI;kBAQd,MAAM,GAAG,IAAI;qBAQV,MAAM,GAAG,IAAI;CAO/B,CAAC;AAIF;;;;GAIG;AACH,wBAAgB,OAAO,IAAI,UAAU,CAuBpC"}
|