Browse Source

Nth attempt to implement a reusable set of Gulp tasks succeeded.

Piotrek Koszuliński 10 years ago
parent
commit
ff4428106e
5 changed files with 188 additions and 0 deletions
  1. 1 0
      .gitignore
  2. 93 0
      dev/tasks/gulp/build.js
  3. 71 0
      dev/tasks/gulp/utils.js
  4. 14 0
      gulpfile.js
  5. 9 0
      package.json

+ 1 - 0
.gitignore

@@ -10,3 +10,4 @@
 node_modules/**
 build/**
 coverage/**
+dist/**

+ 93 - 0
dev/tasks/gulp/build.js

@@ -0,0 +1,93 @@
+/* jshint node: true, esnext: true */
+
+'use strict';
+
+const path = require( 'path' );
+const gulp = require( 'gulp' );
+const del = require( 'del' );
+const merge = require( 'merge-stream' );
+// const runSequence = require( 'run-sequence' );
+const watch = require( 'gulp-watch' );
+const utils = require( './utils' );
+
+const sep = path.sep;
+
+module.exports = ( config ) => {
+	const distDir = path.join( config.ROOT_DIR, config.DIST_DIR );
+
+	const tasks = {
+		clean() {
+			return del( distDir );
+		},
+
+		src: {
+			all() {
+				return merge( tasks.src.main(), tasks.src.ckeditor5(), tasks.src.modules() );
+			},
+
+			main() {
+				const srcDir = path.join( config.ROOT_DIR, 'ckeditor.js' );
+
+				return gulp.src( srcDir )
+					.pipe( watch( srcDir ) );
+			},
+
+			ckeditor5() {
+				const srcDir = path.join( config.ROOT_DIR, 'src/**/*.js' );
+
+				return gulp.src( srcDir )
+					.pipe( watch( srcDir ) )
+					.pipe( utils.wrapCKEditor5Module() );
+			},
+
+			modules() {
+				const srcDir = path.join( config.ROOT_DIR, 'node_modules/ckeditor5-*/src/**/*.js' );
+				const modulePathPattern = new RegExp( `node_modules${ sep }(ckeditor5-[^${ sep }]+)${ sep }src` );
+
+				return gulp.src( srcDir )
+					.pipe( watch( srcDir ) )
+					.pipe( utils.unpackModules( modulePathPattern ) );
+			}
+		}
+	};
+
+	gulp.task( 'build:clean', tasks.clean );
+
+	// gulp.task( 'build:copy', ( callback ) => {
+	// 	runSequence(
+	// 		'build:clean',
+	// 		[ 'build:copy:main', 'build:copy:ckeditor5', 'build:copy:modules' ],
+	// 		callback
+	// 	);
+	// } );
+
+	// gulp.task( 'build:transpile', [ 'build:copy' ], tasks.transpile );
+
+	gulp.task( 'build:watch', () => {
+		const codeStream = tasks.src.all()
+			.on( 'data', ( file ) => {
+				console.log( `Processing ${ file.path }...` );
+			} );
+
+		const esNextStream = utils.fork( codeStream )
+			.pipe( utils.dist( distDir, 'esnext' ) );
+
+		const amdStream = utils.fork( codeStream )
+			.pipe( utils.transpile( 'amd' ) )
+			.pipe( utils.dist( distDir, 'amd' ) );
+
+		const cjsStream = utils.fork( codeStream )
+			.pipe( utils.transpile( 'cjs' ) )
+			.pipe( utils.dist( distDir, 'cjs' ) );
+
+		return merge( esNextStream, amdStream, cjsStream )
+			// Unfortunately it gets triggered 3x per each file (what makes sense), but with a single path (cjs).
+			// I guess that it will be better to listen on amd/cjs streams because while the watcher is on you either
+			// need one or the other.
+			.on( 'data', ( file ) => {
+				console.log( `Finished writing ${ file.path }...` );
+			} );
+	} );
+
+	return tasks;
+};

