@@ -9,10 +9,11 @@ import {
99 UserDefinedOpenApiConfig ,
1010} from '../core/shared/types' ;
1111import { TypeScriptLoader } from 'cosmiconfig-typescript-loader' ;
12- import { markdownOptions } from './commands/markdown' ;
13- import { openApiOptions } from './commands/openapi' ;
14- import { changeLogOptions } from './commands/changelog' ;
12+ import { markdownOptions , validateMarkdownArgs } from './commands/markdown' ;
13+ import { openApiOptions , validateOpenApiArgs } from './commands/openapi' ;
14+ import { changeLogOptions , validateChangelogArgs } from './commands/changelog' ;
1515import { pipe } from 'fp-ts/function' ;
16+ import { validateSourceDirectoryConfig } from '../util/source-directory-resolver' ;
1617
1718const configOnlyMarkdownDefaults : Partial < UserDefinedMarkdownConfig > = {
1819 targetGenerator : 'markdown' ,
@@ -91,11 +92,23 @@ function extractArgsForCommandProvidedThroughCli(
9192
9293 switch ( mergedConfig . targetGenerator ) {
9394 case 'markdown' :
94- return E . right ( { ...configOnlyMarkdownDefaults , ...mergedConfig } as UserDefinedMarkdownConfig ) ;
95+ return pipe (
96+ validateSourceDirectoryConfig ( extractSourceDirectoryConfig ( mergedConfig ) ) ,
97+ E . mapLeft ( ( error ) => new Error ( `Invalid markdown configuration: ${ error . message } ` ) ) ,
98+ E . map ( ( ) => ( { ...configOnlyMarkdownDefaults , ...mergedConfig } ) as UserDefinedMarkdownConfig ) ,
99+ ) ;
95100 case 'openapi' :
96- return E . right ( { ...configOnlyOpenApiDefaults , ...mergedConfig } as unknown as UserDefinedOpenApiConfig ) ;
101+ return pipe (
102+ validateSourceDirectoryConfig ( extractSourceDirectoryConfig ( mergedConfig ) ) ,
103+ E . mapLeft ( ( error ) => new Error ( `Invalid openapi configuration: ${ error . message } ` ) ) ,
104+ E . map ( ( ) => ( { ...configOnlyOpenApiDefaults , ...mergedConfig } ) as unknown as UserDefinedOpenApiConfig ) ,
105+ ) ;
97106 case 'changelog' :
98- return E . right ( { ...configOnlyChangelogDefaults , ...mergedConfig } as unknown as UserDefinedChangelogConfig ) ;
107+ return pipe (
108+ validateChangelogConfig ( mergedConfig as unknown as UserDefinedChangelogConfig ) ,
109+ E . mapLeft ( ( error ) => new Error ( `Invalid changelog configuration: ${ error . message } ` ) ) ,
110+ E . map ( ( ) => ( { ...configOnlyChangelogDefaults , ...mergedConfig } ) as unknown as UserDefinedChangelogConfig ) ,
111+ ) ;
99112 default :
100113 return E . left ( new Error ( `Invalid command provided: ${ mergedConfig . targetGenerator } ` ) ) ;
101114 }
@@ -124,20 +137,41 @@ function extractArgsForCommandsProvidedInConfig(
124137 E . map ( ( cliArgs ) => {
125138 return cliArgs ;
126139 } ) ,
127- E . map ( ( cliArgs ) => ( { ...configOnlyMarkdownDefaults , ...generatorConfig , ...cliArgs } ) ) ,
140+ E . flatMap ( ( cliArgs ) => {
141+ const mergedConfig = { ...configOnlyMarkdownDefaults , ...generatorConfig , ...cliArgs } ;
142+ return pipe (
143+ validateSourceDirectoryConfig ( extractSourceDirectoryConfig ( mergedConfig ) ) ,
144+ E . mapLeft ( ( error ) => new Error ( `Invalid markdown configuration: ${ error . message } ` ) ) ,
145+ E . map ( ( ) => mergedConfig ) ,
146+ ) ;
147+ } ) ,
128148 ) ;
129149 case 'openapi' :
130150 return pipe (
131151 extractMultiCommandConfig ( extractFromProcessFn , 'openapi' , generatorConfig ) ,
132- E . map ( ( cliArgs ) => ( { ...configOnlyOpenApiDefaults , ...generatorConfig , ...cliArgs } ) ) ,
152+ E . flatMap ( ( cliArgs ) => {
153+ const mergedConfig = { ...configOnlyOpenApiDefaults , ...generatorConfig , ...cliArgs } ;
154+ return pipe (
155+ validateSourceDirectoryConfig ( extractSourceDirectoryConfig ( mergedConfig ) ) ,
156+ E . mapLeft ( ( error ) => new Error ( `Invalid openapi configuration: ${ error . message } ` ) ) ,
157+ E . map ( ( ) => mergedConfig ) ,
158+ ) ;
159+ } ) ,
133160 ) ;
134161 case 'changelog' :
135162 return pipe (
136163 extractMultiCommandConfig ( extractFromProcessFn , 'changelog' , generatorConfig ) ,
137164 E . map ( ( cliArgs ) => {
138165 return cliArgs ;
139166 } ) ,
140- E . map ( ( cliArgs ) => ( { ...configOnlyChangelogDefaults , ...generatorConfig , ...cliArgs } ) ) ,
167+ E . flatMap ( ( cliArgs ) => {
168+ const mergedConfig = { ...configOnlyChangelogDefaults , ...generatorConfig , ...cliArgs } ;
169+ return pipe (
170+ validateChangelogConfig ( mergedConfig as unknown as UserDefinedChangelogConfig ) ,
171+ E . mapLeft ( ( error ) => new Error ( `Invalid changelog configuration: ${ error . message } ` ) ) ,
172+ E . map ( ( ) => mergedConfig ) ,
173+ ) ;
174+ } ) ,
141175 ) ;
142176 }
143177 } ) ;
@@ -193,13 +227,13 @@ function extractYargsDemandingCommand(extractFromProcessFn: ExtractArgsFromProce
193227 return yargs
194228 . config ( config . config as Record < string , unknown > )
195229 . command ( 'markdown' , 'Generate documentation from Apex classes as a Markdown site.' , ( yargs ) =>
196- yargs . options ( markdownOptions ) ,
230+ yargs . options ( markdownOptions ) . check ( validateMarkdownArgs ) ,
197231 )
198- . command ( 'openapi' , 'Generate an OpenApi REST specification from Apex classes.' , ( ) =>
199- yargs . options ( openApiOptions ) ,
232+ . command ( 'openapi' , 'Generate an OpenApi REST specification from Apex classes.' , ( yargs ) =>
233+ yargs . options ( openApiOptions ) . check ( validateOpenApiArgs ) ,
200234 )
201- . command ( 'changelog' , 'Generate a changelog from 2 versions of the source code.' , ( ) =>
202- yargs . options ( changeLogOptions ) ,
235+ . command ( 'changelog' , 'Generate a changelog from 2 versions of the source code.' , ( yargs ) =>
236+ yargs . options ( changeLogOptions ) . check ( validateChangelogArgs ) ,
203237 )
204238 . demandCommand ( )
205239 . parseSync ( extractFromProcessFn ( ) ) ;
@@ -221,14 +255,66 @@ function extractMultiCommandConfig(
221255 }
222256 }
223257
258+ function getValidationFunction ( generator : Generators ) {
259+ switch ( generator ) {
260+ case 'markdown' :
261+ return validateMarkdownArgs ;
262+ case 'openapi' :
263+ return validateOpenApiArgs ;
264+ case 'changelog' :
265+ return validateChangelogArgs ;
266+ }
267+ }
268+
224269 const options = getOptions ( command ) ;
270+ const validator = getValidationFunction ( command ) ;
225271 return E . tryCatch ( ( ) => {
226272 return yargs ( extractFromProcessFn ( ) )
227273 . config ( config )
228274 . options ( options )
275+ . check ( validator )
229276 . fail ( ( msg ) => {
230277 throw new Error ( `Invalid configuration for command "${ command } ": ${ msg } ` ) ;
231278 } )
232279 . parseSync ( ) ;
233280 } , E . toError ) ;
234281}
282+
283+ function extractSourceDirectoryConfig ( config : Record < string , unknown > ) : {
284+ sourceDir ?: string ;
285+ sourceDirs ?: string [ ] ;
286+ useSfdxProjectJson ?: boolean ;
287+ sfdxProjectPath ?: string ;
288+ } {
289+ return {
290+ sourceDir : config . sourceDir as string | undefined ,
291+ sourceDirs : config . sourceDirs as string [ ] | undefined ,
292+ useSfdxProjectJson : config . useSfdxProjectJson as boolean | undefined ,
293+ sfdxProjectPath : config . sfdxProjectPath as string | undefined ,
294+ } ;
295+ }
296+
297+ function validateChangelogConfig (
298+ config : UserDefinedChangelogConfig ,
299+ ) : E . Either < { message : string } , UserDefinedChangelogConfig > {
300+ const previousVersionConfig = {
301+ sourceDir : config . previousVersionDir ,
302+ sourceDirs : config . previousVersionDirs ,
303+ useSfdxProjectJson : config . useSfdxProjectJsonForPrevious ,
304+ sfdxProjectPath : config . sfdxProjectPathForPrevious ,
305+ } ;
306+
307+ const currentVersionConfig = {
308+ sourceDir : config . currentVersionDir ,
309+ sourceDirs : config . currentVersionDirs ,
310+ useSfdxProjectJson : config . useSfdxProjectJsonForCurrent ,
311+ sfdxProjectPath : config . sfdxProjectPathForCurrent ,
312+ } ;
313+
314+ return pipe (
315+ E . Do ,
316+ E . bind ( 'previousValid' , ( ) => validateSourceDirectoryConfig ( previousVersionConfig ) ) ,
317+ E . bind ( 'currentValid' , ( ) => validateSourceDirectoryConfig ( currentVersionConfig ) ) ,
318+ E . map ( ( ) => config ) ,
319+ ) ;
320+ }
0 commit comments