11import type { PackageInfo } from '../../../shared/types'
2+ import type { RolldownEventsReader } from '../../rolldown/events-reader'
23import { readProjectManifestOnly } from '@pnpm/read-project-manifest'
34import { defineRpcFunction } from '@vitejs/devtools-kit'
45import { getPackageDirPath , isNodeModulePath } from '../../../shared/utils/filepath'
56import { getLogsManager } from '../utils'
67
8+ export async function getPackagesManifest ( reader : RolldownEventsReader ) {
9+ const modulesMap = reader . manager . modules
10+ const chunks = Array . from ( reader . manager . chunks . values ( ) )
11+ const packagesManifest = new Map < string , PackageInfo > ( )
12+
13+ const getImporters = ( path : string , packageDir : string , visited = new Set < string > ( ) ) : string [ ] => {
14+ const importers = modulesMap . get ( path ) ?. importers || [ ]
15+ const result : string [ ] = [ ]
16+
17+ for ( const importer of importers ) {
18+ if ( visited . has ( importer ) )
19+ continue
20+
21+ visited . add ( importer )
22+ const module = modulesMap . get ( importer )
23+ const imports = module ?. imports ?. map ( i => i . module_id ) || [ ]
24+
25+ if ( imports . some ( i => getPackageDirPath ( i ) === packageDir ) ) {
26+ result . push ( importer )
27+ }
28+
29+ result . push ( ...getImporters ( importer , packageDir , visited ) )
30+ }
31+
32+ return result
33+ }
34+
35+ const packages = chunks . map ( chunk => chunk . modules . map ( module => module ) ) . flat ( ) . filter ( isNodeModulePath ) . map ( ( p ) => {
36+ const module = modulesMap . get ( p )
37+ const moduleBuildMetrics = module ?. build_metrics
38+ return {
39+ path : p ,
40+ dir : getPackageDirPath ( p ) ,
41+ transformedCodeSize : moduleBuildMetrics ?. transforms [ moduleBuildMetrics ?. transforms . length - 1 ] ?. transformed_code_size ?? 0 ,
42+ }
43+ } )
44+ await Promise . all ( packages . map ( async ( p ) => {
45+ const manifest = await readProjectManifestOnly ( p . dir )
46+ const packageKey = `${ manifest . name ! } @${ manifest . version ! } `
47+ const packageInfo = packagesManifest . get ( packageKey )
48+ const importers = getImporters ( p . path , p . dir ) . map ( i => ( { path : i , version : '' } ) )
49+ if ( packageInfo ) {
50+ packagesManifest . set ( packageKey , {
51+ ...packageInfo ,
52+ files : [ ...packageInfo . files , {
53+ path : p . path ,
54+ transformedCodeSize : p . transformedCodeSize ,
55+ importers,
56+ } ] ,
57+ transformedCodeSize : packageInfo . transformedCodeSize + p . transformedCodeSize ,
58+ } )
59+ }
60+ else {
61+ packagesManifest . set ( packageKey , {
62+ name : manifest . name ! ,
63+ version : manifest . version ! ,
64+ dir : p . dir ,
65+ files : [ {
66+ path : p . path ,
67+ transformedCodeSize : p . transformedCodeSize ,
68+ importers,
69+ } ] ,
70+ transformedCodeSize : p . transformedCodeSize ,
71+ } )
72+ }
73+ } ) )
74+ return packagesManifest
75+ }
76+
777export const rolldownGetPackages = defineRpcFunction ( {
878 name : 'vite:rolldown:get-packages' ,
979 type : 'query' ,
@@ -12,49 +82,10 @@ export const rolldownGetPackages = defineRpcFunction({
1282 return {
1383 handler : async ( { session } : { session : string } ) => {
1484 const reader = await manager . loadSession ( session )
15- const chunks = Array . from ( reader . manager . chunks . values ( ) )
1685 const modulesMap = reader . manager . modules
1786 const duplicatePackagesMap = new Map < string , number > ( )
18- const packagesManifest = new Map < string , PackageInfo > ( )
19- const packages = chunks . map ( chunk => chunk . modules . map ( module => module ) ) . flat ( ) . filter ( isNodeModulePath ) . map ( ( p ) => {
20- const module = modulesMap . get ( p )
21- const moduleBuildMetrics = module ?. build_metrics
22- return {
23- path : p ,
24- dir : getPackageDirPath ( p ) ,
25- transformedCodeSize : moduleBuildMetrics ?. transforms [ moduleBuildMetrics ?. transforms . length - 1 ] ?. transformed_code_size ?? 0 ,
26- }
27- } )
28- await Promise . all ( packages . map ( async ( p ) => {
29- const manifest = await readProjectManifestOnly ( p . dir )
30- const packageKey = `${ manifest . name ! } @${ manifest . version ! } `
31- const packageInfo = packagesManifest . get ( packageKey )
32- const module = modulesMap . get ( p . path )
33- if ( packageInfo ) {
34- packagesManifest . set ( packageKey , {
35- ...packageInfo ,
36- files : [ ...packageInfo . files , {
37- path : p . path ,
38- transformedCodeSize : p . transformedCodeSize ,
39- importers : module ?. importers ?. map ( i => ( { path : i , version : '' } ) ) ?? [ ] ,
40- } ] ,
41- transformedCodeSize : packageInfo . transformedCodeSize + p . transformedCodeSize ,
42- } )
43- }
44- else {
45- packagesManifest . set ( packageKey , {
46- name : manifest . name ! ,
47- version : manifest . version ! ,
48- dir : p . dir ,
49- files : [ {
50- path : p . path ,
51- transformedCodeSize : p . transformedCodeSize ,
52- importers : module ?. importers ?. map ( i => ( { path : i , version : '' } ) ) ?? [ ] ,
53- } ] ,
54- transformedCodeSize : p . transformedCodeSize ,
55- } )
56- }
57- } ) )
87+ const packagesManifest = await getPackagesManifest ( reader )
88+
5889 const normalizedPackages = await Promise . all (
5990 Array . from < PackageInfo > ( packagesManifest . values ( ) )
6091 . map ( ( p ) => {
0 commit comments