summaryrefslogtreecommitdiff
path: root/cli/rt/41_prompt.js
blob: 5a588def15bdd879d3cab135e8f090f1b67d384a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => {
  const { stdin, stdout } = window.__bootstrap.files;
  const { isatty } = window.__bootstrap.tty;
  const LF = "\n".charCodeAt(0);
  const encoder = new TextEncoder();
  const decoder = new TextDecoder();

  function alert(message = "Alert") {
    if (!isatty(stdin.rid)) {
      return;
    }

    stdout.writeSync(encoder.encode(`${message} [Enter] `));

    readLineFromStdinSync();
  }

  function confirm(message = "Confirm") {
    if (!isatty(stdin.rid)) {
      return false;
    }

    stdout.writeSync(encoder.encode(`${message} [y/N] `));

    const answer = readLineFromStdinSync();

    return answer === "Y" || answer === "y";
  }

  function prompt(message = "Prompt", defaultValue) {
    defaultValue ??= null;

    if (!isatty(stdin.rid)) {
      return null;
    }

    stdout.writeSync(encoder.encode(`${message} `));

    if (defaultValue) {
      stdout.writeSync(encoder.encode(`[${defaultValue}] `));
    }

    return readLineFromStdinSync() || defaultValue;
  }

  function readLineFromStdinSync() {
    const c = new Uint8Array(1);
    const buf = [];

    while (true) {
      const n = stdin.readSync(c);
      if (n === 0 || c[0] === LF) {
        break;
      }
      buf.push(c[0]);
    }
    return decoder.decode(new Uint8Array(buf));
  }

  window.__bootstrap.prompt = {
    alert,
    confirm,
    prompt,
  };
})(this);