dce-dev-wizard
Version:
Wizard for managing development apps at Harvard DCE.
156 lines (148 loc) • 4.16 kB
text/typescript
/* eslint-disable no-console */
/**
* Get the left buffer for a centered message
* @author Gabe Abrams
* @param message message to print
* @param padding amount of padding to add
* @returns number of chars in the buffer
*/
const leftBuffer = (message: string, padding: number): number => {
return (Math.floor(process.stdout.columns / 2) - padding - Math.ceil(message.length / 2));
};
/**
* Get the right buffer for a centered message
* @author Gabe Abrams
* @param message message to print
* @param padding amount of padding to add
* @returns number of chars in the buffer
*/
const rightBuffer = (message: string, padding: number): number => {
return (Math.ceil(process.stdout.columns / 2) - padding - Math.floor(message.length / 2));
};
/**
* Surround text with a border and spaces
* @author Gabe Abrams
* @param str text to print
* @param border single character to use as a border
* @returns text to print
*/
const surroundWithBuffer = (str: string, border: string): string => {
return (
border
+ ' '.repeat(leftBuffer(str, border.length))
+ str
+ ' '.repeat(rightBuffer(str, border.length))
+ border
);
};
/**
* Surround text with a character as the buffer
* @author Gabe Abrams
* @param str text to print
* @param char character to place as the buffer
* @returns text to print
*/
const surroundWithChars = (str: string, char: string): string => {
if (str.length > process.stdout.columns) {
return str;
}
if (str.length === process.stdout.columns - 1) {
return char + str;
}
if (str.length === process.stdout.columns - 2) {
return char + str + char;
}
return (
char.repeat(leftBuffer(str, 1))
+ ' '
+ str
+ ' '
+ char.repeat(rightBuffer(str, 1))
);
};
// Prompt instance
let cachedPrompt: any;
const print = {
/**
* Print a title
* @author Gabe Abrams
* @param str text to print
*/
title: (str: string) => {
if (str.length > process.stdout.columns) {
return console.log(str);
}
console.log('\u2554' + '\u2550'.repeat(process.stdout.columns - 2) + '\u2557');
console.log(surroundWithBuffer(str, '\u2551'));
console.log('\u255A' + '\u2550'.repeat(process.stdout.columns - 2) + '\u255D');
},
/**
* Print a sub title (subheading)
* @author Gabe Abrams
* @param str text to print
*/
subtitle: (str: string) => {
if (str.length > process.stdout.columns) {
return console.log(str);
}
console.log(surroundWithChars(str, '\u257C'));
},
/**
* Print centered text
* @author Gabe Abrams
* @param str text to print
*/
centered: (str: string) => {
const lines = [];
let index = 0;
while (index < str.length) {
lines.push(str.substring(index, Math.min(index + process.stdout.columns, str.length)));
index += process.stdout.columns;
}
lines.forEach((line, lineIndex) => {
if (lineIndex !== lines.length - 1) {
// No need to center: fills whole line
console.log(line);
} else {
// This line needs to be centered
console.log(surroundWithChars(line, ' '));
}
});
},
/**
* Print a fatal error message
* @author Gabe Abrams
* @param err error message
*/
fatalError: (err: string) => {
console.log('\n');
const errLine1 = err.substring(0, process.stdout.columns - 6);
const errLine2 = err.substring(process.stdout.columns - 6);
console.log('\u2554' + '\u2550'.repeat(3) + '\u2557 ');
console.log(`\u2551 ! \u2551 ${errLine1}`);
console.log('\u255A' + '\u2550'.repeat(3) + '\u255D ' + errLine2);
process.exit(0);
},
/**
* Save a copy of the prompt instance
* @author Gabe Abrams
* @param promptInstance instance of prompt-sync
*/
savePrompt: (promptInstance: any) => {
cachedPrompt = promptInstance;
},
/**
* Ask the user to press enter before continuing
* @author Gabe Abrams
*/
enterToContinue: () => {
const res = cachedPrompt(
surroundWithChars('enter to continue, ctrl+c to quit', '\u257C'),
true,
);
if (res === null) {
process.exit(0);
}
},
};
export default print;