(bundle, opts = {})
| 91 | } |
| 92 | |
| 93 | const analyzer = (bundle, opts = {}) => { |
| 94 | const { limit, filter, transformModuleId, filterSummary } = opts |
| 95 | const root = opts.root || (process && process.cwd ? process.cwd() : null) |
| 96 | const idMod = typeof transformModuleId === 'function' && transformModuleId |
| 97 | const filterType = Array.isArray(filter) ? 'array' : typeof filter |
| 98 | const applyFilter = filterByType[filterType] |
| 99 | const bundleModules = bundle.modules || (bundle.cache || {}).modules || [] |
| 100 | const deps = {} |
| 101 | |
| 102 | let tmpBdlSize = 0 |
| 103 | let bundleSize = 0 |
| 104 | let bundleOrigSize = 0 |
| 105 | |
| 106 | let modules = bundleModules.map((m, i) => { |
| 107 | const id = idMod ? idMod(m.id.replace(root, '')) : m.id.replace(root, '') |
| 108 | const { |
| 109 | originalLength, |
| 110 | renderedLength, |
| 111 | renderedExports, |
| 112 | removedExports, |
| 113 | originalCode, |
| 114 | code |
| 115 | } = m |
| 116 | |
| 117 | const size = sizeOrCodeSize(renderedLength, code) |
| 118 | const origSize = sizeOrCodeSize(originalLength, originalCode) |
| 119 | |
| 120 | tmpBdlSize += size |
| 121 | |
| 122 | m.dependencies.forEach((d) => { |
| 123 | d = idMod ? idMod(d.replace(root, '')) : d.replace(root, '') |
| 124 | deps[d] = deps[d] || [] |
| 125 | deps[d].push(id) |
| 126 | }) |
| 127 | |
| 128 | return { id, size, origSize, renderedExports, removedExports } |
| 129 | }).filter((m) => m).sort((a, b) => b.size - a.size) |
| 130 | |
| 131 | modules = modules.map((m, i) => { |
| 132 | m.dependents = deps[m.id] || [] |
| 133 | m.percent = Math.min(((m.size / tmpBdlSize) * 100).toFixed(2), 100) |
| 134 | m.reduction = shakenPct(m.size, m.origSize) |
| 135 | |
| 136 | const filtered = applyFilter && !applyFilter(filter, m) |
| 137 | const limited = !Number.isNaN(+limit) && i >= limit |
| 138 | if ((limited || filtered) && filterSummary) return null |
| 139 | |
| 140 | bundleSize += m.size |
| 141 | bundleOrigSize += m.origSize |
| 142 | |
| 143 | return (limited || filtered) ? null : m |
| 144 | }).filter((m) => m) |
| 145 | |
| 146 | if (filterSummary) { |
| 147 | modules.forEach((m) => { |
| 148 | m.percent = Math.min(((m.size / bundleSize) * 100).toFixed(2), 100) |
| 149 | }) |
| 150 | } |
no test coverage detected
searching dependent graphs…