From a483c63fff69384340adcbeaf7f8b1e4a831e9ba Mon Sep 17 00:00:00 2001 From: Christopher Joslyn Date: Thu, 4 May 2017 21:17:54 -0400 Subject: [PATCH 1/8] migrate application to use mocha + sinon-chai testing frameworks (#1) (#6) Co-authored-by: Owen Buckley --- karma.conf.js | 22 +- package.json | 10 +- .../footer/footer.component.spec.js | 12 +- .../header/header.component.spec.js | 10 +- .../navigation/navigation.component.spec.js | 16 +- src/services/users/users.service.spec.js | 66 +++--- yarn.lock | 210 ++++++++++++++++-- 7 files changed, 272 insertions(+), 74 deletions(-) diff --git a/karma.conf.js b/karma.conf.js index d6b56f9..7303c0c 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -6,29 +6,34 @@ const webpackConfig = require('./webpack.config.common'); // TODO issues with karma and CommonChunksPlugin // https://github.com/webpack/karma-webpack/issues/24 -webpackConfig.plugins[2] = function() {}; +webpackConfig.plugins[webpackConfig.plugins.length - 1] = function() {}; +// dont fail on eslint errors while developing +webpackConfig.module.rules[0].use[1].options.failOnError = isProductionBuild; module.exports = function(config) { const logLevel = isProductionBuild ? config.LOG_DEBUG : config.LOG_INFO; config.set({ basePath: './', - frameworks: ['jasmine'], + frameworks: ['mocha', 'sinon-chai'], files: [ + // included here to ensure proper loading order and availablity of jquery + angular + mocks to Karma + { pattern: './node_modules/jquery/dist/jquery.js', watched: false }, { pattern: './node_modules/angular/angular.js', watched: false }, { pattern: './node_modules/angular-mocks/angular-mocks.js', watched: false }, - { pattern: 'src/**/*.spec.js', watched: false } + { pattern: './src/**/*.spec.js', watched: true } ], preprocessors: { - '**/*.spec.js': ['webpack', 'coverage'] + 'src/**/*.js': ['webpack', 'sourcemap', 'coverage'] }, webpack: webpackConfig, reporters: ['progress', 'dots', 'junit', 'coverage'], port: 9876, + browserDisconnectTolerance: 1, logLevel: logLevel, autoWatch: shouldWatch, browsers: [browser], @@ -36,14 +41,15 @@ module.exports = function(config) { concurrency: Infinity, junitReporter: { outputDir: './reports/', - outputFile: 'test-results.xml', + outputFile: 'test-results/test-results.xml', suite: 'seed-webapp', useBrowserName: false }, coverageReporter: { - type : 'cobertura', - dir : './reports', - subdir: 'coverage' + type: 'cobertura', + dir: './reports', + subdir: 'test-coverage/phantomjs', + file: 'coverage.xml' } }); diff --git a/package.json b/package.json index fe879ad..23394d6 100644 --- a/package.json +++ b/package.json @@ -33,13 +33,15 @@ "angular-aria": "^1.6.3", "angular-material": "^1.1.3", "angular-ui-router": "^0.4.2", - "http-server": "^0.9.0" + "http-server": "^0.9.0", + "jquery": "^3.2.1" }, "devDependencies": { "angular-mocks": "^1.6.4", "babel-core": "^6.24.0", "babel-loader": "^6.4.1", "babel-preset-es2015": "^6.24.0", + "chai": "^3.5.0", "css-loader": "^0.27.3", "css-to-string-loader": "^0.1.2", "eslint": "^3.18.0", @@ -54,12 +56,18 @@ "karma-coverage": "^1.1.1", "karma-jasmine": "^1.1.0", "karma-junit-reporter": "^1.2.0", + "karma-mocha": "^1.3.0", "karma-phantomjs-launcher": "^1.0.4", + "karma-sinon-chai": "^1.3.1", + "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "^2.0.3", + "mocha": "^3.3.0", "ng-annotate-webpack-plugin": "^0.2.1-pre", "node-sass": "^4.5.2", "rimraf": "^2.6.1", "sass-loader": "^6.0.3", + "sinon": "^2.2.0", + "sinon-chai": "^2.10.0", "style-loader": "^0.16.1", "webpack": "^2.3.2", "webpack-dev-server": "^2.4.2", diff --git a/src/components/footer/footer.component.spec.js b/src/components/footer/footer.component.spec.js index 5fefba6..cd2ffe8 100644 --- a/src/components/footer/footer.component.spec.js +++ b/src/components/footer/footer.component.spec.js @@ -22,18 +22,18 @@ describe('tgh.component.footer', () => { }); it('should test the footer component exists', () => { - expect(scope).toBeDefined(); - expect(element).toBeDefined(); - expect(element.find('footer').length).toBe(1); + expect(scope).to.not.be.undefined; + expect(element).to.not.be.undefined; + expect(element.find('footer').length).to.equal(1); }); it('should test the year is correct', () => { let year = new Date().getFullYear(); let copyright = element.find('p'); - expect(copyright.html()).toBe('© 2014 - ' + year); - expect(copyright.length).toBe(1); - expect(copyright.hasClass('copyright')).toBe(true); + expect(copyright.html()).to.equal('© 2014 - ' + year); + expect(copyright.length).to.equal(1); + expect(copyright.hasClass('copyright')).to.equal(true); }); }); \ No newline at end of file diff --git a/src/components/header/header.component.spec.js b/src/components/header/header.component.spec.js index 22bab0c..1604d8c 100644 --- a/src/components/header/header.component.spec.js +++ b/src/components/header/header.component.spec.js @@ -22,16 +22,16 @@ describe('tgh.component.header', () => { }); it('should test the header component exists', () => { - expect(scope).toBeDefined(); - expect(element).toBeDefined(); - expect(element.find('header').length).toBe(1); + expect(scope).to.not.be.undefined; + expect(element).to.not.be.undefined; + expect(element.find('header').length).to.equal(1); }); it('should test the banner text is correct is correct', () => { let banner = element.find('h2'); - expect(banner.html()).toBe('The Greenhouse.io - AngularJS / Webpack Starter Kit'); - expect(banner.length).toBe(1); + expect(banner.html()).to.equal('The Greenhouse.io - AngularJS / Webpack Starter Kit'); + expect(banner.length).to.equal(1); }); }); \ No newline at end of file diff --git a/src/components/navigation/navigation.component.spec.js b/src/components/navigation/navigation.component.spec.js index 424154d..398d4d7 100644 --- a/src/components/navigation/navigation.component.spec.js +++ b/src/components/navigation/navigation.component.spec.js @@ -22,20 +22,20 @@ describe('tgh.component.navigation', () => { }); it('should test the navigation component exists', () => { - expect(scope).toBeDefined(); - expect(element).toBeDefined(); - expect(element.find('nav').length).toBe(1); - expect(element.find('ul').length).toBe(1); + expect(scope).to.not.be.undefined; + expect(element).to.not.be.undefined; + expect(element.find('nav').length).to.equal(1); + expect(element.find('ul').length).to.equal(1); }); it('should test that links are set correctly', () => { let links = element.find('a'); - expect(element.find('li').length).toBe(2); - expect(element.find('a').length).toBe(2); + expect(element.find('li').length).to.equal(2); + expect(element.find('a').length).to.equal(2); - expect(links[0].text).toBe('Home'); - expect(links[1].text).toBe('Users'); + expect(links[0].text).to.equal('Home'); + expect(links[1].text).to.equal('Users'); }); }); \ No newline at end of file diff --git a/src/services/users/users.service.spec.js b/src/services/users/users.service.spec.js index 1e5fb2b..00cff70 100644 --- a/src/services/users/users.service.spec.js +++ b/src/services/users/users.service.spec.js @@ -12,37 +12,37 @@ describe('tgh.services.users', () => { }); it('should test the service exists', () => { - expect(UsersService).toBeDefined(); - expect(usersService).toBeDefined(); - expect(usersService.getUsers).toBeDefined(); - expect(usersService.getPrimaryUser).toBeDefined(); - expect(usersService.addUser).toBeDefined(); - expect(usersService.deleteUser).toBeDefined(); + expect(UsersService).to.not.be.undefined; + expect(usersService).to.not.be.undefined; + expect(usersService.getUsers).to.not.be.undefined; + expect(usersService.getPrimaryUser).to.not.be.undefined; + expect(usersService.addUser).to.not.be.undefined; + expect(usersService.deleteUser).to.not.be.undefined; }); it('should test that first call to getUsers returns expected default users', () => { let users = usersService.getUsers(); - expect(users.length).toBe(2); + expect(users.length).to.equal(2); - expect(users[0].id).toBe(1); - expect(users[0].firstName).toBe('Owen'); - expect(users[0].lastName).toBe('Buckley'); - expect(users[0].isPrimary).toBe(true); + expect(users[0].id).to.equal(1); + expect(users[0].firstName).to.equal('Owen'); + expect(users[0].lastName).to.equal('Buckley'); + expect(users[0].isPrimary).to.equal(true); - expect(users[1].id).toBe(2); - expect(users[1].firstName).toBe('The'); - expect(users[1].lastName).toBe('Greenhouse'); - expect(users[1].isPrimary).toBe(false); + expect(users[1].id).to.equal(2); + expect(users[1].firstName).to.equal('The'); + expect(users[1].lastName).to.equal('Greenhouse'); + expect(users[1].isPrimary).to.equal(false); }); it('should test that getPrimaryUser call works as expected', () => { let primaryUser = new UsersService().getPrimaryUser(); - expect(primaryUser.id).toBe(1); - expect(primaryUser.firstName).toBe('Owen'); - expect(primaryUser.lastName).toBe('Buckley'); - expect(primaryUser.isPrimary).toBe(true); + expect(primaryUser.id).to.equal(1); + expect(primaryUser.firstName).to.equal('Owen'); + expect(primaryUser.lastName).to.equal('Buckley'); + expect(primaryUser.isPrimary).to.equal(true); }); it('should test that addUsers call works as expected', () => { @@ -66,16 +66,16 @@ describe('tgh.services.users', () => { } }); - expect(found).toBe(true); + expect(found).to.equal(true); }); it('should test that getPrimaryUser call works as expected', () => { let primaryUser = usersService.getPrimaryUser(); - expect(primaryUser.id).toBe(1); - expect(primaryUser.firstName).toBe('Owen'); - expect(primaryUser.lastName).toBe('Buckley'); - expect(primaryUser.isPrimary).toBe(true); + expect(primaryUser.id).to.equal(1); + expect(primaryUser.firstName).to.equal('Owen'); + expect(primaryUser.lastName).to.equal('Buckley'); + expect(primaryUser.isPrimary).to.equal(true); }); it('should test that deleteUsers call works as expected when starting with default users', () => { @@ -105,17 +105,17 @@ describe('tgh.services.users', () => { // get users users = usersService.getUsers(); - expect(users.length).toBe(2); + expect(users.length).to.equal(2); - expect(users[0].id).toBe(1); - expect(users[0].firstName).toBe('Owen'); - expect(users[0].lastName).toBe('Buckley'); - expect(users[0].isPrimary).toBe(true); + expect(users[0].id).to.equal(1); + expect(users[0].firstName).to.equal('Owen'); + expect(users[0].lastName).to.equal('Buckley'); + expect(users[0].isPrimary).to.equal(true); - expect(users[1].id).toBe(2); - expect(users[1].firstName).toBe('The'); - expect(users[1].lastName).toBe('Greenhouse'); - expect(users[1].isPrimary).toBe(false); + expect(users[1].id).to.equal(2); + expect(users[1].firstName).to.equal('The'); + expect(users[1].lastName).to.equal('Greenhouse'); + expect(users[1].isPrimary).to.equal(false); }); }); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 20cc24d..dc1680c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -214,6 +214,10 @@ assert@^1.1.1: dependencies: util "0.10.3" +assertion-error@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" + ast-types@0.9.6: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" @@ -798,6 +802,10 @@ brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + browserify-aes@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-0.4.0.tgz#067149b668df31c4b58533e02d01e806d8608e2c" @@ -966,6 +974,14 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" +chai@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" + dependencies: + assertion-error "^1.0.1" + deep-eql "^0.1.3" + type-detect "^1.0.0" + chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -1137,7 +1153,7 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@2.9.x, commander@^2.9.0: +commander@2.9.0, commander@2.9.x, commander@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: @@ -1493,6 +1509,12 @@ debug@2.3.3: dependencies: ms "0.7.2" +debug@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" + dependencies: + ms "0.7.2" + debug@2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351" @@ -1509,6 +1531,12 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" +deep-eql@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" + dependencies: + type-detect "0.1.1" + deep-extend@~0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" @@ -1566,6 +1594,10 @@ di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" +diff@3.2.0, diff@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + diffie-hellman@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" @@ -1840,7 +1872,7 @@ escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -2252,6 +2284,12 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" +formatio@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" + dependencies: + samsam "1.x" + forwarded@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" @@ -2369,24 +2407,24 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" +glob@7.1.1, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@~7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "2 || 3" + minimatch "^3.0.2" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@~7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" dependencies: - fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.2" + minimatch "2 || 3" once "^1.3.0" path-is-absolute "^1.0.0" @@ -2428,6 +2466,10 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + handle-thing@^1.2.4: version "1.2.5" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" @@ -3042,6 +3084,10 @@ jpeg-js@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.2.0.tgz#53e448ec9d263e683266467e9442d2c5a2ef5482" +jquery@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787" + js-base64@^2.1.9: version "2.1.9" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" @@ -3150,6 +3196,12 @@ karma-junit-reporter@^1.2.0: path-is-absolute "^1.0.0" xmlbuilder "8.2.2" +karma-mocha@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-1.3.0.tgz#eeaac7ffc0e201eb63c467440d2b69c7cf3778bf" + dependencies: + minimist "1.2.0" + karma-phantomjs-launcher@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz#d23ca34801bda9863ad318e3bb4bd4062b13acd2" @@ -3157,6 +3209,18 @@ karma-phantomjs-launcher@^1.0.4: lodash "^4.0.1" phantomjs-prebuilt "^2.1.7" +karma-sinon-chai@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/karma-sinon-chai/-/karma-sinon-chai-1.3.1.tgz#4633419494d9e2d848787dd76053031859f5b7f5" + dependencies: + lolex "^1.6.0" + +karma-sourcemap-loader@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz#91322c77f8f13d46fed062b042e1009d4c4505d8" + dependencies: + graceful-fs "^4.1.2" + karma-webpack@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-2.0.3.tgz#39cebf5ca2580139b27f9ae69b78816b9c82fae6" @@ -3292,6 +3356,29 @@ loader-utils@^1.0.1, loader-utils@^1.0.2: emojis-list "^2.0.0" json5 "^0.5.0" +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + lodash.assign@^4.0.3, lodash.assign@^4.0.6, lodash.assign@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" @@ -3304,6 +3391,30 @@ lodash.clonedeep@^4.3.2: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + lodash.memoize@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -3343,6 +3454,10 @@ log4js@^0.6.31: readable-stream "~1.0.2" semver "~4.3.3" +lolex@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" + longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" @@ -3509,7 +3624,7 @@ minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: +minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -3532,6 +3647,22 @@ mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdi dependencies: minimist "0.0.8" +mocha@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.3.0.tgz#d29b7428d3f52c82e2e65df1ecb7064e1aabbfb5" + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.6.0" + diff "3.2.0" + escape-string-regexp "1.0.5" + glob "7.1.1" + growl "1.9.2" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" @@ -3548,6 +3679,10 @@ nan@^2.3.0, nan@^2.3.2: version "2.5.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2" +native-promise-only@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -4008,6 +4143,12 @@ path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" +path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + dependencies: + isarray "0.0.1" + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -4821,6 +4962,10 @@ safe-buffer@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" +samsam@1.x, samsam@^1.1.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.2.1.tgz#edd39093a3184370cb859243b2bdf255e7d8ea67" + sass-graph@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.1.2.tgz#965104be23e8103cb7e5f710df65935b317da57b" @@ -4953,6 +5098,23 @@ simple-is@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" +sinon-chai@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.10.0.tgz#6ab3008bb8cae9929e744d766574b4cf35f34b5b" + +sinon@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-2.2.0.tgz#3b1b42ff5defcbf51a52a62aca6d61171b9fd262" + dependencies: + diff "^3.1.0" + formatio "1.2.0" + lolex "^1.6.0" + native-promise-only "^0.8.1" + path-to-regexp "^1.7.0" + samsam "^1.1.3" + text-encoding "0.6.4" + type-detect "^4.0.0" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -5232,11 +5394,17 @@ style-loader@^0.16.1: dependencies: loader-utils "^1.0.2" +supports-color@3.1.2, supports-color@^3.1.0, supports-color@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + dependencies: + has-flag "^1.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -supports-color@^3.1.0, supports-color@^3.1.1, supports-color@^3.2.3: +supports-color@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" dependencies: @@ -5302,6 +5470,10 @@ tar@^2.0.0, tar@^2.2.1: fstream "^1.0.2" inherits "2" +text-encoding@0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" + text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -5413,6 +5585,18 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-detect@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" + +type-detect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" + +type-detect@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea" + type-is@~1.6.14: version "1.6.14" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" From 43451de8a74dac6d986cd4fa4d1373f85f4cf895 Mon Sep 17 00:00:00 2001 From: Christopher Joslyn Date: Thu, 4 May 2017 21:26:05 -0400 Subject: [PATCH 2/8] lint top-level JS files (#8) (#9) --- package.json | 2 +- webpack.config.common.js | 4 ++-- webpack.config.develop.js | 7 ++++--- webpack.config.prod.js | 11 ++++++----- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 23394d6..7962ae1 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "A starter kit for using AngularJS with Webpack and ES6", "main": "src/index.js", "scripts": { - "build": "rimraf ./build && webpack --config ./webpack.config.prod.js", + "build": "rimraf ./build && eslint *.js && webpack --config ./webpack.config.prod.js", "develop": "webpack-dev-server --config ./webpack.config.develop.js --open", "serve": "webpack --config ./webpack.config.prod.js -p --progress --profile --bail && http-server ./build -o", "test:unit": "rimraf ./reports && karma start" diff --git a/webpack.config.common.js b/webpack.config.common.js index 1a381f5..bd9c379 100644 --- a/webpack.config.common.js +++ b/webpack.config.common.js @@ -21,7 +21,7 @@ module.exports = { presets: [ ['es2015', { modules: false }] ] - }, + } }, { loader: 'eslint-loader', options: { @@ -30,7 +30,7 @@ module.exports = { } }] }, { - test: /\.html$/, + test: /\.html$/, use: [{ loader: 'html-loader' }] diff --git a/webpack.config.develop.js b/webpack.config.develop.js index 39d4eef..07c74bc 100644 --- a/webpack.config.develop.js +++ b/webpack.config.develop.js @@ -1,14 +1,15 @@ +const path = require('path'); const webpackMerge = require('webpack-merge'); const commonConfig = require('./webpack.config.common.js'); module.exports = webpackMerge(commonConfig, { output: { - path: __dirname + './build', + path: path.join(__dirname, 'build'), filename: '[name].bundle.js', sourceMapFilename: '[name].map', chunkFilename: '[id].chunk.js', library: 'ac_[name]', - libraryTarget: 'var', + libraryTarget: 'var' }, devServer: { @@ -21,7 +22,7 @@ module.exports = webpackMerge(commonConfig, { aggregateTimeout: 300, poll: 1000 }, - proxy:{ + proxy: { '/api/*': { target: 'http://', secure: false, diff --git a/webpack.config.prod.js b/webpack.config.prod.js index c18d79b..965578d 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -1,5 +1,6 @@ +const path = require('path'); const commonConfig = require('./webpack.config.common'); -const ExtractTextPlugin = require("extract-text-webpack-plugin"); +const ExtractTextPlugin = require('extract-text-webpack-plugin'); const UglifyJsPlugin = require('webpack/lib/optimize/UglifyJsPlugin'); const WebpackMd5Hash = require('webpack-md5-hash'); const webpackMerge = require('webpack-merge'); @@ -10,10 +11,10 @@ module.exports = webpackMerge(commonConfig, { devtool: 'source-map', output: { - path: __dirname + '/build', + path: path.join(__dirname, 'build'), filename: '[name].[chunkhash].bundle.js', sourceMapFilename: '[name].[chunkhash].bundle.map', - chunkFilename: '[id].[chunkhash].chunk.js', + chunkFilename: '[id].[chunkhash].chunk.js' }, plugins: [ @@ -23,8 +24,8 @@ module.exports = webpackMerge(commonConfig, { new WebpackMd5Hash(), new UglifyJsPlugin({ beautify: false, - mangle: { screw_ie8 : true, keep_fnames: true }, - compress: { screw_ie8: true }, + mangle: { screw_ie8: true, keep_fnames: true }, // eslint-disable-line camelcase + compress: { screw_ie8: true }, // eslint-disable-line camelcase comments: false, sourceMap: true }), From fd338c01da97f12996330b1760160c5e7b14d48c Mon Sep 17 00:00:00 2001 From: Christopher Joslyn Date: Tue, 16 May 2017 17:36:51 -0400 Subject: [PATCH 3/8] prefer Array.find over Array.filter then select first item (#12) (#13) These changes are a refactor. --- src/services/users/users.service.js | 4 +--- src/services/users/users.service.spec.js | 8 +++----- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/services/users/users.service.js b/src/services/users/users.service.js index a7bb502..cc2da35 100644 --- a/src/services/users/users.service.js +++ b/src/services/users/users.service.js @@ -18,9 +18,7 @@ export default class UsersService { } getPrimaryUser() { - return this.users.filter((user) => { - return user.isPrimary; - })[0]; + return this.users.find(user => user.isPrimary); } addUser(firstName, lastName) { diff --git a/src/services/users/users.service.spec.js b/src/services/users/users.service.spec.js index 00cff70..7919db5 100644 --- a/src/services/users/users.service.spec.js +++ b/src/services/users/users.service.spec.js @@ -93,11 +93,9 @@ describe('tgh.services.users', () => { users = usersService.getUsers(); // get our user - user = users.filter((user) => { - if ((user.firstName + user.lastName) === (newUser.firstName + newUser.lastName)) { - return user; - } - })[0]; + user = users.find((user) => { + return (user.firstName + user.lastName) === (newUser.firstName + newUser.lastName); + }); // add a user usersService.deleteUser(user.id); From f0480bd0ac8f0e812042d97fd914bde81ed60464 Mon Sep 17 00:00:00 2001 From: Christopher Joslyn Date: Wed, 17 May 2017 09:16:58 -0400 Subject: [PATCH 4/8] README mentions Vagrant but repo lacks Vagrantfile (#15) The README.md at line 50 said "(Vagrant will do this for you)", referencing `yarn install`, but the repository has no Vagrantfile. Assuming it will not have Vagrantfile, I recommend removing this note to avoid confusion. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4449e09..6fba8e5 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ Recommended plugins to have are: $ npm install -g yarn@0.21.3 ``` -3) Now install the build and application dependencies by running `$ yarn install` (Vagrant will do this for you) +3) Now install the build and application dependencies by running `$ yarn install` ## Project Layout An overview of important files and configurations for the applications @@ -160,4 +160,4 @@ $ yarn add ## AWS Info **//TODO Document Your AWS Info here (NO CREDENTIALS!!!!)** * s3 bucket - -* cloudfront distribution - \ No newline at end of file +* cloudfront distribution - From 0f54c9d29819f2a27252506908b43647416e3299 Mon Sep 17 00:00:00 2001 From: Christopher Joslyn Date: Fri, 19 May 2017 11:59:49 -0400 Subject: [PATCH 5/8] patch prod test environment with Array.find polyfill (#16) (#17) --- karma.conf.js | 1 + package.json | 1 + yarn.lock | 4 ++++ 3 files changed, 6 insertions(+) diff --git a/karma.conf.js b/karma.conf.js index 7303c0c..9295836 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -18,6 +18,7 @@ module.exports = function(config) { basePath: './', frameworks: ['mocha', 'sinon-chai'], files: [ + { pattern: './node_modules/phantomjs-polyfill-find/find-polyfill.js', watched: false }, // included here to ensure proper loading order and availablity of jquery + angular + mocks to Karma { pattern: './node_modules/jquery/dist/jquery.js', watched: false }, { pattern: './node_modules/angular/angular.js', watched: false }, diff --git a/package.json b/package.json index 7962ae1..1c2b1df 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,7 @@ "mocha": "^3.3.0", "ng-annotate-webpack-plugin": "^0.2.1-pre", "node-sass": "^4.5.2", + "phantomjs-polyfill-find": "ptim/phantomjs-polyfill-find", "rimraf": "^2.6.1", "sass-loader": "^6.0.3", "sinon": "^2.2.0", diff --git a/yarn.lock b/yarn.lock index dc1680c..cff5e76 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4175,6 +4175,10 @@ performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" +phantomjs-polyfill-find@ptim/phantomjs-polyfill-find: + version "0.0.1" + resolved "https://codeload.github.com/ptim/phantomjs-polyfill-find/tar.gz/026b69dcabe743265f5214775e42f8d1e8aabedc" + phantomjs-prebuilt@^2.1.10, phantomjs-prebuilt@^2.1.7: version "2.1.14" resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.14.tgz#d53d311fcfb7d1d08ddb24014558f1188c516da0" From 237c9ced4537b3604a3c6099fc0828f9f29c2328 Mon Sep 17 00:00:00 2001 From: Christopher Joslyn Date: Tue, 23 May 2017 13:27:19 -0400 Subject: [PATCH 6/8] implement an example of lazy-loading (#3) (#11) - lazy load the user state controller and template - add a reference in README to lazy loading in the wiki documentation As implemented, the lazy-loading employed here leverages webpack 2's support for the pending dynamic import syntax. Eslint and babel now include plugins and configurations that accept the new syntax. Here's how it works: The dynamic import requests the files needed for the application's routes. It provides the promise returned by the templateProvider function for each route. For the controller, the approach is more indirect. At the time of configuration, the route knows its controller by name, but that is all. Within a resolve function, the ocLazyLoad service injects the module that registers the controller. Now, when the router looks up the controller by name it finds it in the registry. Note: Grouping the related imports in a common chunk requires the use of a "magic comment", which in turn required a webpack upgrade. --- .babelrc | 3 ++ .eslintrc | 1 + README.md | 2 +- package.json | 7 +++- src/views/home/home.controller.module.js | 5 +++ src/views/users/users.config.js | 14 ++++--- src/views/users/users.controller.module.js | 5 +++ src/views/users/users.module.js | 4 +- yarn.lock | 46 +++++++++++++++------- 9 files changed, 64 insertions(+), 23 deletions(-) create mode 100644 .babelrc create mode 100644 src/views/home/home.controller.module.js create mode 100644 src/views/users/users.controller.module.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..796fcff --- /dev/null +++ b/.babelrc @@ -0,0 +1,3 @@ +{ + "plugins": ["syntax-dynamic-import"] +} diff --git a/.eslintrc b/.eslintrc index 5d27a96..caf9299 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,4 +1,5 @@ { + "parser": "babel-eslint", "parserOptions": { "ecmaVersion": 6, "sourceType": "module" diff --git a/README.md b/README.md index 6fba8e5..92b104e 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ a feather) organization. * _src_ - application code * _src/components/_ - resusable UI features, typically directives. A `BootstrapComponent` has been designated to manage starting up the application, from _index.js_ * _src/services/_ - APIs for handling backend REST APIs or browser APIs, non UI related "helpers" -* _src/views/_ - routable states ("pages"), generally exposed with `class` controllers +* _src/views/_ - routable states ("pages"), generally exposed with `class` controllers. Some are configured to [lazy load](https://github.com/kenzanmedia/angularjs-webpack-seed/wiki#lazy-loading). * _src/index.html_ - main layout of the application * _src/index.js_ - main entry way into the application and pulls in the application's `BootstrapComponent` * _src/routes.js_ - routes for the application, maps to different views diff --git a/package.json b/package.json index 1c2b1df..17f9dc9 100644 --- a/package.json +++ b/package.json @@ -34,12 +34,15 @@ "angular-material": "^1.1.3", "angular-ui-router": "^0.4.2", "http-server": "^0.9.0", - "jquery": "^3.2.1" + "jquery": "^3.2.1", + "oclazyload": "^1.1.0" }, "devDependencies": { "angular-mocks": "^1.6.4", "babel-core": "^6.24.0", + "babel-eslint": "^7.2.3", "babel-loader": "^6.4.1", + "babel-plugin-syntax-dynamic-import": "^6.18.0", "babel-preset-es2015": "^6.24.0", "chai": "^3.5.0", "css-loader": "^0.27.3", @@ -70,7 +73,7 @@ "sinon": "^2.2.0", "sinon-chai": "^2.10.0", "style-loader": "^0.16.1", - "webpack": "^2.3.2", + "webpack": "^2.5.1", "webpack-dev-server": "^2.4.2", "webpack-md5-hash": "^0.0.5", "webpack-merge": "^4.1.0" diff --git a/src/views/home/home.controller.module.js b/src/views/home/home.controller.module.js new file mode 100644 index 0000000..ee2c4ac --- /dev/null +++ b/src/views/home/home.controller.module.js @@ -0,0 +1,5 @@ +import HomeController from './home.controller'; + +export default angular + .module('tgh.view.home.ctrl', []) + .controller('HomeController', HomeController); diff --git a/src/views/users/users.config.js b/src/views/users/users.config.js index 653a4a6..988b25a 100644 --- a/src/views/users/users.config.js +++ b/src/views/users/users.config.js @@ -1,16 +1,20 @@ -import UsersController from './users.controller'; -import UsersTemplate from './users.template.html'; - export default function UsersConfig($stateProvider) { 'ngInject'; $stateProvider.state({ name: 'users', url: '/users', - template: UsersTemplate, - controller: UsersController, + templateProvider: () => import(/* webpackChunkName: "users.route" */ './users.template.html'), + controller: 'UsersController', controllerAs: 'vm', resolve: { + loadController: ['$ocLazyLoad', function ($ocLazyLoad) { + return import(/* webpackChunkName: "users.route" */ './users.controller.module') + .then((module) => { + $ocLazyLoad.inject('tgh.view.users.ctrl'); + return module; + }); + }], primaryUser: ['UsersService', function (UsersService) { return UsersService.getPrimaryUser(); }] diff --git a/src/views/users/users.controller.module.js b/src/views/users/users.controller.module.js new file mode 100644 index 0000000..5ce2c92 --- /dev/null +++ b/src/views/users/users.controller.module.js @@ -0,0 +1,5 @@ +import UsersController from './users.controller'; + +export default angular + .module('tgh.view.users.ctrl', []) + .controller('UsersController', UsersController); diff --git a/src/views/users/users.module.js b/src/views/users/users.module.js index d6f6999..e5ab47f 100644 --- a/src/views/users/users.module.js +++ b/src/views/users/users.module.js @@ -1,9 +1,11 @@ import UsersConfig from './users.config'; import uirouter from 'angular-ui-router'; +import oclazyload from 'oclazyload'; export default angular .module('tgh.view.users', [ - uirouter + uirouter, + oclazyload ]) .config(UsersConfig); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index cff5e76..082ed46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,7 +25,7 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" -acorn@4.0.4: +acorn@4.0.4, acorn@^4.0.3: version "4.0.4" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" @@ -33,9 +33,9 @@ acorn@^3.0.0, acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^4.0.3, acorn@^4.0.4: - version "4.0.11" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0" +acorn@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" acorn@~2.6.4: version "2.6.4" @@ -307,6 +307,15 @@ babel-core@^6.24.0: slash "^1.0.0" source-map "^0.5.0" +babel-eslint@^7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" + dependencies: + babel-code-frame "^6.22.0" + babel-traverse "^6.23.1" + babel-types "^6.23.0" + babylon "^6.17.0" + babel-generator@^6.24.0: version "6.24.0" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.0.tgz#eba270a8cc4ce6e09a61be43465d7c62c1f87c56" @@ -416,6 +425,10 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" @@ -678,9 +691,9 @@ babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0: lodash "^4.2.0" to-fast-properties "^1.0.1" -babylon@^6.11.0, babylon@^6.15.0: - version "6.16.1" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.16.1.tgz#30c5a22f481978a9e7f8cdfdf496b11d94b404d3" +babylon@^6.11.0, babylon@^6.15.0, babylon@^6.17.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932" backo2@1.0.2: version "1.0.2" @@ -3137,7 +3150,7 @@ json3@3.3.2, json3@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" -json5@^0.5.0: +json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -3942,6 +3955,10 @@ obuf@^1.0.0, obuf@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" +oclazyload@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/oclazyload/-/oclazyload-1.1.0.tgz#a9807322f190820a81c022f2ef1701d036d83e87" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -5398,7 +5415,7 @@ style-loader@^0.16.1: dependencies: loader-utils "^1.0.2" -supports-color@3.1.2, supports-color@^3.1.0, supports-color@^3.1.1: +supports-color@3.1.2, supports-color@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" dependencies: @@ -5408,7 +5425,7 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -supports-color@^3.2.3: +supports-color@^3.1.0, supports-color@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" dependencies: @@ -5893,11 +5910,11 @@ webpack@^1.13.0: watchpack "^0.2.1" webpack-core "~0.6.9" -webpack@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.3.2.tgz#7d521e6f0777a3a58985c69425263fdfe977b458" +webpack@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.5.1.tgz#61742f0cf8af555b87460a9cd8bba2f1e3ee2fce" dependencies: - acorn "^4.0.4" + acorn "^5.0.0" acorn-dynamic-import "^2.0.0" ajv "^4.7.0" ajv-keywords "^1.1.1" @@ -5905,6 +5922,7 @@ webpack@^2.3.2: enhanced-resolve "^3.0.0" interpret "^1.0.0" json-loader "^0.5.4" + json5 "^0.5.1" loader-runner "^2.3.0" loader-utils "^0.2.16" memory-fs "~0.4.1" From d3bf346280e8fb7591042d3f0bde6ce04716644d Mon Sep 17 00:00:00 2001 From: Christopher Joslyn Date: Wed, 24 May 2017 09:47:07 -0400 Subject: [PATCH 7/8] remove unused home controller module (#20) (#21) --- src/views/home/home.controller.module.js | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 src/views/home/home.controller.module.js diff --git a/src/views/home/home.controller.module.js b/src/views/home/home.controller.module.js deleted file mode 100644 index ee2c4ac..0000000 --- a/src/views/home/home.controller.module.js +++ /dev/null @@ -1,5 +0,0 @@ -import HomeController from './home.controller'; - -export default angular - .module('tgh.view.home.ctrl', []) - .controller('HomeController', HomeController); From e156fee48a6961331dd63a49e9f3a0d9f5173a6d Mon Sep 17 00:00:00 2001 From: Christopher Joslyn Date: Wed, 31 May 2017 08:56:02 -0400 Subject: [PATCH 8/8] Add build analyzer visualization via the analyze task (#2) (#10) --- README.md | 8 ++++++++ package.json | 4 +++- webpack.config.prod.js | 7 ++++++- yarn.lock | 41 +++++++++++++++++++++++++++++++++++++++-- 4 files changed, 56 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 92b104e..639b6fc 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,14 @@ $ yarn run serve **Note: it is recommended you run this command from the master branch or a tag. By Default this proxies with the webpack-dev-server proxy.** +### Analyze +Start a local webserver to show a visualization of bundle statistics: + +```bash +$ yarn run analyze +``` + +**Note**: You must run the build task before analyzing. ## Dependency Management Build packages (like Webpack) are installed through Yarn into _package.json_, using diff --git a/package.json b/package.json index 17f9dc9..ffc9246 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "build": "rimraf ./build && eslint *.js && webpack --config ./webpack.config.prod.js", "develop": "webpack-dev-server --config ./webpack.config.develop.js --open", "serve": "webpack --config ./webpack.config.prod.js -p --progress --profile --bail && http-server ./build -o", - "test:unit": "rimraf ./reports && karma start" + "test:unit": "rimraf ./reports && karma start", + "analyze": "webpack-bundle-analyzer ./build/stats.json" }, "repository": { "type": "git", @@ -74,6 +75,7 @@ "sinon-chai": "^2.10.0", "style-loader": "^0.16.1", "webpack": "^2.5.1", + "webpack-bundle-analyzer": "^2.4.0", "webpack-dev-server": "^2.4.2", "webpack-md5-hash": "^0.0.5", "webpack-merge": "^4.1.0" diff --git a/webpack.config.prod.js b/webpack.config.prod.js index 965578d..293fc67 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -5,6 +5,7 @@ const UglifyJsPlugin = require('webpack/lib/optimize/UglifyJsPlugin'); const WebpackMd5Hash = require('webpack-md5-hash'); const webpackMerge = require('webpack-merge'); const NgAnnotatePlugin = require('ng-annotate-webpack-plugin'); +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; module.exports = webpackMerge(commonConfig, { @@ -29,7 +30,11 @@ module.exports = webpackMerge(commonConfig, { comments: false, sourceMap: true }), - new ExtractTextPlugin('[name].[chunkhash].style.css') + new ExtractTextPlugin('[name].[chunkhash].style.css'), + new BundleAnalyzerPlugin({ + analyzerMode: 'disabled', + generateStatsFile: true + }) ] }); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 082ed46..4848caa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -37,6 +37,10 @@ acorn@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" +acorn@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" + acorn@~2.6.4: version "2.6.4" resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.6.4.tgz#eb1f45b4a43fa31d03701a5ec46f3b52673e90ee" @@ -1691,6 +1695,10 @@ domutils@1.5, domutils@1.5.1: dom-serializer "0" domelementtype "1" +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -1710,6 +1718,10 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" +ejs@^2.5.6: + version "2.5.6" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.6.tgz#479636bfa3fe3b1debd52087f0acb204b4f19c88" + electron-to-chromium@^1.2.7: version "1.3.2" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.2.tgz#b8ce5c93b308db0e92f6d0435c46ddec8f6363ab" @@ -2070,7 +2082,7 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -express@^4.13.3: +express@^4.13.3, express@^4.15.2: version "4.15.2" resolved "https://registry.yarnpkg.com/express/-/express-4.15.2.tgz#af107fc148504457f2dca9a6f2571d7129b97b35" dependencies: @@ -2215,6 +2227,10 @@ filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" +filesize@^3.5.6: + version "3.5.9" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.9.tgz#9e3dd8a9b124f5b2f1fb2ee9cd13a86c707bb222" + fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" @@ -2483,6 +2499,12 @@ growl@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" +gzip-size@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" + dependencies: + duplexer "^0.1.1" + handle-thing@^1.2.4: version "1.2.5" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" @@ -3979,7 +4001,7 @@ onetime@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" -opener@~1.4.0: +opener@^1.4.3, opener@~1.4.0: version "1.4.3" resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" @@ -5826,6 +5848,21 @@ wbuf@^1.1.0, wbuf@^1.4.0: dependencies: minimalistic-assert "^1.0.0" +webpack-bundle-analyzer@^2.4.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.6.0.tgz#9b8052d6aa26004f49ab76e88c45445ecd03f15a" + dependencies: + acorn "^5.0.3" + chalk "^1.1.3" + commander "^2.9.0" + ejs "^2.5.6" + express "^4.15.2" + filesize "^3.5.6" + gzip-size "^3.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + opener "^1.4.3" + webpack-core@^0.6.5, webpack-core@~0.6.9: version "0.6.9" resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2"