@code-pushup/models
Version:
Model definitions and validators for the Code PushUp CLI
68 lines • 2.75 kB
JavaScript
import { z } from 'zod';
import { pluginAuditsSchema } from './audit.js';
import { groupsSchema } from './group.js';
import { createCheck } from './implementation/checks.js';
import { materialIconSchema, metaSchema, packageVersionSchema, scoreTargetSchema, slugSchema, weightSchema, } from './implementation/schemas.js';
import { formatSlugsList, hasMissingStrings } from './implementation/utils.js';
import { runnerConfigSchema, runnerFunctionSchema } from './runner-config.js';
export const pluginContextSchema = z
.record(z.string(), z.unknown())
.optional()
.meta({
title: 'PluginContext',
description: 'Plugin-specific context data for helpers',
});
export const pluginMetaSchema = packageVersionSchema()
.extend(metaSchema({
titleDescription: 'Descriptive name',
descriptionDescription: 'Description (markdown)',
docsUrlDescription: 'Plugin documentation site',
description: 'Plugin metadata',
}).shape)
.extend({
slug: slugSchema.meta({
description: 'Unique plugin slug within core config',
}),
icon: materialIconSchema,
})
.meta({ title: 'PluginMeta' });
export const pluginScoreTargetsSchema = z
.union([
scoreTargetSchema,
z.record(z.string(), scoreTargetSchema.nonoptional()),
])
.optional()
.meta({
title: 'PluginScoreTargets',
description: 'Score targets that trigger a perfect score. Number for all audits or record { slug: target } for specific audits',
});
export const pluginDataSchema = z
.object({
runner: z.union([runnerConfigSchema, runnerFunctionSchema]),
audits: pluginAuditsSchema,
groups: groupsSchema,
scoreTargets: pluginScoreTargetsSchema,
context: pluginContextSchema,
})
.meta({ title: 'PluginData' });
export const pluginConfigSchema = pluginMetaSchema
.extend(pluginDataSchema.shape)
.check(createCheck(findMissingSlugsInGroupRefs))
.meta({ title: 'PluginConfig' });
export const pluginUrlsSchema = z
.union([z.url(), z.array(z.url()), z.record(z.url(), weightSchema)])
.meta({
title: 'PluginUrls',
description: 'URL(s) to analyze. Single URL, array of URLs, or record of URLs with custom weights',
});
// every listed group ref points to an audit within the plugin
export function findMissingSlugsInGroupRefs({ audits, groups = [] }) {
const missingSlugs = getAuditSlugsFromGroups(audits, groups);
return (missingSlugs && {
message: `Group references audits which don't exist in this plugin: ${formatSlugsList(missingSlugs)}`,
});
}
function getAuditSlugsFromGroups(audits, groups) {
return hasMissingStrings(groups.flatMap(({ refs }) => refs.map(({ slug }) => slug)), audits.map(({ slug }) => slug));
}
//# sourceMappingURL=plugin-config.js.map