import type { Policy } from "./policy"; export interface ICapability< Type extends string = string, Resource = unknown, Constraint = unknown, > { type: Type; resource: Resource; constraint: Constraint; sid: string; label: string; } export interface Capability< Type extends string = string, Resource = unknown, Constraint = unknown, > extends ICapability { new (): {}; } export declare namespace Capability { export type Simplify = [C] extends [ { Constructor: { Reduce: any }; }, ] ? _Simplify : C; type _Simplify = [C] extends [ infer c extends { Constructor: any; resource: any; constraint: any }, ] ? (c["Constructor"] & { resource: c["resource"]; constraint: Constraint.Simplify; })["Reduce"] : never; type KeysWithNever = { [K in keyof T]: T[K] extends never | Policy.AnyOf ? K : never; }[keyof T]; type DropIrrelevant = T extends any ? { [k in keyof Omit>]: Omit>[k]; } : never; type Get = T extends { [k in K]: infer V; } ? V : never; type Keys = T extends any ? keyof T : never; type BoxPolicy = [T] extends [{ anyOf: (infer U)[] }] ? Policy.AnyOf : never; export namespace Constraint { export type Simplify = { [k in Keys>]: BoxPolicy>; }; } }