@@ -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 : {
@@ -27,8 +44,8 @@ export function getWebpackCommonConfig(projectRoot: string, sourceDir: string) {
27
44
test : / \. j s $ / ,
28
45
loader : 'source-map-loader' ,
29
46
exclude : [
30
- path . resolve ( projectRoot , 'node_modules/rxjs' ) ,
31
- path . resolve ( projectRoot , 'node_modules/@angular' ) ,
47
+ path . resolve ( appRoot , 'node_modules/rxjs' ) ,
48
+ path . resolve ( appRoot , 'node_modules/@angular' ) ,
32
49
]
33
50
}
34
51
] ,
@@ -40,7 +57,7 @@ export function getWebpackCommonConfig(projectRoot: string, sourceDir: string) {
40
57
loader : 'awesome-typescript-loader' ,
41
58
query : {
42
59
useForkChecker : true ,
43
- tsconfig : path . resolve ( projectRoot , `./ ${ sourceDir } / tsconfig.json` )
60
+ tsconfig : path . resolve ( appRoot , appConfig . tsconfig )
44
61
}
45
62
} ,
46
63
{
@@ -49,23 +66,47 @@ export function getWebpackCommonConfig(projectRoot: string, sourceDir: string) {
49
66
] ,
50
67
exclude : [ / \. ( s p e c | e 2 e ) \. t s $ / ]
51
68
} ,
52
- { test : / \. j s o n $ / , loader : 'json-loader' } ,
53
- { test : / \. c s s $ / , loaders : [ 'raw-loader' , 'postcss-loader' ] } ,
54
- { test : / \. s t y l $ / , loaders : [ 'raw-loader' , 'postcss-loader' , 'stylus-loader' ] } ,
55
- { test : / \. l e s s $ / , loaders : [ 'raw-loader' , 'postcss-loader' , 'less-loader' ] } ,
56
- { test : / \. s c s s $ | \. s a s s $ / , loaders : [ 'raw-loader' , 'postcss-loader' , 'sass-loader' ] } ,
57
- { test : / \. ( j p g | p n g ) $ / , loader : 'url-loader?limit=128000' } ,
58
- { test : / \. h t m l $ / , loader : 'raw-loader' }
69
+
70
+ // in main, load css as raw text
71
+ { exclude : additionalFiles , test : / \. c s s $ / , loaders : [ 'raw-loader' , 'postcss-loader' ] } ,
72
+ { exclude : additionalFiles , test : / \. s t y l $ / , loaders : [ 'raw-loader' , 'postcss-loader' , 'stylus-loader' ] } ,
73
+ { exclude : additionalFiles , test : / \. l e s s $ / , loaders : [ 'raw-loader' , 'postcss-loader' , 'less-loader' ] } ,
74
+ { exclude : additionalFiles , test : / \. s c s s $ | \. s a s s $ / , loaders : [ 'raw-loader' , 'postcss-loader' , 'sass-loader' ] } ,
75
+
76
+ // outside of main, load it via style-loader
77
+ { include : additionalFiles , test : / \. c s s $ / , loaders : [ 'style-loader' , 'css-loader' , 'postcss-loader' ] } ,
78
+ { include : additionalFiles , test : / \. s t y l $ / , loaders : [ 'style-loader' , 'css-loader' , 'postcss-loader' , 'stylus-loader' ] } ,
79
+ { include : additionalFiles , test : / \. l e s s $ / , loaders : [ 'style-loader' , 'css-loader' , 'postcss-loader' , 'less-loader' ] } ,
80
+ { include : additionalFiles , test : / \. s c s s $ | \. s a s s $ / , loaders : [ 'style-loader' , 'css-loader' , 'postcss-loader' , 'sass-loader' ] } ,
81
+
82
+ { test : / \. j s o n $ / , loader : 'json-loader' } ,
83
+ { test : / \. ( j p g | p n g ) $ / , loader : 'url-loader?limit=10000' } ,
84
+ { test : / \. h t m l $ / , loader : 'raw-loader' } ,
85
+
86
+ { test : / \. ( w o f f | w o f f 2 ) ( \? v = \d + \. \d + \. \d + ) ? $ / , loader : 'url?limit=10000&mimetype=application/font-woff' } ,
87
+ { test : / \. t t f ( \? v = \d + \. \d + \. \d + ) ? $ / , loader : 'url?limit=10000&mimetype=application/octet-stream' } ,
88
+ { test : / \. e o t ( \? v = \d + \. \d + \. \d + ) ? $ / , loader : 'file' } ,
89
+ { test : / \. s v g ( \? v = \d + \. \d + \. \d + ) ? $ / , loader : 'url?limit=10000&mimetype=image/svg+xml' }
59
90
]
60
91
} ,
61
92
plugins : [
62
93
new ForkCheckerPlugin ( ) ,
63
94
new HtmlWebpackPlugin ( {
64
- template : path . resolve ( projectRoot , `./ ${ sourceDir } / index.html` ) ,
95
+ template : path . resolve ( appRoot , appConfig . index ) ,
65
96
chunksSortMode : 'dependency'
66
97
} ) ,
98
+ new webpack . NormalModuleReplacementPlugin (
99
+ // escape the path to make a regex
100
+ // TODO: this isn't working!
101
+ new RegExp ( path . resolve ( appRoot , appConfig . environments . source )
102
+ . replace ( / [ \- \[ \] \/ \{ \} \( \) \* \+ \? \. \\ \^ \$ \| ] / g, "\\$&" ) ) ,
103
+ path . resolve ( appRoot , appConfig . environments [ environment ] )
104
+ ) ,
67
105
new webpack . optimize . CommonsChunkPlugin ( {
68
- name : [ 'polyfills' ]
106
+ name : separateBundles
107
+ . concat ( 'main' )
108
+ . map ( bundle => bundle . output )
109
+ . reverse ( )
69
110
} ) ,
70
111
new webpack . optimize . CommonsChunkPlugin ( {
71
112
minChunks : Infinity ,
@@ -74,9 +115,9 @@ export function getWebpackCommonConfig(projectRoot: string, sourceDir: string) {
74
115
sourceMapFilename : 'inline.map'
75
116
} ) ,
76
117
new CopyWebpackPlugin ( [ {
77
- context : path . resolve ( projectRoot , './public' ) ,
118
+ context : path . resolve ( appRoot , appConfig . assets ) ,
78
119
from : '**/*' ,
79
- to : path . resolve ( projectRoot , './dist' )
120
+ to : path . resolve ( projectRoot , appConfig . outDir , appConfig . assets )
80
121
} ] )
81
122
] ,
82
123
node : {
@@ -89,3 +130,4 @@ export function getWebpackCommonConfig(projectRoot: string, sourceDir: string) {
89
130
}
90
131
}
91
132
} ;
133
+
0 commit comments