123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- import { FlowElement } from "react-flow-renderer";
- /**
- * @param {never[] | Object} input
- * @returns {FlowElement[]}
- */
- export const parser = (input) => {
- try {
- input = JSON.parse(input);
- if (!Array.isArray(input)) input = [input];
- const extract = (
- os,
- 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) =>
- xs.flatMap(({ id: target, children = [] }) => [
- ...children.map(({ id: source }) => ({
- id: `e${source}-${target}`,
- source,
- target,
- })),
- ...relationships(children),
- ]);
- const flatten = (xs) =>
- 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!", error.stack);
- return Array;
- }
- };
|