import * as internal from 'stream';
import * as postcss from 'postcss';

/**
 * @public
 */
declare type ComplexSafelist = {
    standard?: StringRegExpArray;
    /**
     * You can safelist selectors and their children based on a regular
     * expression with `safelist.deep`
     *
     * @example
     *
     * ```ts
     * const purgecss = await new PurgeCSS().purge({
     *   content: [],
     *   css: [],
     *   safelist: {
     *     deep: [/red$/]
     *   }
     * })
     * ```
     *
     * In this example, selectors such as `.bg-red .child-of-bg` will be left
     * in the final CSS, even if `child-of-bg` is not found.
     *
     */
    deep?: RegExp[];
    greedy?: RegExp[];
    variables?: StringRegExpArray;
    keyframes?: StringRegExpArray;
};

/**
 * @public
 */
declare type ExtractorFunction<T = string> = (content: T) => ExtractorResult;

/**
 * @public
 */
declare type ExtractorResult = ExtractorResultDetailed | string[];

/**
 * @public
 */
declare interface ExtractorResultDetailed {
    attributes: {
        names: string[];
        values: string[];
    };
    classes: string[];
    ids: string[];
    tags: string[];
    undetermined: string[];
}

/**
 * @public
 */
declare interface Extractors {
    extensions: string[];
    extractor: ExtractorFunction;
}

/**
 *
 * @param options - options
 * @returns
 *
 * @public
 */
declare function gulpPurgeCSS(options: UserDefinedOptions): internal.Transform;
export default gulpPurgeCSS;

/**
 * @public
 */
declare interface RawContent<T = string> {
    extension: string;
    raw: T;
}

/**
 * @public
 */
declare interface RawCSS {
    raw: string;
    name?: string;
}

/**
 * @public
 */
declare type StringRegExpArray = Array<RegExp | string>;

/**
 * @public
 */
export declare interface UserDefinedOptions extends Omit<UserDefinedOptions_2, "css" | "content"> {
    content: string[];
}

/**
 * Options used by PurgeCSS to remove unused CSS
 *
 * @public
 */
declare interface UserDefinedOptions_2 {
    /** {@inheritDoc purgecss#Options.content} */
    content: Array<string | RawContent>;
    /** {@inheritDoc purgecss#Options.css} */
    css: Array<string | RawCSS>;
    /** {@inheritDoc purgecss#Options.defaultExtractor} */
    defaultExtractor?: ExtractorFunction;
    /** {@inheritDoc purgecss#Options.extractors} */
    extractors?: Array<Extractors>;
    /** {@inheritDoc purgecss#Options.fontFace} */
    fontFace?: boolean;
    /** {@inheritDoc purgecss#Options.keyframes} */
    keyframes?: boolean;
    /** {@inheritDoc purgecss#Options.output} */
    output?: string;
    /** {@inheritDoc purgecss#Options.rejected} */
    rejected?: boolean;
    /** {@inheritDoc purgecss#Options.rejectedCss} */
    rejectedCss?: boolean;
    /** {@inheritDoc purgecss#Options.sourceMap } */
    sourceMap?: boolean | (postcss.SourceMapOptions & { to?: string });
    /** {@inheritDoc purgecss#Options.stdin} */
    stdin?: boolean;
    /** {@inheritDoc purgecss#Options.stdout} */
    stdout?: boolean;
    /** {@inheritDoc purgecss#Options.variables} */
    variables?: boolean;
    /** {@inheritDoc purgecss#Options.safelist} */
    safelist?: UserDefinedSafelist;
    /** {@inheritDoc purgecss#Options.blocklist} */
    blocklist?: StringRegExpArray;
    /** {@inheritDoc purgecss#Options.skippedContentGlobs} */
    skippedContentGlobs?: Array<string>;
    /** {@inheritDoc purgecss#Options.dynamicAttributes} */
    dynamicAttributes?: string[];
}

/**
 * @public
 */
declare type UserDefinedSafelist = StringRegExpArray | ComplexSafelist;

export { }
