-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
// This script reads given file and reports its filesize in raw bytes and gziped bytes.
import { argv, file, inspect, gzipSync } from "bun";
import * as commander from "commander";
import { bytesToString } from "./_filesize.js";
// --- MODULE
interface NetworkFilesize {
raw: number;
gzip: number;
}
export function getNetworkFilesize(
input: ArrayBuffer | Uint8Array | string,
): NetworkFilesize {
let buf: Uint8Array | Buffer;
if (input instanceof Uint8Array) {
buf = input;
} else if (input instanceof ArrayBuffer) {
buf = Buffer.from(input);
} else if (typeof input === "string") {
const enc = new TextEncoder();
buf = enc.encode(input);
} else {
throw new Error(
`First argument of the getNetworkFilesize() must be one of ArrayBuffer, Uint8Array, or string. Got "` +
inspect(input) +
`".`,
);
}
return {
raw: buf.byteLength,
gzip: gzipSync(buf instanceof Uint8Array ? buf : Buffer.from(buf))
.byteLength,
};
}
export function printFilesize({ raw, gzip }: NetworkFilesize): void {
console.log(
"raw = %s, gzip = %s",
bytesToString(raw, true),
bytesToString(gzip, true),
);
}
// --- CLI
interface Options {
json?: boolean;
}
async function run(filepath: string, { json = false }: Options) {
const target = file(filepath);
const size = getNetworkFilesize(await target.arrayBuffer());
if (json) {
console.log(JSON.stringify(size));
return;
}
printFilesize(size);
}
if (import.meta.main) {
const program = commander.program
.option("-J, --json")
.argument("<path>", "File to analyze")
.action(run);
await program.parseAsync(argv);
}