@tsed/schema-formio
Version:
Transform Ts.ED Schema & JsonSchema to a valid Formio schema
51 lines (50 loc) • 1.84 kB
JavaScript
import "../components/anyToComponent.js";
import "../components/arrayToComponent.js";
import "../components/booleanToComponent.js";
import "../components/dateToComponent.js";
import "../components/defaultToComponent.js";
import "../components/enumToComponent.js";
import "../components/mapToComponent.js";
import "../components/nestedToComponent.js";
import "../components/numberToComponent.js";
import "../components/objectToEditGrid.js";
import "../components/panelToComponent.js";
import "../components/propertiesToComponents.js";
import "../components/stringToComponent.js";
import { isString } from "@tsed/core";
import { getJsonSchema, JsonEntityStore } from "@tsed/schema";
import { kebabCase } from "change-case";
import { execMapper } from "../registries/FormioMappersContainer.js";
import { FormsContainer } from "../registries/FormsContainer.js";
export async function getFormioSchema(model, options = {}) {
if (!model) {
return undefined;
}
if (isString(model)) {
return getFormioSchema(FormsContainer.get(model), options);
}
const entity = JsonEntityStore.from(model);
const schema = getJsonSchema(model, {
...options,
inlineEnums: true,
customKeys: true
});
const name = entity.schema.getName();
const machineName = kebabCase(name);
const resolvers = [];
const components = execMapper("properties", schema, { ...options, definitions: schema.definitions, resolvers });
const form = {
title: name,
type: "form",
display: "form",
tags: [],
access: [],
submissionAccess: [],
...entity.store.get("formio:form", {}),
name: machineName,
machineName,
components
};
await Promise.all(resolvers.map((resolver) => resolver(form, options)));
return form;
}