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('