123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- import { FlowElement } from "react-flow-renderer";
- export const parser = (input: string | string[]): FlowElement[] => {
- try {
- if (typeof input !== "object") input = JSON.parse(input);
- if (!Array.isArray(input)) input = [input];
- const extract = (
- os: string[] | object[] | null,
- nextId = (
- (id) => () =>
- String(++id)
- )(0)
- ) => {
- if (!os) return [];
- return [os].flat().map((o) => ({
- id: nextId(),
- data: {
- label: Object.fromEntries(
- Object.entries(o).filter(
- ([k, v]) => !Array.isArray(v) && !(v instanceof Object)
- )
- ),
- },
- position: { x: 0, y: 0 },
- type: "special",
- children: Object.entries(o)
- .filter(([k, v]) => Array.isArray(v) || typeof v === "object")
- .flatMap(([k, v]) => [
- {
- id: nextId(),
- data: { label: k },
- position: { x: 0, y: 0 },
- children: extract(v, nextId),
- type: "special",
- },
- ]),
- }));
- };
- const relationships = (xs: { id: string; children: never[] }[]) => {
- return xs.flatMap(({ id: target, children = [] }) => [
- ...children.map(({ id: source }) => ({
- id: `e${source}-${target}`,
- source,
- target,
- })),
- ...relationships(children),
- ]);
- };
- const flatten = (xs: { id: string; children: never[] }[]) =>
- xs.flatMap(({ children, ...rest }) => [rest, ...flatten(children)]);
- const res = extract(input);
- return [...flatten(res), ...relationships(res)];
- } catch (error) {
- console.error("An error occured while parsin JSON data!");
- return [];
- }
- };
|