This repository was archived by the owner on Dec 11, 2024. It is now read-only.

Repository files navigation

cli_dialog

Build StatusPub VersionCoverage Status

A Dart package which allows you to use Inquirer.js prompts with some additional features.

The following GIF shows a CLI dialog which was created using this library. You can also visit the library page on pub.dev.

Demo of cli_dialog

You can find the source for this example here

Usage

Basic Usage

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
final dialog =CLI_Dialog(questions: [
['What is your name?', 'name']
]);
final name = dialog.ask()['name'];
}

Whenever you want to create a CLI dialog you create a CLI_Dialog() instance.

The CLI_Dialog class supports multiple keyword arguments amongst which questions is the most basic one. questions is a list of questions and corresponding keys to retreive the answers.

Thus, each list entry for questions has the following syntax: [<question>, <key<].

Then you will want to call the ask() method. It performs the CLI dialog and returns a map with the keys you provided and the values it received from the user.

Boolean questions

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
final dialog =CLI_Dialog(booleanQuestions: [
['Are you happy with this package?', 'isHappy']
]);
final answer = dialog.ask()['isHappy'];
}

As the name suggests, boolean questions just asks the user for (y/N) answers and always returns bool values.

The N in (y/N) indicates that the default answer is no. You can change this by passing trueByDefault: true to the constructor.

List questions

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
const listQuestions = [
[
{
'question':'What is your favourite colour?',
'options': ['Red', 'Blue', 'Green']
},
'colour'
]
];
final dialog =CLI_Dialog(listQuestions: listQuestions);
final answer = dialog.ask();
final colour = answer['colour'];
}

List questions allow the user to make a selection amongst several strings. 'question' is the question that will be printed before the selection. 'options' are the options from which the user chooses exactly one. 'colour' is the key used to retreive the answer.

Messages

Messages were added in 0.2.0. They are used to display information to users without prompting them for an answer.

You can use them like any other question using the messages keyword parameter or addQuestion(message, is_message: true). It is only optional to include a key if you are not using order.

Order

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
const listQuestions = [
[
{
'question':'Where are you from?',
'options': ['Africa', 'Asia', 'Europe', 'North America', 'South Africa']
},
'origin'
]
];
const booleanQuestions = [
['Do you want to continue?', 'continue']
];
final dialog =CLI_Dialog(
booleanQuestions: booleanQuestions,
listQuestions: listQuestions,
order: ['origin', 'continue']);
dialog.ask();
}

The optional keyword parameter order for the constructor allows you to set a custom order for your questions in the dialog by passing a list with keys in your required order.

If you do not indicate any order then the standard order is applied:

  1. All messages are displayed to the user.
  2. All regular questions.
  3. All boolean questions.
  4. All list questions.

We used the order parameter in this example because otherwise the question 'Do you want to continue' would be asked before 'Where are you from?' according to standard order.

Navigation mode

Navigation mode was added in 0.2.0. It allows users to freely navigate through the prompt and repeadetly answer questions if the want to. For the developer it is a matter of setting navigationMode to true:

final dialog =CLI_Dialog(navigationMode:true);

In navigation mode, each question is prepended by an index which shows the user which question he currently answers. The user can then prepend a colon to his answer and use these indices to jump to another question, even those he has not answered yet. For instance, answering :2 makes the user jump to the second question. After answering it, the user will be prompted with the third question (again) etc. Entering a question number which is out of scope finishes the CLI_Dialog and makes it return the answer map.

Testing

This package also provides a small infrastructure for testing your dialogs.

For this purpose, there is the named constructor CLI_Dialog.std() which has two required arguments:

  • std_input = a StdinService
  • std_output = a StdoutService

StdinService and StdoutService are classes which are provided with this library. There are always used internally for i/o. If you explicitly use these classes then you will probably want to set the mock parameter to true which will make these services mock objects.

Furtermore, it is mostly advised to pass std_output to std_input using the informStdout and isTest parameter to inform the StdoutService about standard input in echo mode. Details can be checked out in the tests I have written (test/).

How it works

This library uses ANSI/XTerm escape sequences and regular escape sequences. You can take a look at them in this file

Contributing

Of course you are welcome to contribute to this project by issuing a pull request on Github.

Please write unit tests (test/) for new functionality and make sure that test.sh and lint.sh (tool/) run succesfully before submitting.

Please format your code using dartfmt -w . (this is also covered by lint.sh).

Windows

cli_dialog supports Windows.

  • Colors look a bit different in command prompt
  • The UTF-16 right indicator is replaced by a simple >

Acknowledgements and Alternatives

This library is more a less a Dart port of Inquirer.js.

There is dart_inquirer which is not developed any more (even the Github repository was deleted by the author). It works fine but it has less features than this package (no colors, no navigation, no resume, no question mark etc.).

I also found interact but I have not tested it.

About

