Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c8ea14c239 | ||
|
|
1399a3ca9f | ||
|
|
079d94cbf3 | ||
|
|
4ec8aa630e | ||
|
|
91efb1bbf2 | ||
|
|
6763d727f5 |
4
CHANGELOG
Normal file
4
CHANGELOG
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
v1.0.4 Handle cli forms in node.js
|
||||||
|
* prompt user for input
|
||||||
|
* async validation (email, url, etc)
|
||||||
|
* status messages
|
||||||
41
LICENSE
Normal file
41
LICENSE
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
Copyright 2017 AJ ONeal
|
||||||
|
|
||||||
|
This is open source software; you can redistribute it and/or modify it under the
|
||||||
|
terms of either:
|
||||||
|
|
||||||
|
a) the "MIT License"
|
||||||
|
b) the "Apache-2.0 License"
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
Apache-2.0 License Summary
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
61
index.js
61
index.js
@ -37,6 +37,7 @@ var form = {
|
|||||||
, _prompt: ''
|
, _prompt: ''
|
||||||
, _input: []
|
, _input: []
|
||||||
, _inputIndex: 0
|
, _inputIndex: 0
|
||||||
|
, isTTY: rws.isTTY
|
||||||
, cursorTo: function (x, y) {
|
, cursorTo: function (x, y) {
|
||||||
if ('number' !== typeof x || (0 !== x && !x)) {
|
if ('number' !== typeof x || (0 !== x && !x)) {
|
||||||
throw new Error('cursorTo(x[, y]): x is not optional and must be a number');
|
throw new Error('cursorTo(x[, y]): x is not optional and must be a number');
|
||||||
@ -169,15 +170,6 @@ var form = {
|
|||||||
|
|
||||||
return new PromiseA(function (resolve) {
|
return new PromiseA(function (resolve) {
|
||||||
var ch;
|
var ch;
|
||||||
|
|
||||||
rrs.setRawMode(true);
|
|
||||||
rrs.setEncoding('utf8');
|
|
||||||
rrs.resume();
|
|
||||||
|
|
||||||
ws.cursorTo(0);
|
|
||||||
ws.write(ws._prompt);
|
|
||||||
//ws.cursorTo(0, ws._prompt.length);
|
|
||||||
|
|
||||||
var debouncer = {
|
var debouncer = {
|
||||||
set: function () {
|
set: function () {
|
||||||
if (!(cbs.onDebounceAsync||cbs.onDebounce)) {
|
if (!(cbs.onDebounceAsync||cbs.onDebounce)) {
|
||||||
@ -224,10 +216,12 @@ var form = {
|
|||||||
rrs.pause();
|
rrs.pause();
|
||||||
|
|
||||||
form.PromiseA.resolve((cbs.onReturnAsync||cbs.onReturn)(rrs, ws, ws._input.join(''), ch)).then(function (normalInput) {
|
form.PromiseA.resolve((cbs.onReturnAsync||cbs.onReturn)(rrs, ws, ws._input.join(''), ch)).then(function (normalInput) {
|
||||||
ws.write('\n');
|
if (!cbs.value) {
|
||||||
ws.clearLine(); // person just hit enter, they are on the next line
|
ws.write('\n');
|
||||||
// (and this will clear the status, if any)
|
ws.clearLine(); // person just hit enter, they are on the next line
|
||||||
// TODO count lines used below and clear all of them
|
// (and this will clear the status, if any)
|
||||||
|
// TODO count lines used below and clear all of them
|
||||||
|
}
|
||||||
rrs.setRawMode(false);
|
rrs.setRawMode(false);
|
||||||
|
|
||||||
var input = ws._input.join('');
|
var input = ws._input.join('');
|
||||||
@ -235,11 +229,14 @@ var form = {
|
|||||||
ws._inputIndex = 0;
|
ws._inputIndex = 0;
|
||||||
resolve({ input: input, result: normalInput });
|
resolve({ input: input, result: normalInput });
|
||||||
}, function (err) {
|
}, function (err) {
|
||||||
rrs.on('data', onData);
|
|
||||||
|
|
||||||
var errmsg = colors.red(err.message);
|
var errmsg = colors.red(err.message);
|
||||||
form.setStatus(rrs, ws, errmsg);
|
form.setStatus(rrs, ws, errmsg);
|
||||||
|
if (!rrs.isTTY) {
|
||||||
|
return PromiseA.reject(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
rrs.on('data', onData);
|
||||||
|
rrs.setRawMode(true);
|
||||||
rrs.resume();
|
rrs.resume();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -249,8 +246,6 @@ var form = {
|
|||||||
var x;
|
var x;
|
||||||
|
|
||||||
if (CTRL_C === ch) {
|
if (CTRL_C === ch) {
|
||||||
console.log("");
|
|
||||||
console.log("received CTRL+C and quit");
|
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
callback(new Error("cancelled"));
|
callback(new Error("cancelled"));
|
||||||
}
|
}
|
||||||
@ -315,6 +310,26 @@ var form = {
|
|||||||
// will come in and we have to figure out what to do about that
|
// will come in and we have to figure out what to do about that
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cbs.value) {
|
||||||
|
ws._input = require('spliddit')(cbs.value);
|
||||||
|
ws._inputIndex = ws._input.length;
|
||||||
|
callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rrs.isTTY) {
|
||||||
|
return PromiseA.reject("User input is required but stdio is not a TTY");
|
||||||
|
}
|
||||||
|
|
||||||
|
rrs.setRawMode(true);
|
||||||
|
rrs.setEncoding('utf8');
|
||||||
|
rrs.resume();
|
||||||
|
|
||||||
|
if (ws.isTTY) {
|
||||||
|
ws.cursorTo(0);
|
||||||
|
ws.write(ws._prompt);
|
||||||
|
//ws.cursorTo(0, ws._prompt.length);
|
||||||
|
}
|
||||||
rrs.on('data', onData);
|
rrs.on('data', onData);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -326,13 +341,17 @@ var form = {
|
|||||||
// TODO write newline?
|
// TODO write newline?
|
||||||
//ws.moveCursor(0, 1);
|
//ws.moveCursor(0, 1);
|
||||||
ws.write('\n');
|
ws.write('\n');
|
||||||
ws.clearLine();
|
if (ws.isTTY) {
|
||||||
ws.cursorTo(0);
|
ws.clearLine();
|
||||||
|
ws.cursorTo(0);
|
||||||
|
}
|
||||||
// write from beginning of line
|
// write from beginning of line
|
||||||
ws.write(msg);
|
ws.write(msg);
|
||||||
// restore position
|
// restore position
|
||||||
ws.cursorTo(x);
|
if (ws.isTTY) {
|
||||||
ws.moveCursor(0, -1);
|
ws.cursorTo(x);
|
||||||
|
ws.moveCursor(0, -1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
, println: function (rrs, ws, msg) {
|
, println: function (rrs, ws, msg) {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "terminal-forms.js",
|
"name": "terminal-forms.js",
|
||||||
"version": "1.0.2",
|
"version": "1.0.4",
|
||||||
"description": "A terminal input library for node.js JavaScript",
|
"description": "A terminal input library for node.js JavaScript",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@ -8,7 +8,7 @@
|
|||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git@git.daplie.com:OAuth3/terminal-forms.js.git"
|
"url": "git@git.oauth3.org:OAuth3/terminal-forms.js.git"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"terminal",
|
"terminal",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user