@@ -2,6 +2,7 @@ import { join } from "path";
22import { outputFile , pathExists , readFile } from "fs-extra" ;
33import { dump as dumpYaml , load as loadYaml } from "js-yaml" ;
44import { Uri } from "vscode" ;
5+ import Ajv from "ajv" ;
56import { CodeQLCliServer } from "../codeql-cli/cli" ;
67import { getOnDiskWorkspaceFolders } from "../common/vscode/workspace-folders" ;
78import { ProgressCallback } from "../common/vscode/progress" ;
@@ -18,6 +19,12 @@ import {
1819} from "./extension-pack-name" ;
1920import { autoPickExtensionsDirectory } from "./extensions-workspace-folder" ;
2021
22+ import { ExtensionPackMetadata } from "./extension-pack-metadata" ;
23+ import * as extensionPackMetadataSchemaJson from "./extension-pack-metadata.schema.json" ;
24+
25+ const ajv = new Ajv ( { allErrors : true } ) ;
26+ const extensionPackValidate = ajv . compile ( extensionPackMetadataSchemaJson ) ;
27+
2128export async function pickExtensionPack (
2229 cliServer : Pick < CodeQLCliServer , "resolveQlpacks" > ,
2330 databaseItem : Pick < DatabaseItem , "name" | "language" > ,
@@ -170,6 +177,22 @@ async function writeExtensionPack(
170177 return extensionPack ;
171178}
172179
180+ function validateExtensionPack (
181+ extensionPack : unknown ,
182+ ) : extensionPack is ExtensionPackMetadata {
183+ extensionPackValidate ( extensionPack ) ;
184+
185+ if ( extensionPackValidate . errors ) {
186+ throw new Error (
187+ `Invalid extension pack YAML: ${ extensionPackValidate . errors
188+ . map ( ( error ) => `${ error . instancePath } ${ error . message } ` )
189+ . join ( ", " ) } `,
190+ ) ;
191+ }
192+
193+ return true ;
194+ }
195+
173196async function readExtensionPack (
174197 path : string ,
175198 language : string ,
@@ -188,6 +211,10 @@ async function readExtensionPack(
188211 throw new Error ( `Could not parse ${ qlpackPath } ` ) ;
189212 }
190213
214+ if ( ! validateExtensionPack ( qlpack ) ) {
215+ throw new Error ( `Could not validate ${ qlpackPath } ` ) ;
216+ }
217+
191218 const dataExtensionValue = qlpack . dataExtensions ;
192219 if (
193220 ! (
0 commit comments