Beautiful Inquirer.js prompts in Dart

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Dec 11, 2024. It is now read-only.

Repository files navigation

cli_dialog

Build StatusPub VersionCoverage Status

A Dart package which allows you to use Inquirer.js prompts with some additional features.

The following GIF shows a CLI dialog which was created using this library. You can also visit the library page on pub.dev.

Demo of cli_dialog

You can find the source for this example here

Usage

Basic Usage

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
final dialog =CLI_Dialog(questions: [
['What is your name?', 'name']
]);
final name = dialog.ask()['name'];
}

Whenever you want to create a CLI dialog you create a CLI_Dialog() instance.

The CLI_Dialog class supports multiple keyword arguments amongst which questions is the most basic one. questions is a list of questions and corresponding keys to retreive the answers.

Thus, each list entry for questions has the following syntax: [<question>, <key<].

Then you will want to call the ask() method. It performs the CLI dialog and returns a map with the keys you provided and the values it received from the user.

Boolean questions

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
final dialog =CLI_Dialog(booleanQuestions: [
['Are you happy with this package?', 'isHappy']
]);
final answer = dialog.ask()['isHappy'];
}

As the name suggests, boolean questions just asks the user for (y/N) answers and always returns bool values.

The N in (y/N) indicates that the default answer is no. You can change this by passing trueByDefault: true to the constructor.

List questions

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
const listQuestions = [
[
{
'question':'What is your favourite colour?',
'options': ['Red', 'Blue', 'Green']
},
'colour'
]
];
final dialog =CLI_Dialog(listQuestions: listQuestions);
final answer = dialog.ask();
final colour = answer['colour'];
}

List questions allow the user to make a selection amongst several strings. 'question' is the question that will be printed before the selection. 'options' are the options from which the user chooses exactly one. 'colour' is the key used to retreive the answer.

Messages

Messages were added in 0.2.0. They are used to display information to users without prompting them for an answer.

You can use them like any other question using the messages keyword parameter or addQuestion(message, is_message: true). It is only optional to include a key if you are not using order.

Order

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
const listQuestions = [
[
{
'question':'Where are you from?',
'options': ['Africa', 'Asia', 'Europe', 'North America', 'South Africa']
},
'origin'
]
];
const booleanQuestions = [
['Do you want to continue?', 'continue']
];
final dialog =CLI_Dialog(
booleanQuestions: booleanQuestions,
listQuestions: listQuestions,
order: ['origin', 'continue']);
dialog.ask();
}

The optional keyword parameter order for the constructor allows you to set a custom order for your questions in the dialog by passing a list with keys in your required order.

If you do not indicate any order then the standard order is applied:

  1. All messages are displayed to the user.
  2. All regular questions.
  3. All boolean questions.
  4. All list questions.

We used the order parameter in this example because otherwise the question 'Do you want to continue' would be asked before 'Where are you from?' according to standard order.

Navigation mode

Navigation mode was added in 0.2.0. It allows users to freely navigate through the prompt and repeadetly answer questions if the want to. For the developer it is a matter of setting navigationMode to true:

final dialog =CLI_Dialog(navigationMode:true);

In navigation mode, each question is prepended by an index which shows the user which question he currently answers. The user can then prepend a colon to his answer and use these indices to jump to another question, even those he has not answered yet. For instance, answering :2 makes the user jump to the second question. After answering it, the user will be prompted with the third question (again) etc. Entering a question number which is out of scope finishes the CLI_Dialog and makes it return the answer map.

Testing

This package also provides a small infrastructure for testing your dialogs.

For this purpose, there is the named constructor CLI_Dialog.std() which has two required arguments:

  • std_input = a StdinService
  • std_output = a StdoutService

StdinService and StdoutService are classes which are provided with this library. There are always used internally for i/o. If you explicitly use these classes then you will probably want to set the mock parameter to true which will make these services mock objects.

Furtermore, it is mostly advised to pass std_output to std_input using the informStdout and isTest parameter to inform the StdoutService about standard input in echo mode. Details can be checked out in the tests I have written (test/).

How it works

This library uses ANSI/XTerm escape sequences and regular escape sequences. You can take a look at them in this file

Contributing

Of course you are welcome to contribute to this project by issuing a pull request on Github.

Please write unit tests (test/) for new functionality and make sure that test.sh and lint.sh (tool/) run succesfully before submitting.

Please format your code using dartfmt -w . (this is also covered by lint.sh).

Windows

cli_dialog supports Windows.

  • Colors look a bit different in command prompt
  • The UTF-16 right indicator is replaced by a simple >

Acknowledgements and Alternatives

This library is more a less a Dart port of Inquirer.js.

There is dart_inquirer which is not developed any more (even the Github repository was deleted by the author). It works fine but it has less features than this package (no colors, no navigation, no resume, no question mark etc.).

I also found interact but I have not tested it.

About

Beautiful Inquirer.js prompts in Dart

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 11, 2024. It is now read-only.

