export type EntryKind = 'concept' | 'app' | 'component' | 'output' | 'input' | 'app-output' ; export interface ConceptStEntry { kind : 'concept' ; symbolTable ? : SymbolTable < ComponentStEntry > ; conceptName ? : string ; } export interface AppStEntry { kind : 'app' ; symbolTable ? : SymbolTable < ComponentStEntry > ; } export interface ComponentStEntry { kind : 'component' ; symbolTable ? : ComponentSymbolTable ; of ? : string ; componentName ? : string ; } export interface OutputStEntry { kind : 'output' ; ngOutputField ? : string ; } export interface AppOutputStEntry { kind : 'app-output' ; ngOutputField ? : string ; expr ? : string ; } export interface InputStEntry { kind : 'input' ; ngInputField ? : string ; } export type StEntry = ConceptStEntry | AppStEntry | ComponentStEntry | OutputStEntry | InputStEntry | AppOutputStEntry ; export type ComponentSymbolTableStEntry = ConceptStEntry | ComponentStEntry | OutputStEntry | InputStEntry | AppStEntry | AppOutputStEntry ; /**
 * Each component has its own symbol table to keep track of the symbols that can
 * appear in attribute exprs.
 */ export type ComponentSymbolTable = SymbolTable < ComponentSymbolTableStEntry > ; export interface SymbolTable < T = AppStEntry | ConceptStEntry > { [ symbol ] : T ; } export function pretty ( obj ) { return JSON . stringify ( obj , null , 2 ) ; }