@macrulez/mediatoolz 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/LICENSE +21 -0
- package/README.md +182 -2
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +243 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/image-batch/backup.d.ts +22 -0
- package/dist/commands/image-batch/backup.js +55 -0
- package/dist/commands/image-batch/backup.js.map +1 -0
- package/dist/commands/image-batch/cache.d.ts +15 -0
- package/dist/commands/image-batch/cache.js +38 -0
- package/dist/commands/image-batch/cache.js.map +1 -0
- package/dist/commands/image-batch/cli.d.ts +15 -0
- package/dist/commands/image-batch/cli.js +323 -0
- package/dist/commands/image-batch/cli.js.map +1 -0
- package/dist/commands/image-batch/codecs.d.ts +38 -0
- package/dist/commands/image-batch/codecs.js +366 -0
- package/dist/commands/image-batch/codecs.js.map +1 -0
- package/dist/commands/image-batch/config.d.ts +121 -0
- package/dist/commands/image-batch/config.js +690 -0
- package/dist/commands/image-batch/config.js.map +1 -0
- package/dist/commands/image-batch/errors.d.ts +5 -0
- package/dist/commands/image-batch/errors.js +8 -0
- package/dist/commands/image-batch/errors.js.map +1 -0
- package/dist/commands/image-batch/geometry.d.ts +26 -0
- package/dist/commands/image-batch/geometry.js +90 -0
- package/dist/commands/image-batch/geometry.js.map +1 -0
- package/dist/commands/image-batch/inputs.d.ts +22 -0
- package/dist/commands/image-batch/inputs.js +87 -0
- package/dist/commands/image-batch/inputs.js.map +1 -0
- package/dist/commands/image-batch/manage-cli.d.ts +2 -0
- package/dist/commands/image-batch/manage-cli.js +276 -0
- package/dist/commands/image-batch/manage-cli.js.map +1 -0
- package/dist/commands/image-batch/manage.d.ts +51 -0
- package/dist/commands/image-batch/manage.js +1041 -0
- package/dist/commands/image-batch/manage.js.map +1 -0
- package/dist/commands/image-batch/overwrite.d.ts +14 -0
- package/dist/commands/image-batch/overwrite.js +31 -0
- package/dist/commands/image-batch/overwrite.js.map +1 -0
- package/dist/commands/image-batch/plan.d.ts +86 -0
- package/dist/commands/image-batch/plan.js +396 -0
- package/dist/commands/image-batch/plan.js.map +1 -0
- package/dist/commands/image-batch/process.d.ts +8 -0
- package/dist/commands/image-batch/process.js +97 -0
- package/dist/commands/image-batch/process.js.map +1 -0
- package/dist/commands/image-batch/report.d.ts +6 -0
- package/dist/commands/image-batch/report.js +251 -0
- package/dist/commands/image-batch/report.js.map +1 -0
- package/dist/commands/image-batch/restore.d.ts +29 -0
- package/dist/commands/image-batch/restore.js +125 -0
- package/dist/commands/image-batch/restore.js.map +1 -0
- package/dist/commands/image-batch/run.d.ts +127 -0
- package/dist/commands/image-batch/run.js +656 -0
- package/dist/commands/image-batch/run.js.map +1 -0
- package/dist/commands/image-batch/sharpen-ask.d.ts +6 -0
- package/dist/commands/image-batch/sharpen-ask.js +53 -0
- package/dist/commands/image-batch/sharpen-ask.js.map +1 -0
- package/dist/commands/image-batch/sharpen-manage.d.ts +26 -0
- package/dist/commands/image-batch/sharpen-manage.js +238 -0
- package/dist/commands/image-batch/sharpen-manage.js.map +1 -0
- package/dist/commands/image-batch/sharpen-presets.d.ts +24 -0
- package/dist/commands/image-batch/sharpen-presets.js +145 -0
- package/dist/commands/image-batch/sharpen-presets.js.map +1 -0
- package/dist/commands/image-batch/sharpen.d.ts +46 -0
- package/dist/commands/image-batch/sharpen.js +159 -0
- package/dist/commands/image-batch/sharpen.js.map +1 -0
- package/dist/commands/image-batch/template.d.ts +45 -0
- package/dist/commands/image-batch/template.js +142 -0
- package/dist/commands/image-batch/template.js.map +1 -0
- package/dist/commands/image-hash/cache.d.ts +14 -0
- package/dist/commands/image-hash/cache.js +40 -0
- package/dist/commands/image-hash/cache.js.map +1 -0
- package/dist/commands/image-hash/core.d.ts +61 -0
- package/dist/commands/image-hash/core.js +302 -0
- package/dist/commands/image-hash/core.js.map +1 -0
- package/dist/commands/image-hash/hash.d.ts +21 -0
- package/dist/commands/image-hash/hash.js +104 -0
- package/dist/commands/image-hash/hash.js.map +1 -0
- package/dist/commands/image-hash/report.d.ts +3 -0
- package/dist/commands/image-hash/report.js +96 -0
- package/dist/commands/image-hash/report.js.map +1 -0
- package/dist/commands/image-hash/run.d.ts +61 -0
- package/dist/commands/image-hash/run.js +317 -0
- package/dist/commands/image-hash/run.js.map +1 -0
- package/dist/commands/image-hash/sharp-loader.d.ts +64 -0
- package/dist/commands/image-hash/sharp-loader.js +81 -0
- package/dist/commands/image-hash/sharp-loader.js.map +1 -0
- package/dist/commands/ui/cli.d.ts +2 -0
- package/dist/commands/ui/cli.js +78 -0
- package/dist/commands/ui/cli.js.map +1 -0
- package/dist/commands/ui/fs-routes.d.ts +7 -0
- package/dist/commands/ui/fs-routes.js +135 -0
- package/dist/commands/ui/fs-routes.js.map +1 -0
- package/dist/commands/ui/http.d.ts +41 -0
- package/dist/commands/ui/http.js +81 -0
- package/dist/commands/ui/http.js.map +1 -0
- package/dist/commands/ui/jobs.d.ts +15 -0
- package/dist/commands/ui/jobs.js +73 -0
- package/dist/commands/ui/jobs.js.map +1 -0
- package/dist/commands/ui/modules/image-batch-backups.d.ts +2 -0
- package/dist/commands/ui/modules/image-batch-backups.js +116 -0
- package/dist/commands/ui/modules/image-batch-backups.js.map +1 -0
- package/dist/commands/ui/modules/image-batch-manage.d.ts +2 -0
- package/dist/commands/ui/modules/image-batch-manage.js +245 -0
- package/dist/commands/ui/modules/image-batch-manage.js.map +1 -0
- package/dist/commands/ui/modules/image-batch.d.ts +2 -0
- package/dist/commands/ui/modules/image-batch.js +225 -0
- package/dist/commands/ui/modules/image-batch.js.map +1 -0
- package/dist/commands/ui/modules/image-hash.d.ts +2 -0
- package/dist/commands/ui/modules/image-hash.js +158 -0
- package/dist/commands/ui/modules/image-hash.js.map +1 -0
- package/dist/commands/ui/modules/index.d.ts +2 -0
- package/dist/commands/ui/modules/index.js +4 -0
- package/dist/commands/ui/modules/index.js.map +1 -0
- package/dist/commands/ui/open-browser.d.ts +1 -0
- package/dist/commands/ui/open-browser.js +18 -0
- package/dist/commands/ui/open-browser.js.map +1 -0
- package/dist/commands/ui/scan.d.ts +20 -0
- package/dist/commands/ui/scan.js +57 -0
- package/dist/commands/ui/scan.js.map +1 -0
- package/dist/commands/ui/server.d.ts +18 -0
- package/dist/commands/ui/server.js +196 -0
- package/dist/commands/ui/server.js.map +1 -0
- package/dist/format/bytes.d.ts +2 -0
- package/dist/format/bytes.js +17 -0
- package/dist/format/bytes.js.map +1 -0
- package/dist/format/colors.d.ts +12 -0
- package/dist/format/colors.js +15 -0
- package/dist/format/colors.js.map +1 -0
- package/dist/format/diff-render.d.ts +2 -0
- package/dist/format/diff-render.js +35 -0
- package/dist/format/diff-render.js.map +1 -0
- package/dist/format/file-list.d.ts +6 -0
- package/dist/format/file-list.js +15 -0
- package/dist/format/file-list.js.map +1 -0
- package/dist/format/findings-list.d.ts +7 -0
- package/dist/format/findings-list.js +14 -0
- package/dist/format/findings-list.js.map +1 -0
- package/dist/format/style.d.ts +20 -0
- package/dist/format/style.js +36 -0
- package/dist/format/style.js.map +1 -0
- package/dist/format/table.d.ts +8 -0
- package/dist/format/table.js +44 -0
- package/dist/format/table.js.map +1 -0
- package/dist/format/vibes.d.ts +13 -0
- package/dist/format/vibes.js +82 -0
- package/dist/format/vibes.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/assets/ImageBatchPage-CY5Zbg4t.css +1 -0
- package/dist/ui/assets/ImageBatchPage-DVaFnQY8.js +4 -0
- package/dist/ui/assets/ImageHashPage-DpyJdByU.js +1 -0
- package/dist/ui/assets/ImageHashPage-chcY_Dzm.css +1 -0
- package/dist/ui/assets/SourcePicker-D8aZjDwP.css +1 -0
- package/dist/ui/assets/SourcePicker-eKj_VZzO.js +1 -0
- package/dist/ui/assets/index-D1s-23_t.css +1 -0
- package/dist/ui/assets/index-Dzvs2f2Q.js +3 -0
- package/dist/ui/index.html +17 -0
- package/dist/utils/closest.d.ts +2 -0
- package/dist/utils/closest.js +35 -0
- package/dist/utils/closest.js.map +1 -0
- package/dist/utils/glob.d.ts +4 -0
- package/dist/utils/glob.js +86 -0
- package/dist/utils/glob.js.map +1 -0
- package/dist/utils/split-list.d.ts +1 -0
- package/dist/utils/split-list.js +4 -0
- package/dist/utils/split-list.js.map +1 -0
- package/dist/utils/tty.d.ts +60 -0
- package/dist/utils/tty.js +390 -0
- package/dist/utils/tty.js.map +1 -0
- package/dist/utils/walk.d.ts +21 -0
- package/dist/utils/walk.js +116 -0
- package/dist/utils/walk.js.map +1 -0
- package/package.json +82 -4
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Style } from '../format/style.js';
|
|
2
|
+
export interface TerminalInput {
|
|
3
|
+
isTTY?: boolean;
|
|
4
|
+
setRawMode?: (mode: boolean) => unknown;
|
|
5
|
+
resume: () => unknown;
|
|
6
|
+
pause: () => unknown;
|
|
7
|
+
setEncoding?: (encoding: BufferEncoding) => unknown;
|
|
8
|
+
on: (event: 'data', listener: (chunk: string | Buffer) => void) => unknown;
|
|
9
|
+
off: (event: 'data', listener: (chunk: string | Buffer) => void) => unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface TerminalOutput {
|
|
12
|
+
isTTY?: boolean;
|
|
13
|
+
columns?: number;
|
|
14
|
+
rows?: number;
|
|
15
|
+
write: (text: string) => unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface TerminalIO {
|
|
18
|
+
input: TerminalInput;
|
|
19
|
+
output: TerminalOutput;
|
|
20
|
+
}
|
|
21
|
+
export interface Key {
|
|
22
|
+
name: string;
|
|
23
|
+
ch?: string;
|
|
24
|
+
ctrl?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export declare function parseKeys(data: string): Key[];
|
|
27
|
+
export declare class KeyReader {
|
|
28
|
+
private readonly input;
|
|
29
|
+
private readonly queue;
|
|
30
|
+
private waiting;
|
|
31
|
+
private readonly listener;
|
|
32
|
+
constructor(input: TerminalInput);
|
|
33
|
+
next(): Promise<Key>;
|
|
34
|
+
close(): void;
|
|
35
|
+
}
|
|
36
|
+
export declare function isInteractive(io: TerminalIO): boolean;
|
|
37
|
+
export declare function defaultTerminal(): TerminalIO;
|
|
38
|
+
export interface Choice<T extends string = string> {
|
|
39
|
+
key: T;
|
|
40
|
+
label: string;
|
|
41
|
+
}
|
|
42
|
+
export declare function promptChoice<T extends string>(io: TerminalIO, question: string, choices: Choice<T>[], style: Style, fallback?: T): Promise<T>;
|
|
43
|
+
export interface SelectItem<T> {
|
|
44
|
+
label: string;
|
|
45
|
+
hint?: string;
|
|
46
|
+
value: T;
|
|
47
|
+
selected?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface SelectOptions {
|
|
50
|
+
title: string;
|
|
51
|
+
help?: string;
|
|
52
|
+
multi: boolean;
|
|
53
|
+
filterable?: boolean;
|
|
54
|
+
pageSize?: number;
|
|
55
|
+
emptyMessage?: string;
|
|
56
|
+
}
|
|
57
|
+
export declare function runSelect<T>(io: TerminalIO, items: SelectItem<T>[], options: SelectOptions, style: Style): Promise<T[] | null>;
|
|
58
|
+
export declare function multiSelect<T>(io: TerminalIO, items: SelectItem<T>[], options: Omit<SelectOptions, 'multi'>, style: Style): Promise<T[] | null>;
|
|
59
|
+
export declare function singleSelect<T>(io: TerminalIO, items: SelectItem<T>[], options: Omit<SelectOptions, 'multi'>, style: Style): Promise<T | null>;
|
|
60
|
+
export declare function askText(io: TerminalIO, question: string, style: Style, initial?: string): Promise<string | null>;
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
const ESCAPES = {
|
|
2
|
+
'[A': 'up',
|
|
3
|
+
'[B': 'down',
|
|
4
|
+
'[C': 'right',
|
|
5
|
+
'[D': 'left',
|
|
6
|
+
OA: 'up',
|
|
7
|
+
OB: 'down',
|
|
8
|
+
OC: 'right',
|
|
9
|
+
OD: 'left',
|
|
10
|
+
'[H': 'home',
|
|
11
|
+
'[F': 'end',
|
|
12
|
+
OH: 'home',
|
|
13
|
+
OF: 'end',
|
|
14
|
+
'[1~': 'home',
|
|
15
|
+
'[4~': 'end',
|
|
16
|
+
'[5~': 'pageup',
|
|
17
|
+
'[6~': 'pagedown',
|
|
18
|
+
'[3~': 'delete',
|
|
19
|
+
};
|
|
20
|
+
export function parseKeys(data) {
|
|
21
|
+
const keys = [];
|
|
22
|
+
let i = 0;
|
|
23
|
+
while (i < data.length) {
|
|
24
|
+
const ch = data[i];
|
|
25
|
+
if (ch === '\x1b') {
|
|
26
|
+
let matched = false;
|
|
27
|
+
for (const length of [4, 3, 2]) {
|
|
28
|
+
const name = ESCAPES[data.slice(i + 1, i + length)];
|
|
29
|
+
if (name !== undefined) {
|
|
30
|
+
keys.push({ name });
|
|
31
|
+
i += length;
|
|
32
|
+
matched = true;
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (!matched) {
|
|
37
|
+
keys.push({ name: 'escape' });
|
|
38
|
+
i += 1;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else if (ch === '\x03') {
|
|
42
|
+
keys.push({ name: 'c', ctrl: true });
|
|
43
|
+
i += 1;
|
|
44
|
+
}
|
|
45
|
+
else if (ch === '\r' || ch === '\n') {
|
|
46
|
+
keys.push({ name: 'enter' });
|
|
47
|
+
i += ch === '\r' && data[i + 1] === '\n' ? 2 : 1;
|
|
48
|
+
}
|
|
49
|
+
else if (ch === '\x7f' || ch === '\b') {
|
|
50
|
+
keys.push({ name: 'backspace' });
|
|
51
|
+
i += 1;
|
|
52
|
+
}
|
|
53
|
+
else if (ch === ' ') {
|
|
54
|
+
keys.push({ name: 'space', ch });
|
|
55
|
+
i += 1;
|
|
56
|
+
}
|
|
57
|
+
else if (ch === '\t') {
|
|
58
|
+
keys.push({ name: 'tab' });
|
|
59
|
+
i += 1;
|
|
60
|
+
}
|
|
61
|
+
else if (ch >= ' ') {
|
|
62
|
+
keys.push({ name: ch, ch });
|
|
63
|
+
i += 1;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
i += 1;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return keys;
|
|
70
|
+
}
|
|
71
|
+
export class KeyReader {
|
|
72
|
+
input;
|
|
73
|
+
queue = [];
|
|
74
|
+
waiting = null;
|
|
75
|
+
listener = (chunk) => {
|
|
76
|
+
for (const key of parseKeys(typeof chunk === 'string' ? chunk : chunk.toString('utf8'))) {
|
|
77
|
+
if (this.waiting) {
|
|
78
|
+
const resolve = this.waiting;
|
|
79
|
+
this.waiting = null;
|
|
80
|
+
resolve(key);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
this.queue.push(key);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
constructor(input) {
|
|
88
|
+
this.input = input;
|
|
89
|
+
input.setEncoding?.('utf8');
|
|
90
|
+
input.setRawMode?.(true);
|
|
91
|
+
input.resume();
|
|
92
|
+
input.on('data', this.listener);
|
|
93
|
+
}
|
|
94
|
+
next() {
|
|
95
|
+
const queued = this.queue.shift();
|
|
96
|
+
if (queued)
|
|
97
|
+
return Promise.resolve(queued);
|
|
98
|
+
return new Promise((resolve) => {
|
|
99
|
+
this.waiting = resolve;
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
close() {
|
|
103
|
+
this.input.off('data', this.listener);
|
|
104
|
+
this.input.setRawMode?.(false);
|
|
105
|
+
this.input.pause();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export function isInteractive(io) {
|
|
109
|
+
return Boolean(io.input.isTTY) && Boolean(io.output.isTTY);
|
|
110
|
+
}
|
|
111
|
+
export function defaultTerminal() {
|
|
112
|
+
return {
|
|
113
|
+
input: process.stdin,
|
|
114
|
+
output: process.stderr,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const HIDE_CURSOR = '\x1b[?25l';
|
|
118
|
+
const SHOW_CURSOR = '\x1b[?25h';
|
|
119
|
+
function fit(text, width) {
|
|
120
|
+
if (width <= 1 || text.length <= width)
|
|
121
|
+
return text;
|
|
122
|
+
return `${text.slice(0, width - 1)}…`;
|
|
123
|
+
}
|
|
124
|
+
export async function promptChoice(io, question, choices, style, fallback) {
|
|
125
|
+
const labels = choices
|
|
126
|
+
.map((choice) => `${style.accent(`[${choice.key}]`)} ${style.value(choice.label)}`)
|
|
127
|
+
.join(' ');
|
|
128
|
+
io.output.write(`${question}\n ${labels}\n`);
|
|
129
|
+
const reader = new KeyReader(io.input);
|
|
130
|
+
try {
|
|
131
|
+
for (;;) {
|
|
132
|
+
const key = await reader.next();
|
|
133
|
+
if (key.ctrl && key.name === 'c') {
|
|
134
|
+
const cancel = choices.find((c) => c.key === 'q') ?? choices[choices.length - 1];
|
|
135
|
+
if (cancel)
|
|
136
|
+
return cancel.key;
|
|
137
|
+
}
|
|
138
|
+
const hit = choices.find((choice) => choice.key === key.name.toLowerCase());
|
|
139
|
+
if (hit)
|
|
140
|
+
return hit.key;
|
|
141
|
+
if ((key.name === 'enter' || key.name === 'escape') && fallback !== undefined) {
|
|
142
|
+
return fallback;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
reader.close();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function visibleIndexes(items, filter) {
|
|
151
|
+
const needle = filter.toLowerCase();
|
|
152
|
+
const result = [];
|
|
153
|
+
items.forEach((item, index) => {
|
|
154
|
+
if (needle === '' || item.label.toLowerCase().includes(needle))
|
|
155
|
+
result.push(index);
|
|
156
|
+
});
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
function computePageSize(io, requested) {
|
|
160
|
+
const rows = io.output.rows ?? 24;
|
|
161
|
+
const available = Math.max(5, rows - 6);
|
|
162
|
+
return Math.max(3, Math.min(requested ?? 20, available));
|
|
163
|
+
}
|
|
164
|
+
function renderList(io, items, options, state, style, pageSize) {
|
|
165
|
+
const width = (io.output.columns ?? 100) - 1;
|
|
166
|
+
const visible = visibleIndexes(items, state.filter);
|
|
167
|
+
const lines = [style.heading(fit(options.title, width))];
|
|
168
|
+
if (options.help)
|
|
169
|
+
lines.push(style.muted(fit(options.help, width)));
|
|
170
|
+
if (options.filterable && (state.filtering || state.filter !== '')) {
|
|
171
|
+
lines.push(`${style.accent('filter')} ${style.value(state.filter)}${state.filtering ? style.muted('▏') : ''}`);
|
|
172
|
+
}
|
|
173
|
+
if (visible.length === 0) {
|
|
174
|
+
lines.push(style.warn(options.emptyMessage ?? ' nothing matches'));
|
|
175
|
+
}
|
|
176
|
+
const slice = visible.slice(state.offset, state.offset + pageSize);
|
|
177
|
+
slice.forEach((itemIndex, row) => {
|
|
178
|
+
const item = items[itemIndex];
|
|
179
|
+
const isCursor = state.offset + row === state.cursor;
|
|
180
|
+
const marker = isCursor ? style.accent('❯') : ' ';
|
|
181
|
+
const box = options.multi
|
|
182
|
+
? `${state.selected.has(itemIndex) ? style.success('◉') : style.muted('○')} `
|
|
183
|
+
: '';
|
|
184
|
+
const reserved = 4 + (options.multi ? 2 : 0);
|
|
185
|
+
const hint = item.hint ?? '';
|
|
186
|
+
const labelRoom = Math.max(10, width - reserved - (hint ? Math.min(hint.length, 40) + 2 : 0));
|
|
187
|
+
const label = fit(item.label, labelRoom);
|
|
188
|
+
const text = isCursor ? style.bold(style.path(label)) : style.path(label);
|
|
189
|
+
lines.push(`${marker} ${box}${text}${hint ? ` ${style.muted(fit(hint, 40))}` : ''}`);
|
|
190
|
+
});
|
|
191
|
+
if (visible.length > pageSize) {
|
|
192
|
+
const from = state.offset + 1;
|
|
193
|
+
const to = Math.min(visible.length, state.offset + pageSize);
|
|
194
|
+
lines.push(style.muted(` ${from}–${to} of ${visible.length}`));
|
|
195
|
+
}
|
|
196
|
+
if (options.multi) {
|
|
197
|
+
lines.push(style.info(` ${state.selected.size} selected of ${items.length}`));
|
|
198
|
+
}
|
|
199
|
+
return lines;
|
|
200
|
+
}
|
|
201
|
+
export async function runSelect(io, items, options, style) {
|
|
202
|
+
const pageSize = computePageSize(io, options.pageSize);
|
|
203
|
+
const state = {
|
|
204
|
+
cursor: 0,
|
|
205
|
+
offset: 0,
|
|
206
|
+
selected: new Set(items.flatMap((item, i) => (item.selected ? [i] : []))),
|
|
207
|
+
filter: '',
|
|
208
|
+
filtering: false,
|
|
209
|
+
};
|
|
210
|
+
const reader = new KeyReader(io.input);
|
|
211
|
+
let drawn = 0;
|
|
212
|
+
const draw = () => {
|
|
213
|
+
const visible = visibleIndexes(items, state.filter);
|
|
214
|
+
state.cursor = Math.max(0, Math.min(state.cursor, visible.length - 1));
|
|
215
|
+
if (state.cursor < state.offset)
|
|
216
|
+
state.offset = state.cursor;
|
|
217
|
+
if (state.cursor >= state.offset + pageSize)
|
|
218
|
+
state.offset = state.cursor - pageSize + 1;
|
|
219
|
+
const lines = renderList(io, items, options, state, style, pageSize);
|
|
220
|
+
const clear = drawn > 0 ? `\x1b[${drawn}A\r\x1b[J` : '';
|
|
221
|
+
io.output.write(`${clear}${lines.join('\n')}\n`);
|
|
222
|
+
drawn = lines.length;
|
|
223
|
+
};
|
|
224
|
+
const erase = () => {
|
|
225
|
+
if (drawn > 0)
|
|
226
|
+
io.output.write(`\x1b[${drawn}A\r\x1b[J`);
|
|
227
|
+
drawn = 0;
|
|
228
|
+
};
|
|
229
|
+
io.output.write(HIDE_CURSOR);
|
|
230
|
+
try {
|
|
231
|
+
draw();
|
|
232
|
+
for (;;) {
|
|
233
|
+
const key = await reader.next();
|
|
234
|
+
const visible = visibleIndexes(items, state.filter);
|
|
235
|
+
if (key.ctrl && key.name === 'c')
|
|
236
|
+
return finish(null);
|
|
237
|
+
if (state.filtering) {
|
|
238
|
+
if (key.name === 'enter')
|
|
239
|
+
state.filtering = false;
|
|
240
|
+
else if (key.name === 'escape') {
|
|
241
|
+
state.filtering = false;
|
|
242
|
+
state.filter = '';
|
|
243
|
+
state.cursor = 0;
|
|
244
|
+
state.offset = 0;
|
|
245
|
+
}
|
|
246
|
+
else if (key.name === 'backspace') {
|
|
247
|
+
state.filter = state.filter.slice(0, -1);
|
|
248
|
+
state.cursor = 0;
|
|
249
|
+
state.offset = 0;
|
|
250
|
+
}
|
|
251
|
+
else if (key.ch !== undefined) {
|
|
252
|
+
state.filter += key.ch;
|
|
253
|
+
state.cursor = 0;
|
|
254
|
+
state.offset = 0;
|
|
255
|
+
}
|
|
256
|
+
else if (key.name === 'up')
|
|
257
|
+
state.cursor -= 1;
|
|
258
|
+
else if (key.name === 'down')
|
|
259
|
+
state.cursor += 1;
|
|
260
|
+
draw();
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
switch (key.name) {
|
|
264
|
+
case 'up':
|
|
265
|
+
case 'k':
|
|
266
|
+
state.cursor = state.cursor <= 0 ? visible.length - 1 : state.cursor - 1;
|
|
267
|
+
break;
|
|
268
|
+
case 'down':
|
|
269
|
+
case 'j':
|
|
270
|
+
state.cursor = state.cursor >= visible.length - 1 ? 0 : state.cursor + 1;
|
|
271
|
+
break;
|
|
272
|
+
case 'pageup':
|
|
273
|
+
state.cursor = Math.max(0, state.cursor - pageSize);
|
|
274
|
+
break;
|
|
275
|
+
case 'pagedown':
|
|
276
|
+
state.cursor = Math.min(visible.length - 1, state.cursor + pageSize);
|
|
277
|
+
break;
|
|
278
|
+
case 'home':
|
|
279
|
+
state.cursor = 0;
|
|
280
|
+
break;
|
|
281
|
+
case 'end':
|
|
282
|
+
state.cursor = visible.length - 1;
|
|
283
|
+
break;
|
|
284
|
+
case 'space':
|
|
285
|
+
if (options.multi) {
|
|
286
|
+
const index = visible[state.cursor];
|
|
287
|
+
if (index !== undefined) {
|
|
288
|
+
if (state.selected.has(index))
|
|
289
|
+
state.selected.delete(index);
|
|
290
|
+
else
|
|
291
|
+
state.selected.add(index);
|
|
292
|
+
}
|
|
293
|
+
state.cursor = Math.min(visible.length - 1, state.cursor + 1);
|
|
294
|
+
}
|
|
295
|
+
break;
|
|
296
|
+
case 'a':
|
|
297
|
+
if (options.multi)
|
|
298
|
+
for (const index of visible)
|
|
299
|
+
state.selected.add(index);
|
|
300
|
+
break;
|
|
301
|
+
case 'n':
|
|
302
|
+
if (options.multi)
|
|
303
|
+
for (const index of visible)
|
|
304
|
+
state.selected.delete(index);
|
|
305
|
+
break;
|
|
306
|
+
case 'i':
|
|
307
|
+
if (options.multi) {
|
|
308
|
+
for (const index of visible) {
|
|
309
|
+
if (state.selected.has(index))
|
|
310
|
+
state.selected.delete(index);
|
|
311
|
+
else
|
|
312
|
+
state.selected.add(index);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
break;
|
|
316
|
+
case '/':
|
|
317
|
+
if (options.filterable)
|
|
318
|
+
state.filtering = true;
|
|
319
|
+
break;
|
|
320
|
+
case 'enter': {
|
|
321
|
+
if (options.multi) {
|
|
322
|
+
const picked = [...state.selected].sort((a, b) => a - b);
|
|
323
|
+
return finish(picked.map((index) => items[index].value));
|
|
324
|
+
}
|
|
325
|
+
const index = visible[state.cursor];
|
|
326
|
+
if (index === undefined)
|
|
327
|
+
break;
|
|
328
|
+
return finish([items[index].value]);
|
|
329
|
+
}
|
|
330
|
+
case 'q':
|
|
331
|
+
case 'escape':
|
|
332
|
+
if (state.filter !== '') {
|
|
333
|
+
state.filter = '';
|
|
334
|
+
state.cursor = 0;
|
|
335
|
+
state.offset = 0;
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
return finish(null);
|
|
339
|
+
}
|
|
340
|
+
draw();
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
finally {
|
|
344
|
+
reader.close();
|
|
345
|
+
io.output.write(SHOW_CURSOR);
|
|
346
|
+
}
|
|
347
|
+
function finish(result) {
|
|
348
|
+
erase();
|
|
349
|
+
return result;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
export async function multiSelect(io, items, options, style) {
|
|
353
|
+
return runSelect(io, items, { ...options, multi: true }, style);
|
|
354
|
+
}
|
|
355
|
+
export async function singleSelect(io, items, options, style) {
|
|
356
|
+
const result = await runSelect(io, items, { ...options, multi: false }, style);
|
|
357
|
+
return result === null ? null : result[0];
|
|
358
|
+
}
|
|
359
|
+
export async function askText(io, question, style, initial = '') {
|
|
360
|
+
const reader = new KeyReader(io.input);
|
|
361
|
+
let value = initial;
|
|
362
|
+
const render = () => io.output.write(`\r\x1b[K${style.accent('?')} ${question} ${style.value(value)}`);
|
|
363
|
+
try {
|
|
364
|
+
render();
|
|
365
|
+
for (;;) {
|
|
366
|
+
const key = await reader.next();
|
|
367
|
+
if (key.ctrl && key.name === 'c') {
|
|
368
|
+
io.output.write('\n');
|
|
369
|
+
return null;
|
|
370
|
+
}
|
|
371
|
+
if (key.name === 'escape') {
|
|
372
|
+
io.output.write('\n');
|
|
373
|
+
return null;
|
|
374
|
+
}
|
|
375
|
+
if (key.name === 'enter') {
|
|
376
|
+
io.output.write('\n');
|
|
377
|
+
return value;
|
|
378
|
+
}
|
|
379
|
+
if (key.name === 'backspace')
|
|
380
|
+
value = value.slice(0, -1);
|
|
381
|
+
else if (key.ch !== undefined)
|
|
382
|
+
value += key.ch;
|
|
383
|
+
render();
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
finally {
|
|
387
|
+
reader.close();
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=tty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tty.js","sourceRoot":"","sources":["../../src/utils/tty.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface WalkOptions {
|
|
2
|
+
cwd: string;
|
|
3
|
+
/** file extensions to include, each with its leading dot, e.g. ['.ts', '.vue'] */
|
|
4
|
+
extensions: string[];
|
|
5
|
+
/** extra gitignore-syntax patterns, on top of DEFAULT_IGNORES and the real .gitignore */
|
|
6
|
+
ignoreGlobs?: string[];
|
|
7
|
+
/** default true — also honor <cwd>/.gitignore, root-level only (see features.md case-check/walk caveats) */
|
|
8
|
+
respectGitignore?: boolean;
|
|
9
|
+
/** default true — descend into subdirectories; false only lists files directly inside each given directory */
|
|
10
|
+
recursive?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Resolves `inputPaths` (files and/or directories, as given on the CLI)
|
|
14
|
+
* into a flat, deduplicated list of absolute file paths matching
|
|
15
|
+
* `options.extensions` — directories are walked recursively, honoring
|
|
16
|
+
* DEFAULT_IGNORES + the real `.gitignore` + any extra `--ignore` globs.
|
|
17
|
+
* An explicitly-named file is included even if its extension wouldn't
|
|
18
|
+
* otherwise match (the caller asked for it by name) but is still subject
|
|
19
|
+
* to ignore-matching, so `--ignore` can still exclude it.
|
|
20
|
+
*/
|
|
21
|
+
export declare function walk(inputPaths: string[], options: WalkOptions): string[];
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, statSync } from 'node:fs';
|
|
2
|
+
import { basename, join, relative, resolve } from 'node:path';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
// `ignore` is CJS with no "exports" map in its package.json — under
|
|
5
|
+
// `moduleResolution: NodeNext` (which this project uses because it
|
|
6
|
+
// matches Node's actual runtime resolution, unlike "Bundler"), TS's
|
|
7
|
+
// default-export interop for exactly that shape of package breaks: `import
|
|
8
|
+
// ignore from 'ignore'` type-checks as the raw module namespace, not the
|
|
9
|
+
// callable factory (reproduced in isolation, not a config mistake here).
|
|
10
|
+
// Loading it via the real CJS loader sidesteps the broken interop
|
|
11
|
+
// entirely — arguably the more honest way to consume a CJS module from
|
|
12
|
+
// ESM anyway.
|
|
13
|
+
const require = createRequire(import.meta.url);
|
|
14
|
+
const ignore = require('ignore');
|
|
15
|
+
// Every dev-toolz command that scans a tree agrees on this default —
|
|
16
|
+
// listed once here instead of copy-pasted per command. `--ignore` (per
|
|
17
|
+
// command) adds to this, it never has to re-list these.
|
|
18
|
+
//
|
|
19
|
+
// `.nuxt`/`.output`/`.next` — real dogfooding against vue-image-kit's
|
|
20
|
+
// `demo-nuxt/` (2026-09-25, empty-catch) found minified build output
|
|
21
|
+
// getting scanned as real source, producing nonsense findings at
|
|
22
|
+
// column 138282 in a single-line bundle. `.gitignore` support alone
|
|
23
|
+
// doesn't catch this: it only reads the root `<cwd>/.gitignore`, not a
|
|
24
|
+
// nested project's own one (`demo-nuxt` here has its own, several
|
|
25
|
+
// levels down) — so a framework's own well-known build-output
|
|
26
|
+
// directory name needs to be a hardcoded default, the same as
|
|
27
|
+
// `dist`/`build` already are, not left to `.gitignore` to catch.
|
|
28
|
+
const DEFAULT_IGNORES = [
|
|
29
|
+
'node_modules',
|
|
30
|
+
'dist',
|
|
31
|
+
'build',
|
|
32
|
+
'.git',
|
|
33
|
+
'coverage',
|
|
34
|
+
'.nuxt',
|
|
35
|
+
'.output',
|
|
36
|
+
'.next',
|
|
37
|
+
];
|
|
38
|
+
function buildMatcher(options) {
|
|
39
|
+
const matcher = ignore();
|
|
40
|
+
matcher.add(DEFAULT_IGNORES);
|
|
41
|
+
if (options.respectGitignore !== false) {
|
|
42
|
+
try {
|
|
43
|
+
const gitignoreText = readFileSync(join(options.cwd, '.gitignore'), 'utf8');
|
|
44
|
+
matcher.add(gitignoreText);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// no .gitignore at cwd root — nothing extra to add, not an error
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (options.ignoreGlobs?.length)
|
|
51
|
+
matcher.add(options.ignoreGlobs);
|
|
52
|
+
return matcher;
|
|
53
|
+
}
|
|
54
|
+
// `ignore` requires a path that's genuinely relative to its root (no `..`
|
|
55
|
+
// segments) and throws otherwise — true for everything under a normal
|
|
56
|
+
// `--cwd`-rooted scan, but a caller can point `walk()` at a path outside
|
|
57
|
+
// `--cwd` entirely (an unusual invocation, but not one that should crash).
|
|
58
|
+
// There's no `.gitignore`/`--ignore` rule that meaningfully applies
|
|
59
|
+
// outside the root they were read relative to, so falls back to just the
|
|
60
|
+
// hardcoded default-noise-directory names for anything out there.
|
|
61
|
+
function isIgnored(absPath, cwd, matcher) {
|
|
62
|
+
const relPath = relative(cwd, absPath).split('\\').join('/');
|
|
63
|
+
if (relPath === '')
|
|
64
|
+
return false;
|
|
65
|
+
if (relPath.startsWith('..'))
|
|
66
|
+
return DEFAULT_IGNORES.includes(basename(absPath));
|
|
67
|
+
return matcher.ignores(relPath);
|
|
68
|
+
}
|
|
69
|
+
function walkDir(absDir, cwd, matcher, extensions, out, recursive) {
|
|
70
|
+
for (const entry of readdirSync(absDir, { withFileTypes: true })) {
|
|
71
|
+
const absPath = join(absDir, entry.name);
|
|
72
|
+
if (isIgnored(absPath, cwd, matcher))
|
|
73
|
+
continue;
|
|
74
|
+
if (entry.isDirectory()) {
|
|
75
|
+
if (recursive)
|
|
76
|
+
walkDir(absPath, cwd, matcher, extensions, out, recursive);
|
|
77
|
+
}
|
|
78
|
+
else if (entry.isFile()) {
|
|
79
|
+
const dot = entry.name.lastIndexOf('.');
|
|
80
|
+
const ext = dot === -1 ? '' : entry.name.slice(dot);
|
|
81
|
+
if (extensions.has(ext))
|
|
82
|
+
out.push(absPath);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolves `inputPaths` (files and/or directories, as given on the CLI)
|
|
88
|
+
* into a flat, deduplicated list of absolute file paths matching
|
|
89
|
+
* `options.extensions` — directories are walked recursively, honoring
|
|
90
|
+
* DEFAULT_IGNORES + the real `.gitignore` + any extra `--ignore` globs.
|
|
91
|
+
* An explicitly-named file is included even if its extension wouldn't
|
|
92
|
+
* otherwise match (the caller asked for it by name) but is still subject
|
|
93
|
+
* to ignore-matching, so `--ignore` can still exclude it.
|
|
94
|
+
*/
|
|
95
|
+
export function walk(inputPaths, options) {
|
|
96
|
+
const matcher = buildMatcher(options);
|
|
97
|
+
const extensions = new Set(options.extensions);
|
|
98
|
+
const roots = inputPaths.length > 0 ? inputPaths : ['.'];
|
|
99
|
+
const out = [];
|
|
100
|
+
for (const inputPath of roots) {
|
|
101
|
+
const absPath = resolve(options.cwd, inputPath);
|
|
102
|
+
if (isIgnored(absPath, options.cwd, matcher))
|
|
103
|
+
continue;
|
|
104
|
+
const stat = statSync(absPath, { throwIfNoEntry: false });
|
|
105
|
+
if (!stat)
|
|
106
|
+
continue;
|
|
107
|
+
if (stat.isDirectory()) {
|
|
108
|
+
walkDir(absPath, options.cwd, matcher, extensions, out, options.recursive !== false);
|
|
109
|
+
}
|
|
110
|
+
else if (stat.isFile()) {
|
|
111
|
+
out.push(absPath);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return [...new Set(out)];
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=walk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk.js","sourceRoot":"","sources":["../../src/utils/walk.ts"],"names":[],"mappings":"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"}
|