nuxt-safe-runtime-config
Version:
Validate Nuxt runtime config with Standard Schema at build time
58 lines (55 loc) • 1.95 kB
JavaScript
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 };