Skip to content
This repository was archived by the owner on May 29, 2019. It is now read-only.

Commit 529d4e4

Browse files
committed
chore(build): add handling for css files
1 parent d9ee27b commit 529d4e4

File tree

3 files changed

+100
-8
lines changed

3 files changed

+100
-8
lines changed

Gruntfile.js

Lines changed: 63 additions & 3 deletions
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'
@@ -246,6 +252,7 @@ module.exports = function(grunt) {
246252
moduleName: enquote('ui.bootstrap.' + name),
247253
displayName: ucwords(breakup(name, ' ')),
248254
srcFiles: grunt.file.expand('src/'+name+'/*.js'),
255+
cssFiles: grunt.file.expand('src/'+name+'/*.css'),
249256
tplFiles: grunt.file.expand('template/'+name+'/*.html'),
250257
tpljsFiles: grunt.file.expand('template/'+name+'/*.html.js'),
251258
tplModules: grunt.file.expand('template/'+name+'/*.html').map(enquote),
@@ -259,6 +266,17 @@ module.exports = function(grunt) {
259266
.map(grunt.file.read).join('\n')
260267
}
261268
};
269+
270+
var styles = {
271+
css: [],
272+
js: []
273+
};
274+
module.cssFiles.forEach(processCSS.bind(null, styles, true));
275+
if (styles.css.length) {
276+
module.css = styles.css.join('\n');
277+
module.cssJs = styles.js.join('\n');
278+
}
279+
262280
module.dependencies.forEach(findModule);
263281
grunt.config('modules', grunt.config('modules').concat(module));
264282
}
@@ -322,6 +340,17 @@ module.exports = function(grunt) {
322340
})
323341
);
324342

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

376405
genRawFilesJs(grunt, jsFilename, _.flatten(grunt.config('concat.dist_tpls.src')),
377-
grunt.config('meta.banner'));
406+
grunt.config('meta.banner'), grunt.config('meta.cssFileBanner'));
378407
});
379408

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

misc/demo/assets/app.js

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,38 @@ var SelectModulesCtrl = function($scope, $modalInstance, modules, buildFilesServ
156156

157157
var jsTplFile = createWithTplFile(srcModuleFullNames, srcJsContent, tplModuleNames, tplJsContent);
158158

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

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

misc/raw-files-generator.js

Lines changed: 6 additions & 1 deletion
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)