/// <reference types="node" />
import { inspect } from 'util';
import type { ResourceId } from "../Blueprint/Blueprint";
import type { Connection, ConnectionByType, ConnectionKindType } from "../Blueprint/Connection";
import type { ConnectionBase, ConnectionType } from "../Connections";
import { ConnectionId } from "../Connections";
import { ParameterPathBuilder } from "../Parameters";
import type { BlueprintHelper } from "./BlueprintHelper";
import type { ConnectionUtilities } from "./ConnectionsUtils";
import type { Parameterized } from "./Parameters";
import type { ResourceHelper } from "./ResourceHelper";
/**
 * A ParameterizedConnection<T> has non parameterized basic resource properties
 * and parameterized other properties
 */
export declare type ParameterizedConnection<T extends Connection = Connection> = Parameterized<Omit<T, keyof ConnectionBase>> & Pick<T, keyof ConnectionBase>;
export declare type ParameterizedConnectionByType<T extends ConnectionType = ConnectionType> = ParameterizedConnection<ConnectionByType[T]>;
export declare class ConnectionHelper<T extends ConnectionType = ConnectionType> {
    #private;
    private readonly _blueprint;
    private readonly _wrappersCache;
    private _connection;
    readonly id: ConnectionId;
    constructor(_blueprint: BlueprintHelper, _wrappersCache: WeakMap<Connection, ConnectionHelper>, _connection: ConnectionByType[T]);
    /**
     * Checks whether the connection is valid.
     */
    get isValid(): boolean;
    get type(): T;
    /**
     * The source resource of the connection.
     */
    get source(): ResourceHelper;
    set source(resource: ResourceHelper);
    /**
     * The target resource of the connection.
     */
    get target(): ResourceHelper;
    set target(resource: ResourceHelper);
    /**
     * The source resource id of the connection.
     */
    get sourceId(): ResourceId;
    /**
     * The target resource id of the connection.
     */
    get targetId(): ResourceId;
    /**
     *	The connection object in the blueprint.
     */
    get connection(): ConnectionByType[T];
    get rootPath(): ParameterPathBuilder;
    get connectionUtils(): ConnectionUtilities<T>;
    /**
     * Update connection data.
     * @param connection An object with connection properties to update.
     * @returns `this`.
     */
    edit(connection: Partial<Connection>): this;
    /**
     * Update connection with parameterized data.
     * @param connection Object that contains parameterized connection properties to update.
     * @returns `this`.
     */
    parameterizedEdit(connection: Partial<ParameterizedConnectionByType<T>>): this;
    /**
     * Check if this connection's type is one of the specified types.
     */
    is<TType extends ConnectionKindType>(...types: readonly [TType, ...TType[]]): this is ConnectionHelperByType<TType>;
    getParameterizedConnection(): ParameterizedConnectionByType<T>;
    /**
     * DO NOT USE
     */
    setParameterizedConnection(connection: ParameterizedConnectionByType<T>): ParameterizedConnectionByType<T>;
    /**
     * Asserts that the connection type is one of the provided type.
     * @param type The types to assert the current connection.
     */
    assertType<TType extends ConnectionKindType>(...type: [TType, ...TType[]]): asserts this is ConnectionHelperByType<TType>;
    /**
     * Throws an error if the connection is invalid.
     */
    validateConnection(): void;
    toJSON(): object;
    [inspect.custom](): unknown;
}
/**
 * Transforms `T1 | T2` into `ConnectionHelper<T1> | ConnectionHelper<T2>` \
 * Use instead of `ConnectionHelper<T1 | T2>`
 */
export declare type ConnectionHelperByType<TType extends ConnectionKindType> = {
    [K in TType]: ConnectionHelper<K>;
}[TType];
