1 | import { commonTokens, tokens } from '@stryker-mutator/api/plugin';
|
2 | import type { JSONSchema7 } from 'json-schema';
|
3 | import { Logger } from '@stryker-mutator/api/logging';
|
4 |
|
5 | import { coreTokens } from '../di/index.js';
|
6 |
|
7 | export class MetaSchemaBuilder {
|
8 | public static inject = tokens(coreTokens.validationSchema, commonTokens.logger);
|
9 | constructor(private readonly schema: JSONSchema7, private readonly log: Logger) {}
|
10 |
|
11 | public buildMetaSchema(pluginSchemaContributions: Array<Record<string, unknown>>): JSONSchema7 {
|
12 | this.log.debug('Contributing %s schemas from plugins to options validation.', pluginSchemaContributions.length);
|
13 | return mergedSchema(this.schema, pluginSchemaContributions);
|
14 | }
|
15 | }
|
16 | function mergedSchema(mainSchema: JSONSchema7, additionalSchemas: JSONSchema7[]): JSONSchema7 {
|
17 | const schema = {
|
18 | ...mainSchema,
|
19 | properties: {
|
20 | ...mainSchema.properties,
|
21 | },
|
22 | definitions: {
|
23 | ...mainSchema.definitions,
|
24 | },
|
25 | };
|
26 |
|
27 | Object.assign(schema.properties, ...additionalSchemas.map((s) => s.properties));
|
28 | Object.assign(schema.definitions, ...additionalSchemas.map((s) => s.definitions));
|
29 | return schema;
|
30 | }
|