1+ import * as Colors from '@battis/qui-cli.colors/dist/Colors.js' ;
12import * as Plugin from '@battis/qui-cli.plugin' ;
2- import { Jack , JackOptions } from 'jackspeak' ;
3+ import * as JackSpeak from './JackSpeak.js' ;
4+ import * as Positionals from './Positionals.js' ;
5+ import { usage } from './Usage.js' ;
36
47export { Options } from '@battis/qui-cli.plugin' ;
8+ export * from './Usage.js' ;
59
6- export type Configuration = Record < string , Plugin . Configuration > & {
7- core ?: JackOptions & {
10+ export type Configuration = Plugin . Registrar . Configuration & {
11+ /** @deprecated Use `jackspeak` property */
12+ core ?: JackSpeak . Configuration & {
13+ /** @deprecated Use `Positional` plugin */
814 requirePositionals ?: boolean | number ;
915 } ;
1016} ;
1117
12- let _jack : Jack | undefined = undefined ;
13- function jack ( ) {
14- if ( ! _jack ) {
15- configure ( ) ;
16- }
17- if ( ! _jack ) {
18- throw new Error ( 'Bad things!' ) ;
19- }
20- return _jack ;
21- }
22-
23- // TODO automate positionals documentation
24- let requirePositionals : boolean | number | undefined = undefined ;
2518let initialized = false ;
26- let positionals : ( string | undefined ) [ ] = [ ] ;
27-
28- export async function configure ( { core, ...pluginConfig } : Configuration = { } ) {
29- requirePositionals = Plugin . hydrate (
30- core ?. requirePositionals ,
31- requirePositionals
32- ) ;
33-
34- _jack = new Jack ( {
35- ...core ,
36- allowPositionals : ! ! requirePositionals
37- } ) ;
3819
39- await Plugin . Registrar . configure ( pluginConfig ) ;
20+ export async function configure ( config : Configuration = { } ) {
21+ const { core = { } , jackspeak : jackOptions , positionals = { } } = config ;
22+ const { requirePositionals, ...deprecated } = core ;
23+ const jackspeak = {
24+ ...deprecated ,
25+ allowPositionals : ! ! Positionals . requirePositionals (
26+ positionals ,
27+ requirePositionals
28+ ) ,
29+ ...jackOptions
30+ } ;
31+ if ( jackspeak . allowPositionals === false ) {
32+ positionals . max = 0 ;
33+ }
34+ await Plugin . Registrar . configure ( { positionals, jackspeak } ) ;
4035}
4136
4237export async function options ( externalOptions : Plugin . Options = { } ) {
@@ -48,35 +43,6 @@ export async function options(externalOptions: Plugin.Options = {}) {
4843 return Plugin . mergeOptions ( await Plugin . Registrar . options ( ) , externalOptions ) ;
4944}
5045
51- function apply ( {
52- num,
53- numList,
54- opt,
55- optList,
56- flag,
57- flagList,
58- fields,
59- man = [ ]
60- } : Plugin . Options ) {
61- jack ( )
62- . num ( { ...num } )
63- . numList ( { ...numList } )
64- . opt ( { ...opt } )
65- . optList ( { ...optList } )
66- . flag ( { ...flag } )
67- . flagList ( { ...flagList } )
68- . addFields ( { ...fields } ) ;
69- for ( const paragraph of man ) {
70- if ( paragraph . level ) {
71- jack ( ) . heading ( paragraph . text , paragraph . level , {
72- pre : paragraph . pre
73- } ) ;
74- } else {
75- jack ( ) . description ( paragraph . text , { pre : paragraph . pre } ) ;
76- }
77- }
78- }
79-
8046export async function init (
8147 externalOptions ?: Plugin . Options
8248) : Promise < Plugin . Arguments < Plugin . Options > > {
@@ -87,17 +53,13 @@ export async function init(
8753 }
8854 for ( const plugin of Plugin . Registrar . registered ( ) ) {
8955 if ( plugin . options ) {
90- apply ( await plugin . options ( ) ) ;
56+ JackSpeak . args ( await plugin . options ( ) ) ;
9157 }
9258 }
9359 if ( externalOptions ) {
94- apply ( externalOptions ) ;
60+ JackSpeak . args ( externalOptions ) ;
9561 }
96-
97- const args = jack ( ) . parse ( ) as Plugin . Arguments < Plugin . Options > ;
98- const { positionals : p } = args ;
99- positionals = p ;
100-
62+ const args = JackSpeak . parse ( ) ;
10163 await Plugin . Registrar . init ( args ) ;
10264 initialized = true ;
10365 return args ;
@@ -106,45 +68,14 @@ export async function init(
10668export async function run (
10769 externalOptions ?: Plugin . Options
10870) : Promise < Plugin . AccumulatedResults | undefined > {
109- if ( ! initialized ) {
110- await init ( externalOptions ) ;
111- }
112-
113- if (
114- requirePositionals &&
115- ( ! positionals . length ||
116- ( typeof requirePositionals == 'number' &&
117- positionals . length < requirePositionals ) )
118- ) {
119- throw new Error (
120- `Incorrect positional arguments (${ requirePositionals } expected, ${ positionals . length } provided)`
121- ) ;
122- }
123-
124- return await Plugin . Registrar . run ( ) ;
125- }
126-
127- export function usage ( ) {
128- let usage = jack ( ) . usage ( ) ;
129- if ( requirePositionals ) {
130- if ( typeof requirePositionals === 'number' ) {
131- if ( requirePositionals > 1 ) {
132- usage = usage . replace (
133- / \n \n / m, // FIXME hilariously unreliable regex!
134- // Issue URL: https://github.com/battis/qui-cli/issues/25
135- ` arg0..arg${ requirePositionals - 1 } \n\n`
136- ) ;
137- } else {
138- usage = usage . replace ( / \n \n / m, ' argument\n\n' ) ;
139- }
140- } else {
141- usage = usage . replace ( / \n \n / m, ' argument0...\n\n' ) ;
71+ try {
72+ if ( ! initialized ) {
73+ await init ( externalOptions ) ;
14274 }
75+ return await Plugin . Registrar . run ( ) ;
76+ } catch ( e ) {
77+ const error = e as Error ;
78+ console . log ( `${ Colors . error ( error . message ) } \n\n${ usage ( ) } ` ) ;
79+ process . exit ( 1 ) ;
14380 }
144- return usage ;
145- }
146-
147- export function usageMarkdown ( ) {
148- return jack ( ) . usageMarkdown ( ) ; // FIXME format arguments
149- // Issue URL: https://github.com/battis/qui-cli/issues/24
15081}
0 commit comments