import type { Plugin as Plugin_2 } from 'rollup';
import type { Plugin as Plugin_3 } from 'vite';

/**
 * @public
 */
export declare type AddOutputFilterByTypeSpec = Array<{
    filters: Array<string>;
    mediaTypes: Array<string>;
}>;

/**
 * @public
 */
export declare type ContentSecurityPolicySandboxValue = "allow-downloads-without-user-activation Experimental" | "allow-downloads" | "allow-forms" | "allow-modals" | "allow-orientation-lock" | "allow-pointer-lock" | "allow-popups-to-escape-sandbox" | "allow-popups" | "allow-presentation" | "allow-same-origin" | "allow-scripts" | "allow-storage-access-by-user-activation Experimental" | "allow-top-navigation-by-user-activation" | "allow-top-navigation-to-custom-protocols" | "allow-top-navigation" | null;

/**
 * @public
 */
export declare type ContentSecurityPolicySourceDirective = "base-uri" | "connect-src" | "default-src" | "fenced-frame-src" | "font-src" | "form-action" | "frame-ancestors" | "frame-src" | "img-src" | "manifest-src" | "media-src" | "object-src" | "script-src-attr" | "script-src-elem" | "script-src" | "style-src-attr" | "style-src-elem" | "style-src" | "worker-src";

/**
 * @public
 */
export declare interface ContentSecurityPolicySources {
    hashes?: {
        sha256?: Array<string>;
        sha384?: Array<string>;
        sha512?: Array<string>;
    };
    hosts?: Array<string>;
    "inline-speculation-rules"?: boolean;
    nonces?: Array<string>;
    "report-sample"?: boolean;
    schemes?: {
        blob?: boolean;
        data?: boolean;
        filesystem?: boolean;
        mediastream?: boolean;
    };
    self?: boolean;
    "strict-dynamic"?: boolean;
    "unsafe-eval"?: boolean;
    "unsafe-hashes"?: boolean;
    "unsafe-inline"?: boolean;
    "wasm-unsafe-eval"?: boolean;
}

/**
 * @public
 */
export declare type ContentSecurityPolicySpec = Partial<Record<ContentSecurityPolicySourceDirective, ContentSecurityPolicySources> & {
    "report-to": string;
    /**
     * @deprecated The report-uri directive is deprecated and it's recommended to send CSP reports using report-to instead.
     */
    "report-uri": Array<string>;
    "require-trusted-types-for": "script";
    sandbox: ContentSecurityPolicySandboxValue;
    "trusted-types": ContentSecurityPolicyTrustedTypesValue;
    "upgrade-insecure-requests": boolean;
}>;

/**
 * @public
 */
export declare interface ContentSecurityPolicyTrustedTypesValue {
    "allow-duplicates"?: boolean;
    policies?: Array<string>;
}

/**
 * @public
 */
export declare interface DirectorySlashSpec {
    value: boolean;
}

/**
 * @public
 */
export declare type ErrorDocumentSpec = Record<number, string>;

/**
 * @public
 */
export declare interface ExtractMetaCSPEnabledOptions {
    defaultPolicyFile?: string;
    enabled: true;
    outputDir?: string;
    perFilePolicyFiles?: Array<string>;
}

/**
 * @public
 */
export declare type ExtractMetaCSPOptions = {
    enabled: false;
} | ExtractMetaCSPEnabledOptions;

/**
 * @public
 */
export declare interface FilesMatchSpec {
    innerSpec: Spec;
    regex: string;
}

/**
 * @public
 */
export declare interface FilesSpec {
    fileName: string;
    innerSpec: Spec;
}

/**
 * @public
 */
export declare type HeaderSpec<T extends keyof HeaderValueSpecMap> = {
    always?: boolean;
    condition?: {
        envVar: string;
        requireUnset?: boolean;
    } | {
        expression: string;
    };
    header: T;
} & ({
    action: "add" | "append" | "merge" | "set" | "setifempty";
    value: HeaderValueSpecMap[T];
} | {
    action: "echo" | "note" | "unset";
} | {
    action: "edit" | "edit*";
    replacement: string;
    value: string;
});

/**
 * @public
 */
export declare type HeaderSpecUnion = {
    [K in keyof HeaderValueSpecMap]: HeaderSpec<K>;
}[keyof HeaderValueSpecMap];

