From 7e3de57bb48486cd6147d5a40335862a6f423baf Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 20 Jun 2023 15:21:14 -0500 Subject: [PATCH] chore(inter-cli): makeTUI - Textual User Interface --- packages/inter-cli/src/lib/tui.js | 39 +++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 packages/inter-cli/src/lib/tui.js diff --git a/packages/inter-cli/src/lib/tui.js b/packages/inter-cli/src/lib/tui.js new file mode 100644 index 00000000000..947fc827ac7 --- /dev/null +++ b/packages/inter-cli/src/lib/tui.js @@ -0,0 +1,39 @@ +// @ts-check +// @jessie-check + +/** + * JSON.stringify replacer to handle bigint + * + * @param {unknown} k + * @param {unknown} v + */ +export const bigintReplacer = (k, v) => (typeof v === 'bigint' ? `${v}` : v); + +/** + * TUI - a Textual User Interface + * + * @param {{ + * stdout: Pick, + * logger: Pick, + * }} io + * @typedef {ReturnType} TUI + */ +export const makeTUI = ({ stdout, logger }) => { + /** + * write info as JSON + * + * @param {unknown} info JSON.strigify()-able data (bigint replaced with string) + * @param {boolean} [indent] normally false, keeping the JSON on one line + */ + const show = (info, indent = false) => { + stdout.write( + `${JSON.stringify(info, bigintReplacer, indent ? 2 : undefined)}\n`, + ); + }; + + return Object.freeze({ + show, + /** @type {typeof console.warn} */ + warn: (...args) => logger.warn(...args), + }); +};