8
0
فهرست منبع

New plugin creation grunt taks: grunt plugin:create.

Szymon Kupś 10 سال پیش
والد
کامیت
33fe663e0c
3فایلهای تغییر یافته به همراه189 افزوده شده و 1 حذف شده
  1. 185 0
      dev/tasks/plugin.js
  2. 3 1
      gruntfile.js
  3. 1 0
      package.json

+ 185 - 0
dev/tasks/plugin.js

@@ -0,0 +1,185 @@
+'use strict';
+var path = require( 'path' );
+var tools = require( './utils/tools' );
+var inquirer = require( 'inquirer' );
+var fs = require( 'fs' );
+var grunt;
+
+module.exports = function( g ) {
+	grunt = g;
+	grunt.registerTask( 'plugin', function( target ) {
+		var done = this.async();
+
+		switch ( target ) {
+			case 'create':
+				createNewPlugin( done );
+				break;
+		}
+	} );
+};
+
+// Logs message using grunt.log.writeln.
+function log( message ) {
+	grunt.log.writeln( message );
+}
+
+function createNewPlugin( done ) {
+	var info = { };
+
+	askForPluginName( info )
+		.then( askForRepositoryLocation )
+		.then( askForPluginVersion )
+		.then( askForGitHubUrl )
+		.then( createRepository )
+		.then( updatePluginPackageJSON )
+		.then( updatePackageJson )
+		.then( linkNPM )
+		.then( function() {
+			done();
+		} ).catch( function( e ) {
+			done( e );
+		} );
+}
+
+// Links new plugin directory using npm link.
+function linkNPM( info ) {
+	log( 'Linking plugin using npm link...' );
+
+	return new Promise( function( resolve ) {
+		tools.shExec( 'sudo npm link ' + info.repositoryLocation );
+		resolve( info );
+	} );
+}
+
+// Updates project's package.json by adding GitHub URL to dependencies.
+function updatePackageJson( info ) {
+	return new Promise( function( resolve ) {
+		changePackageJson( path.join( process.cwd(), 'package.json' ), function( json ) {
+			json.dependencies[ info.pluginName ] = info.gitHubUrl;
+
+			return json;
+		} ).then( function() {
+			resolve( info );
+		} );
+	} );
+}
+
+// Updates plugin package.json by adding name of the plugin and version.
+function updatePluginPackageJSON( info ) {
+	return new Promise( function( resolve ) {
+		var packageJSONPath = path.join( info.repositoryLocation, 'package.json' );
+		changePackageJson( packageJSONPath, function( json ) {
+			json.name = info.pluginName;
+			json.version = info.version;
+
+			return json;
+		} ).then( function() {
+			resolve( info );
+		} );
+	} );
+}
+
+// Initializes git repository and merges ckeditor5 boilerplate into master branch.
+function createRepository( info ) {
+	log( 'Initializing plugin repository...' );
+
+	return new Promise( function( resolve ) {
+		var repositoryLocation = info.repositoryLocation;
+		var initializeRepoCommands = [
+			'git init ' + repositoryLocation,
+			'cd ' + repositoryLocation,
+			'git remote add boilerplate git@github.com:ckeditor/ckeditor-boilerplate.git',
+			'git fetch boilerplate ckeditor5',
+			'git merge boilerplate/ckeditor5'
+		];
+
+		tools.shExec( initializeRepoCommands.join( ' && ' ) );
+		resolve( info );
+	} );
+}
+
+// Ask for new plugin name.
+function askForPluginName( info ) {
+	return new Promise( function( resolve ) {
+		inquirer.prompt( [ {
+			name: 'pluginName',
+			message: 'Enter plugin name (without -ckeditor5-plugin postfix):',
+			validate: function( input ) {
+				var regexp = /^[a-zA-Z0-9-_]+$/;
+
+				return regexp.test( input ) ? true : 'Please provide a valid plugin name.';
+			}
+		} ], function( answers ) {
+			info.pluginName = answers.pluginName + '-ckeditor5-plugin';
+			resolve( info );
+		} );
+	} );
+}
+
+// Ask for the location of the repository.
+function askForRepositoryLocation( info ) {
+	var def = path.join( process.cwd(), '..', info.pluginName );
+
+	return new Promise( function( resolve ) {
+		inquirer.prompt( [ {
+			name: 'path',
+			message: 'Enter repository location:',
+			default: def
+		} ], function( answers ) {
+			info.repositoryLocation = answers.path;
+			resolve( info );
+		} );
+	} );
+}
+
+// Ask for initial version of the plugin.
+function askForPluginVersion( info ) {
+	return new Promise( function( resolve ) {
+		inquirer.prompt( [ {
+			name: 'version',
+			message: 'Enter plugin\'s initial version:',
+			default: '0.0.1'
+		} ], function( answers ) {
+			info.version = answers.version;
+			resolve( info );
+		} );
+	} );
+}
+
+// Ask for GitHub Url.
+function askForGitHubUrl( info ) {
+	return new Promise( function( resolve ) {
+		inquirer.prompt( [ {
+			name: 'gitHubUrl',
+			message: 'Enter plugin\'s GitHub URL:',
+			default: 'ckeditor/' + info.pluginName
+		} ], function( answers ) {
+			info.gitHubUrl = answers.gitHubUrl;
+			resolve( info );
+		} );
+	} );
+}
+
+// Changes given package.json.
+function changePackageJson( path, changeFn ) {
+	return new Promise( function( resolve ) {
+		fs.readFile( path, 'utf-8', function( err, file ) {
+			var json;
+
+			if ( err ) {
+				throw err;
+			}
+
+			// Update package.json file.
+			json = JSON.parse( file );
+			json = changeFn( json );
+			fs.writeFile( path, JSON.stringify( json, null, 2 ), 'utf-8', function( err ) {
+				if ( err ) {
+					throw err;
+				}
+
+				resolve( );
+			} );
+		} );
+	} );
+}

+ 3 - 1
gruntfile.js

@@ -26,7 +26,9 @@ module.exports = function( grunt ) {
 			options: {
 				excludeFiles: ignoreFiles
 			}
-		}
+		},
+
+		plugin: { create: { } }
 	} );
 
 	// Finally load the tasks.

+ 1 - 0
package.json

@@ -25,6 +25,7 @@
     "grunt-jscs": "^2.0.0",
     "grunt-contrib-jshint": "^0",
     "grunt-githooks": "^0",
+    "inquirer": "^0.11.0",
     "ncp": "^2.0.0",
     "replace": "^0.3.0",
     "shelljs": "^0"