• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

earthnutDev / a-node-tools / 14630860861

24 Apr 2025 12:38AM UTC coverage: 39.098% (+6.2%) from 32.891%
14630860861

push

github

earthnutDev
version: 2.2.0 2025-04-24 08:38:51 没啥,更新着玩 😄

71 of 182 branches covered (39.01%)

Branch coverage included in aggregate %.

2 of 3 new or added lines in 2 files covered. (66.67%)

58 existing lines in 6 files now uncovered.

137 of 350 relevant lines covered (39.14%)

1.44 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/readInput/readInput.ts
1
import { getRandomInt } from 'a-js-tools';
2
import { createInterface, Interface } from 'node:readline';
×
3
import readInputData from './readInputData';
×
4
import { isFunction } from 'a-type-of-js';
5

×
6
/**
×
7
 *
×
8
 *
×
9
 * ## 监听用户输入
×
10
 *
×
11
 * @param _callback 回调函数,必须,可接收两个参数,分别用户按键及键原始值
12
 * @returns   Promise<unknown>
13
 * @example
14
 *
15
 * ```ts
16
 * import { readInput , _p } from 'a-node-tools';
17
 *
18
 *
19
 *
20
 *
21
 * ```
22
 *
23
 */
24
export async function readInput(
25
  _callback: (keyValue: string | undefined, key: unknown) => boolean,
26
  // option: null = null,
27
) {
28
  const { stdin, stdout } = process;
29
  // 获取一个随机字母
UNCOV
30
  const _n = () => getRandomInt(96, 122);
×
31
  /** 获取唯一的 key
UNCOV
32
   *
×
33
   * 用于向数据仓储中添加本次调用的 key
34
   */
35
  const uniKey = Symbol(String.fromCodePoint(_n(), _n(), _n()));
36

37
  return new Promise(resolve => {
×
UNCOV
38
    let rl: Interface;
×
39
    /**  注册事件
40
     *
41
     * 并在注册时指定当前是否开始或者是结束
42
     *
43
     * 将 process.stdout.keypress  事件放到回调中执行,然后再合适的时候再注销掉该事件
44
     *
45
     */
46
    readInputData.on(uniKey, (runMi: boolean) => {
UNCOV
47
      /// 意外退出(用于在 hot 中使用)
×
48
      //  TODO  上面那么做会造成不必要的性能损耗,这里不做维护  -- (09:19:15-07/17/2024)
49
      process.on('beforeExit', stdRemoveListener);
UNCOV
50
      /** 如果事件触发为 false ,则停止流的推入。等待事件的返回 */
×
51
      if (runMi) {
UNCOV
52
        rl = createInterface({ input: stdin, output: stdout });
×
53
        stdin.on('keypress', pressCallFn);
×
UNCOV
54
      }
×
55
    });
56

57
    /**
58
     *
59
     * 键盘按下回调 */
60
    function pressCallFn(keyValue: string | undefined, key: unknown) {
61
      // 如果当前并非第一个注册的方法先返回等待上一个注册的方法结束先
62
      /// 这里为了给列表做一个
UNCOV
63
      if (isFunction(_callback)) {
×
64
        /**
65
         *  回调返回的是  true
66
         *
67
         *  则说明该方法已经结束,可以申请结束当前的移除监听工作
68
         */
UNCOV
69
        if (Reflect.apply(_callback, null, [keyValue, key])) {
×
UNCOV
70
          removeListenerCallFn();
×
UNCOV
71
          resolve(key);
×
72
        }
73
      } else {
74
        // 移除监听
75
        removeListenerCallFn();
76
        // 返回值
×
77
        resolve(key);
UNCOV
78
      }
×
79
    }
80

81
    /**
82
     *
83
     * 移除监听 */
84
    function removeListenerCallFn() {
85
      //  TODO  当前这么做或导致每一次都不停的创建监听,移除监听.后续可能会优化  -- (09:40:01-07/17/2024)
UNCOV
86
      process.removeListener('beforeExit', stdRemoveListener);
×
UNCOV
87
      stdRemoveListener();
×
88
      // 调用移除将使用权交给先一个使用者或者结束 read input
UNCOV
89
      if (rl.close) {
×
UNCOV
90
        rl.close();
×
91
      }
92
      // 移除并调用下一个
93
      // eslint-disable-next-line @typescript-eslint/no-unused-expressions
UNCOV
94
      readInputData.remove;
×
UNCOV
95
      return true;
×
96
    }
97

98
    /**
99
     *
100
     *
101
     */
UNCOV
102
    function stdRemoveListener() {
×
103
      stdin.removeListener('keypress', pressCallFn);
104
    }
105
  });
106
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc