SYMBOL INDEX (489 symbols across 139 files) FILE: packages/back-nest/src/app.module.ts class AppModule (line 29) | class AppModule {} FILE: packages/back-nest/src/auth/auth.module.ts class AuthModule (line 24) | class AuthModule {} FILE: packages/back-nest/src/auth/github/github.controller.ts class AuthController (line 16) | class AuthController { method logout (line 18) | async logout(@Req() request: Request, @Res() response: Response) { class GithubAuthController (line 36) | class GithubAuthController { method githubLogin (line 39) | async githubLogin() { method githubCallback (line 45) | async githubCallback( FILE: packages/back-nest/src/auth/github/github.guard.ts class GithubOauthGuard (line 6) | class GithubOauthGuard extends AuthGuard('github') { method getAuthenticateOptions (line 7) | getAuthenticateOptions(context: ExecutionContext): IAuthModuleOptions { method getState (line 15) | getState(request: Request) { FILE: packages/back-nest/src/auth/github/github.strategy.ts class GithubStrategy (line 9) | class GithubStrategy extends PassportStrategy(Strategy, 'github') { method constructor (line 10) | constructor(cfg: ConfigService, private userService: UserService) { method validate (line 23) | async validate( FILE: packages/back-nest/src/challenges/challenges.module.ts class ChallengesModule (line 40) | class ChallengesModule {} FILE: packages/back-nest/src/challenges/commands/calculate-language-runner.ts class CalculateLanguageRunner (line 11) | class CalculateLanguageRunner extends CommandRunner { method constructor (line 12) | constructor( method run (line 19) | async run(): Promise { FILE: packages/back-nest/src/challenges/commands/challenge-import-runner.ts class ChallengeImportRunner (line 14) | class ChallengeImportRunner extends CommandRunner { method constructor (line 15) | constructor( method run (line 23) | async run(): Promise { method syncChallengesFromFile (line 35) | private async syncChallengesFromFile(file: UnsyncedFile) { method parseNodesFromContent (line 49) | private parseNodesFromContent(path: string, base64Content: string) { FILE: packages/back-nest/src/challenges/commands/reformat-challenges-runner.ts class ReformatChallengesRunner (line 12) | class ReformatChallengesRunner extends CommandRunner { method constructor (line 13) | constructor( method run (line 20) | async run(): Promise { FILE: packages/back-nest/src/challenges/commands/unsynced-file-import-runner.ts class UnsyncedFileImportRunner (line 10) | class UnsyncedFileImportRunner extends CommandRunner { method constructor (line 11) | constructor( method run (line 17) | async run(): Promise { FILE: packages/back-nest/src/challenges/entities/challenge.entity.ts class Challenge (line 16) | class Challenge { method fromTSNode (line 36) | static fromTSNode( method getStrippedCode (line 59) | static getStrippedCode(code: string) { FILE: packages/back-nest/src/challenges/entities/language.dto.ts class LanguageDTO (line 3) | class LanguageDTO { FILE: packages/back-nest/src/challenges/entities/unsynced-file.entity.ts class UnsyncedFile (line 13) | class UnsyncedFile { method fromGithubNode (line 28) | static fromGithubNode(project: Project, treeSha: string, node: GithubN... FILE: packages/back-nest/src/challenges/languages.controller.ts class LanguageController (line 6) | class LanguageController { method constructor (line 7) | constructor(private service: ChallengeService) {} method getLeaderboard (line 9) | getLeaderboard(): Promise { FILE: packages/back-nest/src/challenges/services/challenge.service.ts class ChallengeService (line 8) | class ChallengeService { method constructor (line 13) | constructor( method upsert (line 18) | async upsert(challenges: Challenge[]): Promise { method getRandom (line 25) | async getRandom(language?: string): Promise { method getLanguages (line 44) | async getLanguages(): Promise { method getLanguageName (line 63) | private getLanguageName(language: string): string { FILE: packages/back-nest/src/challenges/services/literal.service.ts class LiteralService (line 4) | class LiteralService { method calculateLiterals (line 5) | calculateLiterals(code: string) { FILE: packages/back-nest/src/challenges/services/parser.service.ts class ParserService (line 7) | class ParserService { method getParser (line 8) | getParser(language: string) { type NodeTypes (line 14) | enum NodeTypes { class Parser (line 27) | class Parser { method constructor (line 33) | constructor(private ts: TSParser) {} method parseTrackedNodes (line 35) | parseTrackedNodes(content: string) { method filterNodes (line 40) | private filterNodes(root: TSParser.SyntaxNode) { method filterValidNodeTypes (line 50) | private filterValidNodeTypes(node: TSParser.SyntaxNode) { method filterLongNodes (line 70) | private filterLongNodes(node: TSParser.SyntaxNode) { method filterShortNodes (line 74) | private filterShortNodes(node: TSParser.SyntaxNode) { method filterTooManyLines (line 78) | private filterTooManyLines(node: TSParser.SyntaxNode) { method filterTooLongLines (line 83) | private filterTooLongLines(node: TSParser.SyntaxNode) { function removeDuplicateNewLines (line 93) | function removeDuplicateNewLines(rawText: string) { function replaceTabsWithSpaces (line 105) | function replaceTabsWithSpaces(rawText: string) { function removeTrailingSpaces (line 111) | function removeTrailingSpaces(rawText: string) { function dedupeInnerSpaces (line 118) | function dedupeInnerSpaces(rawText: string) { function getFormattedText (line 127) | function getFormattedText(rawText: string) { FILE: packages/back-nest/src/challenges/services/ts-parser.factory.ts class InvalidLanguage (line 37) | class InvalidLanguage extends Error { method constructor (line 38) | constructor(language: string) { FILE: packages/back-nest/src/challenges/services/unsynced-file-filterer.ts class UnsyncedFileFilterer (line 6) | class UnsyncedFileFilterer { method filter (line 7) | filter(nodes: GithubNode[]) { function isBlobNode (line 15) | function isBlobNode(node: GithubNode) { function hasTrackedFileExt (line 19) | function hasTrackedFileExt(node: GithubNode) { function isNotExcludedPath (line 31) | function isNotExcludedPath(node: GithubNode) { FILE: packages/back-nest/src/challenges/services/unsynced-file-importer.ts class UnsyncedFileImporter (line 9) | class UnsyncedFileImporter { method constructor (line 10) | constructor( method import (line 15) | async import(project: Project) { FILE: packages/back-nest/src/challenges/services/unsynced-file.service.ts class UnsyncedFileService (line 7) | class UnsyncedFileService { method constructor (line 12) | constructor( method bulkUpsert (line 17) | async bulkUpsert(files: UnsyncedFile[]): Promise { method findAllWithProject (line 21) | async findAllWithProject(): Promise { method remove (line 30) | async remove(files: UnsyncedFile[]): Promise { FILE: packages/back-nest/src/commands.ts function runCommand (line 4) | async function runCommand() { FILE: packages/back-nest/src/connectors/github/github.module.ts class GithubConnectorModule (line 11) | class GithubConnectorModule {} FILE: packages/back-nest/src/connectors/github/schemas/github-blob.dto.ts type GithubBlobEncoding (line 3) | enum GithubBlobEncoding { class GithubBlob (line 7) | class GithubBlob { FILE: packages/back-nest/src/connectors/github/schemas/github-repository.dto.ts class GithubLicense (line 3) | class GithubLicense { class GithubOwner (line 8) | class GithubOwner { class GithubRepository (line 19) | class GithubRepository { FILE: packages/back-nest/src/connectors/github/schemas/github-tree.dto.ts type GithubNodeType (line 3) | enum GithubNodeType { class GithubNode (line 8) | class GithubNode { class GithubTree (line 23) | class GithubTree { FILE: packages/back-nest/src/connectors/github/services/github-api.ts class GithubAPI (line 12) | class GithubAPI { method constructor (line 22) | constructor(private readonly http: HttpService, cfg: ConfigService) { method getBlobPermaLink (line 26) | static getBlobPermaLink( method get (line 41) | private async get(url: string) { method logRateLimit (line 53) | private logRateLimit(resp: AxiosResponse) { method fetchRepository (line 62) | async fetchRepository(fullName: string): Promise { method fetchTree (line 69) | async fetchTree(fullName: string, sha: string): Promise { method fetchBlob (line 79) | async fetchBlob(fullName: string, sha: string): Promise { function getGithubAccessToken (line 90) | function getGithubAccessToken(cfg: ConfigService) { FILE: packages/back-nest/src/filters/exception.filter.ts type ErrorResponse (line 10) | interface ErrorResponse { class AllExceptionsFilter (line 16) | class AllExceptionsFilter implements ExceptionFilter { method catch (line 17) | catch(exception: any, host: ArgumentsHost) { FILE: packages/back-nest/src/main.ts function runServer (line 15) | async function runServer() { FILE: packages/back-nest/src/middlewares/guest-user.ts function guestUserMiddleware (line 4) | function guestUserMiddleware( FILE: packages/back-nest/src/projects/commands/import-untracked-projects-runner.ts class ImportUntrackedProjectsRunner (line 11) | class ImportUntrackedProjectsRunner extends CommandRunner { method constructor (line 12) | constructor( method run (line 19) | async run(): Promise { FILE: packages/back-nest/src/projects/commands/sync-untracked-projects-runner.ts class SyncUntrackedProjectsRunner (line 12) | class SyncUntrackedProjectsRunner extends CommandRunner { method constructor (line 13) | constructor( method run (line 20) | async run(): Promise { FILE: packages/back-nest/src/projects/entities/project.entity.ts class Project (line 7) | class Project { method fromGithubRepository (line 31) | static fromGithubRepository( FILE: packages/back-nest/src/projects/entities/untracked-project.entity.ts class UntrackedProject (line 4) | class UntrackedProject { FILE: packages/back-nest/src/projects/project.controller.ts class ProjectController (line 5) | class ProjectController { method constructor (line 6) | constructor(private projectService: ProjectService) {} method getLeaderboard (line 8) | getLeaderboard(): Promise { FILE: packages/back-nest/src/projects/projects.module.ts class ProjectsModule (line 28) | class ProjectsModule {} FILE: packages/back-nest/src/projects/services/project.service.ts class ProjectService (line 7) | class ProjectService { method constructor (line 8) | constructor( method bulkUpsert (line 13) | async bulkUpsert(projects: Project[]): Promise { method findByFullName (line 17) | async findByFullName(fullName: string) { method updateSyncedSha (line 24) | async updateSyncedSha(id: string, syncedSha: string) { method findAll (line 33) | async findAll(): Promise { method getLanguages (line 38) | async getLanguages(): Promise { FILE: packages/back-nest/src/projects/services/projects-from-file-reader.ts class ProjectsFromFileReader (line 6) | class ProjectsFromFileReader { method readProjects (line 8) | async *readProjects() { function validateProjectName (line 21) | function validateProjectName(slug: string) { FILE: packages/back-nest/src/projects/services/untracked-projects.service.ts class UntrackedProjectService (line 7) | class UntrackedProjectService { method constructor (line 8) | constructor( method bulkUpsert (line 13) | async bulkUpsert(names: string[]): Promise { method remove (line 18) | async remove(untrackedProjects: UntrackedProject[]): Promise { method findAll (line 22) | async findAll(): Promise { FILE: packages/back-nest/src/races/entities/race-settings.dto.ts class RaceSettingsDTO (line 3) | class RaceSettingsDTO { FILE: packages/back-nest/src/races/race.controllers.ts class RacesController (line 13) | class RacesController { method constructor (line 14) | constructor(private raceManager: RaceManager) {} method getRaces (line 16) | getRaces(): PublicRace[] { method getOnlineCount (line 21) | getOnlineCount(): { online: number } { method toggleOnlineState (line 29) | toggleOnlineState(@Req() request: Request): { isPublic: boolean } { method getRaceStatus (line 43) | getRaceStatus( FILE: packages/back-nest/src/races/race.exceptions.ts function getSocketFromArgs (line 10) | function getSocketFromArgs(host: ArgumentsHost): Socket { class RaceDoesNotExistFilter (line 20) | class RaceDoesNotExistFilter extends BaseWsExceptionFilter { method constructor (line 23) | constructor() { method catch (line 29) | async catch(error: RaceDoesNotExist, host: ArgumentsHost) { class InvalidKeystrokeFilter (line 37) | class InvalidKeystrokeFilter extends BaseWsExceptionFilter { method catch (line 38) | async catch(error: InvalidKeystrokeException) { FILE: packages/back-nest/src/races/race.gateway.ts class RaceGateway (line 23) | class RaceGateway { method constructor (line 27) | constructor( method afterInit (line 36) | afterInit(server: Server) { method handleDisconnect (line 41) | handleDisconnect(socket: Socket) { method handleConnection (line 52) | async handleConnection(socket: Socket) { method onRefreshChallenge (line 100) | async onRefreshChallenge(socket: Socket, settings: RaceSettingsDTO) { method onPlay (line 120) | async onPlay(socket: Socket, settings: RaceSettingsDTO) { method onKeyStroke (line 135) | async onKeyStroke(socket: Socket, keystroke: KeystrokeDTO) { method onJoin (line 142) | async onJoin(socket: Socket, id: string) { method onStart (line 165) | async onStart(socket: Socket) { FILE: packages/back-nest/src/races/races.module.ts class RacesModule (line 34) | class RacesModule {} FILE: packages/back-nest/src/races/services/add-keystroke.service.ts class AddKeyStrokeService (line 13) | class AddKeyStrokeService { method constructor (line 14) | constructor( method validate (line 24) | validate(socket: Socket, keyStroke: KeystrokeDTO) { method addKeyStroke (line 31) | async addKeyStroke(socket: Socket, keyStroke: KeystrokeDTO) { method syncStartTime (line 50) | async syncStartTime(raceId: string, timestamp: Date) { FILE: packages/back-nest/src/races/services/countdown.service.ts class CountdownService (line 6) | class CountdownService { method constructor (line 7) | constructor(private raceEvents: RaceEvents) {} method countdown (line 8) | async countdown(race: Race) { FILE: packages/back-nest/src/races/services/keystroke-validator.service.ts class InvalidKeystrokeException (line 7) | class InvalidKeystrokeException extends Error { method constructor (line 13) | constructor( class RaceNotStartedException (line 29) | class RaceNotStartedException extends BadRequestException { method constructor (line 30) | constructor() { function getCurrentInputBeforeKeystroke (line 35) | function getCurrentInputBeforeKeystroke( class KeyStrokeValidationService (line 48) | class KeyStrokeValidationService { method constructor (line 49) | constructor(private raceManager: RaceManager) {} method validateKeyStroke (line 51) | validateKeyStroke(player: RacePlayer, recentKeyStroke: KeystrokeDTO) { method validateRaceStarted (line 71) | validateRaceStarted(raceID: string) { method getStrippedCode (line 78) | private getStrippedCode(raceId: string, keystroke: KeystrokeDTO) { FILE: packages/back-nest/src/races/services/locker.service.ts class Locker (line 4) | class Locker { method constructor (line 6) | constructor() { method runIfOpen (line 13) | async runIfOpen(lockID: string, callback: () => Promise): Promis... method release (line 25) | release(id: string) { FILE: packages/back-nest/src/races/services/progress.service.ts class ProgressService (line 7) | class ProgressService { method constructor (line 8) | constructor(private raceManager: RaceManager) {} method calculateProgress (line 9) | calculateProgress(player: RacePlayer) { FILE: packages/back-nest/src/races/services/race-events.service.ts class RaceEvents (line 9) | class RaceEvents { method getPlayerCount (line 12) | getPlayerCount() { method createdRace (line 16) | createdRace(socket: Socket, race: Race) { method countdown (line 22) | countdown(raceID: string, i: number) { method raceStarted (line 27) | raceStarted(race: Race) { method updatedRace (line 31) | updatedRace(_: Socket, race: Race) { method joinedRace (line 36) | joinedRace(socket: Socket, race: Race, user: User) { method leftRace (line 42) | leftRace(race: Race, user: User) { method progressUpdated (line 49) | progressUpdated(socket: Socket, raceId: string, player: RacePlayer) { method raceCompleted (line 54) | raceCompleted(raceId: string, result: Result) { method raceDoesNotExist (line 58) | raceDoesNotExist(socket: Socket, id: string) { method logConnectedSockets (line 61) | async logConnectedSockets() { FILE: packages/back-nest/src/races/services/race-manager.service.ts type PublicRace (line 11) | interface PublicRace { class RaceManager (line 18) | class RaceManager { method constructor (line 21) | constructor( method getOnlineCount (line 27) | getOnlineCount(): number { method getPublicRaces (line 35) | getPublicRaces(): PublicRace[] { method syncUser (line 45) | syncUser(raceId: string, prevUserId: string, user: User) { method debugSize (line 57) | debugSize(msg: string) { method create (line 65) | async create(user: User, settings: RaceSettingsDTO): Promise { method refresh (line 75) | async refresh(id: string, language?: string): Promise { method getRace (line 86) | getRace(id: string): Race { method getPlayer (line 92) | getPlayer(raceId: string, userId: string): RacePlayer { method getChallenge (line 97) | getChallenge(raceId: string): Challenge { method getCode (line 103) | getCode(raceId: string): string { method join (line 107) | join(user: User, raceId: string): Race | null { method leaveRace (line 121) | leaveRace(user: User, raceId: string) { method isOwner (line 133) | isOwner(userId: string, raceId: string): boolean { method userIsAlreadyPlaying (line 139) | userIsAlreadyPlaying(userId: string): boolean { class RaceDoesNotExist (line 146) | class RaceDoesNotExist extends BadRequestException { method constructor (line 148) | constructor(id: string) { FILE: packages/back-nest/src/races/services/race-player.service.ts class KeystrokeDTO (line 12) | class KeystrokeDTO { class RacePlayer (line 28) | class RacePlayer { method toJSON (line 54) | toJSON() { method reset (line 58) | reset(literals: string[]) { method validKeyStrokes (line 67) | validKeyStrokes() { method incorrectKeyStrokes (line 87) | incorrectKeyStrokes() { method getValidInput (line 94) | getValidInput() { method addKeyStroke (line 101) | addKeyStroke(keyStroke: KeystrokeDTO) { method updateLiteral (line 106) | updateLiteral(code: string, keyStroke: KeystrokeDTO) { method hasNotStartedTyping (line 119) | hasNotStartedTyping(): boolean { method hasCompletedRace (line 123) | hasCompletedRace(): boolean { method fromUser (line 127) | static fromUser(raceId: string, user: User, literals: string[]) { FILE: packages/back-nest/src/races/services/race.service.ts type PublicRace (line 7) | interface PublicRace { class Race (line 13) | class Race { method togglePublic (line 31) | togglePublic(): boolean { method toPublic (line 35) | toPublic(): PublicRace { method isMultiplayer (line 45) | isMultiplayer(): boolean { method toJSON (line 49) | toJSON() { method constructor (line 53) | constructor(owner: User, challenge: Challenge, literals: string[]) { method start (line 65) | start() { method canStartRace (line 69) | canStartRace(userID: string): boolean { method getPlayer (line 73) | getPlayer(id: string) { method resetProgress (line 77) | resetProgress() { method addMember (line 89) | addMember(user: User) { method removeMember (line 93) | removeMember(user: User) { FILE: packages/back-nest/src/races/services/results-handler.service.ts class ResultsHandlerService (line 10) | class ResultsHandlerService { method constructor (line 11) | constructor( method handleResult (line 17) | async handleResult(race: Race, user: User) { FILE: packages/back-nest/src/races/services/session-state.service.ts class SessionState (line 6) | class SessionState { method getUser (line 7) | getUser(socket: Socket): User { method getRaceID (line 11) | getRaceID(socket: Socket): string { method saveRaceID (line 15) | saveRaceID(socket: Socket, id: string) { method removeRaceID (line 23) | removeRaceID(socket: Socket) { FILE: packages/back-nest/src/results/entities/leaderboard-result.dto.ts class LeaderBoardResult (line 1) | class LeaderBoardResult { FILE: packages/back-nest/src/results/entities/result.entity.ts class Result (line 12) | class Result { FILE: packages/back-nest/src/results/errors.ts class SaveResultAnonymousNotAllowed (line 3) | class SaveResultAnonymousNotAllowed extends ForbiddenException { method constructor (line 4) | constructor() { class SaveResultInvalidUserID (line 9) | class SaveResultInvalidUserID extends ForbiddenException { method constructor (line 10) | constructor() { class SaveResultRaceNotCompleted (line 15) | class SaveResultRaceNotCompleted extends BadRequestException { method constructor (line 16) | constructor() { class SaveResultUserNotInRace (line 21) | class SaveResultUserNotInRace extends BadRequestException { method constructor (line 22) | constructor() { FILE: packages/back-nest/src/results/results.controller.ts class ResultsController (line 15) | class ResultsController { method constructor (line 17) | constructor(private resultsService: ResultService) {} method getLeaderboard (line 19) | async getLeaderboard(): Promise { method getStatsByUser (line 32) | async getStatsByUser(@Req() request: Request) { method getResultByID (line 60) | getResultByID(@Param('resultId') resultId: string) { FILE: packages/back-nest/src/results/results.module.ts class ResultsModule (line 15) | class ResultsModule {} FILE: packages/back-nest/src/results/services/result-calculation.service.ts class ResultCalculationService (line 7) | class ResultCalculationService { method getTimeMS (line 8) | getTimeMS(race: Race, player: RacePlayer): number { method getCPM (line 15) | getCPM(code: string, timeMS: number): number { method getMistakesCount (line 23) | getMistakesCount(player: RacePlayer): number { method getAccuracy (line 27) | getAccuracy(player: RacePlayer): number { FILE: packages/back-nest/src/results/services/result-factory.service.ts class ResultFactoryService (line 9) | class ResultFactoryService { method constructor (line 10) | constructor(private resultCalculation: ResultCalculationService) {} method factory (line 11) | factory(race: Race, player: RacePlayer, user: User): Result { FILE: packages/back-nest/src/results/services/results.service.ts class ResultService (line 8) | class ResultService { method constructor (line 9) | constructor( method create (line 14) | async create(result: Result): Promise { method upsertByLegacyId (line 18) | async upsertByLegacyId(results: Result[]): Promise { method getByID (line 22) | async getByID(id: string) { method getLeaderboard (line 35) | async getLeaderboard(): Promise { method getAverageCPM (line 80) | async getAverageCPM(userId: string, take: number): Promise { method getAverageCPMSince (line 96) | async getAverageCPMSince(userId: string, since: Date): Promise { method getResultPercentile (line 108) | async getResultPercentile(cpm: number): Promise { FILE: packages/back-nest/src/seeder/commands/challenge.seeder.ts class ProjectSeedRunner (line 12) | class ProjectSeedRunner extends CommandRunner { method constructor (line 13) | constructor( method run (line 19) | async run(): Promise { method project_factory (line 26) | project_factory() { method challenges_factory (line 41) | challenges_factory(project: Project) { FILE: packages/back-nest/src/seeder/seeder.module.ts class SeederModule (line 10) | class SeederModule {} FILE: packages/back-nest/src/sessions/session.adapter.ts type SocketIOCompatibleMiddleware (line 7) | type SocketIOCompatibleMiddleware = ( function makeSocketIOReadMiddleware (line 13) | function makeSocketIOReadMiddleware( class SessionAdapter (line 38) | class SessionAdapter extends IoAdapter { method constructor (line 39) | constructor( method createIOServer (line 46) | createIOServer(port: number, opt?: any): any { FILE: packages/back-nest/src/sessions/session.entity.ts class Session (line 11) | class Session implements ISession { FILE: packages/back-nest/src/sessions/session.middleware.ts constant SESSION_SECRET_MIN_LENGTH (line 6) | const SESSION_SECRET_MIN_LENGTH = 12; constant ONE_DAY (line 8) | const ONE_DAY = 1000 * 60 * 60 * 24; function getSessionSecret (line 36) | function getSessionSecret() { FILE: packages/back-nest/src/sessions/types.d.ts type SessionData (line 5) | interface SessionData { type IncomingMessage (line 12) | interface IncomingMessage { FILE: packages/back-nest/src/tracking/entities/event.entity.ts type TrackingEventType (line 3) | enum TrackingEventType { class TrackingEvent (line 10) | class TrackingEvent { FILE: packages/back-nest/src/tracking/tracking.module.ts class TrackingModule (line 12) | class TrackingModule {} FILE: packages/back-nest/src/tracking/tracking.service.ts class TrackingService (line 7) | class TrackingService { method constructor (line 8) | constructor( method trackRaceStarted (line 13) | async trackRaceStarted(): Promise { method trackRaceCompleted (line 17) | async trackRaceCompleted(): Promise { method trackRaceEvent (line 21) | private async trackRaceEvent( FILE: packages/back-nest/src/users/controllers/user.controller.ts class UserController (line 6) | class UserController { method getCurrentUser (line 8) | getCurrentUser(@Req() request: Request): User { FILE: packages/back-nest/src/users/entities/upsertGithubUserDTO.ts class UpsertGithubUserDTO (line 5) | class UpsertGithubUserDTO { method fromGithubProfile (line 15) | static fromGithubProfile(profile: Profile) { method toUser (line 23) | toUser() { FILE: packages/back-nest/src/users/entities/user.entity.ts class User (line 13) | class User { method generateAnonymousUser (line 37) | static generateAnonymousUser() { FILE: packages/back-nest/src/users/services/user.service.ts class UserService (line 7) | class UserService { method constructor (line 8) | constructor( method upsertGithubUser (line 13) | async upsertGithubUser(userData: User): Promise { method findByLegacyID (line 24) | async findByLegacyID(legacyId: string) { FILE: packages/back-nest/src/users/users.module.ts class UsersModule (line 13) | class UsersModule {} FILE: packages/back-nest/src/utils/validateDTO.ts class ValidationErrorContainer (line 5) | class ValidationErrorContainer extends TypeError { method constructor (line 7) | constructor(name: string, errors: ValidationError[]) { FILE: packages/webapp-next/Socket.ts class Socket (line 3) | class Socket { method constructor (line 6) | constructor(serverUrl: string) { FILE: packages/webapp-next/common/api/races.ts constant RACE_STATUS_API (line 5) | const RACE_STATUS_API = "/api/races/:id/status"; constant ONLINE_COUNT_API (line 14) | const ONLINE_COUNT_API = serverUrl + "/api/races/online"; FILE: packages/webapp-next/common/api/types.ts type ServerSideContext (line 4) | type ServerSideContext = GetServerSidePropsContext< FILE: packages/webapp-next/common/api/user.ts constant USER_API (line 6) | const USER_API = "/api/user"; FILE: packages/webapp-next/common/components/Avatar.tsx type AvatarProps (line 4) | interface AvatarProps { FILE: packages/webapp-next/common/components/BattleMatcher.tsx type BatteListItemProps (line 43) | interface BatteListItemProps { type BattleMatcherModalProps (line 87) | interface BattleMatcherModalProps { FILE: packages/webapp-next/common/components/Button.tsx type ButtonColor (line 3) | type ButtonColor = "primary" | "secondary" | "invisible"; type ButtonProps (line 5) | interface ButtonProps extends ButtonHTMLAttributes { function getColorStyles (line 59) | function getColorStyles(color: ButtonColor) { FILE: packages/webapp-next/common/components/Footer.tsx function useStargazersCount (line 11) | function useStargazersCount() { function KeybindInfo (line 21) | function KeybindInfo() { function Footer (line 29) | function Footer() { FILE: packages/webapp-next/common/components/Footer/YoutubeLink.tsx constant YOUTUBE_LINK_STORAGE_KEY (line 16) | const YOUTUBE_LINK_STORAGE_KEY = "youtube-link"; FILE: packages/webapp-next/common/components/Layout.tsx type LayoutProps (line 4) | interface LayoutProps { type ContainerProps (line 8) | interface ContainerProps { function Container (line 13) | function Container({ children, centered }: ContainerProps) { function Layout (line 26) | function Layout({ children }: LayoutProps) { FILE: packages/webapp-next/common/components/Overlay.tsx type OverlayProps (line 3) | interface OverlayProps { FILE: packages/webapp-next/common/components/buttons/GithubLoginButton.tsx type GithubLoginButtonProps (line 4) | interface GithubLoginButtonProps { FILE: packages/webapp-next/common/components/buttons/ModalCloseButton.tsx type ModalButtonCloseProps (line 1) | interface ModalButtonCloseProps { function ModalCloseButton (line 5) | function ModalCloseButton({ FILE: packages/webapp-next/common/components/modals/GithubModal.tsx type GithubModalProps (line 3) | interface GithubModalProps { function GithubModal (line 7) | function GithubModal({ children }: GithubModalProps) { FILE: packages/webapp-next/common/components/modals/Modal.tsx type ModalProps (line 3) | interface ModalProps { function Modal (line 7) | function Modal({ children }: ModalProps) { FILE: packages/webapp-next/common/components/modals/ProfileModal.tsx type ProfileModalProps (line 8) | interface ProfileModalProps { function ProfileModal (line 12) | function ProfileModal({ closeModal }: ProfileModalProps) { type ProfileItemProps (line 38) | interface ProfileItemProps { function ProfileItem (line 43) | function ProfileItem({ children, onClick }: ProfileItemProps) { FILE: packages/webapp-next/common/components/overlays/GithubLoginOverlay.tsx type GithubLoginOverlayProps (line 9) | interface GithubLoginOverlayProps { FILE: packages/webapp-next/common/components/overlays/SettingsOverlay.tsx type SettingsOverlayProps (line 16) | interface SettingsOverlayProps { FILE: packages/webapp-next/common/github/stargazers.ts function getStargazersCount (line 5) | async function getStargazersCount() { function fetchStargazersCount (line 11) | async function fetchStargazersCount() { function shouldRefreshCache (line 27) | function shouldRefreshCache() { FILE: packages/webapp-next/common/hooks/useSocket.ts function useSocket (line 6) | function useSocket() { FILE: packages/webapp-next/common/services/Socket.ts class SocketLatest (line 3) | class SocketLatest { method constructor (line 6) | constructor(serverUrl: string) { method disconnect (line 19) | disconnect() { method subscribe (line 23) | subscribe(event: string, cb: (error: string | null, msg: any) => void) { method emit (line 30) | emit(event: string, data?: any) { FILE: packages/webapp-next/common/state/user-store.ts type User (line 5) | interface User { FILE: packages/webapp-next/common/utils/clipboard.ts function copyToClipboard (line 3) | function copyToClipboard(url: string, message: string) { FILE: packages/webapp-next/common/utils/cpmToWPM.ts function cpmToWPM (line 1) | function cpmToWPM(cpm: number) { FILE: packages/webapp-next/common/utils/getServerUrl.ts function getSiteRoot (line 3) | function getSiteRoot() { function getServerUrl (line 7) | function getServerUrl() { function getExperimentalServerUrl (line 11) | function getExperimentalServerUrl() { FILE: packages/webapp-next/common/utils/toHumanReadableTime.ts constant MINUTES_IN_SECONDS (line 1) | const MINUTES_IN_SECONDS = 60; constant HOURS_IN_SECONDS (line 3) | const HOURS_IN_SECONDS = MINUTES_IN_SECONDS * 60; constant DAYS_IN_SECONDS (line 5) | const DAYS_IN_SECONDS = HOURS_IN_SECONDS * 24; FILE: packages/webapp-next/hooks/useKeyMap.ts type Keys (line 3) | enum Keys { FILE: packages/webapp-next/modules/play2/components/CodeArea.tsx type CodeAreaProps (line 5) | interface CodeAreaProps { function CodeArea (line 12) | function CodeArea({ function CodeAreaHeader (line 48) | function CodeAreaHeader({ filePath }: { filePath: string }) { FILE: packages/webapp-next/modules/play2/components/HiddenCodeInput.tsx type HiddenCodeInputProps (line 13) | interface HiddenCodeInputProps { function handleOnChange (line 60) | function handleOnChange(e: ChangeEvent) { function preventClick (line 106) | function preventClick(e: MouseEvent) { function preventPaste (line 110) | function preventPaste(e: ClipboardEvent) { function preventArrowKeys (line 114) | function preventArrowKeys(e: KeyboardEvent) { type ArrowKey (line 124) | enum ArrowKey { FILE: packages/webapp-next/modules/play2/components/IncorrectChars.tsx function isOnlySpace (line 3) | function isOnlySpace(str: string) { function IncorrectChars (line 7) | function IncorrectChars() { function parseIncorrectCharGroups (line 30) | function parseIncorrectCharGroups(incorrectChars: string) { FILE: packages/webapp-next/modules/play2/components/NextChar.tsx type NextCharProps (line 11) | interface NextCharProps { function NextChar (line 15) | function NextChar({ focused }: NextCharProps) { FILE: packages/webapp-next/modules/play2/components/RaceSettings.tsx type ToggleSelectorProps (line 108) | interface ToggleSelectorProps { FILE: packages/webapp-next/modules/play2/components/ResultsChart.tsx function ResultsChart (line 75) | function ResultsChart() { FILE: packages/webapp-next/modules/play2/components/SmoothCaret.tsx constant SMOOTH_CARET_ELEMENT_ID (line 10) | const SMOOTH_CARET_ELEMENT_ID = "smooth-caret-element"; constant PRIMARY_PINK_COLOR (line 12) | const PRIMARY_PINK_COLOR = "#d6bcfa"; constant OFF_WHITE_COLOR (line 14) | const OFF_WHITE_COLOR = "#374151"; function useAnimator (line 74) | function useAnimator() { class Animator (line 80) | class Animator { method constructor (line 82) | constructor(private elementId: string) { method getElement (line 86) | private getElement() { method elementInStarterPosition (line 94) | private elementInStarterPosition(element: HTMLElement) { method animate (line 100) | animate(rect: { left: number; top: number }) { FILE: packages/webapp-next/modules/play2/components/TweetResult.tsx type TweetResultProps (line 6) | interface TweetResultProps { FILE: packages/webapp-next/modules/play2/components/TypedChars.tsx type TypedCharsProps (line 7) | interface TypedCharsProps { function TypedChars (line 11) | function TypedChars({ language }: TypedCharsProps) { FILE: packages/webapp-next/modules/play2/components/UntypedChars.tsx function UntypedChars (line 2) | function UntypedChars() { FILE: packages/webapp-next/modules/play2/components/leaderboard/Leaderboard.tsx type WPMLeaderboardProps (line 115) | interface WPMLeaderboardProps { type LeaderboardRowWPMProps (line 187) | interface LeaderboardRowWPMProps { type LeaderboardRowActivityProps (line 211) | interface LeaderboardRowActivityProps { type Leaderboards (line 233) | type Leaderboards = "wpm" | "activity"; type LeaderboardSelectorProps (line 235) | interface LeaderboardSelectorProps { FILE: packages/webapp-next/modules/play2/components/play-footer/ChallengeSource/ChallengeSource.tsx type ChallengeSourceProps (line 12) | interface ChallengeSourceProps { FILE: packages/webapp-next/modules/play2/components/play-footer/PlayFooter/PlayFooter.tsx type PlayFooterProps (line 34) | interface PlayFooterProps { function useCodeStoreTotalSeconds (line 38) | function useCodeStoreTotalSeconds() { function useMistakeWarningMessage (line 49) | function useMistakeWarningMessage() { function WarningContainer (line 55) | function WarningContainer() { function PlayFooter (line 100) | function PlayFooter({ challenge }: PlayFooterProps) { type ActionButtonProps (line 165) | interface ActionButtonProps extends ButtonHTMLAttributes(): [ FILE: packages/webapp-next/modules/play2/hooks/useGameIdQueryParam.ts function useInitialRaceIdQueryParam (line 3) | function useInitialRaceIdQueryParam(): string | undefined { FILE: packages/webapp-next/modules/play2/hooks/useNodeRect.ts type IRect (line 3) | interface IRect { function useNodeRect (line 8) | function useNodeRect( FILE: packages/webapp-next/modules/play2/hooks/useResetStateOnUnmount.ts function useResetStateOnUnmount (line 4) | function useResetStateOnUnmount() { FILE: packages/webapp-next/modules/play2/services/Game.ts class Game (line 8) | class Game { method onConnect (line 10) | onConnect(raceId?: string) { method constructor (line 40) | constructor(private socket: SocketLatest, raceId?: string) { method reconnect (line 46) | reconnect() { method id (line 52) | get id() { method start (line 56) | start() { method sendKeyStroke (line 60) | sendKeyStroke(keyStroke: KeyStroke) { method next (line 64) | next() { method join (line 76) | join(id: string) { method play (line 80) | play() { method listenForRaceStarted (line 87) | private listenForRaceStarted() { method listenForRaceJoined (line 100) | private listenForRaceJoined() { method listenForCountdown (line 118) | private listenForCountdown() { method listenForMemberJoined (line 127) | private listenForMemberJoined() { method listenForMemberLeft (line 134) | private listenForMemberLeft() { method listenForProgressUpdated (line 148) | private listenForProgressUpdated() { method listenForRaceCompleted (line 154) | private listenForRaceCompleted() { method updateMemberInState (line 173) | private updateMemberInState(member: RacePlayer) { method listenForRaceDoesNotExist (line 184) | private listenForRaceDoesNotExist() { method listenForDisconnect (line 194) | private listenForDisconnect() { method initializeConnectedState (line 204) | private initializeConnectedState(socket: SocketLatest) { FILE: packages/webapp-next/modules/play2/state/code-store.ts type KeyStroke (line 4) | interface KeyStroke { type CodeState (line 11) | interface CodeState { type TrackedKeys (line 250) | enum TrackedKeys { function isLineBreak (line 254) | function isLineBreak(key: string) { function parseKey (line 258) | function parseKey(key: string) { function isSkippable (line 267) | function isSkippable(key: string) { FILE: packages/webapp-next/modules/play2/state/connection-store.ts type ConnectionState (line 8) | interface ConnectionState { FILE: packages/webapp-next/modules/play2/state/game-store.ts type GameState (line 7) | interface GameState { type RacePlayer (line 17) | interface RacePlayer { type RaceResult (line 24) | interface RaceResult { FILE: packages/webapp-next/modules/play2/state/settings-store.ts type LanguageDTO (line 4) | interface LanguageDTO { type SettingsState (line 9) | interface SettingsState { constant SYNTAX_HIGHLIGHTING_KEY (line 23) | const SYNTAX_HIGHLIGHTING_KEY = "syntaxHighlighting"; constant SMOOTH_CARET_KEY (line 25) | const SMOOTH_CARET_KEY = "smoothCaret"; constant DEFAULT_RACE_IS_PUBLIC_KEY (line 27) | const DEFAULT_RACE_IS_PUBLIC_KEY = "defaultRaceIsPublic2"; constant LANGUAGE_KEY (line 29) | const LANGUAGE_KEY = "language"; function getInitialToggleStateFromLocalStorage (line 31) | function getInitialToggleStateFromLocalStorage( function getInitialLanguageFromLocalStorage (line 46) | function getInitialLanguageFromLocalStorage(key: string): LanguageDTO | ... FILE: packages/webapp-next/modules/play2/state/trends-store.ts type TrendsState (line 6) | interface TrendsState { FILE: packages/webapp-next/pages/_app.tsx function MyApp (line 13) | function MyApp({ Component, pageProps }: AppProps) { FILE: packages/webapp-next/pages/_document.tsx class MyDocument (line 3) | class MyDocument extends Document { method getInitialProps (line 4) | static async getInitialProps(ctx: any) { method render (line 9) | render() { FILE: packages/webapp-next/pages/index.tsx function Play2Page (line 31) | function Play2Page() { FILE: packages/webapp-next/pages/results/[id].tsx function ResultPage (line 29) | function ResultPage() { function truncateFile (line 145) | function truncateFile(file: string) { FILE: packages/webapp-next/utils/humanize.ts type TimeUnit (line 2) | interface TimeUnit { constant TIME_UNITS (line 6) | const TIME_UNITS: TimeUnit = { function humanizeAbsolute (line 16) | function humanizeAbsolute(when: Date | number) { function humanizeRelative (line 28) | function humanizeRelative(pastMilliseconds: number) {