/**
 * @public
 */
export declare interface HeaderValueSpecMap {
    "Content-Security-Policy": ContentSecurityPolicySpec;
    "Permissions-Policy": PermissionsPolicySpec;
    "Referrer-Policy": ReferrerPolicySpec;
    "Strict-Transport-Security": StrictTransportSecuritySpec;
    "X-Content-Type-Options": XContentTypeOptionsSpec;
    /**
     * @deprecated The Content-Security-Policy HTTP header has a frame-ancestors directive which obsoletes this header for supporting browsers.
     */
    "X-Frame-Options": XFrameOptionsSpec;
    /**
     * @deprecated This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.
     */
    "X-Xss-Protection": XXssProtectionSpec;
}

/**
 * @public
 */
declare function htaccess(opts?: Partial<Options>): Plugin_2 & Plugin_3;
export default htaccess;

/**
 * @public
 */
export declare interface IfDefineSpec {
    innerSpec: Spec;
    inverted?: boolean;
    parameterName: string;
}

/**
 * @public
 */
export declare interface IfDirectiveSpec {
    directiveName: string;
    innerSpec: Spec;
    inverted?: boolean;
}

/**
 * @public
 */
export declare interface IfFileSpec {
    fileName: string;
    innerSpec: Spec;
    inverted?: boolean;
}

/**
 * @public
 */
export declare interface IfModuleSpec {
    innerSpec: Spec;
    inverted?: boolean;
    moduleNameOrIdentifier: string;
}

/**
 * @public
 */
export declare interface IfSectionSpec {
    innerSpec: Spec;
    inverted?: boolean;
    sectionName: string;
}

/**
 * @public
 */
export declare interface IfSpec {
    condition: string;
    Else?: {
        innerSpec: Spec;
    };
    ElseIf?: Array<{
        condition: string;
        innerSpec: Spec;
    }>;
    innerSpec: Spec;
}

/**
 * @public
 */
export declare interface MetadataRewriteRuleFlags {
    env?: {
        value: string | null;
        variable: string;
    };
    handler?: string;
    type?: string;
}

/**
 * @public
 */
export declare type OptionName = "All" | "ExecCGI" | "FollowSymLinks" | "Includes" | "IncludesNOEXEC" | "Indexes" | "MultiViews" | "SymLinksIfOwnerMatch";

/**
 * @public
 */
export declare interface Options {
    extractMetaCSP: ExtractMetaCSPOptions;
    fileName: string;
    spec: Spec;
    template: string | undefined;
}

/**
 * @public
 */
export declare type OptionsSpec = "None" | {
    minus?: Array<OptionName> | undefined;
    plus?: Array<OptionName> | undefined;
} | {
    set: Array<OptionName>;
};

/**
 * @public
 */
export declare type PermissionsPolicyAllowlist = "*" | {
    origins?: Array<string>;
    self?: boolean;
    src?: boolean;
};

/**
 * @public
 */
export declare type PermissionsPolicyDirectives = "accelerometer" | "ambient-light-sensor" | "attribution-reporting" | "autoplay" | "battery" | "bluetooth" | "camera" | "compute-pressure" | "display-capture" | "document-domain" | "encrypted-media" | "execution-while-not-rendered" | "execution-while-out-of-viewport" | "fullscreen" | "gamepad" | "geolocation" | "gyroscope" | "hid" | "identity-credentials-get" | "idle-detection" | "local-fonts" | "magnetometer" | "microphone" | "midi" | "otp-credentials" | "payment" | "picture-in-picture" | "publickey-credentials-create" | "publickey-credentials-get" | "screen-wake-lock" | "serial" | "speaker-selection" | "storage-access" | "usb" | "web-share" | "window-management" | "xr-spatial-tracking";

/**
 * @public
 */
export declare type PermissionsPolicySpec = Partial<Record<PermissionsPolicyDirectives, PermissionsPolicyAllowlist>>;

/**
 * @public
 */
export declare type ReferrerPolicySpec = "no-referrer-when-downgrade" | "no-referrer" | "origin-when-cross-origin" | "origin" | "same-origin" | "strict-origin-when-cross-origin" | "strict-origin" | "unsafe-url";

/**
 * @public
 */
