import type { i18n } from 'i18next';
declare global {
    const __webpack_share_scopes__: Record<string, Record<string, {
        loaded?: 1;
        get: () => Promise<unknown>;
        from: string;
        eager: boolean;
    }>>;
    var __webpack_init_sharing__: (scope: string) => Promise<void>;
    interface Window {
        /**
         * Easily copies a text from an element.
         * @param source The source element carrying the text.
         */
        copyText(source: HTMLElement): void;
        /**
         * Gets the OpenMRS SPA base path with a trailing slash.
         */
        getOpenmrsSpaBase(): string;
        /**
         * Starts the OpenMRS SPA application.
         * @param config The configuration to use for running.
         */
        initializeSpa(config: SpaConfig): void;
        /**
         * Indicates whether offline mode is enabled in this install or not.
         * This is used to determine whether offline functionality is present or not.
         */
        offlineEnabled: boolean;
        /**
         * Gets the API base path, e.g. /openmrs
         */
        openmrsBase: string;
        /**
         * Gets the SPA base path, e.g. /openmrs/spa
         */
        spaBase: string;
        /**
         * Set by the app shell. Indicates whether the app shell is running in production, development, or test mode.
         */
        spaEnv: SpaEnvironment;
        /**
         * The build number of the app shell. Set when the app shell is built by webpack.
         */
        spaVersion: string;
        /**
         * Gets a set of options from the import-map-overrides package.
         */
        importMapOverrides: {
            addOverride(moduleName: string, url: string): void;
            enableOverride(moduleName: string): void;
            getCurrentPageMap(): Promise<ImportMap>;
            getDefaultMap(): Promise<ImportMap>;
            getNextPageMap(): Promise<ImportMap>;
            addOverride(moduleName: string, url: string): void;
            getOverrideMap(includeDisabled?: boolean): ImportMap;
            getDisabledOverrides(): Array<string>;
            isDisabled(moduleName: string): boolean;
            removeOverride(moduleName: string): void;
            resetOverrides(): void;
        };
        /**
         * Gets the installed modules, which are tuples consisting of the module's name and exports.
         */
        installedModules: Array<[string, OpenmrsAppRoutes]>;
        /**
         * The i18next instance for the app.
         */
        i18next: i18n;
    }
}
export type SpaEnvironment = 'production' | 'development' | 'test';
export interface ImportMap {
    imports: Record<string, string>;
}
/**
 * The configuration passed to the app shell initialization function
 */
export interface SpaConfig {
    /**
     * The base path or URL for the OpenMRS API / endpoints.
     */
    apiUrl: string;
    /**
     * The base path for the SPA root path.
     */
    spaPath: string;
    /**
     * The environment to use.
     * @default production
     */
    env?: SpaEnvironment;
    /**
     * URLs of configurations to load in the system.
     */
    configUrls?: Array<string>;
    /**
     * Defines if offline should be supported by installing a service worker.
     * @default true
     */
    offline?: boolean;
}
/** @internal */
export type RouteDefinition = RegExp | string | boolean;
/** @internal */
type AppComponent = {
    appName: string;
};
/**
 * A definition of a page extracted from an app's routes.json
 */
export type PageDefinition = {
    /**
     * The name of the component exported by this frontend module.
     */
    component: string;
    /**
     * If supplied, the page will only be rendered when this feature flag is enabled.
     */
    featureFlag?: string;
    /**
     * Determines whether the component renders while the browser is connected to the internet. If false, this page will never render while online.
     */
    online?: boolean;
    /**
     * Determines whether the component renders while the browser is not connected to the internet. If false, this page will never render while offline.
     */
    offline?: boolean;
    /**
     * If supplied, the page will be rendered within the DOM element with the specified ID. Defaults to "omrs-apps-container" if not supplied.
     */
    containerDomId?: string;
} & ({
    /**
     * Either a string or a boolean.
     *
     * If a string value, this is used to indicate that this page should be rendered. For example, \"name\" will match when the current page is ${window.spaBase}/name.
     *
     * If a boolean, this either indicates that the component should always be rendered or should never be rendered.
     */
    route: string | boolean;
    /**
     * A regular expression used to match against the current route to determine whether this page should be rendered. Note that ${window.spaBase} will be removed before attempting to match, so setting this to \"^name.+\" will match any route that starts with ${window.spaBase}/name.
     */
    routeRegex?: never;
} | {
    /**
     * Either a string or a boolean.
     *
     * If a string value, this is used to indicate that this page should be rendered. For example, \"name\" will match when the current page is ${window.spaBase}/name.
     *
     * If a boolean, this either indicates that the component should always be rendered or should never be rendered.
     */
    route?: never;
    /**
     * A regular expression used to match against the current route to determine whether this page should be rendered. Note that ${window.spaBase} will be removed before attempting to match, so setting this to \"^name.+\" will match any route that starts with ${window.spaBase}/name.
     */
    routeRegex: string;
});
/**
 * @internal
 * A definition of a page after the app has been registered.
 */
