/// <reference types="node" />
import { URL } from 'url';
import { JsonNavigation, JsonKey, JsonItem } from './JsonNavigation';
import type { RefObject } from './RefVisitor';
export declare type ApiObject = object | [] | string | boolean | null | number;
interface ApiResource {
    url: URL;
    api: ApiObject;
    fragment?: string;
    itemPath: JsonKey[];
}
export interface ApiRefOptions {
    verbose?: boolean;
    noMarkers?: boolean;
    conflictStrategy?: 'error' | 'rename' | 'ignore';
    outputFormat?: 'yaml' | 'json';
}
export interface ApiRefResolution {
    api: ApiObject;
    options: ApiRefOptions;
}
export declare class ApiRefResolver {
    static readonly COMPONENT_REGEXP: RegExp;
    private url;
    private options;
    private apiDocument;
    private urlToApiObjectMap;
    private alreadyRewritten;
    private resolvedRefToRefMap;
    private dateTime;
    private changed;
    static readonly TEMPORARY_MARKER = "x__resolved__";
    static readonly RESOLVED_FROM_MARKER = "x-resolved-from";
    static readonly RESOLVED_AT_MARKER = "x-resolved-at";
    constructor(uri: string | URL, apiDocument?: ApiObject);
    resolve(options?: ApiRefOptions): Promise<ApiRefResolution>;
    cleanup(resolved: ApiObject): Promise<object>;
    static deepClone: (obj: any) => any;
    private replacementRefFor;
    private rememberReplacementForRef;
    private readFromFile;
    private readFromUrl;
    api(uri: string | URL): Promise<ApiResource>;
    note(message: string): void;
    static urlNonFragment(url: URL): URL;
    private refResolvingVisitor;
    private static urlFragment;
    private relativeUrl;
    private rewriteRefPaths;
    private rewriteRefFragments;
    private areRefsAlreadyRewritten;
    private markRefsAlreadyRewritten;
    private checkComponentConflict;
    mergeRefObject(refObject: RefObject, apiElement: JsonItem): ApiObject;
    private processComponentReplacement;
    apiItem(api: ApiObject, itemPath: JsonKey[]): JsonItem;
    sameComponentName(nav: JsonNavigation, componentKeys: JsonKey[]): boolean;
    private isSimpleRef;
    private processFullReplacement;
    private processOtherReplacement;
    tag(item: JsonItem, normalizedRefUrl: URL, nav: JsonNavigation | undefined, tagDateTime?: boolean): void;
    taggable(item: JsonItem, nav: JsonNavigation): boolean;
}
export {};
