From 7cd075d78731e8bc312369c18a60316894773319 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Fri, 6 Sep 2013 19:19:43 +0200 Subject: [PATCH 1/4] initial grunt support, gzip enabled --- .gitignore | 2 +- .nodemonignore | 3 +- Gruntfile.js | 104 ++++++++++++++++++ assets/js/appMain.js | 27 ----- assets/js/staticMain.js | 3 - bower.json | 3 +- package.json | 5 +- {assets => public}/css/README.md | 0 {assets => public}/css/alerts.styl | 0 {assets => public}/css/avatar.styl | 0 {assets => public}/css/challenges.styl | 0 {assets => public}/css/color-vars.styl | 0 {assets => public}/css/customizer.styl | 0 {assets => public}/css/filters.styl | 0 {assets => public}/css/game-pane.styl | 0 {assets => public}/css/header.styl | 0 {assets => public}/css/helpers.styl | 0 {assets => public}/css/index.styl | 0 {assets => public}/css/inventory.styl | 0 {assets => public}/css/items.styl | 0 {assets => public}/css/npcs.styl | 0 {assets => public}/css/responsive.styl | 0 {assets => public}/css/scrollbars.styl | 0 {assets => public}/css/tasks.styl | 0 {assets => public}/js/app.js | 0 {assets => public}/js/controllers/authCtrl.js | 0 .../js/controllers/characterCtrl.js | 0 .../js/controllers/filtersCtrl.js | 0 .../js/controllers/footerCtrl.js | 0 .../js/controllers/groupsCtrl.js | 0 .../js/controllers/inventoryCtrl.js | 0 .../js/controllers/marketCtrl.js | 0 {assets => public}/js/controllers/menuCtrl.js | 0 .../js/controllers/notificationCtrl.js | 0 {assets => public}/js/controllers/petsCtrl.js | 0 {assets => public}/js/controllers/rootCtrl.js | 0 .../js/controllers/settingsCtrl.js | 0 .../js/controllers/statsCtrl.js | 0 .../js/controllers/taskDetailsCtrl.js | 0 .../js/controllers/tasksCtrl.js | 0 .../js/controllers/userAvatarCtrl.js | 0 .../js/directives/directives.js | 0 {assets => public}/js/filters/filters.js | 0 .../js/services/authServices.js | 0 .../js/services/groupServices.js | 0 .../js/services/notificationServices.js | 0 .../js/services/sharedServices.js | 0 .../js/services/userServices.js | 0 {assets => public}/js/static.js | 0 src/server.js | 5 +- views/index.jade | 69 ++++++++---- views/static/layout.jade | 20 +++- 52 files changed, 177 insertions(+), 64 deletions(-) create mode 100644 Gruntfile.js delete mode 100644 assets/js/appMain.js delete mode 100644 assets/js/staticMain.js rename {assets => public}/css/README.md (100%) rename {assets => public}/css/alerts.styl (100%) rename {assets => public}/css/avatar.styl (100%) rename {assets => public}/css/challenges.styl (100%) rename {assets => public}/css/color-vars.styl (100%) rename {assets => public}/css/customizer.styl (100%) rename {assets => public}/css/filters.styl (100%) rename {assets => public}/css/game-pane.styl (100%) rename {assets => public}/css/header.styl (100%) rename {assets => public}/css/helpers.styl (100%) rename {assets => public}/css/index.styl (100%) rename {assets => public}/css/inventory.styl (100%) rename {assets => public}/css/items.styl (100%) rename {assets => public}/css/npcs.styl (100%) rename {assets => public}/css/responsive.styl (100%) rename {assets => public}/css/scrollbars.styl (100%) rename {assets => public}/css/tasks.styl (100%) rename {assets => public}/js/app.js (100%) rename {assets => public}/js/controllers/authCtrl.js (100%) rename {assets => public}/js/controllers/characterCtrl.js (100%) rename {assets => public}/js/controllers/filtersCtrl.js (100%) rename {assets => public}/js/controllers/footerCtrl.js (100%) rename {assets => public}/js/controllers/groupsCtrl.js (100%) rename {assets => public}/js/controllers/inventoryCtrl.js (100%) rename {assets => public}/js/controllers/marketCtrl.js (100%) rename {assets => public}/js/controllers/menuCtrl.js (100%) rename {assets => public}/js/controllers/notificationCtrl.js (100%) rename {assets => public}/js/controllers/petsCtrl.js (100%) rename {assets => public}/js/controllers/rootCtrl.js (100%) rename {assets => public}/js/controllers/settingsCtrl.js (100%) rename {assets => public}/js/controllers/statsCtrl.js (100%) rename {assets => public}/js/controllers/taskDetailsCtrl.js (100%) rename {assets => public}/js/controllers/tasksCtrl.js (100%) rename {assets => public}/js/controllers/userAvatarCtrl.js (100%) rename {assets => public}/js/directives/directives.js (100%) rename {assets => public}/js/filters/filters.js (100%) rename {assets => public}/js/services/authServices.js (100%) rename {assets => public}/js/services/groupServices.js (100%) rename {assets => public}/js/services/notificationServices.js (100%) rename {assets => public}/js/services/sharedServices.js (100%) rename {assets => public}/js/services/userServices.js (100%) rename {assets => public}/js/static.js (100%) diff --git a/.gitignore b/.gitignore index 23f78825cb..db9a64ac62 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ config.json npm-debug.log lib public/bower_components -builtAssets/ +public/build src/*/*.map src/*/*/*.map diff --git a/.nodemonignore b/.nodemonignore index 68d5ae31ba..96b6d8ae9c 100644 --- a/.nodemonignore +++ b/.nodemonignore @@ -1,2 +1 @@ -/public/* -/assets/* \ No newline at end of file +/public/* \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000000..3aef062363 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,104 @@ +/*global module:false*/ +module.exports = function(grunt) { + + // Project configuration. + grunt.initConfig({ + + clean: { + build: ['public/build'] + }, + + uglify: { + buildApp: { + files: { + 'public/build/app.js': [ + 'public/bower_components/jquery/jquery.min.js', + 'public/bower_components/bootstrap-growl/jquery.bootstrap-growl.min.js', + 'public/bower_components/angular/angular.min.js', + 'public/bower_components/angular-sanitize/angular-sanitize.min.js', + 'public/bower_components/angular-route/angular-route.min.js', + 'public/bower_components/angular-resource/angular-resource.min.js', + 'public/bower_components/angular-ui/build/angular-ui.min.js', + 'public/bower_components/angular-ui-utils/modules/keypress/keypress.js', + // we'll remove this once angular-bootstrap is fixed + 'public/bower_components/bootstrap/docs/assets/js/bootstrap.min.js', + 'public/bower_components/angular-bootstrap/ui-bootstrap.min.js', + 'public/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js', + // Sortable + 'public/bower_components/jquery-ui/ui/minified/jquery.ui.core.min.js', + 'public/bower_components/jquery-ui/ui/minified/jquery.ui.widget.min.js', + 'public/bower_components/jquery-ui/ui/minified/jquery.ui.mouse.min.js', + 'public/bower_components/jquery-ui/ui/minified/jquery.ui.sortable.min.js', + // habitrpg-shared + 'public/bower_components/habitrpg-shared/dist/habitrpg-shared.js', + // app + 'public/js/app.js', + 'public/js/services/authServices.js', + 'public/js/services/notificationServices.js', + 'public/js/services/sharedServices.js', + 'public/js/services/userServices.js', + 'public/js/services/groupServices.js', + + 'public/js/filters/filters.js', + + 'public/js/directives/directives.js', + + 'public/js/controllers/authCtrl.js', + 'public/js/controllers/characterCtrl.js', + 'public/js/controllers/menuCtrl.js', + 'public/js/controllers/notificationCtrl.js', + 'public/js/controllers/rootCtrl.js', + 'public/js/controllers/settingsCtrl.js', + 'public/js/controllers/statsCtrl.js', + 'public/js/controllers/tasksCtrl.js', + 'public/js/controllers/taskDetailsCtrl.js', + 'public/js/controllers/filtersCtrl.js', + 'public/js/controllers/userAvatarCtrl.js', + 'public/js/controllers/groupsCtrl.js', + 'public/js/controllers/petsCtrl.js', + 'public/js/controllers/inventoryCtrl.js', + 'public/js/controllers/marketCtrl.js', + 'public/js/controllers/footerCtrl.js' + ] + } + }, + buildStatic: { + files: { + 'public/build/static.js': [ + 'public/bower_components/jquery/jquery.min.js', + 'public/bower_components/habitrpg-shared/dist/habitrpg-shared.js', + 'public/bower_components/angular/angular.min.js', + 'public/bower_components/bootstrap/docs/assets/js/bootstrap.min.js', + + 'public/js/static.js', + 'public/js/services/userServices.js', + 'public/js/controllers/authCtrl.js' + ] + } + } + }, + + hashres: { + options: { + fileNameFormat: '${name}-${hash}.${ext}', + }, + build: { + src: [ + 'public/build/app.js', + 'public/build/static.js' + ], + dest: 'views/i-do-not-exist.jade' // Non existing file! + } + } + + }); + + // Register tasks. + grunt.registerTask('build', ['clean:build', 'uglify', 'hashres']); + + // Load tasks + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-hashres'); + grunt.loadNpmTasks('grunt-contrib-clean'); + +}; diff --git a/assets/js/appMain.js b/assets/js/appMain.js deleted file mode 100644 index 27676bbef9..0000000000 --- a/assets/js/appMain.js +++ /dev/null @@ -1,27 +0,0 @@ -//= require app -//= require services/authServices -//= require services/notificationServices -//= require services/sharedServices -//= require services/userServices -//= require services/groupServices - -//= require filters/filters - -//= require directives/directives - -//= require controllers/authCtrl -//= require controllers/characterCtrl -//= require controllers/menuCtrl -//= require controllers/notificationCtrl -//= require controllers/rootCtrl -//= require controllers/settingsCtrl -//= require controllers/statsCtrl -//= require controllers/tasksCtrl -//= require controllers/taskDetailsCtrl -//= require controllers/filtersCtrl -//= require controllers/userAvatarCtrl -//= require controllers/groupsCtrl -//= require controllers/petsCtrl -//= require controllers/inventoryCtrl -//= require controllers/marketCtrl -//= require controllers/footerCtrl \ No newline at end of file diff --git a/assets/js/staticMain.js b/assets/js/staticMain.js deleted file mode 100644 index 41ddde7826..0000000000 --- a/assets/js/staticMain.js +++ /dev/null @@ -1,3 +0,0 @@ -//= require static -//= require services/userServices -//= require controllers/authCtrl \ No newline at end of file diff --git a/bower.json b/bower.json index 50272df8f6..03e37661bf 100644 --- a/bower.json +++ b/bower.json @@ -35,7 +35,6 @@ }, "resolutions": { "jquery": "~2.0.3", - "bootstrap": "v2.3.2", - "angular-sanitize": "1.2.0-rc.1" + "bootstrap": "v2.3.2" } } diff --git a/package.json b/package.json index e656b2a2b2..c5c6ba6178 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,10 @@ "optimist": "~0.5.2", "mongoose": "~3.6.18", "stylus": "~0.37.0", - "connect-assets": "~2.5.2", + "grunt": "~0.4.1", + "grunt-contrib-uglify": "~0.2.4", + "grunt-hashres": "~0.3.2", + "grunt-contrib-clean": "~0.5.0", "bower": "~1.2.4", "nib": "~1.0.1", "jade": "~0.35.0", diff --git a/assets/css/README.md b/public/css/README.md similarity index 100% rename from assets/css/README.md rename to public/css/README.md diff --git a/assets/css/alerts.styl b/public/css/alerts.styl similarity index 100% rename from assets/css/alerts.styl rename to public/css/alerts.styl diff --git a/assets/css/avatar.styl b/public/css/avatar.styl similarity index 100% rename from assets/css/avatar.styl rename to public/css/avatar.styl diff --git a/assets/css/challenges.styl b/public/css/challenges.styl similarity index 100% rename from assets/css/challenges.styl rename to public/css/challenges.styl diff --git a/assets/css/color-vars.styl b/public/css/color-vars.styl similarity index 100% rename from assets/css/color-vars.styl rename to public/css/color-vars.styl diff --git a/assets/css/customizer.styl b/public/css/customizer.styl similarity index 100% rename from assets/css/customizer.styl rename to public/css/customizer.styl diff --git a/assets/css/filters.styl b/public/css/filters.styl similarity index 100% rename from assets/css/filters.styl rename to public/css/filters.styl diff --git a/assets/css/game-pane.styl b/public/css/game-pane.styl similarity index 100% rename from assets/css/game-pane.styl rename to public/css/game-pane.styl diff --git a/assets/css/header.styl b/public/css/header.styl similarity index 100% rename from assets/css/header.styl rename to public/css/header.styl diff --git a/assets/css/helpers.styl b/public/css/helpers.styl similarity index 100% rename from assets/css/helpers.styl rename to public/css/helpers.styl diff --git a/assets/css/index.styl b/public/css/index.styl similarity index 100% rename from assets/css/index.styl rename to public/css/index.styl diff --git a/assets/css/inventory.styl b/public/css/inventory.styl similarity index 100% rename from assets/css/inventory.styl rename to public/css/inventory.styl diff --git a/assets/css/items.styl b/public/css/items.styl similarity index 100% rename from assets/css/items.styl rename to public/css/items.styl diff --git a/assets/css/npcs.styl b/public/css/npcs.styl similarity index 100% rename from assets/css/npcs.styl rename to public/css/npcs.styl diff --git a/assets/css/responsive.styl b/public/css/responsive.styl similarity index 100% rename from assets/css/responsive.styl rename to public/css/responsive.styl diff --git a/assets/css/scrollbars.styl b/public/css/scrollbars.styl similarity index 100% rename from assets/css/scrollbars.styl rename to public/css/scrollbars.styl diff --git a/assets/css/tasks.styl b/public/css/tasks.styl similarity index 100% rename from assets/css/tasks.styl rename to public/css/tasks.styl diff --git a/assets/js/app.js b/public/js/app.js similarity index 100% rename from assets/js/app.js rename to public/js/app.js diff --git a/assets/js/controllers/authCtrl.js b/public/js/controllers/authCtrl.js similarity index 100% rename from assets/js/controllers/authCtrl.js rename to public/js/controllers/authCtrl.js diff --git a/assets/js/controllers/characterCtrl.js b/public/js/controllers/characterCtrl.js similarity index 100% rename from assets/js/controllers/characterCtrl.js rename to public/js/controllers/characterCtrl.js diff --git a/assets/js/controllers/filtersCtrl.js b/public/js/controllers/filtersCtrl.js similarity index 100% rename from assets/js/controllers/filtersCtrl.js rename to public/js/controllers/filtersCtrl.js diff --git a/assets/js/controllers/footerCtrl.js b/public/js/controllers/footerCtrl.js similarity index 100% rename from assets/js/controllers/footerCtrl.js rename to public/js/controllers/footerCtrl.js diff --git a/assets/js/controllers/groupsCtrl.js b/public/js/controllers/groupsCtrl.js similarity index 100% rename from assets/js/controllers/groupsCtrl.js rename to public/js/controllers/groupsCtrl.js diff --git a/assets/js/controllers/inventoryCtrl.js b/public/js/controllers/inventoryCtrl.js similarity index 100% rename from assets/js/controllers/inventoryCtrl.js rename to public/js/controllers/inventoryCtrl.js diff --git a/assets/js/controllers/marketCtrl.js b/public/js/controllers/marketCtrl.js similarity index 100% rename from assets/js/controllers/marketCtrl.js rename to public/js/controllers/marketCtrl.js diff --git a/assets/js/controllers/menuCtrl.js b/public/js/controllers/menuCtrl.js similarity index 100% rename from assets/js/controllers/menuCtrl.js rename to public/js/controllers/menuCtrl.js diff --git a/assets/js/controllers/notificationCtrl.js b/public/js/controllers/notificationCtrl.js similarity index 100% rename from assets/js/controllers/notificationCtrl.js rename to public/js/controllers/notificationCtrl.js diff --git a/assets/js/controllers/petsCtrl.js b/public/js/controllers/petsCtrl.js similarity index 100% rename from assets/js/controllers/petsCtrl.js rename to public/js/controllers/petsCtrl.js diff --git a/assets/js/controllers/rootCtrl.js b/public/js/controllers/rootCtrl.js similarity index 100% rename from assets/js/controllers/rootCtrl.js rename to public/js/controllers/rootCtrl.js diff --git a/assets/js/controllers/settingsCtrl.js b/public/js/controllers/settingsCtrl.js similarity index 100% rename from assets/js/controllers/settingsCtrl.js rename to public/js/controllers/settingsCtrl.js diff --git a/assets/js/controllers/statsCtrl.js b/public/js/controllers/statsCtrl.js similarity index 100% rename from assets/js/controllers/statsCtrl.js rename to public/js/controllers/statsCtrl.js diff --git a/assets/js/controllers/taskDetailsCtrl.js b/public/js/controllers/taskDetailsCtrl.js similarity index 100% rename from assets/js/controllers/taskDetailsCtrl.js rename to public/js/controllers/taskDetailsCtrl.js diff --git a/assets/js/controllers/tasksCtrl.js b/public/js/controllers/tasksCtrl.js similarity index 100% rename from assets/js/controllers/tasksCtrl.js rename to public/js/controllers/tasksCtrl.js diff --git a/assets/js/controllers/userAvatarCtrl.js b/public/js/controllers/userAvatarCtrl.js similarity index 100% rename from assets/js/controllers/userAvatarCtrl.js rename to public/js/controllers/userAvatarCtrl.js diff --git a/assets/js/directives/directives.js b/public/js/directives/directives.js similarity index 100% rename from assets/js/directives/directives.js rename to public/js/directives/directives.js diff --git a/assets/js/filters/filters.js b/public/js/filters/filters.js similarity index 100% rename from assets/js/filters/filters.js rename to public/js/filters/filters.js diff --git a/assets/js/services/authServices.js b/public/js/services/authServices.js similarity index 100% rename from assets/js/services/authServices.js rename to public/js/services/authServices.js diff --git a/assets/js/services/groupServices.js b/public/js/services/groupServices.js similarity index 100% rename from assets/js/services/groupServices.js rename to public/js/services/groupServices.js diff --git a/assets/js/services/notificationServices.js b/public/js/services/notificationServices.js similarity index 100% rename from assets/js/services/notificationServices.js rename to public/js/services/notificationServices.js diff --git a/assets/js/services/sharedServices.js b/public/js/services/sharedServices.js similarity index 100% rename from assets/js/services/sharedServices.js rename to public/js/services/sharedServices.js diff --git a/assets/js/services/userServices.js b/public/js/services/userServices.js similarity index 100% rename from assets/js/services/userServices.js rename to public/js/services/userServices.js diff --git a/assets/js/static.js b/public/js/static.js similarity index 100% rename from assets/js/static.js rename to public/js/static.js diff --git a/src/server.js b/src/server.js index 0e5fc8e006..b79092941b 100644 --- a/src/server.js +++ b/src/server.js @@ -67,14 +67,15 @@ passport.use(new FacebookStrategy({ // ------------ Server Configuration ------------ app.set("port", nconf.get('PORT')); +app.use(express.logger("dev")); +app.use(express.compress()); app.set("views", __dirname + "/../views"); app.set("view engine", "jade"); app.use(express.favicon()); -app.use(express.logger("dev")); app.use(middleware.cors); app.use(middleware.forceSSL); app.use(express.bodyParser()); -app.use(require('connect-assets')()); +app.use(require('connect-assets')({src: 'public'})); app.use(express.methodOverride()); //app.use(express.cookieParser(nconf.get('SESSION_SECRET'))); app.use(express.cookieParser()); diff --git a/views/index.jade b/views/index.jade index e4904ef1ad..a8938d88e8 100644 --- a/views/index.jade +++ b/views/index.jade @@ -20,29 +20,58 @@ html // HabitRPG Shared link(rel='stylesheet', href='/bower_components/habitrpg-shared/dist/spritesheets.css') - // JS - script(type='text/javascript', src='/bower_components/jquery/jquery.min.js') - script(type='text/javascript', src='/bower_components/bootstrap-growl/jquery.bootstrap-growl.min.js') - script(type='text/javascript', src='/bower_components/angular/angular.min.js') - script(type='text/javascript', src='/bower_components/angular-sanitize/angular-sanitize.min.js') - script(type='text/javascript', src='/bower_components/angular-route/angular-route.min.js') - script(type='text/javascript', src='/bower_components/angular-resource/angular-resource.min.js') - script(type='text/javascript', src='/bower_components/angular-ui/build/angular-ui.min.js') - script(type='text/javascript', src='/bower_components/angular-ui-utils/modules/keypress/keypress.js') - // we'll remove this once angular-bootstrap is fixed - script(type='text/javascript', src='/bower_components/bootstrap/docs/assets/js/bootstrap.min.js') - script(type='text/javascript', src='/bower_components/angular-bootstrap/ui-bootstrap.min.js') - script(type='text/javascript', src='/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js') + - if(env.NODE_ENV == 'production'){ + script(type='text/javascript', src='build/app.js') + - }else{ + // Remember to update the file list in Gruntfile.js! + script(type='text/javascript', src='bower_components/jquery/jquery.min.js') + script(type='text/javascript', src='bower_components/bootstrap-growl/jquery.bootstrap-growl.min.js') + script(type='text/javascript', src='bower_components/angular/angular.min.js') + script(type='text/javascript', src='bower_components/angular-sanitize/angular-sanitize.min.js') + script(type='text/javascript', src='bower_components/angular-route/angular-route.min.js') + script(type='text/javascript', src='bower_components/angular-resource/angular-resource.min.js') + script(type='text/javascript', src='bower_components/angular-ui/build/angular-ui.min.js') + script(type='text/javascript', src='bower_components/angular-ui-utils/modules/keypress/keypress.js') + // we'll remove this once angular-bootstrap is fixed + script(type='text/javascript', src='bower_components/bootstrap/docs/assets/js/bootstrap.min.js') + script(type='text/javascript', src='bower_components/angular-bootstrap/ui-bootstrap.min.js') + script(type='text/javascript', src='bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js') + // Sortable + script(type='text/javascript', src='bower_components/jquery-ui/ui/minified/jquery.ui.core.min.js') + script(type='text/javascript', src='bower_components/jquery-ui/ui/minified/jquery.ui.widget.min.js') + script(type='text/javascript', src='bower_components/jquery-ui/ui/minified/jquery.ui.mouse.min.js') + script(type='text/javascript', src='bower_components/jquery-ui/ui/minified/jquery.ui.sortable.min.js') + // habitrpg-shared + script(type='text/javascript', src='bower_components/habitrpg-shared/dist/habitrpg-shared.js') + // app + script(type='text/javascript', src='js/app.js') + script(type='text/javascript', src='js/services/authServices.js') + script(type='text/javascript', src='js/services/notificationServices.js') + script(type='text/javascript', src='js/services/sharedServices.js') + script(type='text/javascript', src='js/services/userServices.js') + script(type='text/javascript', src='js/services/groupServices.js') - // Sortable - script(type='text/javascript', src='/bower_components/jquery-ui/ui/minified/jquery.ui.core.min.js') - script(type='text/javascript', src='/bower_components/jquery-ui/ui/minified/jquery.ui.widget.min.js') - script(type='text/javascript', src='/bower_components/jquery-ui/ui/minified/jquery.ui.mouse.min.js') - script(type='text/javascript', src='/bower_components/jquery-ui/ui/minified/jquery.ui.sortable.min.js') + script(type='text/javascript', src='js/filters/filters.js') - script(type='text/javascript', src='/bower_components/habitrpg-shared/dist/habitrpg-shared.js') + script(type='text/javascript', src='js/directives/directives.js') - != js('appMain') + script(type='text/javascript', src='js/controllers/authCtrl.js') + script(type='text/javascript', src='js/controllers/characterCtrl.js') + script(type='text/javascript', src='js/controllers/menuCtrl.js') + script(type='text/javascript', src='js/controllers/notificationCtrl.js') + script(type='text/javascript', src='js/controllers/rootCtrl.js') + script(type='text/javascript', src='js/controllers/settingsCtrl.js') + script(type='text/javascript', src='js/controllers/statsCtrl.js') + script(type='text/javascript', src='js/controllers/tasksCtrl.js') + script(type='text/javascript', src='js/controllers/taskDetailsCtrl.js') + script(type='text/javascript', src='js/controllers/filtersCtrl.js') + script(type='text/javascript', src='js/controllers/userAvatarCtrl.js') + script(type='text/javascript', src='js/controllers/groupsCtrl.js') + script(type='text/javascript', src='js/controllers/petsCtrl.js') + script(type='text/javascript', src='js/controllers/inventoryCtrl.js') + script(type='text/javascript', src='js/controllers/marketCtrl.js') + script(type='text/javascript', src='js/controllers/footerCtrl.js') + -} //webfonts link(href='//fonts.googleapis.com/css?family=Lato:300,400,700,400italic,700italic', rel='stylesheet', type='text/css') diff --git a/views/static/layout.jade b/views/static/layout.jade index f2222d9d71..31b6de1f9e 100644 --- a/views/static/layout.jade +++ b/views/static/layout.jade @@ -19,15 +19,23 @@ html // and habitrpg-shared alone is ~700kb // JS - script(type='text/javascript', src='/bower_components/jquery/jquery.min.js') - script(type='text/javascript', src='/bower_components/habitrpg-shared/dist/habitrpg-shared.js') - script(type='text/javascript', src='/bower_components/angular/angular.min.js') - script(type='text/javascript', src='/bower_components/bootstrap/docs/assets/js/bootstrap.min.js') + - if(env.NODE_ENV == 'production'){ + script(type='text/javascript', src='build/static.js') + - }else{ + // Remember to update the file list in Gruntfile.js! + script(type='text/javascript', src='bower_components/jquery/jquery.min.js') + script(type='text/javascript', src='bower_components/habitrpg-shared/dist/habitrpg-shared.js') + script(type='text/javascript', src='bower_components/angular/angular.min.js') + script(type='text/javascript', src='bower_components/bootstrap/docs/assets/js/bootstrap.min.js') + + script(type='text/javascript', src='js/static.js') + script(type='text/javascript', src='js/services/userServices.js') + script(type='text/javascript', src='js/controllers/authCtrl.js') + -} + script(type='text/javascript'). $.getScript("//s7.addthis.com/js/250/addthis_widget.js#pubid=lefnire"); - != js('staticMain') - body block content From 07ddd3985643565942bf788d45a56a5fe125d437 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Fri, 6 Sep 2013 19:50:14 +0200 Subject: [PATCH 2/4] fix for static pages --- src/middleware.js | 2 +- src/routes/pages.js | 6 +++--- views/static/front.jade | 3 +++ views/static/layout.jade | 20 +++++++++++--------- views/static/privacy.jade | 3 +++ views/static/terms.jade | 3 +++ 6 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/middleware.js b/src/middleware.js index 493c92d3ff..1273287295 100644 --- a/src/middleware.js +++ b/src/middleware.js @@ -29,7 +29,7 @@ module.exports.cors = function(req, res, next) { module.exports.locals = function(req, res, next) { res.locals.habitrpg = res.locals.habitrpg || {} _.defaults(res.locals.habitrpg, { - NODE_ENV: req.url.split('/')[1] == 'static' ? 'production' : nconf.get('NODE_ENV'), // Don't show debugging options on static pages + NODE_ENV: nconf.get('NODE_ENV'), // Don't show debugging options on static pages IS_MOBILE: /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(req.header('User-Agent')), STRIPE_PUB_KEY: nconf.get('STRIPE_PUB_KEY') }); diff --git a/src/routes/pages.js b/src/routes/pages.js index 8e1f7fe590..e60bd0ee4d 100644 --- a/src/routes/pages.js +++ b/src/routes/pages.js @@ -12,17 +12,17 @@ router.get('/', function(req, res) { }); router.get('/partials/tasks', function(req, res) { - res.render('tasks/index'); + res.render('tasks/index', {env: res.locals.habitrpg}); }); router.get('/partials/options', function(req, res) { - res.render('options'); + res.render('options', {env: res.locals.habitrpg}); }); // -------- Marketing -------- router.get('/splash.html', function(req, res) { - res.redirect('/static/front'); + res.redirect('/static/front', {env: res.locals.habitrpg}); }); router.get('/static/front', function(req, res) { diff --git a/views/static/front.jade b/views/static/front.jade index 5bd1164f0f..9d7465c617 100644 --- a/views/static/front.jade +++ b/views/static/front.jade @@ -1,4 +1,7 @@ extends ./layout +//Trick needed to pass 'env' to ./layout +block vars + - var layoutEnv = env block title title HabitRPG | Gamify Your Life diff --git a/views/static/layout.jade b/views/static/layout.jade index 31b6de1f9e..3abbf2eb35 100644 --- a/views/static/layout.jade +++ b/views/static/layout.jade @@ -1,3 +1,5 @@ +//Trick needed to pass 'env' to ./layout +block vars doctype 5 html @@ -19,18 +21,18 @@ html // and habitrpg-shared alone is ~700kb // JS - - if(env.NODE_ENV == 'production'){ - script(type='text/javascript', src='build/static.js') + - if(layoutEnv.NODE_ENV == 'production'){ + script(type='text/javascript', src='/build/static.js') - }else{ // Remember to update the file list in Gruntfile.js! - script(type='text/javascript', src='bower_components/jquery/jquery.min.js') - script(type='text/javascript', src='bower_components/habitrpg-shared/dist/habitrpg-shared.js') - script(type='text/javascript', src='bower_components/angular/angular.min.js') - script(type='text/javascript', src='bower_components/bootstrap/docs/assets/js/bootstrap.min.js') + script(type='text/javascript', src='/bower_components/jquery/jquery.min.js') + script(type='text/javascript', src='/bower_components/habitrpg-shared/dist/habitrpg-shared.js') + script(type='text/javascript', src='/bower_components/angular/angular.min.js') + script(type='text/javascript', src='/bower_components/bootstrap/docs/assets/js/bootstrap.min.js') - script(type='text/javascript', src='js/static.js') - script(type='text/javascript', src='js/services/userServices.js') - script(type='text/javascript', src='js/controllers/authCtrl.js') + script(type='text/javascript', src='/js/static.js') + script(type='text/javascript', src='/js/services/userServices.js') + script(type='text/javascript', src='/js/controllers/authCtrl.js') -} script(type='text/javascript'). diff --git a/views/static/privacy.jade b/views/static/privacy.jade index cda199004e..f51601be32 100644 --- a/views/static/privacy.jade +++ b/views/static/privacy.jade @@ -1,4 +1,7 @@ extends ./layout +//Trick needed to pass 'env' to ./layout +block vars + - var layoutEnv = env block title title HabitRPG | Privacy diff --git a/views/static/terms.jade b/views/static/terms.jade index bc1c7e3df1..527b2589d5 100644 --- a/views/static/terms.jade +++ b/views/static/terms.jade @@ -1,4 +1,7 @@ extends ./layout +//Trick needed to pass 'env' to ./layout +block vars + - var layoutEnv = env block title title HabitRPG | Terms From 9046bd504127388cc53fd81ce23920dfc960d72f Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Fri, 6 Sep 2013 21:39:18 +0200 Subject: [PATCH 3/4] css --- Gruntfile.js | 32 +++++++++++++-- package.json | 2 + public/css/index.styl | 5 ++- public/css/static.styl | 5 +++ src/server.js | 1 - views/index.jade | 85 ++++++++++++++++++++-------------------- views/static/layout.jade | 8 ++-- 7 files changed, 85 insertions(+), 53 deletions(-) create mode 100644 public/css/static.styl diff --git a/Gruntfile.js b/Gruntfile.js index 3aef062363..11e435f28e 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -78,7 +78,30 @@ module.exports = function(grunt) { } }, - hashres: { + stylus: { + build: { + options: { + compress: false, // AFTER + 'include css': true, + paths: ['public'] + }, + files: { + 'public/build/app.css': ['public/css/index.styl'], + 'public/build/static.css': ['public/css/static.styl'] + } + } + }, + + cssmin: { + build: { + files: { + 'public/build/app.css': ['public/build/app.css'], + 'public/build/static.css': ['public/build/static.css'] + } + } + } + + /*hashres: { options: { fileNameFormat: '${name}-${hash}.${ext}', }, @@ -89,16 +112,19 @@ module.exports = function(grunt) { ], dest: 'views/i-do-not-exist.jade' // Non existing file! } - } + }*/ }); // Register tasks. - grunt.registerTask('build', ['clean:build', 'uglify', 'hashres']); + grunt.registerTask('build', ['clean:build', 'uglify', 'stylus', 'cssmin']); + grunt.registerTask('run', ['clean:build', 'stylus', 'cssmin']); // Load tasks grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-hashres'); grunt.loadNpmTasks('grunt-contrib-clean'); + grunt.loadNpmTasks('grunt-contrib-stylus'); + grunt.loadNpmTasks('grunt-contrib-cssmin'); }; diff --git a/package.json b/package.json index c5c6ba6178..5cb92d725f 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,9 @@ "grunt": "~0.4.1", "grunt-contrib-uglify": "~0.2.4", "grunt-hashres": "~0.3.2", + "grunt-contrib-stylus": "~0.8.0", "grunt-contrib-clean": "~0.5.0", + "grunt-contrib-cssmin": "~0.6.1", "bower": "~1.2.4", "nib": "~1.0.1", "jade": "~0.35.0", diff --git a/public/css/index.styl b/public/css/index.styl index 0ac2acf0c6..df1a3674f2 100644 --- a/public/css/index.styl +++ b/public/css/index.styl @@ -1,7 +1,10 @@ @import "nib/vendor" // Vendor Includes - include first so we can override -@import "../../../public/bower_components/bootstrap-datepicker/css/datepicker.css" +// Import only styles that do not have urls to images! Include them directly in the page! +@import "../bower_components/bootstrap-datepicker/css/datepicker.css" +@import "../bower_components/angular-ui/build/angular-ui.min.css" +@import "../bower_components/bootstrap/docs/assets/css/bootstrap-responsive.css" // Custom includes @import "./tasks.styl" diff --git a/public/css/static.styl b/public/css/static.styl new file mode 100644 index 0000000000..4de9de0283 --- /dev/null +++ b/public/css/static.styl @@ -0,0 +1,5 @@ +// Vendor Includes - include first so we can override +// Import only styles that do not have urls to images! Include them directly in the page! + +@import "./static-pages.css" +@import "./footer.css" \ No newline at end of file diff --git a/src/server.js b/src/server.js index b79092941b..7db81884d0 100644 --- a/src/server.js +++ b/src/server.js @@ -75,7 +75,6 @@ app.use(express.favicon()); app.use(middleware.cors); app.use(middleware.forceSSL); app.use(express.bodyParser()); -app.use(require('connect-assets')({src: 'public'})); app.use(express.methodOverride()); //app.use(express.cookieParser(nconf.get('SESSION_SECRET'))); app.use(express.cookieParser()); diff --git a/views/index.jade b/views/index.jade index a8938d88e8..792f1e7564 100644 --- a/views/index.jade +++ b/views/index.jade @@ -13,9 +13,8 @@ html // CSS link(rel='stylesheet', href='/bower_components/bootstrap/docs/assets/css/bootstrap.css') - link(rel='stylesheet', href='/bower_components/bootstrap/docs/assets/css/bootstrap-responsive.css') - link(rel='stylesheet', href='/bower_components/angular-ui/build/angular-ui.min.css') - != css('index') + + link(rel='stylesheet', href='/build/app.css') // HabitRPG Shared link(rel='stylesheet', href='/bower_components/habitrpg-shared/dist/spritesheets.css') @@ -24,53 +23,53 @@ html script(type='text/javascript', src='build/app.js') - }else{ // Remember to update the file list in Gruntfile.js! - script(type='text/javascript', src='bower_components/jquery/jquery.min.js') - script(type='text/javascript', src='bower_components/bootstrap-growl/jquery.bootstrap-growl.min.js') - script(type='text/javascript', src='bower_components/angular/angular.min.js') - script(type='text/javascript', src='bower_components/angular-sanitize/angular-sanitize.min.js') - script(type='text/javascript', src='bower_components/angular-route/angular-route.min.js') - script(type='text/javascript', src='bower_components/angular-resource/angular-resource.min.js') - script(type='text/javascript', src='bower_components/angular-ui/build/angular-ui.min.js') - script(type='text/javascript', src='bower_components/angular-ui-utils/modules/keypress/keypress.js') + script(type='text/javascript', src='/bower_components/jquery/jquery.min.js') + script(type='text/javascript', src='/bower_components/bootstrap-growl/jquery.bootstrap-growl.min.js') + script(type='text/javascript', src='/bower_components/angular/angular.min.js') + script(type='text/javascript', src='/bower_components/angular-sanitize/angular-sanitize.min.js') + script(type='text/javascript', src='/bower_components/angular-route/angular-route.min.js') + script(type='text/javascript', src='/bower_components/angular-resource/angular-resource.min.js') + script(type='text/javascript', src='/bower_components/angular-ui/build/angular-ui.min.js') + script(type='text/javascript', src='/bower_components/angular-ui-utils/modules/keypress/keypress.js') // we'll remove this once angular-bootstrap is fixed - script(type='text/javascript', src='bower_components/bootstrap/docs/assets/js/bootstrap.min.js') - script(type='text/javascript', src='bower_components/angular-bootstrap/ui-bootstrap.min.js') - script(type='text/javascript', src='bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js') + script(type='text/javascript', src='/bower_components/bootstrap/docs/assets/js/bootstrap.min.js') + script(type='text/javascript', src='/bower_components/angular-bootstrap/ui-bootstrap.min.js') + script(type='text/javascript', src='/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js') // Sortable - script(type='text/javascript', src='bower_components/jquery-ui/ui/minified/jquery.ui.core.min.js') - script(type='text/javascript', src='bower_components/jquery-ui/ui/minified/jquery.ui.widget.min.js') - script(type='text/javascript', src='bower_components/jquery-ui/ui/minified/jquery.ui.mouse.min.js') - script(type='text/javascript', src='bower_components/jquery-ui/ui/minified/jquery.ui.sortable.min.js') + script(type='text/javascript', src='/bower_components/jquery-ui/ui/minified/jquery.ui.core.min.js') + script(type='text/javascript', src='/bower_components/jquery-ui/ui/minified/jquery.ui.widget.min.js') + script(type='text/javascript', src='/bower_components/jquery-ui/ui/minified/jquery.ui.mouse.min.js') + script(type='text/javascript', src='/bower_components/jquery-ui/ui/minified/jquery.ui.sortable.min.js') // habitrpg-shared - script(type='text/javascript', src='bower_components/habitrpg-shared/dist/habitrpg-shared.js') + script(type='text/javascript', src='/bower_components/habitrpg-shared/dist/habitrpg-shared.js') // app - script(type='text/javascript', src='js/app.js') - script(type='text/javascript', src='js/services/authServices.js') - script(type='text/javascript', src='js/services/notificationServices.js') - script(type='text/javascript', src='js/services/sharedServices.js') - script(type='text/javascript', src='js/services/userServices.js') - script(type='text/javascript', src='js/services/groupServices.js') + script(type='text/javascript', src='/js/app.js') + script(type='text/javascript', src='/js/services/authServices.js') + script(type='text/javascript', src='/js/services/notificationServices.js') + script(type='text/javascript', src='/js/services/sharedServices.js') + script(type='text/javascript', src='/js/services/userServices.js') + script(type='text/javascript', src='/js/services/groupServices.js') - script(type='text/javascript', src='js/filters/filters.js') + script(type='text/javascript', src='/js/filters/filters.js') - script(type='text/javascript', src='js/directives/directives.js') + script(type='text/javascript', src='/js/directives/directives.js') - script(type='text/javascript', src='js/controllers/authCtrl.js') - script(type='text/javascript', src='js/controllers/characterCtrl.js') - script(type='text/javascript', src='js/controllers/menuCtrl.js') - script(type='text/javascript', src='js/controllers/notificationCtrl.js') - script(type='text/javascript', src='js/controllers/rootCtrl.js') - script(type='text/javascript', src='js/controllers/settingsCtrl.js') - script(type='text/javascript', src='js/controllers/statsCtrl.js') - script(type='text/javascript', src='js/controllers/tasksCtrl.js') - script(type='text/javascript', src='js/controllers/taskDetailsCtrl.js') - script(type='text/javascript', src='js/controllers/filtersCtrl.js') - script(type='text/javascript', src='js/controllers/userAvatarCtrl.js') - script(type='text/javascript', src='js/controllers/groupsCtrl.js') - script(type='text/javascript', src='js/controllers/petsCtrl.js') - script(type='text/javascript', src='js/controllers/inventoryCtrl.js') - script(type='text/javascript', src='js/controllers/marketCtrl.js') - script(type='text/javascript', src='js/controllers/footerCtrl.js') + script(type='text/javascript', src='/js/controllers/authCtrl.js') + script(type='text/javascript', src='/js/controllers/characterCtrl.js') + script(type='text/javascript', src='/js/controllers/menuCtrl.js') + script(type='text/javascript', src='/js/controllers/notificationCtrl.js') + script(type='text/javascript', src='/js/controllers/rootCtrl.js') + script(type='text/javascript', src='/js/controllers/settingsCtrl.js') + script(type='text/javascript', src='/js/controllers/statsCtrl.js') + script(type='text/javascript', src='/js/controllers/tasksCtrl.js') + script(type='text/javascript', src='/js/controllers/taskDetailsCtrl.js') + script(type='text/javascript', src='/js/controllers/filtersCtrl.js') + script(type='text/javascript', src='/js/controllers/userAvatarCtrl.js') + script(type='text/javascript', src='/js/controllers/groupsCtrl.js') + script(type='text/javascript', src='/js/controllers/petsCtrl.js') + script(type='text/javascript', src='/js/controllers/inventoryCtrl.js') + script(type='text/javascript', src='/js/controllers/marketCtrl.js') + script(type='text/javascript', src='/js/controllers/footerCtrl.js') -} //webfonts diff --git a/views/static/layout.jade b/views/static/layout.jade index 3abbf2eb35..d001bb5f4a 100644 --- a/views/static/layout.jade +++ b/views/static/layout.jade @@ -12,13 +12,11 @@ html // CSS link(rel='stylesheet', href='/bower_components/bootstrap/docs/assets/css/bootstrap.css') + // Keep this out of build because the one after has some images and would like not to override it link(rel='stylesheet', href='/bower_components/bootstrap/docs/assets/css/bootstrap-responsive.css') link(href='/bower_components/bootstrap/docs/assets/css/docs.css', rel='stylesheet') - link(href='/css/static-pages.css', rel='stylesheet') - link(href='/css/footer.css', rel='stylesheet') - - // FIXME we gotta get rid of all these requirements in userServices. we don't need habitrpg-shared, lodash, moment, etc here - // and habitrpg-shared alone is ~700kb + + link(rel='stylesheet', href='/build/static.css') // JS - if(layoutEnv.NODE_ENV == 'production'){ From b0bf1d4c58d79f22528338f017d3ffebfd731915 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Fri, 6 Sep 2013 22:33:00 +0200 Subject: [PATCH 4/4] finish --- .nodemonignore | 3 ++- Gruntfile.js | 19 +++++++++++++++++-- README.md | 4 ++-- package.json | 2 +- start.sh | 11 +++++++++++ 5 files changed, 33 insertions(+), 6 deletions(-) create mode 100755 start.sh diff --git a/.nodemonignore b/.nodemonignore index 96b6d8ae9c..b368c0d00f 100644 --- a/.nodemonignore +++ b/.nodemonignore @@ -1 +1,2 @@ -/public/* \ No newline at end of file +/views/* +/public/build/* \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js index 11e435f28e..a8f5a01d30 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -99,6 +99,18 @@ module.exports = function(grunt) { 'public/build/static.css': ['public/build/static.css'] } } + }, + + exec: { + start: { + cmd: function(mode){ + if(mode && mode == 'production'){ + return 'nodemon --exec "./start.sh" production' + }else{ + return 'nodemon --exec "./start.sh"' + } + } + } } /*hashres: { @@ -117,8 +129,10 @@ module.exports = function(grunt) { }); // Register tasks. - grunt.registerTask('build', ['clean:build', 'uglify', 'stylus', 'cssmin']); - grunt.registerTask('run', ['clean:build', 'stylus', 'cssmin']); + grunt.registerTask('production', ['clean:build', 'uglify', 'stylus', 'cssmin']); + grunt.registerTask('development', ['clean:build', 'stylus', 'cssmin']); + grunt.registerTask('start:production', ['exec:start:production']); + grunt.registerTask('start', ['exec:start']); // Load tasks grunt.loadNpmTasks('grunt-contrib-uglify'); @@ -126,5 +140,6 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-contrib-clean'); grunt.loadNpmTasks('grunt-contrib-stylus'); grunt.loadNpmTasks('grunt-contrib-cssmin'); + grunt.loadNpmTasks('grunt-exec'); }; diff --git a/README.md b/README.md index 7a4136bb4a..74e0f3a427 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Or, expressed in commands on the command line: 1. `git clone --recursive -b angular_rewrite https://github.com/lefnire/habitrpg.git` 1. `cd habitrpg && npm install` -1. `npm start` +1. `grunt start` (`grunt start:production` to concat & minify js) To access the site, open http://localhost:3000 in your browser. @@ -76,7 +76,7 @@ Ignore this error and proceed with the following: 1. Run 'npm install -g bower' 1. Run 'bower install -f' 1. Run 'copy config.json.example config.json' -1. Run 'npm start' +1. `grunt start` (`grunt start:production` to concat & minify js) Open a browser to URL http://localhost:3000 to test the application. diff --git a/package.json b/package.json index 5cb92d725f..f2c891fe7b 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "grunt-contrib-stylus": "~0.8.0", "grunt-contrib-clean": "~0.5.0", "grunt-contrib-cssmin": "~0.6.1", + "grunt-exec": "~0.4.x", "bower": "~1.2.4", "nib": "~1.0.1", "jade": "~0.35.0", @@ -48,7 +49,6 @@ "npm": "1.2.x" }, "scripts": { - "start": "nodemon src/server.js", "test": "mocha test/api.mocha.coffee", "postinstall": "./node_modules/bower/bin/bower install -f" } diff --git a/start.sh b/start.sh new file mode 100755 index 0000000000..05885587fa --- /dev/null +++ b/start.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +if [ $1 = "production" ]; then + echo "Starting production server"; + grunt production; +else + echo "Starting development server"; + grunt development; +fi + +node ./src/server.js \ No newline at end of file