UNPKG

nuxt-safe-runtime-config

Version:

Validate Nuxt runtime config with Standard Schema at build time

58 lines (55 loc) 1.95 kB
import { defineNuxtModule } from '@nuxt/kit'; import { consola } from 'consola'; const module = defineNuxtModule({ meta: { name: "nuxt-safe-runtime-config", configKey: "safeRuntimeConfig" }, defaults: { $schema: void 0 // No default schema, users must provide their own }, setup(options, nuxt) { if (nuxt.options.dev) { nuxt.hook("modules:done", async () => { await validateRuntimeConfig(nuxt, options); }); return; } nuxt.hook("build:done", async () => { await validateRuntimeConfig(nuxt, options); }); } }); async function validateRuntimeConfig(nuxt, options) { const schemaConfig = options.$schema; if (!schemaConfig) return; try { const runtimeConfig = nuxt.options.runtimeConfig || {}; if (!isStandardSchema(schemaConfig)) { consola.error("Safe Runtime Config: Schema is not Standard Schema compatible"); return; } const result = await schemaConfig["~standard"].validate(runtimeConfig); if ("issues" in result && result.issues && result.issues.length > 0) { consola.error("Safe Runtime Config: Validation failed!"); result.issues.forEach((issue, index) => { consola.error(` ${index + 1}. ${formatIssue(issue)}`); }); throw new Error("Runtime config validation failed"); } consola.success("Validated Runtime Config"); } catch (error) { consola.error("Safe Runtime Config: Validation error:", error); throw error; } } function isStandardSchema(schema) { return schema && typeof schema === "object" && "~standard" in schema && typeof schema["~standard"] === "object" && typeof schema["~standard"].validate === "function"; } function formatIssue(issue) { const path = issue.path ? issue.path.map((p) => p && typeof p === "object" && "key" in p ? p.key : p).join(".") : "root"; return `${path}: ${issue.message || "Validation error"}`; } export { module as default };