Início Rápido
Comece a usar o schepta em minutos
Este guia vai te mostrar como configurar o schepta, configurar o Provider, registrar componentes e criar seu primeiro formulário.
O Que Você Vai Aprender
- Como instalar e configurar o schepta
- Como configurar o
ScheptaProvider - Como registrar componentes usando
createComponentSpec - Como criar seu primeiro formulário a partir de um schema JSON
Instalação
Primeiro, instale os pacotes necessários:
# Instalar pacote core
pnpm add @schepta/core
# Instalar adapter e factory React (para projetos React)
pnpm add @schepta/adapter-react @schepta/factory-react
# Instalar React Hook Form (necessário para formulários)
pnpm add react-hook-formConfigurando o Provider
O ScheptaProvider é o ponto central de configuração da sua aplicação. Ele gerencia registros globais de componentes, middleware e contexto que todas as factories podem acessar.
Configuração Básica do Provider
import { ScheptaProvider } from '@schepta/adapter-react';
function App() {
return (
<ScheptaProvider
components={globalComponents}
middlewares={[]}
externalContext={{
user: { id: 1, name: 'João Silva' },
api: 'https://api.exemplo.com',
}}
debug={{ enabled: true }}
>
<SuaApp />
</ScheptaProvider>
);
}Props do Provider
| Prop | Tipo | Descrição |
|---|---|---|
components | Record<string, ComponentSpec> | Registro global de componentes |
middlewares | Middleware[] | Stack global de middleware |
externalContext | object | Contexto compartilhado (usuário, API, etc.) |
debug | object | Configuração de debug |
Registrando Componentes com createComponentSpec
Componentes devem ser registrados usando createComponentSpec antes de poderem ser usados em schemas. Esta função cria uma especificação de componente que diz ao schepta como renderizar seus componentes.
Tipos de Componentes
O schepta suporta vários tipos de componentes:
field- Campos de entrada (texto, select, checkbox, etc.)container- Componentes container (FormField, FormSection, etc.)content- Componentes de conteúdo (títulos, botões, etc.)FormContainer- Container raiz do formulário
Criando Component Specs
import { createComponentSpec } from '@schepta/core';
// Exemplo: Componente de input simples
const InputText = React.forwardRef<HTMLInputElement, any>((props, ref) => {
const { label, name, value, onChange, placeholder, ...rest } = props;
return (
<div>
{label && <label htmlFor={name}>{label}</label>}
<input
ref={ref}
name={name}
value={value || ''}
placeholder={placeholder}
onChange={(e) => onChange?.(e.target.value)}
{...rest}
/>
</div>
);
});
// Registrar o componente
const components = {
InputText: createComponentSpec({
id: 'InputText',
type: 'field',
factory: (props, runtime) => InputText,
}),
};Exemplo Completo de Registro de Componentes
import { createComponentSpec } from '@schepta/core';
import React from 'react';
import { useFormContext } from 'react-hook-form';
// Definir seus componentes
const InputText = React.forwardRef<HTMLInputElement, any>((props, ref) => {
const { label, name, value, onChange, placeholder, ...rest } = props;
return (
<div style={{ marginBottom: '16px' }}>
{label && <label htmlFor={name}>{label}</label>}
<input
ref={ref}
name={name}
value={value || ''}
placeholder={placeholder}
onChange={(e) => onChange?.(e.target.value)}
{...rest}
/>
</div>
);
});
const FormField = ({ children, ...props }: any) => {
return <div {...props}>{children}</div>;
};
const FormSectionContainer = ({ children, ...props }: any) => {
return <div style={{ marginBottom: '24px' }} {...props}>{children}</div>;
};
const FormSectionTitle = ({ 'x-content': content, ...props }: any) => {
return <h2 {...props}>{content}</h2>;
};
const SubmitButton = ({ 'x-content': content, ...props }: any) => {
const { handleSubmit } = useFormContext();
return (
<button
type="button"
onClick={() => handleSubmit(props.onSubmit)()}
{...props}
>
{content || 'Enviar'}
</button>
);
};
const FormContainer = ({ children, ...props }: any) => {
return <form {...props}>{children}</form>;
};
// Registrar todos os componentes usando createComponentSpec
export const globalComponents = {
'FormContainer': createComponentSpec({
id: 'FormContainer',
type: 'FormContainer',
factory: (props, runtime) => FormContainer,
}),
InputText: createComponentSpec({
id: 'InputText',
type: 'field',
factory: (props, runtime) => InputText,
}),
FormField: createComponentSpec({
id: 'FormField',
type: 'container',
factory: (props, runtime) => FormField,
}),
FormSectionContainer: createComponentSpec({
id: 'FormSectionContainer',
type: 'container',
factory: (props, runtime) => FormSectionContainer,
}),
FormSectionTitle: createComponentSpec({
id: 'FormSectionTitle',
type: 'content',
factory: (props, runtime) => FormSectionTitle,
}),
SubmitButton: createComponentSpec({
id: 'SubmitButton',
type: 'content',
factory: (props, runtime) => SubmitButton,
}),
};Seu Primeiro Formulário
Agora vamos criar um exemplo completo combinando tudo:
1. Definir Seu Schema
{
"$schema": "../../packages/factories/src/schemas/form-schema.json",
"$id": "meu-primeiro-formulario",
"type": "object",
"x-component": "FormContainer",
"properties": {
"personalInfo": {
"type": "object",
"x-component": "FormSectionContainer",
"properties": {
"title": {
"type": "object",
"x-component": "FormSectionTitle",
"x-content": "Informações Pessoais"
},
"fields": {
"type": "object",
"x-component": "FormSectionGroupContainer",
"properties": {
"nameGroup": {
"type": "object",
"x-component": "FormSectionGroup",
"properties": {
"firstName": {
"type": "object",
"x-component": "FormField",
"properties": {
"firstName": {
"type": "string",
"x-component": "InputText",
"x-ui": {
"label": "Primeiro Nome",
"placeholder": "Digite seu primeiro nome"
},
"x-rules": {
"required": true
}
}
}
}
}
}
}
}
}
},
"submit": {
"type": "object",
"x-component": "SubmitButton",
"x-content": "Enviar Formulário"
}
}
}2. Exemplo Completo em React
import React from 'react';
import { ScheptaProvider } from '@schepta/adapter-react';
import { FormFactory } from '@schepta/factory-react';
import { globalComponents } from './components';
import formSchema from './form-schema.json';
function App() {
const handleSubmit = (values: any) => {
console.log('Formulário enviado:', values);
};
return (
<ScheptaProvider
components={globalComponents}
externalContext={{
user: { id: 1, name: 'João Silva' },
api: 'https://api.exemplo.com',
}}
debug={{ enabled: true }}
>
<div style={{ padding: '24px', maxWidth: '800px', margin: '0 auto' }}>
<h1>Meu Primeiro Formulário schepta</h1>
<FormFactory
schema={formSchema}
onSubmit={handleSubmit}
/>
</div>
</ScheptaProvider>
);
}
export default App;Próximos Passos
Agora que você tem o básico, explore mais:
Conceitos Fundamentais
Aprenda os conceitos fundamentais que impulsionam o schepta:
- 01. Factories - Como schemas se tornam componentes
- 02. Schema Language - A sintaxe para definir UI
- 03. Provider - Configuração global e contexto
- 04. Schema Resolution - De JSON para React/Vue
- 05. Renderer - O motor de renderização
- 06. Middleware - Transformando props e comportamento
- 07. Debug System - Ferramentas de desenvolvimento