UNPKG

@kellanjs/actioncraft

Version:

Fluent, type-safe builder for Next.js server actions.

70 lines 3.22 kB
import { standardParse } from "../standard-schema.js"; import { INTERNAL_ERROR_TYPES, EXTERNAL_ERROR_TYPES } from "../types/errors.js"; import { ok, err } from "../types/result.js"; import { createValidationError, createInternalLogicError, formatValidationIssues, } from "./errors.js"; /** * Validate input using the configured input schema. */ export async function validateInput(schemas, config, rawInput, actionId) { if (!schemas.inputSchema) { return ok(undefined, actionId); } const result = await standardParse(schemas.inputSchema, rawInput); if (Array.isArray(result.issues) && result.issues.length > 0) { const format = config.validationErrorFormat ?? "flattened"; const baseError = formatValidationIssues(result.issues, format); const inputValidationError = createValidationError(EXTERNAL_ERROR_TYPES.INPUT_VALIDATION, "Input validation failed", baseError); return err(inputValidationError, actionId); } if (!result.issues && "value" in result) { return ok(result.value, actionId); } // Should never happen const logicErr = createInternalLogicError("Unexpected validation state in input validation: neither success nor failure"); return err(logicErr, actionId); } /** * Validate bound arguments using configured bind schemas. */ export async function validateBindArgs(schemas, config, bindArgs, actionId) { if (!schemas.bindSchemas) { return ok([], actionId); } const validated = []; for (let i = 0; i < schemas.bindSchemas.length; i++) { const schema = schemas.bindSchemas[i]; const arg = bindArgs[i]; const result = await standardParse(schema, arg); if (Array.isArray(result.issues) && result.issues.length > 0) { const format = config.validationErrorFormat ?? "flattened"; const baseError = formatValidationIssues(result.issues, format); const bindError = createValidationError(EXTERNAL_ERROR_TYPES.BIND_ARGS_VALIDATION, "Bind arguments validation failed", baseError); return err(bindError, actionId); } if ("value" in result) { validated.push(result.value); } } return ok(validated, actionId); } /** * Validate action output using configured output schema. */ export async function validateOutput(schemas, config, data, actionId) { if (!schemas.outputSchema) { return ok(data, actionId); } const result = await standardParse(schemas.outputSchema, data); if (Array.isArray(result.issues) && result.issues.length > 0) { const format = config.validationErrorFormat ?? "flattened"; const baseError = formatValidationIssues(result.issues, format); const outputError = createValidationError(INTERNAL_ERROR_TYPES.OUTPUT_VALIDATION, "Output validation failed", baseError); return err(outputError, actionId); } if (!result.issues && "value" in result) { return ok(result.value, actionId); } const logicErr = createInternalLogicError("Unexpected validation state in output validation: neither success nor failure"); return err(logicErr, actionId); } //# sourceMappingURL=validation.js.map