Skip to content

Commit 033f053

Browse files
author
Rafat Rashid
authored
systemjs to webpack (#3)
1 parent ebfa5b1 commit 033f053

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+326
-100
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
app/out/
1+
compiled/
2+
dist/
23
docs/
34
.DS_Store
45
node_modules/
6+
npm-debug.log

README.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,22 @@ Proof of concept Angular 2 app.
1313
## Screen Clipping
1414
![App Screen](https://raw.github.com/EnemyUnited/angular2app/master/resources/screen.png)
1515

16+
## Useful Commands
17+
```sh
18+
npm start # start webpack dev server and watch for changes
19+
npm run build # minify and build production bundles under dist/
20+
```
21+
1622
## Documentation
1723
Angular documentation is generated using https://compodoc.github.io/compodoc/. Generate the html pages with:
18-
```
24+
```sh
1925
npm run docs
2026
```
2127

2228
## Recommended IDEs
2329
- Atom: https://atom.io/
2430
- And install Atom's TypeScript package: https://atom.io/packages/atom-typescript
2531
- Visual Code: https://code.visualstudio.com/
32+
33+
## Reference
34+
- Webpack configuration: https://v2.angular.io/docs/ts/latest/guide/webpack.html

config/helpers.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
var path = require('path');
2+
var _root = path.resolve(__dirname, '..');
3+
4+
function root(args) {
5+
args = Array.prototype.slice.call(arguments, 0);
6+
return path.join.apply(path, [_root].concat(args));
7+
}
8+
9+
exports.root = root;

config/karma.conf.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
var webpackConfig = require('./webpack.test');
2+
3+
module.exports = function(config) {
4+
var _config = {
5+
basePath: '',
6+
7+
frameworks: ['jasmine'],
8+
9+
files: [{
10+
pattern: './src/test.js',
11+
watched: false
12+
}],
13+
14+
preprocessors: {
15+
'./src/test.js': ['webpack', 'sourcemap']
16+
},
17+
18+
webpack: webpackConfig,
19+
20+
webpackMiddleware: {
21+
stats: 'errors-only'
22+
},
23+
24+
webpackServer: {
25+
noInfo: true
26+
},
27+
28+
reporters: ['kjhtml'],
29+
port: 9876,
30+
colors: true,
31+
logLevel: config.LOG_INFO,
32+
autoWatch: false,
33+
browsers: ['Chrome'],
34+
singleRun: true
35+
};
36+
37+
config.set(_config);
38+
};

config/webpack.common.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
var webpack = require('webpack');
2+
var helpers = require('./helpers');
3+
4+
var HtmlWebpackPlugin = require('html-webpack-plugin');
5+
var ExtractTextPlugin = require('extract-text-webpack-plugin');
6+
7+
module.exports = {
8+
entry: {
9+
'polyfills': './src/polyfills.ts',
10+
'vendor': './src/vendor.ts',
11+
'app': './src/main.ts'
12+
},
13+
14+
resolve: {
15+
extensions: ['.ts', '.js']
16+
},
17+
18+
module: {
19+
rules: [{
20+
test: /\.ts$/,
21+
loaders: ['awesome-typescript-loader', 'angular2-template-loader']
22+
}, {
23+
test: /\.html$/,
24+
loader: 'html-loader'
25+
}, {
26+
test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,
27+
loader: 'file-loader?name=assets/[name].[hash].[ext]'
28+
}, {
29+
test: /\.css$/,
30+
exclude: helpers.root('src', 'app'),
31+
loader: ExtractTextPlugin.extract({
32+
fallbackLoader: 'style-loader',
33+
loader: 'css-loader?sourceMap'
34+
})
35+
}, {
36+
test: /\.css$/,
37+
include: helpers.root('src', 'app'),
38+
loader: 'raw-loader'
39+
}]
40+
},
41+
42+
plugins: [
43+
// Workaround for angular/angular#11580
44+
new webpack.ContextReplacementPlugin(
45+
// The (\\|\/) piece accounts for path separators in *nix and Windows
46+
/angular(\\|\/)core(\\|\/)(esm(\\|\/)src|src)(\\|\/)linker/,
47+
helpers.root('./src'), // location of your src
48+
{} // a map of your routes
49+
),
50+
51+
new webpack.optimize.CommonsChunkPlugin({
52+
name: ['app', 'vendor', 'polyfills']
53+
}),
54+
55+
new HtmlWebpackPlugin({
56+
template: 'src/index.html'
57+
})
58+
]
59+
};

config/webpack.dev.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
var webpackMerge = require('webpack-merge');
2+
var ExtractTextPlugin = require('extract-text-webpack-plugin');
3+
4+
var helpers = require('./helpers');
5+
var commonConfig = require('./webpack.common.js');
6+
7+
module.exports = webpackMerge(commonConfig, {
8+
devtool: 'cheap-module-eval-source-map',
9+
10+
output: {
11+
path: helpers.root('dist'),
12+
publicPath: 'http://localhost:8080/',
13+
filename: '[name].js',
14+
chunkFilename: '[id].chunk.js'
15+
},
16+
17+
plugins: [
18+
new ExtractTextPlugin('[name].css')
19+
],
20+
21+
devServer: {
22+
historyApiFallback: true,
23+
stats: 'minimal'
24+
}
25+
});

config/webpack.prod.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
var webpack = require('webpack');
2+
var webpackMerge = require('webpack-merge');
3+
var ExtractTextPlugin = require('extract-text-webpack-plugin');
4+
5+
var helpers = require('./helpers');
6+
var commonConfig = require('./webpack.common.js');
7+
8+
const ENV = process.env.NODE_ENV = process.env.ENV = 'production';
9+
10+
module.exports = webpackMerge(commonConfig, {
11+
devtool: 'source-map',
12+
13+
output: {
14+
path: helpers.root('dist'),
15+
publicPath: '/',
16+
filename: '[name].[hash].js',
17+
chunkFilename: '[id].[hash].chunk.js'
18+
},
19+
20+
plugins: [
21+
new webpack.NoEmitOnErrorsPlugin(),
22+
new webpack.optimize.UglifyJsPlugin({ // https://github.com/angular/angular/issues/10618
23+
mangle: {
24+
keep_fnames: true
25+
}
26+
}),
27+
new ExtractTextPlugin('[name].[hash].css'),
28+
new webpack.DefinePlugin({
29+
'process.env': {
30+
'ENV': JSON.stringify(ENV)
31+
}
32+
}),
33+
new webpack.LoaderOptionsPlugin({
34+
htmlLoader: {
35+
minimize: false // workaround for ng2
36+
}
37+
})
38+
]
39+
});

config/webpack.test.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
var webpack = require('webpack');
2+
var helpers = require('./helpers');
3+
4+
module.exports = {
5+
devtool: 'inline-source-map',
6+
7+
resolve: {
8+
extensions: ['.ts', '.js']
9+
},
10+
11+
module: {
12+
rules: [{
13+
test: /\.ts$/,
14+
loaders: ['awesome-typescript-loader', 'angular2-template-loader']
15+
}, {
16+
test: /\.html$/,
17+
loader: 'html-loader'
18+
}, {
19+
test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,
20+
loader: 'null-loader'
21+
}, {
22+
test: /\.css$/,
23+
exclude: helpers.root('src', 'app'),
24+
loader: 'null-loader'
25+
}, {
26+
test: /\.css$/,
27+
include: helpers.root('src', 'app'),
28+
loader: 'raw-loader'
29+
}]
30+
},
31+
32+
plugins: [
33+
new webpack.ContextReplacementPlugin(
34+
// The (\\|\/) piece accounts for path separators in *nix and Windows
35+
/angular(\\|\/)core(\\|\/)(esm(\\|\/)src|src)(\\|\/)linker/,
36+
helpers.root('./src'), // location of your src
37+
{} // a map of your routes
38+
)
39+
]
40+
}

index.html

Lines changed: 0 additions & 33 deletions
This file was deleted.

karma.conf.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = require('./config/karma.conf.js');

package.json

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
"version": "1.0.0",
44
"description": "Angular 2 App",
55
"scripts": {
6+
"start": "webpack-dev-server --inline --progress --port 8080",
7+
"test": "karma start",
8+
"build": "rimraf dist && webpack --config config/webpack.prod.js --progress --profile --bail",
69
"docs": "compodoc -p tsconfig.json -d docs",
7-
"start": "tsc && concurrently \"tsc -w\" \"lite-server\" ",
8-
"lint": "tslint ./app/**/*.ts -t verbose || true",
9-
"lite": "lite-server",
10-
"tsc": "tsc",
11-
"tsc:w": "tsc -w"
10+
"lint": "tslint ./app/**/*.ts -t verbose || true"
1211
},
1312
"keywords": [],
1413
"author": "Rafat Rashid",
@@ -25,22 +24,33 @@
2524
"bootstrap": "^3.3.7",
2625
"core-js": "^2.4.1",
2726
"rxjs": "5.0.1",
28-
"systemjs": "0.19.40",
2927
"zone.js": "^0.7.4"
3028
},
3129
"devDependencies": {
32-
"@types/jasmine": "^2.5.36",
33-
"@types/node": "^6.0.46",
34-
"canonical-path": "0.0.2",
30+
"@types/jasmine": "2.5.36",
31+
"@types/node": "^6.0.45",
32+
"angular2-template-loader": "^0.6.0",
33+
"awesome-typescript-loader": "^3.0.4",
3534
"compodoc": "0.0.41",
36-
"concurrently": "^3.1.0",
37-
"http-server": "^0.9.0",
38-
"lite-server": "^2.2.2",
39-
"lodash": "^4.16.4",
40-
"rimraf": "^2.5.4",
35+
"css-loader": "^0.26.1",
36+
"extract-text-webpack-plugin": "2.0.0-beta.5",
37+
"file-loader": "^0.9.0",
38+
"html-loader": "^0.4.3",
39+
"html-webpack-plugin": "^2.16.1",
40+
"jasmine-core": "^2.4.1",
41+
"karma": "^1.2.0",
42+
"karma-chrome-launcher": "^2.0.0",
43+
"karma-jasmine": "^1.0.2",
44+
"karma-sourcemap-loader": "^0.3.7",
45+
"karma-webpack": "^2.0.1",
46+
"null-loader": "^0.1.1",
47+
"raw-loader": "^0.5.1",
48+
"rimraf": "^2.5.2",
49+
"style-loader": "^0.13.1",
4150
"tslint": "^3.15.1",
42-
"typedoc": "^0.5.9",
43-
"typescript": "~2.0.10"
44-
},
45-
"repository": {}
51+
"typescript": "~2.0.10",
52+
"webpack": "2.2.1",
53+
"webpack-dev-server": "2.4.1",
54+
"webpack-merge": "^3.0.0"
55+
}
4656
}

app/app.component.ts renamed to src/app/app.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Component } from '@angular/core';
66

77
@Component({
88
selector: 'my-app',
9-
templateUrl: 'app/app.template.html',
9+
templateUrl: './app.template.html',
1010
})
1111

1212
export class AppComponent { }
File renamed without changes.
File renamed without changes.

app/common/components/singleSelectDropdown.component.ts renamed to src/app/common/components/singleSelectDropdown.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { AbstractValueAccessor, AccessorProvider } from '../library/abstractValu
55

66
@Component({
77
selector: 'ix-dropdown-single[ngModel]',
8-
templateUrl: 'app/common/components/singleSelectDropdown.template.html',
8+
templateUrl: './singleSelectDropdown.template.html',
99
providers: [AccessorProvider(SingleSelectDropdownComponent)],
1010
host: { '(selectedChange)': 'onChange($event)' },
1111
})
File renamed without changes.
File renamed without changes.
File renamed without changes.

app/heroes/components/hero-form.component.ts renamed to src/app/heroes/components/hero-form.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { HeroesService } from '../services/heroes.service';
1010

1111
@Component({
1212
selector: 'hero-form',
13-
templateUrl: 'app/heroes/components/hero-form.template.html'
13+
templateUrl: './hero-form.template.html'
1414
})
1515

1616
export class HeroFormComponent implements OnInit {

app/heroes/components/hero-roster.component.ts renamed to src/app/heroes/components/hero-roster.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { HeroesService } from '../services/heroes.service';
99

1010
@Component({
1111
selector: 'hero-roster',
12-
templateUrl: 'app/heroes/components/hero-roster.template.html'
12+
templateUrl: './hero-roster.template.html'
1313
})
1414

1515
export class HeroRosterComponent implements OnInit {
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

app/heroes/services/heroes.service.ts renamed to src/app/heroes/services/heroes.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ export class HeroesService {
1414

1515
constructor(private api: ApiService) { }
1616

17-
private heroesUrl = 'app/heroes/models/heroes.json';
18-
private powersUrl = 'app/heroes/models/powers.json';
17+
private heroesUrl = 'src/app/heroes/models/heroes.json';
18+
private powersUrl = 'src/app/heroes/models/powers.json';
1919

2020
getPowers(): Observable<any[]> {
2121
return this.api.get(this.powersUrl);
File renamed without changes.

0 commit comments

Comments
 (0)