feat: filter exports by spread thresholds
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import type { SpreadInfoMetrics } from "./types";
|
||||
import type { SpreadInfoMetrics, SpreadMetricThresholds } from "./types";
|
||||
|
||||
interface FetchResponseLike {
|
||||
json(): Promise<unknown>;
|
||||
@@ -29,7 +29,7 @@ interface SpreadInfoMetricDefinition {
|
||||
label: string;
|
||||
}
|
||||
|
||||
interface MappedSpreadInfoResponse {
|
||||
export interface MappedSpreadInfoResponse {
|
||||
averageCommentCount?: string;
|
||||
averageDuration?: string;
|
||||
averageLikeCount?: string;
|
||||
@@ -108,6 +108,12 @@ export function createSpreadInfoClient(options: SpreadInfoClientOptions = {}) {
|
||||
}
|
||||
|
||||
return metrics;
|
||||
},
|
||||
async loadAuthorSpreadMetricSnapshot(
|
||||
authorId: string,
|
||||
config: SpreadInfoConfig
|
||||
): Promise<MappedSpreadInfoResponse> {
|
||||
return loadSpreadInfoFromUrl(buildSpreadInfoUrl(authorId, config, baseUrl));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -201,6 +207,21 @@ export function mapSpreadInfoResponse(
|
||||
};
|
||||
}
|
||||
|
||||
export function matchesSpreadThresholds(
|
||||
metrics: MappedSpreadInfoResponse,
|
||||
thresholds: SpreadMetricThresholds
|
||||
): boolean {
|
||||
return Object.entries(thresholds).every(([key, threshold]) => {
|
||||
if (typeof threshold !== "number" || !Number.isFinite(threshold)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const metricValue = metrics[key as keyof SpreadMetricThresholds];
|
||||
const numericValue = readDisplayNumber(metricValue);
|
||||
return numericValue !== null && numericValue >= threshold;
|
||||
});
|
||||
}
|
||||
|
||||
function buildSpreadInfoColumnHeader(
|
||||
config: SpreadInfoConfig,
|
||||
metric: SpreadInfoMetricDefinition
|
||||
@@ -278,6 +299,15 @@ function readNumberLike(value: unknown): number | null {
|
||||
return null;
|
||||
}
|
||||
|
||||
function readDisplayNumber(value: string | undefined): number | null {
|
||||
if (!hasTextValue(value)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const parsedValue = Number(value.replace(/[% ,]/g, ""));
|
||||
return Number.isFinite(parsedValue) ? parsedValue : null;
|
||||
}
|
||||
|
||||
function formatBasisPointPercent(value: number | null): string | undefined {
|
||||
if (value === null) {
|
||||
return undefined;
|
||||
|
||||
Reference in New Issue
Block a user