pickem 0.2.0 → 1.0.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.
Files changed (104) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +4 -2
  3. package/checkbox.d.ts.map +1 -1
  4. package/checkbox.js +10 -9
  5. package/checkbox.js.map +1 -1
  6. package/core/ansi.d.ts +16 -0
  7. package/core/ansi.d.ts.map +1 -0
  8. package/core/ansi.js +21 -0
  9. package/core/ansi.js.map +1 -0
  10. package/core/chrome.d.ts +37 -0
  11. package/core/chrome.d.ts.map +1 -0
  12. package/core/chrome.js +51 -0
  13. package/core/chrome.js.map +1 -0
  14. package/core/cleanup.d.ts +5 -0
  15. package/core/cleanup.d.ts.map +1 -0
  16. package/core/cleanup.js +31 -0
  17. package/core/cleanup.js.map +1 -0
  18. package/core/colors.d.ts +24 -0
  19. package/core/colors.d.ts.map +1 -0
  20. package/core/colors.js +67 -0
  21. package/core/colors.js.map +1 -0
  22. package/core/hooks.d.ts +26 -0
  23. package/core/hooks.d.ts.map +1 -0
  24. package/core/hooks.js +80 -0
  25. package/core/hooks.js.map +1 -0
  26. package/core/index.d.ts +9 -0
  27. package/core/index.d.ts.map +1 -0
  28. package/core/index.js +9 -0
  29. package/core/index.js.map +1 -0
  30. package/core/key-reader.d.ts +6 -0
  31. package/core/key-reader.d.ts.map +1 -0
  32. package/core/key-reader.js +29 -0
  33. package/core/key-reader.js.map +1 -0
  34. package/core/keys.d.ts +17 -0
  35. package/core/keys.d.ts.map +1 -0
  36. package/core/keys.js +17 -0
  37. package/core/keys.js.map +1 -0
  38. package/core/pagination.d.ts +14 -0
  39. package/core/pagination.d.ts.map +1 -0
  40. package/core/pagination.js +36 -0
  41. package/core/pagination.js.map +1 -0
  42. package/core/runtime.d.ts +20 -0
  43. package/core/runtime.d.ts.map +1 -0
  44. package/core/runtime.js +74 -0
  45. package/core/runtime.js.map +1 -0
  46. package/core/screen.d.ts +14 -0
  47. package/core/screen.d.ts.map +1 -0
  48. package/core/screen.js +50 -0
  49. package/core/screen.js.map +1 -0
  50. package/core/status-glyph.d.ts +10 -0
  51. package/core/status-glyph.d.ts.map +1 -0
  52. package/core/status-glyph.js +18 -0
  53. package/core/status-glyph.js.map +1 -0
  54. package/core/symbols.d.ts +27 -0
  55. package/core/symbols.d.ts.map +1 -0
  56. package/core/symbols.js +41 -0
  57. package/core/symbols.js.map +1 -0
  58. package/core/testing.d.ts +15 -0
  59. package/core/testing.d.ts.map +1 -0
  60. package/core/testing.js +47 -0
  61. package/core/testing.js.map +1 -0
  62. package/core/theme.d.ts +14 -0
  63. package/core/theme.d.ts.map +1 -0
  64. package/core/theme.js +10 -0
  65. package/core/theme.js.map +1 -0
  66. package/core/width.d.ts +7 -0
  67. package/core/width.d.ts.map +1 -0
  68. package/core/width.js +46 -0
  69. package/core/width.js.map +1 -0
  70. package/package.json +4 -5
  71. package/pickem.d.ts.map +1 -1
  72. package/pickem.js +6 -5
  73. package/pickem.js.map +1 -1
  74. package/prompts/checkbox.d.ts +14 -0
  75. package/prompts/checkbox.d.ts.map +1 -0
  76. package/prompts/checkbox.js +56 -0
  77. package/prompts/checkbox.js.map +1 -0
  78. package/prompts/confirm.d.ts +6 -0
  79. package/prompts/confirm.d.ts.map +1 -0
  80. package/prompts/confirm.js +32 -0
  81. package/prompts/confirm.js.map +1 -0
  82. package/prompts/input.d.ts +7 -0
  83. package/prompts/input.d.ts.map +1 -0
  84. package/prompts/input.js +52 -0
  85. package/prompts/input.js.map +1 -0
  86. package/prompts/search.d.ts +12 -0
  87. package/prompts/search.d.ts.map +1 -0
  88. package/prompts/search.js +67 -0
  89. package/prompts/search.js.map +1 -0
  90. package/prompts/searchable-checkbox.d.ts +14 -0
  91. package/prompts/searchable-checkbox.d.ts.map +1 -0
  92. package/prompts/searchable-checkbox.js +150 -0
  93. package/prompts/searchable-checkbox.js.map +1 -0
  94. package/prompts/select.d.ts +12 -0
  95. package/prompts/select.d.ts.map +1 -0
  96. package/prompts/select.js +40 -0
  97. package/prompts/select.js.map +1 -0
  98. package/wizard.d.ts.map +1 -1
  99. package/wizard.js +7 -5
  100. package/wizard.js.map +1 -1
  101. package/prompt/searchable-checkbox.d.ts +0 -26
  102. package/prompt/searchable-checkbox.d.ts.map +0 -1
  103. package/prompt/searchable-checkbox.js +0 -173
  104. package/prompt/searchable-checkbox.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-reader.js","sourceRoot":"","sources":["../../src/core/key-reader.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAO1C,MAAM,UAAU,eAAe,CAAC,KAAwB;IACtD,MAAM,OAAO,GAAG,IAAI,YAAY,EAAe,CAAA;IAC/C,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAA;IAClC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;IAChD,IAAI,KAAK,CAAC,KAAK;QAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAEvC,MAAM,UAAU,GAAG,CAAC,GAAuB,EAAE,GAA6B,EAAE,EAAE;QAC5E,MAAM,KAAK,GAAa;YACtB,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE;YACrB,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,GAAG,IAAI,EAAE;YACpC,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,KAAK;YACxB,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,KAAK;YACxB,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK;SAC3B,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IAC5B,CAAC,CAAA;IAED,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;IAChC,IAAI,KAAK,CAAC,KAAK;QAAE,KAAK,CAAC,MAAM,EAAE,CAAA;IAE/B,OAAO,CAAC,KAAK,GAAG,GAAG,EAAE;QACnB,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;QACjC,IAAI,KAAK,CAAC,KAAK;YAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC3C,CAAC,CAAA;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
