import type { StatsAsset, StatsCompilation, } from '@roots/bud-framework/config' import {relative} from 'node:path' import Messages from '@roots/bud-dashboard/components/messages' import View from '@roots/bud-dashboard/components/view' import {useCompilationColor} from '@roots/bud-dashboard/hooks/useCompilationColor' import {duration} from '@roots/bud-support/human-readable' import {Box, Text, useEffect, useState} from '@roots/bud-support/ink' import isNumber from '@roots/bud-support/isNumber' import Assets from './assets.js' import Entrypoints from './entrypoints.js' export interface Props { basedir?: string borderColor?: string compact?: boolean compilation: StatsCompilation debug?: boolean displayAssets?: boolean displayEntrypoints?: boolean id: number total?: number } export interface Asset extends Partial {} export interface AssetGroup { assets?: Array } const Compilation = ({ basedir, compact, compilation, displayAssets, displayEntrypoints, id, total, }: Props) => { const [current, setCurrent] = useState(compilation) const compilationColor = useCompilationColor(compilation) useEffect(() => { if (!current) { setCurrent(compilation) return } if (!compilation.hash) return if (compilation.hash === current?.hash) return setCurrent(compilation) }, [current, compilation]) return ( } head={ } paddingY={compact ? 0 : 1} > {current.errorsCount === 0 && ( <> )} ) } const Head = ({basedir, compilation, id, total}: Props) => { const color = useCompilationColor(compilation) if (!compilation) return Loading return ( {compilation.name?.split(`/`).pop() ?? `compilation`} {total && total > 1 && ( {` `}[{id}/{total}] )} {compilation.hash && ( {` `}[{compilation.hash}] )} {basedir && compilation.outputPath && ( ./{relative(`${basedir}`, `${compilation.outputPath}`)} )} ) } const Footer = ({compilation}: Partial) => { if (!compilation || !compilation?.assets) return ... const errorsCount = isNumber(compilation.errorsCount) ? compilation.errorsCount : 0 const formattedErrorCount = errorsCount > 1 ? `${errorsCount} errors` : `${errorsCount} error` const cachedModuleCount = compilation.modules?.filter(mod => mod?.cached)?.length ?? 0 const totalModuleCount = compilation.modules?.filter(mod => mod && mod.hasOwnProperty(`cached`)) ?.length ?? 0 const formattedModuleCount = `${cachedModuleCount}/${totalModuleCount} modules cached` const formattedTime = compilation.time ? `${duration(compilation.time)} ` : `` if (errorsCount > 0) { return ( {formattedErrorCount} ) } return ( {formattedTime} {`${totalModuleCount} modules`} {` [${formattedModuleCount}]`} ) } export default Compilation