@kellanjs/actioncraft
Version:
Fluent, type-safe builder for Next.js server actions.
70 lines • 3.22 kB
JavaScript
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