Files
n8n-enterprise-unlocked/packages/@n8n/json-schema-to-zod/src/parsers/parse-string.ts

59 lines
1.6 KiB
TypeScript

import { z } from 'zod';
import type { JsonSchemaObject } from '../types';
import { extendSchemaWithMessage } from '../utils/extend-schema';
export const parseString = (jsonSchema: JsonSchemaObject & { type: 'string' }) => {
let zodSchema = z.string();
zodSchema = extendSchemaWithMessage(zodSchema, jsonSchema, 'format', (zs, format, errorMsg) => {
switch (format) {
case 'email':
return zs.email(errorMsg);
case 'ip':
return zs.ip(errorMsg);
case 'ipv4':
return zs.ip({ version: 'v4', message: errorMsg });
case 'ipv6':
return zs.ip({ version: 'v6', message: errorMsg });
case 'uri':
return zs.url(errorMsg);
case 'uuid':
return zs.uuid(errorMsg);
case 'date-time':
return zs.datetime({ offset: true, message: errorMsg });
case 'time':
return zs.time(errorMsg);
case 'date':
return zs.date(errorMsg);
case 'binary':
return zs.base64(errorMsg);
case 'duration':
return zs.duration(errorMsg);
default:
return zs;
}
});
zodSchema = extendSchemaWithMessage(zodSchema, jsonSchema, 'contentEncoding', (zs, _, errorMsg) =>
zs.base64(errorMsg),
);
zodSchema = extendSchemaWithMessage(zodSchema, jsonSchema, 'pattern', (zs, pattern, errorMsg) =>
zs.regex(new RegExp(pattern), errorMsg),
);
zodSchema = extendSchemaWithMessage(
zodSchema,
jsonSchema,
'minLength',
(zs, minLength, errorMsg) => zs.min(minLength, errorMsg),
);
zodSchema = extendSchemaWithMessage(
zodSchema,
jsonSchema,
'maxLength',
(zs, maxLength, errorMsg) => zs.max(maxLength, errorMsg),
);
return zodSchema;
};