@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
247 lines • 9.14 kB
JavaScript
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