@@ -524,16 +524,11 @@ async function getCodeQLForCmd(
524524 } ,
525525 async getVersion ( ) {
526526 async function runCliVersion ( ) {
527- const output = await runCli ( cmd , [ "version" , "--format=json" ] , {
528- noStreamStdout : true ,
529- } ) ;
530- try {
531- return JSON . parse ( output ) as VersionInfo ;
532- } catch {
533- throw Error (
534- `Invalid JSON output from \`version --format=json\`: ${ output } ` ,
535- ) ;
536- }
527+ return await runCliJson < VersionInfo > (
528+ cmd ,
529+ [ "version" , "--format=json" ] ,
530+ { noStreamStdout : true } ,
531+ ) ;
537532 }
538533
539534 let result = util . getCachedCodeQlVersion ( cmd ) ;
@@ -741,21 +736,12 @@ async function getCodeQLForCmd(
741736 } ,
742737 async resolveLanguages ( ) {
743738 async function runCliResolveLanguages ( ) {
744- const codeqlArgs = [
739+ return await runCliJson < ResolveLanguagesOutput > ( cmd , [
745740 "resolve" ,
746741 "languages" ,
747742 "--format=json" ,
748743 ...getExtraOptionsFromEnv ( [ "resolve" , "languages" ] ) ,
749- ] ;
750- const output = await runCli ( cmd , codeqlArgs ) ;
751-
752- try {
753- return JSON . parse ( output ) as ResolveLanguagesOutput ;
754- } catch ( e ) {
755- throw new Error (
756- `Unexpected output from codeql resolve languages: ${ e } ` ,
757- ) ;
758- }
744+ ] ) ;
759745 }
760746
761747 let result = util . getCachedCodeQlResolveLanguages ( cmd ) ;
@@ -783,15 +769,7 @@ async function getCodeQLForCmd(
783769 : [ ] ) ,
784770 ...getExtraOptionsFromEnv ( [ "resolve" , "languages" ] ) ,
785771 ] ;
786- const output = await runCli ( cmd , codeqlArgs ) ;
787-
788- try {
789- return JSON . parse ( output ) as BetterResolveLanguagesOutput ;
790- } catch ( e ) {
791- throw new Error (
792- `Unexpected output from codeql resolve languages with --format=betterjson: ${ e } ` ,
793- ) ;
794- }
772+ return await runCliJson < BetterResolveLanguagesOutput > ( cmd , codeqlArgs ) ;
795773 } ,
796774 async resolveBuildEnvironment (
797775 workingDir : string | undefined ,
@@ -807,15 +785,7 @@ async function getCodeQLForCmd(
807785 if ( workingDir !== undefined ) {
808786 codeqlArgs . push ( "--working-dir" , workingDir ) ;
809787 }
810- const output = await runCli ( cmd , codeqlArgs ) ;
811-
812- try {
813- return JSON . parse ( output ) as ResolveBuildEnvironmentOutput ;
814- } catch ( e ) {
815- throw new Error (
816- `Unexpected output from codeql resolve build-environment: ${ e } in\n${ output } ` ,
817- ) ;
818- }
788+ return await runCliJson < ResolveBuildEnvironmentOutput > ( cmd , codeqlArgs ) ;
819789 } ,
820790 async databaseRunQueries (
821791 databasePath : string ,
@@ -996,15 +966,9 @@ async function getCodeQLForCmd(
996966 ...getExtraOptionsFromEnv ( [ "resolve" , "queries" ] ) ,
997967 ...queries ,
998968 ] ;
999- const output = await runCli ( cmd , codeqlArgs , { noStreamStdout : true } ) ;
1000-
1001- try {
1002- return JSON . parse ( output ) as string [ ] ;
1003- } catch ( e ) {
1004- throw new Error (
1005- `Unexpected output from codeql resolve queries --format=startingpacks: ${ e } ` ,
1006- ) ;
1007- }
969+ return await runCliJson < string [ ] > ( cmd , codeqlArgs , {
970+ noStreamStdout : true ,
971+ } ) ;
1008972 } ,
1009973 async resolveDatabase (
1010974 databasePath : string ,
@@ -1016,15 +980,9 @@ async function getCodeQLForCmd(
1016980 "--format=json" ,
1017981 ...getExtraOptionsFromEnv ( [ "resolve" , "database" ] ) ,
1018982 ] ;
1019- const output = await runCli ( cmd , codeqlArgs , { noStreamStdout : true } ) ;
1020-
1021- try {
1022- return JSON . parse ( output ) as ResolveDatabaseOutput ;
1023- } catch ( e ) {
1024- throw new Error (
1025- `Unexpected output from codeql resolve database --format=json: ${ e } ` ,
1026- ) ;
1027- }
983+ return await runCliJson < ResolveDatabaseOutput > ( cmd , codeqlArgs , {
984+ noStreamStdout : true ,
985+ } ) ;
1028986 } ,
1029987 async mergeResults (
1030988 sarifFiles : string [ ] ,
@@ -1180,6 +1138,19 @@ async function runCli(
11801138 }
11811139}
11821140
1141+ async function runCliJson < T > (
1142+ cmd : string ,
1143+ args : string [ ] = [ ] ,
1144+ opts : { stdin ?: string ; noStreamStdout ?: boolean } = { } ,
1145+ ) : Promise < T > {
1146+ const output = await runCli ( cmd , args , opts ) ;
1147+ try {
1148+ return JSON . parse ( output ) as T ;
1149+ } catch {
1150+ throw Error ( `Invalid JSON output from \`${ args . join ( " " ) } \`: ${ output } ` ) ;
1151+ }
1152+ }
1153+
11831154/**
11841155 * Writes the code scanning configuration that is to be used by the CLI.
11851156 *
0 commit comments