@@ -5,14 +5,16 @@ module.exports = function(grunt) {
55
66 // Project configuration.
77 grunt . initConfig ( {
8- modules : '' , //to be filled in by find-modules task
9- tplModules : '' , //to be filled in by find-templates task
108 ngversion : '1.0.4' ,
9+ srcModules : [ ] , //to be filled in by find-modules task
10+ tplModules : [ ] ,
1111 pkg :'<json:package.json>' ,
12+ dist : 'dist' ,
13+ filename : 'ui-bootstrap' ,
1214 meta : {
13- modules : 'angular.module("ui.bootstrap", [<%= modules %>]);' ,
15+ modules : 'angular.module("ui.bootstrap", [<%= srcModules %>]);' ,
1416 tplmodules : 'angular.module("ui.bootstrap.tpls", [<%= tplModules %>]);' ,
15- all : 'angular.module("ui.bootstrap", ["ui.bootstrap.tpls", <%= modules %>]);'
17+ all : 'angular.module("ui.bootstrap", ["ui.bootstrap.tpls", <%= srcModules %>]);'
1618 } ,
1719 lint : {
1820 files : [ 'grunt.js' , 'src/**/*.js' ]
@@ -23,22 +25,22 @@ module.exports = function(grunt) {
2325 } ,
2426 concat : {
2527 dist : {
26- src : [ '<banner:meta.modules>' , 'src/*/*.js' ] ,
27- dest : 'dist/ui-bootstrap -<%= pkg.version %>.js'
28+ src : [ '<banner:meta.modules>' ] ,
29+ dest : '<%= dist %>/<%= filename %> -<%= pkg.version %>.js'
2830 } ,
2931 dist_tpls : {
30- src : [ '<banner:meta.all>' , 'src/*/*.js' , ' <banner:meta.tplmodules>' , 'template/**/*.html.js '] ,
31- dest : 'dist/ui-bootstrap -tpls-<%= pkg.version %>.js'
32+ src : [ '<banner:meta.all>' , '<banner:meta.tplmodules>' ] ,
33+ dest : '<%= dist %>/<%= filename %> -tpls-<%= pkg.version %>.js'
3234 }
3335 } ,
3436 min : {
3537 dist :{
36- src :[ 'dist/ui-bootstrap -<%= pkg.version %>.js' ] ,
37- dest :'dist/ui-bootstrap -<%= pkg.version %>.min.js'
38+ src :[ '<%= dist %>/<%= filename %> -<%= pkg.version %>.js' ] ,
39+ dest :'<%= dist %>/<%= filename %> -<%= pkg.version %>.min.js'
3840 } ,
3941 dist_tpls :{
40- src :[ 'dist/ui-bootstrap -tpls-<%= pkg.version %>.js' ] ,
41- dest :'dist/ui-bootstrap -tpls-<%= pkg.version %>.min.js'
42+ src :[ '<%= dist %>/<%= filename %> -tpls-<%= pkg.version %>.js' ] ,
43+ dest :'<%= dist %>/<%= filename %> -tpls-<%= pkg.version %>.min.js'
4244 }
4345 } ,
4446 html2js : {
@@ -60,24 +62,90 @@ module.exports = function(grunt) {
6062
6163 //register before and after test tasks so we've don't have to change cli options on the goole's CI server
6264 grunt . registerTask ( 'before-test' , 'lint html2js' ) ;
63- grunt . registerTask ( 'after-test' , 'find-modules find-templates concat min site' ) ;
65+ grunt . registerTask ( 'after-test' , 'find-modules build site' ) ;
6466
6567 // Default task.
6668 grunt . registerTask ( 'default' , 'before-test test after-test' ) ;
6769
68- //Common ui.bootstrap module containing all modules
69- grunt . registerTask ( 'find-modules' , 'Generate ui.bootstrap module depending on all existing directives' , function ( ) {
70- var modules = grunt . file . expandDirs ( 'src/*' ) . map ( function ( dir ) {
71- return '"ui.bootstrap.' + dir . split ( "/" ) [ 1 ] + '"' ;
70+ //Common ui.bootstrap module containing all modules for src and templates
71+ //findModule: Adds a given module to config
72+ function findModule ( name ) {
73+ function enquote ( str ) {
74+ return '"' + str + '"' ;
75+ }
76+ var tplModules = grunt . config ( 'tplModules' ) ;
77+ var srcModules = grunt . config ( 'srcModules' ) ;
78+
79+ grunt . file . expand ( 'template/' + name + '/*.html' ) . map ( function ( file ) {
80+ tplModules . push ( enquote ( file ) ) ;
81+ } ) ;
82+ grunt . file . expand ( 'src/' + name + '/*.js' ) . forEach ( function ( file ) {
83+ srcModules . push ( enquote ( 'ui.bootstrap.' + name ) ) ;
84+ } ) ;
85+
86+ grunt . config ( 'tplModules' , tplModules ) ;
87+ grunt . config ( 'srcModules' , srcModules ) ;
88+ }
89+ grunt . registerTask ( 'find-modules' , 'Generate ui.bootstrap and template modules depending on all existing directives' , function ( ) {
90+ grunt . file . expandDirs ( 'src/*' ) . forEach ( function ( dir ) {
91+ findModule ( dir . split ( '/' ) [ 1 ] ) ;
7292 } ) ;
73- grunt . config ( 'modules' , modules ) ;
7493 } ) ;
7594
76- grunt . registerTask ( 'find-templates' , 'Generate template modules depending on all existing directives' , function ( ) {
77- var tplModules = grunt . file . expand ( 'template/**/*.html' ) . map ( function ( file ) {
78- return '"' + file + '"' ;
95+ grunt . registerTask ( 'dist' , 'Override dist directory' , function ( ) {
96+ var dir = this . args [ 0 ] ;
97+ if ( dir ) { grunt . config ( 'dist' , dir ) ; }
98+ } ) ;
99+
100+ function dependenciesForModule ( name ) {
101+ var deps = [ ] ;
102+ grunt . file . expand ( 'src/' + name + '/*.js' )
103+ . map ( grunt . file . read )
104+ . forEach ( function ( contents ) {
105+ //Strategy: find where module is declared,
106+ //and from there get everything inside the [] and split them by comma
107+ var moduleDeclIndex = contents . indexOf ( 'angular.module(' ) ;
108+ var depArrayStart = contents . indexOf ( '[' , moduleDeclIndex ) ;
109+ var depArrayEnd = contents . indexOf ( ']' , depArrayStart ) ;
110+ var dependencies = contents . substring ( depArrayStart + 1 , depArrayEnd ) ;
111+ dependencies . split ( ',' ) . forEach ( function ( dep ) {
112+ if ( dep . indexOf ( 'ui.bootstrap.' ) > - 1 ) {
113+ var depName = dep . trim ( ) . replace ( 'ui.bootstrap.' , '' ) . replace ( / [ ' " ] / g, '' ) ;
114+ if ( deps . indexOf ( depName ) < 0 ) {
115+ deps . push ( depName ) ;
116+ //Get dependencies for this new dependency
117+ deps = deps . concat ( dependenciesForModule ( depName ) ) ;
118+ }
119+ }
120+ } ) ;
79121 } ) ;
80- grunt . config ( 'tplModules' , tplModules ) ;
122+ return deps ;
123+ }
124+ grunt . registerTask ( 'build' , 'Create bootstrap build files' , function ( ) {
125+ var srcFiles = [ ] , tplFiles = [ ] ;
126+ if ( this . args . length ) {
127+ var modules = [ ] . concat ( this . args ) ;
128+ //Find dependencies
129+ this . args . forEach ( function ( name ) {
130+ modules = modules . concat ( dependenciesForModule ( name ) ) ;
131+ } ) ;
132+ srcFiles = modules . map ( function ( name ) {
133+ return 'src/' + name + '/*.js' ;
134+ } ) ;
135+ tplFiles = modules . map ( function ( name ) {
136+ grunt . file . expand ( 'template/' + name + '/*.html' ) . forEach ( html2js ) ;
137+ return 'template/' + name + '/*.html.js' ;
138+ } ) ;
139+ grunt . config ( 'filename' , grunt . config ( 'filename' ) + '-custom' ) ;
140+ } else {
141+ srcFiles = [ 'src/*/*.js' ] ;
142+ tplFiles = [ 'template/*/*.html.js' ] ;
143+ }
144+ grunt . config ( 'concat.dist.src' ,
145+ grunt . config ( 'concat.dist.src' ) . concat ( srcFiles ) ) ;
146+ grunt . config ( 'concat.dist_tpls.src' ,
147+ grunt . config ( 'concat.dist_tpls.src' ) . concat ( srcFiles ) . concat ( tplFiles ) ) ;
148+ grunt . task . run ( 'concat min' ) ;
81149 } ) ;
82150
83151 grunt . registerTask ( 'site' , 'Create grunt demo site from every module\'s files' , function ( ) {
@@ -96,7 +164,6 @@ module.exports = function(grunt) {
96164 }
97165
98166 var modules = grunt . file . expandDirs ( 'src/*' ) . map ( function ( dir ) {
99-
100167 var moduleName = dir . split ( "/" ) [ 1 ] ;
101168 if ( fs . existsSync ( dir + "docs" ) ) {
102169 return {
@@ -136,22 +203,21 @@ module.exports = function(grunt) {
136203 } ) ;
137204
138205 //Html templates to $templateCache for tests
206+ var TPL = 'angular.module("<%= file %>", []).run(["$templateCache", function($templateCache){\n' +
207+ ' $templateCache.put("<%= file %>",\n "<%= content %>");\n' +
208+ '}]);\n' ;
209+ function escapeContent ( content ) {
210+ return content . replace ( / " / g, '\\"' ) . replace ( / \n / g, '" +\n "' ) . replace ( / \r / g, '' ) ;
211+ }
212+ function html2js ( template ) {
213+ grunt . file . write ( template + ".js" , grunt . template . process ( TPL , {
214+ file : template ,
215+ content : escapeContent ( grunt . file . read ( template ) )
216+ } ) ) ;
217+ }
139218 grunt . registerMultiTask ( 'html2js' , 'Generate js versions of html template' , function ( ) {
140- //Put templates on ng's run function so they are global
141- var TPL = 'angular.module("<%= file %>", []).run(["$templateCache", function($templateCache){\n' +
142- ' $templateCache.put("<%= file %>",\n "<%= content %>");\n' +
143- '}]);\n' ;
144219 var files = grunt . _watch_changed_files || grunt . file . expand ( this . data ) ;
145-
146- function escapeContent ( content ) {
147- return content . replace ( / " / g, '\\"' ) . replace ( / \n / g, '" +\n "' ) . replace ( / \r / g, '' ) ;
148- }
149- files . forEach ( function ( file ) {
150- grunt . file . write ( file + ".js" , grunt . template . process ( TPL , {
151- file : file ,
152- content : escapeContent ( grunt . file . read ( file ) )
153- } ) ) ;
154- } ) ;
220+ files . forEach ( html2js ) ;
155221 } ) ;
156222
157223 // Testacular configuration
@@ -198,4 +264,6 @@ module.exports = function(grunt) {
198264 var options = [ '--no-single-run' , '--auto-watch' ] . concat ( this . args ) ;
199265 runTestacular ( 'start' , options ) ;
200266 } ) ;
201- } ;
267+
268+ return grunt ;
269+ } ;
0 commit comments