UNPKG

@kellanjs/actioncraft

Version:

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

70 lines 3.08 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) { if (!schemas.inputSchema) { return ok(undefined); } 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); } if (!result.issues && "value" in result) { return ok(result.value); } // Should never happen const logicErr = createInternalLogicError("Unexpected validation state in input validation: neither success nor failure"); return err(logicErr); } /** * Validate bound arguments using configured bind schemas. */ export async function validateBindArgs(schemas, config, bindArgs) { if (!schemas.bindSchemas) { return ok([]); } 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); } if ("value" in result) { validated.push(result.value); } } return ok(validated); } /** * Validate action output using configured output schema. */ export async function validateOutput(schemas, config, data) { if (!schemas.outputSchema) { return ok(data); } 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); } if (!result.issues && "value" in result) { return ok(result.value); } const logicErr = createInternalLogicError("Unexpected validation state in output validation: neither success nor failure"); return err(logicErr); } //# sourceMappingURL=validation.js.map