nuxt-safe-runtime-config
Version:
Validate Nuxt runtime config with Standard Schema at build time
40 lines (39 loc) • 1.68 kB
JavaScript
import { useRuntimeConfig } from "#safe-runtime-config/nitro-runtime-config";
import { draft, onError, runtimeSchema, schema } from "#safe-runtime-config/validate";
import { Validator } from "@cfworker/json-schema";
import { consola } from "consola";
import { applyValidatedRuntimeConfig, setRuntimeValidationState } from "../config-state.js";
import { isPromiseLike, validateRuntimeConfig } from "../validate.js";
const logger = consola.withTag("safe-runtime-config");
export default () => {
const config = useRuntimeConfig();
if (runtimeSchema) {
const result2 = validateRuntimeConfig(config, runtimeSchema, onError, logger);
if (isPromiseLike(result2)) {
const ready = result2.then((validation) => {
if (validation.success)
applyValidatedRuntimeConfig(config, validation.value);
else
setRuntimeValidationState(config, { status: "invalid" });
}).catch((error) => setRuntimeValidationState(config, { status: "failed", error }));
setRuntimeValidationState(config, { status: "pending", ready });
} else if (result2.success) {
applyValidatedRuntimeConfig(config, result2.value);
} else {
setRuntimeValidationState(config, { status: "invalid" });
}
return;
}
const validator = new Validator(schema, draft);
const result = validator.validate(config);
if (!result.valid) {
const errors = result.errors.map((e) => `${e.instanceLocation}: ${e.error}`).join(", ");
const msg = `Runtime validation failed: ${errors}`;
if (onError === "throw") {
logger.error(msg);
throw new Error(msg);
} else if (onError === "warn") {
logger.warn(msg);
}
}
};