/** * Descriptor for a built-in component shipped locally. * - id maps to a file in ./built-in/.vue */ export type BuiltInComponentDescriptor = { type: 'BUILT_IN'; id: string; }; /** * Descriptor for a remotely loaded component. * - url is an ESM endpoint returning a module * - name is the export to use from that module */ export type RemoteComponentDescriptor = { type: 'REMOTE'; url: string; name: string; }; export type ComponentDescriptor = BuiltInComponentDescriptor | RemoteComponentDescriptor; export type HtmlTag = string; export type TypeDescriptor = HtmlTag | BuiltInComponentDescriptor | RemoteComponentDescriptor; /** * A layout node that renders a single dynamic component. */ export type JSONValue = string | number | boolean | null | { [x: string]: JSONValue; } | JSONValue[]; type JSONObject = { [x: string]: JSONValue; }; export type Props = JSONObject; export type ComponentNode = { /** component could be a html tag or a vue component loaded at runtime */ component: TypeDescriptor; /** static props, unreactive */ props?: Props; /** reactive or dynamic props, loaded from runtime environment */ propsGetterId?: string; children?: TemplateNode[]; /** conditional rendering - node renders only when this value is truthy */ if?: JSONValue; }; export type TextNode = string | number; export type TemplateNode = ComponentNode | TextNode; export {};