Repository files navigation

cli_dialog

Build StatusPub VersionCoverage Status

A Dart package which allows you to use Inquirer.js prompts with some additional features.

The following GIF shows a CLI dialog which was created using this library. You can also visit the library page on pub.dev.

Demo of cli_dialog

You can find the source for this example here

Usage

Basic Usage

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
final dialog =CLI_Dialog(questions: [
['What is your name?', 'name']
]);
final name = dialog.ask()['name'];
}

Whenever you want to create a CLI dialog you create a CLI_Dialog() instance.

The CLI_Dialog class supports multiple keyword arguments amongst which questions is the most basic one. questions is a list of questions and corresponding keys to retreive the answers.

Thus, each list entry for questions has the following syntax: [<question>, <key<].

Then you will want to call the ask() method. It performs the CLI dialog and returns a map with the keys you provided and the values it received from the user.

Boolean questions

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
final dialog =CLI_Dialog(booleanQuestions: [
['Are you happy with this package?', 'isHappy']
]);
final answer = dialog.ask()['isHappy'];
}

As the name suggests, boolean questions just asks the user for (y/N) answers and always returns bool values.

The N in (y/N) indicates that the default answer is no. You can change this by passing trueByDefault: true to the constructor.

List questions

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
const listQuestions = [
[
{
'question':'What is your favourite colour?',
'options': ['Red', 'Blue', 'Green']
},
'colour'
]
];
final dialog =CLI_Dialog(listQuestions: listQuestions);
final answer = dialog.ask();
final colour = answer['colour'];
}

List questions allow the user to make a selection amongst several strings. 'question' is the question that will be printed before the selection. 'options' are the options from which the user chooses exactly one. 'colour' is the key used to retreive the answer.

Messages

Messages were added in 0.2.0. They are used to display information to users without prompting them for an answer.

You can use them like any other question using the messages keyword parameter or addQuestion(message, is_message: true). It is only optional to include a key if you are not using order.

Order

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
const listQuestions = [
[
{
'question':'Where are you from?',
'options': ['Africa', 'Asia', 'Europe', 'North America', 'South Africa']
},
'origin'
]
];
const booleanQuestions = [
['Do you want to continue?', 'continue']
];
final dialog =CLI_Dialog(
booleanQuestions: booleanQuestions,
listQuestions: listQuestions,
order: ['origin', 'continue']);
dialog.ask();
}

The optional keyword parameter order for the constructor allows you to set a custom order for your questions in the dialog by passing a list with keys in your required order.

If you do not indicate any order then the standard order is applied:

  1. All messages are displayed to the user.
  2. All regular questions.
  3. All boolean questions.
  4. All list questions.

We used the order parameter in this example because otherwise the question 'Do you want to continue' would be asked before 'Where are you from?' according to standard order.

Navigation mode

Navigation mode was added in 0.2.0. It allows users to freely navigate through the prompt and repeadetly answer questions if the want to. For the developer it is a matter of setting navigationMode to true:

final dialog =CLI_Dialog(navigationMode:true);

In navigation mode, each question is prepended by an index which shows the user which question he currently answers. The user can then prepend a colon to his answer and use these indices to jump to another question, even those he has not answered yet. For instance, answering :2 makes the user jump to the second question. After answering it, the user will be prompted with the third question (again) etc. Entering a question number which is out of scope finishes the CLI_Dialog and makes it return the answer map.

Testing

This package also provides a small infrastructure for testing your dialogs.

For this purpose, there is the named constructor CLI_Dialog.std() which has two required arguments:

  • std_input = a StdinService
  • std_output = a StdoutService

StdinService and StdoutService are classes which are provided with this library. There are always used internally for i/o. If you explicitly use these classes then you will probably want to set the mock parameter to true which will make these services mock objects.

Furtermore, it is mostly advised to pass std_output to std_input using the informStdout and isTest parameter to inform the StdoutService about standard input in echo mode. Details can be checked out in the tests I have written (test/).

How it works

This library uses ANSI/XTerm escape sequences and regular escape sequences. You can take a look at them in this file

Contributing

Of course you are welcome to contribute to this project by issuing a pull request on Github.

Please write unit tests (test/) for new functionality and make sure that test.sh and lint.sh (tool/) run succesfully before submitting.

Please format your code using dartfmt -w . (this is also covered by lint.sh).

Windows

cli_dialog supports Windows.

  • Colors look a bit different in command prompt
  • The UTF-16 right indicator is replaced by a simple >

Acknowledgements and Alternatives

This library is more a less a Dart port of Inquirer.js.

There is dart_inquirer which is not developed any more (even the Github repository was deleted by the author). It works fine but it has less features than this package (no colors, no navigation, no resume, no question mark etc.).

I also found interact but I have not tested it.

About

Beautiful Inquirer.js prompts in Dart

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 11, 2024. It is now read-only.

