import type {StatsCompilation} from '@roots/bud-support/webpack' import Assets from '@roots/bud-dashboard/components/assets' import {useCompilationColor} from '@roots/bud-dashboard/hooks/useCompilationColor' import {longestNamedObjectLength} from '@roots/bud-dashboard/hooks/useLongestNamedObjectLength' import {size as formatSize} from '@roots/bud-support/human-readable' import {Box, Text} from '@roots/bud-support/ink' import isNumber from '@roots/bud-support/isNumber' interface Props { compact?: boolean compilation?: StatsCompilation displayEntrypoints?: boolean } const Entrypoints = ({ compact, compilation, displayEntrypoints, }: Props) => { const compilationColor = useCompilationColor(compilation, `cyan`) if (!displayEntrypoints) return null if (!compilation?.entrypoints) return null const entrypoints = Object.values(compilation.entrypoints) .map(entrypoint => ({ ...entrypoint, assets: entrypoint.assets ?.filter(asset => !asset?.name?.includes(`hot-update`)) .map(asset => ({ ...(asset ?? {}), ...(compilation?.assets?.find(a => a?.name === asset?.name) ?? {}), })) ?? [], })) .filter(({assets}) => assets.length > 0) const minWidth = entrypoints.reduce( (longest, entry) => Math.max( entry.assets ? longestNamedObjectLength(entry.assets) : 0, longest, ), 0, ) if (entrypoints.length === 0) return null return entrypoints.map(({assets, name}, key) => ( {compact ? ( {name && {name}} {assets.length} modules {`${formatSize( assets.reduce( (acc, asset) => acc + (asset?.size && isNumber(asset.size) ? asset.size : 0), 0, ), )}`} ) : ( {name && name !== compilation.name && ( {name} )} )} )) } export {Entrypoints as default}