-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathwebpack-helpers.js
83 lines (64 loc) · 2.51 KB
/
webpack-helpers.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
const path = require('path');
const { StatsWriterPlugin } = require('@regru/webpack-stats-plugin');
const safeDump = require('js-yaml').safeDump;
const CONFIG_FILTRES = { fonts: /\.(eot|woff(?:2)?|ttf)/ };
function getInitialModuleName( file ) {
return path.basename( file ).replace( /\.[0-9a-f]{32}/, '' );
}
function checkModuleByMask( file ) {
let isMatch = 0;
for ( let mask of Object.keys( CONFIG_FILTRES ) ) {
if ( CONFIG_FILTRES[ mask ].test( file ) ) {
isMatch = 1;
break;
}
}
return isMatch;
}
module.exports = {
getStatsWriterPlugin( project, options ) {
return new StatsWriterPlugin( {
filename : path.relative( options.output.path, `${process.cwd()}/config/frontend/${project}.yaml` ),
fields : [
'assetsByChunkName',
'assets',
],
transform( source ) {
const assets = source.assetsByChunkName;
const chunks = {};
const { publicPath } = options.output;
let modules;
for ( let chunkName of Object.keys( assets ) ) {
let files = assets[chunkName];
if ( !Array.isArray( files ) ) {
chunks[chunkName] = {
[path.extname( files ).replace( '.', '' )] : path.join( publicPath, files ),
};
continue;
}
chunks[chunkName] = assets[chunkName].reduce( ( result, file ) => {
if ( !file.match( chunkName ) ) {
return result;
}
result[ path.extname( file ).replace( '.', '' ) ] = path.join( publicPath, file );
return result;
}, {} );
}
modules = source.assets.reduce( ( result, moduleInfo ) => {
const file = moduleInfo.name;
if ( !checkModuleByMask( file ) ) {
return result;
}
result[ getInitialModuleName( file ) ] = path.join( publicPath, file );
return result;
}, {} );
return safeDump( {
'@default' : {
chunks,
modules,
},
} ).replace( '\'@default\'', '@default' );
},
} );
},
};