8
0

build.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /**
  2. * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. /* jshint node: true */
  6. 'use strict';
  7. module.exports = function( grunt ) {
  8. grunt.registerTask( 'build', 'Build a release out of the current development code.', function() {
  9. var done = this.async();
  10. module.exports.build( done );
  11. } );
  12. };
  13. // Exports the build method so it can be used from plain node code as well.
  14. module.exports.build = function( done ) {
  15. var target = 'build';
  16. var tmp = 'tmp';
  17. var stepCounter = 0;
  18. var tasks = [
  19. [ cleanup, 'Cleaning the "' + target + '" directory...' ],
  20. [ copyToTmp, 'Copying source files for manipulation...' ],
  21. [ removeAmdNamespace, 'AMD cleanup...' ],
  22. [ optimize, 'Creating the optimized code...' ],
  23. [ cleanupTmp, 'Removing the "' + tmp + '" directory...' ]
  24. ];
  25. runNext();
  26. function runNext() {
  27. var next = tasks.shift();
  28. if ( next ) {
  29. stepCounter++;
  30. console.log( stepCounter + '. ' + next[ 1 ] );
  31. next[ 0 ]( runNext );
  32. } else {
  33. if ( done ) {
  34. done();
  35. }
  36. }
  37. }
  38. function cleanup( callback ) {
  39. var del = require( 'del' );
  40. del.sync( target );
  41. del.sync( tmp );
  42. return callback();
  43. }
  44. function copyToTmp( callback ) {
  45. var ncp = require( 'ncp' ).ncp;
  46. var path = require( 'path' );
  47. var fs = require( 'fs' );
  48. var deps = JSON.parse( fs.readFileSync( 'package.json', 'utf8' ) ).dependencies;
  49. var toCopy = Object.keys( deps ).filter( function( name ) {
  50. return name.indexOf( 'ckeditor5-' ) === 0;
  51. } );
  52. if ( !fs.existsSync( tmp ) ) {
  53. fs.mkdirSync( tmp );
  54. }
  55. function copy() {
  56. var module = toCopy.shift();
  57. if ( !module ) {
  58. return callback();
  59. }
  60. var dest = path.join( tmp + '/', module );
  61. if ( !fs.existsSync( dest ) ) {
  62. fs.mkdirSync( dest );
  63. }
  64. // Copy the "src" directory only.
  65. ncp( path.join( 'node_modules', module, 'src' ), path.join( dest, 'src' ), {
  66. dereference: true
  67. }, function( err ) {
  68. if ( err ) {
  69. throw( err );
  70. }
  71. copy();
  72. } );
  73. }
  74. copy();
  75. }
  76. function removeAmdNamespace( callback ) {
  77. var replace = require( 'replace' );
  78. replace( {
  79. regex: /^\s*CKEDITOR\.(define|require)/mg,
  80. replacement: '$1',
  81. paths: [ 'tmp' ],
  82. recursive: true,
  83. silent: true
  84. } );
  85. callback();
  86. }
  87. function optimize( callback ) {
  88. var requirejs = require( 'requirejs' );
  89. var config = {
  90. out: target + '/ckeditor.js',
  91. almond: true,
  92. baseUrl: tmp + '/ckeditor5-core/src/',
  93. generateSourceMaps: false,
  94. preserveLicenseComments: false,
  95. include: [ 'ckeditor' ],
  96. // include: ['depTree', 'ckeditor' ].concat( getPlugins() ),
  97. // paths: {
  98. // depTree: '../../../lib/depTree',
  99. // plugins: '../../../lib/plugins'
  100. // },
  101. // optimize: 'uglify2',
  102. optimize: 'none',
  103. // onBuildWrite: replacePaths,
  104. // stubModules: [ 'plugins' ],
  105. useStrict: true,
  106. wrap: {
  107. startFile: 'dev/tasks/build/start.frag',
  108. endFile: 'dev/tasks/build/end.frag'
  109. }
  110. };
  111. requirejs.optimize( config, function() {
  112. callback();
  113. }, function( err ) {
  114. throw err;
  115. } );
  116. }
  117. function cleanupTmp( callback ) {
  118. var del = require( 'del' );
  119. del.sync( tmp );
  120. return callback();
  121. }
  122. };