1 | 'use strict';
|
2 | var __importDefault =
|
3 | (this && this.__importDefault) ||
|
4 | function (mod) {
|
5 | return mod && mod.__esModule ? mod : { default: mod };
|
6 | };
|
7 | Object.defineProperty(exports, '__esModule', { value: true });
|
8 | exports.getBundleName = exports.getBundles = exports.explore = void 0;
|
9 | const glob_1 = __importDefault(require('glob'));
|
10 | const lodash_1 = require('lodash');
|
11 | const explore_1 = require('./explore');
|
12 | const app_error_1 = require('./app-error');
|
13 | const output_1 = require('./output');
|
14 | const coverage_1 = require('./coverage');
|
15 | function adjustOptions(options) {
|
16 | if (options.gzip) {
|
17 | options.onlyMapped = true;
|
18 | }
|
19 | return options;
|
20 | }
|
21 | async function explore(bundlesAndFileTokens, options = {}) {
|
22 | bundlesAndFileTokens = Array.isArray(bundlesAndFileTokens)
|
23 | ? bundlesAndFileTokens
|
24 | : [bundlesAndFileTokens];
|
25 | if (bundlesAndFileTokens.length === 0) {
|
26 | throw new app_error_1.AppError({ code: 'NoBundles' });
|
27 | }
|
28 | adjustOptions(options);
|
29 | const [fileTokens, bundles] = lodash_1.partition(bundlesAndFileTokens, lodash_1.isString);
|
30 | bundles.push(...getBundles(fileTokens));
|
31 | coverage_1.addCoverageRanges(bundles, options.coverage);
|
32 | const results = await Promise.all(
|
33 | bundles.map((bundle) =>
|
34 | explore_1.exploreBundle(bundle, options).catch((error) => onExploreError(bundle, error))
|
35 | )
|
36 | );
|
37 | const exploreResult = getExploreResult(results, options);
|
38 | if (exploreResult.bundles.length === 0) {
|
39 | return Promise.reject(exploreResult);
|
40 | }
|
41 | output_1.saveOutputToFile(exploreResult, options);
|
42 | return exploreResult;
|
43 | }
|
44 | exports.explore = explore;
|
45 | function getBundles(fileTokens) {
|
46 | const filenames = lodash_1.flatMap(fileTokens, (filePath) =>
|
47 | glob_1.default.hasMagic(filePath) ? expandGlob(filePath) : filePath
|
48 | );
|
49 | const [mapFilenames, codeFilenames] = lodash_1.partition(filenames, (filename) =>
|
50 | filename.endsWith('.map')
|
51 | );
|
52 | return codeFilenames.map((code) => ({
|
53 | code,
|
54 | map: mapFilenames.find((filename) => filename === `${code}.map`),
|
55 | }));
|
56 | }
|
57 | exports.getBundles = getBundles;
|
58 | function expandGlob(pattern) {
|
59 | if (pattern.endsWith('.js')) {
|
60 | pattern = `${pattern}?(.map)`;
|
61 | }
|
62 | return glob_1.default.sync(pattern);
|
63 | }
|
64 | function getBundleName(bundle) {
|
65 | return Buffer.isBuffer(bundle.code) ? 'Buffer' : bundle.code;
|
66 | }
|
67 | exports.getBundleName = getBundleName;
|
68 | function onExploreError(bundle, error) {
|
69 | return {
|
70 | bundleName: getBundleName(bundle),
|
71 | code: error.code || 'Unknown',
|
72 | message: error.message,
|
73 | error,
|
74 | };
|
75 | }
|
76 | function sortFilenames(bundles) {
|
77 | return bundles.map((bundle) => ({
|
78 | ...bundle,
|
79 | files: lodash_1.fromPairs(lodash_1.sortBy(lodash_1.toPairs(bundle.files), 0)),
|
80 | }));
|
81 | }
|
82 | function getExploreResult(results, options) {
|
83 | const [bundles, errors] = lodash_1.partition(results, (result) => 'files' in result);
|
84 | let sortedBundles = lodash_1.sortBy(bundles, (bundle) => bundle.bundleName);
|
85 | if (options.sort) {
|
86 | sortedBundles = sortFilenames(sortedBundles);
|
87 | }
|
88 | errors.push(...getPostExploreErrors(bundles));
|
89 | return {
|
90 | bundles: sortedBundles,
|
91 | errors,
|
92 | ...(bundles.length > 0 && { output: output_1.formatOutput(sortedBundles, options) }),
|
93 | };
|
94 | }
|
95 | function getPostExploreErrors(exploreBundleResults) {
|
96 | const errors = [];
|
97 | const isSingleBundle = exploreBundleResults.length === 1;
|
98 | for (const result of exploreBundleResults) {
|
99 | const { bundleName, files, totalBytes } = result;
|
100 | if (isSingleBundle) {
|
101 | const filenames = Object.keys(files).filter(
|
102 | (filename) => !explore_1.SPECIAL_FILENAMES.includes(filename)
|
103 | );
|
104 | if (filenames.length === 1) {
|
105 | errors.push({
|
106 | bundleName,
|
107 | isWarning: true,
|
108 | code: 'OneSourceSourceMap',
|
109 | message: app_error_1.getErrorMessage({
|
110 | code: 'OneSourceSourceMap',
|
111 | filename: filenames[0],
|
112 | }),
|
113 | });
|
114 | }
|
115 | }
|
116 | if (files[explore_1.UNMAPPED_KEY] !== undefined) {
|
117 | const { size: unmappedBytes } = files[explore_1.UNMAPPED_KEY];
|
118 | if (unmappedBytes) {
|
119 | errors.push({
|
120 | bundleName,
|
121 | isWarning: true,
|
122 | code: 'UnmappedBytes',
|
123 | message: app_error_1.getErrorMessage({
|
124 | code: 'UnmappedBytes',
|
125 | unmappedBytes,
|
126 | totalBytes,
|
127 | }),
|
128 | });
|
129 | }
|
130 | }
|
131 | }
|
132 | return errors;
|
133 | }
|
134 |
|