UNPKG

@vizzly-testing/static-site

Version:

Static site generator plugin for Vizzly - seamlessly integrate static sites (Gatsby, Astro, Jekyll, Next.js) into your visual development workflow

135 lines (125 loc) 3.61 kB
/** * Configuration schema validation for Static Site plugin * Uses Zod for runtime validation */ import { z } from 'zod'; /** * Viewport schema */ let viewportSchema = z.object({ name: z.string(), width: z.number().int().positive(), height: z.number().int().positive() }); /** * Browser configuration schema */ let browserSchema = z.object({ headless: z.boolean().default(true), args: z.array(z.string()).default([]) }); /** * Screenshot configuration schema */ let screenshotSchema = z.object({ fullPage: z.boolean().default(false), omitBackground: z.boolean().default(false) }); /** * Page discovery configuration schema */ let pageDiscoverySchema = z.object({ useSitemap: z.boolean().default(true), sitemapPath: z.string().default('sitemap.xml'), scanHtml: z.boolean().default(true) }); /** * Interactions schema (optional in main config) * Note: Full interaction functions should be defined in vizzly.static-site.js * Main config can reference interaction names only */ let interactionsSchema = z.record(z.string(), z.any()).optional(); /** * Page-specific configuration schema * Allows overriding global settings for specific pages */ let pageConfigSchema = z.object({ viewports: z.union([z.array(viewportSchema), z.array(z.string()) // Viewport names to filter from global viewports ]).optional(), screenshot: screenshotSchema.partial().optional(), interaction: z.string().optional() // Named interaction to run }).passthrough(); // Allow additional page-specific settings /** * Complete Static Site plugin configuration schema */ export let staticSiteConfigSchema = z.object({ buildPath: z.string().optional(), viewports: z.array(viewportSchema).default([{ name: 'default', width: 1920, height: 1080 }]), browser: browserSchema.default({ headless: true, args: [] }), screenshot: screenshotSchema.default({ fullPage: false, omitBackground: false }), concurrency: z.number().int().positive().default(3), include: z.string().nullable().optional(), exclude: z.string().nullable().optional(), pageDiscovery: pageDiscoverySchema.default({ useSitemap: true, sitemapPath: 'sitemap.xml', scanHtml: true }), interactions: interactionsSchema, pages: z.record(z.string(), pageConfigSchema).optional() // Page-specific overrides }).default({ viewports: [{ name: 'default', width: 1920, height: 1080 }], browser: { headless: true, args: [] }, screenshot: { fullPage: false, omitBackground: false }, concurrency: 3, pageDiscovery: { useSitemap: true, sitemapPath: 'sitemap.xml', scanHtml: true } }); /** * Validate static site configuration * @param {unknown} config - Configuration to validate * @returns {Object} Validated configuration * @throws {ZodError} If validation fails */ export function validateStaticSiteConfig(config) { try { return staticSiteConfigSchema.parse(config); } catch (error) { // Re-throw with more context throw new Error(`Invalid staticSite configuration: ${error.message}\n\n` + `Please check your vizzly.config.js file.\n` + `See https://vizzly.dev/docs/plugins/static-site for configuration options.`); } } /** * Safely validate with defaults if config is missing * @param {unknown} config - Configuration to validate (can be undefined) * @returns {Object} Validated configuration with defaults */ export function validateStaticSiteConfigWithDefaults(config) { if (!config) { return staticSiteConfigSchema.parse({}); } return validateStaticSiteConfig(config); }