Skip to content

Commit d1fa37b

Browse files
committed
demo(*): Add dist and build task, allowing custom builds
2 parents bf49453 + 912650b commit d1fa37b

File tree

1 file changed

+106
-38
lines changed

1 file changed

+106
-38
lines changed

grunt.js

Lines changed: 106 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)