11import { join } from "path" ;
2+ import { outputFile } from "fs-extra" ;
3+ import { dump } from "js-yaml" ;
4+ import { file } from "tmp-promise" ;
25import type { BaseLogger } from "../common/logging" ;
36import type { QueryLanguage } from "../common/query-language" ;
47import type { CodeQLCliServer } from "../codeql-cli/cli" ;
58import type { QlPackDetails } from "./ql-pack-details" ;
69import { getQlPackFilePath } from "../common/ql" ;
7- import { isSarifResultsQueryKind } from "../common/query-metadata" ;
10+ import type { SuiteInstruction } from "../packaging/suite-instruction" ;
11+ import { SARIF_RESULTS_QUERY_KINDS } from "../common/query-metadata" ;
812
913export async function resolveCodeScanningQueryPack (
1014 logger : BaseLogger ,
@@ -25,20 +29,40 @@ export async function resolveCodeScanningQueryPack(
2529
2630 // Resolve queries
2731 void logger . log ( `Resolving queries for pack: ${ packName } ` ) ;
28- const suitePath = join (
29- packDir ,
30- "codeql-suites" ,
31- `${ language } -code-scanning.qls` ,
32- ) ;
33- const resolvedQueries = await cliServer . resolveQueries ( suitePath ) ;
3432
35- const problemQueries = await filterToOnlyProblemQueries (
36- logger ,
37- cliServer ,
38- resolvedQueries ,
39- ) ;
33+ const suiteYaml : SuiteInstruction [ ] = [
34+ {
35+ import : `codeql-suites/${ language } -code-scanning.qls` ,
36+ from : `${ downloadedPack . name } @${ downloadedPack . version } ` ,
37+ } ,
38+ {
39+ // This is necessary to ensure that the next import filter
40+ // is applied correctly
41+ exclude : { } ,
42+ } ,
43+ {
44+ // Only include problem queries
45+ include : {
46+ kind : SARIF_RESULTS_QUERY_KINDS ,
47+ } ,
48+ } ,
49+ ] ;
50+
51+ let resolvedQueries : string [ ] ;
52+ const suiteFile = await file ( {
53+ postfix : ".qls" ,
54+ } ) ;
55+ const suitePath = suiteFile . path ;
56+
57+ try {
58+ await outputFile ( suitePath , dump ( suiteYaml ) , "utf8" ) ;
59+
60+ resolvedQueries = await cliServer . resolveQueries ( suitePath ) ;
61+ } finally {
62+ await suiteFile . cleanup ( ) ;
63+ }
4064
41- if ( problemQueries . length === 0 ) {
65+ if ( resolvedQueries . length === 0 ) {
4266 throw Error (
4367 `No problem queries found in published query pack: ${ packName } .` ,
4468 ) ;
@@ -48,28 +72,11 @@ export async function resolveCodeScanningQueryPack(
4872 const qlPackFilePath = await getQlPackFilePath ( packDir ) ;
4973
5074 const qlPackDetails : QlPackDetails = {
51- queryFiles : problemQueries ,
75+ queryFiles : resolvedQueries ,
5276 qlPackRootPath : packDir ,
5377 qlPackFilePath,
5478 language,
5579 } ;
5680
5781 return qlPackDetails ;
5882}
59-
60- async function filterToOnlyProblemQueries (
61- logger : BaseLogger ,
62- cliServer : CodeQLCliServer ,
63- queries : string [ ] ,
64- ) : Promise < string [ ] > {
65- const problemQueries : string [ ] = [ ] ;
66- for ( const query of queries ) {
67- const queryMetadata = await cliServer . resolveMetadata ( query ) ;
68- if ( isSarifResultsQueryKind ( queryMetadata . kind ) ) {
69- problemQueries . push ( query ) ;
70- } else {
71- void logger . log ( `Skipping non-problem query ${ query } ` ) ;
72- }
73- }
74- return problemQueries ;
75- }
0 commit comments