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 interface FlattenedDSL { [widgetId: string]: FlattenedDSLWidget; } export interface 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); }