Repository files navigation

cli_dialog

Build StatusPub VersionCoverage Status

A Dart package which allows you to use Inquirer.js prompts with some additional features.

The following GIF shows a CLI dialog which was created using this library. You can also visit the library page on pub.dev.

Demo of cli_dialog

You can find the source for this example here

Usage

Basic Usage

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
final dialog =CLI_Dialog(questions: [
['What is your name?', 'name']
]);
final name = dialog.ask()['name'];
}

Whenever you want to create a CLI dialog you create a CLI_Dialog() instance.

The CLI_Dialog class supports multiple keyword arguments amongst which questions is the most basic one. questions is a list of questions and corresponding keys to retreive the answers.

Thus, each list entry for questions has the following syntax: [<question>, <key<].

Then you will want to call the ask() method. It performs the CLI dialog and returns a map with the keys you provided and the values it received from the user.

Boolean questions

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
final dialog =CLI_Dialog(booleanQuestions: [
['Are you happy with this package?', 'isHappy']
]);
final answer = dialog.ask()['isHappy'];
}

As the name suggests, boolean questions just asks the user for (y/N) answers and always returns bool values.

The N in (y/N) indicates that the default answer is no. You can change this by passing trueByDefault: true to the constructor.

List questions

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
const listQuestions = [
[
{
'question':'What is your favourite colour?',
'options': ['Red', 'Blue', 'Green']
},
'colour'
]
];
final dialog =CLI_Dialog(listQuestions: listQuestions);
final answer = dialog.ask();
final colour = answer['colour'];
}

List questions allow the user to make a selection amongst several strings. 'question' is the question that will be printed before the selection. 'options' are the options from which the user chooses exactly one. 'colour' is the key used to retreive the answer.

Messages

Messages were added in 0.2.0. They are used to display information to users without prompting them for an answer.

You can use them like any other question using the messages keyword parameter or addQuestion(message, is_message: true). It is only optional to include a key if you are not using order.

Order

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
const listQuestions = [
[
{
'question':'Where are you from?',
'options': ['Africa', 'Asia', 'Europe', 'North America', 'South Africa']
},
'origin'
]
];
const booleanQuestions = [
['Do you want to continue?', 'continue']
];
final dialog =CLI_Dialog(
booleanQuestions: booleanQuestions,
listQuestions: listQuestions,
order: ['origin', 'continue']);
dialog.ask();
}

The optional keyword parameter order for the constructor allows you to set a custom order for your questions in the dialog by passing a list with keys in your required order.

If you do not indicate any order then the standard order is applied:

  1. All messages are displayed to the user.
  2. All regular questions.
  3. All boolean questions.
  4. All list questions.

We used the order parameter in this example because otherwise the question 'Do you want to continue' would be asked before 'Where are you from?' according to standard order.

Navigation mode

Navigation mode was added in 0.2.0. It allows users to freely navigate through the prompt and repeadetly answer questions if the want to. For the developer it is a matter of setting navigationMode to true:

final dialog =CLI_Dialog(navigationMode:true);

In navigation mode, each question is prepended by an index which shows the user which question he currently answers. The user can then prepend a colon to his answer and use these indices to jump to another question, even those he has not answered yet. For instance, answering :2 makes the user jump to the second question. After answering it, the user will be prompted with the third question (again) etc. Entering a question number which is out of scope finishes the CLI_Dialog and makes it return the answer map.

Testing

This package also provides a small infrastructure for testing your dialogs.

For this purpose, there is the named constructor CLI_Dialog.std() which has two required arguments:

  • std_input = a StdinService
  • std_output = a StdoutService

StdinService and StdoutService are classes which are provided with this library. There are always used internally for i/o. If you explicitly use these classes then you will probably want to set the mock parameter to true which will make these services mock objects.

Furtermore, it is mostly advised to pass std_output to std_input using the informStdout and isTest parameter to inform the StdoutService about standard input in echo mode. Details can be checked out in the tests I have written (test/).

How it works

This library uses ANSI/XTerm escape sequences and regular escape sequences. You can take a look at them in this file

Contributing

Of course you are welcome to contribute to this project by issuing a pull request on Github.

Please write unit tests (test/) for new functionality and make sure that test.sh and lint.sh (tool/) run succesfully before submitting.

Please format your code using dartfmt -w . (this is also covered by lint.sh).

Windows

cli_dialog supports Windows.

  • Colors look a bit different in command prompt
  • The UTF-16 right indicator is replaced by a simple >

Acknowledgements and Alternatives

This library is more a less a Dart port of Inquirer.js.

There is dart_inquirer which is not developed any more (even the Github repository was deleted by the author). It works fine but it has less features than this package (no colors, no navigation, no resume, no question mark etc.).

I also found interact but I have not tested it.

About

Beautiful Inquirer.js prompts in Dart

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Dec 11, 2024. It is now read-only.

