import { ROOT_CONTAINER_WIDGET_ID } from "./constants"; import type { NormalizedSchema } from "normalizr"; import { schema, normalize, denormalize } from "normalizr"; export type NestedDSLWidget = W & { children?: NestedDSLWidget[] }; export type NestedDSL = NestedDSLWidget; export type FlattenedDSLWidget = W & { children?: string[] }; export type FlattenedDSL = { [widgetId: string]: FlattenedDSLWidget }; export type FlattenedDSLEntities = { canvasWidgets: FlattenedDSL }; // Schema by widgetId const SCHEMA_BY_ID = new schema.Entity( "canvasWidgets", {}, { idAttribute: "widgetId" }, ); SCHEMA_BY_ID.define({ children: [SCHEMA_BY_ID] }); // Normalising using widgetId export function flattenDSL(nestedDSL: NestedDSL): FlattenedDSL { const { entities, }: NormalizedSchema, string> = normalize( nestedDSL, SCHEMA_BY_ID, ); return entities.canvasWidgets; } // Denormalising using widgetId export function nestDSL( flattenedDSL: FlattenedDSL, widgetId: string = ROOT_CONTAINER_WIDGET_ID, ): NestedDSL { const entities = { canvasWidgets: flattenedDSL }; return denormalize(widgetId, SCHEMA_BY_ID, entities); }