1
+ import type { Environment } from 'vite'
1
2
import type { ModuleTransformInfo } from '../types'
2
3
import type { InspectContext } from './context'
3
4
import fs from 'node:fs/promises'
@@ -6,9 +7,36 @@ import process from 'node:process'
6
7
import { hash } from 'ohash'
7
8
import { DIR_CLIENT } from '../dirs'
8
9
9
- export async function generateBuild (
10
- ctx : InspectContext ,
10
+ export interface EnvOrderHooks < Args extends readonly unknown [ ] > {
11
+ onFirst ?: ( ...args : Args ) => Promise < void >
12
+ onEach ?: ( ...args : Args ) => Promise < void >
13
+ onLast ?: ( ...args : Args ) => Promise < void >
14
+ }
15
+ export function createEnvOrderHooks < Args extends readonly unknown [ ] > (
16
+ environmentNames : string [ ] ,
17
+ { onFirst, onEach, onLast } : EnvOrderHooks < Args > ,
11
18
) {
19
+ const remainingEnvs = new Set < string > ( environmentNames )
20
+ let ranFirst = false
21
+ let ranLast = false
22
+
23
+ return async ( envName : string , ...args : Args ) => {
24
+ if ( ! ranFirst ) {
25
+ ranFirst = true
26
+ await onFirst ?.( ...args )
27
+ }
28
+
29
+ remainingEnvs . delete ( envName )
30
+ await onEach ?.( ...args )
31
+
32
+ if ( ! ranLast && remainingEnvs . size === 0 ) {
33
+ ranLast = true
34
+ await onLast ?.( ...args )
35
+ }
36
+ }
37
+ }
38
+
39
+ export function createBuildGenerator ( ctx : InspectContext ) {
12
40
const {
13
41
outputDir = '.vite-inspect' ,
14
42
} = ctx . options
@@ -19,55 +47,62 @@ export async function generateBuild(
19
47
: resolve ( process . cwd ( ) , outputDir )
20
48
const reportsDir = join ( targetDir , 'reports' )
21
49
22
- await fs . rm ( targetDir , { recursive : true , force : true } )
23
- await fs . mkdir ( reportsDir , { recursive : true } )
24
- await fs . cp ( DIR_CLIENT , targetDir , { recursive : true } )
25
-
26
- await Promise . all ( [
27
- fs . writeFile (
28
- join ( targetDir , 'index.html' ) ,
29
- ( await fs . readFile ( join ( targetDir , 'index.html' ) , 'utf-8' ) )
30
- . replace (
31
- 'data-vite-inspect-mode="DEV"' ,
32
- 'data-vite-inspect-mode="BUILD"' ,
50
+ return {
51
+ getOutputDir ( ) {
52
+ return targetDir
53
+ } ,
54
+ async setupOutputDir ( ) {
55
+ await fs . rm ( targetDir , { recursive : true , force : true } )
56
+ await fs . mkdir ( reportsDir , { recursive : true } )
57
+ await fs . cp ( DIR_CLIENT , targetDir , { recursive : true } )
58
+ await Promise . all ( [
59
+ fs . writeFile (
60
+ join ( targetDir , 'index.html' ) ,
61
+ ( await fs . readFile ( join ( targetDir , 'index.html' ) , 'utf-8' ) )
62
+ . replace (
63
+ 'data-vite-inspect-mode="DEV"' ,
64
+ 'data-vite-inspect-mode="BUILD"' ,
65
+ ) ,
66
+ ) ,
67
+ writeJSON (
68
+ join ( reportsDir , 'metadata.json' ) ,
69
+ ctx . getMetadata ( ) ,
33
70
) ,
34
- ) ,
35
- writeJSON (
36
- join ( reportsDir , 'metadata.json' ) ,
37
- ctx . getMetadata ( ) ,
38
- ) ,
39
- ...[ ...ctx . _idToInstances . values ( ) ]
40
- . flatMap ( v => [ ...v . environments . values ( ) ]
41
- . map ( ( e ) => {
42
- const key = `${ v . id } -${ e . env . name } `
71
+ ] )
72
+ } ,
73
+ async generateForEnv ( env : Environment ) {
74
+ await Promise . all ( [ ...ctx . _idToInstances . values ( ) ]
75
+ . filter ( v => v . environments . has ( env . name ) )
76
+ . map ( ( v ) => {
77
+ const e = v . environments . get ( env . name ) !
78
+ const key = `${ v . id } -${ env . name } `
43
79
return [ key , e ] as const
80
+ } )
81
+ . map ( async ( [ key , env ] ) => {
82
+ await fs . mkdir ( join ( reportsDir , key , 'transforms' ) , { recursive : true } )
83
+
84
+ return await Promise . all ( [
85
+ writeJSON (
86
+ join ( reportsDir , key , 'modules.json' ) ,
87
+ env . getModulesList ( ) ,
88
+ ) ,
89
+ writeJSON (
90
+ join ( reportsDir , key , 'metric-plugins.json' ) ,
91
+ env . getPluginMetrics ( ) ,
92
+ ) ,
93
+ ...Object . entries ( env . data . transform )
94
+ . map ( ( [ id , info ] ) => writeJSON (
95
+ join ( reportsDir , key , 'transforms' , `${ hash ( id ) } .json` ) ,
96
+ < ModuleTransformInfo > {
97
+ resolvedId : id ,
98
+ transforms : info ,
99
+ } ,
100
+ ) ) ,
101
+ ] )
44
102
} ) ,
45
103
)
46
- . map ( async ( [ key , env ] ) => {
47
- await fs . mkdir ( join ( reportsDir , key , 'transforms' ) , { recursive : true } )
48
-
49
- return await Promise . all ( [
50
- writeJSON (
51
- join ( reportsDir , key , 'modules.json' ) ,
52
- env . getModulesList ( ) ,
53
- ) ,
54
- writeJSON (
55
- join ( reportsDir , key , 'metric-plugins.json' ) ,
56
- env . getPluginMetrics ( ) ,
57
- ) ,
58
- ...Object . entries ( env . data . transform )
59
- . map ( ( [ id , info ] ) => writeJSON (
60
- join ( reportsDir , key , 'transforms' , `${ hash ( id ) } .json` ) ,
61
- < ModuleTransformInfo > {
62
- resolvedId : id ,
63
- transforms : info ,
64
- } ,
65
- ) ) ,
66
- ] )
67
- } ) ,
68
- ] )
69
-
70
- return targetDir
104
+ } ,
105
+ }
71
106
}
72
107
73
108
function writeJSON ( filename : string , data : any ) {
0 commit comments