@axiapps/bridge-metrics 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aggregationTypes.cjs +18 -0
- package/dist/aggregationTypes.d.cts +21 -0
- package/dist/aggregationTypes.d.ts +21 -0
- package/dist/aggregationTypes.js +1 -0
- package/dist/boonGeneration.cjs +308 -0
- package/dist/boonGeneration.d.cts +65 -0
- package/dist/boonGeneration.d.ts +65 -0
- package/dist/boonGeneration.js +16 -0
- package/dist/chunk-42DVJJLC.js +106 -0
- package/dist/chunk-4F55Q6K2.js +0 -0
- package/dist/chunk-ELKDB763.js +349 -0
- package/dist/chunk-FU74LJEM.js +77 -0
- package/dist/chunk-J3YCFY3C.js +37 -0
- package/dist/chunk-JP2ZL44R.js +18 -0
- package/dist/chunk-K2SRAMGC.js +0 -0
- package/dist/chunk-KRHODGVU.js +48 -0
- package/dist/chunk-LIGIXSSA.js +1383 -0
- package/dist/chunk-M2WR3JBQ.js +0 -0
- package/dist/chunk-PMVLNDZZ.js +279 -0
- package/dist/chunk-R5EJF5AW.js +147 -0
- package/dist/chunk-RGXSI3AI.js +298 -0
- package/dist/chunk-UFJJ6WLD.js +197 -0
- package/dist/chunk-WW5XFXGC.js +234 -0
- package/dist/chunk-ZFZS7JFU.js +10 -0
- package/dist/combatMetrics.cjs +251 -0
- package/dist/combatMetrics.d.cts +26 -0
- package/dist/combatMetrics.d.ts +26 -0
- package/dist/combatMetrics.js +21 -0
- package/dist/computePlayerAggregation.cjs +2042 -0
- package/dist/computePlayerAggregation.d.cts +249 -0
- package/dist/computePlayerAggregation.d.ts +249 -0
- package/dist/computePlayerAggregation.js +30 -0
- package/dist/conditionsMetrics.cjs +328 -0
- package/dist/conditionsMetrics.d.cts +67 -0
- package/dist/conditionsMetrics.d.ts +67 -0
- package/dist/conditionsMetrics.js +18 -0
- package/dist/constants.cjs +36 -0
- package/dist/constants.d.cts +18 -0
- package/dist/constants.d.ts +18 -0
- package/dist/constants.js +10 -0
- package/dist/dashboardMetrics.cjs +226 -0
- package/dist/dashboardMetrics.d.cts +29 -0
- package/dist/dashboardMetrics.d.ts +29 -0
- package/dist/dashboardMetrics.js +42 -0
- package/dist/dpsReportTypes.cjs +18 -0
- package/dist/dpsReportTypes.d.cts +294 -0
- package/dist/dpsReportTypes.d.ts +294 -0
- package/dist/dpsReportTypes.js +1 -0
- package/dist/index.cjs +2902 -0
- package/dist/index.d.cts +13 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +152 -0
- package/dist/metrics-methods.json +38 -0
- package/dist/metricsSettings.cjs +75 -0
- package/dist/metricsSettings.d.cts +23 -0
- package/dist/metricsSettings.d.ts +23 -0
- package/dist/metricsSettings.js +8 -0
- package/dist/professionUtils.cjs +265 -0
- package/dist/professionUtils.d.cts +10 -0
- package/dist/professionUtils.d.ts +10 -0
- package/dist/professionUtils.js +20 -0
- package/dist/reportMetrics.cjs +224 -0
- package/dist/reportMetrics.d.cts +85 -0
- package/dist/reportMetrics.d.ts +85 -0
- package/dist/reportMetrics.js +12 -0
- package/dist/resUtility.cjs +52 -0
- package/dist/resUtility.d.cts +5 -0
- package/dist/resUtility.d.ts +5 -0
- package/dist/resUtility.js +8 -0
- package/dist/roles.cjs +18 -0
- package/dist/roles.d.cts +17 -0
- package/dist/roles.d.ts +17 -0
- package/dist/roles.js +1 -0
- package/dist/rollup.cjs +378 -0
- package/dist/rollup.d.cts +103 -0
- package/dist/rollup.d.ts +103 -0
- package/dist/rollup.js +16 -0
- package/dist/statsMetrics.cjs +153 -0
- package/dist/statsMetrics.d.cts +39 -0
- package/dist/statsMetrics.d.ts +39 -0
- package/dist/statsMetrics.js +22 -0
- package/dist/timestampUtils.cjs +63 -0
- package/dist/timestampUtils.d.cts +12 -0
- package/dist/timestampUtils.d.ts +12 -0
- package/dist/timestampUtils.js +9 -0
- package/package.json +44 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/reportMetrics.ts
|
|
21
|
+
var reportMetrics_exports = {};
|
|
22
|
+
__export(reportMetrics_exports, {
|
|
23
|
+
ReportSchemaError: () => ReportSchemaError,
|
|
24
|
+
aggregatePlayers: () => aggregatePlayers,
|
|
25
|
+
compareRunSets: () => compareRunSets,
|
|
26
|
+
extractRunSummary: () => extractRunSummary
|
|
27
|
+
});
|
|
28
|
+
module.exports = __toCommonJS(reportMetrics_exports);
|
|
29
|
+
var ReportSchemaError = class extends Error {
|
|
30
|
+
};
|
|
31
|
+
var num = (value) => {
|
|
32
|
+
const n = Number(value ?? 0);
|
|
33
|
+
return Number.isFinite(n) ? n : 0;
|
|
34
|
+
};
|
|
35
|
+
var extractRunSummary = (report) => {
|
|
36
|
+
const payload = report;
|
|
37
|
+
const id = String(payload?.meta?.id ?? "").trim();
|
|
38
|
+
if (!id) throw new ReportSchemaError("report has no meta.id \u2014 not an AxiBridge report.json");
|
|
39
|
+
const stats = payload?.stats ?? {};
|
|
40
|
+
const warnings = [];
|
|
41
|
+
const byAccount = /* @__PURE__ */ new Map();
|
|
42
|
+
const ensure = (row) => {
|
|
43
|
+
const account = String(row?.account ?? "").trim();
|
|
44
|
+
if (!account || account === "Unknown") return null;
|
|
45
|
+
let entry = byAccount.get(account);
|
|
46
|
+
if (!entry) {
|
|
47
|
+
entry = {
|
|
48
|
+
account,
|
|
49
|
+
profession: String(row?.profession ?? "Unknown"),
|
|
50
|
+
professionList: Array.isArray(row?.professionList) ? row.professionList.map(String) : [],
|
|
51
|
+
combatTimeMs: 0,
|
|
52
|
+
squadTimeMs: 0,
|
|
53
|
+
classTimes: [],
|
|
54
|
+
damage: 0,
|
|
55
|
+
downContribution: 0,
|
|
56
|
+
kills: 0,
|
|
57
|
+
downsCaused: 0,
|
|
58
|
+
strips: 0,
|
|
59
|
+
cleanses: 0,
|
|
60
|
+
resurrects: 0,
|
|
61
|
+
healing: 0,
|
|
62
|
+
barrier: 0,
|
|
63
|
+
hasHealAddon: false,
|
|
64
|
+
damageTaken: 0,
|
|
65
|
+
downs: 0,
|
|
66
|
+
deaths: 0,
|
|
67
|
+
logsJoined: 0
|
|
68
|
+
};
|
|
69
|
+
byAccount.set(account, entry);
|
|
70
|
+
}
|
|
71
|
+
return entry;
|
|
72
|
+
};
|
|
73
|
+
const tables = ["offensePlayers", "supportPlayers", "healingPlayers", "defensePlayers", "generalPlayers", "attendanceData"];
|
|
74
|
+
if (!tables.some((key) => Array.isArray(stats?.[key]) && stats[key].length > 0)) {
|
|
75
|
+
warnings.push("no player tables in report");
|
|
76
|
+
}
|
|
77
|
+
for (const row of Array.isArray(stats?.offensePlayers) ? stats.offensePlayers : []) {
|
|
78
|
+
const p = ensure(row);
|
|
79
|
+
if (!p) continue;
|
|
80
|
+
p.damage += num(row?.offenseTotals?.damage);
|
|
81
|
+
p.downContribution += num(row?.offenseTotals?.downContribution);
|
|
82
|
+
p.kills += num(row?.offenseTotals?.killed);
|
|
83
|
+
p.downsCaused += num(row?.offenseTotals?.downed);
|
|
84
|
+
p.strips = Math.max(p.strips, num(row?.offenseTotals?.boonStrips));
|
|
85
|
+
}
|
|
86
|
+
for (const row of Array.isArray(stats?.supportPlayers) ? stats.supportPlayers : []) {
|
|
87
|
+
const p = ensure(row);
|
|
88
|
+
if (!p) continue;
|
|
89
|
+
p.cleanses += num(row?.supportTotals?.condiCleanse);
|
|
90
|
+
p.strips = Math.max(p.strips, num(row?.supportTotals?.boonStrips));
|
|
91
|
+
p.resurrects += num(row?.supportTotals?.resurrects);
|
|
92
|
+
p.logsJoined = Math.max(p.logsJoined, num(row?.logsJoined));
|
|
93
|
+
}
|
|
94
|
+
for (const row of Array.isArray(stats?.healingPlayers) ? stats.healingPlayers : []) {
|
|
95
|
+
const p = ensure(row);
|
|
96
|
+
if (!p) continue;
|
|
97
|
+
p.healing += num(row?.healingTotals?.squadHealing ?? row?.healingTotals?.healing);
|
|
98
|
+
p.barrier += num(row?.healingTotals?.squadBarrier ?? row?.healingTotals?.barrier);
|
|
99
|
+
if (row?.hasHealAddon === true) p.hasHealAddon = true;
|
|
100
|
+
}
|
|
101
|
+
for (const row of Array.isArray(stats?.defensePlayers) ? stats.defensePlayers : []) {
|
|
102
|
+
const p = ensure(row);
|
|
103
|
+
if (!p) continue;
|
|
104
|
+
p.damageTaken += num(row?.defenseTotals?.damageTaken);
|
|
105
|
+
p.downs += num(row?.defenseTotals?.downCount);
|
|
106
|
+
p.deaths += num(row?.defenseTotals?.deadCount);
|
|
107
|
+
}
|
|
108
|
+
for (const row of Array.isArray(stats?.generalPlayers) ? stats.generalPlayers : []) {
|
|
109
|
+
const p = ensure(row);
|
|
110
|
+
if (!p) continue;
|
|
111
|
+
p.combatTimeMs = Math.max(p.combatTimeMs, num(row?.squadActiveMs ?? row?.totalFightMs));
|
|
112
|
+
p.logsJoined = Math.max(p.logsJoined, num(row?.logsJoined));
|
|
113
|
+
}
|
|
114
|
+
for (const row of Array.isArray(stats?.attendanceData) ? stats.attendanceData : []) {
|
|
115
|
+
const p = ensure(row);
|
|
116
|
+
if (!p) continue;
|
|
117
|
+
p.combatTimeMs = Math.max(p.combatTimeMs, num(row?.combatTimeMs));
|
|
118
|
+
p.squadTimeMs = Math.max(p.squadTimeMs, num(row?.squadTimeMs));
|
|
119
|
+
if (Array.isArray(row?.classTimes)) {
|
|
120
|
+
p.classTimes = row.classTimes.map((c) => ({ profession: String(c?.profession ?? ""), timeMs: num(c?.timeMs) })).filter((c) => c.profession && c.timeMs > 0);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
id,
|
|
125
|
+
title: String(payload?.meta?.title ?? id),
|
|
126
|
+
dateStart: payload?.meta?.dateStart ?? null,
|
|
127
|
+
dateEnd: payload?.meta?.dateEnd ?? null,
|
|
128
|
+
fights: num(stats?.total),
|
|
129
|
+
wins: num(stats?.wins),
|
|
130
|
+
losses: num(stats?.losses),
|
|
131
|
+
avgSquadSize: typeof stats?.avgSquadSize === "number" ? stats.avgSquadSize : null,
|
|
132
|
+
avgEnemies: typeof stats?.avgEnemies === "number" ? stats.avgEnemies : null,
|
|
133
|
+
squadDeaths: num(stats?.totalSquadDeaths),
|
|
134
|
+
squadDowns: num(stats?.totalSquadDowns),
|
|
135
|
+
enemyDeaths: num(stats?.totalEnemyDeaths),
|
|
136
|
+
enemyDowns: num(stats?.totalEnemyDowns),
|
|
137
|
+
commanders: Array.isArray(payload?.meta?.commanders) ? payload.meta.commanders.map(String) : [],
|
|
138
|
+
players: Array.from(byAccount.values()),
|
|
139
|
+
warnings
|
|
140
|
+
};
|
|
141
|
+
};
|
|
142
|
+
var aggregatePlayers = (summaries, accounts) => {
|
|
143
|
+
const wanted = accounts && accounts.length > 0 ? new Set(accounts.map((a) => a.toLowerCase())) : null;
|
|
144
|
+
const map = /* @__PURE__ */ new Map();
|
|
145
|
+
for (const run of summaries) {
|
|
146
|
+
for (const p of run.players) {
|
|
147
|
+
if (wanted && !wanted.has(p.account.toLowerCase())) continue;
|
|
148
|
+
let agg = map.get(p.account);
|
|
149
|
+
if (!agg) {
|
|
150
|
+
agg = {
|
|
151
|
+
account: p.account,
|
|
152
|
+
runsJoined: 0,
|
|
153
|
+
combatTimeMs: 0,
|
|
154
|
+
squadTimeMs: 0,
|
|
155
|
+
professionTimeMs: {},
|
|
156
|
+
damage: 0,
|
|
157
|
+
dps: 0,
|
|
158
|
+
downContribution: 0,
|
|
159
|
+
kills: 0,
|
|
160
|
+
strips: 0,
|
|
161
|
+
cleanses: 0,
|
|
162
|
+
resurrects: 0,
|
|
163
|
+
healing: 0,
|
|
164
|
+
barrier: 0,
|
|
165
|
+
damageTaken: 0,
|
|
166
|
+
downs: 0,
|
|
167
|
+
deaths: 0,
|
|
168
|
+
lastSeen: null
|
|
169
|
+
};
|
|
170
|
+
map.set(p.account, agg);
|
|
171
|
+
}
|
|
172
|
+
agg.runsJoined += 1;
|
|
173
|
+
agg.combatTimeMs += p.combatTimeMs;
|
|
174
|
+
agg.squadTimeMs += p.squadTimeMs;
|
|
175
|
+
for (const c of p.classTimes) {
|
|
176
|
+
agg.professionTimeMs[c.profession] = (agg.professionTimeMs[c.profession] || 0) + c.timeMs;
|
|
177
|
+
}
|
|
178
|
+
agg.damage += p.damage;
|
|
179
|
+
agg.downContribution += p.downContribution;
|
|
180
|
+
agg.kills += p.kills;
|
|
181
|
+
agg.strips += p.strips;
|
|
182
|
+
agg.cleanses += p.cleanses;
|
|
183
|
+
agg.resurrects += p.resurrects;
|
|
184
|
+
agg.healing += p.healing;
|
|
185
|
+
agg.barrier += p.barrier;
|
|
186
|
+
agg.damageTaken += p.damageTaken;
|
|
187
|
+
agg.downs += p.downs;
|
|
188
|
+
agg.deaths += p.deaths;
|
|
189
|
+
const seen = run.dateEnd ?? run.dateStart;
|
|
190
|
+
if (seen && (!agg.lastSeen || seen > agg.lastSeen)) agg.lastSeen = seen;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const rows = Array.from(map.values());
|
|
194
|
+
for (const row of rows) {
|
|
195
|
+
row.dps = row.combatTimeMs > 0 ? row.damage / (row.combatTimeMs / 1e3) : 0;
|
|
196
|
+
}
|
|
197
|
+
return rows.sort((a, b) => b.damage - a.damage);
|
|
198
|
+
};
|
|
199
|
+
var RUN_SET_METRICS = [
|
|
200
|
+
"fights",
|
|
201
|
+
"wins",
|
|
202
|
+
"losses",
|
|
203
|
+
"squadDeaths",
|
|
204
|
+
"squadDowns",
|
|
205
|
+
"enemyDeaths",
|
|
206
|
+
"enemyDowns"
|
|
207
|
+
];
|
|
208
|
+
var compareRunSets = (a, b) => {
|
|
209
|
+
const total = (runs, metric) => runs.reduce((sum, run) => sum + num(run[metric]), 0);
|
|
210
|
+
return {
|
|
211
|
+
metrics: RUN_SET_METRICS.map((metric) => {
|
|
212
|
+
const va = total(a, metric);
|
|
213
|
+
const vb = total(b, metric);
|
|
214
|
+
return { metric, a: va, b: vb, delta: vb - va, deltaPct: va !== 0 ? (vb - va) / va : null };
|
|
215
|
+
})
|
|
216
|
+
};
|
|
217
|
+
};
|
|
218
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
219
|
+
0 && (module.exports = {
|
|
220
|
+
ReportSchemaError,
|
|
221
|
+
aggregatePlayers,
|
|
222
|
+
compareRunSets,
|
|
223
|
+
extractRunSummary
|
|
224
|
+
});
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report-level aggregation over PUBLISHED report.json payloads ({ meta, stats }).
|
|
3
|
+
* Defensive by design: published schemas vary across AxiBridge versions, so every
|
|
4
|
+
* field read is optional and failures surface as warnings or ReportSchemaError —
|
|
5
|
+
* never silent drops.
|
|
6
|
+
*/
|
|
7
|
+
declare class ReportSchemaError extends Error {
|
|
8
|
+
}
|
|
9
|
+
interface RunPlayerSummary {
|
|
10
|
+
account: string;
|
|
11
|
+
profession: string;
|
|
12
|
+
professionList: string[];
|
|
13
|
+
combatTimeMs: number;
|
|
14
|
+
squadTimeMs: number;
|
|
15
|
+
classTimes: Array<{
|
|
16
|
+
profession: string;
|
|
17
|
+
timeMs: number;
|
|
18
|
+
}>;
|
|
19
|
+
damage: number;
|
|
20
|
+
downContribution: number;
|
|
21
|
+
kills: number;
|
|
22
|
+
downsCaused: number;
|
|
23
|
+
strips: number;
|
|
24
|
+
cleanses: number;
|
|
25
|
+
resurrects: number;
|
|
26
|
+
healing: number;
|
|
27
|
+
barrier: number;
|
|
28
|
+
hasHealAddon: boolean;
|
|
29
|
+
damageTaken: number;
|
|
30
|
+
downs: number;
|
|
31
|
+
deaths: number;
|
|
32
|
+
logsJoined: number;
|
|
33
|
+
}
|
|
34
|
+
interface RunSummary {
|
|
35
|
+
id: string;
|
|
36
|
+
title: string;
|
|
37
|
+
dateStart: string | null;
|
|
38
|
+
dateEnd: string | null;
|
|
39
|
+
fights: number;
|
|
40
|
+
wins: number;
|
|
41
|
+
losses: number;
|
|
42
|
+
avgSquadSize: number | null;
|
|
43
|
+
avgEnemies: number | null;
|
|
44
|
+
squadDeaths: number;
|
|
45
|
+
squadDowns: number;
|
|
46
|
+
enemyDeaths: number;
|
|
47
|
+
enemyDowns: number;
|
|
48
|
+
commanders: string[];
|
|
49
|
+
players: RunPlayerSummary[];
|
|
50
|
+
warnings: string[];
|
|
51
|
+
}
|
|
52
|
+
declare const extractRunSummary: (report: unknown) => RunSummary;
|
|
53
|
+
interface PlayerAggregate {
|
|
54
|
+
account: string;
|
|
55
|
+
runsJoined: number;
|
|
56
|
+
combatTimeMs: number;
|
|
57
|
+
squadTimeMs: number;
|
|
58
|
+
professionTimeMs: Record<string, number>;
|
|
59
|
+
damage: number;
|
|
60
|
+
dps: number;
|
|
61
|
+
downContribution: number;
|
|
62
|
+
kills: number;
|
|
63
|
+
strips: number;
|
|
64
|
+
cleanses: number;
|
|
65
|
+
resurrects: number;
|
|
66
|
+
healing: number;
|
|
67
|
+
barrier: number;
|
|
68
|
+
damageTaken: number;
|
|
69
|
+
downs: number;
|
|
70
|
+
deaths: number;
|
|
71
|
+
lastSeen: string | null;
|
|
72
|
+
}
|
|
73
|
+
declare const aggregatePlayers: (summaries: RunSummary[], accounts?: string[]) => PlayerAggregate[];
|
|
74
|
+
interface RunSetComparison {
|
|
75
|
+
metrics: Array<{
|
|
76
|
+
metric: string;
|
|
77
|
+
a: number;
|
|
78
|
+
b: number;
|
|
79
|
+
delta: number;
|
|
80
|
+
deltaPct: number | null;
|
|
81
|
+
}>;
|
|
82
|
+
}
|
|
83
|
+
declare const compareRunSets: (a: RunSummary[], b: RunSummary[]) => RunSetComparison;
|
|
84
|
+
|
|
85
|
+
export { type PlayerAggregate, ReportSchemaError, type RunPlayerSummary, type RunSetComparison, type RunSummary, aggregatePlayers, compareRunSets, extractRunSummary };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report-level aggregation over PUBLISHED report.json payloads ({ meta, stats }).
|
|
3
|
+
* Defensive by design: published schemas vary across AxiBridge versions, so every
|
|
4
|
+
* field read is optional and failures surface as warnings or ReportSchemaError —
|
|
5
|
+
* never silent drops.
|
|
6
|
+
*/
|
|
7
|
+
declare class ReportSchemaError extends Error {
|
|
8
|
+
}
|
|
9
|
+
interface RunPlayerSummary {
|
|
10
|
+
account: string;
|
|
11
|
+
profession: string;
|
|
12
|
+
professionList: string[];
|
|
13
|
+
combatTimeMs: number;
|
|
14
|
+
squadTimeMs: number;
|
|
15
|
+
classTimes: Array<{
|
|
16
|
+
profession: string;
|
|
17
|
+
timeMs: number;
|
|
18
|
+
}>;
|
|
19
|
+
damage: number;
|
|
20
|
+
downContribution: number;
|
|
21
|
+
kills: number;
|
|
22
|
+
downsCaused: number;
|
|
23
|
+
strips: number;
|
|
24
|
+
cleanses: number;
|
|
25
|
+
resurrects: number;
|
|
26
|
+
healing: number;
|
|
27
|
+
barrier: number;
|
|
28
|
+
hasHealAddon: boolean;
|
|
29
|
+
damageTaken: number;
|
|
30
|
+
downs: number;
|
|
31
|
+
deaths: number;
|
|
32
|
+
logsJoined: number;
|
|
33
|
+
}
|
|
34
|
+
interface RunSummary {
|
|
35
|
+
id: string;
|
|
36
|
+
title: string;
|
|
37
|
+
dateStart: string | null;
|
|
38
|
+
dateEnd: string | null;
|
|
39
|
+
fights: number;
|
|
40
|
+
wins: number;
|
|
41
|
+
losses: number;
|
|
42
|
+
avgSquadSize: number | null;
|
|
43
|
+
avgEnemies: number | null;
|
|
44
|
+
squadDeaths: number;
|
|
45
|
+
squadDowns: number;
|
|
46
|
+
enemyDeaths: number;
|
|
47
|
+
enemyDowns: number;
|
|
48
|
+
commanders: string[];
|
|
49
|
+
players: RunPlayerSummary[];
|
|
50
|
+
warnings: string[];
|
|
51
|
+
}
|
|
52
|
+
declare const extractRunSummary: (report: unknown) => RunSummary;
|
|
53
|
+
interface PlayerAggregate {
|
|
54
|
+
account: string;
|
|
55
|
+
runsJoined: number;
|
|
56
|
+
combatTimeMs: number;
|
|
57
|
+
squadTimeMs: number;
|
|
58
|
+
professionTimeMs: Record<string, number>;
|
|
59
|
+
damage: number;
|
|
60
|
+
dps: number;
|
|
61
|
+
downContribution: number;
|
|
62
|
+
kills: number;
|
|
63
|
+
strips: number;
|
|
64
|
+
cleanses: number;
|
|
65
|
+
resurrects: number;
|
|
66
|
+
healing: number;
|
|
67
|
+
barrier: number;
|
|
68
|
+
damageTaken: number;
|
|
69
|
+
downs: number;
|
|
70
|
+
deaths: number;
|
|
71
|
+
lastSeen: string | null;
|
|
72
|
+
}
|
|
73
|
+
declare const aggregatePlayers: (summaries: RunSummary[], accounts?: string[]) => PlayerAggregate[];
|
|
74
|
+
interface RunSetComparison {
|
|
75
|
+
metrics: Array<{
|
|
76
|
+
metric: string;
|
|
77
|
+
a: number;
|
|
78
|
+
b: number;
|
|
79
|
+
delta: number;
|
|
80
|
+
deltaPct: number | null;
|
|
81
|
+
}>;
|
|
82
|
+
}
|
|
83
|
+
declare const compareRunSets: (a: RunSummary[], b: RunSummary[]) => RunSetComparison;
|
|
84
|
+
|
|
85
|
+
export { type PlayerAggregate, ReportSchemaError, type RunPlayerSummary, type RunSetComparison, type RunSummary, aggregatePlayers, compareRunSets, extractRunSummary };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/resUtility.ts
|
|
21
|
+
var resUtility_exports = {};
|
|
22
|
+
__export(resUtility_exports, {
|
|
23
|
+
isResUtilitySkill: () => isResUtilitySkill
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(resUtility_exports);
|
|
26
|
+
|
|
27
|
+
// src/statsMetrics.ts
|
|
28
|
+
var RES_UTILITY_NAME_MATCHES = [
|
|
29
|
+
"battle standard",
|
|
30
|
+
"glyph of renewal",
|
|
31
|
+
"glyph of the stars",
|
|
32
|
+
"illusion of life",
|
|
33
|
+
"spirit of nature",
|
|
34
|
+
"nature spirit",
|
|
35
|
+
"search and rescue",
|
|
36
|
+
"signet of mercy"
|
|
37
|
+
];
|
|
38
|
+
var RES_UTILITY_IDS = /* @__PURE__ */ new Set([10244]);
|
|
39
|
+
|
|
40
|
+
// src/resUtility.ts
|
|
41
|
+
var isResUtilitySkill = (id, skillMap) => {
|
|
42
|
+
if (RES_UTILITY_IDS.has(id)) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
const entry = skillMap?.[`s${id}`] || skillMap?.[`${id}`];
|
|
46
|
+
const name = entry?.name?.toLowerCase() || "";
|
|
47
|
+
return RES_UTILITY_NAME_MATCHES.some((match) => name.includes(match));
|
|
48
|
+
};
|
|
49
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
50
|
+
0 && (module.exports = {
|
|
51
|
+
isResUtilitySkill
|
|
52
|
+
});
|
package/dist/roles.cjs
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
|
|
16
|
+
// src/roles.ts
|
|
17
|
+
var roles_exports = {};
|
|
18
|
+
module.exports = __toCommonJS(roles_exports);
|
package/dist/roles.d.cts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface RoleClassificationFactor {
|
|
2
|
+
metric: string;
|
|
3
|
+
value: number;
|
|
4
|
+
median: number;
|
|
5
|
+
ratio: number;
|
|
6
|
+
weight: number;
|
|
7
|
+
contribution: number;
|
|
8
|
+
}
|
|
9
|
+
interface PlayerRoleClassification {
|
|
10
|
+
role: 'support' | 'damage';
|
|
11
|
+
supportScore: number;
|
|
12
|
+
confidenceScore: number;
|
|
13
|
+
threshold: number;
|
|
14
|
+
factors: RoleClassificationFactor[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type { PlayerRoleClassification, RoleClassificationFactor };
|
package/dist/roles.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface RoleClassificationFactor {
|
|
2
|
+
metric: string;
|
|
3
|
+
value: number;
|
|
4
|
+
median: number;
|
|
5
|
+
ratio: number;
|
|
6
|
+
weight: number;
|
|
7
|
+
contribution: number;
|
|
8
|
+
}
|
|
9
|
+
interface PlayerRoleClassification {
|
|
10
|
+
role: 'support' | 'damage';
|
|
11
|
+
supportScore: number;
|
|
12
|
+
confidenceScore: number;
|
|
13
|
+
threshold: number;
|
|
14
|
+
factors: RoleClassificationFactor[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type { PlayerRoleClassification, RoleClassificationFactor };
|
package/dist/roles.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "./chunk-4F55Q6K2.js";
|