mepcli 2.0.0-beta.2 → 2.0.0-beta.4
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 +1 -1
- package/README.md +20 -0
- package/dist/ansi.d.ts +36 -0
- package/dist/ansi.js +1 -0
- package/dist/base.d.ts +61 -0
- package/dist/base.js +1 -0
- package/dist/{src/core.js → core.d.ts} +181 -345
- package/dist/core.js +1 -0
- package/dist/data/countries.d.ts +2 -0
- package/dist/data/countries.js +1 -0
- package/dist/data/licenses.d.ts +2 -0
- package/dist/data/licenses.js +1 -0
- package/dist/highlight.d.ts +7 -0
- package/dist/highlight.js +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.js +1 -0
- package/dist/input.d.ts +14 -0
- package/dist/input.js +1 -0
- package/dist/pipeline.d.ts +90 -0
- package/dist/pipeline.js +1 -0
- package/dist/prompts/autocomplete.d.ts +22 -0
- package/dist/prompts/autocomplete.js +1 -0
- package/dist/prompts/box.d.ts +21 -0
- package/dist/prompts/box.js +4 -0
- package/dist/prompts/breadcrumb-search.d.ts +14 -0
- package/dist/prompts/breadcrumb-search.js +2 -0
- package/dist/prompts/breadcrumb.d.ts +32 -0
- package/dist/prompts/breadcrumb.js +3 -0
- package/dist/prompts/byte.d.ts +13 -0
- package/dist/prompts/byte.js +5 -0
- package/dist/prompts/calculator.d.ts +17 -0
- package/dist/prompts/calculator.js +3 -0
- package/dist/prompts/calendar.d.ts +33 -0
- package/dist/prompts/calendar.js +3 -0
- package/dist/prompts/checkbox.d.ts +13 -0
- package/dist/prompts/checkbox.js +2 -0
- package/dist/prompts/code.d.ts +19 -0
- package/dist/prompts/code.js +4 -0
- package/dist/prompts/color.d.ts +14 -0
- package/dist/prompts/color.js +10 -0
- package/dist/prompts/confirm.d.ts +8 -0
- package/dist/prompts/confirm.js +1 -0
- package/dist/prompts/connection-string.d.ts +18 -0
- package/dist/prompts/connection-string.js +1 -0
- package/dist/prompts/cron.d.ts +13 -0
- package/dist/prompts/cron.js +4 -0
- package/dist/prompts/curl-utils.d.ts +25 -0
- package/dist/prompts/curl-utils.js +1 -0
- package/dist/prompts/curl.d.ts +41 -0
- package/dist/prompts/curl.js +12 -0
- package/dist/prompts/data-inspector.d.ts +22 -0
- package/dist/prompts/data-inspector.js +5 -0
- package/dist/prompts/date.d.ts +12 -0
- package/dist/prompts/date.js +2 -0
- package/dist/prompts/dependency.d.ts +16 -0
- package/dist/prompts/dependency.js +3 -0
- package/dist/prompts/dial.d.ts +10 -0
- package/dist/prompts/dial.js +3 -0
- package/dist/prompts/diff.d.ts +10 -0
- package/dist/prompts/diff.js +10 -0
- package/dist/prompts/draw.d.ts +20 -0
- package/dist/prompts/draw.js +6 -0
- package/dist/prompts/editor.d.ts +14 -0
- package/dist/prompts/editor.js +2 -0
- package/dist/prompts/emoji.d.ts +18 -0
- package/dist/prompts/emoji.js +5 -0
- package/dist/prompts/exec.d.ts +17 -0
- package/dist/prompts/exec.js +1 -0
- package/dist/prompts/file.d.ts +21 -0
- package/dist/prompts/file.js +2 -0
- package/dist/prompts/form.d.ts +18 -0
- package/dist/prompts/form.js +1 -0
- package/dist/prompts/fuzzy-multi-column.d.ts +12 -0
- package/dist/prompts/fuzzy-multi-column.js +2 -0
- package/dist/prompts/fuzzy.d.ts +12 -0
- package/dist/prompts/fuzzy.js +2 -0
- package/dist/prompts/gauge.d.ts +21 -0
- package/dist/prompts/gauge.js +4 -0
- package/dist/prompts/grid.d.ts +14 -0
- package/dist/prompts/grid.js +2 -0
- package/dist/prompts/heatmap.d.ts +13 -0
- package/dist/prompts/heatmap.js +2 -0
- package/dist/prompts/ip.d.ts +11 -0
- package/dist/prompts/ip.js +3 -0
- package/dist/prompts/kanban.d.ts +17 -0
- package/dist/prompts/kanban.js +4 -0
- package/dist/prompts/keypress.d.ts +7 -0
- package/dist/prompts/keypress.js +1 -0
- package/dist/prompts/license.d.ts +9 -0
- package/dist/prompts/license.js +13 -0
- package/dist/prompts/list.d.ts +9 -0
- package/dist/prompts/list.js +1 -0
- package/dist/prompts/map.d.ts +17 -0
- package/dist/prompts/map.js +5 -0
- package/dist/prompts/match.d.ts +19 -0
- package/dist/prompts/match.js +7 -0
- package/dist/prompts/miller.d.ts +15 -0
- package/dist/prompts/miller.js +2 -0
- package/dist/prompts/multi-column-select.d.ts +10 -0
- package/dist/prompts/multi-column-select.js +2 -0
- package/dist/prompts/multi-range.d.ts +9 -0
- package/dist/prompts/multi-range.js +3 -0
- package/dist/prompts/multi-select.d.ts +15 -0
- package/dist/prompts/multi-select.js +4 -0
- package/dist/prompts/number.d.ts +11 -0
- package/dist/prompts/number.js +2 -0
- package/dist/prompts/otp.d.ts +10 -0
- package/dist/prompts/otp.js +2 -0
- package/dist/prompts/pattern.d.ts +22 -0
- package/dist/prompts/pattern.js +4 -0
- package/dist/prompts/phone.d.ts +41 -0
- package/dist/prompts/phone.js +3 -0
- package/dist/prompts/quiz-select.d.ts +10 -0
- package/dist/prompts/quiz-select.js +7 -0
- package/dist/prompts/quiz-text.d.ts +11 -0
- package/dist/prompts/quiz-text.js +8 -0
- package/dist/prompts/range.d.ts +9 -0
- package/dist/prompts/range.js +1 -0
- package/dist/prompts/rating.d.ts +8 -0
- package/dist/prompts/rating.js +1 -0
- package/dist/prompts/regex.d.ts +13 -0
- package/dist/prompts/regex.js +5 -0
- package/dist/prompts/region.d.ts +11 -0
- package/dist/prompts/region.js +5 -0
- package/dist/prompts/schedule.d.ts +20 -0
- package/dist/prompts/schedule.js +5 -0
- package/dist/prompts/scroll.d.ts +13 -0
- package/dist/prompts/scroll.js +1 -0
- package/dist/prompts/seat.d.ts +17 -0
- package/dist/prompts/seat.js +5 -0
- package/dist/prompts/select-range.d.ts +8 -0
- package/dist/prompts/select-range.js +3 -0
- package/dist/prompts/select.d.ts +15 -0
- package/dist/prompts/select.js +2 -0
- package/dist/prompts/semver.d.ts +6 -0
- package/dist/prompts/semver.js +1 -0
- package/dist/prompts/shortcut.d.ts +9 -0
- package/dist/prompts/shortcut.js +1 -0
- package/dist/prompts/slider.d.ts +8 -0
- package/dist/prompts/slider.js +1 -0
- package/dist/prompts/slot.d.ts +16 -0
- package/dist/prompts/slot.js +8 -0
- package/dist/prompts/snippet.d.ts +19 -0
- package/dist/prompts/snippet.js +4 -0
- package/dist/prompts/sort-grid.d.ts +16 -0
- package/dist/prompts/sort-grid.js +2 -0
- package/dist/prompts/sort.d.ts +14 -0
- package/dist/prompts/sort.js +2 -0
- package/dist/prompts/spam.d.ts +17 -0
- package/dist/prompts/spam.js +2 -0
- package/dist/prompts/spreadsheet.d.ts +21 -0
- package/dist/prompts/spreadsheet.js +7 -0
- package/dist/prompts/table.d.ts +14 -0
- package/dist/prompts/table.js +3 -0
- package/dist/prompts/text.d.ts +17 -0
- package/dist/prompts/text.js +2 -0
- package/dist/prompts/time.d.ts +12 -0
- package/dist/prompts/time.js +2 -0
- package/dist/prompts/toggle.d.ts +8 -0
- package/dist/prompts/toggle.js +1 -0
- package/dist/prompts/transfer.d.ts +18 -0
- package/dist/prompts/transfer.js +5 -0
- package/dist/prompts/tree-select.d.ts +31 -0
- package/dist/prompts/tree-select.js +3 -0
- package/dist/prompts/tree.d.ts +20 -0
- package/dist/prompts/tree.js +3 -0
- package/dist/prompts/wait.d.ts +18 -0
- package/dist/prompts/wait.js +1 -0
- package/dist/spinner.d.ts +33 -0
- package/dist/spinner.js +3 -0
- package/dist/symbols.d.ts +33 -0
- package/dist/symbols.js +1 -0
- package/dist/tasks.d.ts +57 -0
- package/dist/tasks.js +1 -0
- package/dist/theme.d.ts +2 -0
- package/dist/theme.js +1 -0
- package/dist/types.d.ts +519 -0
- package/dist/types.js +1 -0
- package/dist/utils.d.ts +82 -0
- package/dist/utils.js +1 -0
- package/package.json +10 -10
- package/dist/src/ansi.js +0 -50
- package/dist/src/ansi.js.map +0 -1
- package/dist/src/base.js +0 -258
- package/dist/src/base.js.map +0 -1
- package/dist/src/core.js.map +0 -1
- package/dist/src/data/countries.js +0 -569
- package/dist/src/data/countries.js.map +0 -1
- package/dist/src/data/licenses.js +0 -480
- package/dist/src/data/licenses.js.map +0 -1
- package/dist/src/highlight.js +0 -185
- package/dist/src/highlight.js.map +0 -1
- package/dist/src/index.js +0 -66
- package/dist/src/index.js.map +0 -1
- package/dist/src/input.js +0 -158
- package/dist/src/input.js.map +0 -1
- package/dist/src/pipeline.js +0 -273
- package/dist/src/pipeline.js.map +0 -1
- package/dist/src/prompts/autocomplete.js +0 -171
- package/dist/src/prompts/autocomplete.js.map +0 -1
- package/dist/src/prompts/box.js +0 -225
- package/dist/src/prompts/box.js.map +0 -1
- package/dist/src/prompts/breadcrumb-search.js +0 -260
- package/dist/src/prompts/breadcrumb-search.js.map +0 -1
- package/dist/src/prompts/breadcrumb.js +0 -307
- package/dist/src/prompts/breadcrumb.js.map +0 -1
- package/dist/src/prompts/byte.js +0 -176
- package/dist/src/prompts/byte.js.map +0 -1
- package/dist/src/prompts/calculator.js +0 -243
- package/dist/src/prompts/calculator.js.map +0 -1
- package/dist/src/prompts/calendar.js +0 -430
- package/dist/src/prompts/calendar.js.map +0 -1
- package/dist/src/prompts/checkbox.js +0 -159
- package/dist/src/prompts/checkbox.js.map +0 -1
- package/dist/src/prompts/code.js +0 -271
- package/dist/src/prompts/code.js.map +0 -1
- package/dist/src/prompts/color.js +0 -165
- package/dist/src/prompts/color.js.map +0 -1
- package/dist/src/prompts/confirm.js +0 -55
- package/dist/src/prompts/confirm.js.map +0 -1
- package/dist/src/prompts/connection-string.js +0 -120
- package/dist/src/prompts/connection-string.js.map +0 -1
- package/dist/src/prompts/cron.js +0 -207
- package/dist/src/prompts/cron.js.map +0 -1
- package/dist/src/prompts/curl-utils.js +0 -71
- package/dist/src/prompts/curl-utils.js.map +0 -1
- package/dist/src/prompts/curl.js +0 -431
- package/dist/src/prompts/curl.js.map +0 -1
- package/dist/src/prompts/data-inspector.js +0 -261
- package/dist/src/prompts/data-inspector.js.map +0 -1
- package/dist/src/prompts/date.js +0 -185
- package/dist/src/prompts/date.js.map +0 -1
- package/dist/src/prompts/dependency.js +0 -283
- package/dist/src/prompts/dependency.js.map +0 -1
- package/dist/src/prompts/dial.js +0 -124
- package/dist/src/prompts/dial.js.map +0 -1
- package/dist/src/prompts/diff.js +0 -118
- package/dist/src/prompts/diff.js.map +0 -1
- package/dist/src/prompts/draw.js +0 -191
- package/dist/src/prompts/draw.js.map +0 -1
- package/dist/src/prompts/editor.js +0 -234
- package/dist/src/prompts/editor.js.map +0 -1
- package/dist/src/prompts/emoji.js +0 -226
- package/dist/src/prompts/emoji.js.map +0 -1
- package/dist/src/prompts/exec.js +0 -151
- package/dist/src/prompts/exec.js.map +0 -1
- package/dist/src/prompts/file.js +0 -217
- package/dist/src/prompts/file.js.map +0 -1
- package/dist/src/prompts/form.js +0 -241
- package/dist/src/prompts/form.js.map +0 -1
- package/dist/src/prompts/fuzzy-multi-column.js +0 -161
- package/dist/src/prompts/fuzzy-multi-column.js.map +0 -1
- package/dist/src/prompts/fuzzy.js +0 -147
- package/dist/src/prompts/fuzzy.js.map +0 -1
- package/dist/src/prompts/gauge.js +0 -137
- package/dist/src/prompts/gauge.js.map +0 -1
- package/dist/src/prompts/grid.js +0 -191
- package/dist/src/prompts/grid.js.map +0 -1
- package/dist/src/prompts/heatmap.js +0 -147
- package/dist/src/prompts/heatmap.js.map +0 -1
- package/dist/src/prompts/ip.js +0 -138
- package/dist/src/prompts/ip.js.map +0 -1
- package/dist/src/prompts/kanban.js +0 -233
- package/dist/src/prompts/kanban.js.map +0 -1
- package/dist/src/prompts/keypress.js +0 -54
- package/dist/src/prompts/keypress.js.map +0 -1
- package/dist/src/prompts/license.js +0 -144
- package/dist/src/prompts/license.js.map +0 -1
- package/dist/src/prompts/list.js +0 -124
- package/dist/src/prompts/list.js.map +0 -1
- package/dist/src/prompts/map.js +0 -262
- package/dist/src/prompts/map.js.map +0 -1
- package/dist/src/prompts/match.js +0 -271
- package/dist/src/prompts/match.js.map +0 -1
- package/dist/src/prompts/miller.js +0 -228
- package/dist/src/prompts/miller.js.map +0 -1
- package/dist/src/prompts/multi-column-select.js +0 -176
- package/dist/src/prompts/multi-column-select.js.map +0 -1
- package/dist/src/prompts/multi-range.js +0 -189
- package/dist/src/prompts/multi-range.js.map +0 -1
- package/dist/src/prompts/multi-select.js +0 -183
- package/dist/src/prompts/multi-select.js.map +0 -1
- package/dist/src/prompts/number.js +0 -166
- package/dist/src/prompts/number.js.map +0 -1
- package/dist/src/prompts/otp.js +0 -107
- package/dist/src/prompts/otp.js.map +0 -1
- package/dist/src/prompts/pattern.js +0 -252
- package/dist/src/prompts/pattern.js.map +0 -1
- package/dist/src/prompts/phone.js +0 -398
- package/dist/src/prompts/phone.js.map +0 -1
- package/dist/src/prompts/quiz-select.js +0 -114
- package/dist/src/prompts/quiz-select.js.map +0 -1
- package/dist/src/prompts/quiz-text.js +0 -98
- package/dist/src/prompts/quiz-text.js.map +0 -1
- package/dist/src/prompts/range.js +0 -164
- package/dist/src/prompts/range.js.map +0 -1
- package/dist/src/prompts/rating.js +0 -83
- package/dist/src/prompts/rating.js.map +0 -1
- package/dist/src/prompts/regex.js +0 -145
- package/dist/src/prompts/regex.js.map +0 -1
- package/dist/src/prompts/region.js +0 -170
- package/dist/src/prompts/region.js.map +0 -1
- package/dist/src/prompts/schedule.js +0 -270
- package/dist/src/prompts/schedule.js.map +0 -1
- package/dist/src/prompts/scroll.js +0 -155
- package/dist/src/prompts/scroll.js.map +0 -1
- package/dist/src/prompts/seat.js +0 -164
- package/dist/src/prompts/seat.js.map +0 -1
- package/dist/src/prompts/select-range.js +0 -148
- package/dist/src/prompts/select-range.js.map +0 -1
- package/dist/src/prompts/select.js +0 -163
- package/dist/src/prompts/select.js.map +0 -1
- package/dist/src/prompts/semver.js +0 -43
- package/dist/src/prompts/semver.js.map +0 -1
- package/dist/src/prompts/shortcut.js +0 -133
- package/dist/src/prompts/shortcut.js.map +0 -1
- package/dist/src/prompts/slider.js +0 -69
- package/dist/src/prompts/slider.js.map +0 -1
- package/dist/src/prompts/slot.js +0 -117
- package/dist/src/prompts/slot.js.map +0 -1
- package/dist/src/prompts/snippet.js +0 -228
- package/dist/src/prompts/snippet.js.map +0 -1
- package/dist/src/prompts/sort-grid.js +0 -151
- package/dist/src/prompts/sort-grid.js.map +0 -1
- package/dist/src/prompts/sort.js +0 -166
- package/dist/src/prompts/sort.js.map +0 -1
- package/dist/src/prompts/spam.js +0 -80
- package/dist/src/prompts/spam.js.map +0 -1
- package/dist/src/prompts/spreadsheet.js +0 -240
- package/dist/src/prompts/spreadsheet.js.map +0 -1
- package/dist/src/prompts/table.js +0 -120
- package/dist/src/prompts/table.js.map +0 -1
- package/dist/src/prompts/text.js +0 -317
- package/dist/src/prompts/text.js.map +0 -1
- package/dist/src/prompts/time.js +0 -211
- package/dist/src/prompts/time.js.map +0 -1
- package/dist/src/prompts/toggle.js +0 -53
- package/dist/src/prompts/toggle.js.map +0 -1
- package/dist/src/prompts/transfer.js +0 -207
- package/dist/src/prompts/transfer.js.map +0 -1
- package/dist/src/prompts/tree-select.js +0 -270
- package/dist/src/prompts/tree-select.js.map +0 -1
- package/dist/src/prompts/tree.js +0 -233
- package/dist/src/prompts/tree.js.map +0 -1
- package/dist/src/prompts/wait.js +0 -79
- package/dist/src/prompts/wait.js.map +0 -1
- package/dist/src/spinner.js +0 -105
- package/dist/src/spinner.js.map +0 -1
- package/dist/src/symbols.js +0 -66
- package/dist/src/symbols.js.map +0 -1
- package/dist/src/tasks.js +0 -231
- package/dist/src/tasks.js.map +0 -1
- package/dist/src/theme.js +0 -29
- package/dist/src/theme.js.map +0 -1
- package/dist/src/types.js +0 -8
- package/dist/src/types.js.map +0 -1
- package/dist/src/utils.js +0 -480
- package/dist/src/utils.js.map +0 -1
|
@@ -1,430 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "CalendarPrompt", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return CalendarPrompt;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _ansi = require("../ansi");
|
|
12
|
-
const _base = require("../base");
|
|
13
|
-
const _theme = require("../theme");
|
|
14
|
-
function _define_property(obj, key, value) {
|
|
15
|
-
if (key in obj) {
|
|
16
|
-
Object.defineProperty(obj, key, {
|
|
17
|
-
value: value,
|
|
18
|
-
enumerable: true,
|
|
19
|
-
configurable: true,
|
|
20
|
-
writable: true
|
|
21
|
-
});
|
|
22
|
-
} else {
|
|
23
|
-
obj[key] = value;
|
|
24
|
-
}
|
|
25
|
-
return obj;
|
|
26
|
-
}
|
|
27
|
-
let CalendarPrompt = class CalendarPrompt extends _base.Prompt {
|
|
28
|
-
getDaysInMonth(year, month) {
|
|
29
|
-
return new Date(year, month + 1, 0).getDate();
|
|
30
|
-
}
|
|
31
|
-
generateMonthGrid(year, month) {
|
|
32
|
-
const days = [];
|
|
33
|
-
const firstDayOfMonth = new Date(year, month, 1);
|
|
34
|
-
const startDayOfWeek = firstDayOfMonth.getDay(); // 0 (Sun) to 6 (Sat)
|
|
35
|
-
const weekStart = this.options.weekStart || 0;
|
|
36
|
-
// Calculate days from previous month to fill the first row
|
|
37
|
-
const daysFromPrevMonth = (startDayOfWeek - weekStart + 7) % 7;
|
|
38
|
-
const prevMonthDate = new Date(year, month, 0); // Last day of prev month
|
|
39
|
-
const prevMonthDaysCount = prevMonthDate.getDate();
|
|
40
|
-
// Add previous month days
|
|
41
|
-
for(let i = daysFromPrevMonth - 1; i >= 0; i--){
|
|
42
|
-
days.push({
|
|
43
|
-
date: new Date(year, month - 1, prevMonthDaysCount - i),
|
|
44
|
-
inMonth: false
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
// Add current month days
|
|
48
|
-
const daysInMonth = this.getDaysInMonth(year, month);
|
|
49
|
-
for(let i = 1; i <= daysInMonth; i++){
|
|
50
|
-
days.push({
|
|
51
|
-
date: new Date(year, month, i),
|
|
52
|
-
inMonth: true
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
// Add next month days to fill 42 cells (6 rows * 7 cols)
|
|
56
|
-
let nextMonthDay = 1;
|
|
57
|
-
while(days.length < 42){
|
|
58
|
-
days.push({
|
|
59
|
-
date: new Date(year, month + 1, nextMonthDay++),
|
|
60
|
-
inMonth: false
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
return days;
|
|
64
|
-
}
|
|
65
|
-
isSameDay(d1, d2) {
|
|
66
|
-
return d1.getFullYear() === d2.getFullYear() && d1.getMonth() === d2.getMonth() && d1.getDate() === d2.getDate();
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Check if a date is part of any committed selection
|
|
70
|
-
*/ isSelected(d) {
|
|
71
|
-
const dTime = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();
|
|
72
|
-
return this.selections.some((sel)=>{
|
|
73
|
-
if (Array.isArray(sel)) {
|
|
74
|
-
// Range logic
|
|
75
|
-
const [start, end] = sel;
|
|
76
|
-
const sTime = new Date(start.getFullYear(), start.getMonth(), start.getDate()).getTime();
|
|
77
|
-
const eTime = new Date(end.getFullYear(), end.getMonth(), end.getDate()).getTime();
|
|
78
|
-
return dTime >= Math.min(sTime, eTime) && dTime <= Math.max(sTime, eTime);
|
|
79
|
-
} else {
|
|
80
|
-
// Single date logic
|
|
81
|
-
const sTime = new Date(sel.getFullYear(), sel.getMonth(), sel.getDate()).getTime();
|
|
82
|
-
return dTime === sTime;
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Visual feedback for the range currently being defined (before Enter is pressed the 2nd time)
|
|
88
|
-
*/ isInTempRange(d) {
|
|
89
|
-
if (!this.tempRangeStart) return false;
|
|
90
|
-
const dTime = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();
|
|
91
|
-
const sTime = new Date(this.tempRangeStart.getFullYear(), this.tempRangeStart.getMonth(), this.tempRangeStart.getDate()).getTime();
|
|
92
|
-
const cTime = new Date(this.cursor.getFullYear(), this.cursor.getMonth(), this.cursor.getDate()).getTime();
|
|
93
|
-
return dTime >= Math.min(sTime, cTime) && dTime <= Math.max(sTime, cTime);
|
|
94
|
-
}
|
|
95
|
-
render(_firstRender) {
|
|
96
|
-
const monthNames = [
|
|
97
|
-
"January",
|
|
98
|
-
"February",
|
|
99
|
-
"March",
|
|
100
|
-
"April",
|
|
101
|
-
"May",
|
|
102
|
-
"June",
|
|
103
|
-
"July",
|
|
104
|
-
"August",
|
|
105
|
-
"September",
|
|
106
|
-
"October",
|
|
107
|
-
"November",
|
|
108
|
-
"December"
|
|
109
|
-
];
|
|
110
|
-
const year = this.viewDate.getFullYear();
|
|
111
|
-
const month = this.viewDate.getMonth();
|
|
112
|
-
const header = `${_ansi.ANSI.BOLD}${monthNames[month]} ${year}${_ansi.ANSI.RESET}`;
|
|
113
|
-
const weekDays = this.options.weekStart === 1 ? [
|
|
114
|
-
"Mo",
|
|
115
|
-
"Tu",
|
|
116
|
-
"We",
|
|
117
|
-
"Th",
|
|
118
|
-
"Fr",
|
|
119
|
-
"Sa",
|
|
120
|
-
"Su"
|
|
121
|
-
] : [
|
|
122
|
-
"Su",
|
|
123
|
-
"Mo",
|
|
124
|
-
"Tu",
|
|
125
|
-
"We",
|
|
126
|
-
"Th",
|
|
127
|
-
"Fr",
|
|
128
|
-
"Sa"
|
|
129
|
-
];
|
|
130
|
-
const grid = this.generateMonthGrid(year, month);
|
|
131
|
-
let output = `${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET}\n`;
|
|
132
|
-
output += `${_theme.theme.muted}< ${header} >${_ansi.ANSI.RESET}\n`;
|
|
133
|
-
output += weekDays.map((d)=>`${_theme.theme.muted}${d}${_ansi.ANSI.RESET}`).join(' ') + '\n';
|
|
134
|
-
let rowLine = '';
|
|
135
|
-
for(let i = 0; i < grid.length; i++){
|
|
136
|
-
const cell = grid[i];
|
|
137
|
-
const dateStr = cell.date.getDate().toString().padStart(2, ' ');
|
|
138
|
-
let style = '';
|
|
139
|
-
const isCursor = this.isSameDay(cell.date, this.cursor);
|
|
140
|
-
const isSel = this.isSelected(cell.date);
|
|
141
|
-
const isTemp = this.isInTempRange(cell.date);
|
|
142
|
-
const isToday = this.isSameDay(cell.date, new Date());
|
|
143
|
-
if (!cell.inMonth) {
|
|
144
|
-
style = _theme.theme.muted;
|
|
145
|
-
}
|
|
146
|
-
// Priority: Cursor > Temp/Selected > Today
|
|
147
|
-
if (isSel || isTemp) {
|
|
148
|
-
style = _theme.theme.main;
|
|
149
|
-
}
|
|
150
|
-
if (isToday && !isSel && !isTemp) {
|
|
151
|
-
style += _ansi.ANSI.UNDERLINE;
|
|
152
|
-
}
|
|
153
|
-
if (isCursor) {
|
|
154
|
-
style += _ansi.ANSI.REVERSE; // Invert colors for cursor
|
|
155
|
-
}
|
|
156
|
-
rowLine += `${style}${dateStr}${_ansi.ANSI.RESET}`;
|
|
157
|
-
if ((i + 1) % 7 === 0) {
|
|
158
|
-
output += rowLine + '\n';
|
|
159
|
-
rowLine = '';
|
|
160
|
-
} else {
|
|
161
|
-
rowLine += ' ';
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
// Helper text logic
|
|
165
|
-
let help = '';
|
|
166
|
-
if (this.options.mode === 'range') {
|
|
167
|
-
if (this.options.multiple) {
|
|
168
|
-
help = 'Enter: Range Points | D: Done';
|
|
169
|
-
} else {
|
|
170
|
-
help = 'Enter: Start/End';
|
|
171
|
-
}
|
|
172
|
-
} else {
|
|
173
|
-
if (this.options.multiple) {
|
|
174
|
-
help = 'Space/Enter: Toggle | D: Done';
|
|
175
|
-
} else {
|
|
176
|
-
help = 'Enter: Select';
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
if (this.tempRangeStart) {
|
|
180
|
-
help += ` ${_theme.theme.muted}(Selecting range...)${_ansi.ANSI.RESET}`;
|
|
181
|
-
}
|
|
182
|
-
output += `${_theme.theme.muted}${help}${_ansi.ANSI.RESET}`;
|
|
183
|
-
this.renderFrame(output);
|
|
184
|
-
}
|
|
185
|
-
syncViewDate() {
|
|
186
|
-
if (this.cursor.getMonth() !== this.viewDate.getMonth() || this.cursor.getFullYear() !== this.viewDate.getFullYear()) {
|
|
187
|
-
this.viewDate = new Date(this.cursor);
|
|
188
|
-
this.viewDate.setDate(1);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
// When the user navigates the visible month independently (mouse scroll or
|
|
192
|
-
// '<'/'>'), keep the cursor in the newly viewed month so subsequent
|
|
193
|
-
// cursor movements don't snap the view back to the old month.
|
|
194
|
-
alignCursorToViewDate() {
|
|
195
|
-
const day = this.cursor.getDate();
|
|
196
|
-
const year = this.viewDate.getFullYear();
|
|
197
|
-
const month = this.viewDate.getMonth();
|
|
198
|
-
const daysInTarget = this.getDaysInMonth(year, month);
|
|
199
|
-
const newDay = Math.min(day, daysInTarget);
|
|
200
|
-
this.cursor = new Date(year, month, newDay);
|
|
201
|
-
}
|
|
202
|
-
submitResult() {
|
|
203
|
-
if (this.options.multiple) {
|
|
204
|
-
if (this.options.mode === 'range') {
|
|
205
|
-
// Only RangeSelection[]
|
|
206
|
-
this.submit(this.selections.filter(Array.isArray));
|
|
207
|
-
} else {
|
|
208
|
-
// Only Date[]
|
|
209
|
-
this.submit(this.selections.filter((sel)=>!Array.isArray(sel)));
|
|
210
|
-
}
|
|
211
|
-
} else {
|
|
212
|
-
// Single Mode (Single Date or Single Range)
|
|
213
|
-
this.submit(this.selections[0] || null);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
handleInput(char, _key) {
|
|
217
|
-
const isUp = this.isUp(char);
|
|
218
|
-
const isDown = this.isDown(char);
|
|
219
|
-
const isLeft = this.isLeft(char);
|
|
220
|
-
const isRight = this.isRight(char);
|
|
221
|
-
// Navigation
|
|
222
|
-
if (isUp || isDown || isLeft || isRight) {
|
|
223
|
-
const d = new Date(this.cursor);
|
|
224
|
-
if (isUp) d.setDate(d.getDate() - 7);
|
|
225
|
-
if (isDown) d.setDate(d.getDate() + 7);
|
|
226
|
-
if (isLeft) d.setDate(d.getDate() - 1);
|
|
227
|
-
if (isRight) d.setDate(d.getDate() + 1);
|
|
228
|
-
this.cursor = d;
|
|
229
|
-
this.syncViewDate();
|
|
230
|
-
this.render(false);
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
// PageUp (Month - 1)
|
|
234
|
-
if (char === '\x1b[5~') {
|
|
235
|
-
this.cursor.setMonth(this.cursor.getMonth() - 1);
|
|
236
|
-
this.syncViewDate();
|
|
237
|
-
this.render(false);
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
// PageDown (Month + 1)
|
|
241
|
-
if (char === '\x1b[6~') {
|
|
242
|
-
this.cursor.setMonth(this.cursor.getMonth() + 1);
|
|
243
|
-
this.syncViewDate();
|
|
244
|
-
this.render(false);
|
|
245
|
-
return;
|
|
246
|
-
}
|
|
247
|
-
// Ctrl+Up (Year - 1)
|
|
248
|
-
if (char === '\x1b[1;5A') {
|
|
249
|
-
this.cursor.setFullYear(this.cursor.getFullYear() - 1);
|
|
250
|
-
this.syncViewDate();
|
|
251
|
-
this.render(false);
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
254
|
-
// Ctrl+Down (Year + 1)
|
|
255
|
-
if (char === '\x1b[1;5B') {
|
|
256
|
-
this.cursor.setFullYear(this.cursor.getFullYear() + 1);
|
|
257
|
-
this.syncViewDate();
|
|
258
|
-
this.render(false);
|
|
259
|
-
return;
|
|
260
|
-
}
|
|
261
|
-
// Home (First Day of Month)
|
|
262
|
-
if (char === '\x1b[H' || char === '\x1b[1~') {
|
|
263
|
-
this.cursor.setDate(1);
|
|
264
|
-
this.render(false);
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
// End (Last Day of Month)
|
|
268
|
-
if (char === '\x1b[F' || char === '\x1b[4~') {
|
|
269
|
-
this.cursor.setMonth(this.cursor.getMonth() + 1);
|
|
270
|
-
this.cursor.setDate(0);
|
|
271
|
-
this.render(false);
|
|
272
|
-
return;
|
|
273
|
-
}
|
|
274
|
-
// t (Today)
|
|
275
|
-
if (char === 't') {
|
|
276
|
-
this.cursor = new Date();
|
|
277
|
-
this.syncViewDate();
|
|
278
|
-
this.render(false);
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
// Month Navigation with < and > (shift+, shift+.)
|
|
282
|
-
if (char === '<' || char === ',') {
|
|
283
|
-
this.viewDate.setMonth(this.viewDate.getMonth() - 1);
|
|
284
|
-
this.alignCursorToViewDate();
|
|
285
|
-
this.render(false);
|
|
286
|
-
return;
|
|
287
|
-
}
|
|
288
|
-
if (char === '>' || char === '.') {
|
|
289
|
-
this.viewDate.setMonth(this.viewDate.getMonth() + 1);
|
|
290
|
-
this.alignCursorToViewDate();
|
|
291
|
-
this.render(false);
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
294
|
-
// Done key (only for multiple mode)
|
|
295
|
-
if ((char === 'd' || char === 'D') && this.options.multiple) {
|
|
296
|
-
this.submitResult();
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
|
-
// Selection Trigger
|
|
300
|
-
if (char === '\r' || char === '\n' || char === ' ') {
|
|
301
|
-
if (this.options.mode === 'range') {
|
|
302
|
-
if (!this.tempRangeStart) {
|
|
303
|
-
// Start new range selection
|
|
304
|
-
this.tempRangeStart = this.cursor;
|
|
305
|
-
if (!this.options.multiple) {
|
|
306
|
-
this.selections = [];
|
|
307
|
-
}
|
|
308
|
-
} else {
|
|
309
|
-
// Finish range selection
|
|
310
|
-
const start = this.tempRangeStart;
|
|
311
|
-
const end = this.cursor;
|
|
312
|
-
// Normalize order
|
|
313
|
-
const newRange = start < end ? [
|
|
314
|
-
start,
|
|
315
|
-
end
|
|
316
|
-
] : [
|
|
317
|
-
end,
|
|
318
|
-
start
|
|
319
|
-
];
|
|
320
|
-
if (this.options.multiple) {
|
|
321
|
-
this.selections.push(newRange);
|
|
322
|
-
this.tempRangeStart = null; // Reset for next range
|
|
323
|
-
} else {
|
|
324
|
-
// Single Mode: Finish and Submit
|
|
325
|
-
this.selections = [
|
|
326
|
-
newRange
|
|
327
|
-
];
|
|
328
|
-
this.submitResult();
|
|
329
|
-
return;
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
} else {
|
|
333
|
-
// Single Date Mode
|
|
334
|
-
const date = this.cursor;
|
|
335
|
-
if (this.options.multiple) {
|
|
336
|
-
// Toggle selection
|
|
337
|
-
const idx = this.selections.findIndex((s)=>!Array.isArray(s) && this.isSameDay(s, date));
|
|
338
|
-
if (idx >= 0) {
|
|
339
|
-
this.selections.splice(idx, 1);
|
|
340
|
-
} else {
|
|
341
|
-
this.selections.push(date);
|
|
342
|
-
}
|
|
343
|
-
} else {
|
|
344
|
-
// Single Mode: Finish and Submit
|
|
345
|
-
this.selections = [
|
|
346
|
-
date
|
|
347
|
-
];
|
|
348
|
-
this.submitResult();
|
|
349
|
-
return;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
this.render(false);
|
|
353
|
-
return;
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
handleMouse(event) {
|
|
357
|
-
if (event.action === 'scroll') {
|
|
358
|
-
const direction = event.scroll === 'up' ? -1 : 1;
|
|
359
|
-
if (event.ctrl) {
|
|
360
|
-
// Ctrl+Scroll: Day (Cursor)
|
|
361
|
-
this.cursor.setDate(this.cursor.getDate() + direction);
|
|
362
|
-
this.syncViewDate();
|
|
363
|
-
} else {
|
|
364
|
-
// Normal Scroll: Month
|
|
365
|
-
this.viewDate.setMonth(this.viewDate.getMonth() + direction);
|
|
366
|
-
this.alignCursorToViewDate();
|
|
367
|
-
}
|
|
368
|
-
this.render(false);
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
constructor(options){
|
|
372
|
-
super(options), _define_property(this, "cursor", void 0), _define_property(this, "viewDate", void 0 // The month currently being viewed
|
|
373
|
-
), // Store all selections here. Can be an array of Dates or Ranges.
|
|
374
|
-
_define_property(this, "selections", []), // Internal state for dragging/selecting a range before it is finalized
|
|
375
|
-
_define_property(this, "tempRangeStart", null);
|
|
376
|
-
// Initialize cursor
|
|
377
|
-
this.cursor = new Date();
|
|
378
|
-
this.viewDate = new Date();
|
|
379
|
-
this.viewDate.setDate(1);
|
|
380
|
-
// Normalize initial value into selections array
|
|
381
|
-
if (options.initial) {
|
|
382
|
-
// Handle array inputs (Range or Multiple Dates)
|
|
383
|
-
if (Array.isArray(options.initial)) {
|
|
384
|
-
const init = options.initial;
|
|
385
|
-
if (init.length > 0) {
|
|
386
|
-
// Detect if it is [Date, Date] (Single Range)
|
|
387
|
-
if (options.mode === 'range' && !options.multiple && init.length === 2 && init[0] instanceof Date) {
|
|
388
|
-
this.selections = [
|
|
389
|
-
[
|
|
390
|
-
init[0],
|
|
391
|
-
init[1]
|
|
392
|
-
]
|
|
393
|
-
];
|
|
394
|
-
this.cursor = new Date(init[1]);
|
|
395
|
-
} else if (Array.isArray(init[0])) {
|
|
396
|
-
this.selections = [
|
|
397
|
-
...init
|
|
398
|
-
];
|
|
399
|
-
const lastRange = init[init.length - 1];
|
|
400
|
-
this.cursor = new Date(lastRange[1]);
|
|
401
|
-
} else {
|
|
402
|
-
this.selections = [
|
|
403
|
-
...init
|
|
404
|
-
];
|
|
405
|
-
this.cursor = new Date(init[init.length - 1]);
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
} else {
|
|
409
|
-
// Single Date
|
|
410
|
-
this.selections = [
|
|
411
|
-
options.initial
|
|
412
|
-
];
|
|
413
|
-
this.cursor = new Date(options.initial);
|
|
414
|
-
}
|
|
415
|
-
} else {
|
|
416
|
-
// If no initial value, and NOT range mode, we might optionally start with today selected?
|
|
417
|
-
// For now, let's keep it empty or follow original logic behavior if needed.
|
|
418
|
-
if (this.options.mode !== 'range' && !this.options.multiple) {
|
|
419
|
-
this.selections = [
|
|
420
|
-
new Date()
|
|
421
|
-
];
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
// Sync viewDate to cursor so we see the selected date
|
|
425
|
-
this.viewDate = new Date(this.cursor);
|
|
426
|
-
this.viewDate.setDate(1);
|
|
427
|
-
}
|
|
428
|
-
};
|
|
429
|
-
|
|
430
|
-
//# sourceMappingURL=calendar.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/prompts/calendar.ts"],"sourcesContent":["import { ANSI } from '../ansi';\nimport { Prompt } from '../base';\nimport { theme } from '../theme';\nimport { CalendarOptions, MouseEvent } from '../types';\n\n// Helper types for internal state management\ntype SingleSelection = Date;\ntype RangeSelection = [Date, Date];\ntype CalendarValue = SingleSelection | RangeSelection | SingleSelection[] | RangeSelection[];\n\n// Extend options locally to support 'multiple' without breaking if types.ts isn't updated yet\ninterface ExtendedCalendarOptions extends CalendarOptions {\n multiple?: boolean;\n}\n\nexport class CalendarPrompt extends Prompt<CalendarValue, ExtendedCalendarOptions> {\n private cursor: Date;\n private viewDate: Date; // The month currently being viewed\n\n // Store all selections here. Can be an array of Dates or Ranges.\n private selections: (SingleSelection | RangeSelection)[] = [];\n\n // Internal state for dragging/selecting a range before it is finalized\n private tempRangeStart: Date | null = null;\n\n constructor(options: ExtendedCalendarOptions) {\n super(options);\n\n // Initialize cursor\n this.cursor = new Date();\n this.viewDate = new Date();\n this.viewDate.setDate(1);\n\n // Normalize initial value into selections array\n if (options.initial) {\n // Handle array inputs (Range or Multiple Dates)\n if (Array.isArray(options.initial)) {\n const init = options.initial as any[];\n if (init.length > 0) {\n // Detect if it is [Date, Date] (Single Range)\n if (options.mode === 'range' && !options.multiple && init.length === 2 && init[0] instanceof Date) {\n this.selections = [[init[0], init[1]]];\n this.cursor = new Date(init[1]);\n }\n // Detect [Date, Date][] (Multiple Ranges)\n else if (Array.isArray(init[0])) {\n this.selections = [...init];\n const lastRange = init[init.length - 1];\n this.cursor = new Date(lastRange[1]);\n }\n // Detect Date[] (Multiple Singles)\n else {\n this.selections = [...init];\n this.cursor = new Date(init[init.length - 1]);\n }\n }\n } else {\n // Single Date\n this.selections = [options.initial as Date];\n this.cursor = new Date(options.initial as Date);\n }\n } else {\n // If no initial value, and NOT range mode, we might optionally start with today selected?\n // For now, let's keep it empty or follow original logic behavior if needed.\n if (this.options.mode !== 'range' && !this.options.multiple) {\n this.selections = [new Date()];\n }\n }\n\n // Sync viewDate to cursor so we see the selected date\n this.viewDate = new Date(this.cursor);\n this.viewDate.setDate(1);\n }\n\n private getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n }\n\n private generateMonthGrid(year: number, month: number): { date: Date, inMonth: boolean }[] {\n const days: { date: Date, inMonth: boolean }[] = [];\n\n const firstDayOfMonth = new Date(year, month, 1);\n const startDayOfWeek = firstDayOfMonth.getDay(); // 0 (Sun) to 6 (Sat)\n\n const weekStart = this.options.weekStart || 0;\n\n // Calculate days from previous month to fill the first row\n const daysFromPrevMonth = (startDayOfWeek - weekStart + 7) % 7;\n\n const prevMonthDate = new Date(year, month, 0); // Last day of prev month\n const prevMonthDaysCount = prevMonthDate.getDate();\n\n // Add previous month days\n for (let i = daysFromPrevMonth - 1; i >= 0; i--) {\n days.push({\n date: new Date(year, month - 1, prevMonthDaysCount - i),\n inMonth: false\n });\n }\n\n // Add current month days\n const daysInMonth = this.getDaysInMonth(year, month);\n for (let i = 1; i <= daysInMonth; i++) {\n days.push({\n date: new Date(year, month, i),\n inMonth: true\n });\n }\n\n // Add next month days to fill 42 cells (6 rows * 7 cols)\n let nextMonthDay = 1;\n while (days.length < 42) {\n days.push({\n date: new Date(year, month + 1, nextMonthDay++),\n inMonth: false\n });\n }\n\n return days;\n }\n\n private isSameDay(d1: Date, d2: Date): boolean {\n return d1.getFullYear() === d2.getFullYear() &&\n d1.getMonth() === d2.getMonth() &&\n d1.getDate() === d2.getDate();\n }\n\n /**\n * Check if a date is part of any committed selection\n */\n private isSelected(d: Date): boolean {\n const dTime = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n\n return this.selections.some(sel => {\n if (Array.isArray(sel)) {\n // Range logic\n const [start, end] = sel;\n const sTime = new Date(start.getFullYear(), start.getMonth(), start.getDate()).getTime();\n const eTime = new Date(end.getFullYear(), end.getMonth(), end.getDate()).getTime();\n return dTime >= Math.min(sTime, eTime) && dTime <= Math.max(sTime, eTime);\n } else {\n // Single date logic\n const sTime = new Date(sel.getFullYear(), sel.getMonth(), sel.getDate()).getTime();\n return dTime === sTime;\n }\n });\n }\n\n /**\n * Visual feedback for the range currently being defined (before Enter is pressed the 2nd time)\n */\n private isInTempRange(d: Date): boolean {\n if (!this.tempRangeStart) return false;\n\n const dTime = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n const sTime = new Date(this.tempRangeStart.getFullYear(), this.tempRangeStart.getMonth(), this.tempRangeStart.getDate()).getTime();\n const cTime = new Date(this.cursor.getFullYear(), this.cursor.getMonth(), this.cursor.getDate()).getTime();\n\n return dTime >= Math.min(sTime, cTime) && dTime <= Math.max(sTime, cTime);\n }\n\n protected render(_firstRender: boolean): void {\n const monthNames = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n ];\n\n const year = this.viewDate.getFullYear();\n const month = this.viewDate.getMonth();\n\n const header = `${ANSI.BOLD}${monthNames[month]} ${year}${ANSI.RESET}`;\n\n const weekDays = this.options.weekStart === 1\n ? [\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"]\n : [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"];\n\n const grid = this.generateMonthGrid(year, month);\n\n let output = `${theme.title}${this.options.message}${ANSI.RESET}\\n`;\n output += `${theme.muted}< ${header} >${ANSI.RESET}\\n`;\n output += weekDays.map(d => `${theme.muted}${d}${ANSI.RESET}`).join(' ') + '\\n';\n\n let rowLine = '';\n for (let i = 0; i < grid.length; i++) {\n const cell = grid[i];\n const dateStr = cell.date.getDate().toString().padStart(2, ' ');\n\n let style = '';\n\n const isCursor = this.isSameDay(cell.date, this.cursor);\n const isSel = this.isSelected(cell.date);\n const isTemp = this.isInTempRange(cell.date);\n const isToday = this.isSameDay(cell.date, new Date());\n\n if (!cell.inMonth) {\n style = theme.muted;\n }\n\n // Priority: Cursor > Temp/Selected > Today\n if (isSel || isTemp) {\n style = theme.main;\n }\n\n if (isToday && !isSel && !isTemp) {\n style += ANSI.UNDERLINE;\n }\n\n if (isCursor) {\n style += ANSI.REVERSE; // Invert colors for cursor\n }\n\n rowLine += `${style}${dateStr}${ANSI.RESET}`;\n\n if ((i + 1) % 7 === 0) {\n output += rowLine + '\\n';\n rowLine = '';\n } else {\n rowLine += ' ';\n }\n }\n\n // Helper text logic\n let help = '';\n if (this.options.mode === 'range') {\n if (this.options.multiple) {\n help = 'Enter: Range Points | D: Done';\n } else {\n help = 'Enter: Start/End';\n }\n } else {\n if (this.options.multiple) {\n help = 'Space/Enter: Toggle | D: Done';\n } else {\n help = 'Enter: Select';\n }\n }\n\n if (this.tempRangeStart) {\n help += ` ${theme.muted}(Selecting range...)${ANSI.RESET}`;\n }\n\n output += `${theme.muted}${help}${ANSI.RESET}`;\n\n this.renderFrame(output);\n }\n\n private syncViewDate() {\n if (this.cursor.getMonth() !== this.viewDate.getMonth() || this.cursor.getFullYear() !== this.viewDate.getFullYear()) {\n this.viewDate = new Date(this.cursor);\n this.viewDate.setDate(1);\n }\n }\n\n // When the user navigates the visible month independently (mouse scroll or\n // '<'/'>'), keep the cursor in the newly viewed month so subsequent\n // cursor movements don't snap the view back to the old month.\n private alignCursorToViewDate() {\n const day = this.cursor.getDate();\n const year = this.viewDate.getFullYear();\n const month = this.viewDate.getMonth();\n const daysInTarget = this.getDaysInMonth(year, month);\n const newDay = Math.min(day, daysInTarget);\n this.cursor = new Date(year, month, newDay);\n }\n\n private submitResult() {\n if (this.options.multiple) {\n if (this.options.mode === 'range') {\n // Only RangeSelection[]\n this.submit(this.selections.filter(Array.isArray) as RangeSelection[]);\n } else {\n // Only Date[]\n this.submit(this.selections.filter(sel => !Array.isArray(sel)) as Date[]);\n }\n } else {\n // Single Mode (Single Date or Single Range)\n this.submit(this.selections[0] || null);\n }\n }\n\n protected handleInput(char: string, _key: any): void {\n const isUp = this.isUp(char);\n const isDown = this.isDown(char);\n const isLeft = this.isLeft(char);\n const isRight = this.isRight(char);\n\n // Navigation\n if (isUp || isDown || isLeft || isRight) {\n const d = new Date(this.cursor);\n if (isUp) d.setDate(d.getDate() - 7);\n if (isDown) d.setDate(d.getDate() + 7);\n if (isLeft) d.setDate(d.getDate() - 1);\n if (isRight) d.setDate(d.getDate() + 1);\n\n this.cursor = d;\n this.syncViewDate();\n this.render(false);\n return;\n }\n\n // PageUp (Month - 1)\n if (char === '\\x1b[5~') {\n this.cursor.setMonth(this.cursor.getMonth() - 1);\n this.syncViewDate();\n this.render(false);\n return;\n }\n // PageDown (Month + 1)\n if (char === '\\x1b[6~') {\n this.cursor.setMonth(this.cursor.getMonth() + 1);\n this.syncViewDate();\n this.render(false);\n return;\n }\n\n // Ctrl+Up (Year - 1)\n if (char === '\\x1b[1;5A') {\n this.cursor.setFullYear(this.cursor.getFullYear() - 1);\n this.syncViewDate();\n this.render(false);\n return;\n }\n // Ctrl+Down (Year + 1)\n if (char === '\\x1b[1;5B') {\n this.cursor.setFullYear(this.cursor.getFullYear() + 1);\n this.syncViewDate();\n this.render(false);\n return;\n }\n\n // Home (First Day of Month)\n if (char === '\\x1b[H' || char === '\\x1b[1~') {\n this.cursor.setDate(1);\n this.render(false);\n return;\n }\n\n // End (Last Day of Month)\n if (char === '\\x1b[F' || char === '\\x1b[4~') {\n this.cursor.setMonth(this.cursor.getMonth() + 1);\n this.cursor.setDate(0);\n this.render(false);\n return;\n }\n\n // t (Today)\n if (char === 't') {\n this.cursor = new Date();\n this.syncViewDate();\n this.render(false);\n return;\n }\n\n // Month Navigation with < and > (shift+, shift+.)\n if (char === '<' || char === ',') {\n this.viewDate.setMonth(this.viewDate.getMonth() - 1);\n this.alignCursorToViewDate();\n this.render(false);\n return;\n }\n if (char === '>' || char === '.') {\n this.viewDate.setMonth(this.viewDate.getMonth() + 1);\n this.alignCursorToViewDate();\n this.render(false);\n return;\n }\n\n // Done key (only for multiple mode)\n if ((char === 'd' || char === 'D') && this.options.multiple) {\n this.submitResult();\n return;\n }\n\n // Selection Trigger\n if (char === '\\r' || char === '\\n' || char === ' ') {\n if (this.options.mode === 'range') {\n if (!this.tempRangeStart) {\n // Start new range selection\n this.tempRangeStart = this.cursor;\n\n if (!this.options.multiple) {\n this.selections = [];\n }\n } else {\n // Finish range selection\n const start = this.tempRangeStart;\n const end = this.cursor;\n\n // Normalize order\n const newRange: RangeSelection = start < end ? [start, end] : [end, start];\n\n if (this.options.multiple) {\n this.selections.push(newRange);\n this.tempRangeStart = null; // Reset for next range\n } else {\n // Single Mode: Finish and Submit\n this.selections = [newRange];\n this.submitResult();\n return;\n }\n }\n } else {\n // Single Date Mode\n const date = this.cursor;\n if (this.options.multiple) {\n // Toggle selection\n const idx = this.selections.findIndex(s => !Array.isArray(s) && this.isSameDay(s, date));\n if (idx >= 0) {\n this.selections.splice(idx, 1);\n } else {\n this.selections.push(date);\n }\n } else {\n // Single Mode: Finish and Submit\n this.selections = [date];\n this.submitResult();\n return;\n }\n }\n this.render(false);\n return;\n }\n }\n\n protected handleMouse(event: MouseEvent): void {\n if (event.action === 'scroll') {\n const direction = event.scroll === 'up' ? -1 : 1;\n\n if (event.ctrl) {\n // Ctrl+Scroll: Day (Cursor)\n this.cursor.setDate(this.cursor.getDate() + direction);\n this.syncViewDate();\n } else {\n // Normal Scroll: Month\n this.viewDate.setMonth(this.viewDate.getMonth() + direction);\n this.alignCursorToViewDate();\n }\n\n this.render(false);\n }\n }\n}"],"names":["CalendarPrompt","Prompt","getDaysInMonth","year","month","Date","getDate","generateMonthGrid","days","firstDayOfMonth","startDayOfWeek","getDay","weekStart","options","daysFromPrevMonth","prevMonthDate","prevMonthDaysCount","i","push","date","inMonth","daysInMonth","nextMonthDay","length","isSameDay","d1","d2","getFullYear","getMonth","isSelected","d","dTime","getTime","selections","some","sel","Array","isArray","start","end","sTime","eTime","Math","min","max","isInTempRange","tempRangeStart","cTime","cursor","render","_firstRender","monthNames","viewDate","header","ANSI","BOLD","RESET","weekDays","grid","output","theme","title","message","muted","map","join","rowLine","cell","dateStr","toString","padStart","style","isCursor","isSel","isTemp","isToday","main","UNDERLINE","REVERSE","help","mode","multiple","renderFrame","syncViewDate","setDate","alignCursorToViewDate","day","daysInTarget","newDay","submitResult","submit","filter","handleInput","char","_key","isUp","isDown","isLeft","isRight","setMonth","setFullYear","newRange","idx","findIndex","s","splice","handleMouse","event","action","direction","scroll","ctrl","initial","init","lastRange"],"mappings":";;;;+BAeaA;;;eAAAA;;;sBAfQ;sBACE;uBACD;;;;;;;;;;;;;;AAaf,IAAA,AAAMA,iBAAN,MAAMA,uBAAuBC,YAAM;IA2D9BC,eAAeC,IAAY,EAAEC,KAAa,EAAU;QACxD,OAAO,IAAIC,KAAKF,MAAMC,QAAQ,GAAG,GAAGE,OAAO;IAC/C;IAEQC,kBAAkBJ,IAAY,EAAEC,KAAa,EAAsC;QACvF,MAAMI,OAA2C,EAAE;QAEnD,MAAMC,kBAAkB,IAAIJ,KAAKF,MAAMC,OAAO;QAC9C,MAAMM,iBAAiBD,gBAAgBE,MAAM,IAAI,qBAAqB;QAEtE,MAAMC,YAAY,IAAI,CAACC,OAAO,CAACD,SAAS,IAAI;QAE5C,2DAA2D;QAC3D,MAAME,oBAAoB,AAACJ,CAAAA,iBAAiBE,YAAY,CAAA,IAAK;QAE7D,MAAMG,gBAAgB,IAAIV,KAAKF,MAAMC,OAAO,IAAI,yBAAyB;QACzE,MAAMY,qBAAqBD,cAAcT,OAAO;QAEhD,0BAA0B;QAC1B,IAAK,IAAIW,IAAIH,oBAAoB,GAAGG,KAAK,GAAGA,IAAK;YAC7CT,KAAKU,IAAI,CAAC;gBACNC,MAAM,IAAId,KAAKF,MAAMC,QAAQ,GAAGY,qBAAqBC;gBACrDG,SAAS;YACb;QACJ;QAEA,yBAAyB;QACzB,MAAMC,cAAc,IAAI,CAACnB,cAAc,CAACC,MAAMC;QAC9C,IAAK,IAAIa,IAAI,GAAGA,KAAKI,aAAaJ,IAAK;YACnCT,KAAKU,IAAI,CAAC;gBACNC,MAAM,IAAId,KAAKF,MAAMC,OAAOa;gBAC5BG,SAAS;YACb;QACJ;QAEA,yDAAyD;QACzD,IAAIE,eAAe;QACnB,MAAOd,KAAKe,MAAM,GAAG,GAAI;YACrBf,KAAKU,IAAI,CAAC;gBACNC,MAAM,IAAId,KAAKF,MAAMC,QAAQ,GAAGkB;gBAChCF,SAAS;YACb;QACJ;QAEA,OAAOZ;IACX;IAEQgB,UAAUC,EAAQ,EAAEC,EAAQ,EAAW;QAC3C,OAAOD,GAAGE,WAAW,OAAOD,GAAGC,WAAW,MACtCF,GAAGG,QAAQ,OAAOF,GAAGE,QAAQ,MAC7BH,GAAGnB,OAAO,OAAOoB,GAAGpB,OAAO;IACnC;IAEA;;KAEC,GACD,AAAQuB,WAAWC,CAAO,EAAW;QACjC,MAAMC,QAAQ,IAAI1B,KAAKyB,EAAEH,WAAW,IAAIG,EAAEF,QAAQ,IAAIE,EAAExB,OAAO,IAAI0B,OAAO;QAE1E,OAAO,IAAI,CAACC,UAAU,CAACC,IAAI,CAACC,CAAAA;YACxB,IAAIC,MAAMC,OAAO,CAACF,MAAM;gBACpB,cAAc;gBACd,MAAM,CAACG,OAAOC,IAAI,GAAGJ;gBACrB,MAAMK,QAAQ,IAAInC,KAAKiC,MAAMX,WAAW,IAAIW,MAAMV,QAAQ,IAAIU,MAAMhC,OAAO,IAAI0B,OAAO;gBACtF,MAAMS,QAAQ,IAAIpC,KAAKkC,IAAIZ,WAAW,IAAIY,IAAIX,QAAQ,IAAIW,IAAIjC,OAAO,IAAI0B,OAAO;gBAChF,OAAOD,SAASW,KAAKC,GAAG,CAACH,OAAOC,UAAUV,SAASW,KAAKE,GAAG,CAACJ,OAAOC;YACvE,OAAO;gBACH,oBAAoB;gBACpB,MAAMD,QAAQ,IAAInC,KAAK8B,IAAIR,WAAW,IAAIQ,IAAIP,QAAQ,IAAIO,IAAI7B,OAAO,IAAI0B,OAAO;gBAChF,OAAOD,UAAUS;YACrB;QACJ;IACJ;IAEA;;KAEC,GACD,AAAQK,cAAcf,CAAO,EAAW;QACpC,IAAI,CAAC,IAAI,CAACgB,cAAc,EAAE,OAAO;QAEjC,MAAMf,QAAQ,IAAI1B,KAAKyB,EAAEH,WAAW,IAAIG,EAAEF,QAAQ,IAAIE,EAAExB,OAAO,IAAI0B,OAAO;QAC1E,MAAMQ,QAAQ,IAAInC,KAAK,IAAI,CAACyC,cAAc,CAACnB,WAAW,IAAI,IAAI,CAACmB,cAAc,CAAClB,QAAQ,IAAI,IAAI,CAACkB,cAAc,CAACxC,OAAO,IAAI0B,OAAO;QAChI,MAAMe,QAAQ,IAAI1C,KAAK,IAAI,CAAC2C,MAAM,CAACrB,WAAW,IAAI,IAAI,CAACqB,MAAM,CAACpB,QAAQ,IAAI,IAAI,CAACoB,MAAM,CAAC1C,OAAO,IAAI0B,OAAO;QAExG,OAAOD,SAASW,KAAKC,GAAG,CAACH,OAAOO,UAAUhB,SAASW,KAAKE,GAAG,CAACJ,OAAOO;IACvE;IAEUE,OAAOC,YAAqB,EAAQ;QAC1C,MAAMC,aAAa;YAAC;YAAW;YAAY;YAAS;YAAS;YAAO;YAChE;YAAQ;YAAU;YAAa;YAAW;YAAY;SACzD;QAED,MAAMhD,OAAO,IAAI,CAACiD,QAAQ,CAACzB,WAAW;QACtC,MAAMvB,QAAQ,IAAI,CAACgD,QAAQ,CAACxB,QAAQ;QAEpC,MAAMyB,SAAS,GAAGC,UAAI,CAACC,IAAI,GAAGJ,UAAU,CAAC/C,MAAM,CAAC,CAAC,EAAED,OAAOmD,UAAI,CAACE,KAAK,EAAE;QAEtE,MAAMC,WAAW,IAAI,CAAC5C,OAAO,CAACD,SAAS,KAAK,IACtC;YAAC;YAAM;YAAM;YAAM;YAAM;YAAM;YAAM;SAAK,GAC1C;YAAC;YAAM;YAAM;YAAM;YAAM;YAAM;YAAM;SAAK;QAEhD,MAAM8C,OAAO,IAAI,CAACnD,iBAAiB,CAACJ,MAAMC;QAE1C,IAAIuD,SAAS,GAAGC,YAAK,CAACC,KAAK,GAAG,IAAI,CAAChD,OAAO,CAACiD,OAAO,GAAGR,UAAI,CAACE,KAAK,CAAC,EAAE,CAAC;QACnEG,UAAU,GAAGC,YAAK,CAACG,KAAK,CAAC,EAAE,EAAEV,OAAO,EAAE,EAAEC,UAAI,CAACE,KAAK,CAAC,EAAE,CAAC;QACtDG,UAAUF,SAASO,GAAG,CAAClC,CAAAA,IAAK,GAAG8B,YAAK,CAACG,KAAK,GAAGjC,IAAIwB,UAAI,CAACE,KAAK,EAAE,EAAES,IAAI,CAAC,OAAO;QAE3E,IAAIC,UAAU;QACd,IAAK,IAAIjD,IAAI,GAAGA,IAAIyC,KAAKnC,MAAM,EAAEN,IAAK;YAClC,MAAMkD,OAAOT,IAAI,CAACzC,EAAE;YACpB,MAAMmD,UAAUD,KAAKhD,IAAI,CAACb,OAAO,GAAG+D,QAAQ,GAAGC,QAAQ,CAAC,GAAG;YAE3D,IAAIC,QAAQ;YAEZ,MAAMC,WAAW,IAAI,CAAChD,SAAS,CAAC2C,KAAKhD,IAAI,EAAE,IAAI,CAAC6B,MAAM;YACtD,MAAMyB,QAAQ,IAAI,CAAC5C,UAAU,CAACsC,KAAKhD,IAAI;YACvC,MAAMuD,SAAS,IAAI,CAAC7B,aAAa,CAACsB,KAAKhD,IAAI;YAC3C,MAAMwD,UAAU,IAAI,CAACnD,SAAS,CAAC2C,KAAKhD,IAAI,EAAE,IAAId;YAE9C,IAAI,CAAC8D,KAAK/C,OAAO,EAAE;gBACfmD,QAAQX,YAAK,CAACG,KAAK;YACvB;YAEA,2CAA2C;YAC3C,IAAIU,SAASC,QAAQ;gBACjBH,QAAQX,YAAK,CAACgB,IAAI;YACtB;YAEA,IAAID,WAAW,CAACF,SAAS,CAACC,QAAQ;gBAC9BH,SAASjB,UAAI,CAACuB,SAAS;YAC3B;YAEA,IAAIL,UAAU;gBACVD,SAASjB,UAAI,CAACwB,OAAO,EAAE,2BAA2B;YACtD;YAEAZ,WAAW,GAAGK,QAAQH,UAAUd,UAAI,CAACE,KAAK,EAAE;YAE5C,IAAI,AAACvC,CAAAA,IAAI,CAAA,IAAK,MAAM,GAAG;gBACnB0C,UAAUO,UAAU;gBACpBA,UAAU;YACd,OAAO;gBACHA,WAAW;YACf;QACJ;QAEA,oBAAoB;QACpB,IAAIa,OAAO;QACX,IAAI,IAAI,CAAClE,OAAO,CAACmE,IAAI,KAAK,SAAS;YAC/B,IAAI,IAAI,CAACnE,OAAO,CAACoE,QAAQ,EAAE;gBACvBF,OAAO;YACX,OAAO;gBACHA,OAAO;YACX;QACJ,OAAO;YACH,IAAI,IAAI,CAAClE,OAAO,CAACoE,QAAQ,EAAE;gBACvBF,OAAO;YACX,OAAO;gBACHA,OAAO;YACX;QACJ;QAEA,IAAI,IAAI,CAACjC,cAAc,EAAE;YACrBiC,QAAQ,CAAC,CAAC,EAAEnB,YAAK,CAACG,KAAK,CAAC,oBAAoB,EAAET,UAAI,CAACE,KAAK,EAAE;QAC9D;QAEAG,UAAU,GAAGC,YAAK,CAACG,KAAK,GAAGgB,OAAOzB,UAAI,CAACE,KAAK,EAAE;QAE9C,IAAI,CAAC0B,WAAW,CAACvB;IACrB;IAEQwB,eAAe;QACnB,IAAI,IAAI,CAACnC,MAAM,CAACpB,QAAQ,OAAO,IAAI,CAACwB,QAAQ,CAACxB,QAAQ,MAAM,IAAI,CAACoB,MAAM,CAACrB,WAAW,OAAO,IAAI,CAACyB,QAAQ,CAACzB,WAAW,IAAI;YAClH,IAAI,CAACyB,QAAQ,GAAG,IAAI/C,KAAK,IAAI,CAAC2C,MAAM;YACpC,IAAI,CAACI,QAAQ,CAACgC,OAAO,CAAC;QAC1B;IACJ;IAEA,2EAA2E;IAC3E,oEAAoE;IACpE,8DAA8D;IACtDC,wBAAwB;QAC5B,MAAMC,MAAM,IAAI,CAACtC,MAAM,CAAC1C,OAAO;QAC/B,MAAMH,OAAO,IAAI,CAACiD,QAAQ,CAACzB,WAAW;QACtC,MAAMvB,QAAQ,IAAI,CAACgD,QAAQ,CAACxB,QAAQ;QACpC,MAAM2D,eAAe,IAAI,CAACrF,cAAc,CAACC,MAAMC;QAC/C,MAAMoF,SAAS9C,KAAKC,GAAG,CAAC2C,KAAKC;QAC7B,IAAI,CAACvC,MAAM,GAAG,IAAI3C,KAAKF,MAAMC,OAAOoF;IACxC;IAEQC,eAAe;QACnB,IAAI,IAAI,CAAC5E,OAAO,CAACoE,QAAQ,EAAE;YACvB,IAAI,IAAI,CAACpE,OAAO,CAACmE,IAAI,KAAK,SAAS;gBAC/B,wBAAwB;gBACxB,IAAI,CAACU,MAAM,CAAC,IAAI,CAACzD,UAAU,CAAC0D,MAAM,CAACvD,MAAMC,OAAO;YACpD,OAAO;gBACH,cAAc;gBACd,IAAI,CAACqD,MAAM,CAAC,IAAI,CAACzD,UAAU,CAAC0D,MAAM,CAACxD,CAAAA,MAAO,CAACC,MAAMC,OAAO,CAACF;YAC7D;QACJ,OAAO;YACH,4CAA4C;YAC5C,IAAI,CAACuD,MAAM,CAAC,IAAI,CAACzD,UAAU,CAAC,EAAE,IAAI;QACtC;IACJ;IAEU2D,YAAYC,IAAY,EAAEC,IAAS,EAAQ;QACjD,MAAMC,OAAO,IAAI,CAACA,IAAI,CAACF;QACvB,MAAMG,SAAS,IAAI,CAACA,MAAM,CAACH;QAC3B,MAAMI,SAAS,IAAI,CAACA,MAAM,CAACJ;QAC3B,MAAMK,UAAU,IAAI,CAACA,OAAO,CAACL;QAE7B,aAAa;QACb,IAAIE,QAAQC,UAAUC,UAAUC,SAAS;YACrC,MAAMpE,IAAI,IAAIzB,KAAK,IAAI,CAAC2C,MAAM;YAC9B,IAAI+C,MAAMjE,EAAEsD,OAAO,CAACtD,EAAExB,OAAO,KAAK;YAClC,IAAI0F,QAAQlE,EAAEsD,OAAO,CAACtD,EAAExB,OAAO,KAAK;YACpC,IAAI2F,QAAQnE,EAAEsD,OAAO,CAACtD,EAAExB,OAAO,KAAK;YACpC,IAAI4F,SAASpE,EAAEsD,OAAO,CAACtD,EAAExB,OAAO,KAAK;YAErC,IAAI,CAAC0C,MAAM,GAAGlB;YACd,IAAI,CAACqD,YAAY;YACjB,IAAI,CAAClC,MAAM,CAAC;YACZ;QACJ;QAEA,qBAAqB;QACrB,IAAI4C,SAAS,WAAW;YACpB,IAAI,CAAC7C,MAAM,CAACmD,QAAQ,CAAC,IAAI,CAACnD,MAAM,CAACpB,QAAQ,KAAK;YAC9C,IAAI,CAACuD,YAAY;YACjB,IAAI,CAAClC,MAAM,CAAC;YACZ;QACJ;QACA,uBAAuB;QACvB,IAAI4C,SAAS,WAAW;YACpB,IAAI,CAAC7C,MAAM,CAACmD,QAAQ,CAAC,IAAI,CAACnD,MAAM,CAACpB,QAAQ,KAAK;YAC9C,IAAI,CAACuD,YAAY;YACjB,IAAI,CAAClC,MAAM,CAAC;YACZ;QACJ;QAEA,qBAAqB;QACrB,IAAI4C,SAAS,aAAa;YACtB,IAAI,CAAC7C,MAAM,CAACoD,WAAW,CAAC,IAAI,CAACpD,MAAM,CAACrB,WAAW,KAAK;YACpD,IAAI,CAACwD,YAAY;YACjB,IAAI,CAAClC,MAAM,CAAC;YACZ;QACJ;QACA,uBAAuB;QACvB,IAAI4C,SAAS,aAAa;YACtB,IAAI,CAAC7C,MAAM,CAACoD,WAAW,CAAC,IAAI,CAACpD,MAAM,CAACrB,WAAW,KAAK;YACpD,IAAI,CAACwD,YAAY;YACjB,IAAI,CAAClC,MAAM,CAAC;YACZ;QACJ;QAEA,4BAA4B;QAC5B,IAAI4C,SAAS,YAAYA,SAAS,WAAW;YACzC,IAAI,CAAC7C,MAAM,CAACoC,OAAO,CAAC;YACpB,IAAI,CAACnC,MAAM,CAAC;YACZ;QACJ;QAEA,0BAA0B;QAC1B,IAAI4C,SAAS,YAAYA,SAAS,WAAW;YACzC,IAAI,CAAC7C,MAAM,CAACmD,QAAQ,CAAC,IAAI,CAACnD,MAAM,CAACpB,QAAQ,KAAK;YAC9C,IAAI,CAACoB,MAAM,CAACoC,OAAO,CAAC;YACpB,IAAI,CAACnC,MAAM,CAAC;YACZ;QACJ;QAEA,YAAY;QACZ,IAAI4C,SAAS,KAAK;YACd,IAAI,CAAC7C,MAAM,GAAG,IAAI3C;YAClB,IAAI,CAAC8E,YAAY;YACjB,IAAI,CAAClC,MAAM,CAAC;YACZ;QACJ;QAEA,kDAAkD;QAClD,IAAI4C,SAAS,OAAOA,SAAS,KAAK;YAC9B,IAAI,CAACzC,QAAQ,CAAC+C,QAAQ,CAAC,IAAI,CAAC/C,QAAQ,CAACxB,QAAQ,KAAK;YAClD,IAAI,CAACyD,qBAAqB;YAC1B,IAAI,CAACpC,MAAM,CAAC;YACZ;QACJ;QACA,IAAI4C,SAAS,OAAOA,SAAS,KAAK;YAC9B,IAAI,CAACzC,QAAQ,CAAC+C,QAAQ,CAAC,IAAI,CAAC/C,QAAQ,CAACxB,QAAQ,KAAK;YAClD,IAAI,CAACyD,qBAAqB;YAC1B,IAAI,CAACpC,MAAM,CAAC;YACZ;QACJ;QAEA,oCAAoC;QACpC,IAAI,AAAC4C,CAAAA,SAAS,OAAOA,SAAS,GAAE,KAAM,IAAI,CAAChF,OAAO,CAACoE,QAAQ,EAAE;YACzD,IAAI,CAACQ,YAAY;YACjB;QACJ;QAEA,oBAAoB;QACpB,IAAII,SAAS,QAAQA,SAAS,QAAQA,SAAS,KAAK;YAChD,IAAI,IAAI,CAAChF,OAAO,CAACmE,IAAI,KAAK,SAAS;gBAC/B,IAAI,CAAC,IAAI,CAAClC,cAAc,EAAE;oBACtB,4BAA4B;oBAC5B,IAAI,CAACA,cAAc,GAAG,IAAI,CAACE,MAAM;oBAEjC,IAAI,CAAC,IAAI,CAACnC,OAAO,CAACoE,QAAQ,EAAE;wBACxB,IAAI,CAAChD,UAAU,GAAG,EAAE;oBACxB;gBACJ,OAAO;oBACH,yBAAyB;oBACzB,MAAMK,QAAQ,IAAI,CAACQ,cAAc;oBACjC,MAAMP,MAAM,IAAI,CAACS,MAAM;oBAEvB,kBAAkB;oBAClB,MAAMqD,WAA2B/D,QAAQC,MAAM;wBAACD;wBAAOC;qBAAI,GAAG;wBAACA;wBAAKD;qBAAM;oBAE1E,IAAI,IAAI,CAACzB,OAAO,CAACoE,QAAQ,EAAE;wBACvB,IAAI,CAAChD,UAAU,CAACf,IAAI,CAACmF;wBACrB,IAAI,CAACvD,cAAc,GAAG,MAAM,uBAAuB;oBACvD,OAAO;wBACH,iCAAiC;wBACjC,IAAI,CAACb,UAAU,GAAG;4BAACoE;yBAAS;wBAC5B,IAAI,CAACZ,YAAY;wBACjB;oBACJ;gBACJ;YACJ,OAAO;gBACH,mBAAmB;gBACnB,MAAMtE,OAAO,IAAI,CAAC6B,MAAM;gBACxB,IAAI,IAAI,CAACnC,OAAO,CAACoE,QAAQ,EAAE;oBACvB,mBAAmB;oBACnB,MAAMqB,MAAM,IAAI,CAACrE,UAAU,CAACsE,SAAS,CAACC,CAAAA,IAAK,CAACpE,MAAMC,OAAO,CAACmE,MAAM,IAAI,CAAChF,SAAS,CAACgF,GAAGrF;oBAClF,IAAImF,OAAO,GAAG;wBACV,IAAI,CAACrE,UAAU,CAACwE,MAAM,CAACH,KAAK;oBAChC,OAAO;wBACH,IAAI,CAACrE,UAAU,CAACf,IAAI,CAACC;oBACzB;gBACJ,OAAO;oBACH,iCAAiC;oBACjC,IAAI,CAACc,UAAU,GAAG;wBAACd;qBAAK;oBACxB,IAAI,CAACsE,YAAY;oBACjB;gBACJ;YACJ;YACA,IAAI,CAACxC,MAAM,CAAC;YACZ;QACJ;IACJ;IAEUyD,YAAYC,KAAiB,EAAQ;QAC3C,IAAIA,MAAMC,MAAM,KAAK,UAAU;YAC3B,MAAMC,YAAYF,MAAMG,MAAM,KAAK,OAAO,CAAC,IAAI;YAE/C,IAAIH,MAAMI,IAAI,EAAE;gBACZ,4BAA4B;gBAC5B,IAAI,CAAC/D,MAAM,CAACoC,OAAO,CAAC,IAAI,CAACpC,MAAM,CAAC1C,OAAO,KAAKuG;gBAC5C,IAAI,CAAC1B,YAAY;YACrB,OAAO;gBACH,uBAAuB;gBACvB,IAAI,CAAC/B,QAAQ,CAAC+C,QAAQ,CAAC,IAAI,CAAC/C,QAAQ,CAACxB,QAAQ,KAAKiF;gBAClD,IAAI,CAACxB,qBAAqB;YAC9B;YAEA,IAAI,CAACpC,MAAM,CAAC;QAChB;IACJ;IA9ZA,YAAYpC,OAAgC,CAAE;QAC1C,KAAK,CAACA,UAVV,uBAAQmC,UAAR,KAAA,IACA,uBAAQI,YAAR,KAAA,EAAwB,mCAAmC;WAE3D,iEAAiE;QACjE,uBAAQnB,cAAmD,EAAE,GAE7D,uEAAuE;QACvE,uBAAQa,kBAA8B;QAKlC,oBAAoB;QACpB,IAAI,CAACE,MAAM,GAAG,IAAI3C;QAClB,IAAI,CAAC+C,QAAQ,GAAG,IAAI/C;QACpB,IAAI,CAAC+C,QAAQ,CAACgC,OAAO,CAAC;QAEtB,gDAAgD;QAChD,IAAIvE,QAAQmG,OAAO,EAAE;YACjB,gDAAgD;YAChD,IAAI5E,MAAMC,OAAO,CAACxB,QAAQmG,OAAO,GAAG;gBAChC,MAAMC,OAAOpG,QAAQmG,OAAO;gBAC5B,IAAIC,KAAK1F,MAAM,GAAG,GAAG;oBACjB,8CAA8C;oBAC9C,IAAIV,QAAQmE,IAAI,KAAK,WAAW,CAACnE,QAAQoE,QAAQ,IAAIgC,KAAK1F,MAAM,KAAK,KAAK0F,IAAI,CAAC,EAAE,YAAY5G,MAAM;wBAC/F,IAAI,CAAC4B,UAAU,GAAG;4BAAC;gCAACgF,IAAI,CAAC,EAAE;gCAAEA,IAAI,CAAC,EAAE;6BAAC;yBAAC;wBACtC,IAAI,CAACjE,MAAM,GAAG,IAAI3C,KAAK4G,IAAI,CAAC,EAAE;oBAClC,OAEK,IAAI7E,MAAMC,OAAO,CAAC4E,IAAI,CAAC,EAAE,GAAG;wBAC7B,IAAI,CAAChF,UAAU,GAAG;+BAAIgF;yBAAK;wBAC3B,MAAMC,YAAYD,IAAI,CAACA,KAAK1F,MAAM,GAAG,EAAE;wBACvC,IAAI,CAACyB,MAAM,GAAG,IAAI3C,KAAK6G,SAAS,CAAC,EAAE;oBACvC,OAEK;wBACD,IAAI,CAACjF,UAAU,GAAG;+BAAIgF;yBAAK;wBAC3B,IAAI,CAACjE,MAAM,GAAG,IAAI3C,KAAK4G,IAAI,CAACA,KAAK1F,MAAM,GAAG,EAAE;oBAChD;gBACJ;YACJ,OAAO;gBACH,cAAc;gBACd,IAAI,CAACU,UAAU,GAAG;oBAACpB,QAAQmG,OAAO;iBAAS;gBAC3C,IAAI,CAAChE,MAAM,GAAG,IAAI3C,KAAKQ,QAAQmG,OAAO;YAC1C;QACJ,OAAO;YACH,0FAA0F;YAC1F,4EAA4E;YAC5E,IAAI,IAAI,CAACnG,OAAO,CAACmE,IAAI,KAAK,WAAW,CAAC,IAAI,CAACnE,OAAO,CAACoE,QAAQ,EAAE;gBACzD,IAAI,CAAChD,UAAU,GAAG;oBAAC,IAAI5B;iBAAO;YAClC;QACJ;QAEA,sDAAsD;QACtD,IAAI,CAAC+C,QAAQ,GAAG,IAAI/C,KAAK,IAAI,CAAC2C,MAAM;QACpC,IAAI,CAACI,QAAQ,CAACgC,OAAO,CAAC;IAC1B;AAgXJ"}
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "CheckboxPrompt", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return CheckboxPrompt;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _ansi = require("../ansi");
|
|
12
|
-
const _base = require("../base");
|
|
13
|
-
const _theme = require("../theme");
|
|
14
|
-
const _symbols = require("../symbols");
|
|
15
|
-
function _define_property(obj, key, value) {
|
|
16
|
-
if (key in obj) {
|
|
17
|
-
Object.defineProperty(obj, key, {
|
|
18
|
-
value: value,
|
|
19
|
-
enumerable: true,
|
|
20
|
-
configurable: true,
|
|
21
|
-
writable: true
|
|
22
|
-
});
|
|
23
|
-
} else {
|
|
24
|
-
obj[key] = value;
|
|
25
|
-
}
|
|
26
|
-
return obj;
|
|
27
|
-
}
|
|
28
|
-
let CheckboxPrompt = class CheckboxPrompt extends _base.Prompt {
|
|
29
|
-
render(_firstRender) {
|
|
30
|
-
// Adjust Scroll Top
|
|
31
|
-
if (this.selectedIndex < this.scrollTop) {
|
|
32
|
-
this.scrollTop = this.selectedIndex;
|
|
33
|
-
} else if (this.selectedIndex >= this.scrollTop + this.pageSize) {
|
|
34
|
-
this.scrollTop = this.selectedIndex - this.pageSize + 1;
|
|
35
|
-
}
|
|
36
|
-
// Ensure we don't scroll past bounds if list is small
|
|
37
|
-
if (this.options.choices.length <= this.pageSize) {
|
|
38
|
-
this.scrollTop = 0;
|
|
39
|
-
}
|
|
40
|
-
let output = '';
|
|
41
|
-
// Header
|
|
42
|
-
const icon = this.errorMsg ? `${_theme.theme.error}${_symbols.symbols.cross}` : `${_theme.theme.success}?`;
|
|
43
|
-
output += `${icon} ${_ansi.ANSI.BOLD}${_theme.theme.title}${this.options.message}${_ansi.ANSI.RESET} ${_theme.theme.muted}(Space: toggle, a: all, x: none, Enter: submit)${_ansi.ANSI.RESET}`;
|
|
44
|
-
// List
|
|
45
|
-
const choices = this.options.choices;
|
|
46
|
-
const visibleChoices = choices.slice(this.scrollTop, this.scrollTop + this.pageSize);
|
|
47
|
-
visibleChoices.forEach((choice, index)=>{
|
|
48
|
-
const actualIndex = this.scrollTop + index;
|
|
49
|
-
output += '\n'; // New line for each item
|
|
50
|
-
const cursor = actualIndex === this.selectedIndex ? `${_theme.theme.main}${_symbols.symbols.pointer}${_ansi.ANSI.RESET}` : ' ';
|
|
51
|
-
const isChecked = this.checkedState[actualIndex];
|
|
52
|
-
const checkbox = isChecked ? `${_theme.theme.success}${_symbols.symbols.checked}${_ansi.ANSI.RESET}` : `${_theme.theme.muted}${_symbols.symbols.unchecked}${_ansi.ANSI.RESET}`;
|
|
53
|
-
const title = actualIndex === this.selectedIndex ? `${_theme.theme.main}${choice.title}${_ansi.ANSI.RESET}` : choice.title;
|
|
54
|
-
output += `${cursor} ${checkbox} ${title}`;
|
|
55
|
-
});
|
|
56
|
-
// Indication of more items
|
|
57
|
-
if (choices.length > this.pageSize) {
|
|
58
|
-
// const progress = ` ${this.scrollTop + 1}-${Math.min(this.scrollTop + this.pageSize, choices.length)} of ${choices.length}`;
|
|
59
|
-
}
|
|
60
|
-
if (this.errorMsg) {
|
|
61
|
-
output += `\n${_theme.theme.error}>> ${this.errorMsg}${_ansi.ANSI.RESET}`;
|
|
62
|
-
}
|
|
63
|
-
this.renderFrame(output);
|
|
64
|
-
}
|
|
65
|
-
handleInput(char) {
|
|
66
|
-
if (char === '\r' || char === '\n') {
|
|
67
|
-
const selectedCount = this.checkedState.filter(Boolean).length;
|
|
68
|
-
const { min = 0, max } = this.options;
|
|
69
|
-
if (selectedCount < min) {
|
|
70
|
-
this.errorMsg = `You must select at least ${min} options.`;
|
|
71
|
-
this.render(false);
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
if (max && selectedCount > max) {
|
|
75
|
-
this.errorMsg = `You can only select up to ${max} options.`;
|
|
76
|
-
this.render(false);
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
this.cleanup();
|
|
80
|
-
const results = this.options.choices.filter((_, i)=>this.checkedState[i]).map((c)=>c.value);
|
|
81
|
-
if (this._resolve) this._resolve(results);
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
// --- Batch Shortcuts ---
|
|
85
|
-
// 'a': Select All
|
|
86
|
-
if (char === 'a') {
|
|
87
|
-
if (this.options.max && this.options.choices.length > this.options.max) {
|
|
88
|
-
this.errorMsg = `Cannot select all: Max limit is ${this.options.max}`;
|
|
89
|
-
} else {
|
|
90
|
-
this.checkedState.fill(true);
|
|
91
|
-
this.errorMsg = '';
|
|
92
|
-
}
|
|
93
|
-
this.render(false);
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
// 'x' or 'n': Select None
|
|
97
|
-
if (char === 'x' || char === 'n') {
|
|
98
|
-
this.checkedState.fill(false);
|
|
99
|
-
this.errorMsg = '';
|
|
100
|
-
this.render(false);
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
// 'i': Invert Selection
|
|
104
|
-
if (char === 'i') {
|
|
105
|
-
const potentialCount = this.checkedState.filter((s)=>!s).length;
|
|
106
|
-
if (this.options.max && potentialCount > this.options.max) {
|
|
107
|
-
this.errorMsg = `Cannot invert: Result exceeds max limit ${this.options.max}`;
|
|
108
|
-
} else {
|
|
109
|
-
this.checkedState = this.checkedState.map((s)=>!s);
|
|
110
|
-
this.errorMsg = '';
|
|
111
|
-
}
|
|
112
|
-
this.render(false);
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
// Space Toggle
|
|
116
|
-
if (char === ' ') {
|
|
117
|
-
const currentChecked = this.checkedState[this.selectedIndex];
|
|
118
|
-
const selectedCount = this.checkedState.filter(Boolean).length;
|
|
119
|
-
const { max } = this.options;
|
|
120
|
-
if (!currentChecked && max && selectedCount >= max) {
|
|
121
|
-
this.errorMsg = `Max ${max} selections allowed.`;
|
|
122
|
-
} else {
|
|
123
|
-
this.checkedState[this.selectedIndex] = !currentChecked;
|
|
124
|
-
this.errorMsg = '';
|
|
125
|
-
}
|
|
126
|
-
this.render(false);
|
|
127
|
-
}
|
|
128
|
-
if (this.isUp(char)) {
|
|
129
|
-
this.selectedIndex = this.selectedIndex > 0 ? this.selectedIndex - 1 : this.options.choices.length - 1;
|
|
130
|
-
this.errorMsg = '';
|
|
131
|
-
this.render(false);
|
|
132
|
-
}
|
|
133
|
-
if (this.isDown(char)) {
|
|
134
|
-
this.selectedIndex = this.selectedIndex < this.options.choices.length - 1 ? this.selectedIndex + 1 : 0;
|
|
135
|
-
this.errorMsg = '';
|
|
136
|
-
this.render(false);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
handleMouse(event) {
|
|
140
|
-
if (event.action === 'scroll') {
|
|
141
|
-
if (event.scroll === 'up') {
|
|
142
|
-
this.selectedIndex = this.selectedIndex > 0 ? this.selectedIndex - 1 : this.options.choices.length - 1;
|
|
143
|
-
this.errorMsg = '';
|
|
144
|
-
this.render(false);
|
|
145
|
-
} else if (event.scroll === 'down') {
|
|
146
|
-
this.selectedIndex = this.selectedIndex < this.options.choices.length - 1 ? this.selectedIndex + 1 : 0;
|
|
147
|
-
this.errorMsg = '';
|
|
148
|
-
this.render(false);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
constructor(options){
|
|
153
|
-
super(options), _define_property(this, "selectedIndex", 0), _define_property(this, "checkedState", void 0), _define_property(this, "errorMsg", ''), // Pagination state
|
|
154
|
-
_define_property(this, "scrollTop", 0), _define_property(this, "pageSize", 10);
|
|
155
|
-
this.checkedState = options.choices.map((c)=>!!c.selected);
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
//# sourceMappingURL=checkbox.js.map
|