From 306c441ae75c2a0cc7decdfa0677c8ffdf7dc83f Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Wed, 26 Aug 2015 23:20:56 -0700 Subject: [PATCH] add revisioning to js/css files to break caching This moves the location of javascript files, commonFramework, iFrameScript, sandbox, plugin, and all the less files. On gulp or gulp build these files are moved and revisioned. Places where they are references in jade/html are now removed and replaced with the use of a helper function `rev`. This function will take the required file and return a string referencing the revisioned file. This should alleviate the need for hard refreshing and will break caches when files change, so fixes for firefox caching issue as well. NOTE: @benmcmahon @quincylarson, This means files will need to be build on the server in production before doing a server restart/reload In production: 'npm run build' To build and revision js/css files `gulp` and `gulp build` will used in development npm install also needs to be run in production on initial deploy --- .gitignore | 11 +++ client/README.md | 2 +- .../commonFramework.js | 2 +- .../iFrameScripts.js | 0 {public/css => client/less}/lib/Vimeo.css | 0 .../css => client/less}/lib/animate.min.less | 0 .../bootstrap-social/bootstrap-social.less | 0 .../less}/lib/bootstrap/alerts.less | 0 .../less}/lib/bootstrap/badges.less | 0 .../less}/lib/bootstrap/bootstrap.less | 0 .../less}/lib/bootstrap/breadcrumbs.less | 0 .../less}/lib/bootstrap/button-groups.less | 0 .../less}/lib/bootstrap/buttons.less | 0 .../less}/lib/bootstrap/carousel.less | 0 .../less}/lib/bootstrap/close.less | 0 .../less}/lib/bootstrap/code.less | 0 .../lib/bootstrap/component-animations.less | 0 .../less}/lib/bootstrap/dropdowns.less | 0 .../less}/lib/bootstrap/forms.less | 0 .../less}/lib/bootstrap/glyphicons.less | 0 .../less}/lib/bootstrap/grid.less | 0 .../less}/lib/bootstrap/input-groups.less | 0 .../less}/lib/bootstrap/jumbotron.less | 0 .../less}/lib/bootstrap/labels.less | 0 .../less}/lib/bootstrap/list-group.less | 0 .../less}/lib/bootstrap/media.less | 0 .../less}/lib/bootstrap/mixins.less | 0 .../less}/lib/bootstrap/mixins/alerts.less | 0 .../bootstrap/mixins/background-variant.less | 0 .../lib/bootstrap/mixins/border-radius.less | 0 .../less}/lib/bootstrap/mixins/buttons.less | 0 .../lib/bootstrap/mixins/center-block.less | 0 .../less}/lib/bootstrap/mixins/clearfix.less | 0 .../less}/lib/bootstrap/mixins/forms.less | 0 .../less}/lib/bootstrap/mixins/gradients.less | 0 .../lib/bootstrap/mixins/grid-framework.less | 0 .../less}/lib/bootstrap/mixins/grid.less | 0 .../less}/lib/bootstrap/mixins/hide-text.less | 0 .../less}/lib/bootstrap/mixins/image.less | 0 .../less}/lib/bootstrap/mixins/labels.less | 0 .../lib/bootstrap/mixins/list-group.less | 0 .../lib/bootstrap/mixins/nav-divider.less | 0 .../bootstrap/mixins/nav-vertical-align.less | 0 .../less}/lib/bootstrap/mixins/opacity.less | 0 .../lib/bootstrap/mixins/pagination.less | 0 .../less}/lib/bootstrap/mixins/panels.less | 0 .../lib/bootstrap/mixins/progress-bar.less | 0 .../lib/bootstrap/mixins/reset-filter.less | 0 .../less}/lib/bootstrap/mixins/resize.less | 0 .../mixins/responsive-visibility.less | 0 .../less}/lib/bootstrap/mixins/size.less | 0 .../less}/lib/bootstrap/mixins/tab-focus.less | 0 .../less}/lib/bootstrap/mixins/table-row.less | 0 .../lib/bootstrap/mixins/text-emphasis.less | 0 .../lib/bootstrap/mixins/text-overflow.less | 0 .../lib/bootstrap/mixins/vendor-prefixes.less | 0 .../less}/lib/bootstrap/modals.less | 0 .../less}/lib/bootstrap/navbar.less | 0 .../less}/lib/bootstrap/navs.less | 0 .../less}/lib/bootstrap/normalize.less | 0 .../less}/lib/bootstrap/pager.less | 0 .../less}/lib/bootstrap/pagination.less | 0 .../less}/lib/bootstrap/panels.less | 0 .../less}/lib/bootstrap/popovers.less | 0 .../less}/lib/bootstrap/print.less | 0 .../less}/lib/bootstrap/progress-bars.less | 0 .../less}/lib/bootstrap/responsive-embed.less | 0 .../lib/bootstrap/responsive-utilities.less | 0 .../less}/lib/bootstrap/scaffolding.less | 0 .../less}/lib/bootstrap/tables.less | 0 .../less}/lib/bootstrap/theme.less | 0 .../less}/lib/bootstrap/thumbnails.less | 0 .../less}/lib/bootstrap/tooltip.less | 0 .../less}/lib/bootstrap/type.less | 0 .../less}/lib/bootstrap/utilities.less | 0 .../less}/lib/bootstrap/variables.less | 0 .../less}/lib/bootstrap/wells.less | 0 .../font-awesome-4.3.0/css/font-awesome.css | 0 .../css/font-awesome.min.css | 0 .../font-awesome-4.3.0/fonts/FontAwesome.otf | Bin .../fonts/fontawesome-webfont.eot | Bin .../fonts/fontawesome-webfont.svg | 0 .../fonts/fontawesome-webfont.ttf | Bin .../fonts/fontawesome-webfont.woff | Bin .../fonts/fontawesome-webfont.woff2 | Bin .../lib/font-awesome-4.3.0/less/animated.less | 0 .../less/bordered-pulled.less | 0 .../lib/font-awesome-4.3.0/less/core.less | 0 .../font-awesome-4.3.0/less/fixed-width.less | 0 .../font-awesome-4.3.0/less/font-awesome.less | 0 .../lib/font-awesome-4.3.0/less/icons.less | 0 .../lib/font-awesome-4.3.0/less/larger.less | 0 .../lib/font-awesome-4.3.0/less/list.less | 0 .../lib/font-awesome-4.3.0/less/mixins.less | 0 .../lib/font-awesome-4.3.0/less/path.less | 0 .../less/rotated-flipped.less | 0 .../lib/font-awesome-4.3.0/less/stacked.less | 0 .../font-awesome-4.3.0/less/variables.less | 0 .../font-awesome-4.3.0/scss/_animated.scss | 0 .../scss/_bordered-pulled.scss | 0 .../lib/font-awesome-4.3.0/scss/_core.scss | 0 .../font-awesome-4.3.0/scss/_fixed-width.scss | 0 .../lib/font-awesome-4.3.0/scss/_icons.scss | 0 .../lib/font-awesome-4.3.0/scss/_larger.scss | 0 .../lib/font-awesome-4.3.0/scss/_list.scss | 0 .../lib/font-awesome-4.3.0/scss/_mixins.scss | 0 .../lib/font-awesome-4.3.0/scss/_path.scss | 0 .../scss/_rotated-flipped.scss | 0 .../lib/font-awesome-4.3.0/scss/_stacked.scss | 0 .../font-awesome-4.3.0/scss/_variables.scss | 0 .../font-awesome-4.3.0/scss/font-awesome.scss | 0 .../lib/ionicons/_ionicons-animation.less | 0 .../less}/lib/ionicons/_ionicons-font.less | 0 .../less}/lib/ionicons/_ionicons-icons.less | 0 .../lib/ionicons/_ionicons-variables.less | 0 .../less}/lib/ionicons/ionicons.less | 0 .../less}/lib/ionicons/ionicons.min.css | 0 {public/css => client/less}/main.less | 0 public/js/main_0.0.3.js => client/main.js | 0 .../plugin_v0.1.5.js => client/plugin.js | 0 .../js/lib/coursewares => client}/sandbox.js | 2 +- gulpfile.js | 88 ++++++++++++++---- package.json | 3 + server/middleware.json | 3 +- server/middlewares/revision-helpers.js | 13 +++ server/views/coursewares/showBonfire.jade | 4 +- server/views/coursewares/showHTML.jade | 4 +- server/views/coursewares/showJS.jade | 4 +- server/views/partials/small-head.jade | 2 +- server/views/partials/universal-head.jade | 4 +- 130 files changed, 112 insertions(+), 30 deletions(-) rename public/js/lib/coursewares/commonFrameWork_0.0.7.js => client/commonFramework.js (99%) rename public/js/lib/coursewares/iFrameScripts_0.0.4.js => client/iFrameScripts.js (100%) rename {public/css => client/less}/lib/Vimeo.css (100%) rename {public/css => client/less}/lib/animate.min.less (100%) rename {public/css => client/less}/lib/bootstrap-social/bootstrap-social.less (100%) rename {public/css => client/less}/lib/bootstrap/alerts.less (100%) rename {public/css => client/less}/lib/bootstrap/badges.less (100%) rename {public/css => client/less}/lib/bootstrap/bootstrap.less (100%) rename {public/css => client/less}/lib/bootstrap/breadcrumbs.less (100%) rename {public/css => client/less}/lib/bootstrap/button-groups.less (100%) rename {public/css => client/less}/lib/bootstrap/buttons.less (100%) rename {public/css => client/less}/lib/bootstrap/carousel.less (100%) rename {public/css => client/less}/lib/bootstrap/close.less (100%) rename {public/css => client/less}/lib/bootstrap/code.less (100%) rename {public/css => client/less}/lib/bootstrap/component-animations.less (100%) rename {public/css => client/less}/lib/bootstrap/dropdowns.less (100%) rename {public/css => client/less}/lib/bootstrap/forms.less (100%) rename {public/css => client/less}/lib/bootstrap/glyphicons.less (100%) rename {public/css => client/less}/lib/bootstrap/grid.less (100%) rename {public/css => client/less}/lib/bootstrap/input-groups.less (100%) rename {public/css => client/less}/lib/bootstrap/jumbotron.less (100%) rename {public/css => client/less}/lib/bootstrap/labels.less (100%) rename {public/css => client/less}/lib/bootstrap/list-group.less (100%) rename {public/css => client/less}/lib/bootstrap/media.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/alerts.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/background-variant.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/border-radius.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/buttons.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/center-block.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/clearfix.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/forms.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/gradients.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/grid-framework.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/grid.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/hide-text.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/image.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/labels.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/list-group.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/nav-divider.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/nav-vertical-align.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/opacity.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/pagination.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/panels.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/progress-bar.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/reset-filter.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/resize.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/responsive-visibility.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/size.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/tab-focus.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/table-row.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/text-emphasis.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/text-overflow.less (100%) rename {public/css => client/less}/lib/bootstrap/mixins/vendor-prefixes.less (100%) rename {public/css => client/less}/lib/bootstrap/modals.less (100%) rename {public/css => client/less}/lib/bootstrap/navbar.less (100%) rename {public/css => client/less}/lib/bootstrap/navs.less (100%) rename {public/css => client/less}/lib/bootstrap/normalize.less (100%) rename {public/css => client/less}/lib/bootstrap/pager.less (100%) rename {public/css => client/less}/lib/bootstrap/pagination.less (100%) rename {public/css => client/less}/lib/bootstrap/panels.less (100%) rename {public/css => client/less}/lib/bootstrap/popovers.less (100%) rename {public/css => client/less}/lib/bootstrap/print.less (100%) rename {public/css => client/less}/lib/bootstrap/progress-bars.less (100%) rename {public/css => client/less}/lib/bootstrap/responsive-embed.less (100%) rename {public/css => client/less}/lib/bootstrap/responsive-utilities.less (100%) rename {public/css => client/less}/lib/bootstrap/scaffolding.less (100%) rename {public/css => client/less}/lib/bootstrap/tables.less (100%) rename {public/css => client/less}/lib/bootstrap/theme.less (100%) rename {public/css => client/less}/lib/bootstrap/thumbnails.less (100%) rename {public/css => client/less}/lib/bootstrap/tooltip.less (100%) rename {public/css => client/less}/lib/bootstrap/type.less (100%) rename {public/css => client/less}/lib/bootstrap/utilities.less (100%) rename {public/css => client/less}/lib/bootstrap/variables.less (100%) rename {public/css => client/less}/lib/bootstrap/wells.less (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/css/font-awesome.css (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/css/font-awesome.min.css (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/fonts/FontAwesome.otf (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.eot (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.svg (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.ttf (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.woff (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.woff2 (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/less/animated.less (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/less/bordered-pulled.less (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/less/core.less (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/less/fixed-width.less (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/less/font-awesome.less (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/less/icons.less (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/less/larger.less (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/less/list.less (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/less/mixins.less (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/less/path.less (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/less/rotated-flipped.less (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/less/stacked.less (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/less/variables.less (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/scss/_animated.scss (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/scss/_bordered-pulled.scss (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/scss/_core.scss (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/scss/_fixed-width.scss (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/scss/_icons.scss (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/scss/_larger.scss (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/scss/_list.scss (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/scss/_mixins.scss (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/scss/_path.scss (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/scss/_rotated-flipped.scss (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/scss/_stacked.scss (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/scss/_variables.scss (100%) rename {public/css => client/less}/lib/font-awesome-4.3.0/scss/font-awesome.scss (100%) rename {public/css => client/less}/lib/ionicons/_ionicons-animation.less (100%) rename {public/css => client/less}/lib/ionicons/_ionicons-font.less (100%) rename {public/css => client/less}/lib/ionicons/_ionicons-icons.less (100%) rename {public/css => client/less}/lib/ionicons/_ionicons-variables.less (100%) rename {public/css => client/less}/lib/ionicons/ionicons.less (100%) rename {public/css => client/less}/lib/ionicons/ionicons.min.css (100%) rename {public/css => client/less}/main.less (100%) rename public/js/main_0.0.3.js => client/main.js (100%) rename public/js/lib/coursewares/plugin_v0.1.5.js => client/plugin.js (100%) rename {public/js/lib/coursewares => client}/sandbox.js (96%) create mode 100644 server/middlewares/revision-helpers.js diff --git a/.gitignore b/.gitignore index 86cbd7b0c8..c257b2da90 100644 --- a/.gitignore +++ b/.gitignore @@ -31,4 +31,15 @@ coverage server/*.bundle.js public/js/*.bundle.js + *.map + +// revision manifest +public/js/main* +public/js/commonFramework* +public/js/sandbox* +public/js/iFrameScripts* +public/js/plugin* +public/css/main* + +server/rev-manifest.json diff --git a/client/README.md b/client/README.md index 5ba2586944..b722fceb9c 100644 --- a/client/README.md +++ b/client/README.md @@ -1,4 +1,4 @@ -This is the entry point for the client +This is the entry point for the client code Code that should only run on the client should be put here. NOTE(berks): For react specific stuff this should be the entry point diff --git a/public/js/lib/coursewares/commonFrameWork_0.0.7.js b/client/commonFramework.js similarity index 99% rename from public/js/lib/coursewares/commonFrameWork_0.0.7.js rename to client/commonFramework.js index b712a9cb35..9f6210f1c0 100644 --- a/public/js/lib/coursewares/commonFrameWork_0.0.7.js +++ b/client/commonFramework.js @@ -130,7 +130,7 @@ var libraryIncludes = ""; +var iFrameScript = ""; var delay; // Initialize CodeMirror editor with a nice html5 canvas demo. diff --git a/public/js/lib/coursewares/iFrameScripts_0.0.4.js b/client/iFrameScripts.js similarity index 100% rename from public/js/lib/coursewares/iFrameScripts_0.0.4.js rename to client/iFrameScripts.js diff --git a/public/css/lib/Vimeo.css b/client/less/lib/Vimeo.css similarity index 100% rename from public/css/lib/Vimeo.css rename to client/less/lib/Vimeo.css diff --git a/public/css/lib/animate.min.less b/client/less/lib/animate.min.less similarity index 100% rename from public/css/lib/animate.min.less rename to client/less/lib/animate.min.less diff --git a/public/css/lib/bootstrap-social/bootstrap-social.less b/client/less/lib/bootstrap-social/bootstrap-social.less similarity index 100% rename from public/css/lib/bootstrap-social/bootstrap-social.less rename to client/less/lib/bootstrap-social/bootstrap-social.less diff --git a/public/css/lib/bootstrap/alerts.less b/client/less/lib/bootstrap/alerts.less similarity index 100% rename from public/css/lib/bootstrap/alerts.less rename to client/less/lib/bootstrap/alerts.less diff --git a/public/css/lib/bootstrap/badges.less b/client/less/lib/bootstrap/badges.less similarity index 100% rename from public/css/lib/bootstrap/badges.less rename to client/less/lib/bootstrap/badges.less diff --git a/public/css/lib/bootstrap/bootstrap.less b/client/less/lib/bootstrap/bootstrap.less similarity index 100% rename from public/css/lib/bootstrap/bootstrap.less rename to client/less/lib/bootstrap/bootstrap.less diff --git a/public/css/lib/bootstrap/breadcrumbs.less b/client/less/lib/bootstrap/breadcrumbs.less similarity index 100% rename from public/css/lib/bootstrap/breadcrumbs.less rename to client/less/lib/bootstrap/breadcrumbs.less diff --git a/public/css/lib/bootstrap/button-groups.less b/client/less/lib/bootstrap/button-groups.less similarity index 100% rename from public/css/lib/bootstrap/button-groups.less rename to client/less/lib/bootstrap/button-groups.less diff --git a/public/css/lib/bootstrap/buttons.less b/client/less/lib/bootstrap/buttons.less similarity index 100% rename from public/css/lib/bootstrap/buttons.less rename to client/less/lib/bootstrap/buttons.less diff --git a/public/css/lib/bootstrap/carousel.less b/client/less/lib/bootstrap/carousel.less similarity index 100% rename from public/css/lib/bootstrap/carousel.less rename to client/less/lib/bootstrap/carousel.less diff --git a/public/css/lib/bootstrap/close.less b/client/less/lib/bootstrap/close.less similarity index 100% rename from public/css/lib/bootstrap/close.less rename to client/less/lib/bootstrap/close.less diff --git a/public/css/lib/bootstrap/code.less b/client/less/lib/bootstrap/code.less similarity index 100% rename from public/css/lib/bootstrap/code.less rename to client/less/lib/bootstrap/code.less diff --git a/public/css/lib/bootstrap/component-animations.less b/client/less/lib/bootstrap/component-animations.less similarity index 100% rename from public/css/lib/bootstrap/component-animations.less rename to client/less/lib/bootstrap/component-animations.less diff --git a/public/css/lib/bootstrap/dropdowns.less b/client/less/lib/bootstrap/dropdowns.less similarity index 100% rename from public/css/lib/bootstrap/dropdowns.less rename to client/less/lib/bootstrap/dropdowns.less diff --git a/public/css/lib/bootstrap/forms.less b/client/less/lib/bootstrap/forms.less similarity index 100% rename from public/css/lib/bootstrap/forms.less rename to client/less/lib/bootstrap/forms.less diff --git a/public/css/lib/bootstrap/glyphicons.less b/client/less/lib/bootstrap/glyphicons.less similarity index 100% rename from public/css/lib/bootstrap/glyphicons.less rename to client/less/lib/bootstrap/glyphicons.less diff --git a/public/css/lib/bootstrap/grid.less b/client/less/lib/bootstrap/grid.less similarity index 100% rename from public/css/lib/bootstrap/grid.less rename to client/less/lib/bootstrap/grid.less diff --git a/public/css/lib/bootstrap/input-groups.less b/client/less/lib/bootstrap/input-groups.less similarity index 100% rename from public/css/lib/bootstrap/input-groups.less rename to client/less/lib/bootstrap/input-groups.less diff --git a/public/css/lib/bootstrap/jumbotron.less b/client/less/lib/bootstrap/jumbotron.less similarity index 100% rename from public/css/lib/bootstrap/jumbotron.less rename to client/less/lib/bootstrap/jumbotron.less diff --git a/public/css/lib/bootstrap/labels.less b/client/less/lib/bootstrap/labels.less similarity index 100% rename from public/css/lib/bootstrap/labels.less rename to client/less/lib/bootstrap/labels.less diff --git a/public/css/lib/bootstrap/list-group.less b/client/less/lib/bootstrap/list-group.less similarity index 100% rename from public/css/lib/bootstrap/list-group.less rename to client/less/lib/bootstrap/list-group.less diff --git a/public/css/lib/bootstrap/media.less b/client/less/lib/bootstrap/media.less similarity index 100% rename from public/css/lib/bootstrap/media.less rename to client/less/lib/bootstrap/media.less diff --git a/public/css/lib/bootstrap/mixins.less b/client/less/lib/bootstrap/mixins.less similarity index 100% rename from public/css/lib/bootstrap/mixins.less rename to client/less/lib/bootstrap/mixins.less diff --git a/public/css/lib/bootstrap/mixins/alerts.less b/client/less/lib/bootstrap/mixins/alerts.less similarity index 100% rename from public/css/lib/bootstrap/mixins/alerts.less rename to client/less/lib/bootstrap/mixins/alerts.less diff --git a/public/css/lib/bootstrap/mixins/background-variant.less b/client/less/lib/bootstrap/mixins/background-variant.less similarity index 100% rename from public/css/lib/bootstrap/mixins/background-variant.less rename to client/less/lib/bootstrap/mixins/background-variant.less diff --git a/public/css/lib/bootstrap/mixins/border-radius.less b/client/less/lib/bootstrap/mixins/border-radius.less similarity index 100% rename from public/css/lib/bootstrap/mixins/border-radius.less rename to client/less/lib/bootstrap/mixins/border-radius.less diff --git a/public/css/lib/bootstrap/mixins/buttons.less b/client/less/lib/bootstrap/mixins/buttons.less similarity index 100% rename from public/css/lib/bootstrap/mixins/buttons.less rename to client/less/lib/bootstrap/mixins/buttons.less diff --git a/public/css/lib/bootstrap/mixins/center-block.less b/client/less/lib/bootstrap/mixins/center-block.less similarity index 100% rename from public/css/lib/bootstrap/mixins/center-block.less rename to client/less/lib/bootstrap/mixins/center-block.less diff --git a/public/css/lib/bootstrap/mixins/clearfix.less b/client/less/lib/bootstrap/mixins/clearfix.less similarity index 100% rename from public/css/lib/bootstrap/mixins/clearfix.less rename to client/less/lib/bootstrap/mixins/clearfix.less diff --git a/public/css/lib/bootstrap/mixins/forms.less b/client/less/lib/bootstrap/mixins/forms.less similarity index 100% rename from public/css/lib/bootstrap/mixins/forms.less rename to client/less/lib/bootstrap/mixins/forms.less diff --git a/public/css/lib/bootstrap/mixins/gradients.less b/client/less/lib/bootstrap/mixins/gradients.less similarity index 100% rename from public/css/lib/bootstrap/mixins/gradients.less rename to client/less/lib/bootstrap/mixins/gradients.less diff --git a/public/css/lib/bootstrap/mixins/grid-framework.less b/client/less/lib/bootstrap/mixins/grid-framework.less similarity index 100% rename from public/css/lib/bootstrap/mixins/grid-framework.less rename to client/less/lib/bootstrap/mixins/grid-framework.less diff --git a/public/css/lib/bootstrap/mixins/grid.less b/client/less/lib/bootstrap/mixins/grid.less similarity index 100% rename from public/css/lib/bootstrap/mixins/grid.less rename to client/less/lib/bootstrap/mixins/grid.less diff --git a/public/css/lib/bootstrap/mixins/hide-text.less b/client/less/lib/bootstrap/mixins/hide-text.less similarity index 100% rename from public/css/lib/bootstrap/mixins/hide-text.less rename to client/less/lib/bootstrap/mixins/hide-text.less diff --git a/public/css/lib/bootstrap/mixins/image.less b/client/less/lib/bootstrap/mixins/image.less similarity index 100% rename from public/css/lib/bootstrap/mixins/image.less rename to client/less/lib/bootstrap/mixins/image.less diff --git a/public/css/lib/bootstrap/mixins/labels.less b/client/less/lib/bootstrap/mixins/labels.less similarity index 100% rename from public/css/lib/bootstrap/mixins/labels.less rename to client/less/lib/bootstrap/mixins/labels.less diff --git a/public/css/lib/bootstrap/mixins/list-group.less b/client/less/lib/bootstrap/mixins/list-group.less similarity index 100% rename from public/css/lib/bootstrap/mixins/list-group.less rename to client/less/lib/bootstrap/mixins/list-group.less diff --git a/public/css/lib/bootstrap/mixins/nav-divider.less b/client/less/lib/bootstrap/mixins/nav-divider.less similarity index 100% rename from public/css/lib/bootstrap/mixins/nav-divider.less rename to client/less/lib/bootstrap/mixins/nav-divider.less diff --git a/public/css/lib/bootstrap/mixins/nav-vertical-align.less b/client/less/lib/bootstrap/mixins/nav-vertical-align.less similarity index 100% rename from public/css/lib/bootstrap/mixins/nav-vertical-align.less rename to client/less/lib/bootstrap/mixins/nav-vertical-align.less diff --git a/public/css/lib/bootstrap/mixins/opacity.less b/client/less/lib/bootstrap/mixins/opacity.less similarity index 100% rename from public/css/lib/bootstrap/mixins/opacity.less rename to client/less/lib/bootstrap/mixins/opacity.less diff --git a/public/css/lib/bootstrap/mixins/pagination.less b/client/less/lib/bootstrap/mixins/pagination.less similarity index 100% rename from public/css/lib/bootstrap/mixins/pagination.less rename to client/less/lib/bootstrap/mixins/pagination.less diff --git a/public/css/lib/bootstrap/mixins/panels.less b/client/less/lib/bootstrap/mixins/panels.less similarity index 100% rename from public/css/lib/bootstrap/mixins/panels.less rename to client/less/lib/bootstrap/mixins/panels.less diff --git a/public/css/lib/bootstrap/mixins/progress-bar.less b/client/less/lib/bootstrap/mixins/progress-bar.less similarity index 100% rename from public/css/lib/bootstrap/mixins/progress-bar.less rename to client/less/lib/bootstrap/mixins/progress-bar.less diff --git a/public/css/lib/bootstrap/mixins/reset-filter.less b/client/less/lib/bootstrap/mixins/reset-filter.less similarity index 100% rename from public/css/lib/bootstrap/mixins/reset-filter.less rename to client/less/lib/bootstrap/mixins/reset-filter.less diff --git a/public/css/lib/bootstrap/mixins/resize.less b/client/less/lib/bootstrap/mixins/resize.less similarity index 100% rename from public/css/lib/bootstrap/mixins/resize.less rename to client/less/lib/bootstrap/mixins/resize.less diff --git a/public/css/lib/bootstrap/mixins/responsive-visibility.less b/client/less/lib/bootstrap/mixins/responsive-visibility.less similarity index 100% rename from public/css/lib/bootstrap/mixins/responsive-visibility.less rename to client/less/lib/bootstrap/mixins/responsive-visibility.less diff --git a/public/css/lib/bootstrap/mixins/size.less b/client/less/lib/bootstrap/mixins/size.less similarity index 100% rename from public/css/lib/bootstrap/mixins/size.less rename to client/less/lib/bootstrap/mixins/size.less diff --git a/public/css/lib/bootstrap/mixins/tab-focus.less b/client/less/lib/bootstrap/mixins/tab-focus.less similarity index 100% rename from public/css/lib/bootstrap/mixins/tab-focus.less rename to client/less/lib/bootstrap/mixins/tab-focus.less diff --git a/public/css/lib/bootstrap/mixins/table-row.less b/client/less/lib/bootstrap/mixins/table-row.less similarity index 100% rename from public/css/lib/bootstrap/mixins/table-row.less rename to client/less/lib/bootstrap/mixins/table-row.less diff --git a/public/css/lib/bootstrap/mixins/text-emphasis.less b/client/less/lib/bootstrap/mixins/text-emphasis.less similarity index 100% rename from public/css/lib/bootstrap/mixins/text-emphasis.less rename to client/less/lib/bootstrap/mixins/text-emphasis.less diff --git a/public/css/lib/bootstrap/mixins/text-overflow.less b/client/less/lib/bootstrap/mixins/text-overflow.less similarity index 100% rename from public/css/lib/bootstrap/mixins/text-overflow.less rename to client/less/lib/bootstrap/mixins/text-overflow.less diff --git a/public/css/lib/bootstrap/mixins/vendor-prefixes.less b/client/less/lib/bootstrap/mixins/vendor-prefixes.less similarity index 100% rename from public/css/lib/bootstrap/mixins/vendor-prefixes.less rename to client/less/lib/bootstrap/mixins/vendor-prefixes.less diff --git a/public/css/lib/bootstrap/modals.less b/client/less/lib/bootstrap/modals.less similarity index 100% rename from public/css/lib/bootstrap/modals.less rename to client/less/lib/bootstrap/modals.less diff --git a/public/css/lib/bootstrap/navbar.less b/client/less/lib/bootstrap/navbar.less similarity index 100% rename from public/css/lib/bootstrap/navbar.less rename to client/less/lib/bootstrap/navbar.less diff --git a/public/css/lib/bootstrap/navs.less b/client/less/lib/bootstrap/navs.less similarity index 100% rename from public/css/lib/bootstrap/navs.less rename to client/less/lib/bootstrap/navs.less diff --git a/public/css/lib/bootstrap/normalize.less b/client/less/lib/bootstrap/normalize.less similarity index 100% rename from public/css/lib/bootstrap/normalize.less rename to client/less/lib/bootstrap/normalize.less diff --git a/public/css/lib/bootstrap/pager.less b/client/less/lib/bootstrap/pager.less similarity index 100% rename from public/css/lib/bootstrap/pager.less rename to client/less/lib/bootstrap/pager.less diff --git a/public/css/lib/bootstrap/pagination.less b/client/less/lib/bootstrap/pagination.less similarity index 100% rename from public/css/lib/bootstrap/pagination.less rename to client/less/lib/bootstrap/pagination.less diff --git a/public/css/lib/bootstrap/panels.less b/client/less/lib/bootstrap/panels.less similarity index 100% rename from public/css/lib/bootstrap/panels.less rename to client/less/lib/bootstrap/panels.less diff --git a/public/css/lib/bootstrap/popovers.less b/client/less/lib/bootstrap/popovers.less similarity index 100% rename from public/css/lib/bootstrap/popovers.less rename to client/less/lib/bootstrap/popovers.less diff --git a/public/css/lib/bootstrap/print.less b/client/less/lib/bootstrap/print.less similarity index 100% rename from public/css/lib/bootstrap/print.less rename to client/less/lib/bootstrap/print.less diff --git a/public/css/lib/bootstrap/progress-bars.less b/client/less/lib/bootstrap/progress-bars.less similarity index 100% rename from public/css/lib/bootstrap/progress-bars.less rename to client/less/lib/bootstrap/progress-bars.less diff --git a/public/css/lib/bootstrap/responsive-embed.less b/client/less/lib/bootstrap/responsive-embed.less similarity index 100% rename from public/css/lib/bootstrap/responsive-embed.less rename to client/less/lib/bootstrap/responsive-embed.less diff --git a/public/css/lib/bootstrap/responsive-utilities.less b/client/less/lib/bootstrap/responsive-utilities.less similarity index 100% rename from public/css/lib/bootstrap/responsive-utilities.less rename to client/less/lib/bootstrap/responsive-utilities.less diff --git a/public/css/lib/bootstrap/scaffolding.less b/client/less/lib/bootstrap/scaffolding.less similarity index 100% rename from public/css/lib/bootstrap/scaffolding.less rename to client/less/lib/bootstrap/scaffolding.less diff --git a/public/css/lib/bootstrap/tables.less b/client/less/lib/bootstrap/tables.less similarity index 100% rename from public/css/lib/bootstrap/tables.less rename to client/less/lib/bootstrap/tables.less diff --git a/public/css/lib/bootstrap/theme.less b/client/less/lib/bootstrap/theme.less similarity index 100% rename from public/css/lib/bootstrap/theme.less rename to client/less/lib/bootstrap/theme.less diff --git a/public/css/lib/bootstrap/thumbnails.less b/client/less/lib/bootstrap/thumbnails.less similarity index 100% rename from public/css/lib/bootstrap/thumbnails.less rename to client/less/lib/bootstrap/thumbnails.less diff --git a/public/css/lib/bootstrap/tooltip.less b/client/less/lib/bootstrap/tooltip.less similarity index 100% rename from public/css/lib/bootstrap/tooltip.less rename to client/less/lib/bootstrap/tooltip.less diff --git a/public/css/lib/bootstrap/type.less b/client/less/lib/bootstrap/type.less similarity index 100% rename from public/css/lib/bootstrap/type.less rename to client/less/lib/bootstrap/type.less diff --git a/public/css/lib/bootstrap/utilities.less b/client/less/lib/bootstrap/utilities.less similarity index 100% rename from public/css/lib/bootstrap/utilities.less rename to client/less/lib/bootstrap/utilities.less diff --git a/public/css/lib/bootstrap/variables.less b/client/less/lib/bootstrap/variables.less similarity index 100% rename from public/css/lib/bootstrap/variables.less rename to client/less/lib/bootstrap/variables.less diff --git a/public/css/lib/bootstrap/wells.less b/client/less/lib/bootstrap/wells.less similarity index 100% rename from public/css/lib/bootstrap/wells.less rename to client/less/lib/bootstrap/wells.less diff --git a/public/css/lib/font-awesome-4.3.0/css/font-awesome.css b/client/less/lib/font-awesome-4.3.0/css/font-awesome.css similarity index 100% rename from public/css/lib/font-awesome-4.3.0/css/font-awesome.css rename to client/less/lib/font-awesome-4.3.0/css/font-awesome.css diff --git a/public/css/lib/font-awesome-4.3.0/css/font-awesome.min.css b/client/less/lib/font-awesome-4.3.0/css/font-awesome.min.css similarity index 100% rename from public/css/lib/font-awesome-4.3.0/css/font-awesome.min.css rename to client/less/lib/font-awesome-4.3.0/css/font-awesome.min.css diff --git a/public/css/lib/font-awesome-4.3.0/fonts/FontAwesome.otf b/client/less/lib/font-awesome-4.3.0/fonts/FontAwesome.otf similarity index 100% rename from public/css/lib/font-awesome-4.3.0/fonts/FontAwesome.otf rename to client/less/lib/font-awesome-4.3.0/fonts/FontAwesome.otf diff --git a/public/css/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.eot b/client/less/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.eot similarity index 100% rename from public/css/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.eot rename to client/less/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.eot diff --git a/public/css/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.svg b/client/less/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.svg similarity index 100% rename from public/css/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.svg rename to client/less/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.svg diff --git a/public/css/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.ttf b/client/less/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.ttf similarity index 100% rename from public/css/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.ttf rename to client/less/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.ttf diff --git a/public/css/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.woff b/client/less/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.woff similarity index 100% rename from public/css/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.woff rename to client/less/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.woff diff --git a/public/css/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.woff2 b/client/less/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.woff2 similarity index 100% rename from public/css/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.woff2 rename to client/less/lib/font-awesome-4.3.0/fonts/fontawesome-webfont.woff2 diff --git a/public/css/lib/font-awesome-4.3.0/less/animated.less b/client/less/lib/font-awesome-4.3.0/less/animated.less similarity index 100% rename from public/css/lib/font-awesome-4.3.0/less/animated.less rename to client/less/lib/font-awesome-4.3.0/less/animated.less diff --git a/public/css/lib/font-awesome-4.3.0/less/bordered-pulled.less b/client/less/lib/font-awesome-4.3.0/less/bordered-pulled.less similarity index 100% rename from public/css/lib/font-awesome-4.3.0/less/bordered-pulled.less rename to client/less/lib/font-awesome-4.3.0/less/bordered-pulled.less diff --git a/public/css/lib/font-awesome-4.3.0/less/core.less b/client/less/lib/font-awesome-4.3.0/less/core.less similarity index 100% rename from public/css/lib/font-awesome-4.3.0/less/core.less rename to client/less/lib/font-awesome-4.3.0/less/core.less diff --git a/public/css/lib/font-awesome-4.3.0/less/fixed-width.less b/client/less/lib/font-awesome-4.3.0/less/fixed-width.less similarity index 100% rename from public/css/lib/font-awesome-4.3.0/less/fixed-width.less rename to client/less/lib/font-awesome-4.3.0/less/fixed-width.less diff --git a/public/css/lib/font-awesome-4.3.0/less/font-awesome.less b/client/less/lib/font-awesome-4.3.0/less/font-awesome.less similarity index 100% rename from public/css/lib/font-awesome-4.3.0/less/font-awesome.less rename to client/less/lib/font-awesome-4.3.0/less/font-awesome.less diff --git a/public/css/lib/font-awesome-4.3.0/less/icons.less b/client/less/lib/font-awesome-4.3.0/less/icons.less similarity index 100% rename from public/css/lib/font-awesome-4.3.0/less/icons.less rename to client/less/lib/font-awesome-4.3.0/less/icons.less diff --git a/public/css/lib/font-awesome-4.3.0/less/larger.less b/client/less/lib/font-awesome-4.3.0/less/larger.less similarity index 100% rename from public/css/lib/font-awesome-4.3.0/less/larger.less rename to client/less/lib/font-awesome-4.3.0/less/larger.less diff --git a/public/css/lib/font-awesome-4.3.0/less/list.less b/client/less/lib/font-awesome-4.3.0/less/list.less similarity index 100% rename from public/css/lib/font-awesome-4.3.0/less/list.less rename to client/less/lib/font-awesome-4.3.0/less/list.less diff --git a/public/css/lib/font-awesome-4.3.0/less/mixins.less b/client/less/lib/font-awesome-4.3.0/less/mixins.less similarity index 100% rename from public/css/lib/font-awesome-4.3.0/less/mixins.less rename to client/less/lib/font-awesome-4.3.0/less/mixins.less diff --git a/public/css/lib/font-awesome-4.3.0/less/path.less b/client/less/lib/font-awesome-4.3.0/less/path.less similarity index 100% rename from public/css/lib/font-awesome-4.3.0/less/path.less rename to client/less/lib/font-awesome-4.3.0/less/path.less diff --git a/public/css/lib/font-awesome-4.3.0/less/rotated-flipped.less b/client/less/lib/font-awesome-4.3.0/less/rotated-flipped.less similarity index 100% rename from public/css/lib/font-awesome-4.3.0/less/rotated-flipped.less rename to client/less/lib/font-awesome-4.3.0/less/rotated-flipped.less diff --git a/public/css/lib/font-awesome-4.3.0/less/stacked.less b/client/less/lib/font-awesome-4.3.0/less/stacked.less similarity index 100% rename from public/css/lib/font-awesome-4.3.0/less/stacked.less rename to client/less/lib/font-awesome-4.3.0/less/stacked.less diff --git a/public/css/lib/font-awesome-4.3.0/less/variables.less b/client/less/lib/font-awesome-4.3.0/less/variables.less similarity index 100% rename from public/css/lib/font-awesome-4.3.0/less/variables.less rename to client/less/lib/font-awesome-4.3.0/less/variables.less diff --git a/public/css/lib/font-awesome-4.3.0/scss/_animated.scss b/client/less/lib/font-awesome-4.3.0/scss/_animated.scss similarity index 100% rename from public/css/lib/font-awesome-4.3.0/scss/_animated.scss rename to client/less/lib/font-awesome-4.3.0/scss/_animated.scss diff --git a/public/css/lib/font-awesome-4.3.0/scss/_bordered-pulled.scss b/client/less/lib/font-awesome-4.3.0/scss/_bordered-pulled.scss similarity index 100% rename from public/css/lib/font-awesome-4.3.0/scss/_bordered-pulled.scss rename to client/less/lib/font-awesome-4.3.0/scss/_bordered-pulled.scss diff --git a/public/css/lib/font-awesome-4.3.0/scss/_core.scss b/client/less/lib/font-awesome-4.3.0/scss/_core.scss similarity index 100% rename from public/css/lib/font-awesome-4.3.0/scss/_core.scss rename to client/less/lib/font-awesome-4.3.0/scss/_core.scss diff --git a/public/css/lib/font-awesome-4.3.0/scss/_fixed-width.scss b/client/less/lib/font-awesome-4.3.0/scss/_fixed-width.scss similarity index 100% rename from public/css/lib/font-awesome-4.3.0/scss/_fixed-width.scss rename to client/less/lib/font-awesome-4.3.0/scss/_fixed-width.scss diff --git a/public/css/lib/font-awesome-4.3.0/scss/_icons.scss b/client/less/lib/font-awesome-4.3.0/scss/_icons.scss similarity index 100% rename from public/css/lib/font-awesome-4.3.0/scss/_icons.scss rename to client/less/lib/font-awesome-4.3.0/scss/_icons.scss diff --git a/public/css/lib/font-awesome-4.3.0/scss/_larger.scss b/client/less/lib/font-awesome-4.3.0/scss/_larger.scss similarity index 100% rename from public/css/lib/font-awesome-4.3.0/scss/_larger.scss rename to client/less/lib/font-awesome-4.3.0/scss/_larger.scss diff --git a/public/css/lib/font-awesome-4.3.0/scss/_list.scss b/client/less/lib/font-awesome-4.3.0/scss/_list.scss similarity index 100% rename from public/css/lib/font-awesome-4.3.0/scss/_list.scss rename to client/less/lib/font-awesome-4.3.0/scss/_list.scss diff --git a/public/css/lib/font-awesome-4.3.0/scss/_mixins.scss b/client/less/lib/font-awesome-4.3.0/scss/_mixins.scss similarity index 100% rename from public/css/lib/font-awesome-4.3.0/scss/_mixins.scss rename to client/less/lib/font-awesome-4.3.0/scss/_mixins.scss diff --git a/public/css/lib/font-awesome-4.3.0/scss/_path.scss b/client/less/lib/font-awesome-4.3.0/scss/_path.scss similarity index 100% rename from public/css/lib/font-awesome-4.3.0/scss/_path.scss rename to client/less/lib/font-awesome-4.3.0/scss/_path.scss diff --git a/public/css/lib/font-awesome-4.3.0/scss/_rotated-flipped.scss b/client/less/lib/font-awesome-4.3.0/scss/_rotated-flipped.scss similarity index 100% rename from public/css/lib/font-awesome-4.3.0/scss/_rotated-flipped.scss rename to client/less/lib/font-awesome-4.3.0/scss/_rotated-flipped.scss diff --git a/public/css/lib/font-awesome-4.3.0/scss/_stacked.scss b/client/less/lib/font-awesome-4.3.0/scss/_stacked.scss similarity index 100% rename from public/css/lib/font-awesome-4.3.0/scss/_stacked.scss rename to client/less/lib/font-awesome-4.3.0/scss/_stacked.scss diff --git a/public/css/lib/font-awesome-4.3.0/scss/_variables.scss b/client/less/lib/font-awesome-4.3.0/scss/_variables.scss similarity index 100% rename from public/css/lib/font-awesome-4.3.0/scss/_variables.scss rename to client/less/lib/font-awesome-4.3.0/scss/_variables.scss diff --git a/public/css/lib/font-awesome-4.3.0/scss/font-awesome.scss b/client/less/lib/font-awesome-4.3.0/scss/font-awesome.scss similarity index 100% rename from public/css/lib/font-awesome-4.3.0/scss/font-awesome.scss rename to client/less/lib/font-awesome-4.3.0/scss/font-awesome.scss diff --git a/public/css/lib/ionicons/_ionicons-animation.less b/client/less/lib/ionicons/_ionicons-animation.less similarity index 100% rename from public/css/lib/ionicons/_ionicons-animation.less rename to client/less/lib/ionicons/_ionicons-animation.less diff --git a/public/css/lib/ionicons/_ionicons-font.less b/client/less/lib/ionicons/_ionicons-font.less similarity index 100% rename from public/css/lib/ionicons/_ionicons-font.less rename to client/less/lib/ionicons/_ionicons-font.less diff --git a/public/css/lib/ionicons/_ionicons-icons.less b/client/less/lib/ionicons/_ionicons-icons.less similarity index 100% rename from public/css/lib/ionicons/_ionicons-icons.less rename to client/less/lib/ionicons/_ionicons-icons.less diff --git a/public/css/lib/ionicons/_ionicons-variables.less b/client/less/lib/ionicons/_ionicons-variables.less similarity index 100% rename from public/css/lib/ionicons/_ionicons-variables.less rename to client/less/lib/ionicons/_ionicons-variables.less diff --git a/public/css/lib/ionicons/ionicons.less b/client/less/lib/ionicons/ionicons.less similarity index 100% rename from public/css/lib/ionicons/ionicons.less rename to client/less/lib/ionicons/ionicons.less diff --git a/public/css/lib/ionicons/ionicons.min.css b/client/less/lib/ionicons/ionicons.min.css similarity index 100% rename from public/css/lib/ionicons/ionicons.min.css rename to client/less/lib/ionicons/ionicons.min.css diff --git a/public/css/main.less b/client/less/main.less similarity index 100% rename from public/css/main.less rename to client/less/main.less diff --git a/public/js/main_0.0.3.js b/client/main.js similarity index 100% rename from public/js/main_0.0.3.js rename to client/main.js diff --git a/public/js/lib/coursewares/plugin_v0.1.5.js b/client/plugin.js similarity index 100% rename from public/js/lib/coursewares/plugin_v0.1.5.js rename to client/plugin.js diff --git a/public/js/lib/coursewares/sandbox.js b/client/sandbox.js similarity index 96% rename from public/js/lib/coursewares/sandbox.js rename to client/sandbox.js index 75452114eb..10eaa2ef07 100644 --- a/public/js/lib/coursewares/sandbox.js +++ b/client/sandbox.js @@ -67,7 +67,7 @@ var requests; // (re)initializes the plugin var reset = function() { requests = 0; - plugin = new jailed.Plugin(path+'plugin_v0.1.5.js', api); + plugin = new jailed.Plugin(path + 'plugin.js', api); plugin.whenDisconnected( function() { // give some time to handle the last responce setTimeout( function() { diff --git a/gulpfile.js b/gulpfile.js index 9cfded3db8..09d0161b48 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -7,7 +7,6 @@ var Rx = require('rx'), plumber = require('gulp-plumber'), notify = require('gulp-notify'), debug = require('debug')('freecc:gulp'), - bower = require('bower-main-files'), // react app webpack = require('gulp-webpack'), @@ -18,11 +17,13 @@ var Rx = require('rx'), nodemon = require('gulp-nodemon'), sync = require('browser-sync'), - inject = require('gulp-inject'), - // css less = require('gulp-less'), + // rev + rev = require('gulp-rev'), + revReplace = require('gulp-rev-replace'), + // lint jsonlint = require('gulp-jsonlint'), eslint = require('gulp-eslint'); @@ -43,6 +44,7 @@ var paths = { ], publicJs: './public/js', + css: 'public/css', loopback: { client: './client/loopbackClient', @@ -55,6 +57,21 @@ var paths = { dest: 'public/js' }, + js: [ + 'client/main.js', + 'client/iFrameScripts.js', + 'client/plugin.js' + ], + + dependents: [ + 'client/commonFramework.js', + 'client/sandbox.js' + ], + + less: './client/less/main.less', + + manifest: 'server/', + node: { src: './client', dest: 'common/app' @@ -70,6 +87,13 @@ var paths = { ] }; +var manifestName = 'rev-manifest.json'; +var manifestOptions = { + path: paths.manifest + manifestName, + base: path.join(__dirname, paths.manifest), + merge: true +}; + var webpackOptions = { devtool: 'inline-source-map' }; @@ -87,15 +111,6 @@ function errorHandler() { this.emit('end'); } -gulp.task('inject', function() { - gulp.src('views/home.jade') - .pipe(plumber({ errorHandler: errorHandler })) - .pipe(inject(gulp.src(bower()), { - // ignorePath: '/public' - })) - .pipe(gulp.dest('views')); -}); - gulp.task('pack-client', function() { return gulp.src(webpackConfig.entry) .pipe(plumber({ errorHandler: errorHandler })) @@ -185,18 +200,57 @@ gulp.task('lint-json', function() { gulp.task('test-challenges', ['lint-json']); gulp.task('less', function() { - return gulp.src('./public/css/*.less') + return gulp.src(paths.less) .pipe(plumber({ errorHandler: errorHandler })) + // copile .pipe(less({ paths: [ path.join(__dirname, 'less', 'includes') ] })) - .pipe(gulp.dest('./public/css/')); + .pipe(gulp.dest(paths.css)) + // add revision + .pipe(rev()) + // copy files to public + .pipe(gulp.dest(paths.css)) + // create and merge manifest + .pipe(rev.manifest(manifestOptions)) + .pipe(gulp.dest(paths.manifest)); }); -gulp.task('build', ['less']); +gulp.task('js', function() { + return gulp.src(paths.js) + .pipe(plumber({ errorHandler: errorHandler })) + .pipe(gulp.dest(paths.publicJs)) + // create registry file + .pipe(rev()) + // copy revisioned assets to dest + .pipe(gulp.dest(paths.publicJs)) + // create manifest file + .pipe(rev.manifest(manifestOptions)) + // copy manifest file to dest + .pipe(gulp.dest(paths.manifest)); +}); -gulp.task('watch', ['less', 'serve', 'sync'], function() { - gulp.watch('./public/css/*.less', ['less']); +// commonFramework depend on iFrameScripts +// sandbox depends on plugin +gulp.task('dependents', ['js'], function() { + var manifest = gulp.src( + path.join(__dirname, paths.manifest, manifestName) + ); + + return gulp.src(paths.dependents) + .pipe(plumber({ errorHandler: errorHandler })) + .pipe(revReplace({ manifest: manifest })) + .pipe(rev()) + .pipe(gulp.dest(paths.publicJs)) + .pipe(rev.manifest(manifestOptions)) + .pipe(gulp.dest(paths.manifest)); +}); + +gulp.task('build', ['less', 'js', 'dependents']); + +gulp.task('watch', ['less', 'js', 'dependents', 'serve', 'sync'], function() { + gulp.watch(paths.less, ['less']); + gulp.watch(paths.js, ['js']); gulp.watch(paths.challenges, ['test-challenges']); }); diff --git a/package.json b/package.json index 8aa3c12d40..768cd4be71 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "url": "https://github.com/freecodecamp/freecodecamp.git" }, "scripts": { + "build": "gulp build", "build-production": "webpack", "start": "babel-node server/server.js", "prestart-production": "bower cache clean && bower install && gulp build && npm run build-production", @@ -59,6 +60,8 @@ "github-api": "~0.7.0", "gulp-less": "^3.0.3", "gulp-minify-css": "~0.5.1", + "gulp-rev": "^6.0.1", + "gulp-rev-replace": "^0.4.2", "gulp-webpack": "^1.5.0", "helmet": "~0.9.0", "helmet-csp": "^0.2.3", diff --git a/server/middleware.json b/server/middleware.json index 2c791f8b93..66a1d0bd52 100644 --- a/server/middleware.json +++ b/server/middleware.json @@ -45,7 +45,8 @@ "./middlewares/constant-headers": {}, "./middlewares/csp": {}, "./middlewares/express-rx": {}, - "./middlewares/global-locals": {} + "./middlewares/global-locals": {}, + "./middlewares/revision-helpers": {} }, "routes": { }, diff --git a/server/middlewares/revision-helpers.js b/server/middlewares/revision-helpers.js new file mode 100644 index 0000000000..a5e957fc5c --- /dev/null +++ b/server/middlewares/revision-helpers.js @@ -0,0 +1,13 @@ +import manifest from '../rev-manifest.json'; + +export default function({ globalPrepend = '' } = {}) { + + function rev(scopedPrepend, asset) { + return `${globalPrepend}${scopedPrepend}/${ manifest[asset] || asset }`; + } + + return function(req, res, next) { + res.locals.rev = rev; + next(); + }; +} diff --git a/server/views/coursewares/showBonfire.jade b/server/views/coursewares/showBonfire.jade index ce78fb8ea5..8e7bf6b2eb 100644 --- a/server/views/coursewares/showBonfire.jade +++ b/server/views/coursewares/showBonfire.jade @@ -14,7 +14,7 @@ block content link(rel="stylesheet", href="//fonts.googleapis.com/css?family=Ubuntu+Mono") script(type='text/javascript', src='/js/lib/codemirror/mode/javascript/javascript.js') script(type='text/javascript', src='/js/lib/jailed/jailed.js') - script(type='text/javascript', src='/js/lib/coursewares/sandbox.js') + script(type='text/javascript', src=rev('/js', 'sandbox.js')) .row(ng-controller="pairedWithController") .col-xs-12.col-sm-12.col-md-4.col-lg-3 @@ -124,7 +124,7 @@ block content form.code .form-group.codeMirrorView textarea#codeEditor(autofocus=true, style='display: none;') - script(src='/js/lib/coursewares/commonFrameWork_0.0.7.js') + script(src=rev('/js', 'commonFramework.js')) script. editor.setOption("mode", "javascript"); diff --git a/server/views/coursewares/showHTML.jade b/server/views/coursewares/showHTML.jade index 94399ce677..b655bf5187 100644 --- a/server/views/coursewares/showHTML.jade +++ b/server/views/coursewares/showHTML.jade @@ -14,7 +14,7 @@ block content link(rel="stylesheet", href="http://fonts.googleapis.com/css?family=Ubuntu+Mono") script(src='/js/lib/codemirror/mode/javascript/javascript.js') script(src='/js/lib/jailed/jailed.js') - script(src='/js/lib/coursewares/sandbox.js') + script(src=rev('/js', 'sandbox.js')) script(src='/js/lib/codemirror/mode/xml/xml.js') script(src='/js/lib/codemirror/mode/css/css.js') script(src='/js/lib/codemirror/mode/htmlmixed/htmlmixed.js') @@ -72,7 +72,7 @@ block content form.code .codeMirrorView textarea#codeEditor(autofocus=true, style='display: none;') - script(src = '/js/lib/coursewares/commonFrameWork_0.0.7.js') + script(src=rev('/js', 'commonFramework.js')) script. editor.setOption("mode", "text/html"); .col-md-4.col-lg-3 diff --git a/server/views/coursewares/showJS.jade b/server/views/coursewares/showJS.jade index 34bf4fa3b4..cb5bdb2d44 100644 --- a/server/views/coursewares/showJS.jade +++ b/server/views/coursewares/showJS.jade @@ -13,7 +13,7 @@ block content link(rel="stylesheet", href="//fonts.googleapis.com/css?family=Ubuntu+Mono") script(type='text/javascript', src='/js/lib/codemirror/mode/javascript/javascript.js') script(type='text/javascript', src='/js/lib/jailed/jailed.js') - script(type='text/javascript', src='/js/lib/coursewares/sandbox.js') + script(type='text/javascript', src=rev('/js', 'sandbox.js')) .row(ng-controller="pairedWithController") .col-xs-12.col-sm-12.col-md-4.col-lg-3 .scroll-locker(id = "scroll-locker") @@ -72,7 +72,7 @@ block content form.code .codeMirrorView textarea#codeEditor(autofocus=true, style='display: none;') - script(src = '/js/lib/coursewares/commonFrameWork_0.0.7.js') + script(src=rev('/js', 'commonFramework')) script. editor.setOption("mode", "javascript"); #complete-courseware-dialog.modal(tabindex='-1') diff --git a/server/views/partials/small-head.jade b/server/views/partials/small-head.jade index 5913fc223c..585d55498d 100644 --- a/server/views/partials/small-head.jade +++ b/server/views/partials/small-head.jade @@ -2,7 +2,7 @@ script(src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js") script(src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.4/js/bootstrap.min.js") link(rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Lato:400|Inconsolata") link(rel='stylesheet', href='/bower_components/font-awesome/css/font-awesome.min.css') -link(rel='stylesheet', href='/css/main.css') +link(rel='stylesheet', href=rev('/css', 'main.css')) link(rel='stylesheet', href='/css/lib/Vimeo.css') // End **REQUIRED** includes diff --git a/server/views/partials/universal-head.jade b/server/views/partials/universal-head.jade index bc27767eb5..b97250af49 100644 --- a/server/views/partials/universal-head.jade +++ b/server/views/partials/universal-head.jade @@ -4,7 +4,7 @@ link(rel="stylesheet" type="text/css" href="/bower_components/cal-heatmap/cal-he link(rel='stylesheet', href='/bower_components/font-awesome/css/font-awesome.min.css') -link(rel='stylesheet', href='/css/main.css') +link(rel='stylesheet', href=rev('/css', 'main.css')) // End **REQUIRED** includes include meta @@ -40,7 +40,7 @@ script(src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.2/moment.min.js") script. window.moment || document.write('