From 42c1458a8272d1ec6ea3de9694d38fda30183428 Mon Sep 17 00:00:00 2001 From: Simon Boudrias Date: Sat, 20 May 2023 13:31:32 -0400 Subject: [PATCH] Chore: Set demo to only run automatically if they're the entrypoint. Otherwise, export a demo function. --- .../demo.mts => demo/demos/checkbox.mjs} | 16 ++++- .../demo.mts => demo/demos/confirm.mjs} | 16 ++++- packages/demo/demos/editor.mjs | 25 +++++++ .../demo.mts => demo/demos/expand.mjs} | 16 ++++- .../{input/demo.mts => demo/demos/input.mjs} | 22 ++++-- packages/demo/demos/password.mjs | 28 ++++++++ .../demo.mts => demo/demos/rawlist.mjs} | 16 ++++- .../demo.mts => demo/demos/select.mjs} | 16 ++++- packages/demo/index.mjs | 48 +++++++++++++ packages/demo/package.json | 70 +++++++++++++++++++ packages/editor/demo.mts | 16 ----- packages/password/demo.mts | 16 ----- 12 files changed, 252 insertions(+), 53 deletions(-) rename packages/{checkbox/demo.mts => demo/demos/checkbox.mjs} (80%) rename packages/{confirm/demo.mts => demo/demos/confirm.mjs} (67%) create mode 100644 packages/demo/demos/editor.mjs rename packages/{expand/demo.mts => demo/demos/expand.mjs} (84%) rename packages/{input/demo.mts => demo/demos/input.mjs} (74%) create mode 100644 packages/demo/demos/password.mjs rename packages/{rawlist/demo.mts => demo/demos/rawlist.mjs} (77%) rename packages/{select/demo.mts => demo/demos/select.mjs} (82%) create mode 100755 packages/demo/index.mjs create mode 100644 packages/demo/package.json delete mode 100644 packages/editor/demo.mts delete mode 100644 packages/password/demo.mts diff --git a/packages/checkbox/demo.mts b/packages/demo/demos/checkbox.mjs similarity index 80% rename from packages/checkbox/demo.mts rename to packages/demo/demos/checkbox.mjs index 7bb1cfc1a..46b4848c8 100644 --- a/packages/checkbox/demo.mts +++ b/packages/demo/demos/checkbox.mjs @@ -1,6 +1,7 @@ -import checkbox, { Separator } from './src/index.mjs'; +import * as url from 'node:url'; +import { checkbox, Separator } from '@inquirer/prompts'; -(async () => { +const demo = async () => { let answer; answer = await checkbox({ @@ -52,4 +53,13 @@ import checkbox, { Separator } from './src/index.mjs'; ], }); console.log('Answer:', answer); -})(); +}; + +if (import.meta.url.startsWith('file:')) { + const modulePath = url.fileURLToPath(import.meta.url); + if (process.argv[1] === modulePath) { + demo(); + } +} + +export default demo; diff --git a/packages/confirm/demo.mts b/packages/demo/demos/confirm.mjs similarity index 67% rename from packages/confirm/demo.mts rename to packages/demo/demos/confirm.mjs index be1386fa4..621b2f0ee 100644 --- a/packages/confirm/demo.mts +++ b/packages/demo/demos/confirm.mjs @@ -1,6 +1,7 @@ -import confirm from './src/index.mjs'; +import * as url from 'node:url'; +import { confirm } from '@inquirer/prompts'; -(async () => { +const demo = async () => { console.log( 'Answer:', await confirm({ @@ -29,4 +30,13 @@ import confirm from './src/index.mjs'; 'Cleared prompt answer:', await confirm({ message: 'Confirm?' }, { clearPromptOnDone: true }) ); -})(); +}; + +if (import.meta.url.startsWith('file:')) { + const modulePath = url.fileURLToPath(import.meta.url); + if (process.argv[1] === modulePath) { + demo(); + } +} + +export default demo; diff --git a/packages/demo/demos/editor.mjs b/packages/demo/demos/editor.mjs new file mode 100644 index 000000000..b5bfab8a2 --- /dev/null +++ b/packages/demo/demos/editor.mjs @@ -0,0 +1,25 @@ +import * as url from 'node:url'; +import { editor } from '@inquirer/prompts'; + +const demo = async () => { + const answer = await editor({ + message: 'Please write a short bio of at least 3 lines.', + validate(text) { + if (text.trim().split('\n').length < 3) { + return 'Must be at least 3 lines.'; + } + + return true; + }, + }); + console.log('Answer:', answer); +}; + +if (import.meta.url.startsWith('file:')) { + const modulePath = url.fileURLToPath(import.meta.url); + if (process.argv[1] === modulePath) { + demo(); + } +} + +export default demo; diff --git a/packages/expand/demo.mts b/packages/demo/demos/expand.mjs similarity index 84% rename from packages/expand/demo.mts rename to packages/demo/demos/expand.mjs index 46bdca837..db037c3b1 100644 --- a/packages/expand/demo.mts +++ b/packages/demo/demos/expand.mjs @@ -1,6 +1,7 @@ -import expand from './src/index.mjs'; +import * as url from 'node:url'; +import { expand } from '@inquirer/prompts'; -(async () => { +const demo = async () => { let answer; answer = await expand({ @@ -85,4 +86,13 @@ import expand from './src/index.mjs'; ], }); console.log('Answer:', answer); -})(); +}; + +if (import.meta.url.startsWith('file:')) { + const modulePath = url.fileURLToPath(import.meta.url); + if (process.argv[1] === modulePath) { + demo(); + } +} + +export default demo; diff --git a/packages/input/demo.mts b/packages/demo/demos/input.mjs similarity index 74% rename from packages/input/demo.mts rename to packages/demo/demos/input.mjs index 348afa916..8576c56a6 100644 --- a/packages/input/demo.mts +++ b/packages/demo/demos/input.mjs @@ -1,12 +1,13 @@ +import * as url from 'node:url'; import chalk from 'chalk'; -import input from './src/index.mjs'; +import { input } from '@inquirer/prompts'; const hexRegEx = /([0-9]|[a-f])/gim; -const isHex = (value: string) => +const isHex = (value) => (value.match(hexRegEx) || []).length === value.length && (value.length === 3 || value.length === 6); -(async () => { +const demo = async () => { let answer; answer = await input({ @@ -17,7 +18,7 @@ const isHex = (value: string) => answer = await input({ message: 'Enter an hex color?', - transformer(value = '', { isFinal }: { isFinal: boolean }) { + transformer(value = '', { isFinal }) { const color = chalk.hex(isHex(value) ? value : 'fff'); return isFinal ? color.underline(value) : color(value); }, @@ -27,7 +28,7 @@ const isHex = (value: string) => answer = await input({ message: '(Slow validation) provide a number:', - validate: (value: unknown) => + validate: (value) => new Promise((resolve) => { setTimeout( () => resolve(!Number.isNaN(Number(value)) || 'You must provide a number'), @@ -44,4 +45,13 @@ const isHex = (value: string) => }), }); console.log('Answer:', answer); -})(); +}; + +if (import.meta.url.startsWith('file:')) { + const modulePath = url.fileURLToPath(import.meta.url); + if (process.argv[1] === modulePath) { + demo(); + } +} + +export default demo; diff --git a/packages/demo/demos/password.mjs b/packages/demo/demos/password.mjs new file mode 100644 index 000000000..d401187df --- /dev/null +++ b/packages/demo/demos/password.mjs @@ -0,0 +1,28 @@ +import * as url from 'node:url'; +import { password } from '@inquirer/prompts'; + +const demo = async () => { + console.log( + 'Answer:', + await password({ + message: 'Enter a silent password?', + }) + ); + + console.log( + 'Answer:', + await password({ + message: 'Enter a masked password?', + mask: '*', + }) + ); +}; + +if (import.meta.url.startsWith('file:')) { + const modulePath = url.fileURLToPath(import.meta.url); + if (process.argv[1] === modulePath) { + demo(); + } +} + +export default demo; diff --git a/packages/rawlist/demo.mts b/packages/demo/demos/rawlist.mjs similarity index 77% rename from packages/rawlist/demo.mts rename to packages/demo/demos/rawlist.mjs index 59a7a5dc0..b46c700f7 100644 --- a/packages/rawlist/demo.mts +++ b/packages/demo/demos/rawlist.mjs @@ -1,6 +1,7 @@ -import rawlist, { Separator } from './src/index.mjs'; +import * as url from 'node:url'; +import { rawlist, Separator } from '@inquirer/prompts'; -(async () => { +const demo = async () => { let answer; answer = await rawlist({ @@ -54,4 +55,13 @@ import rawlist, { Separator } from './src/index.mjs'; ], }); console.log('Answer:', answer); -})(); +}; + +if (import.meta.url.startsWith('file:')) { + const modulePath = url.fileURLToPath(import.meta.url); + if (process.argv[1] === modulePath) { + demo(); + } +} + +export default demo; diff --git a/packages/select/demo.mts b/packages/demo/demos/select.mjs similarity index 82% rename from packages/select/demo.mts rename to packages/demo/demos/select.mjs index 299d9b11e..776bb0177 100644 --- a/packages/select/demo.mts +++ b/packages/demo/demos/select.mjs @@ -1,6 +1,7 @@ -import select, { Separator } from './src/index.mjs'; +import * as url from 'node:url'; +import { select, Separator } from '@inquirer/prompts'; -(async () => { +const demo = async () => { let answer; answer = await select({ @@ -56,4 +57,13 @@ import select, { Separator } from './src/index.mjs'; ], }); console.log('Answer:', answer); -})(); +}; + +if (import.meta.url.startsWith('file:')) { + const modulePath = url.fileURLToPath(import.meta.url); + if (process.argv[1] === modulePath) { + demo(); + } +} + +export default demo; diff --git a/packages/demo/index.mjs b/packages/demo/index.mjs new file mode 100755 index 000000000..ee23137e4 --- /dev/null +++ b/packages/demo/index.mjs @@ -0,0 +1,48 @@ +#!/usr/bin/env node +/* eslint-disable no-await-in-loop */ + +import { select } from '@inquirer/prompts'; +import checkboxDemo from './demos/checkbox.mjs'; +import confirmDemo from './demos/confirm.mjs'; +import editorDemo from './demos/editor.mjs'; +import expandDemo from './demos/expand.mjs'; +import inputDemo from './demos/input.mjs'; +import passwordDemo from './demos/password.mjs'; +import rawlistDemo from './demos/rawlist.mjs'; +import selectDemo from './demos/select.mjs'; + +const demos = { + checkbox: checkboxDemo, + confirm: confirmDemo, + editor: editorDemo, + expand: expandDemo, + input: inputDemo, + password: passwordDemo, + rawlist: rawlistDemo, + select: selectDemo, +}; + +function askNextDemo() { + return select({ + message: 'Which prompt demo do you want to run?', + choices: [ + { name: 'Input', value: 'input' }, + { name: 'Password', value: 'password' }, + { name: 'Confirm', value: 'confirm' }, + { name: 'Select', value: 'select' }, + { name: 'Checkbox', value: 'checkbox' }, + { name: 'Expand', value: 'expand' }, + { name: 'Rawlist', value: 'rawlist' }, + { name: 'Editor', value: 'editor' }, + { name: "Exit (I'm done)", value: 'exit' }, + ], + }); +} + +(async () => { + let nextDemo = await askNextDemo(); + while (nextDemo !== 'exit') { + await demos[nextDemo](); + nextDemo = await askNextDemo(); + } +})(); diff --git a/packages/demo/package.json b/packages/demo/package.json new file mode 100644 index 000000000..55b02757b --- /dev/null +++ b/packages/demo/package.json @@ -0,0 +1,70 @@ +{ + "name": "@inquirer/demo", + "version": "0.0.0", + "engines": { + "node": ">=14.18.0" + }, + "type": "module", + "description": "Inquirer demos", + "main": "index.mjs", + "bin": { + "inquirer-demo": "index.mjs" + }, + "files": [ + "index.mjs", + "demos/" + ], + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" + }, + "keywords": [ + "answer", + "answers", + "ask", + "base", + "cli", + "command", + "command-line", + "confirm", + "enquirer", + "generate", + "generator", + "hyper", + "input", + "inquire", + "inquirer", + "interface", + "iterm", + "javascript", + "menu", + "node", + "nodejs", + "prompt", + "promptly", + "prompts", + "question", + "readline", + "scaffold", + "scaffolder", + "scaffolding", + "stdin", + "stdout", + "terminal", + "tty", + "ui", + "yeoman", + "yo", + "zsh" + ], + "author": "Simon Boudrias ", + "license": "MIT", + "homepage": "https://github.com/SBoudrias/Inquirer.js", + "dependencies": { + "chalk": "^4.1.2", + "@inquirer/prompts": "^1.2.2" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/editor/demo.mts b/packages/editor/demo.mts deleted file mode 100644 index 3bc12649d..000000000 --- a/packages/editor/demo.mts +++ /dev/null @@ -1,16 +0,0 @@ -import editor from './src/index.mjs'; - -(async () => { - const answer = await editor({ - message: 'Please write a short bio of at least 3 lines.', - validate(text) { - if (text.trim().split('\n').length < 3) { - return 'Must be at least 3 lines.'; - } - - return true; - }, - }); - console.log('Answer:'); - console.log(answer); -})(); diff --git a/packages/password/demo.mts b/packages/password/demo.mts deleted file mode 100644 index 2de02fa10..000000000 --- a/packages/password/demo.mts +++ /dev/null @@ -1,16 +0,0 @@ -import password from './src/index.mjs'; - -(async () => { - let answer: string; - - answer = await password({ - message: 'Enter a silent password?', - }); - console.log('Answer:', answer); - - answer = await password({ - message: 'Enter a masked password?', - mask: '*', - }); - console.log('Answer:', answer); -})();