v6
 1// Copyright 2022 Google LLC
 2//
 3// Licensed under the Apache License, Version 2.0 (the "License");
 4// you may not use this file except in compliance with the License.
 5// You may obtain a copy of the License at
 6//
 7//     https://www.apache.org/licenses/LICENSE-2.0
 8//
 9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15import { createInterface } from 'node:readline'
16
17export async function question(
18  query: string,
19  { choices }: { choices?: string[] } = {}
20) {
21  let completer = undefined
22  if (Array.isArray(choices)) {
23    completer = function completer(line: string) {
24      const completions = choices
25      const hits = completions.filter((c) => c.startsWith(line))
26      return [hits.length ? hits : completions, line]
27    }
28  }
29  const rl = createInterface({
30    input: process.stdin,
31    output: process.stdout,
32    terminal: true,
33    completer,
34  })
35
36  return new Promise((resolve) =>
37    rl.question(query ?? '', (answer) => {
38      rl.close()
39      resolve(answer)
40    })
41  )
42}