/// <reference types="node" />
import { inspect } from 'util';
import type { Connection } from "../Blueprint/Connection";
import type { Resource, ResourceType, ResourceTypesByType } from "../Blueprint/Resource";
import type { Maybe } from "../Common";
import { ParameterPathBuilder } from "../Parameters";
import type { Point } from "../Point";
import type { ResourceBase, ResourceByType } from "../Resources";
import type { ResourceId } from "../Resources/ResourceId";
import type { BlueprintHelper } from "./BlueprintHelper";
import { ResourceConnectionsCollection as ConnectionCollection } from "./ConnectionCollection";
import type { ConnectionHelper } from "./ConnectionHelper";
import type { Parameterized } from "./Parameters";
import type { ResourceUtilities } from "./ResourcesUtils";
/**
 * A ParameterizedResource<T> has non parameterized basic resource properties
 * and parameterized other properties
 */
export declare type ParameterizedResource<T extends Resource = Resource> = Parameterized<Omit<T, keyof ResourceBase>> & Pick<T, keyof ResourceBase>;
export declare type ParameterizedResourceByType<T extends ResourceType = ResourceType> = ParameterizedResource<ResourceByType[T]>;
export declare type ParameterizedResourceTemplate<T extends Resource = Resource> = Omit<ParameterizedResource<T>, 'id'> & Partial<Pick<ParameterizedResource<T>, 'id'>>;
export declare type ParameterizedResourceTemplateByType<T extends ResourceType = ResourceType> = ParameterizedResourceTemplate<ResourceByType[T]>;
export declare class ResourceHelper<T extends ResourceType = ResourceType> {
    #private;
    private readonly _blueprint;
    private _resource;
    constructor(_blueprint: BlueprintHelper, resCache: WeakMap<Resource, ResourceHelper>, connCache: WeakMap<Connection, ConnectionHelper>, _resource: ResourceByType[T]);
    get id(): ResourceId;
    get type(): T;
    get actualType(): ResourceType;
    get name(): string;
    get description(): Maybe<string>;
    set description(desc: Maybe<string>);
    get position(): Maybe<Point>;
    set position(position: Maybe<Point>);
    get resource(): ResourceTypesByType[T];
    get rootPath(): ParameterPathBuilder;
    get incomingConnections(): ConnectionCollection;
    get outgoingConnections(): ConnectionCollection;
    get resourceUtils(): ResourceUtilities<T>;
    edit(resource: Partial<ResourceTypesByType[T]>): this;
    parameterizedEdit(resource: Partial<ParameterizedResourceByType<T>>): this;
    is<TType extends ResourceType>(...types: readonly [TType, ...TType[]]): this is ResourceHelperByType<TType>;
    getParameterizedResource(): ParameterizedResourceByType<T>;
    setParameterizedResource(resource: ParameterizedResourceByType<T>): ParameterizedResourceByType<T>;
    assertType<TType extends ResourceType>(...types: readonly [TType, ...TType[]]): asserts this is ResourceHelperByType<TType>;
    /** Replaces the current resource with the mapped resource
     *
     * If the mapped resource has the same Id as the current one,
     * then this `ResourceHelper` is rendered unusable and returns a new `ResourceHelper`
     * for the mapped resource
     */
    mapResource<TResult extends ResourceType>(type: TResult, mapFn: (resource: ResourceTypesByType[T]) => Omit<ResourceTypesByType[TResult], 'type'>): ResourceHelper<TResult>;
    toJSON(): object;
    [inspect.custom](): unknown;
    dispose(): void;
}
/**
 * Transforms `T1 | T2` into `ResourceHelper<T1> | ResourceHelper<T2>` \
 * Use instead of `ResourceHelper<T1 | T2>`
 */
export declare type ResourceHelperByType<TType extends ResourceType> = {
    [K in TType]: ResourceHelper<K>;
}[TType];