export declare interface RewriteCondSpec {
    conditionPattern: string;
    flags?: {
        nocase?: boolean;
        novary?: boolean;
        ornext?: boolean;
    };
    testString: string;
}

/**
 * @public
 */
export declare interface RewriteOptionsSpec {
    AllowAnyURI?: boolean;
    AllowNoSlash?: boolean;
    IgnoreContextInfo?: boolean;
    IgnoreInherit?: boolean;
    Inherit?: boolean;
    InheritDown?: boolean;
    InheritDownBefore?: boolean;
    LegacyPrefixDocRoot?: boolean;
    MergeBase?: boolean;
}

/**
 * @public
 */
export declare interface RewriteRuleCookieFlagMinimalSpec {
    domain: string;
    name: string;
    value: string;
}

/**
 * @public
 */
export declare type RewriteRuleCookieFlagSpec = RewriteRuleCookieFlagMinimalSpec & ({
    httponly?: boolean | undefined;
    lifetime?: number | undefined;
    path?: string | undefined;
    samesite?: "Lax" | "None" | "Strict" | undefined;
    secure?: boolean | undefined;
} | {
    httponly?: boolean | undefined;
    lifetime?: number | undefined;
    path?: string | undefined;
    secure?: boolean | undefined;
} | {
    lifetime?: number | undefined;
} | {
    lifetime?: number | undefined;
    path?: string | undefined;
} | {
    lifetime?: number | undefined;
    path?: string | undefined;
    secure?: boolean | undefined;
});

/**
 * @public
 */
export declare type RewriteRuleSpec = {
    conditions?: Array<RewriteCondSpec>;
    pattern: string;
} & ({
    flags?: MetadataRewriteRuleFlags & StandardRewriteRuleFlags;
    substitution: null;
} | {
    flags?: StandardRewriteRuleFlags;
    substitution: string;
});

/**
 * @public
 */
export declare interface RewriteSpec {
    base?: string;
    options?: RewriteOptionsSpec;
    rules?: Array<RewriteRuleSpec>;
}

/**
 * @public
 */
export declare interface Spec {
    AddOutputFilterByType?: AddOutputFilterByTypeSpec;
    DirectorySlash?: DirectorySlashSpec;
    ErrorDocument?: ErrorDocumentSpec;
    Files?: Array<FilesSpec>;
    FilesMatch?: Array<FilesMatchSpec>;
    Header?: Array<HeaderSpecUnion>;
    If?: Array<IfSpec>;
    IfDefine?: Array<IfDefineSpec>;
    IfDirective?: Array<IfDirectiveSpec>;
    IfFile?: Array<IfFileSpec>;
    IfModule?: Array<IfModuleSpec>;
    IfSection?: Array<IfSectionSpec>;
    Options?: OptionsSpec;
    rewrite?: RewriteSpec;
}

/**
 * @public
 */
export declare interface StandardRewriteRuleFlags {
    B?: boolean | string;
    backrefnoplus?: boolean;
    BCTLS?: boolean;
    BNE?: string;
    chain?: boolean;
    cookie?: RewriteRuleCookieFlagSpec;
    discardpath?: boolean;
    END?: boolean;
    forbidden?: boolean;
    gone?: boolean;
    last?: boolean;
    next?: boolean;
    nocase?: boolean;
    noescape?: boolean;
    nosubreq?: boolean;
    proxy?: boolean;
    qsappend?: boolean;
    qsdiscard?: boolean;
    qslast?: boolean;
    redirect?: number | string;
    skip?: number;
    UnsafeAllow3F?: boolean;
    UnsafePrefixStat?: boolean;
}

/**
 * @public
 */
export declare interface StrictTransportSecuritySpec {
    includeSubDomains?: boolean;
    maxAge: number;
    preload?: boolean;
}

/**
 * @public
 */
export declare interface XContentTypeOptionsSpec {
    nosniff: true;
}

/**
 * @public
 * @deprecated The Content-Security-Policy HTTP header has a frame-ancestors directive which obsoletes this header for supporting browsers.
 */
export declare type XFrameOptionsSpec = "deny" | "sameorigin";

/**
 * @public
 * @deprecated This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.
 */
export declare type XXssProtectionSpec = {
    mode: "block";
} | {
    mode: "disabled";
} | {
    mode: "sanitize";
    reportUri?: string;
};

export { }
