import * as svt from "simple-validation-tools"; export type UserData = { login: string; id: number; avatar_url: string; url: string; html_url: string; followers_url: string; gists_url: string; repos_url: string; site_admin: boolean; bio: string; public_repos: number; followers: number; following: number; created_at: string; updated_at: string; location: string | null | undefined; blog: string | null | undefined; }; export function isUserData(value: unknown): value is UserData { return svt.isInterface(value, {login: svt.isString, id: svt.isNumber, avatar_url: svt.isString, url: svt.isString, html_url: svt.isString, followers_url: svt.isString, gists_url: svt.isString, repos_url: svt.isString, site_admin: svt.isBoolean, bio: svt.isString, public_repos: svt.isNumber, followers: svt.isNumber, following: svt.isNumber, created_at: svt.isString, updated_at: svt.isString, location: svt.optional(svt.isString), blog: svt.optional(svt.isString)}); } export function validateUserData(value: unknown): svt.ValidationResult { return svt.validate(value, {login: svt.validateString, id: svt.validateNumber, avatar_url: svt.validateString, url: svt.validateString, html_url: svt.validateString, followers_url: svt.validateString, gists_url: svt.validateString, repos_url: svt.validateString, site_admin: svt.validateBoolean, bio: svt.validateString, public_repos: svt.validateNumber, followers: svt.validateNumber, following: svt.validateNumber, created_at: svt.validateString, updated_at: svt.validateString, location: svt.validateOptional(svt.validateString), blog: svt.validateOptional(svt.validateString)}); } export type OwnerData = { id: number; login: string; url: string; html_url: string; followers_url: string; gists_url: string; repos_url: string; site_admin: boolean; }; export function isOwnerData(value: unknown): value is OwnerData { return svt.isInterface(value, {id: svt.isNumber, login: svt.isString, url: svt.isString, html_url: svt.isString, followers_url: svt.isString, gists_url: svt.isString, repos_url: svt.isString, site_admin: svt.isBoolean}); } export function validateOwnerData(value: unknown): svt.ValidationResult { return svt.validate(value, {id: svt.validateNumber, login: svt.validateString, url: svt.validateString, html_url: svt.validateString, followers_url: svt.validateString, gists_url: svt.validateString, repos_url: svt.validateString, site_admin: svt.validateBoolean}); } export type OrganizationData = { login: string; id: number; avatar_url: string; members_url: string | null | undefined; repos_url: string; description: string | null | undefined; }; export function isOrganizationData(value: unknown): value is OrganizationData { return svt.isInterface(value, {login: svt.isString, id: svt.isNumber, avatar_url: svt.isString, members_url: svt.optional(svt.isString), repos_url: svt.isString, description: svt.optional(svt.isString)}); } export function validateOrganizationData(value: unknown): svt.ValidationResult { return svt.validate(value, {login: svt.validateString, id: svt.validateNumber, avatar_url: svt.validateString, members_url: svt.validateOptional(svt.validateString), repos_url: svt.validateString, description: svt.validateOptional(svt.validateString)}); } export type Owner = User | Organization; export enum OwnerTag { User = "User", Organization = "Organization", } export type User = { type: OwnerTag.User; id: number; login: string; url: string; html_url: string; followers_url: string; gists_url: string; repos_url: string; site_admin: boolean; }; export type Organization = { type: OwnerTag.Organization; login: string; id: number; avatar_url: string; members_url: string | null | undefined; repos_url: string; description: string | null | undefined; }; export function User(data: OwnerData): User { return {type: OwnerTag.User, ...data}; } export function Organization(data: OrganizationData): Organization { return {type: OwnerTag.Organization, ...data}; } export function isOwner(value: unknown): value is Owner { return [isUser, isOrganization].some((typePredicate) => typePredicate(value)); } export function isUser(value: unknown): value is User { return svt.isInterface(value, {type: OwnerTag.User, id: svt.isNumber, login: svt.isString, url: svt.isString, html_url: svt.isString, followers_url: svt.isString, gists_url: svt.isString, repos_url: svt.isString, site_admin: svt.isBoolean}); } export function isOrganization(value: unknown): value is Organization { return svt.isInterface(value, {type: OwnerTag.Organization, login: svt.isString, id: svt.isNumber, avatar_url: svt.isString, members_url: svt.optional(svt.isString), repos_url: svt.isString, description: svt.optional(svt.isString)}); } export function validateOwner(value: unknown): svt.ValidationResult { return svt.validateWithTypeTag(value, {[OwnerTag.User]: validateUser, [OwnerTag.Organization]: validateOrganization}, "type"); } export function validateUser(value: unknown): svt.ValidationResult { return svt.validate(value, {type: OwnerTag.User, id: svt.validateNumber, login: svt.validateString, url: svt.validateString, html_url: svt.validateString, followers_url: svt.validateString, gists_url: svt.validateString, repos_url: svt.validateString, site_admin: svt.validateBoolean}); } export function validateOrganization(value: unknown): svt.ValidationResult { return svt.validate(value, {type: OwnerTag.Organization, login: svt.validateString, id: svt.validateNumber, avatar_url: svt.validateString, members_url: svt.validateOptional(svt.validateString), repos_url: svt.validateString, description: svt.validateOptional(svt.validateString)}); } export type Repository = { id: number; name: string; full_name: string; private: boolean; fork: boolean; created_at: string; updated_at: string; description: string | null | undefined; owner: Owner; url: string; html_url: string; language: string | null | undefined; }; export function isRepository(value: unknown): value is Repository { return svt.isInterface(value, {id: svt.isNumber, name: svt.isString, full_name: svt.isString, private: svt.isBoolean, fork: svt.isBoolean, created_at: svt.isString, updated_at: svt.isString, description: svt.optional(svt.isString), owner: isOwner, url: svt.isString, html_url: svt.isString, language: svt.optional(svt.isString)}); } export function validateRepository(value: unknown): svt.ValidationResult { return svt.validate(value, {id: svt.validateNumber, name: svt.validateString, full_name: svt.validateString, private: svt.validateBoolean, fork: svt.validateBoolean, created_at: svt.validateString, updated_at: svt.validateString, description: svt.validateOptional(svt.validateString), owner: validateOwner, url: svt.validateString, html_url: svt.validateString, language: svt.validateOptional(svt.validateString)}); } export type Pusher = { name: string; email: string; }; export function isPusher(value: unknown): value is Pusher { return svt.isInterface(value, {name: svt.isString, email: svt.isString}); } export function validatePusher(value: unknown): svt.ValidationResult { return svt.validate(value, {name: svt.validateString, email: svt.validateString}); } export type Author = { name: string; email: string; username: string; }; export function isAuthor(value: unknown): value is Author { return svt.isInterface(value, {name: svt.isString, email: svt.isString, username: svt.isString}); } export function validateAuthor(value: unknown): svt.ValidationResult { return svt.validate(value, {name: svt.validateString, email: svt.validateString, username: svt.validateString}); } export type Label = { id: number; url: string; name: string; color: string; default: boolean; description: string; }; export function isLabel(value: unknown): value is Label { return svt.isInterface