import { UiObjectConfig } from 'uiconfig.js';
import { AViewerPlugin, AViewerPluginSync, ThreeViewer } from '../../viewer';
import { Class } from 'ts-browser-helpers';
/**
 * A plugin that allows dynamic loading and unloading of other plugins at runtime, with support for hot module replacement (HMR) during development.
 * This plugin provides a simple UI to load and unload plugins by specifying their module paths.
 * It supports both direct path strings and module objects (imported or promises).
 * The loaded plugins are tracked and can be managed through the provided UI.
 *
 * For HMR with vite, see {@link sampleThreepipeViteHmrPlugin}
 * Note: This plugin is primarily intended for development and testing purposes.
 */
export declare class DynamicImportPlugin extends AViewerPluginSync {
    static readonly PluginType = "DynamicImportPlugin";
    enabled: boolean;
    constructor();
    onAdded(viewer: ThreeViewer): void;
    plugins: Map<string, Class<AViewerPlugin<import('../../viewer').AViewerPluginEventMap, ThreeViewer, boolean>>>;
    /**
     * Loads and adds a plugin to the viewer.
     * The plugin can be specified as a path string or as a module object (imported or promise).
     * If a path string is provided, it should point to a module that exports a default class extending AViewerPlugin.
     * If a module object is provided, it should either have a default export or a named export that is a class extending AViewerPlugin.
     * The module can also have a __tpPluginPath property to identify its path.
     *
     * Usage examples:
     * ```ts
     * // Load plugin from a path
     * await DynamicImportPlugin.loadPlugin('./path/to/MyPlugin.js');
     *
     * // Load plugin from an imported module
     * import MyPluginModule from './path/to/MyPlugin.js';
     * await DynamicImportPlugin.loadPlugin(MyPluginModule);
     *
     * // Load plugin with dynamic import
     * await DynamicImportPlugin.loadPlugin(import('./path/to/MyPlugin.js'));
     * ```
     *
     * @returns The instance of the loaded plugin.
     * @param pathOrModule
     */
    loadPlugin(pathOrModule: string | PluginModule | Promise<PluginModule>): Promise<any>;
    /**
     * Unloads and removes a plugin from the viewer by its path.
     * The path should match the one used when loading the plugin.
     *
     * @returns A promise that resolves when the plugin is removed.
     * @param path
     */
    unloadPlugin(path: string): Promise<void>;
    private _path;
    uiConfig: UiObjectConfig;
}
export interface PluginModule {
    __tpPluginPath: string;
    default?: Class<AViewerPlugin>;
    [key: string]: Class<AViewerPlugin> | any;
}
export declare const sampleThreepipeViteHmrPlugin: {
    handleHotUpdate({ server, modules, timestamp }: any): any[];
    transform(code: string, id: string): string | undefined;
};
//# sourceMappingURL=../../src/plugins/extras/DynamicImportPlugin.d.ts.map