UNPKG

@code-pushup/models

Version:

Model definitions and validators for the Code PushUp CLI

68 lines 2.75 kB
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