/** * Policy types * @see https://github.com/ucan-wg/delegation/#policy */ /** * Type-safe selector utilities */ /** * Extracts all possible paths from a data structure as string literals */ type PathsToStringProps = T extends | string | number | boolean | null | undefined ? never : T extends Array ? | `[]` | `[${number}]` | `[${number}:${number}]` | `[${number}:]` | `[:${number}]` | `[:]` | PathsToStringProps : T extends object ? { [K in keyof T & (string | number)]: K extends string ? `.${K}` | `.${K}?` | `.${K}${PathsToStringProps}` : `[${K}]` | `[${K}]?` | `[${K}]${PathsToStringProps}` }[keyof T & (string | number)] : never /** * Flattens nested path strings into a union of all possible selectors */ type FlattenPaths = T extends string ? T : T extends object ? { [K in keyof T]: T[K] extends string ? T[K] : T[K] extends object ? FlattenPaths : never }[keyof T] : never /** * Type-safe selector that only allows valid paths for the given data structure */ export type Selector = Args extends unknown ? FlattenPaths> | '.' : string /** * Extracts the type of the value at a given selector path (minimal version) */ type SelectorValue = S extends `.${infer K}` ? K extends keyof T ? T[K] : never : S extends `[${infer I}]` ? T extends Array ? U : never : never /** Connectives */ export type EqualityOp = '==' | '!=' export type Equality = [EqualityOp, Selector, unknown] export type InequalityOp = '<' | '<=' | '>' | '>=' export type Inequality = [InequalityOp, Selector, number] export type NegateOp = 'not' export type Negate = [NegateOp, Statement] export type ConnectiveOp = 'and' | 'or' export type Connective = [ConnectiveOp, Statement[]] export type QuantifierOp = 'all' | 'any' export type Quantifier< Args = unknown, Sel extends Selector = Selector, > = [QuantifierOp, Sel, Statement>] export type LikeOp = 'like' export type Like = [LikeOp, Selector, string] export type Statement = | Equality | Inequality | Negate | Connective | Quantifier | Like export type Policy = Statement[]