pickem 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -0
- package/README.md +61 -2
- package/checkbox.d.ts +3 -0
- package/checkbox.d.ts.map +1 -0
- package/checkbox.js +76 -0
- package/checkbox.js.map +1 -0
- package/display/format.d.ts +1 -3
- package/display/format.d.ts.map +1 -1
- package/display/format.js +4 -1
- package/display/format.js.map +1 -1
- package/index.d.ts +1 -1
- package/index.d.ts.map +1 -1
- package/internal/track.d.ts +3 -0
- package/internal/track.d.ts.map +1 -0
- package/internal/track.js +8 -0
- package/internal/track.js.map +1 -0
- package/package.json +15 -1
- package/pickem.d.ts +2 -0
- package/pickem.d.ts.map +1 -1
- package/pickem.js +36 -32
- package/pickem.js.map +1 -1
- package/prompt/searchable-checkbox.d.ts +26 -0
- package/prompt/searchable-checkbox.d.ts.map +1 -0
- package/prompt/searchable-checkbox.js +173 -0
- package/prompt/searchable-checkbox.js.map +1 -0
- package/types.d.ts +25 -2
- package/types.d.ts.map +1 -1
- package/wizard.d.ts.map +1 -1
- package/wizard.js +10 -0
- package/wizard.js.map +1 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to pickem will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.2.0] — 2026-05-09
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- `pickem.checkbox(items, opts) → Promise<V[]>` — multi-select with built-in
|
|
13
|
+
filter-as-you-type. Built on `@inquirer/core`. Space toggles, Enter submits,
|
|
14
|
+
Backspace removes filter chars, Esc clears the filter. Pinned items respect
|
|
15
|
+
the filter (stay pinned within filtered set). Checked items remain in the
|
|
16
|
+
result even if the filter hides them. Result is in source order, matching
|
|
17
|
+
`@inquirer/prompts/checkbox` semantics.
|
|
18
|
+
- `searchable?: boolean` option on both `pickem()` and `pickem.checkbox()`.
|
|
19
|
+
Default `true`. When `false`, falls back to the non-search prompts
|
|
20
|
+
(`@inquirer/prompts/select` and `/checkbox` respectively).
|
|
21
|
+
- `'checkbox'` step type for `wizard()`. `ctx[step.id]` receives `string[]`.
|
|
22
|
+
- `allowFreeText?: boolean` on `pickem.checkbox()`. When `true`, typing text
|
|
23
|
+
that matches nothing and pressing Enter appends the typed text to the list
|
|
24
|
+
as a checked item; the filter clears and the prompt stays open.
|
|
25
|
+
- `npm run demo` — interactive tour of every feature using `tsx`.
|
|
26
|
+
Uses `MemoryStorage` so demo runs don't pollute `~/.pickem/usage.json`.
|
|
27
|
+
- New direct dep: `@inquirer/core ^10.3.2` (was already pulled transitively
|
|
28
|
+
by `@inquirer/prompts`).
|
|
29
|
+
- New devDeps: `@inquirer/testing ^3.3.5` (custom prompt smoke-tests),
|
|
30
|
+
`tsx ^4.21.0` (demo runner).
|
|
31
|
+
- Public type exports: `CheckboxOptions`, `CheckboxStep`.
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- **BREAKING**: default `badgeStyle` changed from `'bracket'` to `'none'`.
|
|
36
|
+
Items with a `group` no longer render `[group]` badges by default. Pass
|
|
37
|
+
`{ badgeStyle: 'bracket' }` or `{ badgeStyle: 'dot' }` to opt back in.
|
|
38
|
+
- `searchableCheckbox` toggle glyphs upgraded from `[ ]`/`[x]` to filled
|
|
39
|
+
circles (`○`/`●`, green when checked) with a cyan `❯` cursor. Matches
|
|
40
|
+
the Apple/iOS and `@inquirer/prompts` default visual style.
|
|
41
|
+
- `pickem()` single-select stats lookup no longer reaches into the tracker's
|
|
42
|
+
private `cache` field — uses the public `getStats()` method instead.
|
|
43
|
+
Fixes a latent issue when the tracker hadn't been loaded yet.
|
|
44
|
+
- `BadgeStyle` union now includes `'none'`.
|
|
45
|
+
|
|
46
|
+
### Internal
|
|
47
|
+
|
|
48
|
+
- Extracted `resolveTrackOptions` to `src/internal/track.ts` (shared between
|
|
49
|
+
`pickem.ts` and `checkbox.ts`).
|
package/README.md
CHANGED
|
@@ -8,6 +8,15 @@ Usage-sorted searchable autocomplete for CLI tools. One dependency-light module
|
|
|
8
8
|
npm install pickem
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
## Demo
|
|
12
|
+
|
|
13
|
+
An interactive tour of every feature ships with the repo:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
git clone https://github.com/calebogden/pickem
|
|
17
|
+
cd pickem && npm install && npm run demo
|
|
18
|
+
```
|
|
19
|
+
|
|
11
20
|
## Quick Start
|
|
12
21
|
|
|
13
22
|
```typescript
|
|
@@ -20,6 +29,35 @@ const choice = await pickem([
|
|
|
20
29
|
])
|
|
21
30
|
```
|
|
22
31
|
|
|
32
|
+
## Multi-select (checkbox)
|
|
33
|
+
|
|
34
|
+
`pickem.checkbox(items, opts)` returns `string[]` — the values of every checked item.
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { pickem } from 'pickem'
|
|
38
|
+
|
|
39
|
+
const choices = await pickem.checkbox([
|
|
40
|
+
{ label: 'Deploy', value: 'deploy' },
|
|
41
|
+
{ label: 'Test', value: 'test' },
|
|
42
|
+
{ label: 'Lint', value: 'lint' },
|
|
43
|
+
], { message: 'Which steps?', defaultChecked: ['test'] })
|
|
44
|
+
// => ['deploy', 'test']
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Key bindings: Space toggles a selection, Enter submits, type to filter, Esc clears the filter, Backspace removes filter characters.
|
|
48
|
+
|
|
49
|
+
Pass `searchable: false` to fall back to the standard `@inquirer/prompts` checkbox (no search bar):
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
const choices = await pickem.checkbox(items, { searchable: false })
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Pass `{ allowFreeText: true }` to let the user add ad-hoc entries: type text that doesn't match any item, press Enter, and the typed text is appended to the list as a checked item. The filter clears and the prompt stays open so they can keep toggling or add more.
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
const tags = await pickem.checkbox(KNOWN_TAGS, { allowFreeText: true })
|
|
59
|
+
```
|
|
60
|
+
|
|
23
61
|
## Usage Tracking
|
|
24
62
|
|
|
25
63
|
Items sort by how often they're used. Enable with `track: true`:
|
|
@@ -50,7 +88,7 @@ const npm = defineSource('npm', async () => [
|
|
|
50
88
|
])
|
|
51
89
|
|
|
52
90
|
const choice = await pickem.from([scripts, npm], { track: true })
|
|
53
|
-
// Items get group badges: [scripts], [npm]
|
|
91
|
+
// Items get group badges when badgeStyle is set: [scripts], [npm]
|
|
54
92
|
```
|
|
55
93
|
|
|
56
94
|
## Wizard Flows
|
|
@@ -76,6 +114,7 @@ const result = await wizard([
|
|
|
76
114
|
| Type | Purpose |
|
|
77
115
|
|------|---------|
|
|
78
116
|
| `pick` | Searchable usage-sorted selection |
|
|
117
|
+
| `checkbox` | Searchable multi-select, returns an array |
|
|
79
118
|
| `select` | Simple choice list |
|
|
80
119
|
| `input` | Free text entry |
|
|
81
120
|
| `confirm` | Yes/no |
|
|
@@ -104,16 +143,36 @@ await pickem(items, {
|
|
|
104
143
|
message: 'Pick one:', // Prompt message
|
|
105
144
|
pageSize: 15, // Visible items
|
|
106
145
|
track: true | TrackOptions, // Enable usage tracking
|
|
146
|
+
searchable: true, // Set false to skip the search bar (falls back to select)
|
|
107
147
|
searchFields: ['label', 'description'], // Fields to search (dot-notation for meta)
|
|
108
148
|
search: (item, term) => boolean, // Custom search function
|
|
109
149
|
format: (item, stats) => string, // Custom display formatter
|
|
110
|
-
badgeStyle: 'bracket' | 'dot' | fn,
|
|
150
|
+
badgeStyle: 'none' | 'bracket' | 'dot' | fn, // Group badge style (default: 'none')
|
|
111
151
|
badgeColors: { npm: 'red' }, // Badge color overrides
|
|
112
152
|
sort: (a, b) => number, // Tiebreaker after usage sort
|
|
113
153
|
onSelect: (item) => {}, // Post-selection callback
|
|
154
|
+
allowFreeText: true, // Surface unmatched input as a selectable option
|
|
114
155
|
})
|
|
115
156
|
```
|
|
116
157
|
|
|
158
|
+
`pickem.checkbox` accepts the same options, plus:
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
await pickem.checkbox(items, {
|
|
162
|
+
required: false, // Require at least one selection before Enter submits
|
|
163
|
+
defaultChecked: ['test'], // Pre-checked values
|
|
164
|
+
allowFreeText: true, // Type unmatched text + Enter to add as a checked item
|
|
165
|
+
})
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### `badgeStyle` default changed in v0.2.0
|
|
169
|
+
|
|
170
|
+
The default `badgeStyle` is now `'none'` — group labels are hidden unless you opt in. This is a breaking change if your code relied on the old default of `'bracket'`. To restore the previous behavior:
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
await pickem(items, { badgeStyle: 'bracket' })
|
|
174
|
+
```
|
|
175
|
+
|
|
117
176
|
## Requirements
|
|
118
177
|
|
|
119
178
|
- Node >= 18
|
package/checkbox.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkbox.d.ts","sourceRoot":"","sources":["../src/checkbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAc,MAAM,YAAY,CAAA;AAQvE,wBAAsB,QAAQ,CAAC,CAAC,GAAG,MAAM,EACvC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EACpB,OAAO,GAAE,eAAe,CAAC,CAAC,CAAM,GAC/B,OAAO,CAAC,CAAC,EAAE,CAAC,CAuEd"}
|
package/checkbox.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { checkbox as standardCheckbox } from '@inquirer/prompts';
|
|
2
|
+
import { UsageTracker } from './usage/tracker.js';
|
|
3
|
+
import { createFormatter } from './display/format.js';
|
|
4
|
+
import { createSearchFn } from './search/search.js';
|
|
5
|
+
import { resolveTrackOptions } from './internal/track.js';
|
|
6
|
+
import { searchableCheckbox } from './prompt/searchable-checkbox.js';
|
|
7
|
+
export async function checkbox(items, options = {}) {
|
|
8
|
+
const trackOpts = resolveTrackOptions(options.track);
|
|
9
|
+
const tracker = trackOpts ? new UsageTracker(trackOpts) : null;
|
|
10
|
+
const keyFn = trackOpts?.key ?? ((item) => item.label);
|
|
11
|
+
let sorted;
|
|
12
|
+
if (tracker) {
|
|
13
|
+
sorted = await tracker.sortItems(items, keyFn, options.sort);
|
|
14
|
+
}
|
|
15
|
+
else if (options.sort) {
|
|
16
|
+
sorted = [...items].sort(options.sort);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
sorted = items;
|
|
20
|
+
}
|
|
21
|
+
const formatFn = options.format ??
|
|
22
|
+
createFormatter({
|
|
23
|
+
badgeStyle: options.badgeStyle,
|
|
24
|
+
badgeColors: options.badgeColors,
|
|
25
|
+
});
|
|
26
|
+
const searchFn = options.search ?? createSearchFn(options.searchFields);
|
|
27
|
+
const statsMap = new Map();
|
|
28
|
+
if (tracker) {
|
|
29
|
+
for (const item of sorted) {
|
|
30
|
+
statsMap.set(item.value, await tracker.getStats(keyFn(item)));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Build a value→item map once for O(n) post-submit lookups
|
|
34
|
+
const valueToItem = new Map(sorted.map((item) => [item.value, item]));
|
|
35
|
+
const useSearchable = options.searchable !== false;
|
|
36
|
+
let result;
|
|
37
|
+
if (useSearchable) {
|
|
38
|
+
result = await searchableCheckbox({
|
|
39
|
+
message: options.message ?? 'Pick:',
|
|
40
|
+
items: sorted,
|
|
41
|
+
pageSize: options.pageSize ?? 15,
|
|
42
|
+
required: options.required ?? false,
|
|
43
|
+
defaultChecked: options.defaultChecked ?? [],
|
|
44
|
+
allowFreeText: options.allowFreeText ?? false,
|
|
45
|
+
searchFn,
|
|
46
|
+
formatFn,
|
|
47
|
+
usageStats: tracker ? statsMap : null,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const defaultCheckedSet = new Set(options.defaultChecked ?? []);
|
|
52
|
+
result = await standardCheckbox({
|
|
53
|
+
message: options.message ?? 'Pick:',
|
|
54
|
+
pageSize: options.pageSize ?? 15,
|
|
55
|
+
required: options.required ?? false,
|
|
56
|
+
choices: sorted.map((item) => ({
|
|
57
|
+
name: formatFn(item, statsMap.get(item.value) ?? null),
|
|
58
|
+
value: item.value,
|
|
59
|
+
checked: defaultCheckedSet.has(item.value),
|
|
60
|
+
description: undefined, // We handle description in formatFn
|
|
61
|
+
})),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// Single combined pass — track usage and fire onSelect for each selected item
|
|
65
|
+
for (const v of result) {
|
|
66
|
+
const item = valueToItem.get(v);
|
|
67
|
+
if (!item)
|
|
68
|
+
continue;
|
|
69
|
+
if (tracker)
|
|
70
|
+
await tracker.track(keyFn(item), trackOpts?.source);
|
|
71
|
+
if (options.onSelect)
|
|
72
|
+
await options.onSelect(item);
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=checkbox.js.map
|
package/checkbox.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkbox.js","sourceRoot":"","sources":["../src/checkbox.ts"],"names":[],"mappings":"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"}
|
package/display/format.d.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import type { PickItem, UsageStats } from '../types.js';
|
|
2
|
-
type BadgeStyle = 'bracket' | 'dot' | ((group: string) => string);
|
|
3
2
|
export interface FormatOptions {
|
|
4
|
-
badgeStyle?:
|
|
3
|
+
badgeStyle?: 'none' | 'bracket' | 'dot' | ((group: string) => string);
|
|
5
4
|
badgeColors?: Record<string, string>;
|
|
6
5
|
}
|
|
7
6
|
export declare function createFormatter<V>(options?: FormatOptions): (item: PickItem<V>, stats: UsageStats | null) => string;
|
|
8
|
-
export {};
|
|
9
7
|
//# sourceMappingURL=format.d.ts.map
|
package/display/format.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/display/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/display/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAsDvD,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,CAAA;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AAED,wBAAgB,eAAe,CAAC,CAAC,EAC/B,OAAO,GAAE,aAAkB,GAC1B,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,MAAM,CAoBzD"}
|
package/display/format.js
CHANGED
|
@@ -20,6 +20,9 @@ function renderBadge(group, style, colors) {
|
|
|
20
20
|
if (typeof style === 'function') {
|
|
21
21
|
return style(group);
|
|
22
22
|
}
|
|
23
|
+
if (style === 'none') {
|
|
24
|
+
return '';
|
|
25
|
+
}
|
|
23
26
|
const color = colors[group] ?? 'gray';
|
|
24
27
|
if (style === 'dot') {
|
|
25
28
|
return colorize('●', color) + ' ';
|
|
@@ -33,7 +36,7 @@ function renderUsageCount(count) {
|
|
|
33
36
|
return dim(` (${count})`);
|
|
34
37
|
}
|
|
35
38
|
export function createFormatter(options = {}) {
|
|
36
|
-
const style = options.badgeStyle ?? '
|
|
39
|
+
const style = options.badgeStyle ?? 'none';
|
|
37
40
|
const colors = { ...DEFAULT_BADGE_COLORS, ...options.badgeColors };
|
|
38
41
|
return (item, stats) => {
|
|
39
42
|
let result = '';
|
package/display/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/display/format.ts"],"names":[],"mappings":"AAIA,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;CACR,CAAA;AAEV,MAAM,oBAAoB,GAAsC,EAAE,CAAA;AAElE,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAA0B,CAAC,IAAI,IAAI,CAAC,IAAI,CAAA;IAC1D,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;AACtC,CAAC;AAED,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;AAC1C,CAAC;AAED,SAAS,WAAW,CAClB,KAAa,EACb,KAAiB,EACjB,MAA8B;IAE9B,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAA;IAErC,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,OAAO,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,CAAA;IACnC,CAAC;IAED,oBAAoB;IACpB,OAAO,QAAQ,CAAC,IAAI,KAAK,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,CAAA;AAC5C,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAC1B,OAAO,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,CAAA;AAC3B,CAAC;AAOD,MAAM,UAAU,eAAe,CAC7B,UAAyB,EAAE;IAE3B,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,IAAI,
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/display/format.ts"],"names":[],"mappings":"AAIA,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;CACR,CAAA;AAEV,MAAM,oBAAoB,GAAsC,EAAE,CAAA;AAElE,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAA0B,CAAC,IAAI,IAAI,CAAC,IAAI,CAAA;IAC1D,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;AACtC,CAAC;AAED,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;AAC1C,CAAC;AAED,SAAS,WAAW,CAClB,KAAa,EACb,KAAiB,EACjB,MAA8B;IAE9B,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;IAED,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAA;IAErC,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,OAAO,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,CAAA;IACnC,CAAC;IAED,oBAAoB;IACpB,OAAO,QAAQ,CAAC,IAAI,KAAK,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,CAAA;AAC5C,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAC1B,OAAO,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,CAAA;AAC3B,CAAC;AAOD,MAAM,UAAU,eAAe,CAC7B,UAAyB,EAAE;IAE3B,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAA;IAC1C,MAAM,MAAM,GAAG,EAAE,GAAG,oBAAoB,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;IAElE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACrB,IAAI,MAAM,GAAG,EAAE,CAAA;QAEf,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;QAClD,CAAC;QAED,MAAM,IAAI,IAAI,CAAC,KAAK,CAAA;QACpB,MAAM,IAAI,gBAAgB,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC,CAAA;QAE7C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QACzC,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;AACH,CAAC"}
|
package/index.d.ts
CHANGED
|
@@ -6,5 +6,5 @@ export { sortByUsage } from './usage/sort.js';
|
|
|
6
6
|
export { defineSource, loadSources } from './source/source.js';
|
|
7
7
|
export { createSearchFn } from './search/search.js';
|
|
8
8
|
export { createFormatter } from './display/format.js';
|
|
9
|
-
export type { PickItem, PickOptions, TrackOptions, UsageStats, UsageRecord, UsageData, UsageStorage, Source, WizardContext, WizardStep, PickStep, SelectStep, InputStep, ConfirmStep, BranchStep, SelectChoice, } from './types.js';
|
|
9
|
+
export type { PickItem, PickOptions, CheckboxOptions, TrackOptions, UsageStats, UsageRecord, UsageData, UsageStorage, Source, WizardContext, WizardStep, PickStep, CheckboxStep, SelectStep, InputStep, ConfirmStep, BranchStep, SelectChoice, } from './types.js';
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
package/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAG9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAGrD,YAAY,EACV,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,UAAU,EACV,WAAW,EACX,SAAS,EACT,YAAY,EACZ,MAAM,EACN,aAAa,EACb,UAAU,EACV,QAAQ,EACR,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAG9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAGrD,YAAY,EACV,QAAQ,EACR,WAAW,EACX,eAAe,EACf,YAAY,EACZ,UAAU,EACV,WAAW,EACX,SAAS,EACT,YAAY,EACZ,MAAM,EACN,aAAa,EACb,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/internal/track.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,IAAI,CAIlG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track.js","sourceRoot":"","sources":["../../src/internal/track.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CAAC,KAAyC;IAC3E,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,CAAA;IAC7B,OAAO,KAAK,CAAA;AACd,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pickem",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Usage-sorted searchable autocomplete for CLI tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./index.js",
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"types": "./index.d.ts"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
+
"sideEffects": false,
|
|
14
15
|
"keywords": [
|
|
15
16
|
"cli",
|
|
16
17
|
"autocomplete",
|
|
@@ -20,11 +21,24 @@
|
|
|
20
21
|
"picker",
|
|
21
22
|
"wizard"
|
|
22
23
|
],
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/calebogden/pickem.git"
|
|
27
|
+
},
|
|
28
|
+
"bugs": {
|
|
29
|
+
"url": "https://github.com/calebogden/pickem/issues"
|
|
30
|
+
},
|
|
31
|
+
"homepage": "https://github.com/calebogden/pickem#readme",
|
|
32
|
+
"author": "Caleb Ogden <co@ogden.co>",
|
|
23
33
|
"license": "MIT",
|
|
24
34
|
"engines": {
|
|
25
35
|
"node": ">=18"
|
|
26
36
|
},
|
|
37
|
+
"publishConfig": {
|
|
38
|
+
"access": "public"
|
|
39
|
+
},
|
|
27
40
|
"dependencies": {
|
|
41
|
+
"@inquirer/core": "^10.3.2",
|
|
28
42
|
"@inquirer/prompts": "^7.0.0"
|
|
29
43
|
}
|
|
30
44
|
}
|
package/pickem.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { PickItem, PickOptions, Source } from './types.js';
|
|
2
|
+
import { checkbox } from './checkbox.js';
|
|
2
3
|
declare function pick<V = string>(items: PickItem<V>[], options?: PickOptions<V>): Promise<V>;
|
|
3
4
|
/**
|
|
4
5
|
* Pick from multiple sources loaded in parallel.
|
|
@@ -6,6 +7,7 @@ declare function pick<V = string>(items: PickItem<V>[], options?: PickOptions<V>
|
|
|
6
7
|
declare function pickFrom<V = string>(sources: Source<V>[], options?: PickOptions<V>): Promise<V>;
|
|
7
8
|
declare const pickem: typeof pick & {
|
|
8
9
|
from: typeof pickFrom;
|
|
10
|
+
checkbox: typeof checkbox;
|
|
9
11
|
};
|
|
10
12
|
export { pickem };
|
|
11
13
|
//# sourceMappingURL=pickem.d.ts.map
|
package/pickem.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pickem.d.ts","sourceRoot":"","sources":["../src/pickem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"pickem.d.ts","sourceRoot":"","sources":["../src/pickem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAOxC,iBAAe,IAAI,CAAC,CAAC,GAAG,MAAM,EAC5B,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EACpB,OAAO,GAAE,WAAW,CAAC,CAAC,CAAM,GAC3B,OAAO,CAAC,CAAC,CAAC,CA4EZ;AAED;;GAEG;AACH,iBAAe,QAAQ,CAAC,CAAC,GAAG,MAAM,EAChC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EACpB,OAAO,GAAE,WAAW,CAAC,CAAC,CAAM,GAC3B,OAAO,CAAC,CAAC,CAAC,CAGZ;AAGD,QAAA,MAAM,MAAM;;;CAAoD,CAAA;AAEhE,OAAO,EAAE,MAAM,EAAE,CAAA"}
|
package/pickem.js
CHANGED
|
@@ -1,20 +1,14 @@
|
|
|
1
|
-
import { search } from '@inquirer/prompts';
|
|
1
|
+
import { search, select } from '@inquirer/prompts';
|
|
2
|
+
import { checkbox } from './checkbox.js';
|
|
2
3
|
import { UsageTracker } from './usage/tracker.js';
|
|
3
4
|
import { createSearchFn } from './search/search.js';
|
|
4
5
|
import { createFormatter } from './display/format.js';
|
|
5
6
|
import { loadSources } from './source/source.js';
|
|
6
|
-
|
|
7
|
-
if (!track)
|
|
8
|
-
return null;
|
|
9
|
-
if (track === true)
|
|
10
|
-
return {};
|
|
11
|
-
return track;
|
|
12
|
-
}
|
|
7
|
+
import { resolveTrackOptions } from './internal/track.js';
|
|
13
8
|
async function pick(items, options = {}) {
|
|
14
9
|
const trackOpts = resolveTrackOptions(options.track);
|
|
15
10
|
const tracker = trackOpts ? new UsageTracker(trackOpts) : null;
|
|
16
11
|
const keyFn = trackOpts?.key ?? ((item) => item.label);
|
|
17
|
-
// Sort by usage
|
|
18
12
|
let sorted;
|
|
19
13
|
if (tracker) {
|
|
20
14
|
sorted = await tracker.sortItems(items, keyFn, options.sort);
|
|
@@ -25,44 +19,54 @@ async function pick(items, options = {}) {
|
|
|
25
19
|
else {
|
|
26
20
|
sorted = items;
|
|
27
21
|
}
|
|
28
|
-
// Search function
|
|
29
22
|
const searchFn = options.search ?? createSearchFn(options.searchFields);
|
|
30
|
-
// Formatter
|
|
31
23
|
const formatFn = options.format ??
|
|
32
24
|
createFormatter({
|
|
33
25
|
badgeStyle: options.badgeStyle,
|
|
34
26
|
badgeColors: options.badgeColors,
|
|
35
27
|
});
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
28
|
+
const statsFor = async (item) => tracker ? await tracker.getStats(keyFn(item)) : null;
|
|
29
|
+
let result;
|
|
30
|
+
if (options.searchable === false) {
|
|
31
|
+
const choices = await Promise.all(sorted.map(async (item) => ({
|
|
32
|
+
name: formatFn(item, await statsFor(item)),
|
|
33
|
+
value: item.value,
|
|
34
|
+
description: item.description,
|
|
35
|
+
})));
|
|
36
|
+
result = await select({
|
|
37
|
+
message: options.message ?? 'Pick one:',
|
|
38
|
+
pageSize: options.pageSize ?? 15,
|
|
39
|
+
choices,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
result = await search({
|
|
44
|
+
message: options.message ?? 'Pick one:',
|
|
45
|
+
pageSize: options.pageSize ?? 15,
|
|
46
|
+
source: async (term) => {
|
|
47
|
+
const filtered = term ? sorted.filter((item) => searchFn(item, term)) : sorted;
|
|
48
|
+
if (options.allowFreeText && term && !filtered.length) {
|
|
49
|
+
return [{ name: term, value: term, description: undefined }];
|
|
50
|
+
}
|
|
51
|
+
return Promise.all(filtered.map(async (item) => ({
|
|
52
|
+
name: formatFn(item, await statsFor(item)),
|
|
47
53
|
value: item.value,
|
|
48
|
-
description: undefined,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
54
|
+
description: undefined,
|
|
55
|
+
})));
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
}
|
|
53
59
|
// Track usage
|
|
54
60
|
if (tracker) {
|
|
55
61
|
const selected = sorted.find((item) => item.value === result);
|
|
56
|
-
if (selected)
|
|
62
|
+
if (selected)
|
|
57
63
|
await tracker.track(keyFn(selected), trackOpts?.source);
|
|
58
|
-
}
|
|
59
64
|
}
|
|
60
65
|
// onSelect callback
|
|
61
66
|
if (options.onSelect) {
|
|
62
67
|
const selected = sorted.find((item) => item.value === result);
|
|
63
|
-
if (selected)
|
|
68
|
+
if (selected)
|
|
64
69
|
await options.onSelect(selected);
|
|
65
|
-
}
|
|
66
70
|
}
|
|
67
71
|
return result;
|
|
68
72
|
}
|
|
@@ -74,6 +78,6 @@ async function pickFrom(sources, options = {}) {
|
|
|
74
78
|
return pick(items, options);
|
|
75
79
|
}
|
|
76
80
|
// Attach .from as a method
|
|
77
|
-
const pickem = Object.assign(pick, { from: pickFrom });
|
|
81
|
+
const pickem = Object.assign(pick, { from: pickFrom, checkbox });
|
|
78
82
|
export { pickem };
|
|
79
83
|
//# sourceMappingURL=pickem.js.map
|
package/pickem.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pickem.js","sourceRoot":"","sources":["../src/pickem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"pickem.js","sourceRoot":"","sources":["../src/pickem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAEzD,KAAK,UAAU,IAAI,CACjB,KAAoB,EACpB,UAA0B,EAAE;IAE5B,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACpD,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC9D,MAAM,KAAK,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC,IAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAEnE,IAAI,MAAqB,CAAA;IACzB,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9D,CAAC;SAAM,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACxC,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,KAAK,CAAA;IAChB,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAI,OAAO,CAAC,YAAY,CAAC,CAAA;IAE1E,MAAM,QAAQ,GACZ,OAAO,CAAC,MAAM;QACd,eAAe,CAAI;YACjB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAA;IAEJ,MAAM,QAAQ,GAAG,KAAK,EAAE,IAAiB,EAAE,EAAE,CAC3C,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAEtD,IAAI,MAAS,CAAA;IAEb,IAAI,OAAO,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1B,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC,CACJ,CAAA;QACD,MAAM,GAAG,MAAM,MAAM,CAAI;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,WAAW;YACvC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;YAChC,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,MAAM,CAAI;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,WAAW;YACvC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;YAChC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;gBAE9E,IAAI,OAAO,CAAC,aAAa,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;oBACtD,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAoB,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAA;gBAC9E,CAAC;gBAED,OAAO,OAAO,CAAC,GAAG,CAChB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC5B,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC1C,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,WAAW,EAAE,SAAS;iBACvB,CAAC,CAAC,CACJ,CAAA;YACH,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;IAED,cAAc;IACd,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAA;QAC7D,IAAI,QAAQ;YAAE,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IACvE,CAAC;IAED,oBAAoB;IACpB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAA;QAC7D,IAAI,QAAQ;YAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAChD,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,QAAQ,CACrB,OAAoB,EACpB,UAA0B,EAAE;IAE5B,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;IACxC,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;AAC7B,CAAC;AAED,2BAA2B;AAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAA;AAEhE,OAAO,EAAE,MAAM,EAAE,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { PickItem, UsageStats } from '../types.js';
|
|
2
|
+
export interface SearchableCheckboxConfig<V = string> {
|
|
3
|
+
message: string;
|
|
4
|
+
items: PickItem<V>[];
|
|
5
|
+
pageSize: number;
|
|
6
|
+
required: boolean;
|
|
7
|
+
defaultChecked: V[];
|
|
8
|
+
allowFreeText: boolean;
|
|
9
|
+
searchFn: (item: PickItem<V>, term: string) => boolean;
|
|
10
|
+
formatFn: (item: PickItem<V>, stats: UsageStats | null) => string;
|
|
11
|
+
usageStats: Map<V, UsageStats | null> | null;
|
|
12
|
+
}
|
|
13
|
+
export declare const searchableCheckbox: <V>(config: {
|
|
14
|
+
message: string;
|
|
15
|
+
items: PickItem<V>[];
|
|
16
|
+
pageSize: number;
|
|
17
|
+
required: boolean;
|
|
18
|
+
defaultChecked: V[];
|
|
19
|
+
allowFreeText: boolean;
|
|
20
|
+
searchFn: (item: PickItem<V>, term: string) => boolean;
|
|
21
|
+
formatFn: (item: PickItem<V>, stats: UsageStats | null) => string;
|
|
22
|
+
usageStats: Map<V, UsageStats | null> | null;
|
|
23
|
+
}, context?: import("@inquirer/type").Context) => Promise<V[]> & {
|
|
24
|
+
cancel: () => void;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=searchable-checkbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchable-checkbox.d.ts","sourceRoot":"","sources":["../../src/prompt/searchable-checkbox.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEvD,MAAM,WAAW,wBAAwB,CAAC,CAAC,GAAG,MAAM;IAClD,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;IACjB,cAAc,EAAE,CAAC,EAAE,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;IACtD,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,MAAM,CAAA;IACjE,UAAU,EAAE,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;CAC7C;AAgCD,eAAO,MAAM,kBAAkB,GAC5B,CAAC;aA1CO,MAAM;;cAEL,MAAM;cACN,OAAO;;mBAEF,OAAO;wCACc,MAAM,KAAK,OAAO;yCACjB,UAAU,GAAG,IAAI,KAAK,MAAM;;;;CAoMlE,CAAA"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { createPrompt, useState, useKeypress, useMemo, usePrefix, usePagination, isUpKey, isDownKey, isSpaceKey, isEnterKey, isBackspaceKey, } from '@inquirer/core';
|
|
2
|
+
const ANSI = {
|
|
3
|
+
reset: '\x1b[0m',
|
|
4
|
+
dim: '\x1b[2m',
|
|
5
|
+
red: '\x1b[31m',
|
|
6
|
+
green: '\x1b[32m',
|
|
7
|
+
cyan: '\x1b[36m',
|
|
8
|
+
bold: '\x1b[1m',
|
|
9
|
+
};
|
|
10
|
+
const dim = (s) => `${ANSI.dim}${s}${ANSI.reset}`;
|
|
11
|
+
const red = (s) => `${ANSI.red}${s}${ANSI.reset}`;
|
|
12
|
+
const green = (s) => `${ANSI.green}${s}${ANSI.reset}`;
|
|
13
|
+
const cyan = (s) => `${ANSI.cyan}${s}${ANSI.reset}`;
|
|
14
|
+
const bold = (s) => `${ANSI.bold}${s}${ANSI.reset}`;
|
|
15
|
+
function reorderByPin(items) {
|
|
16
|
+
const first = [];
|
|
17
|
+
const last = [];
|
|
18
|
+
const middle = [];
|
|
19
|
+
for (const it of items) {
|
|
20
|
+
if (it.pin === 'first')
|
|
21
|
+
first.push(it);
|
|
22
|
+
else if (it.pin === 'last')
|
|
23
|
+
last.push(it);
|
|
24
|
+
else
|
|
25
|
+
middle.push(it);
|
|
26
|
+
}
|
|
27
|
+
return [...first, ...middle, ...last];
|
|
28
|
+
}
|
|
29
|
+
function isEscapeKey(key) {
|
|
30
|
+
return key.name === 'escape';
|
|
31
|
+
}
|
|
32
|
+
export const searchableCheckbox = createPrompt((config, done) => {
|
|
33
|
+
const [status, setStatus] = useState('idle');
|
|
34
|
+
const [filter, setFilter] = useState('');
|
|
35
|
+
const [cursor, setCursor] = useState(0);
|
|
36
|
+
const [checked, setChecked] = useState(new Set(config.defaultChecked));
|
|
37
|
+
const [extras, setExtras] = useState([]);
|
|
38
|
+
const [error, setError] = useState(undefined);
|
|
39
|
+
const view = useMemo(() => {
|
|
40
|
+
const all = extras.length > 0 ? [...config.items, ...extras] : config.items;
|
|
41
|
+
const filtered = filter
|
|
42
|
+
? all.filter((it) => config.searchFn(it, filter))
|
|
43
|
+
: all;
|
|
44
|
+
return reorderByPin(filtered);
|
|
45
|
+
}, [filter, config.items, extras]);
|
|
46
|
+
const prefix = usePrefix({ status });
|
|
47
|
+
useKeypress((key, rl) => {
|
|
48
|
+
if (status === 'done')
|
|
49
|
+
return;
|
|
50
|
+
if (isEnterKey(key)) {
|
|
51
|
+
// Free-text path: filter has text, no matches, allowFreeText is on
|
|
52
|
+
if (config.allowFreeText && filter.length > 0 && view.length === 0) {
|
|
53
|
+
// Skip dedupe: if the typed text already exists as an extra, just clear filter
|
|
54
|
+
const existing = extras.find((it) => it.value === filter);
|
|
55
|
+
if (existing) {
|
|
56
|
+
const nextChecked = new Set(checked);
|
|
57
|
+
nextChecked.add(existing.value);
|
|
58
|
+
setChecked(nextChecked);
|
|
59
|
+
setFilter('');
|
|
60
|
+
setCursor(0);
|
|
61
|
+
setError(undefined);
|
|
62
|
+
rl.clearLine(0);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const newItem = { label: filter, value: filter };
|
|
66
|
+
setExtras([...extras, newItem]);
|
|
67
|
+
const nextChecked = new Set(checked);
|
|
68
|
+
nextChecked.add(newItem.value);
|
|
69
|
+
setChecked(nextChecked);
|
|
70
|
+
setFilter('');
|
|
71
|
+
setCursor(0);
|
|
72
|
+
setError(undefined);
|
|
73
|
+
rl.clearLine(0);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (config.required && checked.size === 0) {
|
|
77
|
+
setError('At least one item must be selected.');
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
setStatus('done');
|
|
81
|
+
done([...config.items, ...extras]
|
|
82
|
+
.filter((it) => checked.has(it.value))
|
|
83
|
+
.map((it) => it.value));
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (isSpaceKey(key)) {
|
|
87
|
+
if (view.length === 0)
|
|
88
|
+
return;
|
|
89
|
+
const item = view[cursor];
|
|
90
|
+
const next = new Set(checked);
|
|
91
|
+
if (next.has(item.value))
|
|
92
|
+
next.delete(item.value);
|
|
93
|
+
else
|
|
94
|
+
next.add(item.value);
|
|
95
|
+
setChecked(next);
|
|
96
|
+
setError(undefined);
|
|
97
|
+
// Space is also a printable char in readline; restore the filter buffer
|
|
98
|
+
// so the space doesn't get treated as filter input.
|
|
99
|
+
rl.clearLine(0);
|
|
100
|
+
if (filter)
|
|
101
|
+
rl.write(filter);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (isUpKey(key)) {
|
|
105
|
+
if (view.length === 0)
|
|
106
|
+
return;
|
|
107
|
+
setCursor((cursor - 1 + view.length) % view.length);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (isDownKey(key)) {
|
|
111
|
+
if (view.length === 0)
|
|
112
|
+
return;
|
|
113
|
+
setCursor((cursor + 1) % view.length);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (isBackspaceKey(key)) {
|
|
117
|
+
if (filter.length > 0) {
|
|
118
|
+
const next = filter.slice(0, -1);
|
|
119
|
+
setFilter(next);
|
|
120
|
+
setCursor(0);
|
|
121
|
+
// Sync readline buffer with our filter string.
|
|
122
|
+
rl.clearLine(0);
|
|
123
|
+
if (next)
|
|
124
|
+
rl.write(next);
|
|
125
|
+
}
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (isEscapeKey(key)) {
|
|
129
|
+
if (filter.length > 0) {
|
|
130
|
+
setFilter('');
|
|
131
|
+
setCursor(0);
|
|
132
|
+
rl.clearLine(0);
|
|
133
|
+
}
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// Printable char: readline already updated rl.line
|
|
137
|
+
if (rl.line !== filter) {
|
|
138
|
+
setFilter(rl.line);
|
|
139
|
+
setCursor(0);
|
|
140
|
+
setError(undefined);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
if (status === 'done') {
|
|
144
|
+
const labels = [...config.items, ...extras]
|
|
145
|
+
.filter((it) => checked.has(it.value))
|
|
146
|
+
.map((it) => it.label)
|
|
147
|
+
.join(', ');
|
|
148
|
+
return `${prefix} ${config.message} ${labels || '(none)'}`;
|
|
149
|
+
}
|
|
150
|
+
const header = `${prefix} ${config.message}${filter ? ` ${filter}_` : ' _'} ${dim(`(${view.length} shown, ${checked.size} selected)`)}`;
|
|
151
|
+
if (view.length === 0) {
|
|
152
|
+
return `${header}\n ${dim('(no matches)')}${error ? `\n ${red(error)}` : ''}`;
|
|
153
|
+
}
|
|
154
|
+
const renderItem = ({ item, index, }) => {
|
|
155
|
+
const isCursor = index === cursor;
|
|
156
|
+
const isChecked = checked.has(item.value);
|
|
157
|
+
const box = isChecked ? green('●') : '○';
|
|
158
|
+
const pointer = isCursor ? cyan('❯') : ' ';
|
|
159
|
+
const stats = config.usageStats?.get(item.value) ?? null;
|
|
160
|
+
const label = config.formatFn(item, stats);
|
|
161
|
+
const line = `${pointer} ${box} ${label}`;
|
|
162
|
+
return isCursor ? bold(line) : line;
|
|
163
|
+
};
|
|
164
|
+
const page = usePagination({
|
|
165
|
+
items: view,
|
|
166
|
+
active: cursor,
|
|
167
|
+
renderItem,
|
|
168
|
+
pageSize: config.pageSize,
|
|
169
|
+
loop: true,
|
|
170
|
+
});
|
|
171
|
+
return `${header}\n${page}${error ? `\n ${red(error)}` : ''}`;
|
|
172
|
+
});
|
|
173
|
+
//# sourceMappingURL=searchable-checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchable-checkbox.js","sourceRoot":"","sources":["../../src/prompt/searchable-checkbox.ts"],"names":[],"mappings":"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"}
|
package/types.d.ts
CHANGED
|
@@ -14,10 +14,27 @@ export interface PickOptions<V = string> {
|
|
|
14
14
|
searchFields?: string[];
|
|
15
15
|
search?: (item: PickItem<V>, term: string) => boolean;
|
|
16
16
|
format?: (item: PickItem<V>, stats: UsageStats | null) => string;
|
|
17
|
-
badgeStyle?: 'bracket' | 'dot' | ((group: string) => string);
|
|
17
|
+
badgeStyle?: 'none' | 'bracket' | 'dot' | ((group: string) => string);
|
|
18
18
|
badgeColors?: Record<string, string>;
|
|
19
19
|
sort?: (a: PickItem<V>, b: PickItem<V>) => number;
|
|
20
20
|
onSelect?: (item: PickItem<V>) => void | Promise<void>;
|
|
21
|
+
/** When true, surface typed text as a selectable option when no results match */
|
|
22
|
+
allowFreeText?: boolean;
|
|
23
|
+
/** When false, falls back to a non-search select prompt. Default true. */
|
|
24
|
+
searchable?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface CheckboxOptions<V = string> extends PickOptions<V> {
|
|
27
|
+
/** Require at least one selection before Enter submits. Default false. */
|
|
28
|
+
required?: boolean;
|
|
29
|
+
/** Pre-checked values. */
|
|
30
|
+
defaultChecked?: V[];
|
|
31
|
+
/**
|
|
32
|
+
* When true, typing text that matches no existing items and pressing Enter
|
|
33
|
+
* appends the typed text as a new checked item; the filter clears and the
|
|
34
|
+
* prompt stays open so the user can continue. Multi-select Enter normally
|
|
35
|
+
* submits; allowFreeText overloads Enter only when there are zero matches.
|
|
36
|
+
*/
|
|
37
|
+
allowFreeText?: boolean;
|
|
21
38
|
}
|
|
22
39
|
export interface TrackOptions {
|
|
23
40
|
storePath?: string;
|
|
@@ -49,7 +66,7 @@ export interface Source<V = string> {
|
|
|
49
66
|
export interface WizardContext {
|
|
50
67
|
[key: string]: any;
|
|
51
68
|
}
|
|
52
|
-
export type WizardStep<V = string> = PickStep<V> | SelectStep | InputStep | ConfirmStep | BranchStep;
|
|
69
|
+
export type WizardStep<V = string> = PickStep<V> | CheckboxStep<V> | SelectStep | InputStep | ConfirmStep | BranchStep;
|
|
53
70
|
interface BaseStep {
|
|
54
71
|
id: string;
|
|
55
72
|
when?: (ctx: WizardContext) => boolean | Promise<boolean>;
|
|
@@ -61,6 +78,12 @@ export interface PickStep<V = string> extends BaseStep {
|
|
|
61
78
|
items: PickItem<V>[] | ((ctx: WizardContext) => PickItem<V>[] | Promise<PickItem<V>[]>);
|
|
62
79
|
options?: Omit<PickOptions<V>, 'message'>;
|
|
63
80
|
}
|
|
81
|
+
export interface CheckboxStep<V = string> extends BaseStep {
|
|
82
|
+
type: 'checkbox';
|
|
83
|
+
message?: string;
|
|
84
|
+
items: PickItem<V>[] | ((ctx: WizardContext) => PickItem<V>[] | Promise<PickItem<V>[]>);
|
|
85
|
+
options?: Omit<CheckboxOptions<V>, 'message'>;
|
|
86
|
+
}
|
|
64
87
|
export interface SelectStep extends BaseStep {
|
|
65
88
|
type: 'select';
|
|
66
89
|
message?: string;
|
package/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,MAAM;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,CAAC,CAAA;IACR,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,MAAM;IACrC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,GAAG,YAAY,CAAA;IAC9B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;IACrD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,MAAM,CAAA;IAChE,UAAU,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/wizard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,
|
|
1
|
+
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EAOX,MAAM,YAAY,CAAA;AA2GnB,wBAAsB,MAAM,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,EAClE,KAAK,EAAE,UAAU,EAAE,EACnB,cAAc,GAAE,OAAO,CAAC,CAAC,CAAM,GAC9B,OAAO,CAAC,CAAC,CAAC,CA8BZ"}
|
package/wizard.js
CHANGED
|
@@ -7,6 +7,13 @@ async function executePick(step, ctx) {
|
|
|
7
7
|
...step.options,
|
|
8
8
|
});
|
|
9
9
|
}
|
|
10
|
+
async function executeCheckbox(step, ctx) {
|
|
11
|
+
const items = typeof step.items === 'function' ? await step.items(ctx) : step.items;
|
|
12
|
+
return pickem.checkbox(items, {
|
|
13
|
+
message: step.message,
|
|
14
|
+
...step.options,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
10
17
|
async function executeSelect(step, ctx) {
|
|
11
18
|
const choices = typeof step.choices === 'function' ? await step.choices(ctx) : step.choices;
|
|
12
19
|
return select({
|
|
@@ -49,6 +56,9 @@ async function executeStep(step, ctx) {
|
|
|
49
56
|
case 'pick':
|
|
50
57
|
ctx[step.id] = await executePick(step, ctx);
|
|
51
58
|
break;
|
|
59
|
+
case 'checkbox':
|
|
60
|
+
ctx[step.id] = await executeCheckbox(step, ctx);
|
|
61
|
+
break;
|
|
52
62
|
case 'select':
|
|
53
63
|
ctx[step.id] = await executeSelect(step, ctx);
|
|
54
64
|
break;
|
package/wizard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"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"}
|