Repository files navigation

cli_dialog

Build StatusPub VersionCoverage Status

A Dart package which allows you to use Inquirer.js prompts with some additional features.

The following GIF shows a CLI dialog which was created using this library. You can also visit the library page on pub.dev.

Demo of cli_dialog

You can find the source for this example here

Usage

Basic Usage

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
final dialog =CLI_Dialog(questions: [
['What is your name?', 'name']
]);
final name = dialog.ask()['name'];
}

Whenever you want to create a CLI dialog you create a CLI_Dialog() instance.

The CLI_Dialog class supports multiple keyword arguments amongst which questions is the most basic one. questions is a list of questions and corresponding keys to retreive the answers.

Thus, each list entry for questions has the following syntax: [<question>, <key<].

Then you will want to call the ask() method. It performs the CLI dialog and returns a map with the keys you provided and the values it received from the user.

Boolean questions

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
final dialog =CLI_Dialog(booleanQuestions: [
['Are you happy with this package?', 'isHappy']
]);
final answer = dialog.ask()['isHappy'];
}

As the name suggests, boolean questions just asks the user for (y/N) answers and always returns bool values.

The N in (y/N) indicates that the default answer is no. You can change this by passing trueByDefault: true to the constructor.

List questions

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
const listQuestions = [
[
{
'question':'What is your favourite colour?',
'options': ['Red', 'Blue', 'Green']
},
'colour'
]
];
final dialog =CLI_Dialog(listQuestions: listQuestions);
final answer = dialog.ask();
final colour = answer['colour'];
}

List questions allow the user to make a selection amongst several strings. 'question' is the question that will be printed before the selection. 'options' are the options from which the user chooses exactly one. 'colour' is the key used to retreive the answer.

Messages

Messages were added in 0.2.0. They are used to display information to users without prompting them for an answer.

You can use them like any other question using the messages keyword parameter or addQuestion(message, is_message: true). It is only optional to include a key if you are not using order.

Order

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
const listQuestions = [
[
{
'question':'Where are you from?',
'options': ['Africa', 'Asia', 'Europe', 'North America', 'South Africa']
},
'origin'
]
];
const booleanQuestions = [
['Do you want to continue?', 'continue']
];
final dialog =CLI_Dialog(
booleanQuestions: booleanQuestions,
listQuestions: listQuestions,
order: ['origin', 'continue']);
dialog.ask();
}

The optional keyword parameter order for the constructor allows you to set a custom order for your questions in the dialog by passing a list with keys in your required order.

If you do not indicate any order then the standard order is applied:

  1. All messages are displayed to the user.
  2. All regular questions.
  3. All boolean questions.
  4. All list questions.

We used the order parameter in this example because otherwise the question 'Do you want to continue' would be asked before 'Where are you from?' according to standard order.

Navigation mode

Navigation mode was added in 0.2.0. It allows users to freely navigate through the prompt and repeadetly answer questions if the want to. For the developer it is a matter of setting navigationMode to true:

final dialog =CLI_Dialog(navigationMode:true);

In navigation mode, each question is prepended by an index which shows the user which question he currently answers. The user can then prepend a colon to his answer and use these indices to jump to another question, even those he has not answered yet. For instance, answering :2 makes the user jump to the second question. After answering it, the user will be prompted with the third question (again) etc. Entering a question number which is out of scope finishes the CLI_Dialog and makes it return the answer map.

Testing

This package also provides a small infrastructure for testing your dialogs.

For this purpose, there is the named constructor CLI_Dialog.std() which has two required arguments:

  • std_input = a StdinService
  • std_output = a StdoutService

StdinService and StdoutService are classes which are provided with this library. There are always used internally for i/o. If you explicitly use these classes then you will probably want to set the mock parameter to true which will make these services mock objects.

Furtermore, it is mostly advised to pass std_output to std_input using the informStdout and isTest parameter to inform the StdoutService about standard input in echo mode. Details can be checked out in the tests I have written (test/).

How it works

This library uses ANSI/XTerm escape sequences and regular escape sequences. You can take a look at them in this file

Contributing

Of course you are welcome to contribute to this project by issuing a pull request on Github.

Please write unit tests (test/) for new functionality and make sure that test.sh and lint.sh (tool/) run succesfully before submitting.

Please format your code using dartfmt -w . (this is also covered by lint.sh).

Windows

cli_dialog supports Windows.

  • Colors look a bit different in command prompt
  • The UTF-16 right indicator is replaced by a simple >

Acknowledgements and Alternatives

This library is more a less a Dart port of Inquirer.js.

There is dart_inquirer which is not developed any more (even the Github repository was deleted by the author). It works fine but it has less features than this package (no colors, no navigation, no resume, no question mark etc.).

I also found interact but I have not tested it.

About

Beautiful Inquirer.js prompts in Dart

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 11, 2024. It is now read-only.

