/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
import { URI } from "./uri.mjs";
export declare function originalFSPath(uri: URI): string;
export interface IExtUri {
    /**
     * Compares two uris.
     *
     * @param uri1 Uri
     * @param uri2 Uri
     * @param ignoreFragment Ignore the fragment (defaults to `false`)
     */
    compare(uri1: URI, uri2: URI, ignoreFragment?: boolean): number;
    /**
     * Tests whether two uris are equal
     *
     * @param uri1 Uri
     * @param uri2 Uri
     * @param ignoreFragment Ignore the fragment (defaults to `false`)
     */
    isEqual(uri1: URI | undefined, uri2: URI | undefined, ignoreFragment?: boolean): boolean;
    /**
     * Tests whether a `candidate` URI is a parent or equal of a given `base` URI.
     *
     * @param base A uri which is "longer" or at least same length as `parentCandidate`
     * @param parentCandidate A uri which is "shorter" or up to same length as `base`
     * @param ignoreFragment Ignore the fragment (defaults to `false`)
     */
    isEqualOrParent(base: URI, parentCandidate: URI, ignoreFragment?: boolean): boolean;
    /**
     * Creates a key from a resource URI to be used to resource comparison and for resource maps.
     * @see {@link ResourceMap}
     * @param uri Uri
     * @param ignoreFragment Ignore the fragment (defaults to `false`)
     */
    getComparisonKey(uri: URI, ignoreFragment?: boolean): string;
    /**
     * Whether the casing of the path-component of the uri should be ignored.
     */
    ignorePathCasing(uri: URI): boolean;
    basenameOrAuthority(resource: URI): string;
    /**
     * Returns the basename of the path component of an uri.
     * @param resource
     */
    basename(resource: URI): string;
    /**
     * Returns the extension of the path component of an uri.
     * @param resource
     */
    extname(resource: URI): string;
    /**
     * Return a URI representing the directory of a URI path.
     *
     * @param resource The input URI.
     * @returns The URI representing the directory of the input URI.
     */
    dirname(resource: URI): URI;
    /**
     * Join a URI path with path fragments and normalizes the resulting path.
     *
     * @param resource The input URI.
     * @param pathFragment The path fragment to add to the URI path.
     * @returns The resulting URI.
     */
    joinPath(resource: URI, ...pathFragment: string[]): URI;
    /**
     * Normalizes the path part of a URI: Resolves `.` and `..` elements with directory names.
     *
     * @param resource The URI to normalize the path.
     * @returns The URI with the normalized path.
     */
    normalizePath(resource: URI): URI;
    /**
     *
     * @param from
     * @param to
     */
    relativePath(from: URI, to: URI): string | undefined;
    /**
     * Resolves an absolute or relative path against a base URI.
     * The path can be relative or absolute posix or a Windows path
     */
    resolvePath(base: URI, path: string): URI;
    /**
     * Returns true if the URI path is absolute.
     */
    isAbsolutePath(resource: URI): boolean;
    /**
     * Tests whether the two authorities are the same
     */
    isEqualAuthority(a1: string, a2: string): boolean;
    /**
     * Returns true if the URI path has a trailing path separator
     */
    hasTrailingPathSeparator(resource: URI, sep?: string): boolean;
    /**
     * Removes a trailing path separator, if there's one.
     * Important: Doesn't remove the first slash, it would make the URI invalid
     */
    removeTrailingPathSeparator(resource: URI, sep?: string): URI;
    /**
     * Adds a trailing path separator to the URI if there isn't one already.
     * For example, c:\ would be unchanged, but c:\users would become c:\users\
     */
    addTrailingPathSeparator(resource: URI, sep?: string): URI;
}
export declare class ExtUri implements IExtUri {
    private _ignorePathCasing;
    constructor(_ignorePathCasing: (uri: URI) => boolean);
    compare(uri1: URI, uri2: URI, ignoreFragment?: boolean): number;
    isEqual(uri1: URI | undefined, uri2: URI | undefined, ignoreFragment?: boolean): boolean;
    getComparisonKey(uri: URI, ignoreFragment?: boolean): string;
    ignorePathCasing(uri: URI): boolean;
    isEqualOrParent(base: URI, parentCandidate: URI, ignoreFragment?: boolean): boolean;
    joinPath(resource: URI, ...pathFragment: string[]): URI;
    basenameOrAuthority(resource: URI): string;
    basename(resource: URI): string;
    extname(resource: URI): string;
    dirname(resource: URI): URI;
    normalizePath(resource: URI): URI;
    relativePath(from: URI, to: URI): string | undefined;
    resolvePath(base: URI, path: string): URI;
    isAbsolutePath(resource: URI): boolean;
    isEqualAuthority(a1: string | undefined, a2: string | undefined): boolean;
    hasTrailingPathSeparator(resource: URI, sep?: string): boolean;
    removeTrailingPathSeparator(resource: URI, sep?: string): URI;
    addTrailingPathSeparator(resource: URI, sep?: string): URI;
}
/**
 * Unbiased utility that takes uris "as they are". This means it can be interchanged with
 * uri#toString() usages. The following is true
 * ```
 * assertEqual(aUri.toString() === bUri.toString(), exturi.isEqual(aUri, bUri))
 * ```
 */
