mirror of
				https://github.com/flynx/argv.js.git
				synced 2025-10-31 03:30:08 +00:00 
			
		
		
		
	some fixes + nesting works, still need to think and simplify...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									643665be5a
								
							
						
					
					
						commit
						679437a822
					
				
							
								
								
									
										68
									
								
								argv.js
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								argv.js
									
									
									
									
									
								
							| @ -288,6 +288,11 @@ object.Constructor('Parser', { | |||||||
| 
 | 
 | ||||||
| 	// Handler API...
 | 	// Handler API...
 | ||||||
| 	// XXX should these be .getOptions(..) / .getCommands(..) ???
 | 	// XXX should these be .getOptions(..) / .getCommands(..) ???
 | ||||||
|  | 	// Format:
 | ||||||
|  | 	// 	[
 | ||||||
|  | 	// 		[<keys>, <arg>, <doc>, <handler>],
 | ||||||
|  | 	// 		...
 | ||||||
|  | 	// 	]
 | ||||||
| 	options: function(...prefix){ | 	options: function(...prefix){ | ||||||
| 		var that = this | 		var that = this | ||||||
| 		prefix = prefix.length == 0 ? | 		prefix = prefix.length == 0 ? | ||||||
| @ -298,7 +303,6 @@ object.Constructor('Parser', { | |||||||
| 				var handlers = {} | 				var handlers = {} | ||||||
| 				object.deepKeys(that, Parser.prototype) | 				object.deepKeys(that, Parser.prototype) | ||||||
| 					.forEach(function(opt){ | 					.forEach(function(opt){ | ||||||
| 						// XXX
 |  | ||||||
| 						if(!opt.startsWith(prefix)){ | 						if(!opt.startsWith(prefix)){ | ||||||
| 							return } | 							return } | ||||||
| 						var [k, h] = that.getHandler(opt) | 						var [k, h] = that.getHandler(opt) | ||||||
| @ -306,7 +310,20 @@ object.Constructor('Parser', { | |||||||
| 							handlers[k][0].push(opt) | 							handlers[k][0].push(opt) | ||||||
| 							: (handlers[k] = [[opt], h.arg, h.doc || k.slice(1), h]) }) | 							: (handlers[k] = [[opt], h.arg, h.doc || k.slice(1), h]) }) | ||||||
| 				return Object.values(handlers) }) | 				return Object.values(handlers) }) | ||||||
| 			.flat(1) }, | 			.flat(1)  | ||||||
|  | 			.map(function(e, i){ return [e, i] }) | ||||||
|  | 			.sort(function([a, ai], [b, bi]){ | ||||||
|  | 				a = a[3].priority | ||||||
|  | 				b = b[3].priority | ||||||
|  | 				return a != null && b != null ? | ||||||
|  | 						b - a | ||||||
|  | 					// positive priority above order, negative below...
 | ||||||
|  | 					: (a > 0 || b < 0) ? | ||||||
|  | 						-1 | ||||||
|  | 					: (b < 0 || a > 0) ? | ||||||
|  | 						1 | ||||||
|  | 					: ai - bi }) | ||||||
|  | 			.map(function([e, _]){ return e }) }, | ||||||
| 	commands: function(){ | 	commands: function(){ | ||||||
| 		return this.options(this.commandPrefix) }, | 		return this.options(this.commandPrefix) }, | ||||||
| 
 | 
 | ||||||
| @ -360,6 +377,7 @@ object.Constructor('Parser', { | |||||||
| 	'-h': '-help', | 	'-h': '-help', | ||||||
| 	'-help': { | 	'-help': { | ||||||
| 		doc: 'print this message and exit.', | 		doc: 'print this message and exit.', | ||||||
|  | 		priority: 99, | ||||||
| 		// XXX argv is first for uniformity with .__call__(..) -- need 
 | 		// XXX argv is first for uniformity with .__call__(..) -- need 
 | ||||||
| 		// 		the two to be interchangeable...
 | 		// 		the two to be interchangeable...
 | ||||||
| 		// 		...an alternative would keep it last, but this feels more fragile...
 | 		// 		...an alternative would keep it last, but this feels more fragile...
 | ||||||
| @ -432,11 +450,34 @@ object.Constructor('Parser', { | |||||||
| 		process.exit(1) },  | 		process.exit(1) },  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	__call__: function(_, argv){ | 	// XXX need to unify this with handler as much as possible to make
 | ||||||
| 		var rest = this.rest = argv.slice() | 	// 		parsers nestable....
 | ||||||
| 		this.argv = argv.slice() | 	// 		there are differences that can't be avoided:
 | ||||||
| 		this.script = rest[0] | 	// 			- argv/rest -- argv includes 2 extra args:
 | ||||||
| 		this.scriptName = rest.shift().split(/[\\\/]/).pop() | 	// 				- interpreter
 | ||||||
|  | 	// 				- script
 | ||||||
|  | 	// 		...these should be either avoided or "inherited"	
 | ||||||
|  | 	__call__: function(context, argv){ | ||||||
|  | 		// nested command handler...
 | ||||||
|  | 		// XXX the condition is a bit too strong...
 | ||||||
|  | 		if(context instanceof Parser){ | ||||||
|  | 			var rest = this.rest = argv.slice() | ||||||
|  | 			this.script = this.scriptName =  | ||||||
|  | 				context.scriptName +' '+ arguments[2] | ||||||
|  | 			this.argv = [context.scriptName, this.scriptName, ...argv] | ||||||
|  | 
 | ||||||
|  | 		// root parser...
 | ||||||
|  | 		} else { | ||||||
|  | 			var rest = this.rest = argv.slice() | ||||||
|  | 			this.argv = argv.slice() | ||||||
|  | 			// XXX revise this...
 | ||||||
|  | 			// 		- when run from node -- [<node>, <script>, ...]
 | ||||||
|  | 			// 		- when run from electron -- [<electron>, ...]
 | ||||||
|  | 			// 			require('electron').remove.process.argv
 | ||||||
|  | 			this.interpreter = rest.shift() | ||||||
|  | 			this.script = rest[0] | ||||||
|  | 			this.scriptName = rest.shift().split(/[\\\/]/).pop() | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 		var opt_pattern = this.optionPattern | 		var opt_pattern = this.optionPattern | ||||||
| 
 | 
 | ||||||
| @ -462,10 +503,9 @@ object.Constructor('Parser', { | |||||||
| 						handler | 						handler | ||||||
| 						: handler.handler) | 						: handler.handler) | ||||||
| 					.call(this,  | 					.call(this,  | ||||||
| 						// pass value...
 | 						argv, | ||||||
| 						...(handler.arg ? [value] : []),  | 						arg, | ||||||
| 						arg,  | 						...(handler.arg ? [value] : [])) | ||||||
| 						argv) |  | ||||||
| 				continue } | 				continue } | ||||||
| 			// other...
 | 			// other...
 | ||||||
| 			other.push(arg) } | 			other.push(arg) } | ||||||
| @ -475,10 +515,8 @@ object.Constructor('Parser', { | |||||||
| 		Object.assign(this, spec) | 		Object.assign(this, spec) | ||||||
| 
 | 
 | ||||||
| 		// check for alias loops...
 | 		// check for alias loops...
 | ||||||
| 		this.__pre_check__ | 		this.initCheck | ||||||
| 			&& this.__getoptions__( | 			&& this.options(this.optionPrefix, this.commandPrefix) | ||||||
| 				this.__opt_pattern__ || module.OPTION_PATTERN, |  | ||||||
| 				this.__cmd_pattern__ || module.COMMAND_PATTERN) |  | ||||||
| 	}, | 	}, | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -24,6 +24,6 @@ | |||||||
|   "homepage": "https://github.com/flynx/argv.js#readme", |   "homepage": "https://github.com/flynx/argv.js#readme", | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "colors": "^1.4.0", |     "colors": "^1.4.0", | ||||||
|     "ig-object": "^5.0.12" |     "ig-object": "^5.0.13" | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										36
									
								
								test.js
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								test.js
									
									
									
									
									
								
							| @ -17,7 +17,9 @@ var argv = require('./argv') | |||||||
| //---------------------------------------------------------------------
 | //---------------------------------------------------------------------
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| var p = argv.Parser({ | var p =  | ||||||
|  | module.p = | ||||||
|  | argv.Parser({ | ||||||
| 	'@help': '-help', | 	'@help': '-help', | ||||||
| 
 | 
 | ||||||
| 	'-v': '-verbose', | 	'-v': '-verbose', | ||||||
| @ -28,13 +30,27 @@ var p = argv.Parser({ | |||||||
| 
 | 
 | ||||||
| 	'-c': '@command', | 	'-c': '@command', | ||||||
| 	'@cmd': '@command', | 	'@cmd': '@command', | ||||||
| 	'@command': function(){ | 	'@command': { | ||||||
| 		console.log('>>> COMMAND:', ...arguments) | 		priority: -50, | ||||||
| 		return 'command' | 		handler: function(){ | ||||||
|  | 			console.log('>>> COMMAND:', ...arguments) | ||||||
|  | 			return 'command' | ||||||
|  | 		}, | ||||||
| 	}, | 	}, | ||||||
|  | 
 | ||||||
|  | 	// XXX this for some reason breaks...
 | ||||||
|  | 	//'@test': argv.Parser({
 | ||||||
|  | 	//}),
 | ||||||
|  | 
 | ||||||
|  | 	'@nested': argv.Parser({ | ||||||
|  | 		doc: 'nested parser.', | ||||||
|  | 
 | ||||||
|  | 	}), | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | /* | ||||||
| console.log('  ->', p(['test', '--verbose', 'a', 'b', 'c'])) | console.log('  ->', p(['test', '--verbose', 'a', 'b', 'c'])) | ||||||
| 
 | 
 | ||||||
| console.log('  ->', p(['test', '-c', 'a', 'b', 'c'])) | console.log('  ->', p(['test', '-c', 'a', 'b', 'c'])) | ||||||
| @ -43,8 +59,18 @@ console.log('  ->', p(['test', 'command', 'a', 'b', 'c'])) | |||||||
| 
 | 
 | ||||||
| console.log('---') | console.log('---') | ||||||
| 
 | 
 | ||||||
| p(['test', '-h']) |  | ||||||
| 
 | 
 | ||||||
|  | p(['test', 'nested', '-h']) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | p(['test', '-h']) | ||||||
|  | //*/
 | ||||||
|  | 
 | ||||||
|  | if(typeof(__filename) != 'undefined' | ||||||
|  | 		&& __filename == (require.main || {}).filename){ | ||||||
|  | 
 | ||||||
|  | 	p(process.argv) | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /********************************************************************** | /********************************************************************** | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user