express-router-api
Advanced tools
Comparing version 1.2.1 to 1.2.2
@@ -6,3 +6,3 @@ "use strict"; | ||
const operators_1 = require("rxjs/operators"); | ||
const isPromise = (val) => typeof val.then === 'function'; | ||
const isPromise = (val) => (val && typeof val.then === 'function'); | ||
class ExpressApiRouterError extends Error { | ||
@@ -53,2 +53,8 @@ constructor(message) { | ||
function sendApiResponse(res, apiResponse) { | ||
if (typeof apiResponse === 'undefined') { | ||
return false; | ||
} | ||
if (typeof apiResponse.apiResult === 'undefined') { | ||
return false; | ||
} | ||
if (apiResponse.apiResult instanceof ApiResponse) { | ||
@@ -59,12 +65,15 @@ apiResponse = apiResponse.apiResult; | ||
if (typeof apiResponse.apiResult === 'object') { | ||
return res.json(apiResponse.apiResult); | ||
res.json(apiResponse.apiResult); | ||
return true; | ||
} | ||
else if (typeof apiResponse.apiResult === 'string') { | ||
return res.send(apiResponse.apiResult); | ||
res.send(apiResponse.apiResult); | ||
return true; | ||
} | ||
else { | ||
return res.end(); | ||
res.end(); | ||
return true; | ||
} | ||
} | ||
function toMiddleware(origHandler, options = {}) { | ||
function toMiddleware(origHandler, options = {}, callNext) { | ||
const internalServerError = options.internalServerError || { error: 'Internal server error' }; | ||
@@ -85,4 +94,4 @@ const processApiError = (err, req, res) => { | ||
}; | ||
const isPlainObject = (obj) => (typeof obj === 'object' && !(obj instanceof ApiResponse)); | ||
const subscription = rxjs_1.defer(() => resolve(origHandler(req, res))) | ||
const isPlainObject = (obj) => (typeof obj === 'object' && !(obj instanceof ApiResponse) && !(obj instanceof ApiError)); | ||
const subscription = rxjs_1.defer(() => resolve(origHandler(req, res, next))) | ||
.pipe(operators_1.switchMap((obj) => { | ||
@@ -118,6 +127,7 @@ return isPlainObject(obj) ? promiseProps(obj) : resolve(obj); | ||
.subscribe((apiResponse) => { | ||
if (!apiResponse) { | ||
return; | ||
if (!sendApiResponse(res, apiResponse)) { | ||
if (callNext) { | ||
next(); | ||
} | ||
} | ||
sendApiResponse(res, apiResponse); | ||
}); | ||
@@ -127,31 +137,2 @@ req.on('close', () => subscription.unsubscribe()); | ||
} | ||
function toParam(paramResolver, options) { | ||
return (req, res, next, value) => { | ||
rxjs_1.defer(() => resolve(paramResolver(req, res, value))) | ||
.pipe(operators_1.catchError((err) => { | ||
if (err instanceof ExpressApiRouterError) { | ||
res.emit('expressApiRouterError', err); | ||
if (!options.silenceExpressApiRouterError) { | ||
console.error(err.stack); | ||
} | ||
return rxjs_1.of(undefined); | ||
} | ||
else if (err instanceof ApiError) { | ||
return rxjs_1.of(new ApiResponse(err.message, err.statusCode || 500)); | ||
} | ||
return rxjs_1.throwError(err); | ||
})) | ||
.pipe(operators_1.catchError((err) => { | ||
next(err); | ||
return rxjs_1.throwError(err); | ||
})) | ||
.subscribe((value) => { | ||
if (value instanceof ApiResponse) { | ||
sendApiResponse(res, value); | ||
return; | ||
} | ||
next(); | ||
}); | ||
}; | ||
} | ||
const methods = ['get', 'post', 'put', 'head', 'delete', | ||
@@ -193,3 +174,3 @@ 'options', 'trace', 'copy', 'lock', 'mkcol', 'move', 'purge', | ||
if (typeof nameOrCallback === 'string') { | ||
oldParam.call(apiRouter, nameOrCallback, toParam.call(apiRouter, handler, options)); | ||
oldParam.call(apiRouter, nameOrCallback, toMiddleware.call(apiRouter, handler, options, true)); | ||
} | ||
@@ -196,0 +177,0 @@ else { |
{ | ||
"name": "express-router-api", | ||
"version": "1.2.1", | ||
"version": "1.2.2", | ||
"description": "Express router that lets you construct your API entirely on promises", | ||
@@ -8,3 +8,4 @@ "main": "dist/index.js", | ||
"scripts": { | ||
"test": "mocha test" | ||
"test": "mocha test", | ||
"build": "tsc -p tsconfig.json" | ||
}, | ||
@@ -11,0 +12,0 @@ "author": "Damian Kaczmarek <rush@virtkick.com>", |
@@ -6,3 +6,3 @@ import { Router, Request, Response, NextFunction, RequestParamHandler, RequestHandler, RouterOptions } from 'express'; | ||
const isPromise = (val: any): val is Promise<any> => typeof val.then === 'function'; | ||
const isPromise = (val: any): val is Promise<any> => (val && typeof val.then === 'function'); | ||
@@ -69,4 +69,12 @@ export class ExpressApiRouterError extends Error { | ||
function sendApiResponse(res: Response, apiResponse: ApiResponse) { | ||
if(apiResponse.apiResult instanceof ApiResponse) { | ||
function sendApiResponse(res: Response, apiResponse?: ApiResponse) { | ||
if (typeof apiResponse === 'undefined') { | ||
return false; | ||
} | ||
if(typeof apiResponse.apiResult === 'undefined') { | ||
return false; | ||
} | ||
if (apiResponse.apiResult instanceof ApiResponse) { | ||
apiResponse = apiResponse.apiResult; | ||
@@ -76,13 +84,16 @@ } | ||
if(typeof apiResponse.apiResult === 'object') { | ||
return res.json(apiResponse.apiResult); | ||
res.json(apiResponse.apiResult); | ||
return true; | ||
} | ||
else if(typeof apiResponse.apiResult === 'string') { | ||
return res.send(apiResponse.apiResult); | ||
res.send(apiResponse.apiResult); | ||
return true; | ||
} | ||
else { | ||
return res.end(); | ||
res.end(); | ||
return true; | ||
} | ||
} | ||
function toMiddleware(this: ExpressApiRouter, origHandler: any, options: ApiRouterOptions = {}) { | ||
function toMiddleware(this: ExpressApiRouter, origHandler: RequestHandler, options: ApiRouterOptions = {}, callNext: boolean) { | ||
const internalServerError = options.internalServerError || {error: 'Internal server error'}; | ||
@@ -108,6 +119,6 @@ | ||
const isPlainObject = (obj: ApiResult) => (typeof obj === 'object' && !(obj instanceof ApiResponse)); | ||
const subscription = defer(() => resolve(origHandler(req, res))) | ||
const isPlainObject = (obj: ApiResult) => (typeof obj === 'object' && !(obj instanceof ApiResponse) && !(obj instanceof ApiError)); | ||
const subscription = defer(() => resolve(origHandler(req, res, next))) | ||
.pipe( | ||
switchMap((obj: ApiResult) => { | ||
switchMap((obj: ApiResult) => { | ||
return isPlainObject(obj) ? promiseProps(obj as { [key: string]: any }) : resolve(obj); | ||
@@ -149,6 +160,7 @@ }), | ||
.subscribe((apiResponse: ApiResponse | undefined) => { | ||
if (!apiResponse) { | ||
return; | ||
if (!sendApiResponse(res, apiResponse)) { | ||
if (callNext) { | ||
next(); | ||
} | ||
} | ||
sendApiResponse(res, apiResponse); | ||
}); | ||
@@ -159,33 +171,2 @@ req.on('close', () => subscription.unsubscribe()) | ||
function toParam(this: ExpressApiRouter, paramResolver: any, options: ApiRouterOptions): RequestParamHandler { | ||
return (req: Request, res: Response, next: NextFunction, value: any) => { | ||
defer(() => resolve(paramResolver(req, res, value))) | ||
.pipe(catchError((err: Error) => { | ||
if (err instanceof ExpressApiRouterError) { | ||
res.emit('expressApiRouterError', err); | ||
if(!options.silenceExpressApiRouterError) { | ||
console.error(err.stack); | ||
} | ||
return of(undefined); | ||
} | ||
else if (err instanceof ApiError) { | ||
return of(new ApiResponse(err.message, err.statusCode || 500)); | ||
} | ||
return throwError(err); | ||
})) | ||
.pipe(catchError((err: Error) => { | ||
next(err); | ||
return throwError(err); | ||
})) | ||
.subscribe((value) => { | ||
if (value instanceof ApiResponse) { | ||
sendApiResponse(res, value); | ||
return; | ||
} | ||
next(); | ||
}); | ||
} | ||
} | ||
type MethodName = 'get' | 'post' | 'put' | 'head' | 'delete' | | ||
@@ -244,3 +225,3 @@ 'options' | 'trace' | 'copy' | 'lock' |'mkcol' | 'move' |'purge' | | ||
if (typeof nameOrCallback === 'string') { | ||
oldParam.call(apiRouter, nameOrCallback, toParam.call(apiRouter, handler, options)); | ||
oldParam.call(apiRouter, nameOrCallback, toMiddleware.call(apiRouter, handler, options, true)); | ||
} else { | ||
@@ -247,0 +228,0 @@ throw new Error('Deprecated usage since Express 4.11'); |
30
test.js
'use strict'; | ||
require('chai'); | ||
let express = require('express'); | ||
let rp = require('request-promise'); | ||
let { ExpressApiRouter, ApiError, ApiResponse } = require('./dist'); | ||
let assert = require('chai').assert; | ||
let Promise = require('bluebird'); | ||
const express = require('express'); | ||
const rp = require('request-promise'); | ||
const { ExpressApiRouter, ApiError, ApiResponse, ApiErrors } = require('./dist'); | ||
const {expect, assert} = require('chai'); | ||
const Promise = require('bluebird'); | ||
const { of } = require('rxjs'); | ||
let checkFor = (val) => { | ||
const checkFor = (val) => { | ||
return val2 => { | ||
@@ -263,3 +263,3 @@ assert.deepEqual(val2, val); | ||
it.skip('should support returning ApiError as a value', () => { | ||
it('should support returning ApiError as a value', () => { | ||
routeTest((req, res) => { | ||
@@ -275,2 +275,18 @@ return Promise.delay(10).then(() => { | ||
}); | ||
it('returning undefined should not send a response', async () => { | ||
routeTest((req, res) => { | ||
return Promise.delay(10).then(() => { | ||
return undefined; | ||
}); | ||
}); | ||
let timedOut = false; | ||
await requestTest('', 500).timeout(50).catch(Promise.TimeoutError, () => { | ||
timedOut = true; | ||
}); | ||
expect(timedOut).to.equal(true); | ||
}); | ||
}); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
30040
704