export declare const extUri: ExtUri;
/**
 * BIASED utility that _mostly_ ignored the case of urs paths. ONLY use this util if you
 * understand what you are doing.
 *
 * This utility is INCOMPATIBLE with `uri.toString()`-usages and both CANNOT be used interchanged.
 *
 * When dealing with uris from files or documents, `extUri` (the unbiased friend)is sufficient
 * because those uris come from a "trustworthy source". When creating unknown uris it's always
 * better to use `IUriIdentityService` which exposes an `IExtUri`-instance which knows when path
 * casing matters.
 */
export declare const extUriBiasedIgnorePathCase: ExtUri;
/**
 * BIASED utility that always ignores the casing of uris paths. ONLY use this util if you
 * understand what you are doing.
 *
 * This utility is INCOMPATIBLE with `uri.toString()`-usages and both CANNOT be used interchanged.
 *
 * When dealing with uris from files or documents, `extUri` (the unbiased friend)is sufficient
 * because those uris come from a "trustworthy source". When creating unknown uris it's always
 * better to use `IUriIdentityService` which exposes an `IExtUri`-instance which knows when path
 * casing matters.
 */
export declare const extUriIgnorePathCase: ExtUri;
export declare const isEqual: (uri1: URI | undefined, uri2: URI | undefined, ignoreFragment?: boolean) => boolean;
export declare const isEqualOrParent: (base: URI, parentCandidate: URI, ignoreFragment?: boolean) => boolean;
export declare const getComparisonKey: (uri: URI, ignoreFragment?: boolean) => string;
export declare const basenameOrAuthority: (resource: URI) => string;
export declare const basename: (resource: URI) => string;
export declare const extname: (resource: URI) => string;
export declare const dirname: (resource: URI) => URI;
export declare const joinPath: (resource: URI, ...pathFragment: string[]) => URI;
export declare const normalizePath: (resource: URI) => URI;
export declare const relativePath: (from: URI, to: URI) => string | undefined;
export declare const resolvePath: (base: URI, path: string) => URI;
export declare const isAbsolutePath: (resource: URI) => boolean;
export declare const isEqualAuthority: (a1: string | undefined, a2: string | undefined) => boolean;
export declare const hasTrailingPathSeparator: (resource: URI, sep?: string) => boolean;
export declare const removeTrailingPathSeparator: (resource: URI, sep?: string) => URI;
export declare const addTrailingPathSeparator: (resource: URI, sep?: string) => URI;
export declare function distinctParents<T>(items: T[], resourceAccessor: (item: T) => URI): T[];
/**
 * Data URI related helpers.
 */
export declare namespace DataUri {
    const META_DATA_LABEL = "label";
    const META_DATA_DESCRIPTION = "description";
    const META_DATA_SIZE = "size";
    const META_DATA_MIME = "mime";
    function parseMetaData(dataUri: URI): Map<string, string>;
}
export declare function toLocalResource(resource: URI, authority: string | undefined, localScheme: string): URI;
