@@ -5,20 +5,37 @@ import * as webpack from 'webpack';
5
5
import { ForkCheckerPlugin } from 'awesome-typescript-loader' ;
6
6
import { CliConfig } from './config' ;
7
7
8
- export function getWebpackCommonConfig ( projectRoot : string , sourceDir : string ) {
8
+ export function getWebpackCommonConfig ( projectRoot : string , environment : string , appConfig : any ) {
9
+
10
+ const appRoot = path . resolve ( projectRoot , appConfig . root ) ;
11
+ const appMain = path . resolve ( appRoot , appConfig . main ) ;
12
+
13
+ const bundledWithMain = appConfig . additionalEntries
14
+ . filter ( entry => typeof entry === "string" )
15
+ . map ( filename => path . resolve ( appRoot , filename ) ) ;
16
+
17
+ const separateBundles = appConfig . additionalEntries . filter ( entry => typeof entry === "object" ) ;
18
+ const entries = Object . assign (
19
+ { main : [ appMain , ...bundledWithMain ] } ,
20
+ separateBundles . reduce ( ( obj , entry ) =>
21
+ Object . assign ( obj , { [ entry . output ] : path . resolve ( appRoot , entry . input ) } ) ,
22
+ { } )
23
+ ) ;
24
+
25
+ const additionalFiles = separateBundles
26
+ . map ( entry => path . resolve ( appRoot , entry . input ) )
27
+ . concat ( bundledWithMain ) ;
28
+
9
29
return {
10
30
devtool : 'source-map' ,
11
31
resolve : {
12
32
extensions : [ '' , '.ts' , '.js' ] ,
13
- root : path . resolve ( projectRoot , `./ ${ sourceDir } ` )
33
+ root : appRoot
14
34
} ,
15
35
context : path . resolve ( __dirname , './' ) ,
16
- entry : {
17
- main : [ path . resolve ( projectRoot , `./${ sourceDir } /main.ts` ) ] ,
18
- polyfills : path . resolve ( projectRoot , `./${ sourceDir } /polyfills.ts` )
19
- } ,
36
+ entry : entries ,
20
37
output : {
21
- path : path . resolve ( projectRoot , './dist' ) ,
38
+ path : path . resolve ( projectRoot , appConfig . outDir ) ,
22
39
filename : '[name].bundle.js'
23
40
} ,
24
41
module : {
@@ -30,7 +47,7 @@ export function getWebpackCommonConfig(projectRoot: string, sourceDir: string) {
30
47
loader : 'awesome-typescript-loader' ,
31
48
query : {
32
49
useForkChecker : true ,
33
- tsconfig : path . resolve ( projectRoot , `./ ${ sourceDir } / tsconfig.json` )
50
+ tsconfig : path . resolve ( appRoot , appConfig . tsconfig )
34
51
}
35
52
} ,
36
53
{
@@ -39,23 +56,47 @@ export function getWebpackCommonConfig(projectRoot: string, sourceDir: string) {
39
56
] ,
40
57
exclude : [ / \. ( s p e c | e 2 e ) \. t s $ / ]
41
58
} ,
42
- { test : / \. j s o n $ / , loader : 'json-loader' } ,
43
- { test : / \. c s s $ / , loaders : [ 'raw-loader' , 'postcss-loader' ] } ,
44
- { test : / \. s t y l $ / , loaders : [ 'raw-loader' , 'postcss-loader' , 'stylus-loader' ] } ,
45
- { test : / \. l e s s $ / , loaders : [ 'raw-loader' , 'postcss-loader' , 'less-loader' ] } ,
46
- { test : / \. s c s s $ | \. s a s s $ / , loaders : [ 'raw-loader' , 'postcss-loader' , 'sass-loader' ] } ,
47
- { test : / \. ( j p g | p n g ) $ / , loader : 'url-loader?limit=128000' } ,
48
- { test : / \. h t m l $ / , loader : 'raw-loader' }
59
+
60
+ // in main, load css as raw text
61
+ { exclude : additionalFiles , test : / \. c s s $ / , loaders : [ 'raw-loader' , 'postcss-loader' ] } ,
62
+ { exclude : additionalFiles , test : / \. s t y l $ / , loaders : [ 'raw-loader' , 'postcss-loader' , 'stylus-loader' ] } ,
63
+ { exclude : additionalFiles , test : / \. l e s s $ / , loaders : [ 'raw-loader' , 'postcss-loader' , 'less-loader' ] } ,
64
+ { exclude : additionalFiles , test : / \. s c s s $ | \. s a s s $ / , loaders : [ 'raw-loader' , 'postcss-loader' , 'sass-loader' ] } ,
65
+
66
+ // outside of main, load it via style-loader
67
+ { include : additionalFiles , test : / \. c s s $ / , loaders : [ 'style-loader' , 'css-loader' , 'postcss-loader' ] } ,
68
+ { include : additionalFiles , test : / \. s t y l $ / , loaders : [ 'style-loader' , 'css-loader' , 'postcss-loader' , 'stylus-loader' ] } ,
69
+ { include : additionalFiles , test : / \. l e s s $ / , loaders : [ 'style-loader' , 'css-loader' , 'postcss-loader' , 'less-loader' ] } ,
70
+ { include : additionalFiles , test : / \. s c s s $ | \. s a s s $ / , loaders : [ 'style-loader' , 'css-loader' , 'postcss-loader' , 'sass-loader' ] } ,
71
+
72
+ { test : / \. j s o n $ / , loader : 'json-loader' } ,
73
+ { test : / \. ( j p g | p n g ) $ / , loader : 'url-loader?limit=10000' } ,
74
+ { test : / \. h t m l $ / , loader : 'raw-loader' } ,
75
+
76
+ { test : / \. ( w o f f | w o f f 2 ) ( \? v = \d + \. \d + \. \d + ) ? $ / , loader : 'url?limit=10000&mimetype=application/font-woff' } ,
77
+ { test : / \. t t f ( \? v = \d + \. \d + \. \d + ) ? $ / , loader : 'url?limit=10000&mimetype=application/octet-stream' } ,
78
+ { test : / \. e o t ( \? v = \d + \. \d + \. \d + ) ? $ / , loader : 'file' } ,
79
+ { test : / \. s v g ( \? v = \d + \. \d + \. \d + ) ? $ / , loader : 'url?limit=10000&mimetype=image/svg+xml' }
49
80
]
50
81
} ,
51
82
plugins : [
52
83
new ForkCheckerPlugin ( ) ,
53
84
new HtmlWebpackPlugin ( {
54
- template : path . resolve ( projectRoot , `./ ${ sourceDir } / index.html` ) ,
85
+ template : path . resolve ( appRoot , appConfig . index ) ,
55
86
chunksSortMode : 'dependency'
56
87
} ) ,
88
+ new webpack . NormalModuleReplacementPlugin (
89
+ // escape the path to make a regex
90
+ // TODO: this isn't working!
91
+ new RegExp ( path . resolve ( appRoot , appConfig . environments . source )
92
+ . replace ( / [ \- \[ \] \/ \{ \} \( \) \* \+ \? \. \\ \^ \$ \| ] / g, "\\$&" ) ) ,
93
+ path . resolve ( appRoot , appConfig . environments [ environment ] )
94
+ ) ,
57
95
new webpack . optimize . CommonsChunkPlugin ( {
58
- name : [ 'polyfills' ]
96
+ name : separateBundles
97
+ . concat ( 'main' )
98
+ . map ( bundle => bundle . output )
99
+ . reverse ( )
59
100
} ) ,
60
101
new webpack . optimize . CommonsChunkPlugin ( {
61
102
minChunks : Infinity ,
@@ -64,9 +105,9 @@ export function getWebpackCommonConfig(projectRoot: string, sourceDir: string) {
64
105
sourceMapFilename : 'inline.map'
65
106
} ) ,
66
107
new CopyWebpackPlugin ( [ {
67
- context : path . resolve ( projectRoot , './public' ) ,
108
+ context : path . resolve ( appRoot , appConfig . assets ) ,
68
109
from : '**/*' ,
69
- to : path . resolve ( projectRoot , './dist' )
110
+ to : path . resolve ( projectRoot , appConfig . outDir , appConfig . assets )
70
111
} ] )
71
112
] ,
72
113
node : {
@@ -79,3 +120,4 @@ export function getWebpackCommonConfig(projectRoot: string, sourceDir: string) {
79
120
}
80
121
}
81
122
} ;
123
+
0 commit comments