@react-formgen/json-schema
Version:
A headless, type-safe, customizable, and super simple React form generator.
187 lines (136 loc) • 5.07 kB
Markdown
A headless, type-safe, customizable, and super simple React form and data view generator from JSON Schema.
[](https://badge.fury.io/js/@react-formgen%2Fjson-schema)

[](https://opensource.org/licenses/MIT)
`@react-formgen/json-schema` transforms a JSON Schema into dynamic forms and data views with built-in validation and error handling. It leverages [Ajv](https://ajv.js.org/) for validation and Zustand for efficient state management.
1. You don't want (or don't have time) to write a bunch of forms from scratch.
2. You want to share JSON Schema with your backend to have a consistent end-to-end validation experience (one schema to rule them all! 🧙♂️).
3. You want to generate forms dynamically (e.g., for a CMS, a form builder, a configuration tool, etc.).
### Features
- **Type-safe**: Ensures your forms adhere to the defined schema.
- **Customizable**: Allows custom templates, layouts, and rendering logic.
- **Headless**: Integrates with any UI component library.
- **Validation**: Built-in validation and error handling.
## Installation
Install with npm:
```bash
npm install @react-formgen/json-schema ajv ajv-formats json-schema
```
with Yarn
```bash
yarn add @react-formgen/json-schema ajv ajv-formats json-schema
```
with pnpm
```bash
pnpm install @react-formgen/json-schema ajv ajv-formats json-schema
```
## Usage
Here’s how you can quickly create a form using a JSON Schema:
### 1. Setup a new React project
```bash
npm create vite@latest react-formgen-example --template react-ts
```
or with Yarn
```bash
yarn create vite react-formgen-example --template react-ts
```
or with pnpm
```bash
pnpm create vite react-formgen-example --template react-ts
```
### 2. Define a JSON Schema
Create a `src/schema.json` file:
```json
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "User Registration",
"type": "object",
"required": ["firstName", "lastName"],
"properties": {
"firstName": { "type": "string", "title": "First Name" },
"lastName": { "type": "string", "title": "Last Name" },
"age": { "type": "integer", "title": "Age" }
}
}
```
```tsx
import React from "react";
import { Form } from "@react-formgen/json-schema";
import schema from "./schema.json";
const App = () => {
return (
<div>
<h1>{schema.title}</h1>
<Form
schema={schema}
onSubmit={(data) => console.log("Form submitted:", data)}
onError={(errors) => console.error("Validation errors:", errors)}
/>
</div>
);
};
export default App;
```
```bash
npm dev
```
or with Yarn
```bash
yarn dev
```
or with pnpm
```bash
pnpm dev
```
You will now see a form generated based on the JSON Schema, with built-in validation and error handling.
You can easily customize field rendering by passing your own field components:
```tsx
import React from "react";
import { Form, BaseTemplates } from "@react-formgen/json-schema";
// Example: Custom field for string inputs
const CustomStringTemplate = ({ schema, path, value, setValue }) => (
<div>
<label>{schema.title}</label>
<input value={value} onChange={(e) => setValue(e.target.value)} />
</div>
);
const App = () => {
const schema = {
$schema: "http://json-schema.org/draft-07/schema#",
title: "User Registration",
type: "object",
required: ["firstName", "lastName"],
properties: {
firstName: { type: "string", title: "First Name" },
lastName: { type: "string", title: "Last Name" },
age: { type: "integer", title: "Age" },
},
};
const handleSubmit = (data) => {
console.log("Form submitted with data:", data);
};
const handleErrors = (errors) => {
console.error("Form submission errors:", errors);
};
return (
<Form
schema={schema}
templates={{ ...BaseTemplates, StringTemplate: CustomStringTemplate }}
onSubmit={handleSubmit}
onError={handleErrors}
/>
// a read-only data view
<Form schema={schema} readonly />
);
};
```
1. The library does not support all JSON Schema Draft 7 features. Some features may not work as expected or may not work at all.
2. Error messages are direct outputs from the [Ajv](https://ajv.js.org/) library. As such, they may not be the most user-friendly or localized. You can (and should) customize your `ajv` instance to provide better error messages in your custom `FormRoot` component.
This project is licensed under the MIT License. See the LICENSE file for more information.