diff options
Diffstat (limited to 'catalog-ui/Gruntfile.js')
-rw-r--r-- | catalog-ui/Gruntfile.js | 807 |
1 files changed, 807 insertions, 0 deletions
diff --git a/catalog-ui/Gruntfile.js b/catalog-ui/Gruntfile.js new file mode 100644 index 0000000000..619d8316a1 --- /dev/null +++ b/catalog-ui/Gruntfile.js @@ -0,0 +1,807 @@ +// Generated on 2015-04-28 using +// generator-webapp 0.5.1 +'use strict'; + +// # Globbing +// for performance reasons we're only matching one level down: +// 'test/spec/{,*/}*.js' +// If you want to recursively match all subfolders, use: +// 'test/spec/**/*.js' + +module.exports = function (grunt) { + + // Time how long tasks take. Can help when optimizing build times + require('time-grunt')(grunt); + + // Load grunt tasks automatically + require('load-grunt-tasks')(grunt); + + // Configurable paths + var config = { + app: 'app', + appModuleName: 'sdcApp', + dist: 'app/dist' + }; + + // Define the configuration for all the tasks + grunt.initConfig({ + + // Project settings + config: config, + + // Watches files for changes and runs tasks based on the changed files + watch: { + html: { + files: ['<%= config.app %>/scripts/**/*.html'], + tasks: ['ngtemplates:app'] + }, + less: { + files: ['<%= config.app %>/**/*.less'], + tasks: ['less:all'] + }, + ts: { + files: ['<%= config.app %>/scripts/**/*.ts'], + tasks: ['ts:all'] + }, + bower: { + files: ['bower.json'], + tasks: ['wiredep'] + }, + + gruntfile: { + files: ['Gruntfile.js'] + }, + + livereload: { + options: { + livereload: '<%= connect.options.livereload %>' + }, + files: [ + '<%= config.app %>/{,*/}*.html', + '<%= config.app %>/scripts/**/*.html', + '<%= config.app %>/scripts/**/*.css', + '.tmp/styles/{,*/}*.css', + '<%= config.app %>/images/{,*/}*' + ] + }, + configurations: { + files: [ + 'configurations/*.json' + ], + tasks: ['ngconstant'] + } + }, + + ngconstant: { + options: { + dest: 'app/scripts/modules/configurations.js', + name: 'Sdc.Config' + }, + main: { + constants: { + sdcConfig: grunt.file.readJSON(grunt.option('env') ? 'configurations/' + grunt.option('env') + '.json' : 'configurations/prod.json'), + sdcMenu: grunt.file.readJSON('configurations/menu.json') + } + } + }, + + express: { + options: { + port: process.env.PORT || 9000 + }, + mock: { + options: { + script: 'server-mock/mock-server.js' + } + } + }, + + ts: { + all: { + src: [ + 'app/scripts/**/*.ts', + 'typings/**/*.ts' + ], + reference: 'app/scripts/references.ts' + }, + single: { + src: [] + } + }, + ngtemplates: { + app: { + options: { + module: '<%= config.appModuleName %>', + prefix: '/' + }, + src: [ + '<%= config.app %>/scripts/**/*.html', + '!index.html' + ], + dest: '<%= config.app %>/scripts/templates.js' + } + }, + less: { + all: { + options: { + paths: ['<%= config.app %>/scripts', + '<%= config.app %>/styles'] + }, + files: { + '<%= config.app %>/styles/app.css': '<%= config.app %>/styles/app.less' + } + }, + single: { + paths: ['<%= config.app %>/scripts', + '<%= config.app %>/styles'], + files: [] + } + }, + + injector: { + options: {}, + // Inject application script files into index.html (doesn't include bower) + scripts_models: { + options: { + transform: function (filePath) { + filePath = filePath.replace('/app/', ''); + return '<script src="' + filePath + '"></script>'; + }, + starttag: '<!-- injector:js_models -->', + endtag: '<!-- endinjector:js_models -->' + }, + files: { + '<%= config.app %>/index.html': [ + [ + '<%= config.app %>/scripts/models/**/*.js', + '!<%= config.app %>/scripts/models/**/*-tests.js' + ] + ] + } + }, + + scripts_utils: { + options: { + transform: function (filePath) { + filePath = filePath.replace('/app/', ''); + return '<script src="' + filePath + '"></script>'; + }, + starttag: '<!-- injector:js_utils -->', + endtag: '<!-- endinjector:js_utils -->' + }, + files: { + '<%= config.app %>/index.html': [ + [ + '<%= config.app %>/scripts/utils/**/*.js', + '!<%= config.app %>/scripts/models/**/*-tests.js' + ] + ] + } + }, + + scripts_filters: { + options: { + transform: function (filePath) { + filePath = filePath.replace('/app/', ''); + return '<script src="' + filePath + '"></script>'; + }, + starttag: '<!-- injector:js_filters -->', + endtag: '<!-- endinjector:js_filters -->' + }, + files: { + '<%= config.app %>/index.html': [ + ['<%= config.app %>/scripts/filters/**/*.js', + '!<%= config.app %>/scripts/filters/**/*-tests.js' + ] + ] + } + }, + + scripts_directives: { + options: { + transform: function (filePath) { + filePath = filePath.replace('/app/', ''); + return '<script src="' + filePath + '"></script>'; + }, + starttag: '<!-- injector:js_directives -->', + endtag: '<!-- endinjector:js_directives -->' + }, + files: { + '<%= config.app %>/index.html': [ + ['<%= config.app %>/scripts/directives/**/*.js', + '!<%= config.app %>/scripts/directives/**/*-tests.js' + ] + ] + } + }, + + scripts_services: { + options: { + transform: function (filePath) { + filePath = filePath.replace('/app/', ''); + return '<script src="' + filePath + '"></script>'; + }, + starttag: '<!-- injector:js_services -->', + endtag: '<!-- endinjector:js_services -->' + }, + files: { + '<%= config.app %>/index.html': [ + ['<%= config.app %>/scripts/services/**/*.js', + '!<%= config.app %>/scripts/services/**/*-tests.js' + ] + ] + } + }, + + scripts_view_models: { + options: { + transform: function (filePath) { + filePath = filePath.replace('/app/', ''); + return '<script src="' + filePath + '"></script>'; + }, + starttag: '<!-- injector:js_view_models -->', + endtag: '<!-- endinjector:js_view_models -->' + }, + files: { + '<%= config.app %>/index.html': [ + ['<%= config.app %>/scripts/view-models/**/*.js', + '!<%= config.app %>/scripts/view-models/**/*-tests.js'] + ] + } + }, + + // Inject component less into app.less + less: { + options: { + transform: function (filePath) { + filePath = filePath.replace('/app/scripts/', '../scripts/'); + filePath = filePath.replace('/app/styles/', ''); + return '@import \'' + filePath + '\';'; + }, + starttag: '// injector:less', + endtag: '// endinjector:less' + }, + files: { + '<%= config.app %>/styles/app.less': [ + '<%= config.app %>/styles/**/*.less', + '<%= config.app %>/scripts/**/*.less', + '!<%= config.app %>/styles/app.less' + ] + } + }, + + // Inject component css into index.html + css: { + options: { + transform: function (filePath) { + filePath = filePath.replace('/app/', ''); + filePath = filePath.replace('/.tmp/', ''); + return '<link rel="stylesheet" href="' + filePath + '">'; + }, + starttag: '<!-- injector:css -->', + endtag: '<!-- endinjector -->' + }, + files: { + '<%= config.app %>/index.html': [ + '<%= config.app %>/scripts/**/*.css', + '<%= config.app %>/styles/**/*.css', + '!<%= config.app %>/styles/app.css' + ] + } + } + }, + + // The actual grunt server settings + connect: { + options: { + port: 9000, + open: true, + livereload: 35729, + // Change this to '0.0.0.0' to access the server from outside + hostname: 'localhost' + }, + livereload: { + options: { + middleware: function (connect) { + return [ + connect().use(function (req, res, next) { + var mockApis = require('./configurations/mock.json').sdcConfig; + var userType; + switch (grunt.option('role')) { + case "admin": + userType = mockApis.userTypes.admin; + break; + case "tester": + userType = mockApis.userTypes.tester; + break; + case "governor": + userType = mockApis.userTypes.governor; + break; + case "ops": + userType = mockApis.userTypes.ops; + break; + case "designer": + userType = mockApis.userTypes.designer; + break; + case "product_strategist": + userType = mockApis.userTypes.product_strategist; + break; + case "product_manager": + userType = mockApis.userTypes.product_manager; + break; + default: + userType = mockApis.userTypes.designer; + } + res.cookie(mockApis.cookie.userIdSuffix, req.headers[mockApis.cookie.userIdSuffix] || userType.userId); + res.cookie(mockApis.cookie.userEmail, req.headers[mockApis.cookie.userEmail] || userType.email); + res.cookie(mockApis.cookie.userFirstName, req.headers[mockApis.cookie.userFirstName] || userType.firstName); + res.cookie(mockApis.cookie.userLastName, req.headers[mockApis.cookie.userLastName] || userType.lastName); + next(); + }), + connect().use(require('http-proxy-middleware')(['/onboarding', '/onboarding-api'], { + target: 'http://feHost:8181/', + changeOrigin: true, + secure: false + })), + connect().use('/bower_components', connect.static('./bower_components')), + connect().use('/non_bower_components', connect.static('./non_bower_components')), + connect.static(config.app) + ]; + } + } + }, + dist: { + options: { + base: '<%= config.dist %>', + livereload: false + } + } + }, + + // Empties folders to start fresh + clean: { + generated: { + files: [{ + dot: true, + src: [ + '<%= config.app %>/scripts/**/*.js', + '<%= config.app %>/scripts/**/*.css', + '!<%= config.app %>/scripts/**/welcome/styles/*.css', + '<%= config.app %>/styles/**/*.css', + '<%= config.app %>/scripts/**/*.js.map' + ] + }] + }, + dist: { + files: [{ + dot: true, + src: [ + '.tmp', + '<%= config.dist %>/*', + '!<%= config.dist %>/.git*' + ] + }] + }, + server: '.tmp' + }, + // Add vendor prefixed styles + autoprefixer: { + options: { + browsers: ['> 1%', 'last 2 versions', 'Firefox ESR', 'Opera 12.1'] + }, + dist: { + files: [{ + expand: true, + cwd: '.tmp/css/', + src: '{,*/**/}*.css', + dest: '.tmp/css/' + }] + } + }, + + // Automatically inject Bower components into the HTML file + wiredep: { + app: { + ignorePath: /^\/|\.\.\//, + src: ['<%= config.app %>/index.html'] + } + }, + + // Renames files for browser caching purposes + rev: { + dist: { + files: { + src: [ + '<%= config.dist %>/scripts/{,*/}*.js', + '<%= config.dist %>/styles/{,*/}*.css', + '<%= config.dist %>/images/{,*/}*.*', + '!<%= config.dist %>/images/resource-icons/{,*/}*.*', + '!<%= config.dist %>/images/service-icons/{,*/}*.*', + '!<%= config.dist %>/images/relationship-icons/{,*/}*.*', + '<%= config.dist %>/*.{ico,png}' + ] + } + } + }, + + // Reads HTML for usemin blocks to enable smart builds that automatically + // concat, minify and revision files. Creates configurations in memory so + // additional tasks can operate on them + useminPrepare: { + options: { + dest: '<%= config.dist %>' + }, + sdc: { + src: ['<%= config.app %>/index.html'] + }, + html: '<%= config.app %>/index.html' + }, + + // Performs rewrites based on rev and the useminPrepare configuration + usemin: { + options: { + assetsDirs: [ + '<%= config.dist %>', + '<%= config.dist %>/images', + '<%= config.dist %>/styles' + ], + // This is so we update image references in our ng-templates + patterns: { + js: [ + [/(assets\/images\/.*?\.(?:gif|jpeg|jpg|png|webp|svg))/gm, 'Update the JS to reference our revved images'] + ] + } + }, + html: ['<%= config.dist %>/{,*/}*.html'], + css: ['<%= config.dist %>/styles/{,*/}*.css'], + js: ['<%= config.dist %>/public/{,*/}*.js'] + }, + + // The following *-min tasks produce minified files in the dist folder + imagemin: { + dist: { + files: [{ + expand: true, + cwd: '<%= config.app %>/images', + src: '<%= config.app %>/**/*.{gif,jpeg,jpg,png}', + dest: '<%= config.dist %>/images' + }] + } + }, + + svgmin: { + dist: { + files: [{ + expand: true, + cwd: '<%= config.app %>/images', + src: '{,*/}*.svg', + dest: '<%= config.dist %>/images' + }] + } + }, + + htmlmin: { + dist: { + options: { + collapseBooleanAttributes: true, + collapseWhitespace: true, + conservativeCollapse: true, + removeAttributeQuotes: true, + removeCommentsFromCDATA: true, + removeEmptyAttributes: true, + removeOptionalTags: true, + removeRedundantAttributes: true, + useShortDoctype: true + }, + files: [{ + expand: true, + cwd: '<%= config.dist %>', + src: '{,*/}*.html', + dest: '<%= config.dist %>' + }] + } + }, + +// By default, your `index.html`'s <!-- Usemin block --> will take care +// of minification. These next options are pre-configured if you do not +// wish to use the Usemin blocks. + cssmin: { + dist: { + files: { + '<%= config.dist %>/styles/main.css': [ + '.tmp/css/{,*/**/}*.css', + '<%= config.app %>/scripts/{,*/**/}*.css', + '<%= config.app %>/styles/app.css' + ] + } + } + }, + uglify: { + dist: { + files: { + '<%= config.dist %>/scripts/scripts.js': [ + '<%= config.dist %>/scripts/scripts.js' + ] + } + } + }, + replace: { + cssReplace: { + src: ['<%= config.app %>/scripts/{,*/**/}*.css', + '<%= config.app %>/styles/{,*/**/}*.css'], + overwrite: true, + replacements: [ + { + from: '../../../images/', + to: '../images/' + }, + { + from: '../../images/', + to: '../images/' + }, + { + from: '../../../fonts/', + to: '../fonts/' + }, + { + from: '../../fonts/', + to: '../fonts/' + }, + { + from: '../../../styles/images/', + to: 'images/' + } + ] + }, + }, + concat: { + dist: { + options: { + separator: ';\n' + }, + src: ['<%= config.app %>/scripts/{,*/**/}*.js'], + dest: '.tmp/concat/scripts/scripts.js' + }, + generated: { + options: { + separator: '\n' + } + } + }, + + // Copies remaining files to places other tasks can use + copy: { + dist: { + files: [{ + expand: true, + dot: true, + cwd: '<%= config.app %>', + dest: '<%= config.dist %>', + src: [ + '*.{ico,png,txt}', + '.htaccess', + // 'bower_components/**/*', + 'styles/images/**/*', + 'styles/fonts/**/*', + 'languages/**/*', + 'index.html' + ] + }, { + src: 'node_modules/apache-server-configs/dist/.htaccess', + dest: '<%= config.dist %>/.htaccess' + }, + { + expand: true, + cwd: '.tmp/images', + dest: '<%= config.dist %>/images', + src: ['generated/*'] + }, + //TODO to remove this section after integration onboard finished + { + expand: true, + cwd: '<%= config.app %>/third-party', + dest: '<%= config.dist %>/third-party', + src: ['onboard_bundle_full.js'] + }, + { + expand: true, + dest: '<%= config.dist %>', + src: [ + 'package.json' + ] + } + ] + }, + styles: { + expand: true, + cwd: '<%= config.app %>/styles', + dest: '.tmp/css/', + src: '{,*/**/}*.css' + } + }, + + // Run some tasks in parallel to speed up build process + concurrent: { + server: ['copy:styles'], + test: ['copy:styles'], + dist: [ + 'copy:styles', + 'imagemin' + ] + }, + + // Test settings + karma: { + dev: { + configFile: "tests/karma.unit.conf.js", + singleRun: true, + options: { + browsers: ['Chrome'], + coverageReporter: { + type: 'html', + dir: 'tests/Coverage' + } + } + }, + debug: { + configFile: "tests/karma.unit.conf.js", + singleRun: false, + //comment out this line if you want to cancel the watch and see the UT log + background: true, + options: { + browsers: ['Chrome'], + reporters: [ + 'junit', + 'dots', + 'progress' + ] + } + }, + jenkins: { + configFile: "tests/karma.unit.conf.js", + singleRun: true, + options: { + browsers: ['PhantomJS'], + coverageReporter: { + type: 'text-summary', + dir: 'tests/Coverage', + file: 'coverage.txt' + } + } + } + }, + + tslint: { + options: { + configuration: 'tslint.json' + }, + files: { + src: ['<%= config.app %>/**/*.ts'] + } + } + }); + + grunt.registerTask('serve', 'start the server and preview your app, --allow-remote for remote access', function (target) { + + var env = grunt.option('env'); + + if (grunt.option('allow-remote')) { + grunt.config.set('connect.options.hostname', '0.0.0.0'); + } + if (target === 'dist') { + return grunt.task.run(['build', 'connect:dist:keepalive']); + } + + + if (env === 'mock') { + grunt.task.run([ + 'express:mock', + 'clean:generated', + 'ts:all', + 'ngtemplates:app', + 'injector', + 'less:all', + 'ngconstant', + 'wiredep', + 'concurrent:server', + 'autoprefixer', + 'connect:livereload', + 'watch:html', + 'watch:less' + ]); + } + + grunt.task.run([ + 'clean:generated', + 'ts:all', + 'ngtemplates:app', + 'injector', + 'less:all', + 'ngconstant', + 'wiredep', + 'concurrent:server', + 'autoprefixer', + 'connect:livereload', + 'watch' + ]); + }); + + grunt.registerTask('build', [ + 'clean:generated', + 'less:all', + 'ts:all', + 'ngconstant', + 'ngtemplates:app', + 'wiredep', + 'replace', + 'clean:dist', + 'useminPrepare:sdc', + 'concurrent:dist', + 'autoprefixer:dist', + 'concat', + 'copy:dist', + 'cssmin', + 'uglify', + 'rev', + 'usemin' + ]); + + grunt.registerTask("test", function (target) { + + if (!(target === 'debug' || target === 'dev' || target === 'jenkins')) { + throw new Error("target available for test are <dev|debug|jenkins>"); + } + var tasks = [ + // "tslint:karma", + // "ngconstant", + //// "concurrent:test", + // "servicesIconConstants", + // "autoprefixer", + // "ngtemplates:testsTemplates", + // "connect:test" + ]; + + tasks.push('karma:' + target); + if (target === 'debug') { + if (grunt.config.get('watch.ts')) { + tasks.push("watch:ts"); + } else { + throw new Error("target watch:ts is not available, verify that it exists in your Gruntfile"); + } + } + grunt.task.run(tasks); + }); + + + var lessSingleTask = function (filePath) { + var lessSingleFiles = [{ + expand: true, + src: [filePath.replace(/\\/g, '/')], + ext: '.css' + }]; + grunt.config('less.single.files', lessSingleFiles); + grunt.config('watch.less.tasks', 'less:single'); + + }; + + var tsSingleTask = function (filePath) { + + var tsSingleData = { + src: [filePath.replace(/\\/g, '/')] + }; + // grunt.config('ts.single', tsSingleData); + + }; + + var singleTaskByTaskName = { + //less: lessSingleTask, + ts: tsSingleTask + }; + + var onGruntWatchEvent = function (action, filepath, target) { + if (singleTaskByTaskName[target]) { + singleTaskByTaskName[target].call(undefined, filepath); + } + }; + grunt.event.on('watch', onGruntWatchEvent); +}; |