diff --git a/addon/ng2/blueprints/ng2/files/__path__/test.ts b/addon/ng2/blueprints/ng2/files/__path__/test.ts index 441850f153a0..d475430530b6 100644 --- a/addon/ng2/blueprints/ng2/files/__path__/test.ts +++ b/addon/ng2/blueprints/ng2/files/__path__/test.ts @@ -15,22 +15,22 @@ require('zone.js/dist/sync-test'); // RxJS require('rxjs/Rx'); -var testing = require('@angular/core/testing'); -var browser = require('@angular/platform-browser-dynamic/testing'); +let testing: any = require('@angular/core/testing'); +let browser: any = require('@angular/platform-browser-dynamic/testing'); testing.setBaseTestProviders( browser.TEST_BROWSER_DYNAMIC_PLATFORM_PROVIDERS, browser.TEST_BROWSER_DYNAMIC_APPLICATION_PROVIDERS ); -var testContext = require.context('../src', true, /\.spec\.ts/); +let testContext: any = require.context('../src', true, /\.spec\.ts/); /* * get all the files, for each file, call the context function * that will require the file and load it up here. Context will * loop and require those spec files here */ -function requireAll(requireContext) { +function requireAll(requireContext: any) { return requireContext.keys().map(requireContext); } diff --git a/addon/ng2/commands/build.ts b/addon/ng2/commands/build.ts index 3d7a36dd9e75..afb23572b315 100644 --- a/addon/ng2/commands/build.ts +++ b/addon/ng2/commands/build.ts @@ -4,8 +4,8 @@ const win = require('ember-cli/lib/utilities/windows-admin'); // const Build = require('../tasks/build'); // const BuildWatch = require('../tasks/build-watch'); -const WebpackBuild = require('../tasks/build-webpack'); -const WebpackBuildWatch = require('../tasks/build-webpack-watch'); +var WebpackBuild = require('../tasks/build-webpack'); +var WebpackBuildWatch = require('../tasks/build-webpack-watch'); interface BuildOptions { environment?: string; @@ -31,11 +31,22 @@ module.exports = Command.extend({ { name: 'm2', type: Boolean, default: false} ], - run: function(commandOptions: BuildOptions) { - - let buildTask = commandOptions.watch ? - new WebpackBuildWatch() : - new WebpackBuild(); + run: function (commandOptions: BuildOptions) { + var project = this.project; + var ui = this.ui; + var buildTask = commandOptions.watch ? + new WebpackBuildWatch({ + cliProject: project, + ui: ui, + outputPath: commandOptions.outputPath, + environment: commandOptions.environment + }) : + new WebpackBuild({ + cliProject: project, + ui: ui, + outputPath: commandOptions.outputPath, + environment: commandOptions.environment + }); console.log(buildTask); diff --git a/addon/ng2/commands/serve.ts b/addon/ng2/commands/serve.ts index 2052ec21d260..0537c2ad29a4 100644 --- a/addon/ng2/commands/serve.ts +++ b/addon/ng2/commands/serve.ts @@ -74,7 +74,6 @@ module.exports = Command.extend({ } const ServeWebpackTask = (require('../tasks/serve-webpack.ts')) - // var ServeTask = require('../tasks/serve'); var serve = new ServeWebpackTask({ ui: this.ui, diff --git a/addon/ng2/models/index.ts b/addon/ng2/models/index.ts index d4c8910e55e5..369f4c73d066 100644 --- a/addon/ng2/models/index.ts +++ b/addon/ng2/models/index.ts @@ -3,5 +3,6 @@ export * from './webpack-build-test'; export * from './webpack-build-production'; export * from './webpack-build-development'; export * from './webpack-build-utils'; +export {getWebpackMaterialConfig, getWebpackMaterialE2EConfig} from './webpack-build-material2.ts'; export * from './webpack-karma-config'; diff --git a/addon/ng2/models/webpack-build-common.ts b/addon/ng2/models/webpack-build-common.ts index 3533ecc88549..035381e4ebde 100644 --- a/addon/ng2/models/webpack-build-common.ts +++ b/addon/ng2/models/webpack-build-common.ts @@ -1,5 +1,4 @@ import * as webpack from 'webpack'; -import {ngAppResolve} from './webpack-build-utils'; const path = require('path'); const ForkCheckerPlugin = require('awesome-typescript-loader').ForkCheckerPlugin; @@ -7,86 +6,88 @@ const CopyWebpackPlugin = require('copy-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const DebugWebpackPlugin = require('debug-webpack-plugin'); -export const webpackCommonConfig = { - devtool: 'inline-source-map', - resolve: { - extensions: ['', '.ts', '.js'], - root: ngAppResolve('./src') - }, - context: path.resolve(__dirname, './'), - entry: { - main: [ngAppResolve('./src/main.ts')], - vendor: ngAppResolve('./src/vendor.ts'), - polyfills: ngAppResolve('./src/polyfills.ts') - }, - output: { - path: ngAppResolve('./dist'), - filename: '[name].bundle.js' - }, - module: { - preLoaders: [ - { - test: /\.js$/, - loader: 'source-map-loader', - exclude: [ - ngAppResolve('node_modules/rxjs'), - ngAppResolve('node_modules/@angular'), - ] - } - ], - loaders: [ - { - test: /\.ts$/, - loaders: [ - { - loader: 'awesome-typescript-loader', - query: { - useWebpackText: true, - tsconfig: ngAppResolve('./src/tsconfig.json'), - // resolveGlobs: false, - module: "es2015", - target: "es5", - lib: ['es6', 'dom'], - useForkChecker: true +export const getWebpackCommonConfig = function(projectRoot: string) { + return { + devtool: 'inline-source-map', + resolve: { + extensions: ['', '.ts', '.js'], + root: path.resolve(projectRoot, './src') + }, + context: path.resolve(__dirname, './'), + entry: { + main: [path.resolve(projectRoot, './src/main.ts')], + vendor: path.resolve(projectRoot, './src/vendor.ts'), + polyfills: path.resolve(projectRoot, './src/polyfills.ts') + }, + output: { + path: path.resolve(projectRoot, './dist'), + filename: '[name].bundle.js' + }, + module: { + preLoaders: [ + { + test: /\.js$/, + loader: 'source-map-loader', + exclude: [ + path.resolve(projectRoot, 'node_modules/rxjs'), + path.resolve(projectRoot, 'node_modules/@angular'), + ] + } + ], + loaders: [ + { + test: /\.ts$/, + loaders: [ + { + loader: 'awesome-typescript-loader', + query: { + useWebpackText: true, + tsconfig: path.resolve(projectRoot, './src/tsconfig.json'), + // resolveGlobs: false, + module: "es2015", + target: "es5", + lib: ['es6', 'dom'], + useForkChecker: true + } + }, + { + loader: 'angular2-template-loader' } - }, - { - loader: 'angular2-template-loader' - } - ], - exclude: [/\.(spec|e2e)\.ts$/] - }, - { test: /\.json$/, loader: 'json-loader'}, - { test: /\.css$/, loaders: ['raw-loader', 'postcss-loader'] }, - { test: /\.styl$/, loaders: ['raw-loader', 'postcss-loader', 'stylus-loader'] }, - { test: /\.less$/, loaders: ['raw-loader', 'postcss-loader', 'less-loader'] }, - { test: /\.scss$/, loaders: ['raw-loader', 'postcss-loader', 'sass-loader'] }, - { test: /\.(jpg|png)$/, loader: 'url-loader?limit=128000'}, - { test: /\.html$/, loader: 'raw-loader' } - ] - }, - plugins: [ - new ForkCheckerPlugin(), - new HtmlWebpackPlugin({ - template: ngAppResolve('src/index.html'), - chunksSortMode: 'dependency' - }), - new webpack.optimize.CommonsChunkPlugin({ - name: ['polyfills', 'vendor'].reverse() - }), - new webpack.optimize.CommonsChunkPlugin({ - minChunks: Infinity, - name: 'inline', - filename: 'inline.js', - sourceMapFilename: 'inline.map' - }), - new CopyWebpackPlugin([{from: ngAppResolve('./public'), to: ngAppResolve('./dist/public')}]) - ], - node: { - global: 'window', - crypto: 'empty', - module: false, - clearImmediate: false, - setImmediate: false + ], + exclude: [/\.(spec|e2e)\.ts$/] + }, + { test: /\.json$/, loader: 'json-loader'}, + { test: /\.css$/, loaders: ['raw-loader', 'postcss-loader'] }, + { test: /\.styl$/, loaders: ['raw-loader', 'postcss-loader', 'stylus-loader'] }, + { test: /\.less$/, loaders: ['raw-loader', 'postcss-loader', 'less-loader'] }, + { test: /\.scss$/, loaders: ['raw-loader', 'postcss-loader', 'sass-loader'] }, + { test: /\.(jpg|png)$/, loader: 'url-loader?limit=128000'}, + { test: /\.html$/, loader: 'raw-loader' } + ] + }, + plugins: [ + new ForkCheckerPlugin(), + new HtmlWebpackPlugin({ + template: path.resolve(projectRoot, 'src/index.html'), + chunksSortMode: 'dependency' + }), + new webpack.optimize.CommonsChunkPlugin({ + name: ['polyfills', 'vendor'].reverse() + }), + new webpack.optimize.CommonsChunkPlugin({ + minChunks: Infinity, + name: 'inline', + filename: 'inline.js', + sourceMapFilename: 'inline.map' + }), + new CopyWebpackPlugin([{from: path.resolve(projectRoot, './public'), to: path.resolve(projectRoot, './dist/public')}]) + ], + node: { + global: 'window', + crypto: 'empty', + module: false, + clearImmediate: false, + setImmediate: false + } } }; diff --git a/addon/ng2/models/webpack-build-development.ts b/addon/ng2/models/webpack-build-development.ts index 24676a9ae744..fc37a5d92b45 100644 --- a/addon/ng2/models/webpack-build-development.ts +++ b/addon/ng2/models/webpack-build-development.ts @@ -1,35 +1,27 @@ -import { webpackCommonConfig } from '../models'; -import { webpackMaterialConfig, webpackMaterialE2EConfig } from './webpack-build-material2'; -import { ngAppResolve } from './webpack-build-utils'; +const path = require('path') -const webpackMerge = require('webpack-merge'); - -const devConfigPartial = { - debug: true, - devtool: 'cheap-module-source-map', - output: { - path: ngAppResolve('./dist'), - filename: '[name].bundle.js', - sourceMapFilename: '[name].map', - chunkFilename: '[id].chunk.js' - }, - tslint: { - emitErrors: false, - failOnHint: false, - resourcePath: ngAppResolve('./src') - }, - node: { - global: 'window', - crypto: 'empty', - process: true, - module: false, - clearImmediate: false, - setImmediate: false - } +export const getWebpackDevConfigPartial = function(projectRoot: string) { + return { + debug: true, + devtool: 'cheap-module-source-map', + output: { + path: path.resolve(projectRoot, './dist'), + filename: '[name].bundle.js', + sourceMapFilename: '[name].map', + chunkFilename: '[id].chunk.js' + }, + tslint: { + emitErrors: false, + failOnHint: false, + resourcePath: path.resolve(projectRoot, './src') + }, + node: { + global: 'window', + crypto: 'empty', + process: true, + module: false, + clearImmediate: false, + setImmediate: false + } + }; } - -export const webpackDevConfig = webpackMerge(webpackCommonConfig, devConfigPartial); - -export const webpackDevMaterialConfig = webpackMerge(webpackMaterialConfig, devConfigPartial); - -export const webpackDevMaterialE2EConfig = webpackMerge(webpackMaterialE2EConfig, devConfigPartial); diff --git a/addon/ng2/models/webpack-build-material2.ts b/addon/ng2/models/webpack-build-material2.ts index 728c4aeb9612..17243573bed6 100644 --- a/addon/ng2/models/webpack-build-material2.ts +++ b/addon/ng2/models/webpack-build-material2.ts @@ -8,7 +8,6 @@ // This allows for angular2-template-loader to transpile the sass correctly. import * as webpack from 'webpack'; -import {ngAppResolve} from './webpack-build-utils'; const path = require('path'); const ForkCheckerPlugin = require('awesome-typescript-loader').ForkCheckerPlugin; @@ -34,189 +33,168 @@ var components = [ 'tabs', 'toolbar' ]; -/** Map relative paths to URLs. */ -var aliasMap: any = { - '@angular2-material/core': ngAppResolve('./src/core'), -}; -components.forEach(function (name) { - aliasMap[("@angular2-material/" + name)] = ngAppResolve("./src/components/" + name); - return aliasMap[("@angular2-material/" + name)] = ngAppResolve("./src/components/" + name); -}); +export const getWebpackMaterialConfig = function(projectRoot: string) { + /** Map relative paths to URLs. */ + var aliasMap: any = { + '@angular2-material/core': path.resolve(projectRoot, './src/core'), + }; -export const webpackMaterialConfig = { - devtool: 'inline-source-map', - resolve: { - extensions: ['', '.webpack.js', '.web.js', '.ts', '.tsx', '.js', '.css', '.scss'], - root: ngAppResolve('./'), - alias: aliasMap - }, - sassLoader: { - includePaths: [ - // This allows for automatic resolving of @import's for sass for variables. - ngAppResolve('./src/core/style') - ] - }, - debug: true, - context: path.resolve(__dirname, './'), - entry: { - main: [ngAppResolve('./src/demo-app/main.ts')], - vendor: ngAppResolve('./src/demo-app/vendor.ts') - }, - output: { - path: './dist', - filename: '[name].bundle.js' - }, - module: { - preLoaders: [ - { - test: /\.js$/, - loader: 'source-map-loader', - exclude: [ - ngAppResolve('node_modules/rxjs'), - ngAppResolve('node_modules/@angular'), - ] - } - ], - ts: { - configFileName: ngAppResolve('./src/demo-app/tsconfig.json') + components.forEach(function (name) { + aliasMap[("@angular2-material/" + name)] = path.resolve(projectRoot, "./src/components/" + name); + return aliasMap[("@angular2-material/" + name)] = path.resolve(projectRoot, "./src/components/" + name); + }); + + return { + devtool: 'inline-source-map', + resolve: { + extensions: ['', '.webpack.js', '.web.js', '.ts', '.tsx', '.js', '.css', '.scss'], + root: path.resolve(projectRoot, './'), + alias: aliasMap + }, + sassLoader: { + includePaths: [ + // This allows for automatic resolving of @import's for sass for variables. + path.resolve(projectRoot, './src/core/style') + ] + }, + debug: true, + context: path.resolve(__dirname, './'), + entry: { + main: [path.resolve(projectRoot, './src/demo-app/main.ts')], + vendor: path.resolve(projectRoot, './src/demo-app/vendor.ts') }, - loaders: [ - { - test: /\.ts$/, - loaders: [ - 'ts-loader', 'angular2-template-loader' - ], - exclude: [/\.(spec|e2e)\.ts$/] + output: { + path: './dist', + filename: '[name].bundle.js' + }, + module: { + preLoaders: [ + { + test: /\.js$/, + loader: 'source-map-loader', + exclude: [ + path.resolve(projectRoot, 'node_modules/rxjs'), + path.resolve(projectRoot, 'node_modules/@angular'), + ] + } + ], + ts: { + configFileName: path.resolve(projectRoot, './src/demo-app/tsconfig.json') }, - { test: /\.json$/, loader: 'json-loader'}, - { test: /\.css$/, loaders: ['raw-loader', 'postcss-loader'] }, - { test: /\.styl$/, loaders: ['raw-loader', 'postcss-loader', 'stylus-loader'] }, - { test: /\.less$/, loaders: ['raw-loader', 'less-loader'] }, - { test: /\.s?css$/, loaders: ['raw-loader', 'postcss-loader', 'sass-loader'] }, - { test: /\.(jpg|png)$/, loader: 'url-loader?limit=128000'}, - { test: /\.html$/, loader: 'raw-loader' } - ] - }, - plugins: [ - // new DebugWebpackPlugin({ - // // Defaults to ['webpack:*'] which can be VERY noisy, so try to be specific - // // scope: [ - // // 'webpack:compiler:*', // include compiler logs - // // 'webpack:plugin:ExamplePlugin' // include a specific plugin's logs - // // ], + loaders: [ + { + test: /\.ts$/, + loaders: [ + 'ts-loader', 'angular2-template-loader' + ], + exclude: [/\.(spec|e2e)\.ts$/] + }, + { test: /\.json$/, loader: 'json-loader'}, + { test: /\.css$/, loaders: ['raw-loader', 'postcss-loader'] }, + { test: /\.styl$/, loaders: ['raw-loader', 'postcss-loader', 'stylus-loader'] }, + { test: /\.less$/, loaders: ['raw-loader', 'less-loader'] }, + { test: /\.s?css$/, loaders: ['raw-loader', 'postcss-loader', 'sass-loader'] }, + { test: /\.(jpg|png)$/, loader: 'url-loader?limit=128000'}, + { test: /\.html$/, loader: 'raw-loader' } + ] + }, + plugins: [ + new webpack.optimize.CommonsChunkPlugin({name: 'vendor'}), + new ForkCheckerPlugin(), + new HtmlWebpackPlugin({ + template: path.resolve(projectRoot, './src/demo-app/index.html'), + chunksSortMode: 'dependency' + }), + ], + node: { + global: 'window', + crypto: 'empty', + module: false, + clearImmediate: false, + setImmediate: false + } + }; +} +export const getWebpackMaterialE2EConfig = function(projectRoot: Function) { + /** Map relative paths to URLs. */ + var aliasMap: any = { + '@angular2-material/core': path.resolve(projectRoot, './src/core'), + }; - // // // Inspect the arguments passed to an event - // // // These are triggered on emits - // // listeners: { - // // 'webpack:compiler:run': function(compiler) { - // // // Read some data out of the compiler - // // } - // // }, - // // Defaults to the compiler's setting - // debug: true - // }), - new webpack.optimize.CommonsChunkPlugin({name: 'vendor'}), - new ForkCheckerPlugin(), - new HtmlWebpackPlugin({ - template: ngAppResolve('./src/demo-app/index.html'), - chunksSortMode: 'dependency' - }), - ], - node: { - global: 'window', - crypto: 'empty', - module: false, - clearImmediate: false, - setImmediate: false - } -}; + components.forEach(function (name) { + aliasMap[("@angular2-material/" + name)] = path.resolve(projectRoot, "./src/components/" + name); + return aliasMap[("@angular2-material/" + name)] = path.resolve(projectRoot, "./src/components/" + name); + }); -export const webpackMaterialE2EConfig = { - devtool: 'inline-source-map', - resolve: { - extensions: ['', '.webpack.js', '.web.js', '.ts', '.tsx', '.js', '.css', '.scss'], - root: ngAppResolve('./'), - alias: aliasMap - }, - sassLoader: { - includePaths: [ - // This allows for automatic resolving of @import's for sass for variables. - ngAppResolve('./src/core/style') - ] - }, - debug: true, - context: path.resolve(__dirname, './'), - entry: { - main: [ngAppResolve('./src/e2e-app/main.ts')], - vendor: ngAppResolve('./src/e2e-app/vendor.ts') - }, - output: { - path: './dist', - filename: '[name].bundle.js' - }, - module: { - preLoaders: [ - { - test: /\.js$/, - loader: 'source-map-loader', - exclude: [ - ngAppResolve('node_modules/rxjs'), - ngAppResolve('node_modules/@angular'), - ] - } - ], - ts: { - configFileName: ngAppResolve('./src/e2e-app/tsconfig.json') + return { + devtool: 'inline-source-map', + resolve: { + extensions: ['', '.webpack.js', '.web.js', '.ts', '.tsx', '.js', '.css', '.scss'], + root: path.resolve(projectRoot, './'), + alias: aliasMap }, - loaders: [ - { - test: /\.ts$/, - loaders: [ - 'ts-loader', 'angular2-template-loader' - ], - exclude: [/\.(spec|e2e)\.ts$/] + sassLoader: { + includePaths: [ + // This allows for automatic resolving of @import's for sass for variables. + path.resolve(projectRoot, './src/core/style') + ] + }, + debug: true, + context: path.resolve(__dirname, './'), + entry: { + main: [path.resolve(projectRoot, './src/e2e/main.ts')], + vendor: path.resolve(projectRoot, './src/e2e/vendor.ts') + }, + output: { + path: './dist', + filename: '[name].bundle.js' + }, + module: { + preLoaders: [ + { + test: /\.js$/, + loader: 'source-map-loader', + exclude: [ + path.resolve(projectRoot, 'node_modules/rxjs'), + path.resolve(projectRoot, 'node_modules/@angular'), + ] + } + ], + ts: { + configFileName: path.resolve(projectRoot, './src/e2e/tsconfig.json') }, - { test: /\.json$/, loader: 'json-loader'}, - { test: /\.css$/, loaders: ['raw-loader', 'postcss-loader'] }, - { test: /\.styl$/, loaders: ['raw-loader', 'postcss-loader', 'stylus-loader'] }, - { test: /\.less$/, loaders: ['raw-loader', 'less-loader'] }, - { test: /\.s?css$/, loaders: ['raw-loader', 'postcss-loader', 'sass-loader'] }, - { test: /\.(jpg|png)$/, loader: 'url-loader?limit=128000'}, - { test: /\.html$/, loader: 'raw-loader' } - ] - }, - plugins: [ - // new DebugWebpackPlugin({ - // // Defaults to ['webpack:*'] which can be VERY noisy, so try to be specific - // // scope: [ - // // 'webpack:compiler:*', // include compiler logs - // // 'webpack:plugin:ExamplePlugin' // include a specific plugin's logs - // // ], - - // // // Inspect the arguments passed to an event - // // // These are triggered on emits - // // listeners: { - // // 'webpack:compiler:run': function(compiler) { - // // // Read some data out of the compiler - // // } - // // }, - // // Defaults to the compiler's setting - // debug: true - // }), - new webpack.optimize.CommonsChunkPlugin({name: 'vendor'}), - new ForkCheckerPlugin(), - new HtmlWebpackPlugin({ - template: ngAppResolve('./src/e2e-app/index.html'), - chunksSortMode: 'dependency' - }), - ], - node: { - global: 'window', - crypto: 'empty', - module: false, - clearImmediate: false, - setImmediate: false - } -}; - + loaders: [ + { + test: /\.ts$/, + loaders: [ + 'ts-loader', 'angular2-template-loader' + ], + exclude: [/\.(spec|e2e)\.ts$/] + }, + { test: /\.json$/, loader: 'json-loader'}, + { test: /\.css$/, loaders: ['raw-loader', 'postcss-loader'] }, + { test: /\.styl$/, loaders: ['raw-loader', 'postcss-loader', 'stylus-loader'] }, + { test: /\.less$/, loaders: ['raw-loader', 'less-loader'] }, + { test: /\.s?css$/, loaders: ['raw-loader', 'postcss-loader', 'sass-loader'] }, + { test: /\.(jpg|png)$/, loader: 'url-loader?limit=128000'}, + { test: /\.html$/, loader: 'raw-loader' } + ] + }, + plugins: [ + new webpack.optimize.CommonsChunkPlugin({name: 'vendor'}), + new ForkCheckerPlugin(), + new HtmlWebpackPlugin({ + template: path.resolve(projectRoot, './src/e2e/index.html'), + chunksSortMode: 'dependency' + }), + ], + node: { + global: 'window', + crypto: 'empty', + module: false, + clearImmediate: false, + setImmediate: false + } + }; +} diff --git a/addon/ng2/models/webpack-build-production.ts b/addon/ng2/models/webpack-build-production.ts index a5efa3243983..8ab79ff33d90 100644 --- a/addon/ng2/models/webpack-build-production.ts +++ b/addon/ng2/models/webpack-build-production.ts @@ -1,81 +1,69 @@ import * as webpack from 'webpack'; -import {webpackCommonConfig} from '../models/'; -import {webpackMaterialConfig, webpackMaterialE2EConfig} from './webpack-build-material2'; -import {ngAppResolve} from '../models/webpack-build-utils'; +const path = require('path'); const webpackMerge = require('webpack-merge'); // used to merge webpack configs const WebpackMd5Hash = require('webpack-md5-hash'); const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin'); //TODO WP2 Typings const CompressionPlugin = require("compression-webpack-plugin"); - - - -export const webpackProdConfigPartial = { - debug: false, - devtool: 'source-map', - output: { - path: ngAppResolve('./dist'), - filename: '[name].[chunkhash].bundle.js', - sourceMapFilename: '[name].[chunkhash].bundle.map', - chunkFilename: '[id].[chunkhash].chunk.js' - }, - plugins: [ - new WebpackMd5Hash(), - new webpack.optimize.DedupePlugin(), - // ~400kb (Doesn't do anything different (yet?)) - // new LoaderOptionsPlugin({ - // test: /\.js/, - // minimize: true, - // optimize: true, - // debug: false - // }), - // ~107kb - new webpack.optimize.UglifyJsPlugin({ - beautify: false, //prod - mangle: { screw_ie8 : true }, //prod - compress: { screw_ie8: true }, //prod - comments: false //prod - }), - new CompressionPlugin({ - asset: "[path].gz[query]", - algorithm: "gzip", - test: /\.js$|\.html$/, - threshold: 10240, - minRatio: 0.8 - }) - ], - tslint: { - emitErrors: true, - failOnHint: true, - resourcePath: ngAppResolve('./src') - }, - htmlLoader: { - minimize: true, - removeAttributeQuotes: false, - caseSensitive: true, - customAttrSurround: [ - [/#/, /(?:)/], - [/\*/, /(?:)/], - [/\[?\(?/, /(?:)/] +export const getWebpackProdConfigPartial = function(projectRoot: string) { + return { + debug: false, + devtool: 'source-map', + output: { + path: path.resolve(projectRoot, './dist'), + filename: '[name].[chunkhash].bundle.js', + sourceMapFilename: '[name].[chunkhash].bundle.map', + chunkFilename: '[id].[chunkhash].chunk.js' + }, + plugins: [ + new WebpackMd5Hash(), + new webpack.optimize.DedupePlugin(), + // ~400kb (Doesn't do anything different (yet?)) + // new LoaderOptionsPlugin({ + // test: /\.js/, + // minimize: true, + // optimize: true, + // debug: false + // }), + // ~107kb + new webpack.optimize.UglifyJsPlugin({ + beautify: false, //prod + mangle: { screw_ie8 : true }, //prod + compress: { screw_ie8: true }, //prod + comments: false //prod + }), + new CompressionPlugin({ + asset: "[path].gz[query]", + algorithm: "gzip", + test: /\.js$|\.html$/, + threshold: 10240, + minRatio: 0.8 + }) ], - customAttrAssign: [/\)?\]?=/] - }, - node: { - global: 'window', - crypto: 'empty', - process: false, - module: false, - clearImmediate: false, - setImmediate: false + tslint: { + emitErrors: true, + failOnHint: true, + resourcePath: path.resolve(projectRoot, './src') + }, + htmlLoader: { + minimize: true, + removeAttributeQuotes: false, + caseSensitive: true, + customAttrSurround: [ + [/#/, /(?:)/], + [/\*/, /(?:)/], + [/\[?\(?/, /(?:)/] + ], + customAttrAssign: [/\)?\]?=/] + }, + node: { + global: 'window', + crypto: 'empty', + process: false, + module: false, + clearImmediate: false, + setImmediate: false + } } }; - - -export const webpackProdConfig = webpackMerge(webpackCommonConfig, webpackProdConfigPartial); - -// @angular-material custom builds demo-app and e2e -export const webpackProdMaterialConfig = webpackMerge(webpackMaterialConfig, webpackProdConfigPartial); -export const webpackProdMaterialE2EConfig = webpackMerge(webpackMaterialE2EConfig, webpackProdConfigPartial); - - diff --git a/addon/ng2/models/webpack-build-utils.ts b/addon/ng2/models/webpack-build-utils.ts index 68aa0a2a0784..cb4f4b938083 100644 --- a/addon/ng2/models/webpack-build-utils.ts +++ b/addon/ng2/models/webpack-build-utils.ts @@ -1,8 +1,6 @@ const path = require('path'); const autoprefixer = require('autoprefixer'); -import {webpackDevConfig, webpackProdConfig} from './'; - export const ngAppResolve = (resolvePath: string): string => { return path.resolve(process.cwd(), resolvePath); } @@ -30,8 +28,3 @@ export const postCssConfiguration = () => { defaults: [autoprefixer] }; } - -export const envToConfigMap: any = { - production: webpackProdConfig, - development: webpackDevConfig -} diff --git a/addon/ng2/models/webpack-config.ts b/addon/ng2/models/webpack-config.ts new file mode 100644 index 000000000000..3b43a6e5172e --- /dev/null +++ b/addon/ng2/models/webpack-config.ts @@ -0,0 +1,65 @@ +import { + getWebpackCommonConfig, + getWebpackDevConfigPartial, + getWebpackProdConfigPartial, + getWebpackMaterialConfig, + getWebpackMaterialE2EConfig +} from './'; + +const webpackMerge = require('webpack-merge'); +const path = require('path'); + +export class NgCliWebpackConfig { + // TODO: When webpack2 types are finished lets replace all these any types + // so this is more maintainable in the future for devs + public config: any; + private webpackDevConfigPartial: any; + private webpackProdConfigPartial: any; + private webpackBaseConfig: any; + private webpackMaterialConfig: any; + private webpackMaterialE2EConfig: any; + + constructor(public ngCliProject: any, public environment: string) { + this.webpackBaseConfig = getWebpackCommonConfig(this.ngCliProject.root); + this.webpackMaterialConfig = getWebpackMaterialConfig(this.ngCliProject.root); + this.webpackMaterialE2EConfig = getWebpackMaterialE2EConfig(this.ngCliProject.root); + this.webpackDevConfigPartial = getWebpackDevConfigPartial(this.ngCliProject.root); + this.webpackProdConfigPartial = getWebpackProdConfigPartial(this.ngCliProject.root); + this.generateConfig(); + } + + generateConfig(): void { + switch (this.environment) { + case "d": + case "dev": + case "development": + case "develop": + this.config = webpackMerge(this.webpackBaseConfig, this.webpackDevConfigPartial); + break; + case "p": + case "prod": + case "production": + this.config = webpackMerge(this.webpackBaseConfig, this.webpackProdConfigPartial); + break; + case "d:m": + case "dev:mat": + case "dev:material": + case "development:mat": + case "development:material": + this.config = webpackMerge(this.webpackMaterialConfig, this.webpackDevConfigPartial); + break; + case "p:m": + case "prod:mat": + case "prod:material": + case "production:mat": + case "production:material": + this.config = webpackMerge(this.webpackMaterialConfig, this.webpackProdConfigPartial); + break; + default: + //TODO: Not sure what to put here. We have a default env passed anyways. + this.ngCliProject.ui.writeLine("Envrionment could not be determined while configuring your build system.", 3) + break; + } + } +} + diff --git a/addon/ng2/tasks/build-webpack-watch.ts b/addon/ng2/tasks/build-webpack-watch.ts index 4e6d7705adc7..a941d90c65cc 100644 --- a/addon/ng2/tasks/build-webpack-watch.ts +++ b/addon/ng2/tasks/build-webpack-watch.ts @@ -1,24 +1,19 @@ -import {webpackOutputOptions, webpackDevConfig, webpackProdConfig, webpackDevMaterialConfig} from '../models/'; +import {NgCliWebpackConfig} from '../models/webpack-config' +import {webpackOutputOptions} from '../models/'; import {ServeTaskOptions} from '../commands/serve'; -const Task = require('ember-cli/lib/models/task'); +var Task = require('ember-cli/lib/models/task'); const webpack = require('webpack'); const ProgressPlugin = require('webpack/lib/ProgressPlugin'); let lastHash: any = null; module.exports = Task.extend({ - run: (runTaskOptions: ServeTaskOptions) => { - let config; - - //TODO# Remove after testing material - if (runTaskOptions.environment === 'material') { - config = webpackDevMaterialConfig; - } else { - config = webpackDevConfig; - } + run: function(runTaskOptions: ServeTaskOptions) { + var project = this.cliProject; + const config = new NgCliWebpackConfig(project, runTaskOptions.environment).config; const webpackCompiler = webpack(config); webpackCompiler.apply(new ProgressPlugin({ diff --git a/addon/ng2/tasks/build-webpack.ts b/addon/ng2/tasks/build-webpack.ts index 56907ef64df9..651ca2770938 100644 --- a/addon/ng2/tasks/build-webpack.ts +++ b/addon/ng2/tasks/build-webpack.ts @@ -1,21 +1,24 @@ -import {webpackOutputOptions, webpackDevConfig, webpackProdConfig, webpackVendorDLLConfig} from '../models/'; - import {ServeTaskOptions} from '../commands/serve'; +import {NgCliWebpackConfig} from '../models/webpack-config' +import {webpackOutputOptions} from '../models/' // Configure build and output; -const Task = require('ember-cli/lib/models/task'); +var Task = require('ember-cli/lib/models/task'); const webpack = require('webpack'); let lastHash = null; module.exports = Task.extend({ // Options: String outputPath - run: (runTaskOptions: ServeTaskOptions) => { + run: function(runTaskOptions: ServeTaskOptions) { + + var project = this.cliProject; + var config = new NgCliWebpackConfig(project, runTaskOptions.environment).config; + const webpackCompiler = webpack(config); - // TODO#: Variable Config for environments. - const webpackCompiler = webpack(webpackProdConfig); const ProgressPlugin = require('webpack/lib/ProgressPlugin'); + webpackCompiler.apply(new ProgressPlugin({ profile: true })); diff --git a/addon/ng2/tasks/serve-webpack.ts b/addon/ng2/tasks/serve-webpack.ts index 7931cb103be5..b417fbda9eb5 100644 --- a/addon/ng2/tasks/serve-webpack.ts +++ b/addon/ng2/tasks/serve-webpack.ts @@ -1,12 +1,5 @@ -import { - webpackDevServerOutputOptions, - webpackOutputOptions, - webpackCommonConfig, - webpackDevMaterialConfig, - webpackProdMaterialConfig, - webpackDevMaterialE2EConfig, - webpackDevConfig, -} from '../models/'; +import {webpackDevServerOutputOptions} from '../models/'; +import {NgCliWebpackConfig} from '../models/webpack-config'; import {ServeTaskOptions} from '../commands/serve'; const path = require('path'); @@ -23,24 +16,27 @@ const ProgressPlugin = require('webpack/lib/ProgressPlugin'); let lastHash = null; module.exports = Task.extend({ - run: (commandOptions: ServeTaskOptions) => { - - + run: function(commandOptions: ServeTaskOptions) { let webpackCompiler: any; - if (commandOptions.environment === 'material') { - webpackDevMaterialConfig.entry.main.unshift(`webpack-dev-server/client?http://localhost:${commandOptions.port}/`); - webpackCompiler = webpack(webpackDevMaterialConfig); + // if (commandOptions.environment === 'material') { + // webpackDevMaterialConfig.entry.main.unshift(`webpack-dev-server/client?http://localhost:${commandOptions.port}/`); + // webpackCompiler = webpack(webpackDevMaterialConfig); + + // } else if (commandOptions.environment === 'e2e') { + // webpackDevMaterialE2EConfig.entry.main.unshift(`webpack-dev-server/client?http://localhost:${commandOptions.port}/`); + // webpackCompiler = webpack(webpackDevMaterialE2EConfig); - } else if (commandOptions.environment === 'e2e') { - webpackDevMaterialE2EConfig.entry.main.unshift(`webpack-dev-server/client?http://localhost:${commandOptions.port}/`); - webpackCompiler = webpack(webpackDevMaterialE2EConfig); + // } else { + // webpackDevConfig.entry.main.unshift(`webpack-dev-server/client?http://localhost:${commandOptions.port}/`); + // webpackCompiler = webpack(webpackDevConfig); + // } - } else { - webpackDevConfig.entry.main.unshift(`webpack-dev-server/client?http://localhost:${commandOptions.port}/`); - webpackCompiler = webpack(webpackDevConfig); + // since the .config method on the returned instance is just an object we can modify any part of it for our needs + var config = new NgCliWebpackConfig(this.project, commandOptions.environment).config; + config.entry.main.unshift(`webpack-dev-server/client?http://localhost:${commandOptions.port}/`); + webpackCompiler = webpack(config); - } webpackCompiler.apply(new ProgressPlugin({ profile: true, diff --git a/package.json b/package.json index 01a607a84dc4..6646c5557d38 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "typescript": "^1.9.0-dev.20160627-1.0", "typings": "^0.8.1", "url-loader": "^0.5.7", - "webpack": "2.1.0-beta.13", + "webpack": "2.1.0-beta.15", "webpack-closure-compiler": "^2.0.2", "webpack-dev-server": "^1.14.1", "webpack-md5-hash": "0.0.5",