+ 71 - 0
dev/tasks/gulp/utils.js

@@ -0,0 +1,71 @@
+/* jshint node: true, esnext: true */
+
+'use strict';
+
+const path = require( 'path' );
+const gulp = require( 'gulp' );
+const rename = require( 'gulp-rename' );
+const babel = require( 'gulp-babel' );
+const stream = require( 'stream' );
+
+const sep = path.sep;
+
+const utils = {
+	fork( sourceStream ) {
+		const fork = new stream.PassThrough( { objectMode: true } );
+
+		return sourceStream.pipe( fork );
+	},
+
+	dist( distDir, format ) {
+		const destDir = path.join( distDir, format );
+
+		return gulp.dest( destDir );
+	},
+
+	transpile( format ) {
+		const babelModuleTranspilers = {
+			amd: 'amd',
+			cjs: 'commonjs'
+		};
+		const babelModuleTranspiler = babelModuleTranspilers[ format ];
+
+		return new stream.PassThrough( { objectMode: true } )
+			.pipe( utils.pickVersionedFile( format ) )
+			.pipe( babel( {
+				plugins: [ `transform-es2015-modules-${ babelModuleTranspiler }` ]
+			} ) );
+	},
+
+	pickVersionedFile( format ) {
+		return rename( ( path ) => {
+			const regexp = new RegExp( `__${ format }$` );
+
+			path.basename = path.basename.replace( regexp, '' );
+		} );
+	},
+
+	/**
+	 * Move files out of `node_modules/ckeditor5-xxx/src/*` directories to `ckeditor5-xxx/*`.
+	 *
+	 * @returns {Stream}
+	 */
+	unpackModules( modulePathPattern ) {
+		return rename( ( filePath ) => {
+			filePath.dirname = filePath.dirname.replace( modulePathPattern, `${ sep }$1${ sep }` );
+
+			// Remove now empty src/ dirs.
+			if ( !filePath.extname && filePath.basename == 'src' ) {
+				filePath.basename = '';
+			}
+		} );
+	},
+
+	wrapCKEditor5Module() {
+		return rename( ( filePath ) => {
+			filePath.dirname = path.join( filePath.dirname, 'ckeditor5' );
+		} );
+	}
+};
+
+module.exports = utils;

+ 14 - 0
gulpfile.js

@@ -0,0 +1,14 @@
+/* jshint node: true, esnext: true */
+
+'use strict';
+
+const gulp = require( 'gulp' );
+
+const config = {
+	ROOT_DIR: '.',
+	DIST_DIR: 'dist'
+};
+
+require( './dev/tasks/gulp/build' )( config );
+
+gulp.task( 'default', [ 'build' ] );

+ 9 - 0
package.json

@@ -14,6 +14,8 @@
   },
   "devDependencies": {
     "almond": "^0.3.0",
+    "babel-plugin-transform-es2015-modules-amd": "^6.1.18",
+    "babel-plugin-transform-es2015-modules-commonjs": "^6.2.0",
     "benderjs": "^0.4.1",
     "benderjs-chai": "^0.2.0",
     "benderjs-coverage": "^0.2.1",
@@ -27,11 +29,18 @@
     "grunt-githooks": "^0",
     "grunt-jscs": "^2.0.0",
     "grunt-text-replace": "^0.4.0",
+    "gulp": "^3.9.0",
+    "gulp-babel": "^6.1.0",
+    "gulp-rename": "^1.2.2",
+    "gulp-sourcemaps": "^1.6.0",
+    "gulp-watch": "^4.3.5",
     "inquirer": "^0.11.0",
     "istanbul": "^0.4.1",
+    "merge-stream": "^1.0.0",
     "mocha": "^2.2.5",
     "ncp": "^2.0.0",
     "replace": "^0.3.0",
+    "run-sequence": "^1.1.5",
     "shelljs": "^0",
     "sinon": "^1.17.0"
   },