UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

247 lines 9.14 kB
import * as z from 'zod'; import { FormError } from "./FormError.js"; export { z }; const defaultPatterns = [/^Too small:/, /^Too big:/, /^Invalid input:/, /^Invalid string:/, /^Invalid number: must be a multiple of/]; function isLikelyCustomZodMessage(issue) { var _issue$message; const msg = (_issue$message = issue === null || issue === void 0 ? void 0 : issue.message) !== null && _issue$message !== void 0 ? _issue$message : ''; if (typeof msg !== 'string' || msg.length === 0) { return false; } return !defaultPatterns.some(regex => regex.test(msg)); } function normalizeZodIssueMessage(issue) { if (typeof (issue === null || issue === void 0 ? void 0 : issue.message) === 'string' && /expected int/.test(issue.message)) { return 'NumberField.errorInteger'; } if ((issue === null || issue === void 0 ? void 0 : issue.code) === 'too_small' && issue.origin === 'number' && issue.inclusive === false) { return 'NumberField.errorExclusiveMinimum'; } if ((issue === null || issue === void 0 ? void 0 : issue.code) === 'too_big' && issue.origin === 'number' && issue.inclusive === false) { return 'NumberField.errorExclusiveMaximum'; } if ((issue === null || issue === void 0 ? void 0 : issue.code) === 'too_small' && issue.origin === 'array' && typeof issue.minimum === 'number') { return 'IterateArray.errorMinItems'; } if ((issue === null || issue === void 0 ? void 0 : issue.code) === 'too_big' && issue.origin === 'array' && typeof issue.maximum === 'number') { return 'IterateArray.errorMaxItems'; } if (typeof (issue === null || issue === void 0 ? void 0 : issue.message) === 'string') { if (issue.code === 'too_small' && typeof issue.minimum === 'number') { if (issue.origin === 'number') { return 'NumberField.errorMinimum'; } if (issue.origin === 'string') { return 'StringField.errorMinLength'; } } if (issue.code === 'too_big' && typeof issue.maximum === 'number') { if (issue.origin === 'number') { return 'NumberField.errorMaximum'; } if (issue.origin === 'string') { return 'StringField.errorMaxLength'; } } } if ((issue === null || issue === void 0 ? void 0 : issue.code) === 'not_multiple_of') { return 'NumberField.errorMultipleOf'; } if ((issue === null || issue === void 0 ? void 0 : issue.code) === 'invalid_format' && issue.format === 'regex') { return 'Field.errorPattern'; } return issue === null || issue === void 0 ? void 0 : issue.message; } export function isZodSchema(schema) { return !!schema && (typeof (schema === null || schema === void 0 ? void 0 : schema.safeParse) === 'function' || typeof (schema === null || schema === void 0 ? void 0 : schema.parse) === 'function'); } function getMessageValuesFromZodIssue(issue) { const explicitParams = issue === null || issue === void 0 ? void 0 : issue['messageValues']; if (explicitParams && typeof explicitParams === 'object') { const messages = Object.fromEntries(Object.entries(explicitParams).map(([k, v]) => [k, String(v)])); return messages; } const code = issue === null || issue === void 0 ? void 0 : issue.code; if (!code) { return; } const type = issue === null || issue === void 0 ? void 0 : issue['origin']; if (type === 'string') { if (code === 'too_small') { const min = issue.minimum; if (typeof min === 'number') { return { minLength: String(min) }; } } if (code === 'too_big') { const max = issue.maximum; if (typeof max === 'number') { return { maxLength: String(max) }; } } if (code === 'invalid_format' && issue.format === 'regex') { const pattern = issue.pattern; if (typeof pattern === 'string') { return { pattern }; } } } if (type === 'number') { if (code === 'too_small' && type === 'number') { const min = issue.minimum; if (typeof min === 'number') { return { minimum: String(min) }; } } if (code === 'too_big' && type === 'number') { const max = issue.maximum; if (typeof max === 'number') { return { maximum: String(max) }; } } if (code === 'not_multiple_of') { var _multipleOf, _issue$message2; const multipleOf = (_multipleOf = issue === null || issue === void 0 ? void 0 : issue.multipleOf) !== null && _multipleOf !== void 0 ? _multipleOf : issue === null || issue === void 0 ? void 0 : issue.multiple; if (typeof multipleOf === 'number') { return { multipleOf: String(multipleOf) }; } const fallbackMsg = String((_issue$message2 = issue === null || issue === void 0 ? void 0 : issue.message) !== null && _issue$message2 !== void 0 ? _issue$message2 : ''); const m = fallbackMsg.match(/multiple\s*of\s*([0-9]+(?:\.[0-9]+)?)/i); if (m && m[1]) { return { multipleOf: m[1] }; } } } if (type === 'array') { if (code === 'too_small') { const min = issue.minimum; if (typeof min === 'number') { return { minItems: String(min) }; } } if (code === 'too_big') { const max = issue.maximum; if (typeof max === 'number') { return { maxItems: String(max) }; } } } return undefined; } export function zodErrorToFormError(zodError) { const issues = zodError.issues || []; if (issues.length === 1) { var _ref; const issue = issues[0]; const normalizedMessage = normalizeZodIssueMessage(issue); const isCustom = isLikelyCustomZodMessage(issue); const messageValues = getMessageValuesFromZodIssue(issue); if (isCustom) { return new FormError(issue.message, { messageValues }); } return new FormError((_ref = normalizedMessage !== null && normalizedMessage !== void 0 ? normalizedMessage : issue.message) !== null && _ref !== void 0 ? _ref : 'Validation error', { messageValues }); } const errors = issues.map(issue => { var _ref2; const normalizedMessage = normalizeZodIssueMessage(issue); const isCustom = isLikelyCustomZodMessage(issue); const messageValues = getMessageValuesFromZodIssue(issue); if (isCustom) { return new FormError(issue.message, { messageValues }); } return new FormError((_ref2 = normalizedMessage !== null && normalizedMessage !== void 0 ? normalizedMessage : issue.message) !== null && _ref2 !== void 0 ? _ref2 : 'Validation error', { messageValues }); }); return new FormError('Multiple errors', { errors }); } export function zodErrorsToOneFormError(zodIssues) { if (zodIssues.length === 1) { var _ref3; const issue = zodIssues[0]; const normalizedMessage = normalizeZodIssueMessage(issue); const isCustom = isLikelyCustomZodMessage(issue); const messageValues = getMessageValuesFromZodIssue(issue); if (isCustom) { return new FormError(issue.message, { messageValues }); } return new FormError((_ref3 = normalizedMessage !== null && normalizedMessage !== void 0 ? normalizedMessage : issue.message) !== null && _ref3 !== void 0 ? _ref3 : 'Validation error', { messageValues }); } const errors = zodIssues.map(issue => { var _ref4; const normalizedMessage = normalizeZodIssueMessage(issue); const isCustom = isLikelyCustomZodMessage(issue); const messageValues = getMessageValuesFromZodIssue(issue); if (isCustom) { return new FormError(issue.message, { messageValues }); } return new FormError((_ref4 = normalizedMessage !== null && normalizedMessage !== void 0 ? normalizedMessage : issue.message) !== null && _ref4 !== void 0 ? _ref4 : 'Validation error', { messageValues }); }); return new FormError('Multiple errors', { errors }); } export const zodErrorsToFormErrors = issues => { return (issues !== null && issues !== void 0 ? issues : []).reduce((acc, issue) => { const path = issue.path.length > 0 ? `/${issue.path.join('/')}` : '/'; const normalizedMessage = normalizeZodIssueMessage(issue); const isCustom = isLikelyCustomZodMessage(issue); const messageValues = getMessageValuesFromZodIssue(issue); if (isCustom) { acc[path] = new FormError(issue.message, { messageValues }); } else { var _ref5; acc[path] = new FormError((_ref5 = normalizedMessage !== null && normalizedMessage !== void 0 ? normalizedMessage : issue.message) !== null && _ref5 !== void 0 ? _ref5 : 'Validation error', { messageValues, ajvKeyword: normalizedMessage !== null && normalizedMessage !== void 0 ? normalizedMessage : issue.message }); } return acc; }, {}); }; export function createZodValidator(schema) { return value => { const result = schema.safeParse(value); if (result.success) { return true; } return result.error; }; } //# sourceMappingURL=zod.js.map