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.

629 lines
14 KiB

11 years ago
11 years ago
11 years ago
11 years ago
  1. module.exports = function(grunt) {
  2. var
  3. defaultTasks = [
  4. // run grunt watch
  5. 'watch'
  6. ],
  7. watchTasks = [
  8. // compiles less to docs
  9. 'less:buildDocsCSS',
  10. // auto prefix doc files
  11. 'autoprefixer:prefixFile',
  12. // copies assets and js over to docs
  13. 'copy:srcToDocs',
  14. // copies examples over to docs
  15. 'copy:examplesToDocs',
  16. // create concatenated css release
  17. 'concat:createDocsCSSPackage',
  18. // create concatenated js release
  19. 'concat:createDocsJSPackage'
  20. ],
  21. testWatchTasks = [
  22. 'clear',
  23. 'karma:watch:run'
  24. ],
  25. testTasks = [
  26. // compiles less to docs so phantomjs can read
  27. 'less:buildTestCSS',
  28. // test components
  29. 'karma:travis'
  30. ],
  31. releaseTasks = [
  32. // clean build directory
  33. 'clean:build',
  34. // copies assets and js over to build dir
  35. 'copy:srcToBuild',
  36. // compiles less
  37. 'less:buildCSS',
  38. // auto prefix docs files
  39. 'autoprefixer:prefixDocs',
  40. // auto prefix build files
  41. 'autoprefixer:prefixBuild',
  42. // creates minified js of each file
  43. 'uglify:minifyJS',
  44. // creates minified css of each file
  45. 'cssmin:minifyCSS',
  46. // create concatenated css release
  47. 'concat:createCSSPackage',
  48. // create concatenated js release
  49. 'concat:createJSPackage',
  50. // creates release js of all together
  51. 'uglify:createMinJSPackage',
  52. // creates custom license in header
  53. 'cssmin:createMinCSSPackage',
  54. // cleans previous generated release
  55. 'clean:release'
  56. ],
  57. rtlTasks = [
  58. // copies assets to rtl
  59. 'copy:buildToRTL',
  60. // create rtl release
  61. 'cssjanus:rtl'
  62. ],
  63. docTasks = [
  64. // copies examples over to docs
  65. 'copy:examplesToDocs',
  66. // creates release zip
  67. 'compress:everything',
  68. // copies files over to docs
  69. 'copy:buildToDocs',
  70. // generate code docs
  71. 'docco:generate',
  72. // copies spec files over to docs
  73. 'copy:specToDocs'
  74. ],
  75. buildTasks = releaseTasks.concat(rtlTasks).concat(docTasks),
  76. setWatchTests = function(action, filePath) {
  77. var
  78. karmaFiles = grunt.config('karma.watch.files'),
  79. isJavascript = (filePath.search('.js') !== -1),
  80. isModule = (filePath.search('modules/') !== -1),
  81. isSpec = (filePath.search('.spec') !== -1),
  82. specFile = (isSpec)
  83. ? filePath
  84. : filePath
  85. .replace('src/', 'test/')
  86. .replace('.js', '.spec.js')
  87. ;
  88. if(isJavascript && (isSpec || isModule) ) {
  89. karmaFiles.pop();
  90. karmaFiles.push(specFile);
  91. }
  92. },
  93. setWatchFiles = function(action, filePath) {
  94. var
  95. buildPath = filePath.replace('src/', 'docs/build/uncompressed/').replace('less', 'css')
  96. ;
  97. if(filePath.search('.less') !== -1) {
  98. grunt.config('less.buildDocsCSS.src', filePath);
  99. grunt.config('less.buildDocsCSS.dest', buildPath);
  100. grunt.config('autoprefixer.prefixFile.src', buildPath);
  101. }
  102. else {
  103. grunt.config('less.buildDocsCSS.src', 'non/existant/path');
  104. grunt.config('less.buildDocsCSS.dest', 'non/existant/path');
  105. grunt.config('autoprefixer.prefixFile.src', 'non/existant/path');
  106. }
  107. },
  108. // this allows filenames with multiple extensions to be preserved
  109. preserveFileExtensions = function(folder, filename) {
  110. return folder + filename.substring(0, filename.lastIndexOf('.') ) + '.css';
  111. },
  112. preserveMinFileExtensions = function(folder, filename) {
  113. return folder + filename.substring(0, filename.lastIndexOf('.') ) + '.min.css';
  114. },
  115. config
  116. ;
  117. config = {
  118. package : grunt.file.readJSON('package.json'),
  119. /*******************************
  120. Watch
  121. *******************************/
  122. // watches for changes in a source folder
  123. watch: {
  124. options: {
  125. spawn: false
  126. },
  127. scripts: {
  128. files: [
  129. 'test/**/*.js',
  130. 'src/**/*.js'
  131. ],
  132. tasks : testWatchTasks
  133. },
  134. src: {
  135. files: [
  136. 'build/examples/**/*',
  137. 'src/**/*.less',
  138. 'src/**/*.js'
  139. ],
  140. tasks : watchTasks
  141. }
  142. },
  143. /*******************************
  144. Test
  145. *******************************/
  146. clear: {
  147. terminal: {
  148. }
  149. },
  150. karma: {
  151. watch: {
  152. configFile : 'karma.conf.js',
  153. background : true
  154. },
  155. travis: {
  156. configFile : 'karma.conf.js',
  157. singleRun : true
  158. }
  159. },
  160. /*******************************
  161. Build
  162. *******************************/
  163. autoprefixer: {
  164. options: {
  165. browsers: [
  166. 'last 2 version',
  167. '> 1%',
  168. 'opera 12.1',
  169. 'safari 6',
  170. 'ie 9',
  171. 'bb 10',
  172. 'android 4'
  173. ]
  174. },
  175. prefixBuild: {
  176. expand : true,
  177. cwd : 'build/',
  178. dest : 'build/',
  179. src : [
  180. '**/*.less',
  181. '**/*.css',
  182. ]
  183. },
  184. prefixDocs: {
  185. expand : true,
  186. cwd : 'docs/build/',
  187. dest : 'docs/build/',
  188. src : [
  189. '**/*.less',
  190. '**/*.css',
  191. ]
  192. },
  193. prefixFile: {
  194. src : 'docs/build/**/*.css'
  195. }
  196. },
  197. clean: {
  198. options: {
  199. force: true
  200. },
  201. build : [
  202. 'build/less',
  203. 'build/minified',
  204. 'build/packaged',
  205. 'build/uncompressed'
  206. ],
  207. release : [
  208. 'docs/build',
  209. 'docs',
  210. 'rtl'
  211. ]
  212. },
  213. docco: {
  214. generate: {
  215. options: {
  216. css : 'spec/assets/docco.css',
  217. output : 'spec/docs/'
  218. },
  219. files: [
  220. {
  221. expand : true,
  222. cwd : 'spec/',
  223. src : [
  224. '**.commented.js'
  225. ]
  226. }
  227. ]
  228. }
  229. },
  230. cssjanus: {
  231. rtl: {
  232. expand : true,
  233. cwd : 'build/',
  234. src : [
  235. '**/*.less',
  236. '**/*.css',
  237. ],
  238. dest : 'rtl'
  239. },
  240. },
  241. less: {
  242. options: {
  243. paths : ['src'],
  244. compress : false,
  245. optimization : 2
  246. },
  247. // optimized for watch, src is built on watch task using callbacks
  248. buildDocsCSS: {
  249. src : 'src',
  250. dest : 'docs/build/uncompressed/',
  251. rename : preserveFileExtensions
  252. },
  253. buildTestCSS: {
  254. expand : true,
  255. cwd : 'src',
  256. src : [
  257. '**/*.less'
  258. ],
  259. dest : 'docs/build/uncompressed/',
  260. rename: preserveFileExtensions
  261. },
  262. buildCSS: {
  263. expand : true,
  264. cwd : 'src',
  265. src : [
  266. '**/*.less'
  267. ],
  268. dest : 'build/uncompressed/',
  269. rename: preserveFileExtensions
  270. }
  271. },
  272. copy: {
  273. srcToDocs: {
  274. files: [
  275. // exact copy for less
  276. {
  277. expand : true,
  278. cwd : 'src/**/*.less',
  279. src : [
  280. '**/*'
  281. ],
  282. dest : 'docs/build/less'
  283. },
  284. // copy everything but less files for uncompressed release
  285. {
  286. expand : true,
  287. cwd : 'src/',
  288. src : [
  289. '**/*.js',
  290. 'images/*',
  291. 'fonts/*'
  292. ],
  293. dest : 'docs/build/uncompressed'
  294. },
  295. // copy assets only for minified version
  296. {
  297. expand : true,
  298. cwd : 'src/',
  299. src : [
  300. 'images/*',
  301. 'fonts/*'
  302. ],
  303. dest : 'docs/build/minified'
  304. },
  305. // copy assets only for packaged version
  306. {
  307. expand : true,
  308. cwd : 'src/',
  309. src : [
  310. 'images/*',
  311. 'fonts/*'
  312. ],
  313. dest : 'docs/build/packaged'
  314. }
  315. ]
  316. },
  317. srcToBuild: {
  318. files: [
  319. // exact copy for less
  320. {
  321. expand : true,
  322. cwd : 'src/',
  323. src : [
  324. '**/*'
  325. ],
  326. dest : 'build/less'
  327. },
  328. // copy everything but less files for uncompressed release
  329. {
  330. expand : true,
  331. cwd : 'src/',
  332. src : [
  333. '**/*.js',
  334. 'images/*',
  335. 'fonts/*'
  336. ],
  337. dest : 'build/uncompressed'
  338. },
  339. // copy assets only for minified version
  340. {
  341. expand : true,
  342. cwd : 'src/',
  343. src : [
  344. 'images/*',
  345. 'fonts/*'
  346. ],
  347. dest : 'build/minified'
  348. },
  349. // copy assets only for packaged version
  350. {
  351. expand : true,
  352. cwd : 'src/',
  353. src : [
  354. 'images/*',
  355. 'fonts/*'
  356. ],
  357. dest : 'build/packaged'
  358. }
  359. ]
  360. },
  361. // create new rtl assets
  362. buildToRTL: {
  363. files: [
  364. {
  365. expand : true,
  366. cwd : 'build/',
  367. src : [
  368. '**'
  369. ],
  370. dest : 'rtl'
  371. }
  372. ]
  373. },
  374. // make library available in docs
  375. buildToDocs: {
  376. files: [
  377. {
  378. expand : true,
  379. cwd : 'build/',
  380. src : [
  381. '**'
  382. ],
  383. dest : 'docs/build/'
  384. }
  385. ]
  386. },
  387. // copy spec files to docs
  388. specToDocs: {
  389. files: [
  390. {
  391. expand : true,
  392. cwd : 'spec',
  393. src : [
  394. '**'
  395. ],
  396. dest : 'docs/spec/'
  397. }
  398. ]
  399. },
  400. // copy spec files to docs
  401. examplesToDocs: {
  402. files: [
  403. {
  404. expand : true,
  405. cwd : 'build/examples',
  406. src : [
  407. '**'
  408. ],
  409. dest : 'docs/build/examples/'
  410. }
  411. ]
  412. }
  413. },
  414. compress: {
  415. options: {
  416. archive: 'docs/build/semantic.zip'
  417. },
  418. everything: {
  419. files: [
  420. {
  421. expand : true,
  422. cwd : 'build/',
  423. src : [
  424. '**'
  425. ]
  426. }
  427. ]
  428. }
  429. },
  430. concat: {
  431. options: {
  432. },
  433. createCSSPackage: {
  434. src: ['build/uncompressed/**/*.css'],
  435. dest: 'build/packaged/css/semantic.css'
  436. },
  437. createJSPackage: {
  438. src: ['build/uncompressed/**/*.js'],
  439. dest: 'build/packaged/javascript/semantic.js'
  440. },
  441. createDocsCSSPackage: {
  442. src: ['docs/build/uncompressed/**/*.css'],
  443. dest: 'docs/build/packaged/css/semantic.css'
  444. },
  445. createDocsJSPackage: {
  446. src: ['docs/build/uncompressed/**/*.js'],
  447. dest: 'docs/build/packaged/javascript/semantic.js'
  448. },
  449. },
  450. cssmin: {
  451. options : {
  452. keepSpecialComments: 0,
  453. report: 'min',
  454. banner : '' +
  455. '/*\n' +
  456. '* # <%= package.title %>\n' +
  457. '* Version: <%= package.version %>\n' +
  458. '* http://github.com/jlukic/semantic-ui\n' +
  459. '*\n' +
  460. '*\n' +
  461. '* Copyright <%= grunt.template.today("yyyy") %> Contributors\n' +
  462. '* Released under the MIT license\n' +
  463. '* http://opensource.org/licenses/MIT\n' +
  464. '*\n' +
  465. '* Released: <%= grunt.template.today("mm/dd/yyyy") %>\n' +
  466. '*/\n'
  467. },
  468. // copy minified css to minified release
  469. minifyCSS: {
  470. expand : true,
  471. cwd : 'build/uncompressed',
  472. src : [
  473. '**/*.css'
  474. ],
  475. dest : 'build/minified/',
  476. rename: preserveMinFileExtensions
  477. },
  478. // add comment banner to css release
  479. createMinCSSPackage: {
  480. files: {
  481. 'build/packaged/css/semantic.min.css': [
  482. 'build/uncompressed/**/*.css'
  483. ]
  484. }
  485. }
  486. },
  487. uglify: {
  488. minifyJS: {
  489. expand : true,
  490. cwd : 'build/uncompressed',
  491. src : [
  492. '**/*.js'
  493. ],
  494. dest : 'build/minified',
  495. ext : '.min.js',
  496. banner : '' +
  497. '/*' +
  498. '* # <%= package.title %>\n' +
  499. '* Version: <%= package.version %>\n' +
  500. '* http://github.com/jlukic/semantic-ui\n' +
  501. '*\n' +
  502. '*\n' +
  503. '* Copyright <%= grunt.template.today("yyyy") %> Contributors\n' +
  504. '* Released under the MIT license\n' +
  505. '* http://opensource.org/licenses/MIT\n' +
  506. '*\n' +
  507. '* Release Date: <%= grunt.template.today("mm/dd/yyyy") %>\n' +
  508. '*/\n'
  509. },
  510. createMinJSPackage: {
  511. options: {
  512. mangle : true,
  513. compress : true,
  514. banner : '' +
  515. '/*' +
  516. '* # <%= package.title %>\n' +
  517. '* Version: <%= package.version %>\n' +
  518. '* http://github.com/jlukic/semantic-ui\n' +
  519. '*\n' +
  520. '*\n' +
  521. '* Copyright <%= grunt.template.today("yyyy") %> Contributors\n' +
  522. '* Released under the MIT license\n' +
  523. '* http://opensource.org/licenses/MIT\n' +
  524. '*\n' +
  525. '* Release Date: <%= grunt.template.today("mm/dd/yyyy") %>\n' +
  526. '*/\n'
  527. },
  528. files: {
  529. 'build/packaged/javascript/semantic.min.js': [
  530. 'build/uncompressed/**/*.js'
  531. ]
  532. }
  533. }
  534. }
  535. };
  536. require('load-grunt-tasks')(grunt);
  537. grunt.initConfig(config);
  538. grunt.registerTask('default', defaultTasks);
  539. grunt.registerTask('test', testTasks);
  540. grunt.registerTask('release', releaseTasks);
  541. grunt.registerTask('rtl', rtlTasks);
  542. grunt.registerTask('docs', docTasks);
  543. grunt.registerTask('build', buildTasks);
  544. // compiles only changed less files <https://npmjs.org/package/grunt-contrib-watch>
  545. grunt.event.on('watch', setWatchFiles);
  546. };