import { InputSignal, ModelSignal, OutputEmitterRef, Type } from '@angular/core';
/**
 * Generic type that extracts properties from an Angular component that match specified signal types.
 */
type ExtractGenericsToMapping<T, S> = {
    [K in keyof T as T[K] extends S ? K : never]: T[K] extends InputSignal<infer U> ? U : T[K] extends ModelSignal<infer U> ? U : T[K] extends S ? T[K] extends {
        get(): infer R;
    } ? R : never : never;
};
type ExcludeUnknown<T> = {
    [K in keyof T as unknown extends T[K] ? (T[K] extends unknown ? never : K) : K]: T[K];
};
/**
 * Extract output and model as CustomEvent from an Angular component type.
 */
type ExtractOutputs<T> = ExcludeUnknown<ExtractGenericsToMapping<T, OutputEmitterRef<unknown> | ModelSignal<unknown>>>;
type WithCustomEventListeners<T> = keyof ExtractOutputs<T> extends never ? object : {
    /**
     * Adds an event listener for a custom event.
     *
     * These are from angular outputs and models.
     *
     * Proxied to `addEventListener` but using custom method name for better
     * type inference and differentiation from native events.
     * @param {K} type - The name of the custom event.
     * @param {(this: C, ev: CustomEvent<T[K]>) => void} listener - The event listener function.
     */
    addNxEventListener<K extends keyof ExtractOutputs<T>>(type: K, listener: (this: T, ev: CustomEvent<ExtractOutputs<T>[K]>) => void): void;
    /**
     * Removes an event listener for a custom event.
     *
     * These are from angular outputs and models.
     *
     * Proxied to `removeEventListener` but using custom method name for better
     * type inference and differentiation from native events.
     *
     * @param {K} type - The name of the custom event.
     * @param {(this: T, ev: CustomEvent<ExtractOutputs<T>[K]>) => void} listener - The event listener function.
     */
    removeNxEventListener<K extends keyof ExtractOutputs<T>>(type: K, listener: (this: T, ev: CustomEvent<ExtractOutputs<T>[K]>) => void): void;
    /**
     *
     * @param {CustomEvent<T[K]>} event - The custom event to dispatch.
     */
    dispatchNxEvent<K extends keyof ExtractOutputs<T>>(event: CustomEvent<ExtractOutputs<T>[K]>): void;
};
/**
 * Extracts the input and model properties from an Angular component type.
 */
type ExtractInputs<T> = ExcludeUnknown<ExtractGenericsToMapping<T, InputSignal<unknown> | ModelSignal<unknown>>>;
type WebComponentType<T> = HTMLElement & (keyof ExtractInputs<T> extends never ? object : ExtractInputs<T>) & WithCustomEventListeners<T>;
/**
 * Registers Angular components as custom elements.
 *
 * This function takes one or more Angular component classes and registers them as custom elements.
 * It ensures that the components are standalone and have valid metadata before registration.
 * The custom element selectors are generated by replacing 'nx-' with 'nxe-' and ensuring they start with 'nxe-'.
 *
 * @param {Type<unknown>[]} ComponentClasses - An array of Angular component classes to be registered as custom elements.
 *
 * @example
 * // Import your Angular component
 * import { MyComponent } from './my-component';
 *
 * // Register the component as a custom element
 * registerAsCustomElement(MyComponent);
 *
 * @example
 * // Register multiple components as custom elements
 * import { MyComponent1 } from './my-component1';
 * import { MyComponent2 } from './my-component2';
 *
 * registerAsCustomElement(MyComponent1, MyComponent2);
 */
export declare function registerAsCustomElement(...ComponentClasses: (Type<unknown> | {
    tag: string;
    component: Type<unknown>;
})[]): Promise<void>;
export declare function registerCustomElementsFromMapping<T extends Record<string, Type<unknown>>>(mapping: T): Promise<{
    [K in keyof T]: WebComponentType<InstanceType<T[K]>>;
}>;
export {};
