UNPKG

nodeclipse

Version:

nodeclipse CLI - prepare Node.js project to be imported into Eclipse (Nodeclipse); Installer - eclipse plugin CLI installer

229 lines (195 loc) 8.41 kB
var argv = require('optimist') // optimist: all one letter parameters maybe stacked after '-' // all others should be with '--' // '-cg proj1' becomes '-c -g=proj1', so it should be '-cgn proj1' .alias('c','create') .describe('c', 'create project folder and prepare it') //.alias('n','eclipse_project_nodeclipse') .alias('g','eclipse_project_general') .alias('p','prepare').describe('p', 'prepare for import, i.e. add needed `.project` and other `.*` file ') .string('n') .alias('n','name') .describe('h', 'project name (default is folder name)') .boolean(['h','v','V']) .alias('h','help') .describe('h', 'lists usage arguments') .alias('v','version').describe('v', 'print nodeclipse CLI version') .alias('V','verbose').describe('V', 'be verbose') .argv; var helpstr = " Usage: nodeclipse [arguments] \n\ `nodeclipse --help install` for Nodeclipse CLI Installer Help\n\ \n\ Arguments: \n\ -c, --create <name> create project folder and prepare it \n\ -u, --use <template> use/copy specified template when creating project \n\ -p, --prepare prepare Nodeclipse [Node.js] project for import, i.e. add needed `.project` file and other `.*`\n\ files ('.gitignore', '.jshintrc', '.settings/') if there is no `.project` yet\n\ -g, --eclipse_project_general prepare General Eclipse project for import, i.e. add only needed `.project` file\n\ -n, --name [<name>] project name (default is folder name)\n\ -h, --help this help screen\n\ -v, --version print nodeclipse CLI's version\n\ -V, --verbose be verbose\n\ \n\ Templates are just folders in this project sources:\n\ hello-world The famous hello world HTTP server in 6 lines\n\ hello-coffee The same server written in CoffeeScript\n\ hello-typescript The same server written in TypeScript\n\ hello-html Template with HTML file\n\ template-gradle-java Gradle Java project\n\ template-maven-java Maven Java project\n\ "; //android-application Eclipse files for Android App\n\ //android-library Eclipse files for Android Library\n\ require('shelljs/global'); var fs= require('fs'); var path= require('path'); var debug = false; if (debug) console.dir(process.argv); if (debug) console.dir(argv); // arguments processing var help = argv.help || argv.h || (process.argv.length <= 2); var version = argv.version || argv.v; var create = argv.create || argv.c; var use = argv.use || argv.u || argv.template || argv.t; //var create = create || use; if (!create && use){ console.log("Template usage without folder creation!"); return; } var projectGeneral = argv.e || argv.eclipse_project_general; var projectNodeclipse = argv.en || argv.project_eclipse_nodeclipse; //TODO var prepare = argv.prepare || argv.p || (create && (!projectGeneral) ) ; // not triggered by `create` as it maybe `project_general` as well var name = argv.name || argv.n; // could be create || var verbose = debug || argv.verbose || argv.V; var projectFileExists = false; fs.exists('./.project', function check(exists) { projectFileExists = exists; executeActions(); }); var pathIsDirecory = function (filepath) { stats = fs.statSync(filepath); return stats.isDirectory(); //fs.statSync(filepath).isDirectory() } //BUG #71 (on x64bit JDK output is less) var executeActions = function () { //if (debug) console.log(require.main.filename); // = __filename //if (debug) console.dir(argv); //console.log('Passed parameters: name=%s, verbose=%s', argv.name, argv.verbose); if (help){ // the following code snippet from optimist README.md has error below // var s = fs.createReadStream(argv.file); // // var lines = 0; // s.on('data', function (buf) { // lines += buf.toString().match(/\n/g).length; // }); // s.on('end', function () { // console.log(lines); // }); // fs.js:404 // binding.open(pathModule._makeLong(path), // ^ // TypeError: path must be a string // at Object.fs.open (fs.js:404:11) console.log(helpstr); console.log("Check README.md and sources at "+__dirname +" or https://github.com/Nodeclipse/nodeclipse-1/tree/master/org.nodeclipse.ui/templates/"); return; } if (version){ console.log("Nodeclipse CLI "+require('./package.json').version ); return; } if (projectFileExists && !create) { console.log(".project file already exists!"); return; } //copyFromTemplates if (create){ if (create.toString().length===0){ console.error("Folder/project name is required for creation!"); //process.exit(1); return; } mkdir(create); cd(create); if (verbose) console.log("Created project/folder: " + create); } var curfolder = pwd(); var templatesfolder = __dirname; if (debug) console.log("Templates folder is: " + templatesfolder); if (!name){ name = path.basename(curfolder); } if (use){ //template //cp(__dirname+use+'/*','.'); var fromfolder = path.join(templatesfolder, use, '/*') if (verbose) console.log("Copying from "+ fromfolder ); cp( fromfolder, '.' ) if(use.indexOf('template') == 0 ){ //.startsWith() //http://stackoverflow.com/questions/646628/javascript-startswith // template-* do not use common-templates // .files special treatment ( Node.js shelljs is likely not good tool for this) copyDotProjectFile(use, curfolder, '/.project', name); copyDotProjectFile(use, curfolder, '/.classpath', name); inviteToSiteAsTheLastLine(); return; } } // common-templates if (prepare){ //var fromfolder = path.join(templatesfolder, 'common-templates', '/*') var fromfolder = path.join(templatesfolder, 'common-templates') if (verbose) console.log("Copying from "+ fromfolder ); //cp( '-A', fromfolder, '.' ) // not copying .files: #79 https://github.com/arturadib/shelljs/issues/79 //console.log( fs.readdirSync(fromfolder) ); --> [ '.gitignore', '.jshintrc', '.settings', 'README.md' ] mkdir('.settings'); //HACK1 //for file in find(fromfolder) find(fromfolder).forEach( function copyFile(file) { if (verbose) console.log("Copying "+ file ); // cp(file,'.'); // This does not recreate subfolders - DONE with HACK1 // check and skip if the file is directory //if pathIsDirecory(file) if ( fs.statSync(file).isDirectory() ) return true; //continue //HACK1 if ( ~ file.indexOf('.settings') )// if contains // returns a truthy value if the substring is found, and a falsy value (0) if it isn’t. (-1 becomes 0) cp(file,'.settings/'); else cp(file,'.'); }); } // .project if (debug) console.log('projectNodeclipse='+projectNodeclipse+', projectGeneral='+projectGeneral); if (verbose) console.log("Current folder is: " + curfolder); if (prepare){ copyDotProjectFile('eclipse', curfolder, '/.project', name); } else if (projectGeneral){ copyDotProjectFile('eclipse-project-general', curfolder, '/.project', name); } inviteToSiteAsTheLastLine(); } var copyDotProjectFile = function (eclipse, curfolder, what, name) { if (!eclipse) eclipse = 'eclipse'; //folder with nodeclipse .project if (!what) eclipse = '/.project'; var str = cat(__dirname+'/'+eclipse + what).replace('${projectname}', name); var destfile = curfolder + what; // http://www.nodejs.org/api/fs.html#fs_fs_appendfile_filename_data_options_callback fs.writeFile(destfile, str, function(err) { if (err) throw err; if (verbose) console.log('The file "'+destfile+'" was created !'); if (what == '/.project'){ console.log('In Eclipse/Enide select File -> Import... -> General / Existing Projects into Workspace'); console.log('and enter project directory: '+curfolder); } }); if (debug) console.log(str); // ''.toString() } var inviteToSiteAsTheLastLine = function () { setTimeout(inviteToSite,100); } var inviteToSite = function () { console.log('\n Visit http://www.nodeclipse.org/ for News, post Shares, Installing details, Features list,' +' Usage (incl Video, Demo) with all shortcuts, Help and Hints,' +' Support options, Where Helping needed, How to thank and Contact us, also History page.'); }