Gathering detailed insights and metrics for zod-to-json-schema
Gathering detailed insights and metrics for zod-to-json-schema
Gathering detailed insights and metrics for zod-to-json-schema
Gathering detailed insights and metrics for zod-to-json-schema
npm install zod-to-json-schema
99.7
Supply Chain
99.6
Quality
86.1
Maintenance
100
Vulnerability
100
License
Module System
Min. Node Version
Typescript Support
Node Version
NPM Version
922 Stars
428 Commits
76 Forks
4 Watching
5 Branches
23 Contributors
Updated on 27 Nov 2024
Minified
Minified + Gzipped
TypeScript (100%)
Cumulative downloads
Total Downloads
Last day
17%
547,121
Compared to previous day
Last week
7.5%
2,656,060
Compared to previous week
Last month
14.8%
10,604,683
Compared to previous month
Last year
454.4%
63,953,845
Compared to previous year
1
Looking for the exact opposite? Check out json-schema-to-zod
Does what it says on the tin; converts Zod schemas into JSON schemas!
$ref
s.If you enjoy this package, consider dropping a couple of bucks on my GitHub Sponsors page <3
|
1import { z } from "zod"; 2import { zodToJsonSchema } from "zod-to-json-schema"; 3 4const mySchema = z 5 .object({ 6 myString: z.string().min(5), 7 myUnion: z.union([z.number(), z.boolean()]), 8 }) 9 .describe("My neat object schema"); 10 11const jsonSchema = zodToJsonSchema(mySchema, "mySchema");
1{ 2 "$schema": "http://json-schema.org/draft-07/schema#", 3 "$ref": "#/definitions/mySchema", 4 "definitions": { 5 "mySchema": { 6 "description": "My neat object schema", 7 "type": "object", 8 "properties": { 9 "myString": { 10 "type": "string", 11 "minLength": 5 12 }, 13 "myUnion": { 14 "type": ["number", "boolean"] 15 } 16 }, 17 "additionalProperties": false, 18 "required": ["myString", "myUnion"] 19 } 20 } 21}
You can pass a string as the second parameter of the main zodToJsonSchema function. If you do, your schema will end up inside a definitions object property on the root and referenced from there. Alternatively, you can pass the name as the name
property of the options object (see below).
Instead of the schema name (or nothing), you can pass an options object as the second parameter. The following options are available:
Option | Effect |
---|---|
name?: string | As described above. |
nameStrategy?: "ref" | "title" | Adds name as "title" meta instead of as a ref as described above |
basePath?: string[] | The base path of the root reference builder. Defaults to ["#"]. |
$refStrategy?: "root" | "relative" | "seen" | "none" | The reference builder strategy;
|
effectStrategy?: "input" | "any" | The effects output strategy. Defaults to "input". See known issues! |
dateStrategy?: "format:date" | "format:date-time" | "string" | "integer" | Date strategy, integer allow to specify in unix-time min and max values. "format:date" creates a string schema with format: "date". "format:date-time" creates a string schema with format: "date-time". "string" is intepreted as "format:date-time". "integer" creates an integer schema with format "unix-time" (unless target "openApi3" is used min max checks are also respected) |
emailStrategy?: "format:email" | "format:idn-email" | "pattern:zod" | Choose how to handle the email string check. Defaults to "format:email". |
base64Strategy?: "format:binary" | "contentEnconding:base64" | "pattern:zod" | Choose how to handle the base64 string check. Defaults to "contentEncoding:base64" as described here. Note that "format:binary" is not represented in the output type as it's not part of the JSON Schema spec and only intended to be used when targeting OpenAPI 3.0. Later versions of OpenAPI support contentEncoding. |
definitionPath?: "definitions" | "$defs" | The name of the definitions property when name is passed. Defaults to "definitions". |
target?: "jsonSchema7" | "jsonSchema2019-09" | "openApi3" | Which spec to target. Defaults to "jsonSchema7" |
strictUnions?: boolean | Scrubs unions of any-like json schemas, like {} or true . Multiple zod types may result in these out of necessity, such as z.instanceof() |
definitions?: Record<string, ZodSchema> | See separate section below |
errorMessages?: boolean | Include custom error messages created via chained function checks for supported zod types. See section below |
markdownDescription?: boolean | Copies the description meta to markdownDescription |
patternStrategy?: "escape" | "preserve" | The Zod string validations .includes() , .startsWith() , and .endsWith() must be converted to regex to be compatible with JSON Schema's pattern . For safety, all non-alphanumeric characters are escape d by default (consider z.string().includes(".") ), but this can occasionally cause problems with Unicode-flagged regex parsers. Use preserve to prevent this escaping behaviour and preserve the exact string written, even if it results in an inaccurate regex. |
applyRegexFlags?: boolean | JSON Schema's pattern doesn't support RegExp flags, but Zod's z.string().regex() does. When this option is true (default false), a best-effort is made to transform regexes into a flag-independent form (e.g. /x/i => /[xX]/ ). Supported flags: i (basic Latin only), m , s . |
pipeStrategy?: "all" | "input" | "output" | Decide which types should be included when using z.pipe , for example z.string().pipe(z.number()) would return both string and number by default, only string for "input" and only number for "output". |
removeAdditionalStrategy?: "passthrough" | "strict" | Decide when additionalProperties should be false - whether according to strict or to passthrough. Since most parsers would retain properties given that additionalProperties = false while zod strips them, the default is to strip them unless passthrough is explicitly in the schema. On the other hand, it is useful to retain all fields unless strict is explicit in the schema which is the second option for the removeAdditional |
override?: callback | See section |
The definitions option lets you manually add recurring schemas into definitions for cleaner outputs. It's fully compatible with named schemas, changed definitions path and base path. Here's a simple example:
1const myRecurringSchema = z.string(); 2const myObjectSchema = z.object({ a: myRecurringSchema, b: myRecurringSchema }); 3 4const myJsonSchema = zodToJsonSchema(myObjectSchema, { 5 definitions: { myRecurringSchema }, 6});
1{ 2 "type": "object", 3 "properties": { 4 "a": { 5 "$ref": "#/definitions/myRecurringSchema" 6 }, 7 "b": { 8 "$ref": "#/definitions/myRecurringSchema" 9 } 10 }, 11 "definitions": { 12 "myRecurringSchema": { 13 "type": "string" 14 } 15 } 16}
This feature allows optionally including error messages created via chained function calls for supported zod types:
1// string schema with additional chained function call checks 2const EmailSchema = z.string().email("Invalid email").min(5, "Too short"); 3 4const jsonSchema = zodToJsonSchema(EmailSchema, { errorMessages: true });
1{ 2 "$schema": "http://json-schema.org/draft-07/schema#", 3 "type": "string", 4 "format": "email", 5 "minLength": 5, 6 "errorMessage": { 7 "format": "Invalid email", 8 "minLength": "Too short" 9 } 10}
This allows for field specific, validation step specific error messages which can be useful for building forms and such. This format is accepted by react-hook-form
's ajv resolver (and therefor ajv-errors
which it uses under the hood). Note that if using AJV with this format will require enabling ajv-errors
as vanilla AJV does not accept this format by default.
override
optionThis options takes a Zod schema definition, the current reference object (containing the current ref path and other options), an argument containing inforation about wether or not the schema has been encountered before, and a forceResolution argument.
Since undefined
is a valid option to return, if you don't want to override the current item you have to return the ignoreOverride
symbol exported from the index.
1import zodToJsonSchema, { ignoreOverride } from "zod-to-json-schema"; 2 3zodToJsonSchema( 4 z.object({ 5 ignoreThis: z.string(), 6 overrideThis: z.string(), 7 removeThis: z.string(), 8 }), 9 { 10 override: (def, refs) => { 11 const path = refs.currentPath.join("/"); 12 13 if (path === "#/properties/overrideThis") { 14 return { 15 type: "integer", 16 }; 17 } 18 19 if (path === "#/properties/removeThis") { 20 return undefined; 21 } 22 23 // Important! Do not return `undefined` or void unless you want to remove the property from the resulting schema completely. 24 return ignoreOverride; 25 }, 26 }, 27);
Expected output:
1{ 2 "type": "object", 3 "required": ["ignoreThis", "overrideThis"], 4 "properties": { 5 "ignoreThis": { 6 "type": "string" 7 }, 8 "overrideThis": { 9 "type": "integer" 10 } 11 }, 12 "additionalProperties": false 13}
.transform
, the return type is inferred from the supplied function. In other words, there is no schema for the return type, and there is no way to convert it in runtime. Currently the JSON schema will therefore reflect the input side of the Zod schema and not necessarily the output (the latter aka. z.infer
). If this causes problems with your schema, consider using the effectStrategy "any", which will allow any type of output.z.record
with any other key type, this will be ignored. An exception to this rule is z.enum
as is supported since 3.11.3.isOptional()
to check if a property should be included in required
or not. This has the potentially dangerous behavior of calling .safeParse
with undefined
. To work around this, make sure your preprocess
and other effects callbacks are pure and not liable to throw errors. An issue has been logged in the Zod repo and can be tracked here.This package does not follow semantic versioning. The major and minor versions of this package instead reflects feature parity with the Zod package.
I will do my best to keep API-breaking changes to an absolute minimum, but new features may appear as "patches", such as introducing the options pattern in 3.9.1.
https://github.com/StefanTerdell/zod-to-json-schema/blob/master/changelog.md
No vulnerabilities found.
Reason
30 commit(s) and 12 issue activity found in the last 90 days -- score normalized to 10
Reason
security policy file detected
Details
Reason
no binaries found in the repo
Reason
license file detected
Details
Reason
0 existing vulnerabilities detected
Reason
Found 5/21 approved changesets -- score normalized to 2
Reason
no effort to earn an OpenSSF best practices badge detected
Reason
project is not fuzzed
Details
Reason
branch protection not enabled on development/release branches
Details
Reason
SAST tool is not run on all commits -- score normalized to 0
Details
Score
Last Scanned on 2024-11-25
The Open Source Security Foundation is a cross-industry collaboration to improve the security of open source software (OSS). The Scorecard provides security health metrics for open source projects.
Learn Moresafegen
Generate well-formed data from Large Language Models (LLMs) without encountering `TypeError`s, leveraging the power of [Zod](https://github.com/colinhacks/zod) and `zod-to-json-schema`.
openai-zod-to-json-schema
Convert Zod schemas to JSON schemas which are optionally compatible with OpenAI's structured outputs.
json-schema-to-zod
Converts JSON schema objects or files into Zod schemas
zod
TypeScript-first schema declaration and validation library with static type inference