aboutsummaryrefslogtreecommitdiffstats
path: root/examples/hybrid-html5/app
diff options
context:
space:
mode:
authorRomain Forlot <romain.forlot@iot.bzh>2017-05-04 11:57:27 +0200
committerRomain Forlot <romain.forlot@iot.bzh>2017-05-04 11:57:27 +0200
commit437f25048ab184e532059f3d31fcf47011abe9fe (patch)
treeb3a32f48ce0ea9796ec32c8ba7615db5ca2ee3b6 /examples/hybrid-html5/app
parentc53c4e0f604f62a34fbe52c5dc7b6de146ba392e (diff)
Continue separation of sources and put also html5 into separated dir
Change-Id: I36bc61f69f0e2d197f1891f3ea7cfa30e9a29e3b Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Diffstat (limited to 'examples/hybrid-html5/app')
-rw-r--r--examples/hybrid-html5/app/CMakeLists.txt38
-rw-r--r--examples/hybrid-html5/app/bower.json22
-rw-r--r--examples/hybrid-html5/app/gulpfile.js438
-rw-r--r--examples/hybrid-html5/app/package.json61
4 files changed, 559 insertions, 0 deletions
diff --git a/examples/hybrid-html5/app/CMakeLists.txt b/examples/hybrid-html5/app/CMakeLists.txt
new file mode 100644
index 0000000..a862b3c
--- /dev/null
+++ b/examples/hybrid-html5/app/CMakeLists.txt
@@ -0,0 +1,38 @@
+###########################################################################
+# Copyright 2015, 2016, 2017 IoT.bzh
+#
+# author: Romain Forlot <romain.forlot@iot.bzh>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+###########################################################################
+
+# Add target to project dependency list
+PROJECT_TARGET_ADD(hybrid-html5-example)
+
+ # Define project Targets
+ add_custom_command(OUTPUT dist.prod
+ DEPENDS ${TARGET_NAME}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ COMMAND npm install
+ COMMAND gulp widget-config-prod
+ COMMAND cp -r dist.prod ${CMAKE_CURRENT_BINARY_DIR})
+
+ add_custom_target(${TARGET_NAME} ALL DEPENDS dist.prod)
+
+ # Binder exposes a unique public entry point
+ SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES
+ PREFIX ""
+ LABELS "HTDOCS"
+ OUTPUT_NAME dist.prod)
+
+populate_widget()
diff --git a/examples/hybrid-html5/app/bower.json b/examples/hybrid-html5/app/bower.json
new file mode 100644
index 0000000..c78c624
--- /dev/null
+++ b/examples/hybrid-html5/app/bower.json
@@ -0,0 +1,22 @@
+{
+ "name": "healthy-gulp-angular",
+ "version": "0.0.0",
+ "authors": "",
+ "private": true,
+ "dependencies": {
+ "angular": "~1.3.4",
+ "angular-cookies": "~1.3.4",
+ "foundation-apps": "~1.1.0",
+ "angular-ui-notification": "~0.0.14",
+ "foundation-icon-fonts": "*",
+ "jszip": "Stuk/jszip#~2.5.0"
+ },
+ "overrides": {
+ "foundation": {
+ "main": [
+ "dist/js/foundation-apps-templates.js",
+ "dist/js/foundation-apps.js"
+ ]
+ }
+ }
+}
diff --git a/examples/hybrid-html5/app/gulpfile.js b/examples/hybrid-html5/app/gulpfile.js
new file mode 100644
index 0000000..da2826d
--- /dev/null
+++ b/examples/hybrid-html5/app/gulpfile.js
@@ -0,0 +1,438 @@
+// BUG Symlink not working
+
+var gulp = require('gulp');
+var debug = require('gulp-debug');
+var plugins = require('gulp-load-plugins')();
+var del = require('del');
+var es = require('event-stream');
+var bowerFiles = require('main-bower-files');
+var print = require('gulp-print');
+var Q = require('q');
+var imagemin = require('gulp-imagemin'), pngquant = require('imagemin-pngquant');
+var taskListing = require('gulp-task-listing');
+var symlink = require('gulp-sym');
+var rename = require("gulp-rename");
+var exec = require('child_process').exec
+
+// addon for Foundation6
+var router = require('front-router');
+
+// == PATH STRINGS ========
+var appdir = "./"; // Warning to not forget trailling '/'
+config=require (appdir + "etc/_Config"); // upload user local preferences if any
+
+var frontend= appdir + config.FRONTEND;
+
+var paths = {
+ application : frontend,
+ scripts : frontend+'/**/*.js',
+ appStyles : [frontend+'/**/*.scss', '!'+frontend+'/styles/*/*-conf.scss'],
+ globalStyles: [frontend+'/styles/**/*.scss'],
+ images : [frontend+'/**/*.png',frontend+'/**/*.jpg',frontend+'/**/*.jpeg',frontend+'/**/*.svg',frontend+'/**/*.ttf'],
+ index : frontend+'/index.html',
+ partials : [frontend + '/**/*.html', '!' + frontend +'/index.html'],
+ distDev : './dist.dev',
+ distProd : './dist.prod',
+ sass: [frontend+'/styles', 'bower_components/foundation-apps/scss','bower_components/foundation-icon-fonts'],
+ fonts: ['bower_components/**/*.woff'],
+ favicon: frontend+'/favicon.ico',
+ wgtconfig: 'config.xml'
+};
+
+paths['distAppDev'] = paths.distDev + config.URLBASE;
+paths['distAppProd'] = paths.distProd + config.URLBASE;
+
+// Run node in debug mode in developpement mode ?
+var nodeopts = config.DEBUG !== undefined ? '--debug='+config.DEBUG : '';
+
+// == PIPE SEGMENTS ========
+var pipes = {};
+
+pipes.orderedVendorScripts = function() {
+ return plugins.order(['jquery.js', 'angular.js']);
+};
+
+pipes.orderedAppScripts = function() {
+ return plugins.angularFilesort();
+};
+
+pipes.minifiedFileName = function() {
+ return plugins.rename(function (path) {
+ path.extname = '.min' + path.extname;
+ });
+};
+
+pipes.validatedAppScripts = function() {
+ return gulp.src(paths.scripts)
+ .pipe(plugins.replace('@@APPNAME@@', config.APPNAME))
+ .pipe(plugins.jshint())
+ .pipe(plugins.jshint.reporter('jshint-stylish'));
+};
+
+pipes.builtAppScriptsDev = function() {
+ return pipes.validatedAppScripts()
+ .pipe(gulp.dest(paths.distAppDev));
+};
+
+pipes.builtAppScriptsProd = function() {
+ var scriptedPartials = pipes.scriptedPartials();
+ var validatedAppScripts = pipes.validatedAppScripts();
+ return es.merge(scriptedPartials, validatedAppScripts)
+ .pipe(plugins.ngAnnotate())
+ .pipe(pipes.orderedAppScripts())
+ .pipe(plugins.sourcemaps.init())
+ .pipe(plugins.concat(config.APPNAME+'.min.js'))
+ .pipe(plugins.uglify({compress: {drop_console: true}}))
+ .pipe(plugins.sourcemaps.write())
+ .pipe(gulp.dest(paths.distAppProd));
+};
+
+pipes.builtVendorScriptsDev = function() {
+ return gulp.src(bowerFiles())
+ .pipe(gulp.dest( paths.distDev +'/bower_components'));
+};
+
+pipes.builtVendorScriptsProd = function() {
+ return gulp.src(bowerFiles('**/*.js'))
+ .pipe(pipes.orderedVendorScripts())
+ .pipe(plugins.concat('vendor.min.js'))
+ .pipe(plugins.uglify())
+ .pipe(gulp.dest(paths.distProd+ '/bower_components'));
+};
+
+
+pipes.validatedPartials = function() {
+ return gulp.src(paths.partials)
+ .pipe(plugins.htmlhint({'doctype-first': false}))
+ .pipe(router({path: paths.application+'/etc/routes.js', root: paths.application}))
+ .pipe(plugins.htmlhint.reporter());
+};
+
+pipes.builtPartialsDev = function() {
+ return pipes.validatedPartials()
+ .pipe(gulp.dest(paths.distAppDev));
+};
+
+pipes.scriptedPartials = function() {
+ return pipes.validatedPartials()
+ .pipe(plugins.htmlhint.failReporter())
+ .pipe(plugins.htmlmin({collapseWhitespace: true, removeComments: true}))
+ .pipe(plugins.ngHtml2js({
+ moduleName: config.APPNAME,
+ template: "(function() {"
+ + "angular.module('<%= moduleName %>').run(['$templateCache', function($templateCache) {"
+ + "$templateCache.put('<%= template.url %>',\n '<%= template.escapedContent %>');"
+ + "}]);\n"
+ + "})();\n"
+ }));
+};
+
+pipes.builtAppStylesDev = function() {
+ return gulp.src(paths.appStyles)
+ .pipe(plugins.sass({includePaths: paths.sass}))
+ .pipe(gulp.dest(paths.distAppDev + '/styles'));
+};
+
+pipes.builtglobalStylesDev = function() {
+ return gulp.src(paths.globalStyles)
+ .pipe(plugins.sass({includePaths: paths.sass}))
+ .pipe(gulp.dest(paths.distDev + '/global_styles'));
+};
+
+pipes.builtAppStylesProd = function() {
+ return gulp.src(paths.appStyles)
+ .pipe(plugins.sourcemaps.init())
+ .pipe(plugins.sass({includePaths: frontend + '/styles'}))
+ // .pipe(debug({title: '***** appStyle:'}))
+ .pipe(plugins.cleanCss())
+ .pipe(plugins.concat(config.APPNAME+'.css'))
+ .pipe(plugins.sourcemaps.write())
+ .pipe(pipes.minifiedFileName())
+ .pipe(gulp.dest(paths.distAppProd));
+};
+
+pipes.builtglobalStylesProd = function() {
+ return gulp.src(paths.globalStyles)
+ .pipe(plugins.sourcemaps.init())
+ .pipe(plugins.sass({includePaths: paths.sass}))
+ .pipe(plugins.cleanCss())
+ .pipe(plugins.sourcemaps.write())
+ .pipe(pipes.minifiedFileName())
+ .pipe(rename(function (path) {path.dirname="";return path;}))
+ .pipe(gulp.dest(paths.distProd + '/global_styles'));
+};
+
+pipes.processedFontsDev = function() {
+ return gulp.src(paths.fonts)
+ .pipe(rename(function (path) {path.dirname="";return path;}))
+ .pipe(gulp.dest(paths.distDev+'/bower_components'));
+};
+
+pipes.processedFontsProd = function() {
+ return gulp.src(paths.fonts)
+ .pipe(rename(function (path) {path.dirname="";return path;}))
+ .pipe(gulp.dest(paths.distProd+'/bower_components'));
+};
+
+
+pipes.processedImagesDev = function() {
+ return gulp.src(paths.images)
+ .pipe(gulp.dest(paths.distAppDev));
+};
+
+pipes.processedFaviconDev = function() {
+ return gulp.src(paths.favicon)
+ .pipe(gulp.dest(paths.distDev));
+};
+
+pipes.processedImagesProd = function() {
+ return gulp.src(paths.images)
+ .pipe(imagemin({
+ progressive: true,
+ svgoPlugins: [{removeViewBox: false}],
+ use: [pngquant()]
+ }))
+ .pipe(gulp.dest(paths.distAppProd));
+};
+
+pipes.processedFaviconProd = function() {
+ return gulp.src(paths.favicon)
+ .pipe(gulp.dest(paths.distProd));
+};
+
+// Create an Symlink when config.URLBASE exist
+pipes.createDevSymLink = function() {
+ return gulp.src(paths.distDev).pipe(symlink(paths.distDev+config.URLBASE, {force: true}));
+};
+
+pipes.createProdSymLink = function() {
+ return gulp.src(paths.distProd).pipe(symlink(paths.distDev+config.URLBASE,{force: true}));
+};
+
+pipes.validatedIndex = function() {
+ return gulp.src(paths.index)
+ .pipe(plugins.replace('@@APPNAME@@', config.APPNAME))
+ .pipe(plugins.replace('@@URLBASE@@', config.URLBASE))
+ .pipe(plugins.htmlhint())
+ .pipe(plugins.htmlhint.reporter());
+};
+
+pipes.builtIndexDev = function() {
+
+ var orderedVendorScripts = pipes.builtVendorScriptsDev()
+ .pipe(pipes.orderedVendorScripts());
+
+ var orderedAppScripts = pipes.builtAppScriptsDev()
+ .pipe(pipes.orderedAppScripts());
+
+ var appStyles = pipes.builtAppStylesDev();
+ var globalStyles = pipes.builtglobalStylesDev();
+
+ return pipes.validatedIndex()
+ // Vendor and Global should have absolute path to rootdir application one are relative to BaseURL
+ .pipe(plugins.inject(orderedVendorScripts, {relative: false, ignorePath: "/dist.dev", name: 'bower'}))
+ .pipe(plugins.inject(globalStyles, {relative: false, ignorePath: "/dist.dev", name:'vendor'}))
+ .pipe(gulp.dest(paths.distAppDev)) // write first to get relative path for inject
+ .pipe(plugins.inject(orderedAppScripts, {relative: true}))
+ .pipe(plugins.inject(appStyles, {relative: true, name: 'appli'}))
+ .pipe(gulp.dest(paths.distAppDev));
+};
+
+pipes.builtIndexProd = function() {
+
+ var vendorScripts= pipes.builtVendorScriptsProd();
+ var appScripts = pipes.builtAppScriptsProd();
+ var appStyles = pipes.builtAppStylesProd();
+ var globalStyles = pipes.builtglobalStylesProd();
+
+ return pipes.validatedIndex()
+ // Vendor and Global should have absolute path to rootdir application one are relative to BaseURL
+ .pipe(plugins.inject(vendorScripts, {relative: false, ignorePath: "/dist.prod", name: 'bower'}))
+ .pipe(plugins.inject(globalStyles, {relative: false, ignorePath: "/dist.prod", name:'vendor'}))
+ .pipe(gulp.dest(paths.distAppProd)) // write first to get relative path for inject
+ .pipe(plugins.inject(appScripts, {relative: true}))
+ .pipe(plugins.inject(appStyles, {relative: true, name:'appli'}))
+ .pipe(plugins.htmlmin({collapseWhitespace: true, removeComments: true}))
+ .pipe(gulp.dest(paths.distAppProd));
+};
+
+pipes.builtAppDev = function() {
+ return es.merge(pipes.builtIndexDev(), pipes.builtPartialsDev(), pipes.processedFaviconDev(), pipes.processedImagesDev(), pipes.processedFontsDev() );
+};
+
+pipes.builtAppProd = function() {
+ return es.merge(pipes.builtIndexProd(), pipes.processedFaviconProd(), pipes.processedImagesProd(), pipes.processedFontsProd());
+};
+
+pipes.widgetConfig = function(type) {
+ var dst=paths["dist"+type];
+ var content="."+config.URLBASE+"/index.html";
+ content=content.replace(/\/+/g,"/");
+ return gulp.src(paths.wgtconfig+".in")
+ .pipe(plugins.replace('@@APPNAME@@', config.APPNAME))
+ .pipe(plugins.replace('@@CONTENT@@', content))
+ .pipe(plugins.rename("config.xml"))
+ .pipe(gulp.dest(dst))
+};
+
+pipes.widgetPack = function(type,cb) {
+ var dst=paths["dist"+type];
+ var wgtfile=config.APPNAME+"_"+type+".wgt"
+
+ exec(
+ "wgtpkg-pack -f -o "+wgtfile+" "+dst,
+ function(err,stdout,stderr) {
+ console.log(stdout);
+ console.log(stderr);
+ cb(err);
+ });
+};
+
+// == TASKS ========
+
+// Add a task to render the output
+gulp.task('help', taskListing.withFilters(/-/));
+
+// clean, build of production environement
+gulp.task('build', ['clean-build-app-prod']);
+
+// removes all compiled dev files
+gulp.task('clean-dev', function() {
+ var deferred = Q.defer();
+ del(paths.distDev, function() {
+ deferred.resolve();
+ });
+ return deferred.promise;
+});
+
+// removes all compiled production files
+gulp.task('clean-prod', function() {
+ var deferred = Q.defer();
+ del(paths.distProd, function() {
+ deferred.resolve();
+ });
+ return deferred.promise;
+});
+
+// checks html source files for syntax errors
+gulp.task('validate-partials', pipes.validatedPartials);
+
+// checks index.html for syntax errors
+gulp.task('validate-index', pipes.validatedIndex);
+
+// moves html source files into the dev environment
+gulp.task('build-partials-dev', pipes.builtPartialsDev);
+
+// converts partials to javascript using html2js
+gulp.task('convert-partials-to-js', pipes.scriptedPartials);
+
+// runs jshint on the app scripts
+gulp.task('validate-app-scripts', pipes.validatedAppScripts);
+
+// moves app scripts into the dev environment
+gulp.task('build-app-scripts-dev', pipes.builtAppScriptsDev);
+
+// concatenates, uglifies, and moves app scripts and partials into the prod environment
+gulp.task('build-app-scripts-prod', pipes.builtAppScriptsProd);
+
+// compiles app sass and moves to the dev environment
+gulp.task('build-app-styles-dev', pipes.builtAppStylesDev);
+
+// compiles and minifies app sass to css and moves to the prod environment
+gulp.task('build-app-styles-prod', pipes.builtAppStylesProd);
+
+// moves vendor scripts into the dev environment
+gulp.task('build-vendor-scripts-dev', pipes.builtVendorScriptsDev);
+
+// concatenates, uglifies, and moves vendor scripts into the prod environment
+gulp.task('build-vendor-scripts-prod', pipes.builtVendorScriptsProd);
+
+// validates and injects sources into index.html and moves it to the dev environment
+gulp.task('build-index-dev', pipes.builtIndexDev);
+
+// validates and injects sources into index.html, minifies and moves it to the dev environment
+gulp.task('build-index-prod', pipes.builtIndexProd);
+
+// builds a complete dev environment
+gulp.task('build-app-dev', pipes.builtAppDev);
+
+// builds a complete prod environment
+gulp.task('build-app-prod', pipes.builtAppProd);
+
+// cleans and builds a complete dev environment
+gulp.task('clean-build-app-dev', ['clean-dev'], pipes.builtAppDev);
+
+// cleans and builds a complete prod environment
+gulp.task('clean-build-app-prod', ['clean-prod'], pipes.builtAppProd);
+
+// clean, build, and watch live changes to the dev environment
+gulp.task('watch-dev', ['clean-build-app-dev'], function() {
+
+ // watch app scripts
+ gulp.watch(paths.scripts, function() {
+ return pipes.builtAppScriptsDev()
+ .pipe(plugins.livereload());
+ });
+
+ // watch html partials
+ gulp.watch(paths.partials, function() {
+ return pipes.builtPartialsDev()
+ .pipe(plugins.livereload());
+ });
+
+ // watch Images
+ gulp.watch(paths.images, function() {
+ return pipes.processedImagesDev()
+ .pipe(plugins.livereload());
+ });
+
+ // watch styles
+ gulp.watch(paths.appStyles, function() {
+ return pipes.builtAppStylesDev()
+ .pipe(plugins.livereload());
+ });
+
+});
+
+// clean, build, and watch live changes to the prod environment
+gulp.task('watch-prod', ['clean-build-app-prod'], function() {
+
+ // watch index
+ gulp.watch(paths.index, function() {
+ return pipes.builtIndexProd()
+ .pipe(plugins.livereload());
+ });
+
+ // watch app scripts
+ gulp.watch(paths.scripts, function() {
+ return pipes.builtAppScriptsProd()
+ .pipe(plugins.livereload());
+ });
+
+ // watch hhtml partials
+ gulp.watch(paths.partials, function() {
+ return pipes.builtAppScriptsProd()
+ .pipe(plugins.livereload());
+ });
+
+ // watch Images
+ gulp.watch(paths.images, function() {
+ return pipes.processedImagesProd()
+ .pipe(plugins.livereload());
+ });
+
+ // watch styles
+ gulp.watch(paths.appStyles, function() {
+ return pipes.builtAppStylesProd()
+ .pipe(plugins.livereload());
+ });
+
+});
+
+gulp.task('widget-config-dev', ['build-app-dev'], function() { return pipes.widgetConfig("Dev"); });
+gulp.task('widget-config-prod', ['build-app-prod'], function() { return pipes.widgetConfig("Prod"); });
+gulp.task('widget-dev', ['widget-config-dev'], function(cb) { return pipes.widgetPack("Dev",cb); });
+gulp.task('widget-prod', ['widget-config-prod'], function(cb) { return pipes.widgetPack("Prod",cb); });
+
+// default task builds for prod
+gulp.task('default', ['widget-prod']);
diff --git a/examples/hybrid-html5/app/package.json b/examples/hybrid-html5/app/package.json
new file mode 100644
index 0000000..132e7ec
--- /dev/null
+++ b/examples/hybrid-html5/app/package.json
@@ -0,0 +1,61 @@
+{
+ "name": "xxxxxx-hybrid-html5",
+ "private": true,
+ "version": "0.0.1",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/iotbzh/healthy-gulp-angular-foundation6"
+ },
+ "scripts": {
+ "postinstall": "bower install",
+ "build": "./node_modules/.bin/gulp clean-build-app-dev",
+ "start": "node node_modules/.bin/gulp watch-dev"
+ },
+ "devDependencies": {
+ "body-parser": "^1.5.2",
+ "bower": "^1.3.1",
+ "cookie-parser": "^1.4.0",
+ "del": "^1.1.1",
+ "event-stream": "^3.2.2",
+ "express": "^4.7.2",
+ "express-session": "^1.12.1",
+ "front-router": "^1.0.0",
+ "gulp": "^3.9.0",
+ "gulp-angular-filesort": "^1.0.4",
+ "gulp-debug": "^2.1.2",
+ "gulp-concat": "^2.4.3",
+ "gulp-htmlhint": "0.0.9",
+ "gulp-htmlmin": "^1.0.0",
+ "gulp-imagemin": "*",
+ "gulp-inject": "^1.1.1",
+ "gulp-jshint": "^1.9.2",
+ "gulp-livereload": "^3.7.0",
+ "gulp-load-plugins": "^0.8.0",
+ "gulp-clean-css": "^2.0.11",
+ "gulp-ng-annotate": "^1.1.0",
+ "gulp-ng-html2js": "^0.2.0",
+ "gulp-nodemon": "^2.0.0",
+ "gulp-order": "^1.1.1",
+ "gulp-print": "^1.1.0",
+ "gulp-rename": "^1.2.0",
+ "gulp-replace": "^0.5.4",
+ "gulp-sass": "^2.0.3",
+ "gulp-sourcemaps": "^1.3.0",
+ "gulp-task-listing": "^1.0.1",
+ "gulp-uglify": "^1.2.0",
+ "imagemin-pngquant": "*",
+ "jshint-stylish": "^1.0.0",
+ "karma": "^0.10",
+ "karma-junit-reporter": "^0.2.2",
+ "main-bower-files": "^2.5.0",
+ "method-override": "^2.1.2",
+ "protractor": "^1.1.1",
+ "q": "^1.1.2",
+ "shelljs": "^0.2.6",
+ "traceback": "^0.3.1",
+ "gulp-sym": "0.0.14"
+ },
+ "dependencies": {
+ "multer": "^1.1.0"
+ }
+}