Repository files navigation

cli_dialog

Build StatusPub VersionCoverage Status

A Dart package which allows you to use Inquirer.js prompts with some additional features.

The following GIF shows a CLI dialog which was created using this library. You can also visit the library page on pub.dev.

Demo of cli_dialog

You can find the source for this example here

Usage

Basic Usage

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
final dialog =CLI_Dialog(questions: [
['What is your name?', 'name']
]);
final name = dialog.ask()['name'];
}

Whenever you want to create a CLI dialog you create a CLI_Dialog() instance.

The CLI_Dialog class supports multiple keyword arguments amongst which questions is the most basic one. questions is a list of questions and corresponding keys to retreive the answers.

Thus, each list entry for questions has the following syntax: [<question>, <key<].

Then you will want to call the ask() method. It performs the CLI dialog and returns a map with the keys you provided and the values it received from the user.

Boolean questions

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
final dialog =CLI_Dialog(booleanQuestions: [
['Are you happy with this package?', 'isHappy']
]);
final answer = dialog.ask()['isHappy'];
}

As the name suggests, boolean questions just asks the user for (y/N) answers and always returns bool values.

The N in (y/N) indicates that the default answer is no. You can change this by passing trueByDefault: true to the constructor.

List questions

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
const listQuestions = [
[
{
'question':'What is your favourite colour?',
'options': ['Red', 'Blue', 'Green']
},
'colour'
]
];
final dialog =CLI_Dialog(listQuestions: listQuestions);
final answer = dialog.ask();
final colour = answer['colour'];
}

List questions allow the user to make a selection amongst several strings. 'question' is the question that will be printed before the selection. 'options' are the options from which the user chooses exactly one. 'colour' is the key used to retreive the answer.

Messages

Messages were added in 0.2.0. They are used to display information to users without prompting them for an answer.

You can use them like any other question using the messages keyword parameter or addQuestion(message, is_message: true). It is only optional to include a key if you are not using order.

Order

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
const listQuestions = [
[
{
'question':'Where are you from?',
'options': ['Africa', 'Asia', 'Europe', 'North America', 'South Africa']
},
'origin'
]
];
const booleanQuestions = [
['Do you want to continue?', 'continue']
];
final dialog =CLI_Dialog(
booleanQuestions: booleanQuestions,
listQuestions: listQuestions,
order: ['origin', 'continue']);
dialog.ask();
}

The optional keyword parameter order for the constructor allows you to set a custom order for your questions in the dialog by passing a list with keys in your required order.

If you do not indicate any order then the standard order is applied:

  1. All messages are displayed to the user.
  2. All regular questions.
  3. All boolean questions.
  4. All list questions.

We used the order parameter in this example because otherwise the question 'Do you want to continue' would be asked before 'Where are you from?' according to standard order.

Navigation mode

Navigation mode was added in 0.2.0. It allows users to freely navigate through the prompt and repeadetly answer questions if the want to. For the developer it is a matter of setting navigationMode to true:

final dialog =CLI_Dialog(navigationMode:true);

In navigation mode, each question is prepended by an index which shows the user which question he currently answers. The user can then prepend a colon to his answer and use these indices to jump to another question, even those he has not answered yet. For instance, answering :2 makes the user jump to the second question. After answering it, the user will be prompted with the third question (again) etc. Entering a question number which is out of scope finishes the CLI_Dialog and makes it return the answer map.

Testing

This package also provides a small infrastructure for testing your dialogs.

For this purpose, there is the named constructor CLI_Dialog.std() which has two required arguments:

  • std_input = a StdinService
  • std_output = a StdoutService

StdinService and StdoutService are classes which are provided with this library. There are always used internally for i/o. If you explicitly use these classes then you will probably want to set the mock parameter to true which will make these services mock objects.

Furtermore, it is mostly advised to pass std_output to std_input using the informStdout and isTest parameter to inform the StdoutService about standard input in echo mode. Details can be checked out in the tests I have written (test/).

How it works

This library uses ANSI/XTerm escape sequences and regular escape sequences. You can take a look at them in this file

Contributing

Of course you are welcome to contribute to this project by issuing a pull request on Github.

Please write unit tests (test/) for new functionality and make sure that test.sh and lint.sh (tool/) run succesfully before submitting.

Please format your code using dartfmt -w . (this is also covered by lint.sh).

Windows

cli_dialog supports Windows.

  • Colors look a bit different in command prompt
  • The UTF-16 right indicator is replaced by a simple >

Acknowledgements and Alternatives

This library is more a less a Dart port of Inquirer.js.

There is dart_inquirer which is not developed any more (even the Github repository was deleted by the author). It works fine but it has less features than this package (no colors, no navigation, no resume, no question mark etc.).

I also found interact but I have not tested it.

About

Beautiful Inquirer.js prompts in Dart

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 11, 2024. It is now read-only.

Repository files navigation

