export enum ScimSchema { CORE = 'urn:scim:schemas:core:1.0', USER = 'urn:ietf:params:scim:schemas:core:2.0:User', USER_ENTERPRISE = 'urn:ietf:params:scim:schemas:extension:enterprise:2.0:User', LIST = 'urn:ietf:params:scim:api:messages:2.0:ListResponse', PATCH = 'urn:ietf:params:scim:api:messages:2.0:PatchOp', GROUP = 'urn:ietf:params:scim:schemas:core:2.0:Group' } export enum OperationCode { replace = 'replace', add = 'add', remove = 'remove' } export type ScimEmail = { primary: boolean; value: string; type: string; }; export enum ScimResourceType { USER = 'User', GROUP = 'Group' } type ScimResource = { schemas: ScimSchema[]; id: string; meta: ScimMeta; }; type ScimMeta = { resourceType: ScimResourceType; created: Date; lastModified: Date; location: string; }; export type ScimUserName = { // RFC 7643 section 4.1.1. Honored on create only; updates never write the stored name from it. formatted?: string; givenName: string; middleName?: string; familyName: string; }; export type ScimUser = ScimResource & { active: boolean | string; userName: string; displayName: string; name: ScimUserName; emails: ScimEmail[]; groups: ScimMember[]; }; type ListResponse = { schemas: ScimSchema[]; totalResults: number; startIndex: number; itemsPerPage: number; Resources: T[]; }; export type UsersListResponse = ListResponse; export type GroupsListResponse = ListResponse; export type ScimUserPatchOperation = { schemas: [ScimSchema.PATCH]; Operations: (UserReplaceOperation | UserReplacePathOperation | UserRemovePathOperation)[]; }; export type UserReplaceOperation = { op: unknown; value: Partial; }; export type UserReplacePathOperation = { op: unknown; value: string | boolean; path: string; }; export type UserRemovePathOperation = { op: unknown; path: string; value?: string | boolean; }; export type ScimGroupPatchOperation = { schemas: [ScimSchema.PATCH]; Operations: (GroupNameOperation | GroupMemberOperation)[]; }; export type GroupNameOperation = { op: unknown; value: { displayName: string; }; }; export type GroupMemberOperation = { op: unknown; path: string; value?: ScimMember[] | ScimMember; }; export type ScimGroup = ScimResource & { displayName: string; members?: ScimMember[]; }; export type ScimMember = { value: string; display?: string; type?: ScimMemberType; ref?: string; }; export enum ScimMemberType { USER = 'User', GROUP = 'Group' }