Skip to content

Commit da80c7a

Browse files
committed
Extract parse and format helpers to separate file
1 parent 75b75da commit da80c7a

File tree

2 files changed

+74
-60
lines changed

2 files changed

+74
-60
lines changed

Diff for: src/ts/helpers/parse.ts

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import {roundNumber} from "./misc";
2+
3+
/**
4+
* Type safe and null safe way to transform, filter and format an input value, e.g. parse a Date from a string,
5+
* rejecting invalid dates, and formatting it as a localized string. If the input value is undefined, or the parseFn
6+
* returns undefined, the function returns undefined.
7+
* @param input
8+
* @param parseFn an optional function to transform and/or filter the input value.
9+
* @param formatFn an optional function to format the parsed input value.
10+
* @returns {string} a formatted string representation of the input, or undefined.
11+
*/
12+
export function parseAndFormat<S, T>(input?: S,
13+
parseFn: ((_: S) => T) = identity,
14+
formatFn: ((_: T) => string) = identity): string {
15+
if (input === undefined) {
16+
return undefined;
17+
}
18+
const parsed = parseFn(input);
19+
if (parsed === undefined) {
20+
return undefined;
21+
}
22+
return formatFn(parsed);
23+
}
24+
25+
function identity<T>(source: T): T {
26+
return source;
27+
}
28+
29+
export function parseDate(input: string): Date {
30+
const date = new Date(input);
31+
if (isNaN(date.getTime())) {
32+
return undefined;
33+
}
34+
return date;
35+
}
36+
37+
export function parseNonNegative(input: string | number): number {
38+
const filter = (n) => (n >= 0);
39+
return parseToNumber(input, filter);
40+
}
41+
42+
export function parsePositive(input: string | number): number {
43+
const filter = (n) => (n > 0);
44+
return parseToNumber(input, filter);
45+
}
46+
47+
function parseToNumber(input: string | number, filterFn: (_: number) => boolean): number {
48+
const filter = (n: number) => filterFn(n) ? n : undefined;
49+
50+
if (typeof input === "string") {
51+
const n = parseInt(input, 10);
52+
if (!isFinite(n)) {
53+
return undefined;
54+
}
55+
return filter(n);
56+
}
57+
return filter(input);
58+
}
59+
60+
export function formatMilliseconds(millis: number): string {
61+
return `${millis} ms`;
62+
}
63+
64+
export function formatDateLocalized(date: Date): string {
65+
return `${date.toUTCString()}</br>(local time: ${date.toLocaleString()})`;
66+
}
67+
68+
export function formatBytes(bytes: number): string {
69+
return `${bytes} bytes (~${roundNumber(bytes / 1024, 1)} kb)`;
70+
}

Diff for: src/ts/waterfall/details-overlay/extract-details-keys.ts

+4-60
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,11 @@
11
import {getHeader} from "../../helpers/har";
2+
import {
3+
formatBytes, formatDateLocalized, formatMilliseconds, parseAndFormat, parseDate,
4+
parseNonNegative, parsePositive,
5+
} from "../../helpers/parse";
26
import {Entry, Header} from "../../typing/har";
37
import {WaterfallEntry} from "../../typing/waterfall";
48

5-
function parseAndFormat<S, T>(source?: S,
6-
parseFn: ((_: S) => T) = identity,
7-
formatFn: ((_: T) => string) = identity): string {
8-
if (source === undefined) {
9-
return undefined;
10-
}
11-
const parsed = parseFn(source);
12-
if (parsed === undefined) {
13-
return undefined;
14-
}
15-
return formatFn(parsed);
16-
}
17-
18-
function identity<T>(source: T): T {
19-
return source;
20-
}
21-
22-
function parseDate(s: string): Date {
23-
const date = new Date(s);
24-
if (isNaN(date.getTime())) {
25-
return undefined;
26-
}
27-
return date;
28-
}
29-
30-
function parseNonNegative(input: string | number): number {
31-
const criteria = (n: number) => (n < 0);
32-
return parseToNumber(input, criteria);
33-
}
34-
35-
function parsePositive(input: string | number): number {
36-
const criteria = (n: number) => (n <= 0);
37-
return parseToNumber(input, criteria);
38-
}
39-
40-
function parseToNumber(input: string | number, criteria: (_: number) => boolean): number {
41-
const parse = (n: number) => criteria(n) ? undefined : n;
42-
43-
if (typeof input === "string") {
44-
const n = parseInt(input, 10);
45-
if (!isFinite(n)) {
46-
return undefined;
47-
}
48-
return parse(n);
49-
}
50-
return parse(input);
51-
}
52-
53-
function formatMilliseconds(millis: number): string {
54-
return `${millis} ms`;
55-
}
56-
57-
function formatDateLocalized(d: Date): string {
58-
return `${d.toUTCString()}</br>(local time: ${d.toLocaleString()})`;
59-
}
60-
61-
function formatBytes(size: number): string {
62-
return `${size} byte (~${Math.round(size / 1024 * 10) / 10}kb)`;
63-
}
64-
659
/** get experimental feature (usually WebPageTest) */
6610
let getExp = (harEntry: Entry, name: string): string => {
6711
return harEntry[name] || harEntry["_" + name] || harEntry.request[name] || harEntry.request["_" + name] || "";

0 commit comments

Comments
 (0)