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,18 +28,20 @@ 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
- const initialFiles = Object . keys ( entrypoints )
41
- . map ( ( name ) => entrypoints [ name ] . assets . map ( ( item ) => item . name ) )
42
- . reduce ( ( assets , all ) => all . concat ( assets ) , [ ] )
43
- . filter ( ( file ) => isJS ( file ) || isCSS ( file ) )
37
+ const initialFiles =
38
+ Object . keys ( entrypoints )
39
+ . map (
40
+ ( name ) =>
41
+ entrypoints [ name ] . assets ?. map ( ( item ) => item . name ) ?? [ ] ,
42
+ )
43
+ . reduce ( ( assets , all ) => all . concat ( assets ) , [ ] )
44
+ . filter ( ( file ) => isJS ( file ) || isCSS ( file ) ) ?? [ ]
44
45
45
46
// get files that should be loaded asynchronously
46
47
// i.e. script and style files that are not included in the initial entry files
@@ -51,18 +52,19 @@ export const createClientPlugin = (
51
52
52
53
// get asset modules
53
54
const assetModules = modules . filter (
54
- ( m ) : m is FnModules & Required < Pick < FnModules , 'assets' > > =>
55
- ! ! ( m . assets && m . assets . length ) ,
55
+ ( m ) : m is StatsModule & Required < Pick < StatsModule , 'assets' > > =>
56
+ Boolean ( m . assets ? .length ) ,
56
57
)
57
58
58
59
// get modules for client manifest
59
60
const manifestModules : ClientManifest [ 'modules' ] = { }
60
61
61
- const fileToIndex = ( file : string ) : number => allFiles . indexOf ( file )
62
+ const fileToIndex = ( file : number | string ) : number =>
63
+ allFiles . indexOf ( file . toString ( ) )
62
64
63
65
modules . forEach ( ( m ) => {
64
66
// ignore modules duplicated in multiple chunks
65
- if ( m . chunks . length !== 1 ) {
67
+ if ( m . chunks ? .length !== 1 ) {
66
68
return
67
69
}
68
70
@@ -75,21 +77,21 @@ export const createClientPlugin = (
75
77
76
78
// remove appended hash of module identifier
77
79
// which is the request string of the module
78
- const request = m . identifier . replace ( / \| \w + $ / , '' )
80
+ const request = m . identifier ? .replace ( / \| \w + $ / , '' )
79
81
80
82
// get chunk files index
81
83
const files = [ ...chunk . files . map ( fileToIndex ) ]
82
84
83
85
// find all asset modules associated with the same chunk
84
86
assetModules . forEach ( ( m ) => {
85
- if ( m . chunks . some ( ( id ) => id === cid ) ) {
87
+ if ( m . chunks ? .some ( ( id ) => id === cid ) ) {
86
88
// get asset files
87
89
files . push ( ...m . assets . map ( fileToIndex ) )
88
90
}
89
91
} )
90
92
91
93
// map the module request to files index
92
- manifestModules [ request ] = files
94
+ if ( request ) manifestModules [ request ] = files
93
95
} )
94
96
95
97
// generate client manifest json file
0 commit comments