{"id":13402705,"url":"https://github.com/klaudiosinani/qoa","last_synced_at":"2025-05-15T14:05:07.979Z","repository":{"id":46330961,"uuid":"165136921","full_name":"klaudiosinani/qoa","owner":"klaudiosinani","description":"Minimal interactive command-line prompts","archived":false,"fork":false,"pushed_at":"2024-08-30T10:32:15.000Z","size":268,"stargazers_count":2043,"open_issues_count":12,"forks_count":36,"subscribers_count":17,"default_branch":"master","last_synced_at":"2025-04-19T09:05:28.010Z","etag":null,"topics":["cli","command-line","interactive","interfaces","prompts"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/klaudiosinani.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":"contributing.md","funding":null,"license":"license.md","code_of_conduct":"code-of-conduct.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"klaudiosinani","buy_me_a_coffee":"klaudiosinani","custom":"https://klaudiosinani.com/thanks"}},"created_at":"2019-01-10T21:57:31.000Z","updated_at":"2025-04-10T03:28:46.000Z","dependencies_parsed_at":"2024-09-30T19:02:39.298Z","dependency_job_id":"28b5af2c-84d1-4be4-ba07-e9acda82f9b0","html_url":"https://github.com/klaudiosinani/qoa","commit_stats":null,"previous_names":["klaussinani/qoa"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klaudiosinani%2Fqoa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klaudiosinani%2Fqoa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klaudiosinani%2Fqoa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klaudiosinani%2Fqoa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/klaudiosinani","download_url":"https://codeload.github.com/klaudiosinani/qoa/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254355334,"owners_count":22057354,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","command-line","interactive","interfaces","prompts"],"created_at":"2024-07-30T19:01:19.756Z","updated_at":"2025-05-15T14:05:07.916Z","avatar_url":"https://github.com/klaudiosinani.png","language":"JavaScript","funding_links":["https://github.com/sponsors/klaudiosinani","https://buymeacoffee.com/klaudiosinani","https://klaudiosinani.com/thanks","https://github.com/sponsors/klaussinani"],"categories":["JavaScript","cli"],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  Qoa\n\u003c/h1\u003e\n\n\u003ch4 align=\"center\"\u003e\n  Minimal interactive command-line prompts\n\u003c/h4\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Header\" src=\"media/header.gif\" width=\"85%\"\u003e\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://travis-ci.com/klaussinani/qoa\"\u003e\n    \u003cimg alt=\"Build Status\" src=\"https://travis-ci.com/klaussinani/qoa.svg?branch=master\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cbr\u003e\n  \u003csup\u003e\u003cb\u003eSponsored by:\u003c/b\u003e\u003c/sup\u003e\n  \u003cbr\u003e\n  \u003ca href=\"https://betterstack.com\"\u003e\n    \u003cdiv\u003e\n      \u003cimg src=\"https://github.com/Seldaek/monolog/assets/183678/7de58ce0-2fa2-45c0-b3e8-e60cebb3c4cf\" width=\"200\" alt=\"Better Stack\"\u003e\n    \u003c/div\u003e\n    \u003csup\u003e\n      Spot, Resolve, and Prevent Downtime.\n    \u003c/sup\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n## Description\n\nLightweight and without any external dependencies qoa enables you to receive various types of user input through a set of intuitive, interactive \u0026 verbose command-line prompts. The library utilizes a simple \u0026 minimal usage syntax and contains 7 configurable console interfaces, such as plain text, confirmation \u0026 password/secret prompts as well as single keypress, quiz \u0026 multiple-choice navigable menus.\n\nYou can now support the development process through [GitHub Sponsors](https://github.com/sponsors/klaussinani).\n\nVisit the [contributing guidelines](https://github.com/klaussinani/qoa/blob/master/contributing.md#translating-documentation) to learn more on how to translate this document into more languages.\n\nCome over to [Gitter](https://gitter.im/klaussinani/qoa) or [Twitter](https://twitter.com/klaussinani) to share your thoughts on the project.\n\n## Highlights\n\n- 7 out-of-the-box interactive prompts\n- Zero dependencies\n- Lightweight \u0026 fast [8.8kB / 71ms](https://bundlephobia.com/result?p=qoa)\n- Clean \u0026 concise output\n- Simple \u0026 minimal usage syntax\n- Navigation, quiz \u0026 keypress menus\n- Secure \u0026 hidden input interfaces\n- Utilizes async/await expressions\n- Configurable \u0026 customizable\n\n## Contents\n\n- [Description](#description)\n- [Highlights](#highlights)\n- [Install](#install)\n- [Usage](#usage)\n- [Prompts](#prompts)\n- [Configuration](#configuration)\n- [API](#api)\n- [Development](#development)\n- [Related](#related)\n- [Team](#team)\n- [Sponsors](#sponsors)\n- [License](#license)\n\n## Install\n\n### Yarn\n\n```bash\nyarn add qoa\n```\n\n### NPM\n\n```bash\nnpm install qoa\n```\n\n## Usage\n\nImport qoa and start using any of the available prompts:\n\n- `confirm`\n- `hidden`\n- `input`\n- `interactive`\n- `keypress`\n- `quiz`\n- `secure`\n\nIn order to sequentially create \u0026 display a series of prompts, the asynchronous unary `qoa.prompt` function can be used. The function accepts as input an array of objects, where each object contains the configuration of its corresponding prompt. The display order of the prompts is based on the order in which the configuration objects are defined inside the array. A new object containing the user's response to each prompt is finally returned by the function.\n\n```js\nconst qoa = require('qoa');\n\nconst {log} = console;\n\nconst ps = [\n  {\n    type: 'input',\n    query: 'Type your username:',\n    handle: 'username'\n  },\n  {\n    type: 'secure',\n    query: 'Type your password:',\n    handle: 'password'\n  }\n];\n\nqoa.prompt(ps).then(log);\n//=\u003e { username: 'klaussinani', password: 'token' }\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Usage\" src=\"media/usage.gif\" width=\"75%\"\u003e\n\u003c/div\u003e\n\nAlternatively, for non sequential use-cases, each prompt can be individually initialized through its respective asynchronous unary function, where each function accepts as input an object containing the prompt's properties/configuration.\n\n```js\nconst qoa = require('qoa');\n\nconst {log} = console;\n\nconst login = async () =\u003e {\n  const username = await qoa.input({\n    query: 'Type your username:',\n    handle: 'username'\n  });\n\n  const password = await qoa.secure({\n    query: 'Type your password:',\n    handle: 'password'\n  });\n\n  return Object.assign({}, username, password);\n}\n\nlogin().then(log);\n//=\u003e { username: 'klaussinani', password: 'token' }\n```\n\n## Prompts\n\n### Confirm Prompt\n\nInitializes a text based input prompt with two `accept` \u0026 `deny` options. Based on the input provided by the user, the query displayed by the prompt is confirmed or rejected. In order for the query to be confirmed, thus return `true`, the user must provide exactly the indicated `accept` string (strict equality). On any other input the query is rejected \u0026 `false` is returned. The return value is a new object with the prompt result stored under the specified `handle` property.\n\n```js\nconst qoa = require('qoa');\n\nconst {log} = console;\n\nconst confirm = {\n  type: 'confirm',\n  query: 'Update Qoa to latest version?',\n  handle: 'update',\n  accept: 'Y',\n  deny: 'n'\n};\n\n// using the `prompt` async method\nqoa.prompt([confirm]).then(log);\n//=\u003e { update: true }\n\n// using the `confirm` async method\nqoa.confirm(confirm).then(log);\n//=\u003e { update: true }\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Confirm Prompt\" src=\"media/confirm.gif\" width=\"68%\"\u003e\n\u003c/div\u003e\n\n### Hidden Prompt\n\nInitializes a text based prompt, where each character typed by the user is automatically hidden. The return value is a new object with the prompt result stored under the specified `handle` property.\n\n```js\nconst qoa = require('qoa');\n\nconst {log} = console;\n\nconst hidden = {\n  type: 'hidden',\n  query: '[sudo] password for admin:',\n  handle: 'sudo'\n};\n\n// using the `prompt` async method\nqoa.prompt([hidden]).then(log);\n//=\u003e { sudo: 'admin' }\n\n// using the `hidden` async method\nqoa.hidden(hidden).then(log);\n//=\u003e { sudo: 'admin' }\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Hidden Prompt\" src=\"media/hidden.gif\" width=\"68%\"\u003e\n\u003c/div\u003e\n\n### Input Prompt\n\nInitializes a text based prompt, where input can be freely provided by the user. The return value is a new object with the prompt result stored under the specified `handle` property.\n\n```js\nconst qoa = require('qoa');\n\nconst {log} = console;\n\nconst input = {\n  type: 'input',\n  query: 'Select your username:',\n  handle: 'username'\n};\n\n// using the `prompt` async method\nqoa.prompt([input]).then(log);\n//=\u003e { username: 'klaussinani' }\n  \n// using the `input` async method\nqoa.input(input).then(log);\n//=\u003e { username: 'klaussinani' }\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Input Prompt\" src=\"media/input.gif\" width=\"68%\"\u003e\n\u003c/div\u003e\n\n### Interactive Prompt\n\nInitializes an interactive navigable menu based prompt, where the user can navigate within a set of options and select only one of them. The options can be defined in the `menu` array while the navigation indicator can be customized through the `symbol` option and if omitted the default string `'\u003e'` will be used. The return value is new object with the selected option stored under the specified `handle` property. The interactive menu can be navigated through the `up arrow`/`k` \u0026 `down arrow`/`j` keys.\n\n```js\nconst qoa = require('qoa');\n\nconst {log} = console;\n\nconst interactive = {\n  type: 'interactive',\n  query: 'What is your favorite treat?',\n  handle: 'treat',\n  symbol: '\u003e',\n  menu: [\n    'Chocolate',\n    'Cupcakes',\n    'Ice-Cream'\n  ]\n};\n\n// using the `prompt` async method\nqoa.prompt([interactive]).then(log);\n//=\u003e { treat: 'Cupcakes' }\n\n// using the `interactive` async method\nqoa.interactive(interactive).then(log);\n//=\u003e { treat: 'Cupcakes' }\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Interactive Prompt\" src=\"media/interactive.gif\" width=\"68%\"\u003e\n\u003c/div\u003e\n\n### Keypress Prompt\n\nInitializes an non-navigable menu based prompt, where the user can select one of the options defined in the `menu` array, by pressing the unique key corresponding to it. The options can be up to `9`, and the keys are integers `x` where `1 \u003c= x \u003c= 9`. The return value is new object with the selected option stored under the specified `handle` property.\n\n```js\nconst qoa = require('qoa');\n\nconst {log} = console;\n\nconst keypress = {\n  type: 'keypress',\n  query: 'How useful are the new features?',\n  handle: 'features',\n  menu: [\n    'Meh',\n    'Averagely',\n    'Very',\n    'Super'\n  ]\n};\n\n// using the `prompt` async method\nqoa.prompt([keypress]).then(log);\n//=\u003e { features: 'Very' }\n\n// using the `keypress` async method\nqoa.keypress(keypress).then(log);\n//=\u003e { features: 'Very' }\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Keypress Prompt\" src=\"media/keypress.gif\" width=\"68%\"\u003e\n\u003c/div\u003e\n\n### Quiz Prompt\n\nInitializes an interactive navigable menu based prompt, where the user can navigate within a set options and select only one of them. The displayed menu is consisted of a number `amount` of options, of which the value of `answer` is by default one of them, corresponding to the correct answer to the query, and the rest `amount - 1` are randomly selected from the `choices` array. The navigation indicator can be customized through the `symbol` option and if omitted the default string `'\u003e'` is used. The return value is new object containing the selected option, stored under the specified `handle` property, and a boolean `isCorrect` attribute, indicating whether the choice made by the user was the `answer` one. The quiz menu can be navigated through the `up arrow`/`k` \u0026 `down arrow`/`j` keys.\n\n```js\nconst qoa = require('qoa');\n\nconst {log} = console;\n\nconst quiz = {\n  type: 'quiz',\n  query: 'How far is the moon from Earth?',\n  handle: 'distance',\n  answer: '333400 km',\n  symbol: '\u003e',\n  amount: 4,\n  choices: [\n    '190000 km',\n    '280500 km',\n    '333400 km',\n    '560000 km',\n    '890500 km'\n  ]\n};\n\n// using the `prompt` async method\nqoa.prompt([quiz]).then(log);\n//=\u003e { distance: { answer: '333400 km', isCorrect: true } }\n\n// using the `quiz` async method\nqoa.quiz(quiz).then(log);\n//=\u003e { distance: { answer: '333400 km', isCorrect: true } }\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Quiz Prompt\" src=\"media/quiz.gif\" width=\"68%\"\u003e\n\u003c/div\u003e\n\n### Secure Prompt\n\nInitializes a text based prompt, where each character typed by the user is automatically replaced with the `*` symbol. The return value is an object with the prompt result stored under the specified `handle` property.\n\n```js\nconst qoa = require('qoa');\n\nconst {log} = console;\n\nconst secure = {\n  type: 'secure',\n  query: 'What\\'s your password:',\n  handle: 'password'\n};\n\n// using the `prompt` async method\nqoa.prompt([secure]).then(log);\n//=\u003e { password: 'password' }\n\n// using the `secure` async method\nqoa.secure(secure).then(log);\n//=\u003e { password: 'password' }\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Secure Prompt\" src=\"media/secure.gif\" width=\"68%\"\u003e\n\u003c/div\u003e\n\n## Configuration\n\nQoa can be collectively configured through the unary `qoa.config()` function, which accepts an object containing the following two attributes: `prefix` \u0026 `underlineQuery`. The configuration is applied to all prompts belonging to the targeted qoa instance.\n\n##### `prefix`\n\n- Type: `String`\n- Default: `''`\n\nA string to be included as prefix to the query of each prompt.\n\n##### `underlineQuery`\n\n- Type: `Boolean`\n- Default: `false`\n\nUnderline the query of each prompt.\n\n```js\nconst qoa = require('qoa');\n\nqoa.config({\n  prefix: '\u003e', // Use the `\u003e` string as prefix to all queries\n  underlineQuery: false // Do not underline queries\n})\n\nqoa.secure({\n  type: 'secure',\n  query: 'Type your password:',\n  handle: 'password'\n});\n//=\u003e \u003e Type your password: ******\n```\n\nAdditionally, for individual customization the unary `prefix` \u0026 `underlineQuery` functions are available.\n\n```js\nconst qoa = require('qoa');\n\n// Use the `\u003e` string as prefix to all queries\nqoa.prefix('\u003e');\n\n// Do not underline queries\nqoa.underlineQuery(false);\n\nqoa.secure({\n  type: 'secure',\n  query: 'Type your password:',\n  handle: 'password'\n});\n//=\u003e \u003e Type your password: ******\n```\n\n## API\n\n#### qoa.`prompt([, configObj])`\n\n- Type: `Function`\n- Async: `True`\n- Returns: `Object`\n\nSequentially create \u0026 display a series of prompts.\n\n##### `configObj`\n\n- Type: `Object`\n\nObject containing the configuration of a prompt. Can hold any of the documented [options](#Usage).\n\n#### qoa.`confirm({ type, query, handle, accept, deny })`\n\n- Type: `Function`\n- Async: `True`\n- Returns: `Object`\n\nCreate and display a `confirm` prompt.\n\n##### `type`\n\n- Type: `String`\n- Default: `'confirm'`\n\nIndicates the type of the prompt. The option is **mandatory** when it is part of the configuration object inside the array passed to `qoa.prompt()` function. Can be considered **optional** when it is part of the object passed to the `qoa.confirm()` function.\n\n##### `query`\n\n- Type: `String`\n\nThe query to be displayed by the prompt.\n\n##### `handle`\n\n- Type: `String`\n\nThe name of the attribute under which the prompt result will be saved, inside the returned object.\n\n##### `accept`\n\n- Type: `String`\n- Default: `'Y'`\n\nThe string to be typed in order for the prompt to be confirmed.\n\n##### `deny`\n\n- Type: `String`\n- Default: `'n'`\n\nThe string to be typed in order for the prompt to be rejected.\n\n#### qoa.`hidden({ type, query, handle })`\n\n- Type: `Function`\n- Async: `True`\n- Returns: `Object`\n\nCreate and display a `hidden` prompt.\n\n##### `type`\n\n- Type: `String`\n- Default: `'hidden'`\n\nIndicates the type of the prompt. The option is **mandatory** when it is part of the configuration object inside the array passed to `qoa.prompt()` function. Can be considered **optional** when it is part of the object passed to the `qoa.hidden()` function.\n\n##### `query`\n\n- Type: `String`\n\nThe query to be displayed by the prompt.\n\n##### `handle`\n\n- Type: `String`\n\nThe name of the attribute under which the prompt result will be saved, inside the returned object.\n\n#### qoa.`input({ type, query, handle })`\n\n- Type: `Function`\n- Async: `True`\n- Returns: `Object`\n\nCreate and display an `input` prompt.\n\n##### `type`\n\n- Type: `String`\n- Default: `'input'`\n\nIndicates the type of the prompt. The option is **mandatory** when it is part of the configuration object inside the array passed to `qoa.prompt()` function. Can be considered **optional** when it is part of the object passed to the `qoa.input()` function.\n\n##### `query`\n\n- Type: `String`\n\nThe query to be displayed by the prompt.\n\n##### `handle`\n\n- Type: `String`\n\nThe name of the attribute under which the prompt result will be saved, inside the returned object.\n\n#### qoa.`interactive({ type, query, handle, symbol, menu })`\n\n- Type: `Function`\n- Async: `True`\n- Returns: `Object`\n\nCreate and display an `interactive` prompt.\n\n##### `type`\n\n- Type: `String`\n- Default: `'interactive'`\n\nIndicates the type of the prompt. The option is **mandatory** when it is part of the configuration object inside the array passed to `qoa.prompt()` function. Can be considered **optional** when it is part of the object passed to the `qoa.interactive()` function.\n\n##### `query`\n\n- Type: `String`\n\nThe query to be displayed by the prompt.\n\n##### `handle`\n\n- Type: `String`\n\nThe name of the attribute under which the prompt result will be saved, inside the returned object.\n\n##### `symbol`\n\n- Type: `String`\n- Default: `'\u003e'`\n\nThe string to be used as the navigation indicator for the menu.\ncan be customized through the symbol option and if omitted the default string '\u003e' will be used.\n\n##### `menu`\n\n- Type: `String[]`\n\nThe array containing the menu options.\n\n#### qoa.`keypress({ type, query, handle, menu })`\n\n- Type: `Function`\n- Async: `True`\n- Returns: `Object`\n\nCreate and display a `keypress` prompt.\n\n##### `type`\n\n- Type: `String`\n- Default: `'keypress'`\n\nIndicates the type of the prompt. The option is **mandatory** when it is part of the configuration object inside the array passed to `qoa.prompt()` function. Can be considered **optional** when it is part of the object passed to the `qoa.keypress()` function.\n\n##### `query`\n\n- Type: `String`\n\nThe query to be displayed by the prompt.\n\n##### `handle`\n\n- Type: `String`\n\nThe name of the attribute under which the prompt result will be saved, inside the returned object.\n\n##### `menu`\n\n- Type: `String[]`\n\nThe array containing the menu options.\n\n#### qoa.`quiz({ type, query, handle, answer, symbol, amount, choices })`\n\n- Type: `Function`\n- Async: `True`\n- Returns: `Object`\n\nCreate and display a `quiz` prompt.\n\n##### `type`\n\n- Type: `String`\n- Default: `'quiz'`\n\nIndicates the type of the prompt. The option is **mandatory** when it is part of the configuration object inside the array passed to `qoa.prompt()` function. Can be considered **optional** when it is part of the object passed to the `qoa.quiz()` function.\n\n##### `query`\n\n- Type: `String`\n\nThe query to be displayed by the prompt.\n\n##### `handle`\n\n- Type: `String`\n\nThe name of the attribute under which the prompt result will be saved, inside the returned object.\n\n##### `answer`\n\n- Type: `String`\n\nThe correct answer to the quiz.\n\n##### `symbol`\n\n- Type: `String`\n- Default: `'\u003e'`\n\nThe string to be used as the navigation indicator for the menu.\n\n##### `amount`\n\n- Type: `Number`\n- Default: `3`\n\nThe number of options to be included to the menu.\n\n##### `choices`\n\n- Type: `String[]`\n\nThe array containing the candidate menu options.\n\n#### qoa.`secure({ type, query, handle })`\n\n- Type: `Function`\n- Async: `True`\n- Returns: `Object`\n\nCreate and display a `secure` prompt.\n\n##### `type`\n\n- Type: `String`\n- Default: `'secure'`\n\nIndicates the type of the prompt. The option is **mandatory** when it is part of the configuration object inside the array passed to `qoa.prompt()` function. Can be considered **optional** when it is part of the object passed to the `qoa.secure()` function.\n\n##### `query`\n\n- Type: `String`\n\nThe query to be displayed by the prompt.\n\n##### `handle`\n\n- Type: `String`\n\nThe name of the attribute under which the prompt result will be saved, inside the returned object.\n\n#### qoa.`config({ prefix, underlineQuery })`\n\n- Type: `Function`\n- Async: `False`\n\nCollectively configure a qoa instance.\n\n##### `prefix`\n\n- Type: `String`\n- Default: `''`\n\nA string to be included as prefix to the query of each prompt.\n\n##### `underlineQuery`\n\n- Type: `Boolean`\n- Default: `false`\n\nUnderline the query of each prompt.\n\n#### qoa.`prefix(str)`\n\n- Type: `Function`\n- Async: `False`\n\nAdd a string as prefix to the query of each prompt belonging to the targeted qoa instance.\n\n##### `str`\n\n- Type: `String`\n\nA string to be included as prefix to the query of each prompt.\n\n#### qoa.`underlineQuery(status)`\n\n- Type: `Function`\n- Async: `False`\n\nUnderline the query of each prompt belonging to the targeted qoa instance.\n\n##### `status`\n\n- Type: `Boolean`\n\nUnderline the query of each prompt.\n\n#### qoa.`clearScreen()`\n\n- Type: `Function`\n- Async: `False`\n\nMove the cursor to the top-left corner of the console and clear everything below it.\n\n## Development\n\nFor more info on how to contribute to the project, please read the [contributing guidelines](https://github.com/klaussinani/qoa/blob/master/contributing.md).\n\n- Fork the repository and clone it to your machine\n- Navigate to your local fork: `cd qoa`\n- Install the project dependencies: `npm install` or `yarn install`\n- Lint code for errors: `npm test` or `yarn test`\n\n## Related\n\n- [signale](https://github.com/klaussinani/signale) - Highly configurable logging utility\n- [taskbook](https://github.com/klaussinani/taskbook) - Tasks, boards \u0026 notes for the command-line habitat\n- [hyperocean](https://github.com/klaussinani/hyperocean) - Deep oceanic blue Hyper terminal theme\n\n## Team\n\n- Klaudio Sinani [(@klaudiosinani)](https://github.com/klaudiosinani)\n\n## Sponsors\n\nA big thank you to all the people and companies supporting our Open Source work:\n\n- [Better Stack: Spot, Resolve, and Prevent Downtime.](https://betterstack.com/)\n\n## License\n\n[MIT](https://github.com/klaussinani/qoa/blob/master/license.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fklaudiosinani%2Fqoa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fklaudiosinani%2Fqoa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fklaudiosinani%2Fqoa/lists"}