refactor: make match-collector export its types, and consume them in frontend
All checks were successful
pipeline / lint-and-format (push) Successful in 4m22s
pipeline / build-and-push-images (push) Successful in 2m11s

This commit is contained in:
2026-04-30 00:06:53 +02:00
parent db2ca353c5
commit e1ab81854a
36 changed files with 513 additions and 351 deletions

View File

@@ -1,8 +1,6 @@
import { MongoClient } from 'mongodb'
import {
ItemTree,
GoldAdvantageTag,
PlatformCounts,
treeInit,
treeMerge,
treeCutBranches,
@@ -15,14 +13,27 @@ import { PLATFORM_KEYS } from './platform'
import {
initItemDict as initFirstBackItemDict,
extractFirstBackFromMatch,
groupFirstBacksByItemSet,
FirstBackData,
FirstBackGroup
groupFirstBacksByItemSet
} from './first_back'
import { Match, Timeline, Participant, Frame } from './api'
import type {
Rune,
InternalBuild,
InternalBuildWithStartItems,
InternalLaneData,
InternalChampionData,
FirstBackData
} from './types'
function sameArrays(array1: Array<number>, array2: Array<number>) {
// Type aliases for internal use
type Builds = InternalBuild[]
type Build = InternalBuild
type BuildWithStartItems = InternalBuildWithStartItems
type LaneData = InternalLaneData
type ChampionData = InternalChampionData
function sameArrays(array1: number[], array2: number[]) {
if (array1.length != array2.length) return false
for (const e of array1) {
if (!array2.includes(e)) return false
@@ -55,77 +66,6 @@ function arrayRemovePercentage(
}
}
type Rune = {
count: number
primaryStyle: number
secondaryStyle: number
selections: Array<number>
pickrate?: number
}
type Build = {
runeKeystone: number
runes: Array<Rune>
items: ItemTree
bootsFirstCount: number
bootsFirst?: number
count: number
suppItems: Array<{ data: number; count: number }>
boots: Array<{ data: number; count: number }>
pickrate?: number
// First back data (collected during processing, grouped in finalize)
firstBacksRaw?: FirstBackData[]
firstBacks?: FirstBackGroup[]
}
type BuildWithStartItems = {
runeKeystone: number
runes: Array<Rune>
items: ItemTree
bootsFirst?: number
bootsFirstCount: number
count: number
startItems: Array<{ data: number; count: number }>
suppItems: Array<{ data: number; count: number }>
boots: Array<{ data: number; count: number }>
pickrate?: number
firstBacksRaw?: FirstBackData[]
firstBacks?: FirstBackGroup[]
}
type Builds = Build[]
type Champion = {
id: number
name: string
alias: string
}
type MatchupData = {
championId: number
winrate: number
games: number
championName: string
championAlias: string
}
type LaneData = {
data: string
count: number
winningMatches: number
losingMatches: number
winrate: number
pickrate: number
builds: Builds
matchups?: Array<MatchupData>
summonerSpells: Array<{ id: number; count: number; pickrate?: number }>
// Region distribution for this lane (used for tag derivation)
regionDistribution?: PlatformCounts
}
type ChampionData = {
champion: Champion
winningMatches: number
losingMatches: number
lanes: Array<LaneData>
}
// Helper function to create rune configuration from participant
function createRuneConfiguration(participant: Participant): Rune {
const primaryStyle = participant.perks.styles[0].style