🔄 Generate type-safe Zod schemas from your Contentful content types with ease!
By validating our contentful data with zod, we can catch any unhandled schema changes and protect ourselves from unexpected runtime errors.
# npm
npm install -D contentful-to-zod
# yarn
yarn add -D contentful-to-zod
# pnpm
pnpm install -D contentful-to-zod
contentful space export \
--space-id <SPACE_ID> \
--management-token <MANAGEMENT_TOKEN> \
--content-file ./contentful.json \
--content-model-only=true
npx contentful-to-zod --input ./contentful.json --output ./schemas.ts
Browse a sample output here
You can customize the generator behavior by creating a contentful-to-zod.config.js
or contentful-to-zod.config.mjs
file in your project root:
// contentful-to-zod.config.js
/** @type {import('contentful-to-zod').ContentfulToZodConfig} */
export default {
// Generate flat schemas without references
flat: true,
// Allow unknown keys in objects
passthrough: true,
// Throw error for unsupported types
abortOnUnknown: false,
// Custom naming functions
toTypeName: (entity) => `${entity}Type`,
toSchemaName: (entity) => `${entity}Schema`,
};
The configuration file supports all generator options. CLI arguments take precedence over config file options.
import contentful from "contentful";
import { pageSchema } from "./schemas";
const client = contentful.createClient({
// ...
});
const response = await client.getEntries({
content_type: "page",
});
const pages = response.items.map((item) => pageSchema.parse(item));
Option | Description | Default |
---|---|---|
-i, --input <path> |
Path to Contentful schema JSON file | Required |
-o, --output <path> |
Output path for generated TypeScript file | Required |
--passthrough |
Allow unknown keys in objects | false |
-a, --abort-on-unknown |
Throw error for unsupported types instead of using z.unknown() | false |
-f, --flat |
Generate flat schemas without references | false |
MIT
npm version major|minor|patch
git push origin main
VERSION=v$(npm version | grep contentful-to-zod | cut -d"'" -f 4)
git push origin $VERSION
gh release create $VERSION --title $VERSION --generate-notes