package/core/keys.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ export interface KeyEvent {
2
+ name: string;
3
+ sequence: string;
4
+ ctrl: boolean;
5
+ meta: boolean;
6
+ shift: boolean;
7
+ }
8
+ export declare const isEnter: (k: KeyEvent) => boolean;
9
+ export declare const isUp: (k: KeyEvent) => boolean;
10
+ export declare const isDown: (k: KeyEvent) => boolean;
11
+ export declare const isSpace: (k: KeyEvent) => boolean;
12
+ export declare const isBackspace: (k: KeyEvent) => boolean;
13
+ export declare const isEscape: (k: KeyEvent) => boolean;
14
+ export declare const isTab: (k: KeyEvent) => boolean;
15
+ export declare const isCtrlC: (k: KeyEvent) => boolean;
16
+ export declare function isPrintable(k: KeyEvent): boolean;
17
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/core/keys.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,OAAO,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;CACf;AAED,eAAO,MAAM,OAAO,GAAI,GAAG,QAAQ,YAA8C,CAAA;AACjF,eAAO,MAAM,IAAI,GAAI,GAAG,QAAQ,YAAoE,CAAA;AACpG,eAAO,MAAM,MAAM,GAAI,GAAG,QAAQ,YAAsE,CAAA;AACxG,eAAO,MAAM,OAAO,GAAI,GAAG,QAAQ,YAA6C,CAAA;AAChF,eAAO,MAAM,WAAW,GAAI,GAAG,QAAQ,YAA2B,CAAA;AAClE,eAAO,MAAM,QAAQ,GAAI,GAAG,QAAQ,YAAwB,CAAA;AAC5D,eAAO,MAAM,KAAK,GAAI,GAAG,QAAQ,YAAqB,CAAA;AACtD,eAAO,MAAM,OAAO,GAAI,GAAG,QAAQ,YAA6B,CAAA;AAEhE,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,CAKhD"}
package/core/keys.js ADDED
@@ -0,0 +1,17 @@
1
+ export const isEnter = (k) => k.name === 'enter' || k.name === 'return';
2
+ export const isUp = (k) => k.name === 'up' || k.name === 'k' || (k.ctrl && k.name === 'p');
3
+ export const isDown = (k) => k.name === 'down' || k.name === 'j' || (k.ctrl && k.name === 'n');
4
+ export const isSpace = (k) => k.name === 'space' || k.sequence === ' ';
5
+ export const isBackspace = (k) => k.name === 'backspace';
6
+ export const isEscape = (k) => k.name === 'escape';
7
+ export const isTab = (k) => k.name === 'tab';
8
+ export const isCtrlC = (k) => k.ctrl && k.name === 'c';
9
+ export function isPrintable(k) {
10
+ if (k.ctrl || k.meta)
11
+ return false;
12
+ if (!k.sequence || k.sequence.length !== 1)
13
+ return false;
14
+ const code = k.sequence.codePointAt(0) ?? 0;
15
+ return code >= 0x20 && code !== 0x7f; // printable, not DEL
16
+ }
17
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/core/keys.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAA;AACjF,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAA;AACpG,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAA;AACxG,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAA;AAChF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAA;AAClE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAA;AAC5D,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAA;AACtD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAA;AAEhE,MAAM,UAAU,WAAW,CAAC,CAAW;IACrC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA;IAClC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACxD,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAC3C,OAAO,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,CAAA,CAAC,qBAAqB;AAC5D,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface RenderItemArgs<T> {
2
+ item: T;
3
+ index: number;
4
+ isActive: boolean;
5
+ }
6
+ export interface PaginationArgs<T> {
7
+ items: readonly T[];
8
+ active: number;
9
+ pageSize: number;
10
+ loop?: boolean;
11
+ renderItem: (args: RenderItemArgs<T>) => string;
12
+ }
13
+ export declare function usePagination<T>({ items, active, pageSize, loop, renderItem, }: PaginationArgs<T>): string;
14
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/core/pagination.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,KAAK,EAAE,SAAS,CAAC,EAAE,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,UAAU,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,MAAM,CAAA;CAChD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAC/B,KAAK,EACL,MAAM,EACN,QAAQ,EACR,IAAW,EACX,UAAU,GACX,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,MAAM,CA8B5B"}
@@ -0,0 +1,36 @@
1
+ import { useRef } from './hooks.js';
2
+ export function usePagination({ items, active, pageSize, loop = true, renderItem, }) {
3
+ const pointer = useRef(0); // active row position within the visible window
4
+ const size = Math.min(pageSize, items.length);
5
+ if (items.length === 0)
6
+ return '';
7
+ // Keep the active row's window position stable, clamping at list edges (non-loop).
8
+ if (size < items.length) {
9
+ if (loop) {
10
+ // Center-ish: move the pointer with the active item, wrapping.
11
+ pointer.current = Math.floor(size / 2);
12
+ }
13
+ else {
14
+ const half = Math.floor(size / 2);
15
+ if (active < half)
16
+ pointer.current = active;
17
+ else if (active >= items.length - half)
18
+ pointer.current = size - (items.length - active);
19
+ else
20
+ pointer.current = half;
21
+ }
22
+ }
23
+ else {
24
+ pointer.current = active;
25
+ }
26
+ const top = loop
27
+ ? (active - pointer.current + items.length) % items.length
28
+ : Math.max(0, Math.min(active - pointer.current, items.length - size));
29
+ const lines = [];
30
+ for (let i = 0; i < size; i++) {
31
+ const index = loop ? (top + i) % items.length : top + i;
32
+ lines.push(renderItem({ item: items[index], index, isActive: index === active }));
33
+ }
34
+ return lines.join('\n');
35
+ }
36
+ //# sourceMappingURL=pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/core/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAgBnC,MAAM,UAAU,aAAa,CAAI,EAC/B,KAAK,EACL,MAAM,EACN,QAAQ,EACR,IAAI,GAAG,IAAI,EACX,UAAU,GACQ;IAClB,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA,CAAC,gDAAgD;IAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEjC,mFAAmF;IACnF,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,IAAI,IAAI,EAAE,CAAC;YACT,+DAA+D;YAC/D,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;QACxC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;YACjC,IAAI,MAAM,GAAG,IAAI;gBAAE,OAAO,CAAC,OAAO,GAAG,MAAM,CAAA;iBACtC,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;gBAAE,OAAO,CAAC,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;;gBACnF,OAAO,CAAC,OAAO,GAAG,IAAI,CAAA;QAC7B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,OAAO,GAAG,MAAM,CAAA;IAC1B,CAAC;IAED,MAAM,GAAG,GAAG,IAAI;QACd,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM;QAC1D,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAA;IAExE,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;QACvD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,KAAK,MAAM,EAAE,CAAC,CAAC,CAAA;IACnF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
@@ -0,0 +1,20 @@
1
+ export type Status = 'idle' | 'loading' | 'done' | 'canceled';
2
+ /** The input-buffer controller passed to keypress handlers (pickem's `rl` replacement). */
3
+ export interface PickerInput {
4
+ line: string;
5
+ setLine(value: string): void;
6
+ clearLine(): void;
7
+ }
8
+ export interface PickerContext {
9
+ status: Status;
10
+ }
11
+ export type View<Config, Value> = (config: Config, done: (value: Value) => void) => string | [string, string];
12
+ export interface RunOptions {
13
+ input?: NodeJS.ReadStream;
14
+ output?: NodeJS.WriteStream;
15
+ }
16
+ export declare class CancelError extends Error {
17
+ constructor();
18
+ }
19
+ export declare function createPicker<Config, Value>(view: View<Config, Value>): (config: Config, opts?: RunOptions) => Promise<Value>;
20
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAA;AAE7D,2FAA2F;AAC3F,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,SAAS,IAAI,IAAI,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,KACzB,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAE9B,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAA;CAC5B;AAED,qBAAa,WAAY,SAAQ,KAAK;;CAKrC;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAC3D,QAAQ,MAAM,EAAE,OAAM,UAAe,KAAG,OAAO,CAAC,KAAK,CAAC,CAgE/D"}
@@ -0,0 +1,74 @@
1
+ import { createKeyReader } from './key-reader.js';
2
+ import { Screen } from './screen.js';
3
+ import { createHookStore, withHookStore } from './hooks.js';
4
+ import { isCtrlC } from './keys.js';
5
+ export class CancelError extends Error {
6
+ constructor() {
7
+ super('Picker canceled');
8
+ this.name = 'CancelError';
9
+ }
10
+ }
11
+ export function createPicker(view) {
12
+ return (config, opts = {}) => {
13
+ const input = opts.input ?? process.stdin;
14
+ const output = opts.output ?? process.stdout;
15
+ const screen = new Screen(output);
16
+ const reader = createKeyReader(input);
17
+ return new Promise((resolve, reject) => {
18
+ let store;
19
+ let inputBuffer = '';
20
+ let finished = false;
21
+ const pickerInput = {
22
+ get line() {
23
+ return inputBuffer;
24
+ },
25
+ setLine(value) {
26
+ inputBuffer = value;
27
+ },
28
+ clearLine() {
29
+ inputBuffer = '';
30
+ },
31
+ };
32
+ const cleanup = () => {
33
+ reader.close();
34
+ screen.done();
35
+ };
36
+ const done = (value) => {
37
+ if (finished)
38
+ return;
39
+ finished = true;
40
+ render(); // final frame (status 'done')
41
+ cleanup();
42
+ resolve(value);
43
+ };
44
+ const render = () => {
45
+ store.reset();
46
+ const frame = withHookStore(store, () => view(config, done));
47
+ // Flush effects queued during render.
48
+ for (const effect of store.effects)
49
+ effect();
50
+ const [body, bottom] = Array.isArray(frame) ? frame : [frame, ''];
51
+ screen.render(body, bottom);
52
+ };
53
+ store = createHookStore(() => {
54
+ if (!finished)
55
+ render();
56
+ });
57
+ reader.on('key', (key) => {
58
+ if (isCtrlC(key)) {
59
+ finished = true;
60
+ cleanup();
61
+ reject(new CancelError());
62
+ return;
63
+ }
64
+ for (const handler of store.keypressHandlers)
65
+ handler(key, pickerInput);
66
+ if (!finished)
67
+ render();
68
+ });
69
+ screen.start();
70
+ render();
71
+ });
72
+ };
73
+ }
74
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare class Screen {
2
+ private readonly out;
3
+ private height;
4
+ private offExit;
5
+ private onResize;
6
+ private lastRender;
7
+ constructor(out: NodeJS.WriteStream);
8
+ private get columns();
9
+ start(): void;
10
+ private wrap;
11
+ render(body: string, bottom?: string): void;
12
+ done(): void;
13
+ }
14
+ //# sourceMappingURL=screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../src/core/screen.ts"],"names":[],"mappings":"AAIA,qBAAa,MAAM;IAML,OAAO,CAAC,QAAQ,CAAC,GAAG;IALhC,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,QAAQ,CAA+E;IAC/F,OAAO,CAAC,UAAU,CAAgC;gBAErB,GAAG,EAAE,MAAM,CAAC,WAAW;IAEpD,OAAO,KAAK,OAAO,GAElB;IAED,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,IAAI;IAMZ,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,IAAI;IAgBvC,IAAI,IAAI,IAAI;CAOb"}
package/core/screen.js ADDED
@@ -0,0 +1,50 @@
1
+ import { ansi } from './ansi.js';
2
+ import { onExit } from './cleanup.js';
3
+ import { wrapToWidth } from './width.js';
4
+ export class Screen {
5
+ out;
6
+ height = 0;
7
+ offExit = null;
8
+ onResize = () => this.lastRender && this.render(this.lastRender[0], this.lastRender[1]);
9
+ lastRender = null;
10
+ constructor(out) {
11
+ this.out = out;
12
+ }
13
+ get columns() {
14
+ return this.out.columns || 80;
15
+ }
16
+ start() {
17
+ this.out.write(ansi.hideCursor);
18
+ this.offExit = onExit(() => this.out.write(ansi.showCursor));
19
+ this.out.on?.('resize', this.onResize);
20
+ }
21
+ wrap(frame) {
22
+ return frame
23
+ .split('\n')
24
+ .flatMap((line) => (line === '' ? [''] : wrapToWidth(line, this.columns)));
25
+ }
26
+ render(body, bottom = '') {
27
+ this.lastRender = [body, bottom];
28
+ const frame = bottom ? `${body}\n${bottom}` : body;
29
+ const lines = this.wrap(frame);
30
+ let buf = ansi.beginSync;
31
+ if (this.height > 0) {
32
+ buf += ansi.cursorTo(0);
33
+ if (this.height > 1)
34
+ buf += ansi.cursorUp(this.height - 1);
35
+ buf += ansi.eraseDown;
36
+ }
37
+ buf += lines.join('\n');
38
+ buf += ansi.endSync;
39
+ this.out.write(buf);
40
+ this.height = lines.length;
41
+ }
42
+ done() {
43
+ this.out.write(`${ansi.showCursor}\n`);
44
+ this.out.off?.('resize', this.onResize);
45
+ this.offExit?.();
46
+ this.height = 0;
47
+ this.lastRender = null;
48
+ }
49
+ }
50
+ //# sourceMappingURL=screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/core/screen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Status } from './runtime.js';
2
+ import type { Colors } from './colors.js';
3
+ import type { Symbols } from './symbols.js';
4
+ export interface StatusGlyphArgs {
5
+ status: Status;
6
+ colors: Colors;
7
+ symbols: Symbols;
8
+ }
9
+ export declare function useStatusGlyph({ status, colors, symbols }: StatusGlyphArgs): string;
10
+ //# sourceMappingURL=status-glyph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-glyph.d.ts","sourceRoot":"","sources":["../../src/core/status-glyph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE3C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,eAAe,GAAG,MAAM,CAYnF"}
@@ -0,0 +1,18 @@
1
+ import { useState, useEffect } from './hooks.js';
2
+ export function useStatusGlyph({ status, colors, symbols }) {
3
+ const [frame, setFrame] = useState(0);
4
+ useEffect(() => {
5
+ if (status !== 'loading')
6
+ return;
7
+ const id = setInterval(() => setFrame((frame + 1) % symbols.spinnerFrames.length), 80);
8
+ return () => clearInterval(id);
9
+ }, [status]);
10
+ if (status === 'loading')
11
+ return colors.cyan(symbols.spinnerFrames[frame]);
12
+ if (status === 'done')
13
+ return colors.green(symbols.stepDone);
14
+ if (status === 'canceled')
15
+ return colors.red(symbols.stepCancel);
16
+ return colors.cyan(symbols.stepActive);
17
+ }
18
+ //# sourceMappingURL=status-glyph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-glyph.js","sourceRoot":"","sources":["../../src/core/status-glyph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAWhD,MAAM,UAAU,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAmB;IACzE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACrC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,KAAK,SAAS;YAAE,OAAM;QAChC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAA;QACtF,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;IAChC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAEZ,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1E,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC5D,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAChE,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;AACxC,CAAC"}
@@ -0,0 +1,27 @@
1
+ export declare function isUnicodeSupported(env?: NodeJS.ProcessEnv): boolean;
2
+ export declare function makeSymbols(unicode?: boolean): {
3
+ railBar: string;
4
+ railEnd: string;
5
+ railStart: string;
6
+ stepActive: string;
7
+ stepDone: string;
8
+ stepCancel: string;
9
+ stepError: string;
10
+ radioOn: string;
11
+ radioOff: string;
12
+ checkOn: string;
13
+ checkOff: string;
14
+ pointer: string;
15
+ cornerTL: string;
16
+ cornerTR: string;
17
+ cornerBL: string;
18
+ cornerBR: string;
19
+ line: string;
20
+ boxV: string;
21
+ search: string;
22
+ moreBelow: string;
23
+ moreAbove: string;
24
+ spinnerFrames: string[];
25
+ };
26
+ export type Symbols = ReturnType<typeof makeSymbols>;
27
+ //# sourceMappingURL=symbols.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../../src/core/symbols.ts"],"names":[],"mappings":"AAGA,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAUhF;AAED,wBAAgB,WAAW,CAAC,OAAO,UAAuB;;;;;;;;;;;;;;;;;;;;;;;EA2BzD;AAED,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAA"}
@@ -0,0 +1,41 @@
1
+ // src/core/symbols.ts
2
+ // Conservative Unicode-capability check (Windows legacy consoles excluded).
3
+ export function isUnicodeSupported(env = process.env) {
4
+ if (process.platform !== 'win32')
5
+ return env.TERM !== 'linux';
6
+ return (Boolean(env.WT_SESSION) || // Windows Terminal
7
+ Boolean(env.TERMINUS_SUBLIME) ||
8
+ env.ConEmuTask === '{cmd::Cmder}' ||
9
+ env.TERM_PROGRAM === 'vscode' ||
10
+ env.TERM === 'xterm-256color' ||
11
+ env.TERM === 'alacritty');
12
+ }
13
+ export function makeSymbols(unicode = isUnicodeSupported()) {
14
+ const u = (uni, ascii) => (unicode ? uni : ascii);
15
+ return {
16
+ railBar: u('│', '|'),
17
+ railEnd: u('└', '—'),
18
+ railStart: u('◆', '*'),
19
+ stepActive: u('◆', '*'),
20
+ stepDone: u('◇', 'o'),
21
+ stepCancel: u('■', 'x'),
22
+ stepError: u('▲', '!'),
23
+ radioOn: u('●', '>'),
24
+ radioOff: u('○', ' '),
25
+ checkOn: u('◼', '[x]'),
26
+ checkOff: u('◻', '[ ]'),
27
+ pointer: u('❯', '>'),
28
+ cornerTL: u('╭', '+'),
29
+ cornerTR: u('╮', '+'),
30
+ cornerBL: u('╰', '+'),
31
+ cornerBR: u('╯', '+'),
32
+ line: u('─', '-'),
33
+ boxV: u('│', '|'),
34
+ // selector UI glyphs (docs/standards/selector-ui.md)
35
+ search: u('⌕', '/'),
36
+ moreBelow: u('↓', 'v'),
37
+ moreAbove: u('↑', '^'),
38
+ spinnerFrames: unicode ? ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] : ['-', '\\', '|', '/'],
39
+ };
40
+ }
41
+ //# sourceMappingURL=symbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbols.js","sourceRoot":"","sources":["../../src/core/symbols.ts"],"names":[],"mappings":"AAAA,sBAAsB;AAEtB,4EAA4E;AAC5E,MAAM,UAAU,kBAAkB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACrE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,GAAG,CAAC,IAAI,KAAK,OAAO,CAAA;IAC7D,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,mBAAmB;QAC9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAC7B,GAAG,CAAC,UAAU,KAAK,cAAc;QACjC,GAAG,CAAC,YAAY,KAAK,QAAQ;QAC7B,GAAG,CAAC,IAAI,KAAK,gBAAgB;QAC7B,GAAG,CAAC,IAAI,KAAK,WAAW,CACzB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAO,GAAG,kBAAkB,EAAE;IACxD,MAAM,CAAC,GAAG,CAAI,GAAM,EAAE,KAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IAC1D,OAAO;QACL,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACpB,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACtB,UAAU,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACvB,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACrB,UAAU,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACvB,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACtB,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACpB,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACrB,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC;QACtB,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC;QACvB,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACpB,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACrB,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACrB,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACrB,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACrB,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACjB,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACjB,qDAAqD;QACrD,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACnB,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACtB,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;QACtB,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;KACpG,CAAA;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { KeyEvent } from './keys.js';
2
+ export interface TestEvents {
3
+ keypress(name: string, mods?: Partial<KeyEvent>): void;
4
+ type(text: string): void;
5
+ }
6
+ export interface TestHandle<V> {
7
+ answer: Promise<V>;
8
+ events: TestEvents;
9
+ getScreen(): string;
10
+ }
11
+ export declare function renderTest<Config, V>(picker: (config: Config, opts: {
12
+ input?: any;
13
+ output?: any;
14
+ }) => Promise<V>, config: Config): Promise<TestHandle<V>>;
15
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/core/testing.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AA+BzC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAA;IACtD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;IAClB,MAAM,EAAE,UAAU,CAAA;IAClB,SAAS,IAAI,MAAM,CAAA;CACpB;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,CAAC,EACxC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,GAAG,CAAC;IAAC,MAAM,CAAC,EAAE,GAAG,CAAA;CAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EAC3E,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAgBxB"}
@@ -0,0 +1,47 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import { stripAnsi } from './width.js';
3
+ class FakeInput extends EventEmitter {
4
+ isTTY = false;
5
+ setRawMode() { }
6
+ resume() { }
7
+ // The key reader calls readline.emitKeypressEvents then listens on 'keypress'.
8
+ // For tests we bypass readline and emit 'keypress' directly via pushKey().
9
+ pushKey(name, mods = {}) {
10
+ const key = { name, sequence: mods.sequence ?? '', ctrl: !!mods.ctrl, meta: !!mods.meta, shift: !!mods.shift };
11
+ this.emit('keypress', key.sequence, key);
12
+ }
13
+ }
14
+ class FakeOutput extends EventEmitter {
15
+ columns = 80;
16
+ isTTY = true;
17
+ buffer = '';
18
+ write(s) {
19
+ // Synchronized-output + erase sequences are stripped for assertion simplicity;
20
+ // we keep only the latest "frame" by resetting on the begin-sync marker.
21
+ this.buffer += s;
22
+ return true;
23
+ }
24
+ latestFrame() {
25
+ // Keep text after the final beginSync marker, strip all ANSI.
26
+ const parts = this.buffer.split('\x1b[?2026h');
27
+ return stripAnsi(parts[parts.length - 1] ?? '');
28
+ }
29
+ }
30
+ export async function renderTest(picker, config) {
31
+ const input = new FakeInput();
32
+ const output = new FakeOutput();
33
+ const answer = picker(config, { input: input, output: output });
34
+ const events = {
35
+ keypress(name, mods = {}) {
36
+ input.pushKey(name, mods);
37
+ },
38
+ type(text) {
39
+ for (const ch of text)
40
+ input.pushKey(ch, { sequence: ch });
41
+ },
42
+ };
43
+ // Let the initial render settle.
44
+ await Promise.resolve();
45
+ return { answer, events, getScreen: () => output.latestFrame().trim() };
46
+ }
47
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/core/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAGtC,MAAM,SAAU,SAAQ,YAAY;IAClC,KAAK,GAAG,KAAK,CAAA;IACb,UAAU,KAAI,CAAC;IACf,MAAM,KAAI,CAAC;IACX,+EAA+E;IAC/E,2EAA2E;IAC3E,OAAO,CAAC,IAAY,EAAE,OAA0B,EAAE;QAChD,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;QAC9G,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC1C,CAAC;CACF;AAED,MAAM,UAAW,SAAQ,YAAY;IACnC,OAAO,GAAG,EAAE,CAAA;IACZ,KAAK,GAAG,IAAI,CAAA;IACJ,MAAM,GAAG,EAAE,CAAA;IACnB,KAAK,CAAC,CAAS;QACb,+EAA+E;QAC/E,yEAAyE;QACzE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;QAChB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,WAAW;QACT,8DAA8D;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;QAC9C,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IACjD,CAAC;CACF;AAaD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAA2E,EAC3E,MAAc;IAEd,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAA;IAC7B,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAA;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAY,EAAE,MAAM,EAAE,MAAa,EAAE,CAAC,CAAA;IAE7E,MAAM,MAAM,GAAe;QACzB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE;YACtB,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC3B,CAAC;QACD,IAAI,CAAC,IAAI;YACP,KAAK,MAAM,EAAE,IAAI,IAAI;gBAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;QAC5D,CAAC;KACF,CAAA;IACD,iCAAiC;IACjC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;IACvB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAA;AACzE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type Chrome } from './chrome.js';
2
+ import type { Colors } from './colors.js';
3
+ import type { Symbols } from './symbols.js';
4
+ export interface ThemeOptions {
5
+ colorLevel?: 0 | 1 | 2 | 3;
6
+ unicode?: boolean;
7
+ }
8
+ export interface Theme {
9
+ colors: Colors;
10
+ symbols: Symbols;
11
+ chrome: Chrome;
12
+ }
13
+ export declare function makeTheme(opts?: ThemeOptions): Theme;
14
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/core/theme.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE3C,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,SAAS,CAAC,IAAI,GAAE,YAAiB,GAAG,KAAK,CAKxD"}
package/core/theme.js ADDED
@@ -0,0 +1,10 @@
1
+ import { makeColors } from './colors.js';
2
+ import { makeSymbols, isUnicodeSupported } from './symbols.js';
3
+ import { makeChrome } from './chrome.js';
4
+ export function makeTheme(opts = {}) {
5
+ const colors = makeColors(opts.colorLevel != null ? { level: opts.colorLevel } : {});
6
+ const symbols = makeSymbols(opts.unicode ?? isUnicodeSupported());
7
+ const chrome = makeChrome({ colors, symbols });
8
+ return { colors, symbols, chrome };
9
+ }
10
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/core/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAe,MAAM,aAAa,CAAA;AAerD,MAAM,UAAU,SAAS,CAAC,OAAqB,EAAE;IAC/C,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACpF,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,IAAI,kBAAkB,EAAE,CAAC,CAAA;IACjE,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;IAC9C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;AACpC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function displayWidth(str: string): number;
2
+ export declare function stripAnsi(str: string): string;
3
+ /** Truncate to `max` display columns, appending an ellipsis when cut. */
4
+ export declare function truncateToWidth(str: string, max: number, ellipsis?: string): string;
5
+ /** Greedy word-wrap on display width. ANSI sequences count as zero width. */
6
+ export declare function wrapToWidth(str: string, max: number): string[];
7
+ //# sourceMappingURL=width.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"width.d.ts","sourceRoot":"","sources":["../../src/core/width.ts"],"names":[],"mappings":"AAMA,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,MAAM,CAYhF;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAe9D"}
package/core/width.js ADDED
@@ -0,0 +1,46 @@
1
+ // src/core/width.ts
2
+ import stringWidth from 'string-width';
3
+ // eslint-disable-next-line no-control-regex
4
+ const ANSI_RE = /\x1b\[[0-9;]*m/g;
5
+ export function displayWidth(str) {
6
+ return stringWidth(str);
7
+ }
8
+ export function stripAnsi(str) {
9
+ return str.replace(ANSI_RE, '');
10
+ }
11
+ /** Truncate to `max` display columns, appending an ellipsis when cut. */
12
+ export function truncateToWidth(str, max, ellipsis = '…') {
13
+ if (displayWidth(str) <= max)
14
+ return str;
15
+ const budget = max - displayWidth(ellipsis);
16
+ let out = '';
17
+ let w = 0;
18
+ for (const ch of str) {
19
+ const cw = displayWidth(ch);
20
+ if (w + cw > budget)
21
+ break;
22
+ out += ch;
23
+ w += cw;
24
+ }
25
+ return out + ellipsis;
26
+ }
27
+ /** Greedy word-wrap on display width. ANSI sequences count as zero width. */
28
+ export function wrapToWidth(str, max) {
29
+ const words = str.split(' ');
30
+ const lines = [];
31
+ let line = '';
32
+ for (const word of words) {
33
+ const candidate = line ? `${line} ${word}` : word;
34
+ if (displayWidth(candidate) > max && line) {
35
+ lines.push(line);
36
+ line = word;
37
+ }
38
+ else {
39
+ line = candidate;
40
+ }
41
+ }
42
+ if (line)
43
+ lines.push(line);
44
+ return lines;
45
+ }
46
+ //# sourceMappingURL=width.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"width.js","sourceRoot":"","sources":["../../src/core/width.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,OAAO,WAAW,MAAM,cAAc,CAAA;AAEtC,4CAA4C;AAC5C,MAAM,OAAO,GAAG,iBAAiB,CAAA;AAEjC,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;AACjC,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,GAAW,EAAE,QAAQ,GAAG,GAAG;IACtE,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG;QAAE,OAAO,GAAG,CAAA;IACxC,MAAM,MAAM,GAAG,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IAC3C,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC,CAAA;QAC3B,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM;YAAE,MAAK;QAC1B,GAAG,IAAI,EAAE,CAAA;QACT,CAAC,IAAI,EAAE,CAAA;IACT,CAAC;IACD,OAAO,GAAG,GAAG,QAAQ,CAAA;AACvB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,GAAW;IAClD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC5B,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QACjD,IAAI,YAAY,CAAC,SAAS,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChB,IAAI,GAAG,IAAI,CAAA;QACb,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IACD,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1B,OAAO,KAAK,CAAA;AACd,CAAC"}
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "pickem",
3
- "version": "0.2.0",
3
+ "version": "1.0.0",
4
4
  "description": "Usage-sorted searchable autocomplete for CLI tools",
5
5
  "type": "module",
6
6
  "main": "./index.js",
7
7
  "types": "./index.d.ts",
8
8
  "exports": {
9
9
  ".": {
10
- "import": "./index.js",
11
- "types": "./index.d.ts"
10
+ "types": "./index.d.ts",
11
+ "import": "./index.js"
12
12
  }
13
13
  },
14
14
  "sideEffects": false,
@@ -38,7 +38,6 @@
38
38
  "access": "public"
39
39
  },
40
40
  "dependencies": {
41
- "@inquirer/core": "^10.3.2",
42
- "@inquirer/prompts": "^7.0.0"
41
+ "string-width": "^7.2.0"
43
42
  }
44
43
  }
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,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"}
1
+ {"version":3,"file":"pickem.d.ts","sourceRoot":"","sources":["../src/pickem.ts"],"names":[],"mappings":"AAEA,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"}