polen
Version:
A framework for delightful GraphQL developer portals
124 lines • 4.1 kB
TypeScript
/**
* A mask that can either hide/show data entirely (BinaryMask) or
* selectively hide/show object properties (PropertiesMask).
*
* @template $Data - The data type being masked
*/
export type Mask<$Data = any> = BinaryMask<$Data> | PropertiesMask<$Data extends object ? $Data : object>;
/**
* Create a mask based on the provided options.
*
* @param options - Mask configuration:
* - `boolean`: Creates a binary mask (true = show, false = hide)
* - `string[]`: Creates a properties mask that allows only the specified keys
* - `object`: Creates a properties mask based on true/false values per key
*
* @returns A mask that can be applied to data
*
* @example
* ```ts
* // Binary mask
* const showAll = create(true)
* const hideAll = create(false)
*
* // Properties mask with array
* const allowMask = create<User>(['name', 'email'])
*
* // Properties mask with object
* const objectMask = create<User>({
* name: true,
* email: true,
* password: false
* })
* ```
*/
export declare const create: <$Data = unknown>(options: InferOptions<$Data>) => Mask<$Data>;
/**
* Valid options for creating a mask for the given data type.
*
* @template $Data - The data type to be masked
*/
export type InferOptions<$Data> = unknown extends $Data ? boolean | string[] | Record<string, boolean> : $Data extends object ? (boolean | (keyof $Data)[] | Partial<{
[K in keyof $Data]: boolean;
}>) : boolean;
/**
* A mask that selectively shows or hides object properties.
*
* @template $Data - The object type being masked
*/
export interface PropertiesMask<$Data extends object = object> {
type: `properties`;
/** Whether to allow only specified properties or deny them */
mode: `allow` | `deny`;
/** The list of property keys to allow or deny */
properties: (keyof $Data)[];
}
/**
* Create a properties mask.
*
* @param mode - 'allow' to show only specified properties, 'deny' to hide them
* @param properties - Array of property keys to allow or deny
* @returns A PropertiesMask
*/
export declare const createProperties: <$Data extends object = object>(mode: `allow` | `deny`, properties: (keyof $Data)[]) => PropertiesMask<$Data>;
/**
* A mask that either shows or hides data entirely.
*
* @template _$Data - The data type being masked (used for type inference)
*/
export interface BinaryMask<_$Data = any> {
type: `binary`;
/** Whether to show (true) or hide (false) the data */
show: boolean;
}
/**
* Create a binary mask.
*
* @param show - Whether to show (true) or hide (false) the data
* @returns A BinaryMask
*/
export declare const createBinary: <$Data = any>(show: boolean) => BinaryMask<$Data>;
/**
* Create a mask that shows all data.
* @returns A BinaryMask with show=true
*/
export declare const show: () => BinaryMask;
/**
* Create a mask that hides all data.
* @returns A BinaryMask with show=false
*/
export declare const hide: () => BinaryMask;
/**
* Create a mask that shows only the specified properties.
*
* @param properties - Array of property keys to show
* @returns A PropertiesMask in 'allow' mode
*
* @example
* ```ts
* const userMask = pick<User>(['name', 'email'])
* // Only 'name' and 'email' will be shown
* ```
*/
export declare const pick: <$Data extends object = object>(properties: (keyof $Data)[]) => PropertiesMask<$Data>;
/**
* Create a mask that hides the specified properties.
*
* @param properties - Array of property keys to hide
* @returns A PropertiesMask in 'deny' mode
*
* @example
* ```ts
* const userMask = omit<User>(['password', 'ssn'])
* // Everything except 'password' and 'ssn' will be shown
* ```
*/
export declare const omit: <$Data extends object = object>(properties: (keyof $Data)[]) => PropertiesMask<$Data>;
/**
* Extract the data type from a mask.
*
* @template $Mask - The mask type
* @returns The data type the mask is designed for
*/
export type GetDataType<$Mask extends Mask> = $Mask extends BinaryMask<infer $Data> ? $Data : $Mask extends PropertiesMask<infer $Data> ? $Data : never;
//# sourceMappingURL=mask.d.ts.map