cli_dialog

Build StatusPub VersionCoverage Status

A Dart package which allows you to use Inquirer.js prompts with some additional features.

The following GIF shows a CLI dialog which was created using this library. You can also visit the library page on pub.dev.

Demo of cli_dialog

You can find the source for this example here

Usage

Basic Usage

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
final dialog =CLI_Dialog(questions: [
['What is your name?', 'name']
]);
final name = dialog.ask()['name'];
}

Whenever you want to create a CLI dialog you create a CLI_Dialog() instance.

The CLI_Dialog class supports multiple keyword arguments amongst which questions is the most basic one. questions is a list of questions and corresponding keys to retreive the answers.

Thus, each list entry for questions has the following syntax: [<question>, <key<].

Then you will want to call the ask() method. It performs the CLI dialog and returns a map with the keys you provided and the values it received from the user.

Boolean questions

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
final dialog =CLI_Dialog(booleanQuestions: [
['Are you happy with this package?', 'isHappy']
]);
final answer = dialog.ask()['isHappy'];
}

As the name suggests, boolean questions just asks the user for (y/N) answers and always returns bool values.

The N in (y/N) indicates that the default answer is no. You can change this by passing trueByDefault: true to the constructor.

List questions

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
const listQuestions = [
[
{
'question':'What is your favourite colour?',
'options': ['Red', 'Blue', 'Green']
},
'colour'
]
];
final dialog =CLI_Dialog(listQuestions: listQuestions);
final answer = dialog.ask();
final colour = answer['colour'];
}

List questions allow the user to make a selection amongst several strings. 'question' is the question that will be printed before the selection. 'options' are the options from which the user chooses exactly one. 'colour' is the key used to retreive the answer.

Messages

Messages were added in 0.2.0. They are used to display information to users without prompting them for an answer.

You can use them like any other question using the messages keyword parameter or addQuestion(message, is_message: true). It is only optional to include a key if you are not using order.

Order

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
const listQuestions = [
[
{
'question':'Where are you from?',
'options': ['Africa', 'Asia', 'Europe', 'North America', 'South Africa']
},
'origin'
]
];
const booleanQuestions = [
['Do you want to continue?', 'continue']
];
final dialog =CLI_Dialog(
booleanQuestions: booleanQuestions,
listQuestions: listQuestions,
order: ['origin', 'continue']);
dialog.ask();
}

The optional keyword parameter order for the constructor allows you to set a custom order for your questions in the dialog by passing a list with keys in your required order.

If you do not indicate any order then the standard order is applied:

  1. All messages are displayed to the user.
  2. All regular questions.
  3. All boolean questions.
  4. All list questions.

We used the order parameter in this example because otherwise the question 'Do you want to continue' would be asked before 'Where are you from?' according to standard order.

Navigation mode

Navigation mode was added in 0.2.0. It allows users to freely navigate through the prompt and repeadetly answer questions if the want to. For the developer it is a matter of setting navigationMode to true:

final dialog =CLI_Dialog(navigationMode:true);

In navigation mode, each question is prepended by an index which shows the user which question he currently answers. The user can then prepend a colon to his answer and use these indices to jump to another question, even those he has not answered yet. For instance, answering :2 makes the user jump to the second question. After answering it, the user will be prompted with the third question (again) etc. Entering a question number which is out of scope finishes the CLI_Dialog and makes it return the answer map.

Testing

This package also provides a small infrastructure for testing your dialogs.

For this purpose, there is the named constructor CLI_Dialog.std() which has two required arguments:

  • std_input = a StdinService
  • std_output = a StdoutService

StdinService and StdoutService are classes which are provided with this library. There are always used internally for i/o. If you explicitly use these classes then you will probably want to set the mock parameter to true which will make these services mock objects.

Furtermore, it is mostly advised to pass std_output to std_input using the informStdout and isTest parameter to inform the StdoutService about standard input in echo mode. Details can be checked out in the tests I have written (test/).

How it works

This library uses ANSI/XTerm escape sequences and regular escape sequences. You can take a look at them in this file

Contributing

Of course you are welcome to contribute to this project by issuing a pull request on Github.

Please write unit tests (test/) for new functionality and make sure that test.sh and lint.sh (tool/) run succesfully before submitting.

Please format your code using dartfmt -w . (this is also covered by lint.sh).

Windows

cli_dialog supports Windows.

  • Colors look a bit different in command prompt
  • The UTF-16 right indicator is replaced by a simple >

Acknowledgements and Alternatives

This library is more a less a Dart port of Inquirer.js.

There is dart_inquirer which is not developed any more (even the Github repository was deleted by the author). It works fine but it has less features than this package (no colors, no navigation, no resume, no question mark etc.).

I also found interact but I have not tested it.

About

Beautiful Inquirer.js prompts in Dart

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Dec 11, 2024. It is now read-only.

Repository files navigation

cli_dialog

