koas-parameters
Advanced tools
Comparing version 0.1.0 to 0.1.1
@@ -1,3 +0,10 @@ | ||
import { SchemaValidationError } from 'koas-core'; | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.default = createParameterHandler; | ||
var _koasCore = require("koas-core"); | ||
function createSchema(definitions) { | ||
@@ -7,17 +14,27 @@ if (definitions.length === 0) { | ||
} | ||
const r = definitions.filter(({ required }) => required).map(({ name }) => name); | ||
const r = definitions.filter(({ | ||
required | ||
}) => required).map(({ | ||
name | ||
}) => name); | ||
const fullSchema = { | ||
additionalProperties: true, | ||
properties: definitions.reduce((acc, { name, schema = {} }) => { | ||
properties: definitions.reduce((acc, { | ||
name, | ||
schema = {} | ||
}) => { | ||
acc[name] = schema; | ||
return acc; | ||
}, {}), | ||
}, {}) | ||
}; | ||
if (r.length) { | ||
fullSchema.required = r; | ||
} | ||
return fullSchema; | ||
} | ||
export default function createParameterHandler(operationObject, parameters, parsers, validate) { | ||
function createParameterHandler(operationObject, parameters, parsers, validate) { | ||
const queryDefinitions = []; | ||
@@ -39,2 +56,3 @@ const pathDefinitions = []; | ||
} | ||
return value; | ||
@@ -50,3 +68,8 @@ } | ||
} | ||
const { items, type = 'string' } = pathSchema.properties[key]; | ||
const { | ||
items, | ||
type = 'string' | ||
} = pathSchema.properties[key]; | ||
if (type === 'array') { | ||
@@ -56,11 +79,14 @@ acc[key] = value.split('/').map(val => parse(items && items.type, val)); | ||
} | ||
acc[key] = parse(type, value); | ||
return acc; | ||
}, {}); | ||
try { | ||
await validate(ctx.params, pathSchema); | ||
} catch (err) { | ||
if (!(err instanceof SchemaValidationError)) { | ||
if (!(err instanceof _koasCore.SchemaValidationError)) { | ||
throw err; | ||
} | ||
ctx.throw(400, err.message, err.errors); | ||
@@ -76,3 +102,8 @@ } | ||
} | ||
const { items, type = 'string' } = pathSchema.properties[key]; | ||
const { | ||
items, | ||
type = 'string' | ||
} = pathSchema.properties[key]; | ||
if (type === 'array') { | ||
@@ -83,2 +114,3 @@ const values = Array.isArray(value) ? value : [value]; | ||
} | ||
if (Array.isArray(value)) { | ||
@@ -88,11 +120,14 @@ acc[key] = value; | ||
} | ||
acc[key] = parse(type, value); | ||
return acc; | ||
}, {}); | ||
try { | ||
await validate(ctx.query, querySchema); | ||
} catch (err) { | ||
if (!(err instanceof SchemaValidationError)) { | ||
if (!(err instanceof _koasCore.SchemaValidationError)) { | ||
throw err; | ||
} | ||
ctx.throw(400, err.message, err.errors); | ||
@@ -102,2 +137,2 @@ } | ||
}; | ||
} | ||
} |
@@ -1,3 +0,12 @@ | ||
import createParameterHandler from './createParameterHandler'; | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.default = koasParameters; | ||
var _createParameterHandler = _interopRequireDefault(require("./createParameterHandler")); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
function identity(value) { | ||
@@ -12,4 +21,6 @@ return value; | ||
return false; | ||
case 'true': | ||
return true; | ||
default: | ||
@@ -19,25 +30,32 @@ return value; | ||
}, | ||
integer: value => parseInt(value, 10), | ||
number: parseFloat, | ||
string: identity, | ||
string: identity | ||
}; | ||
export default function koasParameters({ parsers = {} } = {}) { | ||
const combinedParsers = { | ||
...defaultParsers, | ||
...parsers, | ||
function koasParameters({ | ||
parsers = {} | ||
} = {}) { | ||
const combinedParsers = { ...defaultParsers, | ||
...parsers | ||
}; | ||
return ({ spec, validate }) => { | ||
return ({ | ||
spec, | ||
validate | ||
}) => { | ||
const handlers = new Map(); | ||
Object.values(spec.paths).forEach(({ parameters, ...operations }) => { | ||
Object.values(spec.paths).forEach(({ | ||
parameters, | ||
...operations | ||
}) => { | ||
Object.values(operations).forEach(operationObject => { | ||
handlers.set( | ||
operationObject, | ||
createParameterHandler(operationObject, parameters, combinedParsers, validate), | ||
); | ||
handlers.set(operationObject, (0, _createParameterHandler.default)(operationObject, parameters, combinedParsers, validate)); | ||
}); | ||
}); | ||
return async (ctx, next) => { | ||
const { operationObject } = ctx.openApi; | ||
const { | ||
operationObject | ||
} = ctx.openApi; | ||
if (handlers.has(operationObject)) { | ||
@@ -47,5 +65,6 @@ const handler = handlers.get(operationObject); | ||
} | ||
return next(); | ||
}; | ||
}; | ||
} | ||
} |
@@ -1,109 +0,125 @@ | ||
import createTestServer from 'koas-supertest'; | ||
"use strict"; | ||
import koasParameters from './koasParameters'; | ||
var _koasSupertest = _interopRequireDefault(require("koas-supertest")); | ||
var _koasParameters = _interopRequireDefault(require("./koasParameters")); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
const spec = { | ||
paths: { | ||
'/bool/{value}': { | ||
parameters: [ | ||
{ | ||
name: 'value', | ||
in: 'path', | ||
schema: { type: 'boolean' }, | ||
}, | ||
], | ||
get: { responses: {} }, | ||
parameters: [{ | ||
name: 'value', | ||
in: 'path', | ||
schema: { | ||
type: 'boolean' | ||
} | ||
}], | ||
get: { | ||
responses: {} | ||
} | ||
}, | ||
'/int/{value}': { | ||
parameters: [ | ||
{ | ||
name: 'value', | ||
in: 'path', | ||
schema: { type: 'integer' }, | ||
}, | ||
], | ||
get: { responses: {} }, | ||
parameters: [{ | ||
name: 'value', | ||
in: 'path', | ||
schema: { | ||
type: 'integer' | ||
} | ||
}], | ||
get: { | ||
responses: {} | ||
} | ||
}, | ||
'/numeric/{value}': { | ||
parameters: [ | ||
{ | ||
name: 'value', | ||
in: 'path', | ||
schema: { type: 'number' }, | ||
}, | ||
], | ||
get: { responses: {} }, | ||
parameters: [{ | ||
name: 'value', | ||
in: 'path', | ||
schema: { | ||
type: 'number' | ||
} | ||
}], | ||
get: { | ||
responses: {} | ||
} | ||
}, | ||
'/str/{value}': { | ||
parameters: [ | ||
{ | ||
name: 'value', | ||
in: 'path', | ||
schema: { type: 'string' }, | ||
}, | ||
], | ||
get: { responses: {} }, | ||
}, | ||
}, | ||
parameters: [{ | ||
name: 'value', | ||
in: 'path', | ||
schema: { | ||
type: 'string' | ||
} | ||
}], | ||
get: { | ||
responses: {} | ||
} | ||
} | ||
} | ||
}; | ||
let api; | ||
let params; | ||
afterEach(() => { | ||
params = undefined; | ||
}); | ||
describe('defaults', () => { | ||
beforeEach(async () => { | ||
api = await createTestServer(spec, [ | ||
koasParameters(), | ||
() => (ctx, next) => { | ||
({ params } = ctx); | ||
return next(); | ||
}, | ||
]); | ||
api = await (0, _koasSupertest.default)(spec, [(0, _koasParameters.default)(), () => (ctx, next) => { | ||
({ | ||
params | ||
} = ctx); | ||
return next(); | ||
}]); | ||
}); | ||
it('should a boolean value true', async () => { | ||
await api.get('/bool/true'); | ||
expect(params).toStrictEqual({ value: true }); | ||
expect(params).toStrictEqual({ | ||
value: true | ||
}); | ||
}); | ||
it('should a boolean value false', async () => { | ||
await api.get('/bool/false'); | ||
expect(params).toStrictEqual({ value: false }); | ||
expect(params).toStrictEqual({ | ||
value: false | ||
}); | ||
}); | ||
it('should parse an integer', async () => { | ||
await api.get('/int/42'); | ||
expect(params).toStrictEqual({ value: 42 }); | ||
expect(params).toStrictEqual({ | ||
value: 42 | ||
}); | ||
}); | ||
it('should parse a number', async () => { | ||
await api.get('/numeric/13.37'); | ||
expect(params).toStrictEqual({ value: 13.37 }); | ||
expect(params).toStrictEqual({ | ||
value: 13.37 | ||
}); | ||
}); | ||
it('should leave a string as-is', async () => { | ||
await api.get('/str/1337'); | ||
expect(params).toStrictEqual({ value: '1337' }); | ||
expect(params).toStrictEqual({ | ||
value: '1337' | ||
}); | ||
}); | ||
}); | ||
describe('custom parsers', () => { | ||
beforeEach(async () => { | ||
api = await createTestServer(spec, [ | ||
koasParameters({ parsers: { string: value => `${value}-postfix` } }), | ||
() => (ctx, next) => { | ||
({ params } = ctx); | ||
return next(); | ||
}, | ||
]); | ||
api = await (0, _koasSupertest.default)(spec, [(0, _koasParameters.default)({ | ||
parsers: { | ||
string: value => `${value}-postfix` | ||
} | ||
}), () => (ctx, next) => { | ||
({ | ||
params | ||
} = ctx); | ||
return next(); | ||
}]); | ||
}); | ||
it('should leave a string as-is', async () => { | ||
await api.get('/str/value'); | ||
expect(params).toStrictEqual({ value: 'value-postfix' }); | ||
expect(params).toStrictEqual({ | ||
value: 'value-postfix' | ||
}); | ||
}); | ||
}); | ||
}); |
{ | ||
"name": "koas-parameters", | ||
"version": "0.1.0", | ||
"version": "0.1.1", | ||
"author": "Remco Haszing <remcohaszing@gmail.com>", | ||
@@ -20,4 +20,4 @@ "license": "MIT", | ||
"devDependencies": { | ||
"koas-supertest": "^0.1.0" | ||
"koas-supertest": "^0.1.1" | ||
} | ||
} |
7698
282