Server
Create dimahForm(), mount HTTP adapters, and call form.api without a round trip.
@dimah-form/server is the Node / Edge engine: routing, snapshots, guards, and validation. Mount it on your framework, or call form.api in a server component with no extra HTTP hop.
Initializing dimahForm()
Create a centralized dimahForm() instance in your project:
import { dimahForm, memoryAdapter } from "@dimah-form/server";
import { forms } from "@/lib/forms";
export const form = dimahForm({
database: memoryAdapter(), // or db(formDb) from @dimah-form/db
forms,
basePath: "/api/form", // Default base path
});
export type Form = typeof form;database is required. A SQL database is not. memoryAdapter() is enough to run. For production SQL, see Database.
HTTP Framework Adapters
@dimah-form/server provides dedicated adapters for all major JavaScript backend frameworks:
Mount a catch-all route handler in the Next.js App Router:
import { toNextJsHandler } from "@dimah-form/server/next";
import { form } from "@/lib/form";
export const { GET, POST, PUT, PATCH, DELETE } = toNextJsHandler(form);Direct Server API (form.api)
In addition to serving HTTP requests, dimahForm() provides a typed, internal API (form.api) that you can call directly in Next.js Server Actions, React Server Components, or backend services without any HTTP network overhead:
import { form } from "@/lib/form";
import { notFound } from "next/navigation";
import { headers } from "next/headers";
import { Questionnaire } from "@/components/questionnaire";
interface PageProps {
params: Promise<{ slug: string }>;
}
export default async function SurveyPage({ params }: PageProps) {
const { slug } = await params;
// Direct server call — runs validation and security guards internally
const snapshot = await form.api.getForm({
query: { formId: slug },
headers: await headers(), // Forwards session cookies/headers to guard
});
if (!snapshot) {
notFound();
}
return <Questionnaire form={snapshot} />;
}Available form.api Methods
| Method | Payload | Returns | Description |
|---|---|---|---|
getForm | { query: { formId } } | FormSnapshot | Retrieves form definition by ID or slug. |
listForms | { query?: { status?, limit?, offset? } } | FormList | Returns paginated list of forms. |
saveForm | { body: FormSnapshot } | FormSnapshot | Upserts dynamic form in database. |
deleteForm | { body: { formId } } | { ok: true } | Deletes a dynamic form (must have no responses). |
startResponse | { body: { formId, respondentId?, resume? } } | ResponseRecord | Starts response session and freezes snapshot. |
getResponse | { query: { responseId } } | ResponseRecord | Fetches a response record. |
listResponses | { query?: ListResponsesQuery } | ResponseList | Lists response summaries or full records. |
saveDraft | { body: { responseId, answers, updatedAt? } } | ResponseRecord | Patches partial answers on an active draft. |
submitResponse | { body: { responseId, answers?, updatedAt? } } | ResponseRecord | Validates visible answers and finalizes response. |
abandonResponse | { body: { responseId, updatedAt? } } | ResponseRecord | Marks draft as abandoned. |
reopenResponse | { body: { responseId, updatedAt? } } | ResponseRecord | Unlocks submitted/abandoned response back to draft. |
deleteResponse | { body: { responseId } } | { ok: true } | Deletes response record. |