@maizzle/framework 6.0.0-rc.1 → 6.0.0-rc.2
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/bin/maizzle.mjs +1 -1
- package/dist/build.mjs +2 -1
- package/dist/build.mjs.map +1 -1
- package/dist/config/index.mjs +7 -0
- package/dist/config/index.mjs.map +1 -1
- package/dist/render/createRenderer.d.mts +2 -0
- package/dist/render/createRenderer.d.mts.map +1 -1
- package/dist/render/createRenderer.mjs +7 -2
- package/dist/render/createRenderer.mjs.map +1 -1
- package/dist/render/index.mjs +2 -1
- package/dist/render/index.mjs.map +1 -1
- package/dist/serve.mjs +2 -1
- package/dist/serve.mjs.map +1 -1
- package/dist/types/config.d.mts +3 -0
- package/dist/types/config.d.mts.map +1 -1
- package/node_modules/@clack/core/CHANGELOG.md +87 -4
- package/node_modules/@clack/core/README.md +1 -1
- package/node_modules/@clack/core/dist/index.d.mts +186 -48
- package/node_modules/@clack/core/dist/index.mjs +10 -14
- package/node_modules/@clack/core/dist/index.mjs.map +1 -1
- package/node_modules/@clack/core/package.json +7 -9
- package/node_modules/@clack/prompts/CHANGELOG.md +171 -7
- package/node_modules/@clack/prompts/README.md +66 -3
- package/node_modules/@clack/prompts/dist/index.d.mts +302 -76
- package/node_modules/@clack/prompts/dist/index.mjs +134 -84
- package/node_modules/@clack/prompts/dist/index.mjs.map +1 -1
- package/node_modules/@clack/prompts/package.json +14 -10
- package/node_modules/citty/LICENSE +0 -15
- package/node_modules/citty/README.md +166 -69
- package/node_modules/citty/dist/index.d.mts +88 -56
- package/node_modules/citty/dist/index.mjs +399 -437
- package/node_modules/citty/package.json +28 -35
- package/node_modules/giget/README.md +59 -11
- package/node_modules/giget/dist/THIRD-PARTY-LICENSES.md +205 -0
- package/node_modules/giget/dist/_chunks/giget.mjs +508 -0
- package/node_modules/giget/dist/_chunks/libs/citty.mjs +269 -0
- package/node_modules/giget/dist/_chunks/libs/nypm.d.mts +1 -0
- package/node_modules/giget/dist/_chunks/libs/nypm.mjs +669 -0
- package/node_modules/giget/dist/_chunks/libs/tar.mjs +2931 -0
- package/node_modules/giget/dist/_chunks/rolldown-runtime.mjs +14 -0
- package/node_modules/giget/dist/cli.d.mts +1 -0
- package/node_modules/giget/dist/cli.mjs +89 -111
- package/node_modules/giget/dist/index.d.mts +46 -35
- package/node_modules/giget/dist/index.mjs +2 -22
- package/node_modules/giget/package.json +32 -45
- package/node_modules/maizzle/README.md +140 -0
- package/node_modules/maizzle/bin/maizzle.mjs +5 -0
- package/node_modules/maizzle/dist/commands/new.d.mts +7 -0
- package/node_modules/maizzle/dist/commands/new.mjs +278 -0
- package/node_modules/{@maizzle/cli → maizzle}/dist/index.d.mts +1 -1
- package/node_modules/maizzle/dist/index.mjs +44 -0
- package/node_modules/{commander → maizzle/node_modules/commander}/Readme.md +94 -67
- package/node_modules/{commander → maizzle/node_modules/commander}/lib/argument.js +5 -4
- package/node_modules/{commander → maizzle/node_modules/commander}/lib/command.js +154 -39
- package/node_modules/{commander → maizzle/node_modules/commander}/lib/help.js +77 -39
- package/node_modules/{commander → maizzle/node_modules/commander}/lib/option.js +16 -3
- package/node_modules/{commander → maizzle/node_modules/commander}/package-support.json +4 -1
- package/node_modules/{commander → maizzle/node_modules/commander}/package.json +8 -8
- package/node_modules/{commander → maizzle/node_modules/commander}/typings/index.d.ts +71 -3
- package/node_modules/{@maizzle/cli → maizzle}/package.json +13 -11
- package/node_modules/tinyexec/README.md +49 -3
- package/node_modules/tinyexec/dist/main.d.mts +25 -14
- package/node_modules/tinyexec/dist/main.mjs +148 -100
- package/node_modules/tinyexec/package.json +9 -8
- package/package.json +3 -3
- package/node_modules/@clack/core/dist/index.cjs +0 -15
- package/node_modules/@clack/core/dist/index.cjs.map +0 -1
- package/node_modules/@clack/core/dist/index.d.cts +0 -211
- package/node_modules/@clack/core/dist/index.d.ts +0 -211
- package/node_modules/@clack/prompts/dist/index.cjs +0 -87
- package/node_modules/@clack/prompts/dist/index.cjs.map +0 -1
- package/node_modules/@clack/prompts/dist/index.d.cts +0 -165
- package/node_modules/@clack/prompts/dist/index.d.ts +0 -165
- package/node_modules/@maizzle/cli/README.md +0 -58
- package/node_modules/@maizzle/cli/dist/index.mjs +0 -42
- package/node_modules/citty/dist/index.cjs +0 -475
- package/node_modules/citty/dist/index.d.cts +0 -80
- package/node_modules/citty/dist/index.d.ts +0 -80
- package/node_modules/consola/LICENSE +0 -47
- package/node_modules/consola/README.md +0 -352
- package/node_modules/consola/basic.d.ts +0 -1
- package/node_modules/consola/browser.d.ts +0 -1
- package/node_modules/consola/core.d.ts +0 -1
- package/node_modules/consola/dist/basic.cjs +0 -32
- package/node_modules/consola/dist/basic.d.cts +0 -23
- package/node_modules/consola/dist/basic.d.mts +0 -21
- package/node_modules/consola/dist/basic.d.ts +0 -23
- package/node_modules/consola/dist/basic.mjs +0 -24
- package/node_modules/consola/dist/browser.cjs +0 -84
- package/node_modules/consola/dist/browser.d.cts +0 -23
- package/node_modules/consola/dist/browser.d.mts +0 -21
- package/node_modules/consola/dist/browser.d.ts +0 -23
- package/node_modules/consola/dist/browser.mjs +0 -76
- package/node_modules/consola/dist/chunks/prompt.cjs +0 -288
- package/node_modules/consola/dist/chunks/prompt.mjs +0 -280
- package/node_modules/consola/dist/core.cjs +0 -517
- package/node_modules/consola/dist/core.d.cts +0 -459
- package/node_modules/consola/dist/core.d.mts +0 -459
- package/node_modules/consola/dist/core.d.ts +0 -459
- package/node_modules/consola/dist/core.mjs +0 -512
- package/node_modules/consola/dist/index.cjs +0 -663
- package/node_modules/consola/dist/index.d.cts +0 -24
- package/node_modules/consola/dist/index.d.mts +0 -22
- package/node_modules/consola/dist/index.d.ts +0 -24
- package/node_modules/consola/dist/index.mjs +0 -651
- package/node_modules/consola/dist/shared/consola.DCGIlDNP.cjs +0 -75
- package/node_modules/consola/dist/shared/consola.DRwqZj3T.mjs +0 -72
- package/node_modules/consola/dist/shared/consola.DXBYu-KD.mjs +0 -288
- package/node_modules/consola/dist/shared/consola.DwRq1yyg.cjs +0 -312
- package/node_modules/consola/dist/utils.cjs +0 -64
- package/node_modules/consola/dist/utils.d.cts +0 -286
- package/node_modules/consola/dist/utils.d.mts +0 -286
- package/node_modules/consola/dist/utils.d.ts +0 -286
- package/node_modules/consola/dist/utils.mjs +0 -54
- package/node_modules/consola/lib/index.cjs +0 -10
- package/node_modules/consola/package.json +0 -136
- package/node_modules/consola/utils.d.ts +0 -1
- package/node_modules/create-maizzle/README.md +0 -86
- package/node_modules/create-maizzle/bin/create-maizzle.mjs +0 -4
- package/node_modules/create-maizzle/node_modules/@clack/core/CHANGELOG.md +0 -340
- package/node_modules/create-maizzle/node_modules/@clack/core/LICENSE +0 -9
- package/node_modules/create-maizzle/node_modules/@clack/core/README.md +0 -22
- package/node_modules/create-maizzle/node_modules/@clack/core/dist/index.d.mts +0 -349
- package/node_modules/create-maizzle/node_modules/@clack/core/dist/index.mjs +0 -11
- package/node_modules/create-maizzle/node_modules/@clack/core/dist/index.mjs.map +0 -1
- package/node_modules/create-maizzle/node_modules/@clack/core/package.json +0 -60
- package/node_modules/create-maizzle/node_modules/@clack/prompts/CHANGELOG.md +0 -576
- package/node_modules/create-maizzle/node_modules/@clack/prompts/LICENSE +0 -9
- package/node_modules/create-maizzle/node_modules/@clack/prompts/README.md +0 -270
- package/node_modules/create-maizzle/node_modules/@clack/prompts/dist/index.d.mts +0 -391
- package/node_modules/create-maizzle/node_modules/@clack/prompts/dist/index.mjs +0 -137
- package/node_modules/create-maizzle/node_modules/@clack/prompts/dist/index.mjs.map +0 -1
- package/node_modules/create-maizzle/node_modules/@clack/prompts/package.json +0 -65
- package/node_modules/create-maizzle/package.json +0 -47
- package/node_modules/create-maizzle/src/index.js +0 -242
- package/node_modules/defu/LICENSE +0 -21
- package/node_modules/defu/README.md +0 -171
- package/node_modules/defu/dist/defu.cjs +0 -77
- package/node_modules/defu/dist/defu.d.cts +0 -31
- package/node_modules/defu/dist/defu.d.mts +0 -29
- package/node_modules/defu/dist/defu.d.ts +0 -31
- package/node_modules/defu/dist/defu.mjs +0 -69
- package/node_modules/defu/lib/defu.cjs +0 -10
- package/node_modules/defu/lib/defu.d.cts +0 -12
- package/node_modules/defu/package.json +0 -48
- package/node_modules/giget/dist/shared/giget.OCaTp9b-.mjs +0 -468
- package/node_modules/node-fetch-native/LICENSE +0 -114
- package/node_modules/node-fetch-native/README.md +0 -225
- package/node_modules/node-fetch-native/dist/chunks/multipart-parser.cjs +0 -2
- package/node_modules/node-fetch-native/dist/chunks/multipart-parser.mjs +0 -2
- package/node_modules/node-fetch-native/dist/index.cjs +0 -1
- package/node_modules/node-fetch-native/dist/index.mjs +0 -1
- package/node_modules/node-fetch-native/dist/native.cjs +0 -1
- package/node_modules/node-fetch-native/dist/native.mjs +0 -1
- package/node_modules/node-fetch-native/dist/node.cjs +0 -19
- package/node_modules/node-fetch-native/dist/node.mjs +0 -19
- package/node_modules/node-fetch-native/dist/polyfill.cjs +0 -1
- package/node_modules/node-fetch-native/dist/polyfill.mjs +0 -1
- package/node_modules/node-fetch-native/dist/proxy-stub.cjs +0 -1
- package/node_modules/node-fetch-native/dist/proxy-stub.mjs +0 -1
- package/node_modules/node-fetch-native/dist/proxy.cjs +0 -58
- package/node_modules/node-fetch-native/dist/shared/node-fetch-native.DfbY2q-x.mjs +0 -1
- package/node_modules/node-fetch-native/dist/shared/node-fetch-native.DhEqb06g.cjs +0 -1
- package/node_modules/node-fetch-native/index.d.ts +0 -1
- package/node_modules/node-fetch-native/lib/empty.cjs +0 -0
- package/node_modules/node-fetch-native/lib/empty.mjs +0 -0
- package/node_modules/node-fetch-native/lib/index.cjs +0 -11
- package/node_modules/node-fetch-native/lib/index.d.cts +0 -10
- package/node_modules/node-fetch-native/lib/index.d.mts +0 -10
- package/node_modules/node-fetch-native/lib/index.d.ts +0 -10
- package/node_modules/node-fetch-native/lib/native.cjs +0 -11
- package/node_modules/node-fetch-native/lib/polyfill.d.cts +0 -1
- package/node_modules/node-fetch-native/lib/polyfill.d.mts +0 -1
- package/node_modules/node-fetch-native/lib/polyfill.d.ts +0 -1
- package/node_modules/node-fetch-native/lib/proxy.d.ts +0 -32
- package/node_modules/node-fetch-native/node.d.ts +0 -1
- package/node_modules/node-fetch-native/package.json +0 -138
- package/node_modules/node-fetch-native/polyfill.d.ts +0 -1
- package/node_modules/node-fetch-native/proxy.d.ts +0 -1
- package/node_modules/nypm/node_modules/citty/LICENSE +0 -21
- package/node_modules/nypm/node_modules/citty/README.md +0 -231
- package/node_modules/nypm/node_modules/citty/dist/index.d.mts +0 -112
- package/node_modules/nypm/node_modules/citty/dist/index.mjs +0 -425
- package/node_modules/nypm/node_modules/citty/package.json +0 -42
- /package/node_modules/{nypm/node_modules/citty → citty}/dist/THIRD-PARTY-LICENSES.md +0 -0
- /package/node_modules/{nypm/node_modules/citty → citty}/dist/_chunks/libs/scule.mjs +0 -0
- /package/node_modules/{@maizzle/cli → maizzle}/LICENSE +0 -0
- /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/component.d.mts +0 -0
- /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/component.mjs +0 -0
- /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/config.d.mts +0 -0
- /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/config.mjs +0 -0
- /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/layout.d.mts +0 -0
- /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/layout.mjs +0 -0
- /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/scaffold.d.mts +0 -0
- /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/scaffold.mjs +0 -0
- /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/stubs/component.vue +0 -0
- /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/stubs/config.ts +0 -0
- /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/stubs/layout.vue +0 -0
- /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/stubs/template.vue +0 -0
- /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/template.d.mts +0 -0
- /package/node_modules/{@maizzle/cli → maizzle}/dist/commands/make/template.mjs +0 -0
- /package/node_modules/{commander → maizzle/node_modules/commander}/LICENSE +0 -0
- /package/node_modules/{commander → maizzle/node_modules/commander}/esm.mjs +0 -0
- /package/node_modules/{commander → maizzle/node_modules/commander}/index.js +0 -0
- /package/node_modules/{commander → maizzle/node_modules/commander}/lib/error.js +0 -0
- /package/node_modules/{commander → maizzle/node_modules/commander}/lib/suggestSimilar.js +0 -0
- /package/node_modules/{commander → maizzle/node_modules/commander}/typings/esm.d.mts +0 -0
|
@@ -1,349 +0,0 @@
|
|
|
1
|
-
import { Key } from 'node:readline';
|
|
2
|
-
import { Readable, Writable } from 'node:stream';
|
|
3
|
-
|
|
4
|
-
declare const actions: readonly ["up", "down", "left", "right", "space", "enter", "cancel"];
|
|
5
|
-
type Action = (typeof actions)[number];
|
|
6
|
-
/** Global settings for Clack programs, stored in memory */
|
|
7
|
-
interface InternalClackSettings {
|
|
8
|
-
actions: Set<Action>;
|
|
9
|
-
aliases: Map<string, Action>;
|
|
10
|
-
messages: {
|
|
11
|
-
cancel: string;
|
|
12
|
-
error: string;
|
|
13
|
-
};
|
|
14
|
-
withGuide: boolean;
|
|
15
|
-
date: {
|
|
16
|
-
monthNames: string[];
|
|
17
|
-
messages: {
|
|
18
|
-
invalidMonth: string;
|
|
19
|
-
required: string;
|
|
20
|
-
invalidDay: (days: number, month: string) => string;
|
|
21
|
-
afterMin: (min: Date) => string;
|
|
22
|
-
beforeMax: (max: Date) => string;
|
|
23
|
-
};
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
declare const settings: InternalClackSettings;
|
|
27
|
-
interface ClackSettings {
|
|
28
|
-
/**
|
|
29
|
-
* Set custom global aliases for the default actions.
|
|
30
|
-
* This will not overwrite existing aliases, it will only add new ones!
|
|
31
|
-
*
|
|
32
|
-
* @param aliases - An object that maps aliases to actions
|
|
33
|
-
* @default { k: 'up', j: 'down', h: 'left', l: 'right', '\x03': 'cancel', 'escape': 'cancel' }
|
|
34
|
-
*/
|
|
35
|
-
aliases?: Record<string, Action>;
|
|
36
|
-
/**
|
|
37
|
-
* Custom messages for prompts
|
|
38
|
-
*/
|
|
39
|
-
messages?: {
|
|
40
|
-
/**
|
|
41
|
-
* Custom message to display when a spinner is cancelled
|
|
42
|
-
* @default "Canceled"
|
|
43
|
-
*/
|
|
44
|
-
cancel?: string;
|
|
45
|
-
/**
|
|
46
|
-
* Custom message to display when a spinner encounters an error
|
|
47
|
-
* @default "Something went wrong"
|
|
48
|
-
*/
|
|
49
|
-
error?: string;
|
|
50
|
-
};
|
|
51
|
-
withGuide?: boolean;
|
|
52
|
-
/**
|
|
53
|
-
* Date prompt localization
|
|
54
|
-
*/
|
|
55
|
-
date?: {
|
|
56
|
-
/** Month names for validation messages (January, February, ...) */
|
|
57
|
-
monthNames?: string[];
|
|
58
|
-
messages?: {
|
|
59
|
-
/** Shown when date is missing */
|
|
60
|
-
required?: string;
|
|
61
|
-
/** Shown when month > 12 */
|
|
62
|
-
invalidMonth?: string;
|
|
63
|
-
/** (days, monthName) => message for invalid day */
|
|
64
|
-
invalidDay?: (days: number, month: string) => string;
|
|
65
|
-
/** (min) => message when date is before minDate */
|
|
66
|
-
afterMin?: (min: Date) => string;
|
|
67
|
-
/** (max) => message when date is after maxDate */
|
|
68
|
-
beforeMax?: (max: Date) => string;
|
|
69
|
-
};
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
declare function updateSettings(updates: ClackSettings): void;
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* The state of the prompt
|
|
76
|
-
*/
|
|
77
|
-
type ClackState = 'initial' | 'active' | 'cancel' | 'submit' | 'error';
|
|
78
|
-
/**
|
|
79
|
-
* Typed event emitter for clack
|
|
80
|
-
*/
|
|
81
|
-
interface ClackEvents<TValue> {
|
|
82
|
-
initial: (value?: any) => void;
|
|
83
|
-
active: (value?: any) => void;
|
|
84
|
-
cancel: (value?: any) => void;
|
|
85
|
-
submit: (value?: any) => void;
|
|
86
|
-
error: (value?: any) => void;
|
|
87
|
-
cursor: (key?: Action) => void;
|
|
88
|
-
key: (key: string | undefined, info: Key) => void;
|
|
89
|
-
value: (value?: TValue) => void;
|
|
90
|
-
userInput: (value: string) => void;
|
|
91
|
-
confirm: (value?: boolean) => void;
|
|
92
|
-
finalize: () => void;
|
|
93
|
-
beforePrompt: () => void;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
interface PromptOptions<TValue, Self extends Prompt<TValue>> {
|
|
97
|
-
render(this: Omit<Self, 'prompt'>): string | undefined;
|
|
98
|
-
initialValue?: any;
|
|
99
|
-
initialUserInput?: string;
|
|
100
|
-
validate?: ((value: TValue | undefined) => string | Error | undefined) | undefined;
|
|
101
|
-
input?: Readable;
|
|
102
|
-
output?: Writable;
|
|
103
|
-
debug?: boolean;
|
|
104
|
-
signal?: AbortSignal;
|
|
105
|
-
}
|
|
106
|
-
declare class Prompt<TValue> {
|
|
107
|
-
protected input: Readable;
|
|
108
|
-
protected output: Writable;
|
|
109
|
-
private _abortSignal?;
|
|
110
|
-
private rl;
|
|
111
|
-
private opts;
|
|
112
|
-
private _render;
|
|
113
|
-
private _track;
|
|
114
|
-
private _prevFrame;
|
|
115
|
-
private _subscribers;
|
|
116
|
-
protected _cursor: number;
|
|
117
|
-
state: ClackState;
|
|
118
|
-
error: string;
|
|
119
|
-
value: TValue | undefined;
|
|
120
|
-
userInput: string;
|
|
121
|
-
constructor(options: PromptOptions<TValue, Prompt<TValue>>, trackValue?: boolean);
|
|
122
|
-
/**
|
|
123
|
-
* Unsubscribe all listeners
|
|
124
|
-
*/
|
|
125
|
-
protected unsubscribe(): void;
|
|
126
|
-
/**
|
|
127
|
-
* Set a subscriber with opts
|
|
128
|
-
* @param event - The event name
|
|
129
|
-
*/
|
|
130
|
-
private setSubscriber;
|
|
131
|
-
/**
|
|
132
|
-
* Subscribe to an event
|
|
133
|
-
* @param event - The event name
|
|
134
|
-
* @param cb - The callback
|
|
135
|
-
*/
|
|
136
|
-
on<T extends keyof ClackEvents<TValue>>(event: T, cb: ClackEvents<TValue>[T]): void;
|
|
137
|
-
/**
|
|
138
|
-
* Subscribe to an event once
|
|
139
|
-
* @param event - The event name
|
|
140
|
-
* @param cb - The callback
|
|
141
|
-
*/
|
|
142
|
-
once<T extends keyof ClackEvents<TValue>>(event: T, cb: ClackEvents<TValue>[T]): void;
|
|
143
|
-
/**
|
|
144
|
-
* Emit an event with data
|
|
145
|
-
* @param event - The event name
|
|
146
|
-
* @param data - The data to pass to the callback
|
|
147
|
-
*/
|
|
148
|
-
emit<T extends keyof ClackEvents<TValue>>(event: T, ...data: Parameters<ClackEvents<TValue>[T]>): void;
|
|
149
|
-
prompt(): Promise<symbol | TValue | undefined>;
|
|
150
|
-
protected _isActionKey(char: string | undefined, _key: Key): boolean;
|
|
151
|
-
protected _setValue(value: TValue | undefined): void;
|
|
152
|
-
protected _setUserInput(value: string | undefined, write?: boolean): void;
|
|
153
|
-
protected _clearUserInput(): void;
|
|
154
|
-
private onKeypress;
|
|
155
|
-
protected close(): void;
|
|
156
|
-
private restoreCursor;
|
|
157
|
-
private render;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
interface OptionLike$1 {
|
|
161
|
-
value: unknown;
|
|
162
|
-
label?: string;
|
|
163
|
-
disabled?: boolean;
|
|
164
|
-
}
|
|
165
|
-
type FilterFunction<T extends OptionLike$1> = (search: string, opt: T) => boolean;
|
|
166
|
-
interface AutocompleteOptions<T extends OptionLike$1> extends PromptOptions<T['value'] | T['value'][], AutocompletePrompt<T>> {
|
|
167
|
-
options: T[] | ((this: AutocompletePrompt<T>) => T[]);
|
|
168
|
-
filter?: FilterFunction<T>;
|
|
169
|
-
multiple?: boolean;
|
|
170
|
-
/**
|
|
171
|
-
* When set (non-empty), pressing Tab with no input fills the field with this value
|
|
172
|
-
* and runs the normal filter/selection logic so the user can confirm with Enter.
|
|
173
|
-
* Tab only fills the input when the placeholder matches at least one option under
|
|
174
|
-
* the prompt's filter (so the value remains selectable).
|
|
175
|
-
*/
|
|
176
|
-
placeholder?: string;
|
|
177
|
-
}
|
|
178
|
-
declare class AutocompletePrompt<T extends OptionLike$1> extends Prompt<T['value'] | T['value'][]> {
|
|
179
|
-
#private;
|
|
180
|
-
filteredOptions: T[];
|
|
181
|
-
multiple: boolean;
|
|
182
|
-
isNavigating: boolean;
|
|
183
|
-
selectedValues: Array<T['value']>;
|
|
184
|
-
focusedValue: T['value'] | undefined;
|
|
185
|
-
get cursor(): number;
|
|
186
|
-
get userInputWithCursor(): string;
|
|
187
|
-
get options(): T[];
|
|
188
|
-
constructor(opts: AutocompleteOptions<T>);
|
|
189
|
-
protected _isActionKey(char: string | undefined, key: Key): boolean;
|
|
190
|
-
deselectAll(): void;
|
|
191
|
-
toggleSelected(value: T['value']): void;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
interface ConfirmOptions extends PromptOptions<boolean, ConfirmPrompt> {
|
|
195
|
-
active: string;
|
|
196
|
-
inactive: string;
|
|
197
|
-
initialValue?: boolean;
|
|
198
|
-
}
|
|
199
|
-
declare class ConfirmPrompt extends Prompt<boolean> {
|
|
200
|
-
get cursor(): 0 | 1;
|
|
201
|
-
private get _value();
|
|
202
|
-
constructor(opts: ConfirmOptions);
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
interface SegmentConfig {
|
|
206
|
-
type: 'year' | 'month' | 'day';
|
|
207
|
-
len: number;
|
|
208
|
-
}
|
|
209
|
-
interface DateParts {
|
|
210
|
-
year: string;
|
|
211
|
-
month: string;
|
|
212
|
-
day: string;
|
|
213
|
-
}
|
|
214
|
-
type DateFormat = 'YMD' | 'MDY' | 'DMY';
|
|
215
|
-
interface DateOptions extends PromptOptions<Date, DatePrompt> {
|
|
216
|
-
format?: DateFormat;
|
|
217
|
-
locale?: string;
|
|
218
|
-
separator?: string;
|
|
219
|
-
defaultValue?: Date;
|
|
220
|
-
initialValue?: Date;
|
|
221
|
-
minDate?: Date;
|
|
222
|
-
maxDate?: Date;
|
|
223
|
-
}
|
|
224
|
-
declare class DatePrompt extends Prompt<Date> {
|
|
225
|
-
#private;
|
|
226
|
-
inlineError: string;
|
|
227
|
-
get segmentCursor(): {
|
|
228
|
-
segmentIndex: number;
|
|
229
|
-
positionInSegment: number;
|
|
230
|
-
};
|
|
231
|
-
get segmentValues(): DateParts;
|
|
232
|
-
get segments(): readonly SegmentConfig[];
|
|
233
|
-
get separator(): string;
|
|
234
|
-
get formattedValue(): string;
|
|
235
|
-
constructor(opts: DateOptions);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
interface GroupMultiSelectOptions<T extends {
|
|
239
|
-
value: any;
|
|
240
|
-
}> extends PromptOptions<T['value'][], GroupMultiSelectPrompt<T>> {
|
|
241
|
-
options: Record<string, T[]>;
|
|
242
|
-
initialValues?: T['value'][];
|
|
243
|
-
required?: boolean;
|
|
244
|
-
cursorAt?: T['value'];
|
|
245
|
-
selectableGroups?: boolean;
|
|
246
|
-
}
|
|
247
|
-
declare class GroupMultiSelectPrompt<T extends {
|
|
248
|
-
value: any;
|
|
249
|
-
}> extends Prompt<T['value'][]> {
|
|
250
|
-
#private;
|
|
251
|
-
options: (T & {
|
|
252
|
-
group: string | boolean;
|
|
253
|
-
})[];
|
|
254
|
-
cursor: number;
|
|
255
|
-
getGroupItems(group: string): T[];
|
|
256
|
-
isGroupSelected(group: string): boolean;
|
|
257
|
-
private toggleValue;
|
|
258
|
-
constructor(opts: GroupMultiSelectOptions<T>);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
interface OptionLike {
|
|
262
|
-
value: any;
|
|
263
|
-
disabled?: boolean;
|
|
264
|
-
}
|
|
265
|
-
interface MultiSelectOptions<T extends OptionLike> extends PromptOptions<T['value'][], MultiSelectPrompt<T>> {
|
|
266
|
-
options: T[];
|
|
267
|
-
initialValues?: T['value'][];
|
|
268
|
-
required?: boolean;
|
|
269
|
-
cursorAt?: T['value'];
|
|
270
|
-
}
|
|
271
|
-
declare class MultiSelectPrompt<T extends OptionLike> extends Prompt<T['value'][]> {
|
|
272
|
-
options: T[];
|
|
273
|
-
cursor: number;
|
|
274
|
-
private get _value();
|
|
275
|
-
private get _enabledOptions();
|
|
276
|
-
private toggleAll;
|
|
277
|
-
private toggleInvert;
|
|
278
|
-
private toggleValue;
|
|
279
|
-
constructor(opts: MultiSelectOptions<T>);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
interface PasswordOptions extends PromptOptions<string, PasswordPrompt> {
|
|
283
|
-
mask?: string;
|
|
284
|
-
}
|
|
285
|
-
declare class PasswordPrompt extends Prompt<string> {
|
|
286
|
-
private _mask;
|
|
287
|
-
get cursor(): number;
|
|
288
|
-
get masked(): string;
|
|
289
|
-
get userInputWithCursor(): string;
|
|
290
|
-
clear(): void;
|
|
291
|
-
constructor({ mask, ...opts }: PasswordOptions);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
interface SelectOptions<T extends {
|
|
295
|
-
value: any;
|
|
296
|
-
disabled?: boolean;
|
|
297
|
-
}> extends PromptOptions<T['value'], SelectPrompt<T>> {
|
|
298
|
-
options: T[];
|
|
299
|
-
initialValue?: T['value'];
|
|
300
|
-
}
|
|
301
|
-
declare class SelectPrompt<T extends {
|
|
302
|
-
value: any;
|
|
303
|
-
disabled?: boolean;
|
|
304
|
-
}> extends Prompt<T['value']> {
|
|
305
|
-
options: T[];
|
|
306
|
-
cursor: number;
|
|
307
|
-
private get _selectedValue();
|
|
308
|
-
private changeValue;
|
|
309
|
-
constructor(opts: SelectOptions<T>);
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
interface SelectKeyOptions<T extends {
|
|
313
|
-
value: string;
|
|
314
|
-
}> extends PromptOptions<T['value'], SelectKeyPrompt<T>> {
|
|
315
|
-
options: T[];
|
|
316
|
-
caseSensitive?: boolean;
|
|
317
|
-
}
|
|
318
|
-
declare class SelectKeyPrompt<T extends {
|
|
319
|
-
value: string;
|
|
320
|
-
}> extends Prompt<T['value']> {
|
|
321
|
-
options: T[];
|
|
322
|
-
cursor: number;
|
|
323
|
-
constructor(opts: SelectKeyOptions<T>);
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
interface TextOptions extends PromptOptions<string, TextPrompt> {
|
|
327
|
-
placeholder?: string;
|
|
328
|
-
defaultValue?: string;
|
|
329
|
-
}
|
|
330
|
-
declare class TextPrompt extends Prompt<string> {
|
|
331
|
-
get userInputWithCursor(): string;
|
|
332
|
-
get cursor(): number;
|
|
333
|
-
constructor(opts: TextOptions);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
declare function isCancel(value: unknown): value is symbol;
|
|
337
|
-
interface BlockOptions {
|
|
338
|
-
input?: Readable;
|
|
339
|
-
output?: Writable;
|
|
340
|
-
overwrite?: boolean;
|
|
341
|
-
hideCursor?: boolean;
|
|
342
|
-
}
|
|
343
|
-
declare function block({ input, output, overwrite, hideCursor, }?: BlockOptions): () => void;
|
|
344
|
-
declare const getColumns: (output: Writable) => number;
|
|
345
|
-
declare const getRows: (output: Writable) => number;
|
|
346
|
-
declare function wrapTextWithPrefix(output: Writable | undefined, text: string, prefix: string, startPrefix?: string): string;
|
|
347
|
-
|
|
348
|
-
export { AutocompletePrompt, ConfirmPrompt, DatePrompt, GroupMultiSelectPrompt, MultiSelectPrompt, PasswordPrompt, Prompt, SelectKeyPrompt, SelectPrompt, TextPrompt, block, getColumns, getRows, isCancel, settings, updateSettings, wrapTextWithPrefix };
|
|
349
|
-
export type { AutocompleteOptions, ClackSettings, ConfirmOptions, DateFormat, DateOptions, DateParts, GroupMultiSelectOptions, MultiSelectOptions, PasswordOptions, PromptOptions, SelectKeyOptions, SelectOptions, ClackState as State, TextOptions };
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import{styleText as y}from"node:util";import{stdout as S,stdin as $}from"node:process";import*as _ from"node:readline";import P from"node:readline";import{wrapAnsi as x}from"fast-wrap-ansi";import{cursor as c,erase as M}from"sisteransi";import{ReadStream as D}from"node:tty";function d(r,t,e){if(!e.some(o=>!o.disabled))return r;const s=r+t,i=Math.max(e.length-1,0),n=s<0?i:s>i?0:s;return e[n].disabled?d(n,t<0?-1:1,e):n}const E=["up","down","left","right","space","enter","cancel"],G=["January","February","March","April","May","June","July","August","September","October","November","December"],u={actions:new Set(E),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["","cancel"],["escape","cancel"]]),messages:{cancel:"Canceled",error:"Something went wrong"},withGuide:!0,date:{monthNames:[...G],messages:{required:"Please enter a valid date",invalidMonth:"There are only 12 months in a year",invalidDay:(r,t)=>`There are only ${r} days in ${t}`,afterMin:r=>`Date must be on or after ${r.toISOString().slice(0,10)}`,beforeMax:r=>`Date must be on or before ${r.toISOString().slice(0,10)}`}}};function K(r){if(r.aliases!==void 0){const t=r.aliases;for(const e in t){if(!Object.hasOwn(t,e))continue;const s=t[e];u.actions.has(s)&&(u.aliases.has(e)||u.aliases.set(e,s))}}if(r.messages!==void 0){const t=r.messages;t.cancel!==void 0&&(u.messages.cancel=t.cancel),t.error!==void 0&&(u.messages.error=t.error)}if(r.withGuide!==void 0&&(u.withGuide=r.withGuide!==!1),r.date!==void 0){const t=r.date;t.monthNames!==void 0&&(u.date.monthNames=[...t.monthNames]),t.messages!==void 0&&(t.messages.required!==void 0&&(u.date.messages.required=t.messages.required),t.messages.invalidMonth!==void 0&&(u.date.messages.invalidMonth=t.messages.invalidMonth),t.messages.invalidDay!==void 0&&(u.date.messages.invalidDay=t.messages.invalidDay),t.messages.afterMin!==void 0&&(u.date.messages.afterMin=t.messages.afterMin),t.messages.beforeMax!==void 0&&(u.date.messages.beforeMax=t.messages.beforeMax))}}function V(r,t){if(typeof r=="string")return u.aliases.get(r)===t;for(const e of r)if(e!==void 0&&V(e,t))return!0;return!1}function j(r,t){if(r===t)return;const e=r.split(`
|
|
2
|
-
`),s=t.split(`
|
|
3
|
-
`),i=Math.max(e.length,s.length),n=[];for(let o=0;o<i;o++)e[o]!==s[o]&&n.push(o);return{lines:n,numLinesBefore:e.length,numLinesAfter:s.length,numLines:i}}const Y=globalThis.process.platform.startsWith("win"),C=Symbol("clack:cancel");function q(r){return r===C}function w(r,t){const e=r;e.isTTY&&e.setRawMode(t)}function z({input:r=$,output:t=S,overwrite:e=!0,hideCursor:s=!0}={}){const i=_.createInterface({input:r,output:t,prompt:"",tabSize:1});_.emitKeypressEvents(r,i),r instanceof D&&r.isTTY&&r.setRawMode(!0);const n=(o,{name:a,sequence:h})=>{const l=String(o);if(V([l,a,h],"cancel")){s&&t.write(c.show),process.exit(0);return}if(!e)return;const f=a==="return"?0:-1,v=a==="return"?-1:0;_.moveCursor(t,f,v,()=>{_.clearLine(t,1,()=>{r.once("keypress",n)})})};return s&&t.write(c.hide),r.once("keypress",n),()=>{r.off("keypress",n),s&&t.write(c.show),r instanceof D&&r.isTTY&&!Y&&r.setRawMode(!1),i.terminal=!1,i.close()}}const O=r=>"columns"in r&&typeof r.columns=="number"?r.columns:80,A=r=>"rows"in r&&typeof r.rows=="number"?r.rows:20;function R(r,t,e,s=e){const i=O(r??S);return x(t,i-e.length,{hard:!0,trim:!1}).split(`
|
|
4
|
-
`).map((n,o)=>`${o===0?s:e}${n}`).join(`
|
|
5
|
-
`)}let p=class{input;output;_abortSignal;rl;opts;_render;_track=!1;_prevFrame="";_subscribers=new Map;_cursor=0;state="initial";error="";value;userInput="";constructor(t,e=!0){const{input:s=$,output:i=S,render:n,signal:o,...a}=t;this.opts=a,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=n.bind(this),this._track=e,this._abortSignal=o,this.input=s,this.output=i}unsubscribe(){this._subscribers.clear()}setSubscriber(t,e){const s=this._subscribers.get(t)??[];s.push(e),this._subscribers.set(t,s)}on(t,e){this.setSubscriber(t,{cb:e})}once(t,e){this.setSubscriber(t,{cb:e,once:!0})}emit(t,...e){const s=this._subscribers.get(t)??[],i=[];for(const n of s)n.cb(...e),n.once&&i.push(()=>s.splice(s.indexOf(n),1));for(const n of i)n()}prompt(){return new Promise(t=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),t(C);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close()},{once:!0})}this.rl=P.createInterface({input:this.input,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:!0}),this.rl.prompt(),this.opts.initialUserInput!==void 0&&this._setUserInput(this.opts.initialUserInput,!0),this.input.on("keypress",this.onKeypress),w(this.input,!0),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(c.show),this.output.off("resize",this.render),w(this.input,!1),t(this.value)}),this.once("cancel",()=>{this.output.write(c.show),this.output.off("resize",this.render),w(this.input,!1),t(C)})})}_isActionKey(t,e){return t===" "}_setValue(t){this.value=t,this.emit("value",this.value)}_setUserInput(t,e){this.userInput=t??"",this.emit("userInput",this.userInput),e&&this._track&&this.rl&&(this.rl.write(this.userInput),this._cursor=this.rl.cursor)}_clearUserInput(){this.rl?.write(null,{ctrl:!0,name:"u"}),this._setUserInput("")}onKeypress(t,e){if(this._track&&e.name!=="return"&&(e.name&&this._isActionKey(t,e)&&this.rl?.write(null,{ctrl:!0,name:"h"}),this._cursor=this.rl?.cursor??0,this._setUserInput(this.rl?.line)),this.state==="error"&&(this.state="active"),e?.name&&(!this._track&&u.aliases.has(e.name)&&this.emit("cursor",u.aliases.get(e.name)),u.actions.has(e.name)&&this.emit("cursor",e.name)),t&&(t.toLowerCase()==="y"||t.toLowerCase()==="n")&&this.emit("confirm",t.toLowerCase()==="y"),this.emit("key",t?.toLowerCase(),e),e?.name==="return"){if(this.opts.validate){const s=this.opts.validate(this.value);s&&(this.error=s instanceof Error?s.message:s,this.state="error",this.rl?.write(this.userInput))}this.state!=="error"&&(this.state="submit")}V([t,e?.name,e?.sequence],"cancel")&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close()}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
|
|
6
|
-
`),w(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){const t=x(this._prevFrame,process.stdout.columns,{hard:!0,trim:!1}).split(`
|
|
7
|
-
`).length-1;this.output.write(c.move(-999,t*-1))}render(){const t=x(this._render(this)??"",process.stdout.columns,{hard:!0,trim:!1});if(t!==this._prevFrame){if(this.state==="initial")this.output.write(c.hide);else{const e=j(this._prevFrame,t),s=A(this.output);if(this.restoreCursor(),e){const i=Math.max(0,e.numLinesAfter-s),n=Math.max(0,e.numLinesBefore-s);let o=e.lines.find(a=>a>=i);if(o===void 0){this._prevFrame=t;return}if(e.lines.length===1){this.output.write(c.move(0,o-n)),this.output.write(M.lines(1));const a=t.split(`
|
|
8
|
-
`);this.output.write(a[o]),this._prevFrame=t,this.output.write(c.move(0,a.length-o-1));return}else if(e.lines.length>1){if(i<n)o=i;else{const h=o-n;h>0&&this.output.write(c.move(0,h))}this.output.write(M.down());const a=t.split(`
|
|
9
|
-
`).slice(o);this.output.write(a.join(`
|
|
10
|
-
`)),this._prevFrame=t;return}}this.output.write(M.down())}this.output.write(t),this.state==="initial"&&(this.state="active"),this._prevFrame=t}}};function W(r,t){if(r===void 0||t.length===0)return 0;const e=t.findIndex(s=>s.value===r);return e!==-1?e:0}function B(r,t){return(t.label??String(t.value)).toLowerCase().includes(r.toLowerCase())}function J(r,t){if(t)return r?t:t[0]}let H=class extends p{filteredOptions;multiple;isNavigating=!1;selectedValues=[];focusedValue;#e=0;#o="";#t;#n;#a;get cursor(){return this.#e}get userInputWithCursor(){if(!this.userInput)return y(["inverse","hidden"],"_");if(this._cursor>=this.userInput.length)return`${this.userInput}\u2588`;const t=this.userInput.slice(0,this._cursor),[e,...s]=this.userInput.slice(this._cursor);return`${t}${y("inverse",e)}${s.join("")}`}get options(){return typeof this.#n=="function"?this.#n():this.#n}constructor(t){super(t),this.#n=t.options,this.#a=t.placeholder;const e=this.options;this.filteredOptions=[...e],this.multiple=t.multiple===!0,this.#t=typeof t.options=="function"?t.filter:t.filter??B;let s;if(t.initialValue&&Array.isArray(t.initialValue)?this.multiple?s=t.initialValue:s=t.initialValue.slice(0,1):!this.multiple&&this.options.length>0&&(s=[this.options[0].value]),s)for(const i of s){const n=e.findIndex(o=>o.value===i);n!==-1&&(this.toggleSelected(i),this.#e=n)}this.focusedValue=this.options[this.#e]?.value,this.on("key",(i,n)=>this.#s(i,n)),this.on("userInput",i=>this.#i(i))}_isActionKey(t,e){return t===" "||this.multiple&&this.isNavigating&&e.name==="space"&&t!==void 0&&t!==""}#s(t,e){const s=e.name==="up",i=e.name==="down",n=e.name==="return",o=this.userInput===""||this.userInput===" ",a=this.#a,h=this.options,l=a!==void 0&&a!==""&&h.some(f=>!f.disabled&&(this.#t?this.#t(a,f):!0));if(e.name==="tab"&&o&&l){this.userInput===" "&&this._clearUserInput(),this._setUserInput(a,!0),this.isNavigating=!1;return}s||i?(this.#e=d(this.#e,s?-1:1,this.filteredOptions),this.focusedValue=this.filteredOptions[this.#e]?.value,this.multiple||(this.selectedValues=[this.focusedValue]),this.isNavigating=!0):n?this.value=J(this.multiple,this.selectedValues):this.multiple?this.focusedValue!==void 0&&(e.name==="tab"||this.isNavigating&&e.name==="space")?this.toggleSelected(this.focusedValue):this.isNavigating=!1:(this.focusedValue&&(this.selectedValues=[this.focusedValue]),this.isNavigating=!1)}deselectAll(){this.selectedValues=[]}toggleSelected(t){this.filteredOptions.length!==0&&(this.multiple?this.selectedValues.includes(t)?this.selectedValues=this.selectedValues.filter(e=>e!==t):this.selectedValues=[...this.selectedValues,t]:this.selectedValues=[t])}#i(t){if(t!==this.#o){this.#o=t;const e=this.options;t&&this.#t?this.filteredOptions=e.filter(n=>this.#t?.(t,n)):this.filteredOptions=[...e];const s=W(this.focusedValue,this.filteredOptions);this.#e=d(s,0,this.filteredOptions);const i=this.filteredOptions[this.#e];i&&!i.disabled?this.focusedValue=i.value:this.focusedValue=void 0,this.multiple||(this.focusedValue!==void 0?this.toggleSelected(this.focusedValue):this.deselectAll())}}};class Q extends p{get cursor(){return this.value?0:1}get _value(){return this.cursor===0}constructor(t){super(t,!1),this.value=!!t.initialValue,this.on("userInput",()=>{this.value=this._value}),this.on("confirm",e=>{this.output.write(c.move(0,-1)),this.value=e,this.state="submit",this.close()}),this.on("cursor",()=>{this.value=!this.value})}}const X={Y:{type:"year",len:4},M:{type:"month",len:2},D:{type:"day",len:2}};function L(r){return[...r].map(t=>X[t])}function Z(r){const t=new Intl.DateTimeFormat(r,{year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(new Date(2e3,0,15)),e=[];let s="/";for(const i of t)i.type==="literal"?s=i.value.trim()||i.value:(i.type==="year"||i.type==="month"||i.type==="day")&&e.push({type:i.type,len:i.type==="year"?4:2});return{segments:e,separator:s}}function k(r){return Number.parseInt((r||"0").replace(/_/g,"0"),10)||0}function I(r){return{year:k(r.year),month:k(r.month),day:k(r.day)}}function T(r,t){return new Date(r||2001,t||1,0).getDate()}function F(r){const{year:t,month:e,day:s}=I(r);if(!t||t<0||t>9999||!e||e<1||e>12||!s||s<1)return;const i=new Date(Date.UTC(t,e-1,s));if(!(i.getUTCFullYear()!==t||i.getUTCMonth()!==e-1||i.getUTCDate()!==s))return{year:t,month:e,day:s}}function N(r){const t=F(r);return t?new Date(Date.UTC(t.year,t.month-1,t.day)):void 0}function tt(r,t,e,s){const i=e?{year:e.getUTCFullYear(),month:e.getUTCMonth()+1,day:e.getUTCDate()}:null,n=s?{year:s.getUTCFullYear(),month:s.getUTCMonth()+1,day:s.getUTCDate()}:null;return r==="year"?{min:i?.year??1,max:n?.year??9999}:r==="month"?{min:i&&t.year===i.year?i.month:1,max:n&&t.year===n.year?n.month:12}:{min:i&&t.year===i.year&&t.month===i.month?i.day:1,max:n&&t.year===n.year&&t.month===n.month?n.day:T(t.year,t.month)}}class et extends p{#e;#o;#t;#n;#a;#s={segmentIndex:0,positionInSegment:0};#i=!0;#r=null;inlineError="";get segmentCursor(){return{...this.#s}}get segmentValues(){return{...this.#t}}get segments(){return this.#e}get separator(){return this.#o}get formattedValue(){return this.#c(this.#t)}#c(t){return this.#e.map(e=>t[e.type]).join(this.#o)}#h(){this._setUserInput(this.#c(this.#t)),this._setValue(N(this.#t)??void 0)}constructor(t){const e=t.format?{segments:L(t.format),separator:t.separator??"/"}:Z(t.locale),s=t.separator??e.separator,i=t.format?L(t.format):e.segments,n=t.initialValue??t.defaultValue,o=n?{year:String(n.getUTCFullYear()).padStart(4,"0"),month:String(n.getUTCMonth()+1).padStart(2,"0"),day:String(n.getUTCDate()).padStart(2,"0")}:{year:"____",month:"__",day:"__"},a=i.map(h=>o[h.type]).join(s);super({...t,initialUserInput:a},!1),this.#e=i,this.#o=s,this.#t=o,this.#n=t.minDate,this.#a=t.maxDate,this.#h(),this.on("cursor",h=>this.#d(h)),this.on("key",(h,l)=>this.#f(h,l)),this.on("finalize",()=>this.#g(t))}#u(){const t=Math.max(0,Math.min(this.#s.segmentIndex,this.#e.length-1)),e=this.#e[t];if(e)return this.#s.positionInSegment=Math.max(0,Math.min(this.#s.positionInSegment,e.len-1)),{segment:e,index:t}}#l(t){this.inlineError="",this.#r=null;const e=this.#u();e&&(this.#s.segmentIndex=Math.max(0,Math.min(this.#e.length-1,e.index+t)),this.#s.positionInSegment=0,this.#i=!0)}#p(t){const e=this.#u();if(!e)return;const{segment:s}=e,i=this.#t[s.type],n=!i||i.replace(/_/g,"")==="",o=Number.parseInt((i||"0").replace(/_/g,"0"),10)||0,a=tt(s.type,I(this.#t),this.#n,this.#a);let h;n?h=t===1?a.min:a.max:h=Math.max(Math.min(a.max,o+t),a.min),this.#t={...this.#t,[s.type]:h.toString().padStart(s.len,"0")},this.#i=!0,this.#r=null,this.#h()}#d(t){if(t)switch(t){case"right":return this.#l(1);case"left":return this.#l(-1);case"up":return this.#p(1);case"down":return this.#p(-1)}}#f(t,e){if(e?.name==="backspace"||e?.sequence==="\x7F"||e?.sequence==="\b"||t==="\x7F"||t==="\b"){this.inlineError="";const s=this.#u();if(!s)return;if(!this.#t[s.segment.type].replace(/_/g,"")){this.#l(-1);return}this.#t[s.segment.type]="_".repeat(s.segment.len),this.#i=!0,this.#s.positionInSegment=0,this.#h();return}if(e?.name==="tab"){this.inlineError="";const s=this.#u();if(!s)return;const i=e.shift?-1:1,n=s.index+i;n>=0&&n<this.#e.length&&(this.#s.segmentIndex=n,this.#s.positionInSegment=0,this.#i=!0);return}if(t&&/^[0-9]$/.test(t)){const s=this.#u();if(!s)return;const{segment:i}=s,n=!this.#t[i.type].replace(/_/g,"");if(this.#i&&this.#r!==null&&!n){const m=this.#r+t,g={...this.#t,[i.type]:m},b=this.#m(g,i);if(b){this.inlineError=b,this.#r=null,this.#i=!1;return}this.inlineError="",this.#t[i.type]=m,this.#r=null,this.#i=!1,this.#h(),s.index<this.#e.length-1&&(this.#s.segmentIndex=s.index+1,this.#s.positionInSegment=0,this.#i=!0);return}this.#i&&!n&&(this.#t[i.type]="_".repeat(i.len),this.#s.positionInSegment=0),this.#i=!1,this.#r=null;const o=this.#t[i.type],a=o.indexOf("_"),h=a>=0?a:Math.min(this.#s.positionInSegment,i.len-1);if(h<0||h>=i.len)return;let l=o.slice(0,h)+t+o.slice(h+1),f=!1;if(h===0&&o==="__"&&(i.type==="month"||i.type==="day")){const m=Number.parseInt(t,10);l=`0${t}`,f=m<=(i.type==="month"?1:2)}if(i.type==="year"&&(l=(o.replace(/_/g,"")+t).padStart(i.len,"_")),!l.includes("_")){const m={...this.#t,[i.type]:l},g=this.#m(m,i);if(g){this.inlineError=g;return}}this.inlineError="",this.#t[i.type]=l;const v=l.includes("_")?void 0:F(this.#t);if(v){const{year:m,month:g}=v,b=T(m,g);this.#t={year:String(Math.max(0,Math.min(9999,m))).padStart(4,"0"),month:String(Math.max(1,Math.min(12,g))).padStart(2,"0"),day:String(Math.max(1,Math.min(b,v.day))).padStart(2,"0")}}this.#h();const U=l.indexOf("_");f?(this.#i=!0,this.#r=t):U>=0?this.#s.positionInSegment=U:a>=0&&s.index<this.#e.length-1?(this.#s.segmentIndex=s.index+1,this.#s.positionInSegment=0,this.#i=!0):this.#s.positionInSegment=Math.min(h+1,i.len-1)}}#m(t,e){const{month:s,day:i}=I(t);if(e.type==="month"&&(s<0||s>12))return u.date.messages.invalidMonth;if(e.type==="day"&&(i<0||i>31))return u.date.messages.invalidDay(31,"any month")}#g(t){const{year:e,month:s,day:i}=I(this.#t);if(e&&s&&i){const n=T(e,s);this.#t={...this.#t,day:String(Math.min(i,n)).padStart(2,"0")}}this.value=N(this.#t)??t.defaultValue??void 0}}class st extends p{options;cursor=0;#e;getGroupItems(t){return this.options.filter(e=>e.group===t)}isGroupSelected(t){const e=this.getGroupItems(t),s=this.value;return s===void 0?!1:e.every(i=>s.includes(i.value))}toggleValue(){const t=this.options[this.cursor];if(this.value===void 0&&(this.value=[]),t.group===!0){const e=t.value,s=this.getGroupItems(e);this.isGroupSelected(e)?this.value=this.value.filter(i=>s.findIndex(n=>n.value===i)===-1):this.value=[...this.value,...s.map(i=>i.value)],this.value=Array.from(new Set(this.value))}else{const e=this.value.includes(t.value);this.value=e?this.value.filter(s=>s!==t.value):[...this.value,t.value]}}constructor(t){super(t,!1);const{options:e}=t;this.#e=t.selectableGroups!==!1,this.options=Object.entries(e).flatMap(([s,i])=>[{value:s,group:!0,label:s},...i.map(n=>({...n,group:s}))]),this.value=[...t.initialValues??[]],this.cursor=Math.max(this.options.findIndex(({value:s})=>s===t.cursorAt),this.#e?0:1),this.on("cursor",s=>{switch(s){case"left":case"up":{this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;const i=this.options[this.cursor]?.group===!0;!this.#e&&i&&(this.cursor=this.cursor===0?this.options.length-1:this.cursor-1);break}case"down":case"right":{this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;const i=this.options[this.cursor]?.group===!0;!this.#e&&i&&(this.cursor=this.cursor===this.options.length-1?0:this.cursor+1);break}case"space":this.toggleValue();break}})}}let it=class extends p{options;cursor=0;get _value(){return this.options[this.cursor].value}get _enabledOptions(){return this.options.filter(t=>t.disabled!==!0)}toggleAll(){const t=this._enabledOptions,e=this.value!==void 0&&this.value.length===t.length;this.value=e?[]:t.map(s=>s.value)}toggleInvert(){const t=this.value;if(!t)return;const e=this._enabledOptions.filter(s=>!t.includes(s.value));this.value=e.map(s=>s.value)}toggleValue(){this.value===void 0&&(this.value=[]);const t=this.value.includes(this._value);this.value=t?this.value.filter(e=>e!==this._value):[...this.value,this._value]}constructor(t){super(t,!1),this.options=t.options,this.value=[...t.initialValues??[]];const e=Math.max(this.options.findIndex(({value:s})=>s===t.cursorAt),0);this.cursor=this.options[e].disabled?d(e,1,this.options):e,this.on("key",s=>{s==="a"&&this.toggleAll(),s==="i"&&this.toggleInvert()}),this.on("cursor",s=>{switch(s){case"left":case"up":this.cursor=d(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=d(this.cursor,1,this.options);break;case"space":this.toggleValue();break}})}};class rt extends p{_mask="\u2022";get cursor(){return this._cursor}get masked(){return this.userInput.replaceAll(/./g,this._mask)}get userInputWithCursor(){if(this.state==="submit"||this.state==="cancel")return this.masked;const t=this.userInput;if(this.cursor>=t.length)return`${this.masked}${y(["inverse","hidden"],"_")}`;const e=this.masked,s=e.slice(0,this.cursor),i=e.slice(this.cursor);return`${s}${y("inverse",i[0])}${i.slice(1)}`}clear(){this._clearUserInput()}constructor({mask:t,...e}){super(e),this._mask=t??"\u2022",this.on("userInput",s=>{this._setValue(s)})}}class nt extends p{options;cursor=0;get _selectedValue(){return this.options[this.cursor]}changeValue(){this.value=this._selectedValue.value}constructor(t){super(t,!1),this.options=t.options;const e=this.options.findIndex(({value:i})=>i===t.initialValue),s=e===-1?0:e;this.cursor=this.options[s].disabled?d(s,1,this.options):s,this.changeValue(),this.on("cursor",i=>{switch(i){case"left":case"up":this.cursor=d(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=d(this.cursor,1,this.options);break}this.changeValue()})}}class ot extends p{options;cursor=0;constructor(t){super(t,!1),this.options=t.options;const e=t.caseSensitive===!0,s=this.options.map(({value:[i]})=>e?i:i?.toLowerCase());this.cursor=Math.max(s.indexOf(t.initialValue),0),this.on("key",(i,n)=>{if(!i)return;const o=e&&n.shift?i.toUpperCase():i;if(!s.includes(o))return;const a=this.options.find(({value:[h]})=>e?h===o:h?.toLowerCase()===i);a&&(this.value=a.value,this.state="submit",this.emit("submit"))})}}class at extends p{get userInputWithCursor(){if(this.state==="submit")return this.userInput;const t=this.userInput;if(this.cursor>=t.length)return`${this.userInput}\u2588`;const e=t.slice(0,this.cursor),[s,...i]=t.slice(this.cursor);return`${e}${y("inverse",s)}${i.join("")}`}get cursor(){return this._cursor}constructor(t){super({...t,initialUserInput:t.initialUserInput??t.initialValue}),this.on("userInput",e=>{this._setValue(e)}),this.on("finalize",()=>{this.value||(this.value=t.defaultValue),this.value===void 0&&(this.value="")})}}export{H as AutocompletePrompt,Q as ConfirmPrompt,et as DatePrompt,st as GroupMultiSelectPrompt,it as MultiSelectPrompt,rt as PasswordPrompt,p as Prompt,ot as SelectKeyPrompt,nt as SelectPrompt,at as TextPrompt,z as block,O as getColumns,A as getRows,q as isCancel,u as settings,K as updateSettings,R as wrapTextWithPrefix};
|
|
11
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/utils/cursor.ts","../src/utils/settings.ts","../src/utils/string.ts","../src/utils/index.ts","../src/prompts/prompt.ts","../src/prompts/autocomplete.ts","../src/prompts/confirm.ts","../src/prompts/date.ts","../src/prompts/group-multiselect.ts","../src/prompts/multi-select.ts","../src/prompts/password.ts","../src/prompts/select.ts","../src/prompts/select-key.ts","../src/prompts/text.ts"],"sourcesContent":["export function findCursor<T extends { disabled?: boolean }>(\n\tcursor: number,\n\tdelta: number,\n\toptions: T[]\n) {\n\tconst hasEnabledOptions = options.some((opt) => !opt.disabled);\n\tif (!hasEnabledOptions) {\n\t\treturn cursor;\n\t}\n\tconst newCursor = cursor + delta;\n\tconst maxCursor = Math.max(options.length - 1, 0);\n\tconst clampedCursor = newCursor < 0 ? maxCursor : newCursor > maxCursor ? 0 : newCursor;\n\tconst newOption = options[clampedCursor];\n\tif (newOption.disabled) {\n\t\treturn findCursor(clampedCursor, delta < 0 ? -1 : 1, options);\n\t}\n\treturn clampedCursor;\n}\n","const actions = ['up', 'down', 'left', 'right', 'space', 'enter', 'cancel'] as const;\nexport type Action = (typeof actions)[number];\n\nconst DEFAULT_MONTH_NAMES = [\n\t'January',\n\t'February',\n\t'March',\n\t'April',\n\t'May',\n\t'June',\n\t'July',\n\t'August',\n\t'September',\n\t'October',\n\t'November',\n\t'December',\n];\n\n/** Global settings for Clack programs, stored in memory */\ninterface InternalClackSettings {\n\tactions: Set<Action>;\n\taliases: Map<string, Action>;\n\tmessages: {\n\t\tcancel: string;\n\t\terror: string;\n\t};\n\twithGuide: boolean;\n\tdate: {\n\t\tmonthNames: string[];\n\t\tmessages: {\n\t\t\tinvalidMonth: string;\n\t\t\trequired: string;\n\t\t\tinvalidDay: (days: number, month: string) => string;\n\t\t\tafterMin: (min: Date) => string;\n\t\t\tbeforeMax: (max: Date) => string;\n\t\t};\n\t};\n}\n\nexport const settings: InternalClackSettings = {\n\tactions: new Set(actions),\n\taliases: new Map<string, Action>([\n\t\t// vim support\n\t\t['k', 'up'],\n\t\t['j', 'down'],\n\t\t['h', 'left'],\n\t\t['l', 'right'],\n\t\t['\\x03', 'cancel'],\n\t\t// opinionated defaults!\n\t\t['escape', 'cancel'],\n\t]),\n\tmessages: {\n\t\tcancel: 'Canceled',\n\t\terror: 'Something went wrong',\n\t},\n\twithGuide: true,\n\tdate: {\n\t\tmonthNames: [...DEFAULT_MONTH_NAMES],\n\t\tmessages: {\n\t\t\trequired: 'Please enter a valid date',\n\t\t\tinvalidMonth: 'There are only 12 months in a year',\n\t\t\tinvalidDay: (days, month) => `There are only ${days} days in ${month}`,\n\t\t\tafterMin: (min) => `Date must be on or after ${min.toISOString().slice(0, 10)}`,\n\t\t\tbeforeMax: (max) => `Date must be on or before ${max.toISOString().slice(0, 10)}`,\n\t\t},\n\t},\n};\n\nexport interface ClackSettings {\n\t/**\n\t * Set custom global aliases for the default actions.\n\t * This will not overwrite existing aliases, it will only add new ones!\n\t *\n\t * @param aliases - An object that maps aliases to actions\n\t * @default { k: 'up', j: 'down', h: 'left', l: 'right', '\\x03': 'cancel', 'escape': 'cancel' }\n\t */\n\taliases?: Record<string, Action>;\n\n\t/**\n\t * Custom messages for prompts\n\t */\n\tmessages?: {\n\t\t/**\n\t\t * Custom message to display when a spinner is cancelled\n\t\t * @default \"Canceled\"\n\t\t */\n\t\tcancel?: string;\n\t\t/**\n\t\t * Custom message to display when a spinner encounters an error\n\t\t * @default \"Something went wrong\"\n\t\t */\n\t\terror?: string;\n\t};\n\n\twithGuide?: boolean;\n\n\t/**\n\t * Date prompt localization\n\t */\n\tdate?: {\n\t\t/** Month names for validation messages (January, February, ...) */\n\t\tmonthNames?: string[];\n\t\tmessages?: {\n\t\t\t/** Shown when date is missing */\n\t\t\trequired?: string;\n\t\t\t/** Shown when month > 12 */\n\t\t\tinvalidMonth?: string;\n\t\t\t/** (days, monthName) => message for invalid day */\n\t\t\tinvalidDay?: (days: number, month: string) => string;\n\t\t\t/** (min) => message when date is before minDate */\n\t\t\tafterMin?: (min: Date) => string;\n\t\t\t/** (max) => message when date is after maxDate */\n\t\t\tbeforeMax?: (max: Date) => string;\n\t\t};\n\t};\n}\n\nexport function updateSettings(updates: ClackSettings) {\n\t// Handle each property in the updates\n\tif (updates.aliases !== undefined) {\n\t\tconst aliases = updates.aliases;\n\t\tfor (const alias in aliases) {\n\t\t\tif (!Object.hasOwn(aliases, alias)) continue;\n\n\t\t\tconst action = aliases[alias];\n\t\t\tif (!settings.actions.has(action)) continue;\n\n\t\t\tif (!settings.aliases.has(alias)) {\n\t\t\t\tsettings.aliases.set(alias, action);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (updates.messages !== undefined) {\n\t\tconst messages = updates.messages;\n\t\tif (messages.cancel !== undefined) {\n\t\t\tsettings.messages.cancel = messages.cancel;\n\t\t}\n\t\tif (messages.error !== undefined) {\n\t\t\tsettings.messages.error = messages.error;\n\t\t}\n\t}\n\n\tif (updates.withGuide !== undefined) {\n\t\tsettings.withGuide = updates.withGuide !== false;\n\t}\n\n\tif (updates.date !== undefined) {\n\t\tconst date = updates.date;\n\t\tif (date.monthNames !== undefined) {\n\t\t\tsettings.date.monthNames = [...date.monthNames];\n\t\t}\n\t\tif (date.messages !== undefined) {\n\t\t\tif (date.messages.required !== undefined) {\n\t\t\t\tsettings.date.messages.required = date.messages.required;\n\t\t\t}\n\t\t\tif (date.messages.invalidMonth !== undefined) {\n\t\t\t\tsettings.date.messages.invalidMonth = date.messages.invalidMonth;\n\t\t\t}\n\t\t\tif (date.messages.invalidDay !== undefined) {\n\t\t\t\tsettings.date.messages.invalidDay = date.messages.invalidDay;\n\t\t\t}\n\t\t\tif (date.messages.afterMin !== undefined) {\n\t\t\t\tsettings.date.messages.afterMin = date.messages.afterMin;\n\t\t\t}\n\t\t\tif (date.messages.beforeMax !== undefined) {\n\t\t\t\tsettings.date.messages.beforeMax = date.messages.beforeMax;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Check if a key is an alias for a default action\n * @param key - The raw key which might match to an action\n * @param action - The action to match\n * @returns boolean\n */\nexport function isActionKey(key: string | Array<string | undefined>, action: Action) {\n\tif (typeof key === 'string') {\n\t\treturn settings.aliases.get(key) === action;\n\t}\n\n\tfor (const value of key) {\n\t\tif (value === undefined) continue;\n\t\tif (isActionKey(value, action)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n","export function diffLines(a: string, b: string) {\n\tif (a === b) return;\n\n\tconst aLines = a.split('\\n');\n\tconst bLines = b.split('\\n');\n\tconst numLines = Math.max(aLines.length, bLines.length);\n\tconst diff: number[] = [];\n\n\tfor (let i = 0; i < numLines; i++) {\n\t\tif (aLines[i] !== bLines[i]) diff.push(i);\n\t}\n\n\treturn {\n\t\tlines: diff,\n\t\tnumLinesBefore: aLines.length,\n\t\tnumLinesAfter: bLines.length,\n\t\tnumLines,\n\t};\n}\n","import { stdin, stdout } from 'node:process';\nimport type { Key } from 'node:readline';\nimport * as readline from 'node:readline';\nimport type { Readable, Writable } from 'node:stream';\nimport { ReadStream } from 'node:tty';\nimport { wrapAnsi } from 'fast-wrap-ansi';\nimport { cursor } from 'sisteransi';\nimport { isActionKey } from './settings.js';\n\nexport * from './settings.js';\nexport * from './string.js';\n\nconst isWindows = globalThis.process.platform.startsWith('win');\n\nexport const CANCEL_SYMBOL = Symbol('clack:cancel');\n\nexport function isCancel(value: unknown): value is symbol {\n\treturn value === CANCEL_SYMBOL;\n}\n\nexport function setRawMode(input: Readable, value: boolean) {\n\tconst i = input as typeof stdin;\n\n\tif (i.isTTY) i.setRawMode(value);\n}\n\ninterface BlockOptions {\n\tinput?: Readable;\n\toutput?: Writable;\n\toverwrite?: boolean;\n\thideCursor?: boolean;\n}\n\nexport function block({\n\tinput = stdin,\n\toutput = stdout,\n\toverwrite = true,\n\thideCursor = true,\n}: BlockOptions = {}) {\n\tconst rl = readline.createInterface({\n\t\tinput,\n\t\toutput,\n\t\tprompt: '',\n\t\ttabSize: 1,\n\t});\n\treadline.emitKeypressEvents(input, rl);\n\n\tif (input instanceof ReadStream && input.isTTY) {\n\t\tinput.setRawMode(true);\n\t}\n\n\tconst clear = (data: Buffer, { name, sequence }: Key) => {\n\t\tconst str = String(data);\n\t\tif (isActionKey([str, name, sequence], 'cancel')) {\n\t\t\tif (hideCursor) output.write(cursor.show);\n\t\t\tprocess.exit(0);\n\t\t\treturn;\n\t\t}\n\t\tif (!overwrite) return;\n\t\tconst dx = name === 'return' ? 0 : -1;\n\t\tconst dy = name === 'return' ? -1 : 0;\n\n\t\treadline.moveCursor(output, dx, dy, () => {\n\t\t\treadline.clearLine(output, 1, () => {\n\t\t\t\tinput.once('keypress', clear);\n\t\t\t});\n\t\t});\n\t};\n\tif (hideCursor) output.write(cursor.hide);\n\tinput.once('keypress', clear);\n\n\treturn () => {\n\t\tinput.off('keypress', clear);\n\t\tif (hideCursor) output.write(cursor.show);\n\n\t\t// Prevent Windows specific issues: https://github.com/bombshell-dev/clack/issues/176\n\t\tif (input instanceof ReadStream && input.isTTY && !isWindows) {\n\t\t\tinput.setRawMode(false);\n\t\t}\n\n\t\t// @ts-expect-error fix for https://github.com/nodejs/node/issues/31762#issuecomment-1441223907\n\t\trl.terminal = false;\n\t\trl.close();\n\t};\n}\n\nexport const getColumns = (output: Writable): number => {\n\tif ('columns' in output && typeof output.columns === 'number') {\n\t\treturn output.columns;\n\t}\n\treturn 80;\n};\n\nexport const getRows = (output: Writable): number => {\n\tif ('rows' in output && typeof output.rows === 'number') {\n\t\treturn output.rows;\n\t}\n\treturn 20;\n};\n\nexport function wrapTextWithPrefix(\n\toutput: Writable | undefined,\n\ttext: string,\n\tprefix: string,\n\tstartPrefix: string = prefix\n): string {\n\tconst columns = getColumns(output ?? stdout);\n\tconst wrapped = wrapAnsi(text, columns - prefix.length, {\n\t\thard: true,\n\t\ttrim: false,\n\t});\n\tconst lines = wrapped\n\t\t.split('\\n')\n\t\t.map((line, index) => {\n\t\t\treturn `${index === 0 ? startPrefix : prefix}${line}`;\n\t\t})\n\t\t.join('\\n');\n\treturn lines;\n}\n","import { stdin, stdout } from 'node:process';\nimport readline, { type Key, type ReadLine } from 'node:readline';\nimport type { Readable, Writable } from 'node:stream';\nimport { wrapAnsi } from 'fast-wrap-ansi';\nimport { cursor, erase } from 'sisteransi';\nimport type { ClackEvents, ClackState } from '../types.js';\nimport type { Action } from '../utils/index.js';\nimport {\n\tCANCEL_SYMBOL,\n\tdiffLines,\n\tgetRows,\n\tisActionKey,\n\tsetRawMode,\n\tsettings,\n} from '../utils/index.js';\n\nexport interface PromptOptions<TValue, Self extends Prompt<TValue>> {\n\trender(this: Omit<Self, 'prompt'>): string | undefined;\n\tinitialValue?: any;\n\tinitialUserInput?: string;\n\tvalidate?: ((value: TValue | undefined) => string | Error | undefined) | undefined;\n\tinput?: Readable;\n\toutput?: Writable;\n\tdebug?: boolean;\n\tsignal?: AbortSignal;\n}\n\nexport default class Prompt<TValue> {\n\tprotected input: Readable;\n\tprotected output: Writable;\n\tprivate _abortSignal?: AbortSignal;\n\n\tprivate rl: ReadLine | undefined;\n\tprivate opts: Omit<PromptOptions<TValue, Prompt<TValue>>, 'render' | 'input' | 'output'>;\n\tprivate _render: (context: Omit<Prompt<TValue>, 'prompt'>) => string | undefined;\n\tprivate _track = false;\n\tprivate _prevFrame = '';\n\tprivate _subscribers = new Map<string, { cb: (...args: any) => any; once?: boolean }[]>();\n\tprotected _cursor = 0;\n\n\tpublic state: ClackState = 'initial';\n\tpublic error = '';\n\tpublic value: TValue | undefined;\n\tpublic userInput = '';\n\n\tconstructor(options: PromptOptions<TValue, Prompt<TValue>>, trackValue = true) {\n\t\tconst { input = stdin, output = stdout, render, signal, ...opts } = options;\n\n\t\tthis.opts = opts;\n\t\tthis.onKeypress = this.onKeypress.bind(this);\n\t\tthis.close = this.close.bind(this);\n\t\tthis.render = this.render.bind(this);\n\t\tthis._render = render.bind(this);\n\t\tthis._track = trackValue;\n\t\tthis._abortSignal = signal;\n\n\t\tthis.input = input;\n\t\tthis.output = output;\n\t}\n\n\t/**\n\t * Unsubscribe all listeners\n\t */\n\tprotected unsubscribe() {\n\t\tthis._subscribers.clear();\n\t}\n\n\t/**\n\t * Set a subscriber with opts\n\t * @param event - The event name\n\t */\n\tprivate setSubscriber<T extends keyof ClackEvents<TValue>>(\n\t\tevent: T,\n\t\topts: { cb: ClackEvents<TValue>[T]; once?: boolean }\n\t) {\n\t\tconst params = this._subscribers.get(event) ?? [];\n\t\tparams.push(opts);\n\t\tthis._subscribers.set(event, params);\n\t}\n\n\t/**\n\t * Subscribe to an event\n\t * @param event - The event name\n\t * @param cb - The callback\n\t */\n\tpublic on<T extends keyof ClackEvents<TValue>>(event: T, cb: ClackEvents<TValue>[T]) {\n\t\tthis.setSubscriber(event, { cb });\n\t}\n\n\t/**\n\t * Subscribe to an event once\n\t * @param event - The event name\n\t * @param cb - The callback\n\t */\n\tpublic once<T extends keyof ClackEvents<TValue>>(event: T, cb: ClackEvents<TValue>[T]) {\n\t\tthis.setSubscriber(event, { cb, once: true });\n\t}\n\n\t/**\n\t * Emit an event with data\n\t * @param event - The event name\n\t * @param data - The data to pass to the callback\n\t */\n\tpublic emit<T extends keyof ClackEvents<TValue>>(\n\t\tevent: T,\n\t\t...data: Parameters<ClackEvents<TValue>[T]>\n\t) {\n\t\tconst cbs = this._subscribers.get(event) ?? [];\n\t\tconst cleanup: (() => void)[] = [];\n\n\t\tfor (const subscriber of cbs) {\n\t\t\tsubscriber.cb(...data);\n\n\t\t\tif (subscriber.once) {\n\t\t\t\tcleanup.push(() => cbs.splice(cbs.indexOf(subscriber), 1));\n\t\t\t}\n\t\t}\n\n\t\tfor (const cb of cleanup) {\n\t\t\tcb();\n\t\t}\n\t}\n\n\tpublic prompt() {\n\t\treturn new Promise<TValue | symbol | undefined>((resolve) => {\n\t\t\tif (this._abortSignal) {\n\t\t\t\tif (this._abortSignal.aborted) {\n\t\t\t\t\tthis.state = 'cancel';\n\n\t\t\t\t\tthis.close();\n\t\t\t\t\treturn resolve(CANCEL_SYMBOL);\n\t\t\t\t}\n\n\t\t\t\tthis._abortSignal.addEventListener(\n\t\t\t\t\t'abort',\n\t\t\t\t\t() => {\n\t\t\t\t\t\tthis.state = 'cancel';\n\t\t\t\t\t\tthis.close();\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true }\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.rl = readline.createInterface({\n\t\t\t\tinput: this.input,\n\t\t\t\ttabSize: 2,\n\t\t\t\tprompt: '',\n\t\t\t\tescapeCodeTimeout: 50,\n\t\t\t\tterminal: true,\n\t\t\t});\n\t\t\tthis.rl.prompt();\n\n\t\t\tif (this.opts.initialUserInput !== undefined) {\n\t\t\t\tthis._setUserInput(this.opts.initialUserInput, true);\n\t\t\t}\n\n\t\t\tthis.input.on('keypress', this.onKeypress);\n\t\t\tsetRawMode(this.input, true);\n\t\t\tthis.output.on('resize', this.render);\n\n\t\t\tthis.render();\n\n\t\t\tthis.once('submit', () => {\n\t\t\t\tthis.output.write(cursor.show);\n\t\t\t\tthis.output.off('resize', this.render);\n\t\t\t\tsetRawMode(this.input, false);\n\t\t\t\tresolve(this.value);\n\t\t\t});\n\t\t\tthis.once('cancel', () => {\n\t\t\t\tthis.output.write(cursor.show);\n\t\t\t\tthis.output.off('resize', this.render);\n\t\t\t\tsetRawMode(this.input, false);\n\t\t\t\tresolve(CANCEL_SYMBOL);\n\t\t\t});\n\t\t});\n\t}\n\n\tprotected _isActionKey(char: string | undefined, _key: Key): boolean {\n\t\treturn char === '\\t';\n\t}\n\n\tprotected _setValue(value: TValue | undefined): void {\n\t\tthis.value = value;\n\t\tthis.emit('value', this.value);\n\t}\n\n\tprotected _setUserInput(value: string | undefined, write?: boolean): void {\n\t\tthis.userInput = value ?? '';\n\t\tthis.emit('userInput', this.userInput);\n\t\tif (write && this._track && this.rl) {\n\t\t\tthis.rl.write(this.userInput);\n\t\t\tthis._cursor = this.rl.cursor;\n\t\t}\n\t}\n\n\tprotected _clearUserInput(): void {\n\t\tthis.rl?.write(null, { ctrl: true, name: 'u' });\n\t\tthis._setUserInput('');\n\t}\n\n\tprivate onKeypress(char: string | undefined, key: Key) {\n\t\tif (this._track && key.name !== 'return') {\n\t\t\tif (key.name && this._isActionKey(char, key)) {\n\t\t\t\tthis.rl?.write(null, { ctrl: true, name: 'h' });\n\t\t\t}\n\t\t\tthis._cursor = this.rl?.cursor ?? 0;\n\t\t\tthis._setUserInput(this.rl?.line);\n\t\t}\n\n\t\tif (this.state === 'error') {\n\t\t\tthis.state = 'active';\n\t\t}\n\t\tif (key?.name) {\n\t\t\tif (!this._track && settings.aliases.has(key.name)) {\n\t\t\t\tthis.emit('cursor', settings.aliases.get(key.name));\n\t\t\t}\n\t\t\tif (settings.actions.has(key.name as Action)) {\n\t\t\t\tthis.emit('cursor', key.name as Action);\n\t\t\t}\n\t\t}\n\t\tif (char && (char.toLowerCase() === 'y' || char.toLowerCase() === 'n')) {\n\t\t\tthis.emit('confirm', char.toLowerCase() === 'y');\n\t\t}\n\n\t\t// Call the key event handler and emit the key event\n\t\tthis.emit('key', char?.toLowerCase(), key);\n\n\t\tif (key?.name === 'return') {\n\t\t\tif (this.opts.validate) {\n\t\t\t\tconst problem = this.opts.validate(this.value);\n\t\t\t\tif (problem) {\n\t\t\t\t\tthis.error = problem instanceof Error ? problem.message : problem;\n\t\t\t\t\tthis.state = 'error';\n\t\t\t\t\tthis.rl?.write(this.userInput);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.state !== 'error') {\n\t\t\t\tthis.state = 'submit';\n\t\t\t}\n\t\t}\n\n\t\tif (isActionKey([char, key?.name, key?.sequence], 'cancel')) {\n\t\t\tthis.state = 'cancel';\n\t\t}\n\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\tthis.emit('finalize');\n\t\t}\n\t\tthis.render();\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\tprotected close() {\n\t\tthis.input.unpipe();\n\t\tthis.input.removeListener('keypress', this.onKeypress);\n\t\tthis.output.write('\\n');\n\t\tsetRawMode(this.input, false);\n\t\tthis.rl?.close();\n\t\tthis.rl = undefined;\n\t\tthis.emit(`${this.state}`, this.value);\n\t\tthis.unsubscribe();\n\t}\n\n\tprivate restoreCursor() {\n\t\tconst lines =\n\t\t\twrapAnsi(this._prevFrame, process.stdout.columns, { hard: true, trim: false }).split('\\n')\n\t\t\t\t.length - 1;\n\t\tthis.output.write(cursor.move(-999, lines * -1));\n\t}\n\n\tprivate render() {\n\t\tconst frame = wrapAnsi(this._render(this) ?? '', process.stdout.columns, {\n\t\t\thard: true,\n\t\t\ttrim: false,\n\t\t});\n\t\tif (frame === this._prevFrame) return;\n\n\t\tif (this.state === 'initial') {\n\t\t\tthis.output.write(cursor.hide);\n\t\t} else {\n\t\t\tconst diff = diffLines(this._prevFrame, frame);\n\t\t\tconst rows = getRows(this.output);\n\t\t\tthis.restoreCursor();\n\t\t\tif (diff) {\n\t\t\t\tconst diffOffsetAfter = Math.max(0, diff.numLinesAfter - rows);\n\t\t\t\tconst diffOffsetBefore = Math.max(0, diff.numLinesBefore - rows);\n\t\t\t\tlet diffLine = diff.lines.find((line) => line >= diffOffsetAfter);\n\n\t\t\t\tif (diffLine === undefined) {\n\t\t\t\t\tthis._prevFrame = frame;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// If a single line has changed, only update that line\n\t\t\t\tif (diff.lines.length === 1) {\n\t\t\t\t\tthis.output.write(cursor.move(0, diffLine - diffOffsetBefore));\n\t\t\t\t\tthis.output.write(erase.lines(1));\n\t\t\t\t\tconst lines = frame.split('\\n');\n\t\t\t\t\tthis.output.write(lines[diffLine]);\n\t\t\t\t\tthis._prevFrame = frame;\n\t\t\t\t\tthis.output.write(cursor.move(0, lines.length - diffLine - 1));\n\t\t\t\t\treturn;\n\t\t\t\t\t// If many lines have changed, rerender everything past the first line\n\t\t\t\t} else if (diff.lines.length > 1) {\n\t\t\t\t\tif (diffOffsetAfter < diffOffsetBefore) {\n\t\t\t\t\t\tdiffLine = diffOffsetAfter;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst adjustedDiffLine = diffLine - diffOffsetBefore;\n\t\t\t\t\t\tif (adjustedDiffLine > 0) {\n\t\t\t\t\t\t\tthis.output.write(cursor.move(0, adjustedDiffLine));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.output.write(erase.down());\n\t\t\t\t\tconst lines = frame.split('\\n');\n\t\t\t\t\tconst newLines = lines.slice(diffLine);\n\t\t\t\t\tthis.output.write(newLines.join('\\n'));\n\t\t\t\t\tthis._prevFrame = frame;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.output.write(erase.down());\n\t\t}\n\n\t\tthis.output.write(frame);\n\t\tif (this.state === 'initial') {\n\t\t\tthis.state = 'active';\n\t\t}\n\t\tthis._prevFrame = frame;\n\t}\n}\n","import type { Key } from 'node:readline';\nimport { styleText } from 'node:util';\nimport { findCursor } from '../utils/cursor.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\ninterface OptionLike {\n\tvalue: unknown;\n\tlabel?: string;\n\tdisabled?: boolean;\n}\n\ntype FilterFunction<T extends OptionLike> = (search: string, opt: T) => boolean;\n\nfunction getCursorForValue<T extends OptionLike>(\n\tselected: T['value'] | undefined,\n\titems: T[]\n): number {\n\tif (selected === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst currLength = items.length;\n\n\t// If filtering changed the available options, update cursor\n\tif (currLength === 0) {\n\t\treturn 0;\n\t}\n\n\t// Try to maintain the same selected item\n\tconst index = items.findIndex((item) => item.value === selected);\n\treturn index !== -1 ? index : 0;\n}\n\nfunction defaultFilter<T extends OptionLike>(input: string, option: T): boolean {\n\tconst label = option.label ?? String(option.value);\n\treturn label.toLowerCase().includes(input.toLowerCase());\n}\n\nfunction normalisedValue<T>(multiple: boolean, values: T[] | undefined): T | T[] | undefined {\n\tif (!values) {\n\t\treturn undefined;\n\t}\n\tif (multiple) {\n\t\treturn values;\n\t}\n\treturn values[0];\n}\n\nexport interface AutocompleteOptions<T extends OptionLike>\n\textends PromptOptions<T['value'] | T['value'][], AutocompletePrompt<T>> {\n\toptions: T[] | ((this: AutocompletePrompt<T>) => T[]);\n\tfilter?: FilterFunction<T>;\n\tmultiple?: boolean;\n\t/**\n\t * When set (non-empty), pressing Tab with no input fills the field with this value\n\t * and runs the normal filter/selection logic so the user can confirm with Enter.\n\t * Tab only fills the input when the placeholder matches at least one option under\n\t * the prompt's filter (so the value remains selectable).\n\t */\n\tplaceholder?: string;\n}\n\nexport default class AutocompletePrompt<T extends OptionLike> extends Prompt<\n\tT['value'] | T['value'][]\n> {\n\tfilteredOptions: T[];\n\tmultiple: boolean;\n\tisNavigating = false;\n\tselectedValues: Array<T['value']> = [];\n\n\tfocusedValue: T['value'] | undefined;\n\t#cursor = 0;\n\t#lastUserInput = '';\n\t#filterFn: FilterFunction<T> | undefined;\n\t#options: T[] | (() => T[]);\n\t#placeholder: string | undefined;\n\n\tget cursor(): number {\n\t\treturn this.#cursor;\n\t}\n\n\tget userInputWithCursor() {\n\t\tif (!this.userInput) {\n\t\t\treturn styleText(['inverse', 'hidden'], '_');\n\t\t}\n\t\tif (this._cursor >= this.userInput.length) {\n\t\t\treturn `${this.userInput}█`;\n\t\t}\n\t\tconst s1 = this.userInput.slice(0, this._cursor);\n\t\tconst [s2, ...s3] = this.userInput.slice(this._cursor);\n\t\treturn `${s1}${styleText('inverse', s2)}${s3.join('')}`;\n\t}\n\n\tget options(): T[] {\n\t\tif (typeof this.#options === 'function') {\n\t\t\treturn this.#options();\n\t\t}\n\t\treturn this.#options;\n\t}\n\n\tconstructor(opts: AutocompleteOptions<T>) {\n\t\tsuper(opts);\n\n\t\tthis.#options = opts.options;\n\t\tthis.#placeholder = opts.placeholder;\n\t\tconst options = this.options;\n\t\tthis.filteredOptions = [...options];\n\t\tthis.multiple = opts.multiple === true;\n\t\tthis.#filterFn =\n\t\t\ttypeof opts.options === 'function' ? opts.filter : (opts.filter ?? defaultFilter);\n\t\tlet initialValues: unknown[] | undefined;\n\t\tif (opts.initialValue && Array.isArray(opts.initialValue)) {\n\t\t\tif (this.multiple) {\n\t\t\t\tinitialValues = opts.initialValue;\n\t\t\t} else {\n\t\t\t\tinitialValues = opts.initialValue.slice(0, 1);\n\t\t\t}\n\t\t} else {\n\t\t\tif (!this.multiple && this.options.length > 0) {\n\t\t\t\tinitialValues = [this.options[0].value];\n\t\t\t}\n\t\t}\n\n\t\tif (initialValues) {\n\t\t\tfor (const selectedValue of initialValues) {\n\t\t\t\tconst selectedIndex = options.findIndex((opt) => opt.value === selectedValue);\n\t\t\t\tif (selectedIndex !== -1) {\n\t\t\t\t\tthis.toggleSelected(selectedValue);\n\t\t\t\t\tthis.#cursor = selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.focusedValue = this.options[this.#cursor]?.value;\n\n\t\tthis.on('key', (char, key) => this.#onKey(char, key));\n\t\tthis.on('userInput', (value) => this.#onUserInputChanged(value));\n\t}\n\n\tprotected override _isActionKey(char: string | undefined, key: Key): boolean {\n\t\treturn (\n\t\t\tchar === '\\t' ||\n\t\t\t(this.multiple &&\n\t\t\t\tthis.isNavigating &&\n\t\t\t\tkey.name === 'space' &&\n\t\t\t\tchar !== undefined &&\n\t\t\t\tchar !== '')\n\t\t);\n\t}\n\n\t#onKey(_char: string | undefined, key: Key): void {\n\t\tconst isUpKey = key.name === 'up';\n\t\tconst isDownKey = key.name === 'down';\n\t\tconst isReturnKey = key.name === 'return';\n\n\t\t// Tab with empty input and placeholder: fill input with placeholder to trigger autocomplete\n\t\t// Only when the placeholder matches at least one (non-disabled) option so the value remains selectable\n\t\tconst isEmptyOrOnlyTab = this.userInput === '' || this.userInput === '\\t';\n\t\tconst placeholder = this.#placeholder;\n\t\tconst options = this.options;\n\t\tconst placeholderMatchesOption =\n\t\t\tplaceholder !== undefined &&\n\t\t\tplaceholder !== '' &&\n\t\t\toptions.some(\n\t\t\t\t(opt) => !opt.disabled && (this.#filterFn ? this.#filterFn(placeholder, opt) : true)\n\t\t\t);\n\t\tif (key.name === 'tab' && isEmptyOrOnlyTab && placeholderMatchesOption) {\n\t\t\tif (this.userInput === '\\t') {\n\t\t\t\tthis._clearUserInput();\n\t\t\t}\n\t\t\tthis._setUserInput(placeholder, true);\n\t\t\tthis.isNavigating = false;\n\t\t\treturn;\n\t\t}\n\n\t\t// Start navigation mode with up/down arrows\n\t\tif (isUpKey || isDownKey) {\n\t\t\tthis.#cursor = findCursor(this.#cursor, isUpKey ? -1 : 1, this.filteredOptions);\n\t\t\tthis.focusedValue = this.filteredOptions[this.#cursor]?.value;\n\t\t\tif (!this.multiple) {\n\t\t\t\tthis.selectedValues = [this.focusedValue];\n\t\t\t}\n\t\t\tthis.isNavigating = true;\n\t\t} else if (isReturnKey) {\n\t\t\tthis.value = normalisedValue(this.multiple, this.selectedValues);\n\t\t} else {\n\t\t\tif (this.multiple) {\n\t\t\t\tif (\n\t\t\t\t\tthis.focusedValue !== undefined &&\n\t\t\t\t\t(key.name === 'tab' || (this.isNavigating && key.name === 'space'))\n\t\t\t\t) {\n\t\t\t\t\tthis.toggleSelected(this.focusedValue);\n\t\t\t\t} else {\n\t\t\t\t\tthis.isNavigating = false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.focusedValue) {\n\t\t\t\t\tthis.selectedValues = [this.focusedValue];\n\t\t\t\t}\n\t\t\t\tthis.isNavigating = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tdeselectAll() {\n\t\tthis.selectedValues = [];\n\t}\n\n\ttoggleSelected(value: T['value']) {\n\t\tif (this.filteredOptions.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.multiple) {\n\t\t\tif (this.selectedValues.includes(value)) {\n\t\t\t\tthis.selectedValues = this.selectedValues.filter((v) => v !== value);\n\t\t\t} else {\n\t\t\t\tthis.selectedValues = [...this.selectedValues, value];\n\t\t\t}\n\t\t} else {\n\t\t\tthis.selectedValues = [value];\n\t\t}\n\t}\n\n\t#onUserInputChanged(value: string): void {\n\t\tif (value !== this.#lastUserInput) {\n\t\t\tthis.#lastUserInput = value;\n\n\t\t\tconst options = this.options;\n\n\t\t\tif (value && this.#filterFn) {\n\t\t\t\tthis.filteredOptions = options.filter((opt) => this.#filterFn?.(value, opt));\n\t\t\t} else {\n\t\t\t\tthis.filteredOptions = [...options];\n\t\t\t}\n\t\t\tconst valueCursor = getCursorForValue(this.focusedValue, this.filteredOptions);\n\t\t\tthis.#cursor = findCursor(valueCursor, 0, this.filteredOptions);\n\t\t\tconst focusedOption = this.filteredOptions[this.#cursor];\n\t\t\tif (focusedOption && !focusedOption.disabled) {\n\t\t\t\tthis.focusedValue = focusedOption.value;\n\t\t\t} else {\n\t\t\t\tthis.focusedValue = undefined;\n\t\t\t}\n\t\t\tif (!this.multiple) {\n\t\t\t\tif (this.focusedValue !== undefined) {\n\t\t\t\t\tthis.toggleSelected(this.focusedValue);\n\t\t\t\t} else {\n\t\t\t\t\tthis.deselectAll();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import { cursor } from 'sisteransi';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface ConfirmOptions extends PromptOptions<boolean, ConfirmPrompt> {\n\tactive: string;\n\tinactive: string;\n\tinitialValue?: boolean;\n}\n\nexport default class ConfirmPrompt extends Prompt<boolean> {\n\tget cursor() {\n\t\treturn this.value ? 0 : 1;\n\t}\n\n\tprivate get _value() {\n\t\treturn this.cursor === 0;\n\t}\n\n\tconstructor(opts: ConfirmOptions) {\n\t\tsuper(opts, false);\n\t\tthis.value = !!opts.initialValue;\n\n\t\tthis.on('userInput', () => {\n\t\t\tthis.value = this._value;\n\t\t});\n\n\t\tthis.on('confirm', (confirm) => {\n\t\t\tthis.output.write(cursor.move(0, -1));\n\t\t\tthis.value = confirm;\n\t\t\tthis.state = 'submit';\n\t\t\tthis.close();\n\t\t});\n\n\t\tthis.on('cursor', () => {\n\t\t\tthis.value = !this.value;\n\t\t});\n\t}\n}\n","import type { Key } from 'node:readline';\nimport { settings } from '../utils/settings.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\ninterface SegmentConfig {\n\ttype: 'year' | 'month' | 'day';\n\tlen: number;\n}\n\nexport interface DateParts {\n\tyear: string;\n\tmonth: string;\n\tday: string;\n}\n\nexport type DateFormat = 'YMD' | 'MDY' | 'DMY';\n\nconst SEGMENTS: Record<string, SegmentConfig> = {\n\tY: { type: 'year', len: 4 },\n\tM: { type: 'month', len: 2 },\n\tD: { type: 'day', len: 2 },\n} as const;\n\nfunction segmentsFor(fmt: DateFormat): SegmentConfig[] {\n\treturn [...fmt].map((c) => SEGMENTS[c as keyof typeof SEGMENTS]);\n}\n\nfunction detectLocaleFormat(locale?: string): { segments: SegmentConfig[]; separator: string } {\n\tconst fmt = new Intl.DateTimeFormat(locale, {\n\t\tyear: 'numeric',\n\t\tmonth: '2-digit',\n\t\tday: '2-digit',\n\t});\n\tconst parts = fmt.formatToParts(new Date(2000, 0, 15));\n\tconst segments: SegmentConfig[] = [];\n\tlet separator = '/';\n\tfor (const p of parts) {\n\t\tif (p.type === 'literal') {\n\t\t\tseparator = p.value.trim() || p.value;\n\t\t} else if (p.type === 'year' || p.type === 'month' || p.type === 'day') {\n\t\t\tsegments.push({ type: p.type, len: p.type === 'year' ? 4 : 2 });\n\t\t}\n\t}\n\treturn { segments, separator };\n}\n\n/** Parse string segment values to numbers, treating blanks as 0 */\nfunction parseSegmentToNum(s: string): number {\n\treturn Number.parseInt((s || '0').replace(/_/g, '0'), 10) || 0;\n}\n\nfunction parse(parts: DateParts): { year: number; month: number; day: number } {\n\treturn {\n\t\tyear: parseSegmentToNum(parts.year),\n\t\tmonth: parseSegmentToNum(parts.month),\n\t\tday: parseSegmentToNum(parts.day),\n\t};\n}\n\nfunction daysInMonth(year: number, month: number): number {\n\treturn new Date(year || 2001, month || 1, 0).getDate();\n}\n\n/** Validate and return calendar parts, or undefined if invalid */\nfunction validParts(parts: DateParts): { year: number; month: number; day: number } | undefined {\n\tconst { year, month, day } = parse(parts);\n\tif (!year || year < 0 || year > 9999) return undefined;\n\tif (!month || month < 1 || month > 12) return undefined;\n\tif (!day || day < 1) return undefined;\n\tconst d = new Date(Date.UTC(year, month - 1, day));\n\tif (d.getUTCFullYear() !== year || d.getUTCMonth() !== month - 1 || d.getUTCDate() !== day)\n\t\treturn undefined;\n\treturn { year, month, day };\n}\n\nfunction toDate(parts: DateParts): Date | undefined {\n\tconst p = validParts(parts);\n\treturn p ? new Date(Date.UTC(p.year, p.month - 1, p.day)) : undefined;\n}\n\nfunction segmentBounds(\n\ttype: 'year' | 'month' | 'day',\n\tctx: { year: number; month: number },\n\tminDate: Date | undefined,\n\tmaxDate: Date | undefined\n): { min: number; max: number } {\n\tconst minP = minDate\n\t\t? {\n\t\t\t\tyear: minDate.getUTCFullYear(),\n\t\t\t\tmonth: minDate.getUTCMonth() + 1,\n\t\t\t\tday: minDate.getUTCDate(),\n\t\t\t}\n\t\t: null;\n\tconst maxP = maxDate\n\t\t? {\n\t\t\t\tyear: maxDate.getUTCFullYear(),\n\t\t\t\tmonth: maxDate.getUTCMonth() + 1,\n\t\t\t\tday: maxDate.getUTCDate(),\n\t\t\t}\n\t\t: null;\n\n\tif (type === 'year') {\n\t\treturn { min: minP?.year ?? 1, max: maxP?.year ?? 9999 };\n\t}\n\tif (type === 'month') {\n\t\treturn {\n\t\t\tmin: minP && ctx.year === minP.year ? minP.month : 1,\n\t\t\tmax: maxP && ctx.year === maxP.year ? maxP.month : 12,\n\t\t};\n\t}\n\treturn {\n\t\tmin: minP && ctx.year === minP.year && ctx.month === minP.month ? minP.day : 1,\n\t\tmax:\n\t\t\tmaxP && ctx.year === maxP.year && ctx.month === maxP.month\n\t\t\t\t? maxP.day\n\t\t\t\t: daysInMonth(ctx.year, ctx.month),\n\t};\n}\n\nexport interface DateOptions extends PromptOptions<Date, DatePrompt> {\n\tformat?: DateFormat;\n\tlocale?: string;\n\tseparator?: string;\n\tdefaultValue?: Date;\n\tinitialValue?: Date;\n\tminDate?: Date;\n\tmaxDate?: Date;\n}\n\nexport default class DatePrompt extends Prompt<Date> {\n\t#segments: SegmentConfig[];\n\t#separator: string;\n\t#segmentValues: DateParts;\n\t#minDate: Date | undefined;\n\t#maxDate: Date | undefined;\n\t#cursor = { segmentIndex: 0, positionInSegment: 0 };\n\t#segmentSelected = true;\n\t#pendingTensDigit: string | null = null;\n\n\tinlineError = '';\n\n\tget segmentCursor() {\n\t\treturn { ...this.#cursor };\n\t}\n\n\tget segmentValues(): DateParts {\n\t\treturn { ...this.#segmentValues };\n\t}\n\n\tget segments(): readonly SegmentConfig[] {\n\t\treturn this.#segments;\n\t}\n\n\tget separator(): string {\n\t\treturn this.#separator;\n\t}\n\n\tget formattedValue(): string {\n\t\treturn this.#format(this.#segmentValues);\n\t}\n\n\t#format(parts: DateParts): string {\n\t\treturn this.#segments.map((s) => parts[s.type]).join(this.#separator);\n\t}\n\n\t#refresh() {\n\t\tthis._setUserInput(this.#format(this.#segmentValues));\n\t\tthis._setValue(toDate(this.#segmentValues) ?? undefined);\n\t}\n\n\tconstructor(opts: DateOptions) {\n\t\tconst detected = opts.format\n\t\t\t? { segments: segmentsFor(opts.format), separator: opts.separator ?? '/' }\n\t\t\t: detectLocaleFormat(opts.locale);\n\t\tconst sep = opts.separator ?? detected.separator;\n\t\tconst segments = opts.format ? segmentsFor(opts.format) : detected.segments;\n\n\t\tconst initialDate = opts.initialValue ?? opts.defaultValue;\n\t\tconst segmentValues: DateParts = initialDate\n\t\t\t? {\n\t\t\t\t\tyear: String(initialDate.getUTCFullYear()).padStart(4, '0'),\n\t\t\t\t\tmonth: String(initialDate.getUTCMonth() + 1).padStart(2, '0'),\n\t\t\t\t\tday: String(initialDate.getUTCDate()).padStart(2, '0'),\n\t\t\t\t}\n\t\t\t: { year: '____', month: '__', day: '__' };\n\n\t\tconst initialDisplay = segments.map((s) => segmentValues[s.type]).join(sep);\n\n\t\tsuper({ ...opts, initialUserInput: initialDisplay }, false);\n\t\tthis.#segments = segments;\n\t\tthis.#separator = sep;\n\t\tthis.#segmentValues = segmentValues;\n\t\tthis.#minDate = opts.minDate;\n\t\tthis.#maxDate = opts.maxDate;\n\t\tthis.#refresh();\n\n\t\tthis.on('cursor', (key) => this.#onCursor(key));\n\t\tthis.on('key', (char, key) => this.#onKey(char, key));\n\t\tthis.on('finalize', () => this.#onFinalize(opts));\n\t}\n\n\t#seg(): { segment: SegmentConfig; index: number } | undefined {\n\t\tconst index = Math.max(0, Math.min(this.#cursor.segmentIndex, this.#segments.length - 1));\n\t\tconst segment = this.#segments[index];\n\t\tif (!segment) return undefined;\n\t\tthis.#cursor.positionInSegment = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.#cursor.positionInSegment, segment.len - 1)\n\t\t);\n\t\treturn { segment, index };\n\t}\n\n\t#navigate(direction: 1 | -1) {\n\t\tthis.inlineError = '';\n\t\tthis.#pendingTensDigit = null;\n\t\tconst ctx = this.#seg();\n\t\tif (!ctx) return;\n\t\tthis.#cursor.segmentIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.#segments.length - 1, ctx.index + direction)\n\t\t);\n\t\tthis.#cursor.positionInSegment = 0;\n\t\tthis.#segmentSelected = true;\n\t}\n\n\t#adjust(direction: 1 | -1) {\n\t\tconst ctx = this.#seg();\n\t\tif (!ctx) return;\n\t\tconst { segment } = ctx;\n\t\tconst raw = this.#segmentValues[segment.type];\n\t\tconst isBlank = !raw || raw.replace(/_/g, '') === '';\n\t\tconst num = Number.parseInt((raw || '0').replace(/_/g, '0'), 10) || 0;\n\t\tconst bounds = segmentBounds(\n\t\t\tsegment.type,\n\t\t\tparse(this.#segmentValues),\n\t\t\tthis.#minDate,\n\t\t\tthis.#maxDate\n\t\t);\n\n\t\tlet next: number;\n\t\tif (isBlank) {\n\t\t\tnext = direction === 1 ? bounds.min : bounds.max;\n\t\t} else {\n\t\t\tnext = Math.max(Math.min(bounds.max, num + direction), bounds.min);\n\t\t}\n\n\t\tthis.#segmentValues = {\n\t\t\t...this.#segmentValues,\n\t\t\t[segment.type]: next.toString().padStart(segment.len, '0'),\n\t\t};\n\t\tthis.#segmentSelected = true;\n\t\tthis.#pendingTensDigit = null;\n\t\tthis.#refresh();\n\t}\n\n\t#onCursor(key?: string) {\n\t\tif (!key) return;\n\t\tswitch (key) {\n\t\t\tcase 'right':\n\t\t\t\treturn this.#navigate(1);\n\t\t\tcase 'left':\n\t\t\t\treturn this.#navigate(-1);\n\t\t\tcase 'up':\n\t\t\t\treturn this.#adjust(1);\n\t\t\tcase 'down':\n\t\t\t\treturn this.#adjust(-1);\n\t\t}\n\t}\n\n\t#onKey(char: string | undefined, key: Key) {\n\t\t// Backspace\n\t\tconst isBackspace =\n\t\t\tkey?.name === 'backspace' ||\n\t\t\tkey?.sequence === '\\x7f' ||\n\t\t\tkey?.sequence === '\\b' ||\n\t\t\tchar === '\\x7f' ||\n\t\t\tchar === '\\b';\n\t\tif (isBackspace) {\n\t\t\tthis.inlineError = '';\n\t\t\tconst ctx = this.#seg();\n\t\t\tif (!ctx) return;\n\t\t\tif (!this.#segmentValues[ctx.segment.type].replace(/_/g, '')) {\n\t\t\t\tthis.#navigate(-1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#segmentValues[ctx.segment.type] = '_'.repeat(ctx.segment.len);\n\t\t\tthis.#segmentSelected = true;\n\t\t\tthis.#cursor.positionInSegment = 0;\n\t\t\tthis.#refresh();\n\t\t\treturn;\n\t\t}\n\n\t\t// Tab navigation\n\t\tif (key?.name === 'tab') {\n\t\t\tthis.inlineError = '';\n\t\t\tconst ctx = this.#seg();\n\t\t\tif (!ctx) return;\n\t\t\tconst dir = key.shift ? -1 : 1;\n\t\t\tconst next = ctx.index + dir;\n\t\t\tif (next >= 0 && next < this.#segments.length) {\n\t\t\t\tthis.#cursor.segmentIndex = next;\n\t\t\t\tthis.#cursor.positionInSegment = 0;\n\t\t\t\tthis.#segmentSelected = true;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Digit input\n\t\tif (char && /^[0-9]$/.test(char)) {\n\t\t\tconst ctx = this.#seg();\n\t\t\tif (!ctx) return;\n\t\t\tconst { segment } = ctx;\n\t\t\tconst isBlank = !this.#segmentValues[segment.type].replace(/_/g, '');\n\n\t\t\t// Pending tens digit: complete the two-digit entry\n\t\t\tif (this.#segmentSelected && this.#pendingTensDigit !== null && !isBlank) {\n\t\t\t\tconst newVal = this.#pendingTensDigit + char;\n\t\t\t\tconst newParts = { ...this.#segmentValues, [segment.type]: newVal };\n\t\t\t\tconst err = this.#validateSegment(newParts, segment);\n\t\t\t\tif (err) {\n\t\t\t\t\tthis.inlineError = err;\n\t\t\t\t\tthis.#pendingTensDigit = null;\n\t\t\t\t\tthis.#segmentSelected = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.inlineError = '';\n\t\t\t\tthis.#segmentValues[segment.type] = newVal;\n\t\t\t\tthis.#pendingTensDigit = null;\n\t\t\t\tthis.#segmentSelected = false;\n\t\t\t\tthis.#refresh();\n\t\t\t\tif (ctx.index < this.#segments.length - 1) {\n\t\t\t\t\tthis.#cursor.segmentIndex = ctx.index + 1;\n\t\t\t\t\tthis.#cursor.positionInSegment = 0;\n\t\t\t\t\tthis.#segmentSelected = true;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Clear-on-type: typing into a selected filled segment clears it first\n\t\t\tif (this.#segmentSelected && !isBlank) {\n\t\t\t\tthis.#segmentValues[segment.type] = '_'.repeat(segment.len);\n\t\t\t\tthis.#cursor.positionInSegment = 0;\n\t\t\t}\n\t\t\tthis.#segmentSelected = false;\n\t\t\tthis.#pendingTensDigit = null;\n\n\t\t\tconst display = this.#segmentValues[segment.type];\n\t\t\tconst firstBlank = display.indexOf('_');\n\t\t\tconst pos =\n\t\t\t\tfirstBlank >= 0 ? firstBlank : Math.min(this.#cursor.positionInSegment, segment.len - 1);\n\t\t\tif (pos < 0 || pos >= segment.len) return;\n\n\t\t\tlet newVal = display.slice(0, pos) + char + display.slice(pos + 1);\n\n\t\t\t// Smart digit placement\n\t\t\tlet shouldStaySelected = false;\n\t\t\tif (pos === 0 && display === '__' && (segment.type === 'month' || segment.type === 'day')) {\n\t\t\t\tconst digit = Number.parseInt(char, 10);\n\t\t\t\tnewVal = `0${char}`;\n\t\t\t\tshouldStaySelected = digit <= (segment.type === 'month' ? 1 : 2);\n\t\t\t}\n\t\t\tif (segment.type === 'year') {\n\t\t\t\tconst digits = display.replace(/_/g, '');\n\t\t\t\tnewVal = (digits + char).padStart(segment.len, '_');\n\t\t\t}\n\n\t\t\tif (!newVal.includes('_')) {\n\t\t\t\tconst newParts = { ...this.#segmentValues, [segment.type]: newVal };\n\t\t\t\tconst err = this.#validateSegment(newParts, segment);\n\t\t\t\tif (err) {\n\t\t\t\t\tthis.inlineError = err;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.inlineError = '';\n\n\t\t\tthis.#segmentValues[segment.type] = newVal;\n\n\t\t\t// Clamp only when the current segment is fully entered\n\t\t\tconst parsed = !newVal.includes('_') ? validParts(this.#segmentValues) : undefined;\n\t\t\tif (parsed) {\n\t\t\t\tconst { year, month } = parsed;\n\t\t\t\tconst maxDay = daysInMonth(year, month);\n\t\t\t\tthis.#segmentValues = {\n\t\t\t\t\tyear: String(Math.max(0, Math.min(9999, year))).padStart(4, '0'),\n\t\t\t\t\tmonth: String(Math.max(1, Math.min(12, month))).padStart(2, '0'),\n\t\t\t\t\tday: String(Math.max(1, Math.min(maxDay, parsed.day))).padStart(2, '0'),\n\t\t\t\t};\n\t\t\t}\n\t\t\tthis.#refresh();\n\n\t\t\t// Advance cursor\n\t\t\tconst nextBlank = newVal.indexOf('_');\n\t\t\tif (shouldStaySelected) {\n\t\t\t\tthis.#segmentSelected = true;\n\t\t\t\tthis.#pendingTensDigit = char;\n\t\t\t} else if (nextBlank >= 0) {\n\t\t\t\tthis.#cursor.positionInSegment = nextBlank;\n\t\t\t} else if (firstBlank >= 0 && ctx.index < this.#segments.length - 1) {\n\t\t\t\tthis.#cursor.segmentIndex = ctx.index + 1;\n\t\t\t\tthis.#cursor.positionInSegment = 0;\n\t\t\t\tthis.#segmentSelected = true;\n\t\t\t} else {\n\t\t\t\tthis.#cursor.positionInSegment = Math.min(pos + 1, segment.len - 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t#validateSegment(parts: DateParts, seg: SegmentConfig): string | undefined {\n\t\tconst { month, day } = parse(parts);\n\t\tif (seg.type === 'month' && (month < 0 || month > 12)) {\n\t\t\treturn settings.date.messages.invalidMonth;\n\t\t}\n\t\tif (seg.type === 'day' && (day < 0 || day > 31)) {\n\t\t\treturn settings.date.messages.invalidDay(31, 'any month');\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t#onFinalize(opts: DateOptions) {\n\t\tconst { year, month, day } = parse(this.#segmentValues);\n\t\tif (year && month && day) {\n\t\t\tconst maxDay = daysInMonth(year, month);\n\t\t\tthis.#segmentValues = {\n\t\t\t\t...this.#segmentValues,\n\t\t\t\tday: String(Math.min(day, maxDay)).padStart(2, '0'),\n\t\t\t};\n\t\t}\n\t\tthis.value = toDate(this.#segmentValues) ?? opts.defaultValue ?? undefined;\n\t}\n}\n","import Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface GroupMultiSelectOptions<T extends { value: any }>\n\textends PromptOptions<T['value'][], GroupMultiSelectPrompt<T>> {\n\toptions: Record<string, T[]>;\n\tinitialValues?: T['value'][];\n\trequired?: boolean;\n\tcursorAt?: T['value'];\n\tselectableGroups?: boolean;\n}\nexport default class GroupMultiSelectPrompt<T extends { value: any }> extends Prompt<T['value'][]> {\n\toptions: (T & { group: string | boolean })[];\n\tcursor = 0;\n\t#selectableGroups: boolean;\n\n\tgetGroupItems(group: string): T[] {\n\t\treturn this.options.filter((o) => o.group === group);\n\t}\n\n\tisGroupSelected(group: string) {\n\t\tconst items = this.getGroupItems(group);\n\t\tconst value = this.value;\n\t\tif (value === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\treturn items.every((i) => value.includes(i.value));\n\t}\n\n\tprivate toggleValue() {\n\t\tconst item = this.options[this.cursor];\n\t\tif (this.value === undefined) {\n\t\t\tthis.value = [];\n\t\t}\n\t\tif (item.group === true) {\n\t\t\tconst group = item.value;\n\t\t\tconst groupedItems = this.getGroupItems(group);\n\t\t\tif (this.isGroupSelected(group)) {\n\t\t\t\tthis.value = this.value.filter(\n\t\t\t\t\t(v: string) => groupedItems.findIndex((i) => i.value === v) === -1\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.value = [...this.value, ...groupedItems.map((i) => i.value)];\n\t\t\t}\n\t\t\tthis.value = Array.from(new Set(this.value));\n\t\t} else {\n\t\t\tconst selected = this.value.includes(item.value);\n\t\t\tthis.value = selected\n\t\t\t\t? this.value.filter((v: T['value']) => v !== item.value)\n\t\t\t\t: [...this.value, item.value];\n\t\t}\n\t}\n\n\tconstructor(opts: GroupMultiSelectOptions<T>) {\n\t\tsuper(opts, false);\n\t\tconst { options } = opts;\n\t\tthis.#selectableGroups = opts.selectableGroups !== false;\n\t\tthis.options = Object.entries(options).flatMap(([key, option]) => [\n\t\t\t{ value: key, group: true, label: key },\n\t\t\t...option.map((opt) => ({ ...opt, group: key })),\n\t\t]) as any;\n\t\tthis.value = [...(opts.initialValues ?? [])];\n\t\tthis.cursor = Math.max(\n\t\t\tthis.options.findIndex(({ value }) => value === opts.cursorAt),\n\t\t\tthis.#selectableGroups ? 0 : 1\n\t\t);\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up': {\n\t\t\t\t\tthis.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;\n\t\t\t\t\tconst currentIsGroup = this.options[this.cursor]?.group === true;\n\t\t\t\t\tif (!this.#selectableGroups && currentIsGroup) {\n\t\t\t\t\t\tthis.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right': {\n\t\t\t\t\tthis.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;\n\t\t\t\t\tconst currentIsGroup = this.options[this.cursor]?.group === true;\n\t\t\t\t\tif (!this.#selectableGroups && currentIsGroup) {\n\t\t\t\t\t\tthis.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'space':\n\t\t\t\t\tthis.toggleValue();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n}\n","import { findCursor } from '../utils/cursor.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\ninterface OptionLike {\n\tvalue: any;\n\tdisabled?: boolean;\n}\n\nexport interface MultiSelectOptions<T extends OptionLike>\n\textends PromptOptions<T['value'][], MultiSelectPrompt<T>> {\n\toptions: T[];\n\tinitialValues?: T['value'][];\n\trequired?: boolean;\n\tcursorAt?: T['value'];\n}\nexport default class MultiSelectPrompt<T extends OptionLike> extends Prompt<T['value'][]> {\n\toptions: T[];\n\tcursor = 0;\n\n\tprivate get _value(): T['value'] {\n\t\treturn this.options[this.cursor].value;\n\t}\n\n\tprivate get _enabledOptions(): T[] {\n\t\treturn this.options.filter((option) => option.disabled !== true);\n\t}\n\n\tprivate toggleAll() {\n\t\tconst enabledOptions = this._enabledOptions;\n\t\tconst allSelected = this.value !== undefined && this.value.length === enabledOptions.length;\n\t\tthis.value = allSelected ? [] : enabledOptions.map((v) => v.value);\n\t}\n\n\tprivate toggleInvert() {\n\t\tconst value = this.value;\n\t\tif (!value) {\n\t\t\treturn;\n\t\t}\n\t\tconst notSelected = this._enabledOptions.filter((v) => !value.includes(v.value));\n\t\tthis.value = notSelected.map((v) => v.value);\n\t}\n\n\tprivate toggleValue() {\n\t\tif (this.value === undefined) {\n\t\t\tthis.value = [];\n\t\t}\n\t\tconst selected = this.value.includes(this._value);\n\t\tthis.value = selected\n\t\t\t? this.value.filter((value) => value !== this._value)\n\t\t\t: [...this.value, this._value];\n\t}\n\n\tconstructor(opts: MultiSelectOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\t\tthis.value = [...(opts.initialValues ?? [])];\n\t\tconst cursor = Math.max(\n\t\t\tthis.options.findIndex(({ value }) => value === opts.cursorAt),\n\t\t\t0\n\t\t);\n\t\tthis.cursor = this.options[cursor].disabled ? findCursor<T>(cursor, 1, this.options) : cursor;\n\t\tthis.on('key', (char) => {\n\t\t\tif (char === 'a') {\n\t\t\t\tthis.toggleAll();\n\t\t\t}\n\t\t\tif (char === 'i') {\n\t\t\t\tthis.toggleInvert();\n\t\t\t}\n\t\t});\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, -1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, 1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'space':\n\t\t\t\t\tthis.toggleValue();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n}\n","import { styleText } from 'node:util';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface PasswordOptions extends PromptOptions<string, PasswordPrompt> {\n\tmask?: string;\n}\nexport default class PasswordPrompt extends Prompt<string> {\n\tprivate _mask = '•';\n\tget cursor() {\n\t\treturn this._cursor;\n\t}\n\tget masked() {\n\t\treturn this.userInput.replaceAll(/./g, this._mask);\n\t}\n\tget userInputWithCursor() {\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\treturn this.masked;\n\t\t}\n\t\tconst userInput = this.userInput;\n\t\tif (this.cursor >= userInput.length) {\n\t\t\treturn `${this.masked}${styleText(['inverse', 'hidden'], '_')}`;\n\t\t}\n\t\tconst masked = this.masked;\n\t\tconst s1 = masked.slice(0, this.cursor);\n\t\tconst s2 = masked.slice(this.cursor);\n\t\treturn `${s1}${styleText('inverse', s2[0])}${s2.slice(1)}`;\n\t}\n\tclear() {\n\t\tthis._clearUserInput();\n\t}\n\tconstructor({ mask, ...opts }: PasswordOptions) {\n\t\tsuper(opts);\n\t\tthis._mask = mask ?? '•';\n\t\tthis.on('userInput', (input) => {\n\t\t\tthis._setValue(input);\n\t\t});\n\t}\n}\n","import { findCursor } from '../utils/cursor.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface SelectOptions<T extends { value: any; disabled?: boolean }>\n\textends PromptOptions<T['value'], SelectPrompt<T>> {\n\toptions: T[];\n\tinitialValue?: T['value'];\n}\nexport default class SelectPrompt<T extends { value: any; disabled?: boolean }> extends Prompt<\n\tT['value']\n> {\n\toptions: T[];\n\tcursor = 0;\n\n\tprivate get _selectedValue() {\n\t\treturn this.options[this.cursor];\n\t}\n\n\tprivate changeValue() {\n\t\tthis.value = this._selectedValue.value;\n\t}\n\n\tconstructor(opts: SelectOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\n\t\tconst initialCursor = this.options.findIndex(({ value }) => value === opts.initialValue);\n\t\tconst cursor = initialCursor === -1 ? 0 : initialCursor;\n\t\tthis.cursor = this.options[cursor].disabled ? findCursor<T>(cursor, 1, this.options) : cursor;\n\t\tthis.changeValue();\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, -1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, 1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tthis.changeValue();\n\t\t});\n\t}\n}\n","import Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface SelectKeyOptions<T extends { value: string }>\n\textends PromptOptions<T['value'], SelectKeyPrompt<T>> {\n\toptions: T[];\n\tcaseSensitive?: boolean;\n}\nexport default class SelectKeyPrompt<T extends { value: string }> extends Prompt<T['value']> {\n\toptions: T[];\n\tcursor = 0;\n\n\tconstructor(opts: SelectKeyOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\t\tconst caseSensitive = opts.caseSensitive === true;\n\t\tconst keys = this.options.map(({ value: [initial] }) => {\n\t\t\treturn caseSensitive ? initial : initial?.toLowerCase();\n\t\t});\n\t\tthis.cursor = Math.max(keys.indexOf(opts.initialValue), 0);\n\n\t\tthis.on('key', (key, keyInfo) => {\n\t\t\tif (!key) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst casedKey = caseSensitive && keyInfo.shift ? key.toUpperCase() : key;\n\t\t\tif (!keys.includes(casedKey)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst value = this.options.find(({ value: [initial] }) => {\n\t\t\t\treturn caseSensitive ? initial === casedKey : initial?.toLowerCase() === key;\n\t\t\t});\n\t\t\tif (value) {\n\t\t\t\tthis.value = value.value;\n\t\t\t\tthis.state = 'submit';\n\t\t\t\tthis.emit('submit');\n\t\t\t}\n\t\t});\n\t}\n}\n","import { styleText } from 'node:util';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface TextOptions extends PromptOptions<string, TextPrompt> {\n\tplaceholder?: string;\n\tdefaultValue?: string;\n}\n\nexport default class TextPrompt extends Prompt<string> {\n\tget userInputWithCursor() {\n\t\tif (this.state === 'submit') {\n\t\t\treturn this.userInput;\n\t\t}\n\t\tconst userInput = this.userInput;\n\t\tif (this.cursor >= userInput.length) {\n\t\t\treturn `${this.userInput}█`;\n\t\t}\n\t\tconst s1 = userInput.slice(0, this.cursor);\n\t\tconst [s2, ...s3] = userInput.slice(this.cursor);\n\t\treturn `${s1}${styleText('inverse', s2)}${s3.join('')}`;\n\t}\n\tget cursor() {\n\t\treturn this._cursor;\n\t}\n\tconstructor(opts: TextOptions) {\n\t\tsuper({\n\t\t\t...opts,\n\t\t\tinitialUserInput: opts.initialUserInput ?? opts.initialValue,\n\t\t});\n\n\t\tthis.on('userInput', (input) => {\n\t\t\tthis._setValue(input);\n\t\t});\n\t\tthis.on('finalize', () => {\n\t\t\tif (!this.value) {\n\t\t\t\tthis.value = opts.defaultValue;\n\t\t\t}\n\t\t\tif (this.value === undefined) {\n\t\t\t\tthis.value = '';\n\t\t\t}\n\t\t});\n\t}\n}\n"],"names":["findCursor","cursor","delta","options","opt","newCursor","maxCursor","clampedCursor","actions","DEFAULT_MONTH_NAMES","settings","days","month","min","max","updateSettings","updates","aliases","alias","action","messages","date","isActionKey","key","value","diffLines","a","b","aLines","bLines","numLines","diff","i","isWindows","CANCEL_SYMBOL","isCancel","setRawMode","input","block","stdin","output","stdout","overwrite","hideCursor","rl","readline","ReadStream","clear","data","name","sequence","str","dx","dy","getColumns","getRows","wrapTextWithPrefix","text","prefix","startPrefix","columns","wrapAnsi","line","index","g$1","trackValue","render","signal","opts","event","params","cb","cbs","cleanup","subscriber","resolve","char","_key","write","problem","lines","frame","rows","diffOffsetAfter","diffOffsetBefore","diffLine","erase","adjustedDiffLine","newLines","getCursorForValue","selected","items","item","defaultFilter","option","normalisedValue","multiple","values","T$1","Prompt","#cursor","#lastUserInput","#filterFn","#options","#placeholder","styleText","s1","s2","s3","initialValues","selectedValue","selectedIndex","#onKey","#onUserInputChanged","_char","isUpKey","isDownKey","isReturnKey","isEmptyOrOnlyTab","placeholder","placeholderMatchesOption","v","valueCursor","focusedOption","ConfirmPrompt","confirm","SEGMENTS","segmentsFor","fmt","c","detectLocaleFormat","locale","parts","segments","separator","p","parseSegmentToNum","s","parse","daysInMonth","year","validParts","day","d","toDate","segmentBounds","type","ctx","minDate","maxDate","minP","maxP","DatePrompt","#segments","#separator","#segmentValues","#minDate","#maxDate","#segmentSelected","#pendingTensDigit","#format","#refresh","detected","sep","initialDate","segmentValues","initialDisplay","#onCursor","#onFinalize","#seg","segment","#navigate","direction","#adjust","raw","isBlank","num","bounds","next","dir","newVal","newParts","err","#validateSegment","display","firstBlank","pos","shouldStaySelected","digit","parsed","maxDay","nextBlank","seg","GroupMultiSelectPrompt","#selectableGroups","group","o","groupedItems","currentIsGroup","enabledOptions","allSelected","notSelected","PasswordPrompt","userInput","masked","mask","SelectPrompt","initialCursor","SelectKeyPrompt","caseSensitive","keys","initial","keyInfo","casedKey","TextPrompt"],"mappings":"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"}
|