mirror of https://github.com/Seich/Beau.git
				
				
				
			Added a schame validator.
This allows you to check if the given beau config is valid. Will be used to improve the CLI and remove schema validation-type errors from the actual code.
This commit is contained in:
		
							parent
							
								
									92142c148b
								
							
						
					
					
						commit
						d7ae1cd0e3
					
				|  | @ -0,0 +1,19 @@ | ||||||
|  | version: 1 | ||||||
|  | endpoint: https://httpbin.org/ | ||||||
|  | 
 | ||||||
|  | cookiejar: true | ||||||
|  | 
 | ||||||
|  | GET /anything: | ||||||
|  |   alias: anything | ||||||
|  |   form: | ||||||
|  |     name: David | ||||||
|  |   params: | ||||||
|  |     hello: World | ||||||
|  | 
 | ||||||
|  | GET /cookies/set: | ||||||
|  |   alias: set-cookies | ||||||
|  |   params: | ||||||
|  |     hello: World | ||||||
|  | 
 | ||||||
|  | GET /status/418: | ||||||
|  |   alias: teapot | ||||||
|  | @ -3435,6 +3435,21 @@ | ||||||
|       "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", |       "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "isemail": { | ||||||
|  |       "version": "3.1.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.1.2.tgz", | ||||||
|  |       "integrity": "sha512-zfRhJn9rFSGhzU5tGZqepRSAj3+g6oTOHxMGGriWNJZzyLPUK8H7VHpqKntegnW8KLyGA9zwuNaCoopl40LTpg==", | ||||||
|  |       "requires": { | ||||||
|  |         "punycode": "2.1.0" | ||||||
|  |       }, | ||||||
|  |       "dependencies": { | ||||||
|  |         "punycode": { | ||||||
|  |           "version": "2.1.0", | ||||||
|  |           "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", | ||||||
|  |           "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "isexe": { |     "isexe": { | ||||||
|       "version": "2.0.0", |       "version": "2.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", |       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", | ||||||
|  | @ -4288,6 +4303,23 @@ | ||||||
|         "merge-stream": "1.0.1" |         "merge-stream": "1.0.1" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "joi": { | ||||||
|  |       "version": "13.2.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/joi/-/joi-13.2.0.tgz", | ||||||
|  |       "integrity": "sha512-VUzQwyCrmT2lIpxBCYq26dcK9veCQzDh84gQnCtaxCa8ePohX8JZVVsIb+E66kCUUcIvzeIpifa6eZuzqTZ3NA==", | ||||||
|  |       "requires": { | ||||||
|  |         "hoek": "5.0.3", | ||||||
|  |         "isemail": "3.1.2", | ||||||
|  |         "topo": "3.0.0" | ||||||
|  |       }, | ||||||
|  |       "dependencies": { | ||||||
|  |         "hoek": { | ||||||
|  |           "version": "5.0.3", | ||||||
|  |           "resolved": "https://registry.npmjs.org/hoek/-/hoek-5.0.3.tgz", | ||||||
|  |           "integrity": "sha512-Bmr56pxML1c9kU+NS51SMFkiVQAb+9uFfXwyqR2tn4w2FPvmPt65eZ9aCcEfRXd9G74HkZnILC6p967pED4aiw==" | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "js-tokens": { |     "js-tokens": { | ||||||
|       "version": "3.0.2", |       "version": "3.0.2", | ||||||
|       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", |       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", | ||||||
|  | @ -6819,6 +6851,21 @@ | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "topo": { | ||||||
|  |       "version": "3.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.0.tgz", | ||||||
|  |       "integrity": "sha512-Tlu1fGlR90iCdIPURqPiufqAlCZYzLjHYVVbcFWDMcX7+tK8hdZWAfsMrD/pBul9jqHHwFjNdf1WaxA9vTRRhw==", | ||||||
|  |       "requires": { | ||||||
|  |         "hoek": "5.0.3" | ||||||
|  |       }, | ||||||
|  |       "dependencies": { | ||||||
|  |         "hoek": { | ||||||
|  |           "version": "5.0.3", | ||||||
|  |           "resolved": "https://registry.npmjs.org/hoek/-/hoek-5.0.3.tgz", | ||||||
|  |           "integrity": "sha512-Bmr56pxML1c9kU+NS51SMFkiVQAb+9uFfXwyqR2tn4w2FPvmPt65eZ9aCcEfRXd9G74HkZnILC6p967pED4aiw==" | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "tough-cookie": { |     "tough-cookie": { | ||||||
|       "version": "2.3.3", |       "version": "2.3.3", | ||||||
|       "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", |       "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", | ||||||
|  |  | ||||||
|  | @ -16,6 +16,7 @@ | ||||||
|     "commander": "^2.15.1", |     "commander": "^2.15.1", | ||||||
|     "deepmerge": "^2.1.0", |     "deepmerge": "^2.1.0", | ||||||
|     "dotenv": "^5.0.1", |     "dotenv": "^5.0.1", | ||||||
|  |     "joi": "^13.2.0", | ||||||
|     "js-yaml": "^3.11.0", |     "js-yaml": "^3.11.0", | ||||||
|     "jsome": "^2.5.0", |     "jsome": "^2.5.0", | ||||||
|     "request": "^2.85.0", |     "request": "^2.85.0", | ||||||
|  |  | ||||||
|  | @ -3,7 +3,6 @@ | ||||||
| exports[`Beau's config Loader. should create a request list 1`] = ` | exports[`Beau's config Loader. should create a request list 1`] = ` | ||||||
| Beau { | Beau { | ||||||
|   "config": Config { |   "config": Config { | ||||||
|     "CACHE": false, |  | ||||||
|     "COOKIEJAR": false, |     "COOKIEJAR": false, | ||||||
|     "DEFAULTS": Object { |     "DEFAULTS": Object { | ||||||
|       "headers": Object { |       "headers": Object { | ||||||
|  | @ -45,7 +44,6 @@ Beau { | ||||||
|     "VERSION": 1, |     "VERSION": 1, | ||||||
|     "configKeys": Array [ |     "configKeys": Array [ | ||||||
|       "VERSION", |       "VERSION", | ||||||
|       "CACHE", |  | ||||||
|       "ENDPOINT", |       "ENDPOINT", | ||||||
|       "PLUGINS", |       "PLUGINS", | ||||||
|       "DEFAULTS", |       "DEFAULTS", | ||||||
|  | @ -54,7 +52,6 @@ Beau { | ||||||
|       "COOKIEJAR", |       "COOKIEJAR", | ||||||
|     ], |     ], | ||||||
|     "defaultConfigValues": Object { |     "defaultConfigValues": Object { | ||||||
|       "CACHE": false, |  | ||||||
|       "COOKIEJAR": false, |       "COOKIEJAR": false, | ||||||
|       "DEFAULTS": Object {}, |       "DEFAULTS": Object {}, | ||||||
|       "ENDPOINT": "", |       "ENDPOINT": "", | ||||||
|  | @ -108,7 +105,6 @@ Beau { | ||||||
|       }, |       }, | ||||||
|     }, |     }, | ||||||
|     "config": Config { |     "config": Config { | ||||||
|       "CACHE": false, |  | ||||||
|       "COOKIEJAR": false, |       "COOKIEJAR": false, | ||||||
|       "DEFAULTS": Object { |       "DEFAULTS": Object { | ||||||
|         "headers": Object { |         "headers": Object { | ||||||
|  | @ -150,7 +146,6 @@ Beau { | ||||||
|       "VERSION": 1, |       "VERSION": 1, | ||||||
|       "configKeys": Array [ |       "configKeys": Array [ | ||||||
|         "VERSION", |         "VERSION", | ||||||
|         "CACHE", |  | ||||||
|         "ENDPOINT", |         "ENDPOINT", | ||||||
|         "PLUGINS", |         "PLUGINS", | ||||||
|         "DEFAULTS", |         "DEFAULTS", | ||||||
|  | @ -159,7 +154,6 @@ Beau { | ||||||
|         "COOKIEJAR", |         "COOKIEJAR", | ||||||
|       ], |       ], | ||||||
|       "defaultConfigValues": Object { |       "defaultConfigValues": Object { | ||||||
|         "CACHE": false, |  | ||||||
|         "COOKIEJAR": false, |         "COOKIEJAR": false, | ||||||
|         "DEFAULTS": Object {}, |         "DEFAULTS": Object {}, | ||||||
|         "ENDPOINT": "", |         "ENDPOINT": "", | ||||||
|  |  | ||||||
|  | @ -2,7 +2,6 @@ | ||||||
| 
 | 
 | ||||||
| exports[`Config should load multiple hosts 1`] = ` | exports[`Config should load multiple hosts 1`] = ` | ||||||
| Config { | Config { | ||||||
|   "CACHE": false, |  | ||||||
|   "COOKIEJAR": false, |   "COOKIEJAR": false, | ||||||
|   "DEFAULTS": Object { |   "DEFAULTS": Object { | ||||||
|     "HEADERS": Object { |     "HEADERS": Object { | ||||||
|  | @ -113,7 +112,6 @@ Config { | ||||||
|   "VERSION": 1, |   "VERSION": 1, | ||||||
|   "configKeys": Array [ |   "configKeys": Array [ | ||||||
|     "VERSION", |     "VERSION", | ||||||
|     "CACHE", |  | ||||||
|     "ENDPOINT", |     "ENDPOINT", | ||||||
|     "PLUGINS", |     "PLUGINS", | ||||||
|     "DEFAULTS", |     "DEFAULTS", | ||||||
|  | @ -122,7 +120,6 @@ Config { | ||||||
|     "COOKIEJAR", |     "COOKIEJAR", | ||||||
|   ], |   ], | ||||||
|   "defaultConfigValues": Object { |   "defaultConfigValues": Object { | ||||||
|     "CACHE": false, |  | ||||||
|     "COOKIEJAR": false, |     "COOKIEJAR": false, | ||||||
|     "DEFAULTS": Object {}, |     "DEFAULTS": Object {}, | ||||||
|     "ENDPOINT": "", |     "ENDPOINT": "", | ||||||
|  | @ -176,7 +173,6 @@ Config { | ||||||
| 
 | 
 | ||||||
| exports[`Config should set up defaults for all requests 1`] = ` | exports[`Config should set up defaults for all requests 1`] = ` | ||||||
| Config { | Config { | ||||||
|   "CACHE": false, |  | ||||||
|   "COOKIEJAR": false, |   "COOKIEJAR": false, | ||||||
|   "DEFAULTS": Object { |   "DEFAULTS": Object { | ||||||
|     "HEADERS": Object { |     "HEADERS": Object { | ||||||
|  | @ -218,7 +214,6 @@ Config { | ||||||
|   "VERSION": 1, |   "VERSION": 1, | ||||||
|   "configKeys": Array [ |   "configKeys": Array [ | ||||||
|     "VERSION", |     "VERSION", | ||||||
|     "CACHE", |  | ||||||
|     "ENDPOINT", |     "ENDPOINT", | ||||||
|     "PLUGINS", |     "PLUGINS", | ||||||
|     "DEFAULTS", |     "DEFAULTS", | ||||||
|  | @ -227,7 +222,6 @@ Config { | ||||||
|     "COOKIEJAR", |     "COOKIEJAR", | ||||||
|   ], |   ], | ||||||
|   "defaultConfigValues": Object { |   "defaultConfigValues": Object { | ||||||
|     "CACHE": false, |  | ||||||
|     "COOKIEJAR": false, |     "COOKIEJAR": false, | ||||||
|     "DEFAULTS": Object {}, |     "DEFAULTS": Object {}, | ||||||
|     "ENDPOINT": "", |     "ENDPOINT": "", | ||||||
|  |  | ||||||
|  | @ -6,13 +6,11 @@ describe('Config', () => { | ||||||
|     const doc = yaml.safeLoad(` |     const doc = yaml.safeLoad(` | ||||||
|             version: 1 |             version: 1 | ||||||
|             endpoint: http://martianwabbit.com
 |             endpoint: http://martianwabbit.com
 | ||||||
|             cache: false |  | ||||||
|             shouldntBeAdded: true |             shouldntBeAdded: true | ||||||
|         `);
 |         `);
 | ||||||
| 
 | 
 | ||||||
|     const config = new Config(doc); |     const config = new Config(doc); | ||||||
|     expect(config.ENDPOINT).toBe(doc.endpoint); |     expect(config.ENDPOINT).toBe(doc.endpoint); | ||||||
|     expect(config.CACHE).toBe(doc.cache); |  | ||||||
|     expect(config.VERSION).toBe(doc.version); |     expect(config.VERSION).toBe(doc.version); | ||||||
|     expect(config.shouldntBeAdded).toBeUndefined(); |     expect(config.shouldntBeAdded).toBeUndefined(); | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|  | @ -6,7 +6,6 @@ class Config { | ||||||
| 	constructor(doc, env = {}) { | 	constructor(doc, env = {}) { | ||||||
| 		this.defaultConfigValues = { | 		this.defaultConfigValues = { | ||||||
| 			VERSION: 1, | 			VERSION: 1, | ||||||
| 			CACHE: false, |  | ||||||
| 			ENDPOINT: '', | 			ENDPOINT: '', | ||||||
| 			PLUGINS: [], | 			PLUGINS: [], | ||||||
| 			DEFAULTS: {}, | 			DEFAULTS: {}, | ||||||
|  |  | ||||||
|  | @ -0,0 +1,56 @@ | ||||||
|  | const Joi = require('joi'); | ||||||
|  | const { requestRegex } = require('./shared.js'); | ||||||
|  | 
 | ||||||
|  | const requestSchema = [ | ||||||
|  | 	Joi.object() | ||||||
|  | 		.keys({ | ||||||
|  | 			HEADERS: Joi.object().keys(null), | ||||||
|  | 			PAYLOAD: [Joi.object().keys(null), Joi.string()], | ||||||
|  | 			PARAMS: Joi.object().keys(null), | ||||||
|  | 			FORM: Joi.object().keys(null), | ||||||
|  | 			ALIAS: Joi.string().required() | ||||||
|  | 		}) | ||||||
|  | 		.rename(/headers/i, 'HEADERS', { override: true }) | ||||||
|  | 		.rename(/payload/i, 'PAYLOAD', { override: true }) | ||||||
|  | 		.rename(/params/i, 'PARAMS', { override: true }) | ||||||
|  | 		.rename(/form/i, 'FORM', { override: true }) | ||||||
|  | 		.rename(/alias/i, 'ALIAS', { override: true }), | ||||||
|  | 
 | ||||||
|  | 	Joi.string() | ||||||
|  | ]; | ||||||
|  | 
 | ||||||
|  | const hostSchema = Joi.object() | ||||||
|  | 	.keys({ | ||||||
|  | 		HOST: Joi.string().required(), | ||||||
|  | 		ENDPOINT: Joi.string(), | ||||||
|  | 		DEFAULTS: Joi.object().keys(null) | ||||||
|  | 	}) | ||||||
|  | 	.pattern(requestRegex, requestSchema) | ||||||
|  | 	.rename(/host/i, 'HOST', { override: true }) | ||||||
|  | 	.rename(/defaults/i, 'DEFAULTS', { override: true }) | ||||||
|  | 	.rename(/endpoint/i, 'ENDPOINT', { override: true }); | ||||||
|  | 
 | ||||||
|  | const schema = Joi.object() | ||||||
|  | 	.keys({ | ||||||
|  | 		VERSION: Joi.number().integer(), | ||||||
|  | 		ENDPOINT: Joi.string().uri(), | ||||||
|  | 		PLUGINS: Joi.array().items([Joi.string(), Joi.object().keys(null)]), | ||||||
|  | 		DEFAULTS: Joi.object(), | ||||||
|  | 		ENVIRONMENT: Joi.object(), | ||||||
|  | 		HOSTS: Joi.array().items(hostSchema), | ||||||
|  | 		COOKIEJAR: Joi.boolean() | ||||||
|  | 	}) | ||||||
|  | 	.pattern(requestRegex, requestSchema) | ||||||
|  | 	.rename(/version/i, 'VERSION', { override: true }) | ||||||
|  | 	.rename(/endpoint/i, 'ENDPOINT', { override: true }) | ||||||
|  | 	.rename(/hosts/i, 'HOSTS', { override: true }) | ||||||
|  | 	.rename(/plugins/i, 'PLUGINS', { override: true }) | ||||||
|  | 	.rename(/defaults/i, 'DEFAULTS', { override: true }) | ||||||
|  | 	.rename(/environment/i, 'ENVIRONMENT', { override: true }) | ||||||
|  | 	.rename(/cookiejar/i, 'COOKIEJAR', { override: true }); | ||||||
|  | 
 | ||||||
|  | const validate = function(config) { | ||||||
|  | 	return Joi.validate(config, schema, { allowUnknown: true }); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | module.exports = { schema, validate }; | ||||||
		Loading…
	
		Reference in New Issue