Skip to content

Commit d03543e

Browse files
committed
chore(build): add handling for css files
1 parent 8e4860f commit d03543e

File tree

3 files changed

+100
-8
lines changed

3 files changed

+100
-8
lines changed

Gruntfile.js

+63-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/* jshint node: true */
22
var markdown = require('node-markdown').Markdown;
3+
var fs = require('fs');
34

45
module.exports = function(grunt) {
56

@@ -29,6 +30,9 @@ module.exports = function(grunt) {
2930
modules: 'angular.module("ui.bootstrap", [<%= srcModules %>]);',
3031
tplmodules: 'angular.module("ui.bootstrap.tpls", [<%= tplModules %>]);',
3132
all: 'angular.module("ui.bootstrap", ["ui.bootstrap.tpls", <%= srcModules %>]);',
33+
cssInclude: '',
34+
cssFileBanner: '/* Include this file in your html if you are using the CSP mode. */\n\n',
35+
cssFileDest: '<%= dist %>/<%= filename %>-<%= pkg.version %>-csp.css',
3236
banner: ['/*',
3337
' * <%= pkg.name %>',
3438
' * <%= pkg.homepage %>\n',
@@ -54,14 +58,16 @@ module.exports = function(grunt) {
5458
concat: {
5559
dist: {
5660
options: {
57-
banner: '<%= meta.banner %><%= meta.modules %>\n'
61+
banner: '<%= meta.banner %><%= meta.modules %>\n',
62+
footer: '<%= meta.cssInclude %>'
5863
},
5964
src: [], //src filled in by build task
6065
dest: '<%= dist %>/<%= filename %>-<%= pkg.version %>.js'
6166
},
6267
dist_tpls: {
6368
options: {
64-
banner: '<%= meta.banner %><%= meta.all %>\n<%= meta.tplmodules %>\n'
69+
banner: '<%= meta.banner %><%= meta.all %>\n<%= meta.tplmodules %>\n',
70+
footer: '<%= meta.cssInclude %>'
6571
},
6672
src: [], //src filled in by build task
6773
dest: '<%= dist %>/<%= filename %>-tpls-<%= pkg.version %>.js'
@@ -245,6 +251,7 @@ module.exports = function(grunt) {
245251
moduleName: enquote('ui.bootstrap.' + name),
246252
displayName: ucwords(breakup(name, ' ')),
247253
srcFiles: grunt.file.expand('src/'+name+'/*.js'),
254+
cssFiles: grunt.file.expand('src/'+name+'/*.css'),
248255
tplFiles: grunt.file.expand('template/'+name+'/*.html'),
249256
tpljsFiles: grunt.file.expand('template/'+name+'/*.html.js'),
250257
tplModules: grunt.file.expand('template/'+name+'/*.html').map(enquote),
@@ -258,6 +265,17 @@ module.exports = function(grunt) {
258265
.map(grunt.file.read).join('\n')
259266
}
260267
};
268+
269+
var styles = {
270+
css: [],
271+
js: []
272+
};
273+
module.cssFiles.forEach(processCSS.bind(null, styles, true));
274+
if (styles.css.length) {
275+
module.css = styles.css.join('\n');
276+
module.cssJs = styles.js.join('\n');
277+
}
278+
261279
module.dependencies.forEach(findModule);
262280
grunt.config('modules', grunt.config('modules').concat(module));
263281
}
@@ -321,6 +339,17 @@ module.exports = function(grunt) {
321339
})
322340
);
323341

342+
var cssStrings = _.flatten(_.compact(_.pluck(modules, 'css')));
343+
var cssJsStrings = _.flatten(_.compact(_.pluck(modules, 'cssJs')));
344+
if (cssStrings.length) {
345+
grunt.config('meta.cssInclude', cssJsStrings.join('\n'));
346+
347+
grunt.file.write(grunt.config('meta.cssFileDest'), grunt.config('meta.cssFileBanner') +
348+
cssStrings.join('\n'));
349+
350+
grunt.log.writeln('File ' + grunt.config('meta.cssFileDest') + ' created');
351+
}
352+
324353
var moduleFileMapping = _.clone(modules, true);
325354
moduleFileMapping.forEach(function (module) {
326355
delete module.docs;
@@ -373,9 +402,40 @@ module.exports = function(grunt) {
373402
var genRawFilesJs = require('./misc/raw-files-generator');
374403

375404
genRawFilesJs(grunt, jsFilename, _.flatten(grunt.config('concat.dist_tpls.src')),
376-
grunt.config('meta.banner'));
405+
grunt.config('meta.banner'), grunt.config('meta.cssFileBanner'));
377406
});
378407

408+
/**
409+
* Logic from AngularJS
410+
* https://github.com/angular/angular.js/blob/36831eccd1da37c089f2141a2c073a6db69f3e1d/lib/grunt/utils.js#L121-L145
411+
*/
412+
function processCSS(state, minify, file) {
413+
/* jshint quotmark: false */
414+
var css = fs.readFileSync(file).toString(),
415+
js;
416+
state.css.push(css);
417+
418+
if(minify){
419+
css = css
420+
.replace(/\r?\n/g, '')
421+
.replace(/\/\*.*?\*\//g, '')
422+
.replace(/:\s+/g, ':')
423+
.replace(/\s*\{\s*/g, '{')
424+
.replace(/\s*\}\s*/g, '}')
425+
.replace(/\s*\,\s*/g, ',')
426+
.replace(/\s*\;\s*/g, ';');
427+
}
428+
//escape for js
429+
css = css
430+
.replace(/\\/g, '\\\\')
431+
.replace(/'/g, "\\'")
432+
.replace(/\r?\n/g, '\\n');
433+
js = "!angular.$$csp() && angular.element(document).find('head').prepend('<style type=\"text/css\">" + css + "</style>');";
434+
state.js.push(js);
435+
436+
return state;
437+
}
438+
379439
function setVersion(type, suffix) {
380440
var file = 'package.json';
381441
var VERSION_REGEX = /([\'|\"]version[\'|\"][ ]*:[ ]*[\'|\"])([\d|.]*)(-\w+)*([\'|\"])/;

misc/demo/assets/app.js

+31-4
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,38 @@ function SelectModulesCtrl($scope, $modalInstance, modules, buildFilesService) {
154154

155155
var jsTplFile = createWithTplFile(srcModuleFullNames, srcJsContent, tplModuleNames, tplJsContent);
156156

157+
var cssContent = srcModules
158+
.map(function (module) {
159+
return module.css;
160+
})
161+
.filter(function (css) {
162+
return css;
163+
})
164+
.join('\n')
165+
;
166+
167+
var cssJsContent = srcModules
168+
.map(function (module) {
169+
return module.cssJs;
170+
})
171+
.filter(function (cssJs) {
172+
return cssJs;
173+
})
174+
.join('\n')
175+
;
176+
177+
var footer = cssJsContent;
178+
157179
var zip = new JSZip();
158-
zip.file('ui-bootstrap-custom-' + version + '.js', rawFiles.banner + jsFile);
159-
zip.file('ui-bootstrap-custom-' + version + '.min.js', rawFiles.banner + uglify(jsFile));
160-
zip.file('ui-bootstrap-custom-tpls-' + version + '.js', rawFiles.banner + jsTplFile);
161-
zip.file('ui-bootstrap-custom-tpls-' + version + '.min.js', rawFiles.banner + uglify(jsTplFile));
180+
zip.file('ui-bootstrap-custom-' + version + '.js', rawFiles.banner + jsFile + footer);
181+
zip.file('ui-bootstrap-custom-' + version + '.min.js', rawFiles.banner + uglify(jsFile + footer));
182+
zip.file('ui-bootstrap-custom-tpls-' + version + '.js', rawFiles.banner + jsTplFile + footer);
183+
zip.file('ui-bootstrap-custom-tpls-' + version + '.min.js', rawFiles.banner + uglify(jsTplFile + footer));
184+
zip.file('ui-bootstrap-custom-tpls-' + version + '.min.js', rawFiles.banner + uglify(jsTplFile + footer));
185+
186+
if (cssContent) {
187+
zip.file('ui-bootstrap-custom-' + version + '-csp.css', rawFiles.cssBanner + cssContent);
188+
}
162189

163190
saveAs(zip.generate({type: 'blob'}), 'ui-bootstrap-custom-build.zip');
164191
}

misc/raw-files-generator.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,18 @@ function getFiles(filePaths) {
2020
return files;
2121
}
2222

23-
module.exports = function generateRawFilesJs(grunt, jsFilename, files, banner) {
23+
module.exports = function generateRawFilesJs(grunt, jsFilename, files, banner, cssBanner) {
2424
if (!banner) {
2525
banner = '';
2626
}
2727

28+
if (!cssBanner) {
29+
cssBanner = '';
30+
}
31+
2832
var filesJsObject = {
2933
banner: banner,
34+
cssBanner: cssBanner,
3035
files: getFiles(files),
3136
};
3237

0 commit comments

Comments
 (0)