Build StatusPub VersionCoverage Status

A Dart package which allows you to use Inquirer.js prompts with some additional features.

The following GIF shows a CLI dialog which was created using this library. You can also visit the library page on pub.dev.

Demo of cli_dialog

You can find the source for this example here

Usage

Basic Usage

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
final dialog =CLI_Dialog(questions: [
['What is your name?', 'name']
]);
final name = dialog.ask()['name'];
}

Whenever you want to create a CLI dialog you create a CLI_Dialog() instance.

The CLI_Dialog class supports multiple keyword arguments amongst which questions is the most basic one. questions is a list of questions and corresponding keys to retreive the answers.

Thus, each list entry for questions has the following syntax: [<question>, <key<].

Then you will want to call the ask() method. It performs the CLI dialog and returns a map with the keys you provided and the values it received from the user.

Boolean questions

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
final dialog =CLI_Dialog(booleanQuestions: [
['Are you happy with this package?', 'isHappy']
]);
final answer = dialog.ask()['isHappy'];
}

As the name suggests, boolean questions just asks the user for (y/N) answers and always returns bool values.

The N in (y/N) indicates that the default answer is no. You can change this by passing trueByDefault: true to the constructor.

List questions

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
const listQuestions = [
[
{
'question':'What is your favourite colour?',
'options': ['Red', 'Blue', 'Green']
},
'colour'
]
];
final dialog =CLI_Dialog(listQuestions: listQuestions);
final answer = dialog.ask();
final colour = answer['colour'];
}

List questions allow the user to make a selection amongst several strings. 'question' is the question that will be printed before the selection. 'options' are the options from which the user chooses exactly one. 'colour' is the key used to retreive the answer.

Messages

Messages were added in 0.2.0. They are used to display information to users without prompting them for an answer.

You can use them like any other question using the messages keyword parameter or addQuestion(message, is_message: true). It is only optional to include a key if you are not using order.

Order

import'package:cli_dialog/cli_dialog.dart';
voidmain() {
const listQuestions = [
[
{
'question':'Where are you from?',
'options': ['Africa', 'Asia', 'Europe', 'North America', 'South Africa']
},
'origin'
]
];
const booleanQuestions = [
['Do you want to continue?', 'continue']
];
final dialog =CLI_Dialog(
booleanQuestions: booleanQuestions,
listQuestions: listQuestions,
order: ['origin', 'continue']);
dialog.ask();
}

The optional keyword parameter order for the constructor allows you to set a custom order for your questions in the dialog by passing a list with keys in your required order.

If you do not indicate any order then the standard order is applied:

  1. All messages are displayed to the user.
  2. All regular questions.
  3. All boolean questions.
  4. All list questions.

We used the order parameter in this example because otherwise the question 'Do you want to continue' would be asked before 'Where are you from?' according to standard order.

Navigation mode

Navigation mode was added in 0.2.0. It allows users to freely navigate through the prompt and repeadetly answer questions if the want to. For the developer it is a matter of setting navigationMode to true:

final dialog =CLI_Dialog(navigationMode:true);

In navigation mode, each question is prepended by an index which shows the user which question he currently answers. The user can then prepend a colon to his answer and use these indices to jump to another question, even those he has not answered yet. For instance, answering :2 makes the user jump to the second question. After answering it, the user will be prompted with the third question (again) etc. Entering a question number which is out of scope finishes the CLI_Dialog and makes it return the answer map.

Testing

This package also provides a small infrastructure for testing your dialogs.

For this purpose, there is the named constructor CLI_Dialog.std() which has two required arguments:

  • std_input = a StdinService
  • std_output = a StdoutService

StdinService and StdoutService are classes which are provided with this library. There are always used internally for i/o. If you explicitly use these classes then you will probably want to set the mock parameter to true which will make these services mock objects.

Furtermore, it is mostly advised to pass std_output to std_input using the informStdout and isTest parameter to inform the StdoutService about standard input in echo mode. Details can be checked out in the tests I have written (test/).

How it works

This library uses ANSI/XTerm escape sequences and regular escape sequences. You can take a look at them in this file

Contributing

Of course you are welcome to contribute to this project by issuing a pull request on Github.

Please write unit tests (test/) for new functionality and make sure that test.sh and lint.sh (tool/) run succesfully before submitting.

Please format your code using dartfmt -w . (this is also covered by lint.sh).

Windows

cli_dialog supports Windows.

  • Colors look a bit different in command prompt
  • The UTF-16 right indicator is replaced by a simple >

Acknowledgements and Alternatives

This library is more a less a Dart port of Inquirer.js.

There is dart_inquirer which is not developed any more (even the Github repository was deleted by the author). It works fine but it has less features than this package (no colors, no navigation, no resume, no question mark etc.).

I also found interact but I have not tested it.

About

Beautiful Inquirer.js prompts in Dart

Resources

Stars

14 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages