You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
723 lines
16 KiB
723 lines
16 KiB
module.exports = function(grunt) {
|
|
|
|
var
|
|
|
|
defaultTasks = [
|
|
// run grunt watch
|
|
'watch'
|
|
],
|
|
|
|
watchTasks = [
|
|
// compiles less to docs
|
|
'less:buildDocsCSS',
|
|
|
|
// auto prefix doc files
|
|
'autoprefixer:prefixFile',
|
|
|
|
// copies assets and js over to docs
|
|
'copy:srcToDocs',
|
|
|
|
// copies examples over to docs
|
|
'copy:examplesToDocs',
|
|
|
|
// create concatenated css release
|
|
'concat:createDocsCSSPackage',
|
|
|
|
// create concatenated js release
|
|
'concat:createDocsJSPackage'
|
|
],
|
|
|
|
testWatchTasks = [
|
|
'clear',
|
|
|
|
'karma:watch:run'
|
|
],
|
|
|
|
testTasks = [
|
|
// compiles less to docs so phantomjs can read
|
|
'less:buildTestCSS',
|
|
|
|
// test components
|
|
'karma:travis'
|
|
],
|
|
|
|
resetTasks = [
|
|
// clean build directory
|
|
'clean:build',
|
|
|
|
// cleans previous generated release
|
|
'clean:release'
|
|
],
|
|
|
|
releaseTasks = [
|
|
// clean build directory
|
|
'clean:build',
|
|
|
|
// copies assets and js over to build dir
|
|
'copy:srcToBuild',
|
|
|
|
// compiles less
|
|
'less:buildCSS',
|
|
|
|
// auto prefix docs files
|
|
'autoprefixer:prefixDocs',
|
|
|
|
// auto prefix build files
|
|
'autoprefixer:prefixBuild',
|
|
|
|
// creates minified js of each file
|
|
'uglify:minifyJS',
|
|
|
|
// creates minified css of each file
|
|
'cssmin:minifyCSS',
|
|
|
|
// create concatenated css release
|
|
'concat:createCSSPackage',
|
|
|
|
// create concatenated js release
|
|
'concat:createJSPackage',
|
|
|
|
// creates release js of all together
|
|
'uglify:createMinJSPackage',
|
|
|
|
// creates custom license in header
|
|
'cssmin:createMinCSSPackage',
|
|
|
|
// create npm package
|
|
'copy:npm',
|
|
|
|
// replace $.fn.xyz with module.exports and require('jquery')
|
|
'replace:npm',
|
|
|
|
// cleans previous generated release
|
|
'clean:release'
|
|
|
|
],
|
|
|
|
rtlTasks = [
|
|
// copies assets to rtl
|
|
'copy:buildToRTL',
|
|
|
|
// create rtl release
|
|
'rtlcss:rtl'
|
|
],
|
|
|
|
docTasks = [
|
|
|
|
// copies examples over to docs
|
|
'copy:examplesToDocs',
|
|
|
|
// creates release zip
|
|
'compress:everything',
|
|
|
|
// copies files over to docs
|
|
'copy:buildToDocs',
|
|
|
|
// generate code docs
|
|
'docco:generate',
|
|
|
|
// copies spec files over to docs
|
|
'copy:specToDocs'
|
|
],
|
|
|
|
buildTasks = releaseTasks.concat(rtlTasks).concat(docTasks),
|
|
testWatchTasks = testTasks.concat(watchTasks),
|
|
|
|
setWatchTests = function(action, filePath) {
|
|
var
|
|
karmaFiles = grunt.config('karma.watch.files'),
|
|
isJavascript = (filePath.search('.js') !== -1),
|
|
isModule = (filePath.search('modules/') !== -1),
|
|
isSpec = (filePath.search('.spec') !== -1),
|
|
specFile = (isSpec)
|
|
? filePath
|
|
: filePath
|
|
.replace('src/', 'test/')
|
|
.replace('.js', '.spec.js')
|
|
;
|
|
if(isJavascript && (isSpec || isModule) ) {
|
|
karmaFiles.pop();
|
|
karmaFiles.push(specFile);
|
|
}
|
|
},
|
|
|
|
setWatchFiles = function(action, filePath) {
|
|
var
|
|
buildPath = filePath.replace('src/', 'docs/build/uncompressed/').replace('less', 'css')
|
|
;
|
|
if(filePath.search('.less') !== -1) {
|
|
grunt.config('less.buildDocsCSS.src', filePath);
|
|
grunt.config('less.buildDocsCSS.dest', buildPath);
|
|
grunt.config('autoprefixer.prefixFile.src', buildPath);
|
|
}
|
|
else {
|
|
grunt.config('less.buildDocsCSS.src', 'non/existant/path');
|
|
grunt.config('less.buildDocsCSS.dest', 'non/existant/path');
|
|
grunt.config('autoprefixer.prefixFile.src', 'non/existant/path');
|
|
}
|
|
},
|
|
|
|
// this allows filenames with multiple extensions to be preserved
|
|
preserveFileExtensions = function(folder, filename) {
|
|
return folder + filename.substring(0, filename.lastIndexOf('.') ) + '.css';
|
|
},
|
|
preserveMinFileExtensions = function(folder, filename) {
|
|
return folder + filename.substring(0, filename.lastIndexOf('.') ) + '.min.css';
|
|
},
|
|
|
|
config
|
|
;
|
|
|
|
config = {
|
|
|
|
package : grunt.file.readJSON('package.json'),
|
|
|
|
/*******************************
|
|
Watch
|
|
*******************************/
|
|
|
|
// watches for changes in a source folder
|
|
watch: {
|
|
options: {
|
|
spawn: false
|
|
},
|
|
scripts: {
|
|
files: [
|
|
'test/**/*.js',
|
|
'src/**/*.js'
|
|
],
|
|
tasks : watchTasks
|
|
},
|
|
src: {
|
|
files: [
|
|
'build/examples/**/*',
|
|
'src/**/*.less',
|
|
'src/**/*.js'
|
|
],
|
|
tasks : watchTasks
|
|
}
|
|
},
|
|
|
|
/*******************************
|
|
Test
|
|
*******************************/
|
|
|
|
clear: {
|
|
terminal: {
|
|
|
|
}
|
|
},
|
|
|
|
karma: {
|
|
watch: {
|
|
configFile : 'karma.conf.js',
|
|
background : true
|
|
},
|
|
travis: {
|
|
configFile : 'karma.conf.js',
|
|
singleRun : true
|
|
}
|
|
},
|
|
|
|
/*******************************
|
|
Build
|
|
*******************************/
|
|
autoprefixer: {
|
|
options: {
|
|
browsers: [
|
|
'last 2 version',
|
|
'> 1%',
|
|
'opera 12.1',
|
|
'ff >= 10',
|
|
'safari 6',
|
|
'ie 9',
|
|
'bb 10',
|
|
'android 3'
|
|
]
|
|
},
|
|
prefixBuild: {
|
|
expand : true,
|
|
cwd : 'build/',
|
|
dest : 'build/',
|
|
src : [
|
|
'**/*.less',
|
|
'**/*.css',
|
|
]
|
|
},
|
|
prefixDocs: {
|
|
expand : true,
|
|
cwd : 'docs/build/',
|
|
dest : 'docs/build/',
|
|
src : [
|
|
'**/*.less',
|
|
'**/*.css',
|
|
]
|
|
},
|
|
prefixFile: {
|
|
src : 'docs/build/**/*.css'
|
|
}
|
|
},
|
|
|
|
clean: {
|
|
options: {
|
|
force: true
|
|
},
|
|
build : [
|
|
'build/less',
|
|
'build/minified',
|
|
'build/packaged',
|
|
'build/uncompressed'
|
|
],
|
|
release : [
|
|
'docs/build',
|
|
'rtl'
|
|
]
|
|
},
|
|
|
|
docco: {
|
|
generate: {
|
|
options: {
|
|
css : 'spec/assets/docco.css',
|
|
output : 'spec/docs/'
|
|
},
|
|
files: [
|
|
{
|
|
expand : true,
|
|
cwd : 'spec/',
|
|
src : [
|
|
'**.commented.js'
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
|
|
rtlcss: {
|
|
rtl: {
|
|
expand : true,
|
|
cwd : 'build/',
|
|
src : [
|
|
'**/*.less',
|
|
'**/*.css',
|
|
],
|
|
dest : 'rtl'
|
|
},
|
|
},
|
|
|
|
less: {
|
|
|
|
options: {
|
|
paths : ['src'],
|
|
compress : false,
|
|
optimization : 2
|
|
},
|
|
|
|
// optimized for watch, src is built on watch task using callbacks
|
|
buildDocsCSS: {
|
|
src : 'src',
|
|
dest : 'docs/build/uncompressed/',
|
|
rename : preserveFileExtensions
|
|
},
|
|
|
|
buildTestCSS: {
|
|
expand : true,
|
|
cwd : 'src',
|
|
src : [
|
|
'**/*.less'
|
|
],
|
|
dest : 'docs/build/uncompressed/',
|
|
rename: preserveFileExtensions
|
|
},
|
|
|
|
buildCSS: {
|
|
expand : true,
|
|
cwd : 'src',
|
|
src : [
|
|
'**/*.less'
|
|
],
|
|
dest : 'build/uncompressed/',
|
|
rename: preserveFileExtensions
|
|
}
|
|
},
|
|
|
|
copy: {
|
|
|
|
srcToDocs: {
|
|
|
|
files: [
|
|
// exact copy for less
|
|
{
|
|
expand : true,
|
|
cwd : 'src/**/*.less',
|
|
src : [
|
|
'**/*'
|
|
],
|
|
dest : 'docs/build/less'
|
|
},
|
|
// copy everything but less files for uncompressed release
|
|
{
|
|
expand : true,
|
|
cwd : 'src/',
|
|
src : [
|
|
'**/*.js',
|
|
'images/*',
|
|
'fonts/*'
|
|
],
|
|
dest : 'docs/build/uncompressed'
|
|
},
|
|
// copy assets only for minified version
|
|
{
|
|
expand : true,
|
|
cwd : 'src/',
|
|
src : [
|
|
'images/*',
|
|
'fonts/*'
|
|
],
|
|
dest : 'docs/build/minified'
|
|
},
|
|
|
|
// copy assets only for packaged version
|
|
{
|
|
expand : true,
|
|
cwd : 'src/',
|
|
src : [
|
|
'images/*',
|
|
'fonts/*'
|
|
],
|
|
dest : 'docs/build/packaged'
|
|
}
|
|
]
|
|
},
|
|
|
|
srcToBuild: {
|
|
|
|
files: [
|
|
// exact copy for less
|
|
{
|
|
expand : true,
|
|
cwd : 'src/',
|
|
src : [
|
|
'**/*'
|
|
],
|
|
dest : 'build/less'
|
|
},
|
|
// copy everything but less files for uncompressed release
|
|
{
|
|
expand : true,
|
|
cwd : 'src/',
|
|
src : [
|
|
'**/*.js',
|
|
'images/*',
|
|
'fonts/*'
|
|
],
|
|
dest : 'build/uncompressed'
|
|
},
|
|
// copy assets only for minified version
|
|
{
|
|
expand : true,
|
|
cwd : 'src/',
|
|
src : [
|
|
'images/*',
|
|
'fonts/*'
|
|
],
|
|
dest : 'build/minified'
|
|
},
|
|
|
|
// copy assets only for packaged version
|
|
{
|
|
expand : true,
|
|
cwd : 'src/',
|
|
src : [
|
|
'images/*',
|
|
'fonts/*'
|
|
],
|
|
dest : 'build/packaged'
|
|
}
|
|
]
|
|
},
|
|
|
|
|
|
npm: {
|
|
files: [
|
|
{
|
|
expand : true,
|
|
cwd : 'build/uncompressed',
|
|
src : [
|
|
'**/*'
|
|
],
|
|
dest: 'npm'
|
|
},
|
|
{
|
|
src: 'package.json',
|
|
dest: 'npm/package.json'
|
|
}
|
|
]
|
|
},
|
|
|
|
// create new rtl assets
|
|
buildToRTL: {
|
|
files: [
|
|
{
|
|
expand : true,
|
|
cwd : 'build/',
|
|
src : [
|
|
'**'
|
|
],
|
|
dest : 'rtl'
|
|
}
|
|
]
|
|
},
|
|
|
|
// make library available in docs
|
|
buildToDocs: {
|
|
files: [
|
|
{
|
|
expand : true,
|
|
cwd : 'build/',
|
|
src : [
|
|
'**'
|
|
],
|
|
dest : 'docs/build/'
|
|
}
|
|
]
|
|
},
|
|
|
|
// copy spec files to docs
|
|
specToDocs: {
|
|
files: [
|
|
{
|
|
expand : true,
|
|
cwd : 'spec',
|
|
src : [
|
|
'**'
|
|
],
|
|
dest : 'docs/spec/'
|
|
}
|
|
]
|
|
},
|
|
|
|
// copy spec files to docs
|
|
examplesToDocs: {
|
|
files: [
|
|
{
|
|
expand : true,
|
|
cwd : 'build/examples',
|
|
src : [
|
|
'**'
|
|
],
|
|
dest : 'docs/build/examples/'
|
|
}
|
|
]
|
|
}
|
|
|
|
},
|
|
|
|
|
|
compress: {
|
|
options: {
|
|
archive: 'docs/build/semantic.zip'
|
|
},
|
|
everything: {
|
|
files: [
|
|
{
|
|
expand : true,
|
|
cwd : 'build/',
|
|
src : [
|
|
'**'
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
|
|
concat: {
|
|
options: {
|
|
},
|
|
createCSSPackage: {
|
|
src: ['build/uncompressed/**/*.css'],
|
|
dest: 'build/packaged/css/semantic.css'
|
|
},
|
|
createJSPackage: {
|
|
src: ['build/uncompressed/**/*.js'],
|
|
dest: 'build/packaged/javascript/semantic.js'
|
|
},
|
|
createDocsCSSPackage: {
|
|
src: ['docs/build/uncompressed/**/*.css'],
|
|
dest: 'docs/build/packaged/css/semantic.css'
|
|
},
|
|
createDocsJSPackage: {
|
|
src: ['docs/build/uncompressed/**/*.js'],
|
|
dest: 'docs/build/packaged/javascript/semantic.js'
|
|
},
|
|
},
|
|
|
|
cssmin: {
|
|
options : {
|
|
keepSpecialComments: 0,
|
|
report: 'min',
|
|
banner : '' +
|
|
'/*\n' +
|
|
'* # <%= package.title %>\n' +
|
|
'* Version: <%= package.version %>\n' +
|
|
'* http://github.com/jlukic/semantic-ui\n' +
|
|
'*\n' +
|
|
'*\n' +
|
|
'* Copyright <%= grunt.template.today("yyyy") %> Contributors\n' +
|
|
'* Released under the MIT license\n' +
|
|
'* http://opensource.org/licenses/MIT\n' +
|
|
'*\n' +
|
|
'* Released: <%= grunt.template.today("mm/dd/yyyy") %>\n' +
|
|
'*/\n'
|
|
},
|
|
|
|
// copy minified css to minified release
|
|
minifyCSS: {
|
|
expand : true,
|
|
cwd : 'build/uncompressed',
|
|
src : [
|
|
'**/*.css'
|
|
],
|
|
dest : 'build/minified/',
|
|
rename: preserveMinFileExtensions
|
|
},
|
|
|
|
// add comment banner to css release
|
|
createMinCSSPackage: {
|
|
files: {
|
|
'build/packaged/css/semantic.min.css': [
|
|
'build/uncompressed/**/*.css'
|
|
]
|
|
}
|
|
}
|
|
},
|
|
|
|
replace: {
|
|
npm: {
|
|
options: {
|
|
preserveOrder: true,
|
|
patterns: [
|
|
{
|
|
match: /\$\.fn\.\w+\s*=\s*function\(parameters\)\s*{/g,
|
|
replacement: 'module.exports = function(parameters) {\n var _module = module;\n'
|
|
},
|
|
{
|
|
match: /\$\.fn\.\w+\s*=\s*function\(fields, parameters\)\s*{/g,
|
|
replacement: 'module.exports = function(fields, parameters) {\n var _module = module;\n'
|
|
},
|
|
{
|
|
match: /\$\.fn\.\w+\.settings\s*=/g,
|
|
replacement: 'module.exports.settings ='
|
|
},
|
|
{
|
|
match: /\$\.fn\.\w+\.settings/g,
|
|
replacement: '_module.exports.settings'
|
|
},
|
|
{
|
|
match: /jQuery/g,
|
|
replacement: 'require("jquery")'
|
|
}
|
|
]
|
|
},
|
|
files: [
|
|
{
|
|
expand : true,
|
|
src : '**/*.js',
|
|
cwd : 'build/uncompressed',
|
|
dest : 'npm'
|
|
}
|
|
]
|
|
}
|
|
},
|
|
|
|
uglify: {
|
|
|
|
minifyJS: {
|
|
expand : true,
|
|
cwd : 'build/uncompressed',
|
|
src : [
|
|
'**/*.js'
|
|
],
|
|
dest : 'build/minified',
|
|
ext : '.min.js',
|
|
banner : '' +
|
|
'/*' +
|
|
'* # <%= package.title %>\n' +
|
|
'* Version: <%= package.version %>\n' +
|
|
'* http://github.com/jlukic/semantic-ui\n' +
|
|
'*\n' +
|
|
'*\n' +
|
|
'* Copyright <%= grunt.template.today("yyyy") %> Contributors\n' +
|
|
'* Released under the MIT license\n' +
|
|
'* http://opensource.org/licenses/MIT\n' +
|
|
'*\n' +
|
|
'* Release Date: <%= grunt.template.today("mm/dd/yyyy") %>\n' +
|
|
'*/\n'
|
|
},
|
|
|
|
createMinJSPackage: {
|
|
options: {
|
|
mangle : true,
|
|
compress : true,
|
|
banner : '' +
|
|
'/*' +
|
|
'* # <%= package.title %>\n' +
|
|
'* Version: <%= package.version %>\n' +
|
|
'* http://github.com/jlukic/semantic-ui\n' +
|
|
'*\n' +
|
|
'*\n' +
|
|
'* Copyright <%= grunt.template.today("yyyy") %> Contributors\n' +
|
|
'* Released under the MIT license\n' +
|
|
'* http://opensource.org/licenses/MIT\n' +
|
|
'*\n' +
|
|
'* Release Date: <%= grunt.template.today("mm/dd/yyyy") %>\n' +
|
|
'*/\n'
|
|
},
|
|
files: {
|
|
'build/packaged/javascript/semantic.min.js': [
|
|
'build/uncompressed/**/*.js'
|
|
]
|
|
}
|
|
}
|
|
},
|
|
|
|
coveralls: {
|
|
options: {
|
|
coverage_dir: 'coverage'
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
|
|
grunt.loadNpmTasks('grunt-contrib-clean');
|
|
grunt.loadNpmTasks('grunt-contrib-compress');
|
|
grunt.loadNpmTasks('grunt-contrib-concat');
|
|
grunt.loadNpmTasks('grunt-contrib-copy');
|
|
grunt.loadNpmTasks('grunt-contrib-cssmin');
|
|
grunt.loadNpmTasks('grunt-contrib-less');
|
|
grunt.loadNpmTasks('grunt-replace');
|
|
grunt.loadNpmTasks('grunt-contrib-uglify');
|
|
grunt.loadNpmTasks('grunt-contrib-watch');
|
|
|
|
grunt.loadNpmTasks('grunt-autoprefixer');
|
|
grunt.loadNpmTasks('grunt-docco-multi');
|
|
grunt.loadNpmTasks('grunt-rtlcss');
|
|
grunt.loadNpmTasks('grunt-clear');
|
|
grunt.loadNpmTasks('grunt-karma');
|
|
grunt.loadNpmTasks('grunt-karma-coveralls');
|
|
|
|
grunt.initConfig(config);
|
|
|
|
grunt.registerTask('default', defaultTasks);
|
|
grunt.registerTask('test', testTasks);
|
|
|
|
grunt.registerTask('release', releaseTasks);
|
|
grunt.registerTask('rtl', rtlTasks);
|
|
grunt.registerTask('docs', docTasks);
|
|
grunt.registerTask('build', buildTasks);
|
|
grunt.registerTask('reset', resetTasks);
|
|
|
|
// compiles only changed less files <https://npmjs.org/package/grunt-contrib-watch>
|
|
grunt.event.on('watch', setWatchFiles);
|
|
|
|
};
|