Skip to content

Commit 7f1bb36

Browse files
committed
conversion to TypeScript
Functional change: multi-value request headers and query parameters are not supported - in these cases the first value is returned
1 parent af8a2ea commit 7f1bb36

16 files changed

+6113
-4200
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,6 @@ typings/
5959

6060
# next.js build output
6161
.next
62+
63+
# dist
64+
dist

.prettierrc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"printWidth": 100,
3+
"semi": false,
4+
"singleQuote": true,
5+
"tabWidth": 2,
6+
"jsxBracketSameLine": true,
7+
"htmlWhitespaceSensitivity": "ignore",
8+
"trailingComma": "none",
9+
"arrowParens": "avoid"
10+
}

jest.config.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module.exports = {
2+
preset: 'ts-jest',
3+
testEnvironment: 'node',
4+
roots: ['src']
5+
}

package-lock.json

Lines changed: 5615 additions & 3553 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,14 @@
22
"name": "lambda-expressless",
33
"version": "0.0.0-development",
44
"description": "Wrap AWS Lambda functions with Express-like functions to simplify your code",
5-
"main": "src/lambda-wrapper.js",
5+
"source": "src/lambda-wrapper.ts",
6+
"main": "dist/lambda-wrapper.js",
7+
"types": "dist/lambda-wrapper.d.ts",
68
"scripts": {
9+
"prepare": "npm run build",
10+
"build": "tsc",
11+
"format": "prettier --write \"src/**/*.ts\" \"src/**/*.js\"",
12+
"lint": "tslint -p tsconfig.json",
713
"test": "jest",
814
"coverage": "jest --coverage",
915
"travis-deploy-once": "travis-deploy-once",
@@ -21,12 +27,21 @@
2127
"homepage": "https://github.com/muratcorlu/lambda-expressless#readme",
2228
"devDependencies": {
2329
"body-parser": "^1.19.0",
24-
"jest": "^24.9.0",
30+
"jest": "^26.0.0",
31+
"prettier": "^2.1.2",
2532
"router": "^1.3.3",
26-
"semantic-release": "^15.13.21"
33+
"semantic-release": "^15.13.21",
34+
"ts-jest": "^26.4.3",
35+
"@types/jest": "22.2.3",
36+
"tslint": "^6.1.3",
37+
"tslint-config-prettier": "^1.18.0",
38+
"typescript": "^4.0.3"
2739
},
2840
"dependencies": {
41+
"@types/node": "^14.11.2",
2942
"@types/aws-lambda": "^8.10.33",
43+
"@types/accepts": "1.3.5",
44+
"@types/type-is": "1.6.2",
3045
"accepts": "^1.3.7",
3146
"type-is": "^1.6.18"
3247
}

src/lambda-wrapper.d.ts

Lines changed: 0 additions & 12 deletions
This file was deleted.

src/lambda-wrapper.js

Lines changed: 0 additions & 46 deletions
This file was deleted.

src/lambda-wrapper.ts

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { Request } from './request'
2+
import { Response } from './response'
3+
import { APIGatewayProxyHandler, APIGatewayProxyResult } from 'aws-lambda'
4+
5+
export interface Middleware {
6+
(request: Request, response: Response, next: (param?: unknown) => void): void
7+
}
8+
9+
export interface OnFinishedHandler {
10+
(out: unknown, req: Request, res: Response): Promise<APIGatewayProxyResult>
11+
}
12+
13+
/**
14+
* API Gateway handler generator for Lambda
15+
*
16+
* @param router Express compatible router instance
17+
* @param onFinished Last callback before output gets send. Function params: out, req, res
18+
* @return Lambda handler for API gateway events
19+
* @public
20+
*/
21+
22+
exports.ApiGatewayHandler = (router: Middleware, onFinished: OnFinishedHandler) => {
23+
/**
24+
* Lambda Handler for API Gateway invocations
25+
*
26+
* @param {object} event API Gateway event object
27+
* @param {object} context API Gateway context object
28+
* @return {promise} Returns undefined if callback param is set. Return a promise if callback param is undefined.
29+
*/
30+
const handleApiGatewayEvent: APIGatewayProxyHandler = function (event, context) {
31+
return new Promise(resolve => {
32+
const req = new Request(event)
33+
const res = (req.res = new Response(req, async (err, out) => {
34+
if (err) {
35+
console.error(err)
36+
}
37+
// run and wait for onFinished callback
38+
if (onFinished)
39+
try {
40+
out = await onFinished(err || out, req, res)
41+
} catch (err) {
42+
console.error('Error in onFinished callback: ', err)
43+
}
44+
// resolve promise even if onFinished callback errors out
45+
resolve(out)
46+
}))
47+
router(req, res, err => {
48+
// handle generic routing errors
49+
// use error handling middleware for more granular control
50+
if (err) {
51+
console.error('ERROR: ', err)
52+
res.status(500).send('Server error')
53+
} else {
54+
res.status(404).send('Not found')
55+
}
56+
})
57+
})
58+
}
59+
return handleApiGatewayEvent
60+
}

src/request.d.ts

Lines changed: 0 additions & 122 deletions
This file was deleted.

0 commit comments

Comments
 (0)