@@ -9,7 +9,7 @@ import type { RollupPlugin } from 'unplugin';
99import { createUnplugin } from 'unplugin' ;
1010import { workspaceRoot } from 'workspace-root' ;
1111
12- import { memoizeAsync } from './utils' ;
12+ import { memoizeAsync , getPkgSize as _getPkgSize } from './utils' ;
1313
1414export interface Options { }
1515
@@ -58,6 +58,22 @@ const formatImporter = memoizeAsync(async (importer: string) => {
5858 return formattedImporter ;
5959} ) ;
6060
61+ const getPkgSize = memoizeAsync ( _getPkgSize ) ;
62+
63+ function colorizeSize ( kb : number ) {
64+ if ( Number . isNaN ( kb ) ) return '' ;
65+
66+ let colorFunc : ( str : string ) => string ;
67+ if ( kb > 1000 ) {
68+ colorFunc = c . red ;
69+ } else if ( kb > 100 ) {
70+ colorFunc = c . yellow ;
71+ } else {
72+ colorFunc = c . green ;
73+ }
74+ return `(${ colorFunc ( `${ kb } kb` ) } )` ;
75+ }
76+
6177export default createUnplugin < Options | undefined > ( ( ) => {
6278 const name = 'unplugin-detect-duplicated-deps' ;
6379 let isVitePlugin = false ;
@@ -103,7 +119,7 @@ export default createUnplugin<Options | undefined>(() => {
103119 }
104120 } ;
105121
106- const buildEnd : RollupPlugin [ 'buildEnd' ] = function ( ) {
122+ const buildEnd : RollupPlugin [ 'buildEnd' ] = async function ( ) {
107123 const duplicatedPackages : string [ ] = [ ] ;
108124 for ( const [ packageName , versionsMap ] of packageToVersionsMap . entries ( ) ) {
109125 if ( versionsMap . size > 1 ) {
@@ -119,9 +135,7 @@ export default createUnplugin<Options | undefined>(() => {
119135 `multiple versions of ${ formattedDuplicatedPackageNames } is bundled!` ,
120136 ] ;
121137
122- for ( const duplicatedPackage of duplicatedPackages ) {
123- warningMessages . push ( `\n ${ c . magenta ( duplicatedPackage ) } :` ) ;
124-
138+ const promises = duplicatedPackages . map ( async ( duplicatedPackage ) => {
125139 const sortedVersions = [ ...packageToVersionsMap . get ( duplicatedPackage ) ! . keys ( ) ] . sort (
126140 ( a , b ) => ( gt ( a , b ) ? 1 : - 1 ) ,
127141 ) ;
@@ -133,7 +147,8 @@ export default createUnplugin<Options | undefined>(() => {
133147 }
134148 } ) ;
135149
136- for ( const version of sortedVersions ) {
150+ let totalSize = 0 ;
151+ const _promises = sortedVersions . map ( async ( version ) => {
137152 const importers = Array . from (
138153 packageToVersionsMap . get ( duplicatedPackage ) ! . get ( version ) ! ,
139154 ) ;
@@ -144,9 +159,23 @@ export default createUnplugin<Options | undefined>(() => {
144159 . filter ( ( importer ) => importer !== `${ duplicatedPackage } @${ version } ` )
145160 . map ( ( name ) => c . green ( name ) )
146161 . join ( ', ' ) ;
147- warningMessages . push ( ` - ${ formattedVersion } imported by ${ formattedImporters } ` ) ;
148- }
149- }
162+ const pkgSize = await getPkgSize ( duplicatedPackage , version ) ;
163+ totalSize += pkgSize ;
164+ warningMessages . push (
165+ // prettier-ignore
166+ ` - ${ formattedVersion } ${ colorizeSize ( pkgSize ) } imported by ${ formattedImporters } ` ,
167+ ) ;
168+ } ) ;
169+ await Promise . all ( _promises ) ;
170+
171+ warningMessages . splice (
172+ warningMessages . length - sortedVersions . length ,
173+ 0 ,
174+ `\n ${ c . magenta ( duplicatedPackage ) } ${ colorizeSize ( totalSize ) } :` ,
175+ ) ;
176+ } ) ;
177+ await Promise . all ( promises ) ;
178+
150179 // remove vite output dim colorize
151180 // eslint-disable-next-line unicorn/escape-case, unicorn/no-hex-escape
152181 process . stdout . write ( `\x1b[0m${ isVitePlugin ? '\n' : '' } ` ) ;
@@ -156,6 +185,7 @@ export default createUnplugin<Options | undefined>(() => {
156185 getWorkspaceRootFolder . destroy ( ) ;
157186 getPackageInfo . destroy ( ) ;
158187 formatImporter . destroy ( ) ;
188+ getPkgSize . destroy ( ) ;
159189 } ;
160190
161191 return {
0 commit comments