declare namespace Editor {

    namespace Interface {
        // ---- Package ---- start
        interface PackageInfo {
            debug: boolean;
            enable: boolean;
            // TODO 更名为 packageJSON 更合适
            info: PackageJson;
            invalid: boolean;
            name: string;
            path: string;
            version: string;
        }

        interface PackageJson {
            name: string;
            version: string;

            title?: string;
            author?: string;
            debug?: boolean;
            description?: string;
            main?: string;
            editor?: string;
            panel?: any;
            migrations?: {
                version: string;
                profile?: string;
                custom?: string;
            }[];
            contributions?: {
                [key: string]: any;
                builder?: string; // 构建插件注册脚本
            };
        }
        // ---- Package ---- end

        // ---- UI ---- start
        interface PanelInfo {
            template?: string;
            style?: string;
            listeners?: { [key: string]: () => {} };
            methods?: { [key: string]: Function };
            $?: { [key: string]: string };
            ready?(): void;
            update?(...args: any[]): void;
            beforeClose?(): void;
            close?(): void;
        }

        namespace UIKit {
            interface UIPanelInfo extends PanelInfo {
                // 向上触发事件
                dispath(eventName: string, ...arg: any): void;
            }

            interface EditorElementBase extends HTMLElement {
                value: any;
                dispath: (name: string, event: any) => void;
            }

        }
        // ---- UI ---- end
    }
}
