1
1
import { fs } from '@vuepress/utils'
2
- import type { WebpackPluginInstance } from 'webpack'
3
- import type { FnModules , StatsToJsonOutput } from '../../types.webpack.js'
2
+ import type { StatsModule , WebpackPluginInstance } from 'webpack'
4
3
import { isCSS , isJS } from './utils.js'
5
4
6
5
export interface ClientManifest {
@@ -29,17 +28,17 @@ export const createClientPlugin = (
29
28
modules = [ ] ,
30
29
entrypoints = { } ,
31
30
chunks = [ ] ,
32
- } : StatsToJsonOutput = compilation
33
- . getStats ( )
34
- . toJson ( ) as unknown as StatsToJsonOutput
31
+ } = compilation . getStats ( ) . toJson ( )
35
32
36
33
// get all files
37
34
const allFiles = assets . map ( ( a ) => a . name )
38
35
39
36
// get initial entry files
40
37
const initialFiles = Object . keys ( entrypoints )
41
- . map ( ( name ) => entrypoints [ name ] . assets . map ( ( item ) => item . name ) )
42
- . reduce ( ( assets , all ) => all . concat ( assets ) , [ ] )
38
+ . flatMap (
39
+ ( name ) =>
40
+ entrypoints [ name ] . assets ?. map ( ( item ) => item . name ) ?? [ ] ,
41
+ )
43
42
. filter ( ( file ) => isJS ( file ) || isCSS ( file ) )
44
43
45
44
// get files that should be loaded asynchronously
@@ -51,18 +50,19 @@ export const createClientPlugin = (
51
50
52
51
// get asset modules
53
52
const assetModules = modules . filter (
54
- ( m ) : m is FnModules & Required < Pick < FnModules , 'assets' > > =>
55
- ! ! ( m . assets && m . assets . length ) ,
53
+ ( m ) : m is StatsModule & Required < Pick < StatsModule , 'assets' > > =>
54
+ Boolean ( m . assets ? .length ) ,
56
55
)
57
56
58
57
// get modules for client manifest
59
58
const manifestModules : ClientManifest [ 'modules' ] = { }
60
59
61
- const fileToIndex = ( file : string ) : number => allFiles . indexOf ( file )
60
+ const fileToIndex = ( file : number | string ) : number =>
61
+ allFiles . indexOf ( file . toString ( ) )
62
62
63
63
modules . forEach ( ( m ) => {
64
64
// ignore modules duplicated in multiple chunks
65
- if ( m . chunks . length !== 1 ) {
65
+ if ( m . chunks ? .length !== 1 ) {
66
66
return
67
67
}
68
68
@@ -75,21 +75,21 @@ export const createClientPlugin = (
75
75
76
76
// remove appended hash of module identifier
77
77
// which is the request string of the module
78
- const request = m . identifier . replace ( / \| \w + $ / , '' )
78
+ const request = m . identifier ? .replace ( / \| \w + $ / , '' )
79
79
80
80
// get chunk files index
81
81
const files = [ ...chunk . files . map ( fileToIndex ) ]
82
82
83
83
// find all asset modules associated with the same chunk
84
84
assetModules . forEach ( ( m ) => {
85
- if ( m . chunks . some ( ( id ) => id === cid ) ) {
85
+ if ( m . chunks ? .some ( ( id ) => id === cid ) ) {
86
86
// get asset files
87
87
files . push ( ...m . assets . map ( fileToIndex ) )
88
88
}
89
89
} )
90
90
91
91
// map the module request to files index
92
- manifestModules [ request ] = files
92
+ if ( request ) manifestModules [ request ] = files
93
93
} )
94
94
95
95
// generate client manifest json file
0 commit comments