in packages/cdk-graph/src/core/graph.ts [2679:2788]
function visit(sNode: SerializedGraph.SGNode, parent: Node): void {
const nodeProps: ITypedNodeProps = {
...(omit(sNode, [
"children",
"parent",
"stack",
"nodeType",
] as (keyof SerializedGraph.SGNode)[]) as Omit<
SerializedGraph.SGNode,
"children" | "parent" | "stack" | "nodeType"
>),
parent: sNode.parent ? store.getNode(sNode.parent) : undefined,
// resolve stack node, unless stack is itself
stack:
sNode.stack && sNode.stack !== sNode.uuid
? store.getStack(sNode.stack)
: undefined,
store,
};
if (nodeProps.parent?.uuid !== parent.uuid) {
throw new Error(
`SerializedNode parent ${sNode.parent} does not match visitor parent ${parent.uuid}`
);
}
let node: Node | undefined = undefined;
switch (sNode.nodeType) {
case NodeTypeEnum.APP: {
node = new AppNode({
...nodeProps,
parent,
});
break;
}
case NodeTypeEnum.STAGE: {
node = new StageNode(nodeProps);
break;
}
case NodeTypeEnum.STACK: {
node = new StackNode(nodeProps);
break;
}
case NodeTypeEnum.NESTED_STACK: {
node = new NestedStackNode({
...nodeProps,
parentStack: StackNode.of(parent),
});
break;
}
case NodeTypeEnum.OUTPUT: {
node = new OutputNode({
...nodeProps,
value: nodeProps.attributes![OutputNode.ATTR_VALUE],
exportName: nodeProps.attributes![
OutputNode.ATTR_EXPORT_NAME
] as string,
description: nodeProps.attributes!.description as string,
});
break;
}
case NodeTypeEnum.PARAMETER: {
node = new ParameterNode({
...nodeProps,
value: nodeProps.attributes![ParameterNode.ATTR_VALUE],
parameterType: nodeProps.attributes![
ParameterNode.ATTR_TYPE
] as string,
description: nodeProps.attributes!.description as string,
});
break;
}
case NodeTypeEnum.CFN_RESOURCE: {
node = new CfnResourceNode(nodeProps);
break;
}
case NodeTypeEnum.RESOURCE: {
node = new ResourceNode({
...nodeProps,
cdkOwned: !!nodeProps.flags?.includes(FlagEnum.CDK_OWNED),
});
break;
}
case NodeTypeEnum.DEFAULT: {
node = new Node({
...nodeProps,
nodeType: NodeTypeEnum.DEFAULT,
});
break;
}
}
if (node == null) {
console.debug(sNode.nodeType, sNode);
throw new Error(
`NodeType ${sNode.nodeType} missing deserialization mapping`
);
}
// ensure node is registered in store
assert(
store.getNode(sNode.uuid) === node,
`Node ${sNode.uuid} did not register in store`
);
Object.values(sNode.children || {}).forEach((sChild) => {
visit(sChild, node!);
});
}