export type RegisteredPageDefinition = PageDefinition & AppComponent;
/**
 * A definition of an extension as extracted from an app's routes.json
 */
export type ExtensionDefinition = {
    /**
     * The name of this extension. This is used to refer to the extension in configuration.
     */
    name: string;
    /**
     * If supplied, the slot that this extension is rendered into by default.
     */
    slot?: string;
    /**
     * If supplied, the slots that this extension is rendered into by default.
     */
    slots?: Array<string>;
    /**
     * Determines whether the component renders while the browser is connected to the internet. If false, this page will never render while online.
     */
    online?: boolean;
    /**
     * Determines whether the component renders while the browser is not connected to the internet. If false, this page will never render while offline.
     */
    offline?: boolean;
    /**
     * Determines the order in which this component renders in its default extension slot. Note that this can be overridden by configuration.
     */
    order?: number;
    /**
     * The user must have ANY of these privileges to see this extension.
     */
    privileges?: string | Array<string>;
    /**
     * The expression that determines whether the extension is displayed.
     */
    displayExpression?: string;
    /**
     * If supplied, the extension will only be rendered when this feature flag is enabled.
     */
    featureFlag?: string;
    /**
     * Meta describes any properties that are passed down to the extension when it is loaded
     */
    meta?: {
        [k: string]: unknown;
    };
    /**
     * The name of the component exported by this frontend module.
     */
    component: string;
};
/**
 * A definition of a modal as extracted from an app's routes.json
 */
export type ModalDefinition = {
    /**
     * The name of this modal. This is used to launch the modal.
     */
    name: string;
    /**
     * The name of the component exported by this frontend module.
     */
    component: string;
};
export type WorkspaceWindowState = 'maximized' | 'hidden' | 'normal';
/**
 * A definition of a workspace as extracted from an app's routes.json
 */
export type WorkspaceDefinition = {
    /**
     * The name of this workspace. This is used to launch the workspace.
     */
    name: string;
    /**
     * The title of the workspace. This will be looked up as a key in the translations of the module
     * defining the workspace.
     */
    title: string;
    /**
     * The type of the workspace. Only one of each "type" of workspace is allowed to be open at a
     * time. The default is "form". If the right sidebar is in use, then the type determines which
     * right sidebar icon corresponds to the workspace.
     */
    type: string;
    canHide?: boolean;
    canMaximize?: boolean;
    /**
     * Controls the width of the workspace. The default is "narrow" and this should only be
     * changed to "wider" if the workspace itself has internal navigation, like the form editor.
     * The width "extra-wide" is for workspaces that contain their own sidebar.
     */
    width?: 'narrow' | 'wider' | 'extra-wide';
    /**
     * Launches the workspace in the preferred size, it defaults to the 'narrow' width
     */
    preferredWindowSize?: WorkspaceWindowState;
    /**
     * Workspaces can open either independently or as part of a "workspace group". A
     * "workspace group" groups related workspaces together, so that only one is visible
     * at a time. For example,
     *
     * @example
     *
     * {
     *  name: 'order-basket',
     *  type: 'order',
     *  groups: ['ward-patient']
     * }
     *
     * This means that the 'order-basket' workspace can be opened independently, or only
     * in the 'ward-patient'.
     * If a workspace group is already open and a new workspace is launched, and the
     * groups in the newly launched workspace do not include the currently open group’s
     * name, the entire workspace group will close, and the new workspace will launch independently.
     *
     */
    groups: Array<string>;
    /**
     * The name of the component exported by this frontend module.
     */
    component: string;
};
export interface WorkspaceGroupDefinition {
    /**
     * Name of the workspace group. This is used to launch the workspace group
     */
    name: string;
    /**
     * List of workspace names which are part of the workspace group.
     */
    members?: Array<string>;
}
export interface WorkspaceGroupDefinition2 {
    name: string;
    closeable?: boolean;
    overlay?: boolean;
    /**
     * In app-wide persistence mode, a workspace group renders its
     * action menu without a close button. This is for
     * workspace groups that are meant to be opened for the entire duration of the app
     *
     * In closable persistence mode, a workspace group renders its
     * action menu with a close button. User may explicitly close the group, along
     * with any opened windows / workspaces.
     */
    persistence?: 'app-wide' | 'closable';
    /**
     * URL pattern that defines the scope where workspaces in this group should persist.
     * - If not defined: workspaces close only when navigating to a different app
     * - If defined without capture groups: workspaces close when URL doesn't match pattern
     * - If defined with capture groups: workspaces close when captured values change
     *
     * @example "^/home/appointments" - static scope for appointments dashboard
     * @example "^/patient/([^/]+)/chart" - dynamic scope by patient UUID
     */
    scopePattern?: string;
}
export interface WorkspaceWindowDefinition2 {
    name: string;
    icon?: string;
    canMaximize?: boolean;
    group: string;
    order?: number;
    width?: 'narrow' | 'wider' | 'extra-wide';
}
export interface WorkspaceDefinition2 {
    name: string;
    component: string;
    window: string;
}
/**
 * A definition of a feature flag extracted from the routes.json
 */
