Socket
Socket
Sign inDemoInstall

express-router-api

Package Overview
Dependencies
Maintainers
1
Versions
23
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

express-router-api - npm Package Compare versions

Comparing version 1.2.1 to 1.2.2

61

dist/index.js

@@ -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');

'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);
});
});
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc