mirror of https://github.com/Seich/Beau.git
				
				
				
			Added basic support for plugins.
Plugins can now be included, they can modify the requests before they are made and modify the result. They are very simple to write and work with. I also wrote and example plugin over at seich/beau-jwt.
This commit is contained in:
		
							parent
							
								
									ab19146966
								
							
						
					
					
						commit
						3c2691b164
					
				|  | @ -0,0 +1,11 @@ | |||
| host: http://localhost:10080 | ||||
| 
 | ||||
| plugins: | ||||
|   - beau-jwt: | ||||
|       data: | ||||
|         userId: 12 | ||||
|         name: Sergio | ||||
|       secret: 'asdfasdf+asdfasdf/asdfasdfasdfasdf==' | ||||
| 
 | ||||
| GET /test: | ||||
|   alias: test | ||||
|  | @ -14,6 +14,7 @@ | |||
|     "commander": "^2.9.0", | ||||
|     "eyes": "^0.1.8", | ||||
|     "js-yaml": "^3.7.0", | ||||
|     "requireg": "^0.1.6", | ||||
|     "unirest": "^0.5.1" | ||||
|   }, | ||||
|   "repository": "git@github.com:Seich/Beau.git", | ||||
|  |  | |||
							
								
								
									
										29
									
								
								request.js
								
								
								
								
							
							
						
						
									
										29
									
								
								request.js
								
								
								
								
							|  | @ -5,8 +5,8 @@ const RequestCache = require('./requestCache'); | |||
| 
 | ||||
| class Request { | ||||
| 	constructor(req, list) { | ||||
| 
 | ||||
| 		let config = {}; | ||||
| 		this.originalRequest = req; | ||||
| 
 | ||||
| 		Object.keys(req).forEach(k => config[k.toUpperCase()] = req[k]); | ||||
| 
 | ||||
|  | @ -53,16 +53,29 @@ class Request { | |||
| 		return set; | ||||
| 	} | ||||
| 
 | ||||
| 	exec() { | ||||
| 	exec(modifiers = []) { | ||||
| 		let dependencies = Array.from(this.DEPENDENCIES); | ||||
| 
 | ||||
| 		return this.list.fetchDependencies(dependencies).then(cache => { | ||||
| 			let endpoint = cache.parse(this.ENDPOINT); | ||||
| 			let request = unirest(this.VERB, endpoint); | ||||
| 			let settings = { | ||||
| 				endpoint: cache.parse(this.ENDPOINT), | ||||
| 				method: this.VERB, | ||||
| 				headers: cache.parse(this.HEADERS), | ||||
| 				query: cache.parse(this.PARAMS), | ||||
| 				payload: cache.parse(this.PAYLOAD) | ||||
| 			}; | ||||
| 
 | ||||
| 			request.headers(cache.parse(this.HEADERS)); | ||||
| 			request.query(cache.parse(this.PARAMS)); | ||||
| 			request.send(cache.parse(this.PAYLOAD)); | ||||
| 			modifiers.forEach(mod => { | ||||
| 				if (typeof mod.preRequest !== 'undefined') { | ||||
| 					mod.preRequest(settings, this.originalRequest); | ||||
| 				} | ||||
| 			}); | ||||
| 
 | ||||
| 			let request = unirest(settings.method, settings.endpoint); | ||||
| 
 | ||||
| 			request.headers(settings.headers); | ||||
| 			request.query(settings.query); | ||||
| 			request.send(settings.payload); | ||||
| 
 | ||||
| 			return new Promise((resolve, reject) => { | ||||
| 				request.end(res => { | ||||
|  | @ -75,7 +88,7 @@ class Request { | |||
| 						request: { | ||||
| 							headers: res.request.headers, | ||||
| 							body: res.request.body, | ||||
| 							endpoint: endpoint | ||||
| 							endpoint: settings.endpoint | ||||
| 						}, | ||||
| 						response: { | ||||
| 							status: res.status, | ||||
|  |  | |||
|  | @ -1,10 +1,13 @@ | |||
| const Request = require('./request'); | ||||
| const RequestCache = require('./requestCache'); | ||||
| const httpVerbs = require('./shared').httpVerbs; | ||||
| const requireg = require('requireg'); | ||||
| 
 | ||||
| class RequestList { | ||||
| 	constructor(doc = {}, config = {}) { | ||||
| 		this.config = config; | ||||
| 
 | ||||
| 		this.modifiers = this.loadPlugins(); | ||||
| 		this.list = this.loadRequests(doc); | ||||
| 		this.cache = new RequestCache(); | ||||
| 	} | ||||
|  | @ -17,7 +20,16 @@ class RequestList { | |||
| 		} | ||||
| 
 | ||||
| 		return request | ||||
| 			.exec() | ||||
| 			.exec(this.modifiers) | ||||
| 			.then(res => { | ||||
| 				this.modifiers.forEach(mod => { | ||||
| 					if (typeof mod.postResponse !== 'undefined') { | ||||
| 						mod.postResponse(res); | ||||
| 					} | ||||
| 				}); | ||||
| 
 | ||||
| 				return res; | ||||
| 			}) | ||||
| 			.catch(reason => { | ||||
| 				return Promise | ||||
| 					.reject(`Request: ${request.VERB} ${request.ENDPOINT} FAILED. \n${reason}`); | ||||
|  | @ -46,6 +58,20 @@ class RequestList { | |||
| 			return new Request(doc[key], this); | ||||
| 		}); | ||||
| 	} | ||||
| 
 | ||||
| 	loadPlugins() { | ||||
| 		return this.config.PLUGINS.map(plugin => { | ||||
| 			let name = plugin; | ||||
| 			let settings = null; | ||||
| 
 | ||||
| 			if (typeof plugin === 'object') { | ||||
| 				name = Object.keys(plugin)[0]; | ||||
| 				settings = plugin[name]; | ||||
| 			} | ||||
| 
 | ||||
| 			return new (requireg(name))(settings) | ||||
| 		}); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| module.exports = RequestList; | ||||
|  |  | |||
							
								
								
									
										34
									
								
								yarn.lock
								
								
								
								
							
							
						
						
									
										34
									
								
								yarn.lock
								
								
								
								
							|  | @ -512,6 +512,10 @@ decamelize@^1.0.0, decamelize@^1.1.1: | |||
|   version "1.2.0" | ||||
|   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" | ||||
| 
 | ||||
| deep-extend@~0.2.5: | ||||
|   version "0.2.11" | ||||
|   resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.2.11.tgz#7a16ba69729132340506170494bc83f7076fe08f" | ||||
| 
 | ||||
| deep-is@~0.1.3: | ||||
|   version "0.1.3" | ||||
|   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" | ||||
|  | @ -900,6 +904,10 @@ inherits@2, inherits@~2.0.1: | |||
|   version "2.0.3" | ||||
|   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" | ||||
| 
 | ||||
| ini@~1.3.0: | ||||
|   version "1.3.4" | ||||
|   resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" | ||||
| 
 | ||||
| invariant@^2.2.0: | ||||
|   version "2.2.2" | ||||
|   resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" | ||||
|  | @ -1580,7 +1588,7 @@ minimatch@2.x: | |||
|   dependencies: | ||||
|     brace-expansion "^1.0.0" | ||||
| 
 | ||||
| minimist@0.0.8, minimist@~0.0.1: | ||||
| minimist@0.0.8, minimist@~0.0.1, minimist@~0.0.7: | ||||
|   version "0.0.8" | ||||
|   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" | ||||
| 
 | ||||
|  | @ -1815,6 +1823,15 @@ randomatic@^1.1.3: | |||
|     is-number "^2.0.2" | ||||
|     kind-of "^3.0.2" | ||||
| 
 | ||||
| rc@~1.0.0: | ||||
|   version "1.0.3" | ||||
|   resolved "https://registry.yarnpkg.com/rc/-/rc-1.0.3.tgz#51bf28d21f13a9324528a9633460161ad9a39f77" | ||||
|   dependencies: | ||||
|     deep-extend "~0.2.5" | ||||
|     ini "~1.3.0" | ||||
|     minimist "~0.0.7" | ||||
|     strip-json-comments "0.1.x" | ||||
| 
 | ||||
| read-pkg-up@^1.0.1: | ||||
|   version "1.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" | ||||
|  | @ -1906,10 +1923,21 @@ require-main-filename@^1.0.1: | |||
|   version "1.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" | ||||
| 
 | ||||
| requireg@^0.1.6: | ||||
|   version "0.1.6" | ||||
|   resolved "https://registry.yarnpkg.com/requireg/-/requireg-0.1.6.tgz#205052aec2eaa2d8eb128abacf833b6a380a99b6" | ||||
|   dependencies: | ||||
|     rc "~1.0.0" | ||||
|     resolve "~0.6.1" | ||||
| 
 | ||||
| resolve@1.1.7, resolve@1.1.x, resolve@^1.1.6: | ||||
|   version "1.1.7" | ||||
|   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" | ||||
| 
 | ||||
| resolve@~0.6.1: | ||||
|   version "0.6.3" | ||||
|   resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" | ||||
| 
 | ||||
| right-align@^0.1.1: | ||||
|   version "0.1.3" | ||||
|   resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" | ||||
|  | @ -2046,6 +2074,10 @@ strip-bom@^2.0.0: | |||
|   dependencies: | ||||
|     is-utf8 "^0.2.0" | ||||
| 
 | ||||
| strip-json-comments@0.1.x: | ||||
|   version "0.1.3" | ||||
|   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-0.1.3.tgz#164c64e370a8a3cc00c9e01b539e569823f0ee54" | ||||
| 
 | ||||
| supports-color@^2.0.0: | ||||
|   version "2.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue