From 8dd3d75a7c993fccae3a6939b3b460cb9eebfff7 Mon Sep 17 00:00:00 2001 From: Timo Hocker Date: Tue, 5 May 2020 12:48:36 +0200 Subject: [PATCH] more types --- lib/InteractiveOptions.ts | 77 +++++++++++++++++++++++++++++++++++---- package.json | 2 + yarn.lock | 38 ++++++++++++++++++- 3 files changed, 109 insertions(+), 8 deletions(-) diff --git a/lib/InteractiveOptions.ts b/lib/InteractiveOptions.ts index 04a6e18..13409e1 100644 --- a/lib/InteractiveOptions.ts +++ b/lib/InteractiveOptions.ts @@ -1,22 +1,30 @@ +/* eslint-disable complexity */ +/* eslint-disable max-statements */ +/* eslint-disable no-process-env */ import { Persistent } from '@scode/modelling'; +import fs from 'fs-extra'; enum OptionType { string = 'string', number = 'number', - boolean = 'boolean' + boolean = 'boolean', + file = 'file', + folder = 'folder', + path = 'path' } interface Option { name: string; type: OptionType; required?: boolean; - default: unknown; - alias: string; - env: string; + default?: unknown; + alias?: string; + env?: string; } interface OptionProcess extends Option { filled: boolean; + value?: unknown; } export class InteractiveOptions extends Persistent { @@ -42,11 +50,66 @@ export class InteractiveOptions extends Persistent { await this.get_interactive_options (); } - private get_env_options (): void { - + private get unfilled (): Array { + return this.options.filter ((o) => !o.filled); } - private get_args_options (): void { + private async assign_arg (opt: OptionProcess, value: unknown): Promise { + if (opt.type === OptionType.string) { + opt.value = value; + opt.filled = true; + return; + } + if (opt.type === OptionType.number) { + const as_num = parseInt (value); + const is_num = !isNaN (as_num); + if (is_num) { + opt.value = as_num; + opt.filled = true; + } + return; + } + if (opt.type === OptionType.boolean) { + const is_boo = (/^(?:true|false)$/ui).test (value); + if (is_boo) { + const as_boo = (/true/ui).test (value); + opt.value = as_boo; + opt.filled = true; + } + return; + } + if ( + opt.type === OptionType.path + || opt.type === OptionType.file + || opt.type === OptionType.folder + ) { + if (!await fs.pathExists (value)) + return; + if (opt.type === OptionType.path) { + opt.value = value; + opt.filled = true; + return; + } + const stat = await fs.stat (value); + if (stat.isDirectory () === (opt.type === OptionType.folder)) { + opt.value = value; + opt.filled = true; + } + } + } + + private async get_env_options (): void { + await Promise.all (this.options.map ((opt) => { + if ( + typeof opt.env !== 'undefined' + && typeof process.env[opt.env] !== 'undefined' + ) + return this.assign_arg (opt, process.env[opt.env]); + return Promise.resolve (); + })); + } + + private async get_args_options (): void { } diff --git a/package.json b/package.json index bec358f..c717a29 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "devDependencies": { "@ava/typescript": "^1.1.1", "@scode/eslint-config-ts": "^1.0.31", + "@types/fs-extra": "^8.1.0", "ava": "^3.8.1", "eslint": "^6.8.0", "nyc": "^15.0.1", @@ -24,6 +25,7 @@ "dependencies": { "@scode/modelling": "^1.0.24", "enquirer": "^2.3.5", + "fs-extra": "^9.0.0", "yargs": "^15.3.1" } } diff --git a/yarn.lock b/yarn.lock index 21fb2dd..3c356fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -285,6 +285,13 @@ resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== +"@types/fs-extra@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.1.0.tgz#1114834b53c3914806cd03b3304b37b3bd221a4d" + integrity sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg== + dependencies: + "@types/node" "*" + "@types/glob@^7.1.1": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" @@ -518,6 +525,11 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + ava@^3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/ava/-/ava-3.8.1.tgz#ec50814f8e6c769b8ed0dcc64bca990cd06bb2d1" @@ -1432,6 +1444,16 @@ fromentries@^1.2.0: resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.0.tgz#e6aa06f240d6267f913cea422075ef88b63e7897" integrity sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ== +fs-extra@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" + integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1557,7 +1579,7 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.2.2: +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== @@ -1991,6 +2013,15 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" +jsonfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" + integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + dependencies: + universalify "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -3190,6 +3221,11 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== + update-notifier@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3"