Preparation to bower release
diff --git a/gulp/dev.js b/gulp/dev.js
new file mode 100644
index 0000000..ee51e3f
--- /dev/null
+++ b/gulp/dev.js
@@ -0,0 +1,84 @@
+/*eslint-env node */
+(function () {
+  'use strict';
+
+  const gulp = require('gulp');
+  const inject = require('gulp-inject');
+  const angularFilesort = require('gulp-angular-filesort');
+  const wiredep = require('wiredep').stream;
+  const path = require('path');
+  const babel = require('gulp-babel');
+  const sourcemaps = require('gulp-sourcemaps');
+  const browserSync = require('browser-sync').create();
+  module.exports = function(options){
+
+    console.log(options.xosHelperTmp, path.join(__dirname, `../${options.xosHelperTmp}`));
+
+    gulp.task('serveDevEnv', ['babelDev', 'wiredep', 'inject', 'injectStyle'], function(){
+      browserSync.init({
+        server: {
+          baseDir: ['./dev', './.tmp', './dist'],
+          // directory: true,
+          routes: {
+            '/bower_components': 'bower_components'
+          },
+        }
+      });
+
+      gulp.watch([
+        './src/**/*.js'
+      ], ['babelDev']);
+
+      gulp.watch([
+        './src/**/*.scss'
+      ], ['style']);
+
+      gulp.watch([
+        './dev/*.html',
+        './dev/*.js',
+        './.tmp/**/*.js'
+      ], function(){
+        browserSync.reload();
+      });
+    });
+
+    gulp.task('babelDev', function(){
+      return gulp.src(options.xosHelperSource + '**/*.js')
+        .pipe(sourcemaps.init())
+        .pipe(babel({
+          presets: ['es2015']
+        }))
+        .pipe(sourcemaps.write('./maps'))
+        .pipe(gulp.dest(options.xosHelperTmp));
+    });
+
+    gulp.task('inject', function(){
+      const files = gulp.src([
+        `${options.xosHelperTmp}**/*.js`
+      ])
+      .pipe(angularFilesort())
+
+      return gulp.src('./dev/index.html')
+        .pipe(inject(files, {ignorePath: ['.tmp/']}))
+        .pipe(gulp.dest('./dev/'));
+    });
+
+    gulp.task('injectStyle', function(){
+      const files = gulp.src([
+        `${options.ngXosStyles}*.css`
+      ])
+
+      return gulp.src('./dev/index.html')
+        .pipe(inject(files, {ignorePath: ['dist/']}))
+        .pipe(gulp.dest('./dev/'));
+    });
+    
+
+    // inject bower dependencies with wiredep
+    gulp.task('wiredep', function () {
+      return gulp.src('./dev/index.html')
+        .pipe(wiredep({devDependencies: false}))
+        .pipe(gulp.dest('./dev'));
+    });
+  };
+})();
\ No newline at end of file
diff --git a/gulp/docs.js b/gulp/docs.js
new file mode 100644
index 0000000..ab77e1a
--- /dev/null
+++ b/gulp/docs.js
@@ -0,0 +1,74 @@
+/*eslint-env node */
+
+const gulp = require('gulp');
+const gulpDocs = require('gulp-ngdocs');
+const del = require('del');
+const browserSync = require('browser-sync').create();
+
+module.exports = function(options){
+
+  gulp.task('cleanDocs', function(){
+    return del([options.docs + '**/*']);
+  });
+
+  gulp.task('makeDocs', ['cleanDocs'], function(){
+
+    const ngOptions = {
+      scripts: [].concat([
+        `./${options.ngXosVendor}ngXosVendor.min.js`,
+        `./${options.ngXosVendor}ngXosHelpers.min.js`,
+        'https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.7/angular-mocks.js',
+      ]),
+      styles: [
+        `./${options.ngXosStyles}xosNgLib.css`,
+        'https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.css',
+      ],
+      html5Mode: false,
+      title: 'XOS Helpers documentation',
+      startPage: '/ngXosLib',
+    }
+
+    return gulpDocs.sections({
+      ngXosLib: {
+        glob: [
+          options.xosHelperSource + '*.js',
+          options.xosHelperSource + 'services/helpers/**/*.js',
+          options.xosHelperSource + 'services/*.js',
+          options.xosHelperSource + 'ui_components/**/*.js'
+        ],
+        title: 'Module Documentation',
+      },
+      'rest-api': {
+        glob: [
+          options.xosHelperSource + 'services/rest/*.js'
+        ],
+        api: true,
+        title: 'API Documentation',
+      }
+    }).pipe(gulpDocs.process(ngOptions)).pipe(gulp.dest('./docs'));
+  });
+
+  gulp.task('serveDocs', function(){
+    browserSync.init({
+      server: {
+        baseDir: './docs',
+      }
+    });
+  });
+
+  gulp.task('docs', ['makeDocs', 'serveDocs'], function(){
+    
+    const files = [
+      options.xosHelperSource + '**/*.js',
+    ];
+
+    gulp.watch(files, ['makeDocs']);
+
+    // uncomment to enable autoreload, now it is broken (reload a wrong page)
+    // https://github.com/nikhilmodak/gulp-ngdocs/issues/81
+
+    // gulp.watch(files, function(){
+    //   browserSync.reload();
+    // });
+  });
+};
\ No newline at end of file
diff --git a/gulp/ngXosHelpers.js b/gulp/ngXosHelpers.js
new file mode 100644
index 0000000..4888bdf
--- /dev/null
+++ b/gulp/ngXosHelpers.js
@@ -0,0 +1,85 @@
+/*eslint-env node */
+
+(function () {
+  'use strict';
+
+  const gulp = require('gulp');
+  const uglify = require('gulp-uglify');
+  const concat = require('gulp-concat');
+  const ngAnnotate = require('gulp-ng-annotate');
+  const angularFilesort = require('gulp-angular-filesort');
+  const del = require('del');
+  const babel = require('gulp-babel');
+  const sourcemaps = require('gulp-sourcemaps');
+  const rename = require('gulp-rename');
+  const sass = require('gulp-sass');
+
+  module.exports = function(options){
+
+    // delete previous builded file
+    gulp.task('cleanLib', function(){
+      return del(
+        [
+          `${options.ngXosVendor}/ngXosHelpers.min.js`,
+          `${options.ngXosVendor}/xosUiComponents.js`,
+          `${options.ngXosVendor}/ngXos.css`
+        ],
+        {force: true}
+      );
+    });
+
+    gulp.task('style', function(){
+      return gulp.src(`${options.xosHelperSource}styles/main.scss`)
+        .pipe(sourcemaps.init())
+        .pipe(sass().on('error', sass.logError))
+        .pipe(rename('xosNgLib.css'))
+        .pipe(sourcemaps.write())
+        .pipe(gulp.dest(options.ngXosStyles));
+    });
+
+    // transpile js with sourceMaps
+    gulp.task('babel', function(){
+      return gulp.src(options.xosHelperSource + '**/*.js')
+        .pipe(babel({
+          presets: ['es2015']
+        }))
+        .pipe(gulp.dest(options.xosHelperTmp));
+    });
+
+    // build
+    gulp.task('helpers', ['cleanLib', 'babel', 'style'], function(){
+      return gulp.src([options.xosHelperTmp + '**/*.js'])
+        .pipe(angularFilesort())
+        .pipe(concat('ngXosHelpers.min.js'))
+        .pipe(ngAnnotate())
+        .pipe(uglify())
+        .pipe(gulp.dest(options.ngXosVendor));
+    });
+
+    // build Dev (no minify, sourcemaps), for development purposes
+    // gulp.task('helpersDev', ['babelDev'], function(){
+    //   return gulp.src([options.xosHelperTmp + '**/*.js'])
+    //     .pipe(angularFilesort())
+    //     .pipe(concat('ngXosHelpers.js'))
+    //     .pipe(ngAnnotate())
+    //     .pipe(gulp.dest(options.ngXosVendor));
+    // });
+
+    // concat only UI Components (for free use)
+    gulp.task('uiLibrary', function(){
+      return gulp.src([
+        options.xosHelperTmp + '**/*.js',
+        !options.xosHelperTmp + 'services/rest/*.js'
+      ])
+        .pipe(angularFilesort())
+        .pipe(concat('xosUiComponents.js'))
+        .pipe(ngAnnotate())
+        .pipe(gulp.dest(options.ngXosVendor));
+    });
+
+    gulp.task('dev', function(){
+      gulp.watch(`${options.xosHelperSource}**/*.scss`, ['style']);
+      gulp.watch(options.xosHelperSource + '**/*.js', ['helpersDev']);
+    });
+  };
+})();
\ No newline at end of file
diff --git a/gulp/ngXosVendor.js b/gulp/ngXosVendor.js
new file mode 100644
index 0000000..9e82c23
--- /dev/null
+++ b/gulp/ngXosVendor.js
@@ -0,0 +1,30 @@
+/*eslint-env node */
+(function () {
+  
+  'use strict';
+  const gulp = require('gulp');
+  const uglify = require('gulp-uglify');
+  const concat = require('gulp-concat');
+  const wiredep = require('wiredep');
+  const del = require('del');
+
+  module.exports = function(options){
+
+    gulp.task('cleanVendor', function(){
+      return del(
+        [
+          `${options.ngXosVendor}/ngXosVendor.min.js`
+        ],
+        {force: true}
+      );
+    });
+
+    gulp.task('vendor', ['cleanVendor'], function(){
+      const bowerDeps = wiredep().js;
+      return gulp.src(bowerDeps)
+        .pipe(concat('ngXosVendor.min.js'))
+        .pipe(uglify())
+        .pipe(gulp.dest(options.ngXosVendor));
+    });
+  };
+})();
\ No newline at end of file