interface WebBundleData {
    resources: string[];
    scopes: string[];
    extract?: boolean;
    preserve?: boolean;
    remove?: boolean;
}

interface UsedStylesData {
    selectors?: Array<string | RegExp>;
    variables?: string[];
    pseudoClass?: boolean;
    "@font-face"?: string[];
    "@keyframes"?: string[];
    "@media"?: string[];
    "@container"?: string[];
    "@scope"?: string[];
    "@supports"?: string[];
}

interface CssRuleData {
    usedVariables?: string[];
    usedFontFace?: string[];
    usedKeyframes?: string[];
    unusedStyles?: string[];
    unusedMedia?: string[];
    unusedContainer?: string[];
    unusedScope?: ScopeData[];
    unusedSupports?: string[];
    unusedAtRules?: UnusedAtRule[];
}

interface UnusedAtRule {
    selector?: string;
    media?: ConditionAction;
    supports?: ConditionAction;
    container?: Omit<CssConditionData, "parentRule"> & Partial<ConditionAction>;
    scope?: ScopeData[];
    layer?: string[];
}

type ScopeData = Pick<CSSScopeRule, "start" | "end">;
type ElementAssetMap = Map<StyleElement, AssetCommand>;
type SelectorCache = ObjectMap<NodeListOf<Element>>;