UNPKG

2 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5const path_1 = __importDefault(require("path"));
6// @ts-expect-error
7const libnpmpack_1 = __importDefault(require("libnpmpack"));
8const tar_stream_1 = __importDefault(require("tar-stream"));
9const stream_1 = require("stream");
10const gunzip_maybe_1 = __importDefault(require("gunzip-maybe"));
11const gzip_size_1 = __importDefault(require("gzip-size"));
12const brotli_size_1 = require("brotli-size");
13const getTarFiles = async (tarball) => new Promise((resolve, reject) => {
14 const files = [];
15 stream_1.Readable.from(tarball)
16 .pipe(gunzip_maybe_1.default())
17 .pipe(tar_stream_1.default.extract())
18 .on('entry', (header, stream, next) => {
19 const file = {
20 /*
21 * Sanitization from UNPKG:
22 * https://github.com/mjackson/unpkg/blob/4774e61d50f76c518d0628cfdf8beede5017455d/modules/actions/serveFileMetadata.js#L23
23 */
24 path: header.name.replace(/^[^/]+\/?/, '/'),
25 mode: header.mode,
26 size: header.size,
27 sizeGzip: Number.NaN,
28 sizeBrotli: Number.NaN,
29 };
30 files.push(file);
31 stream = stream
32 .pipe(brotli_size_1.stream())
33 .on('brotli-size', sizeBrotli => {
34 file.sizeBrotli = sizeBrotli;
35 })
36 .pipe(gzip_size_1.default.stream())
37 .on('gzip-size', sizeGzip => {
38 file.sizeGzip = sizeGzip;
39 });
40 stream
41 .on('end', next)
42 .resume();
43 })
44 .on('error', error => reject(error))
45 .on('finish', () => resolve(files));
46});
47async function pkgSize(pkgPath = '') {
48 pkgPath = path_1.default.resolve(pkgPath);
49 const tarball = await libnpmpack_1.default(pkgPath);
50 const files = await getTarFiles(tarball);
51 return { pkgPath, files };
52}
53module.exports = pkgSize;