diff --git a/.gitignore b/.gitignore index 03a2720..be25a54 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ node_modules .grunt .DS_Store +**/*.swp dep asset doc/api diff --git a/Gruntfile.js b/Gruntfile.js index 4c31604..88f7cfd 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,6 +1,5 @@ module.exports = function (grunt) { - var build_prefix = grunt.option('prefix') || 'ecomui'; var pkg = grunt.file.readJSON('package.json'); grunt.initConfig({ @@ -10,29 +9,52 @@ module.exports = function (grunt) { src: { main: 'src', test: 'test/spec' - } + }, + cssPrefix: 'seui', + buildPrefix: 'ui', + version: pkg.version }, clean: { before: ['asset', 'bin'], - after: ['src/moye'], - afterdoc: ['example/css'] + after: ['src/moye', 'asset/moye/css'], + afterdoc: ['example/css'], + //真实上线后。lib已经和Control合并,并且paths已经配置lib->Control,所以 + //编译完成后,直接删除lib.js + //config同上 + 'after-online': [ + 'asset/online/ui/lib.js', + 'asset/online/ui/config.js', + 'asset/online/css' + ] }, jshint: { options: grunt.file.readJSON('.jshintrc'), - files: ['<%=meta.src.main%>/ui/*.js', '<%=meta.src.test%>/*.js'] + files: ['<%=meta.src.main%>/moye/*.js', '<%=meta.src.test%>/*.js'] }, less: { compile: { files: [{ expand: true, - cwd: 'src/css', + cwd: 'src/moye/css', src: '*.less', dest: 'asset/css', ext: '.css' }] + }, + online: { + options: { + compress: true + }, + files: [{ + expand: true, + cwd: 'src/moye/css', + src: '*.less', + dest: 'asset/online/ui', + ext: '.css' + }] } }, @@ -44,11 +66,11 @@ module.exports = function (grunt) { }, lesslint: { - src: ['src/**/*.less'] + src: ['src/moye/**/*.less'] }, jsdoc : { - files: ['src/**/*.js'], + files: ['src/moye/*/*.js'], options: { configure: '.jsdocrc', destination: 'doc/api' @@ -66,11 +88,19 @@ module.exports = function (grunt) { }, copy: { - build: { + js: { expand: true, cwd: '<%=meta.src.main%>/ui', src: '**', - dest: '<%=meta.src.main%>/moye/' + build_prefix, + dest: '<%=meta.src.main%>/moye/ui', + flatten: false, + filter: 'isFile', + }, + css: { + expand: true, + cwd: '<%=meta.src.main%>/css', + src: '**', + dest: '<%=meta.src.main%>/moye/css', flatten: false, filter: 'isFile', }, @@ -108,12 +138,35 @@ module.exports = function (grunt) { generateSourceMaps: false, optimize: 'uglify2'/*, modules: [ - {name: build_prefix + '/Calendar'}, - {name: build_prefix + '/City'} + {name: 'Calendar'}, + {name: 'City'} ]*/ } }, + online: { + options: { + baseUrl: '<%=meta.src.main%>/moye', + dir: 'asset/online/', + skipDirOptimize: false, + preserveLicenseComments: false, + generateSourceMaps: false, + optimize: 'uglify2', + modules: [ + {name: '<%= meta.buildPrefix%>/Control'}, + ] + } + }, + karma: { + options: { + configFile: 'test/config.js', + reporters: 'dots', + singleRun: true + }, + dev: { + browsers: ['Chrome', 'Firefox'] + } + } }, connect: { @@ -138,16 +191,27 @@ module.exports = function (grunt) { template: require('grunt-template-jasmine-requirejs'), templateOptions: { requireConfig: { - baseUrl: './<%=meta.src.main%>/', + baseUrl: './<%=meta.src.main%>/moye', urlArgs: '?' + (+new Date).toString(36) } } } }, + online: { + src: './asset/online/ui/*.js', + options: { + outfile: 'SpecRunner.html', + keepRunner: true, + specs: 'test/spec/*Spec.js', + vendor: [], + host: 'http://localhost:<%= connect.test.options.port %>', + template: 'test/templates/OnlineRunner.tmpl' + } + }, istanbul: { - src: './<%=meta.src.main%>/*/*.js', + src: './<%=meta.src.main%>/moye/ui/*.js', options: { - specs: ['test/spec/*Spec.js'], + specs: '<%= jasmine.requirejs.options.specs %>', vendor: [], outfile: 'SpecRunner.html', keepRunner: true, @@ -161,24 +225,14 @@ module.exports = function (grunt) { template: require('grunt-template-jasmine-requirejs'), templateOptions: { requireConfig: { - baseUrl: '.grunt/grunt-contrib-jasmine/<%= meta.src.main %>/', + baseUrl: '.grunt/grunt-contrib-jasmine/<%= meta.src.main %>/moye', urlArgs: '?' + (+new Date).toString(36) } } } } } - }, - karma: { - options: { - configFile: 'test/config.js', - reporters: 'dots', - singleRun: true - }, - dev: { - browsers: ['PhantomJS'] - } }, 'gh-pages': { @@ -186,7 +240,30 @@ module.exports = function (grunt) { base: './', message: 'Auto-generated commit by grunt' }, - src: ['doc/api/*', 'example/**', 'src/*/*'] + src: ['doc/api/*', 'example/**', 'src/moye/*/*'] + }, + + 'join-css-js': { + online: { + files: [{ + expand: true, + cwd: 'asset/online/ui', + src: '*.js' + }] + } + }, + + 'tmpl': { + build: { + files:[ + { + expand: true, + src: '**/config.*', + cwd: '<%=meta.src.main%>/moye/', + filter: 'isFile', + } + ] + } } }); @@ -202,12 +279,57 @@ module.exports = function (grunt) { } ); + //合并组件的js、css文件,这样模板开发者就不用再关心css的引入问题 + grunt.registerMultiTask('join-css-js', 'join ui css and js', function(){ + this.files.forEach(function(file){ + var files = file.src.filter(function(filePath) { + var cssPath = filePath.replace(/\.js$/, '.css'); + if (!grunt.file.exists(filePath) || !grunt.file.exists(cssPath)) { + return false; + } else { + return true; + } + }).map(function(filePath) { + var cssPath = filePath.replace(/\.js$/, '.css'); + var js = grunt.file.read(filePath), + css = grunt.file.read(cssPath); + var content = "A.addCssText(" + JSON.stringify(css) + ");"; + content += js; + grunt.file.write(filePath, content); + grunt.file.delete(cssPath); + grunt.log.writeln('join-css-js: ' + filePath); + return filePath; + }); + }); + debugger; + }); + + + //将文件作为模板处理,变量变量使用meta信息,用于替换一些常量 + grunt.registerMultiTask('tmpl', 'process file as a template using meta data', function(){ + this.files.forEach(function(file){ + file.src.forEach(function(filePath){ + var meta = grunt.config('meta'); + var tpl = grunt.file.read(filePath), + content = grunt.util._.template(tpl, meta); + grunt.file.write(filePath, content); + grunt.log.writeln('tmpl: ' + filePath); + }); + }); + }); + + + grunt.registerTask('base', ['clean:before', 'copy:js', 'copy:css', 'tmpl', 'jshint', 'lesslint', 'less:compile', 'csslint']); + grunt.registerTask('base-online', ['clean:before','copy:js', 'copy:css', 'tmpl', 'jshint','lesslint', 'csslint']); - grunt.registerTask('base', ['clean:before', 'jshint', 'lesslint', 'less', 'csslint']); - grunt.registerTask('build', ['base', 'copy:build', 'requirejs:build', 'clean:after']); + grunt.registerTask('build', ['base', 'requirejs:build', 'clean:after']); grunt.registerTask('test', ['base', 'connect', 'jasmine:requirejs']); grunt.registerTask('cover', ['base', 'connect', 'jasmine:istanbul']); grunt.registerTask('default', ['base']); - grunt.registerTask('page', ['less', 'copy:doc', 'jsdoc', 'gh-pages', 'clean:afterdoc']); + grunt.registerTask('example', ['copy:js', 'copy:css', 'tmpl', 'less', 'copy:doc']); + grunt.registerTask('page', ['example', 'jsdoc', 'gh-pages', 'clean:afterdoc']); + grunt.registerTask('build-online', ['base-online', 'requirejs:online', 'less:online', + 'join-css-js:online', 'clean:after', 'clean:after-online']); + grunt.registerTask('test-online', ['build-online', 'connect', 'jasmine:online']); } diff --git a/example/Calendar.html b/example/Calendar.html index 2f97101..c5e3344 100644 --- a/example/Calendar.html +++ b/example/Calendar.html @@ -25,7 +25,7 @@ (function () { require.config({ - baseUrl: '../src/ui' + baseUrl: '../src/moye/ui' }); require(['lib', 'Calendar'], function (lib, Calendar) { diff --git a/example/CalendarExtension.html b/example/CalendarExtension.html index b992c6b..2eeb4a4 100644 --- a/example/CalendarExtension.html +++ b/example/CalendarExtension.html @@ -25,7 +25,7 @@ (function () { require.config({ - baseUrl: '../src/ui' + baseUrl: '../src/moye/ui' }); require(['lib', 'CalendarExtension'], function (lib, CalendarExtension) { diff --git a/example/City.html b/example/City.html index 4af7a4a..28f12f8 100644 --- a/example/City.html +++ b/example/City.html @@ -22,7 +22,7 @@ (function () { require.config({ - baseUrl: '../src/ui' + baseUrl: '../src/moye/ui' }); require(['lib', 'City'], function (lib, City) { diff --git a/example/Dialog.html b/example/Dialog.html index c51029f..8fdc517 100644 --- a/example/Dialog.html +++ b/example/Dialog.html @@ -53,7 +53,7 @@ + + + +
+