export interface FeatureFlagDefinition {
    /** A code-friendly name for the flag, which will be used to reference it in code */
    flagName: string;
    /** A human-friendly name which will be displayed in the Implementer Tools */
    label: string;
    /** An explanation of what the flag does, which will be displayed in the Implementer Tools */
    description: string;
}
/** This interface describes the format of the routes provided by an app */
export interface OpenmrsAppRoutes {
    /** The version of this frontend module. */
    version?: string;
    /** A list of backend modules necessary for this frontend module and the corresponding required versions. */
    backendDependencies?: Record<string, string>;
    /** A list of backend modules that may enable optional functionality in this frontend module if available and the corresponding required versions. */
    optionalBackendDependencies?: {
        /** The name of the backend dependency and either the required version or an object describing the required version */
        [key: string]: string | {
            /** The minimum version of this optional dependency that must be present. */
            version: string;
            /** The feature flag to enable if this backend dependency is present */
            feature?: FeatureFlagDefinition;
        };
    };
    /** An array of all pages supported by this frontend module. Pages are automatically mounted based on a route. */
    pages?: Array<PageDefinition>;
    /**  An array of all extensions supported by this frontend module. Extensions can be mounted in extension slots, either via declarations in this file or configuration. */
    extensions?: Array<ExtensionDefinition>;
    /** An array of all feature flags for any beta-stage features this module provides. */
    featureFlags?: Array<FeatureFlagDefinition>;
    /** An array of all modals supported by this frontend module. Modals can be launched by name. */
    modals?: Array<ModalDefinition>;
    /** An array of all workspaces supported by this frontend module. Workspaces can be launched by name. */
    workspaces?: Array<WorkspaceDefinition>;
    /** An array of all workspace groups supported by this frontend module. */
    workspaceGroups?: Array<WorkspaceGroupDefinition>;
    /** An array of all workspace groups (v2) supported by this frontend module. */
    workspaceGroups2?: Array<WorkspaceGroupDefinition2>;
    /** An array of all workspace windows (v2) supported by this frontend module. */
    workspaceWindows2?: Array<WorkspaceWindowDefinition2>;
    /** An array of all workspaces (v2) supported by this frontend module. */
    workspaces2?: Array<WorkspaceDefinition2>;
}
/**
 * This interfaces describes the format of the overall routes.json loaded by the app shell.
 * Basically, this is the same as the app routes, with each routes definition keyed by the app's name
 */
export type OpenmrsRoutes = Record<string, OpenmrsAppRoutes>;
export interface ResourceLoader<T = any> {
    (): Promise<T>;
}
export type NameUse = 'usual' | 'official' | 'temp' | 'nickname' | 'anonymous' | 'old' | 'maiden';
export {};
//# sourceMappingURL=types.d.ts.map