@scloud/lambda-api 0.1.12 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,6 @@
1
+ import { APIGatewayProxyEvent, APIGatewayProxyResult, Context } from 'aws-lambda';
2
+ import { Handler, Routes } from './types';
3
+ /**
4
+ * API route handler
5
+ */
6
+ export declare function apiHandler(event: APIGatewayProxyEvent, context: Context, routes?: Routes, errorHandler?: Handler, catchAll?: Handler): Promise<APIGatewayProxyResult>;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.apiHandler = void 0;
4
+ const helpers_1 = require("./helpers");
5
+ /**
6
+ * API route handler
7
+ */
8
+ async function apiHandler(event, context, routes = {
9
+ '/api/ping': { GET: async (request) => ({ statusCode: 200, body: request }) },
10
+ }, errorHandler = async (request) => ({ statusCode: 500, body: { error: `Internal server error: ${request.path}` } }), catchAll = async (request) => ({ statusCode: 404, body: { error: `Not found: ${request.path}` } })) {
11
+ console.log(`Executing ${context.functionName} version: ${process.env.COMMIT_HASH}`);
12
+ const request = (0, helpers_1.parseRequest)(event);
13
+ let response;
14
+ try {
15
+ const route = routes[request.path];
16
+ if (!route) {
17
+ // Catch-all / 404
18
+ response = await catchAll(request);
19
+ }
20
+ else {
21
+ const handlerFunction = route[request.method];
22
+ if (!handlerFunction)
23
+ return { statusCode: 405, body: JSON.stringify('Method not allowed') };
24
+ // Handle the request:
25
+ response = await handlerFunction(request);
26
+ }
27
+ }
28
+ catch (e) {
29
+ console.error(`${e.message}\n${e.stack}`);
30
+ try {
31
+ // Error handling
32
+ response = await errorHandler(request);
33
+ }
34
+ catch (ee) {
35
+ response = { statusCode: 500, body: { error: `Internal server error: ${request.path} [errorHandler]` } };
36
+ }
37
+ }
38
+ // API Gateway Proxy result
39
+ const result = {
40
+ statusCode: response.statusCode,
41
+ body: JSON.stringify(response.body),
42
+ headers: response.headers,
43
+ };
44
+ // Cookies (if set)
45
+ const cookieHeaders = (0, helpers_1.buildCookie)(response.cookies);
46
+ if (cookieHeaders) {
47
+ result.multiValueHeaders = {
48
+ Cookie: cookieHeaders,
49
+ };
50
+ }
51
+ return result;
52
+ }
53
+ exports.apiHandler = apiHandler;
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVNBLHVDQUFzRDtBQUV0RDs7R0FFRztBQUNJLEtBQUssVUFBVSxVQUFVLENBQzlCLEtBQTJCLEVBQzNCLE9BQWdCLEVBQ2hCLFNBQWlCO0lBQ2YsV0FBVyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRTtDQUN2RixFQUNELGVBQXdCLEtBQUssRUFBRSxPQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsMEJBQTBCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFDcEksV0FBb0IsS0FBSyxFQUFFLE9BQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxjQUFjLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFFcEgsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLE9BQU8sQ0FBQyxZQUFZLGFBQWEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3JGLE1BQU0sT0FBTyxHQUFHLElBQUEsc0JBQVksRUFBQyxLQUFLLENBQUMsQ0FBQztJQUVwQyxJQUFJLFFBQWtCLENBQUM7SUFDdkIsSUFBSTtRQUNGLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLGtCQUFrQjtZQUNsQixRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDcEM7YUFBTTtZQUNMLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBcUIsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxlQUFlO2dCQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztZQUU3RixzQkFBc0I7WUFDdEIsUUFBUSxHQUFHLE1BQU0sZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNDO0tBQ0Y7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBSSxDQUFXLENBQUMsT0FBTyxLQUFNLENBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLElBQUk7WUFDRixpQkFBaUI7WUFDakIsUUFBUSxHQUFHLE1BQU0sWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3hDO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDWCxRQUFRLEdBQUcsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSwwQkFBMEIsT0FBTyxDQUFDLElBQUksaUJBQWlCLEVBQUUsRUFBRSxDQUFDO1NBQzFHO0tBQ0Y7SUFFRCwyQkFBMkI7SUFDM0IsTUFBTSxNQUFNLEdBQTBCO1FBQ3BDLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVTtRQUMvQixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ25DLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztLQUMxQixDQUFDO0lBRUYsbUJBQW1CO0lBQ25CLE1BQU0sYUFBYSxHQUFHLElBQUEscUJBQVcsRUFBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEQsSUFBSSxhQUFhLEVBQUU7UUFDakIsTUFBTSxDQUFDLGlCQUFpQixHQUFHO1lBQ3pCLE1BQU0sRUFBRSxhQUFhO1NBQ3RCLENBQUM7S0FDSDtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFuREQsZ0NBbURDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L3ByZWZlci1kZWZhdWx0LWV4cG9ydCAqL1xuaW1wb3J0IHtcbiAgQVBJR2F0ZXdheVByb3h5RXZlbnQsXG4gIEFQSUdhdGV3YXlQcm94eVJlc3VsdCxcbiAgQ29udGV4dCxcbn0gZnJvbSAnYXdzLWxhbWJkYSc7XG5pbXBvcnQge1xuICBIYW5kbGVyLCBSZXF1ZXN0LCBSZXNwb25zZSwgUm91dGUsIFJvdXRlcyxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBidWlsZENvb2tpZSwgcGFyc2VSZXF1ZXN0IH0gZnJvbSAnLi9oZWxwZXJzJztcblxuLyoqXG4gKiBBUEkgcm91dGUgaGFuZGxlclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBpSGFuZGxlcihcbiAgZXZlbnQ6IEFQSUdhdGV3YXlQcm94eUV2ZW50LFxuICBjb250ZXh0OiBDb250ZXh0LFxuICByb3V0ZXM6IFJvdXRlcyA9IHtcbiAgICAnL2FwaS9waW5nJzogeyBHRVQ6IGFzeW5jIChyZXF1ZXN0OiBSZXF1ZXN0KSA9PiAoeyBzdGF0dXNDb2RlOiAyMDAsIGJvZHk6IHJlcXVlc3QgfSkgfSxcbiAgfSxcbiAgZXJyb3JIYW5kbGVyOiBIYW5kbGVyID0gYXN5bmMgKHJlcXVlc3Q6IFJlcXVlc3QpID0+ICh7IHN0YXR1c0NvZGU6IDUwMCwgYm9keTogeyBlcnJvcjogYEludGVybmFsIHNlcnZlciBlcnJvcjogJHtyZXF1ZXN0LnBhdGh9YCB9IH0pLFxuICBjYXRjaEFsbDogSGFuZGxlciA9IGFzeW5jIChyZXF1ZXN0OiBSZXF1ZXN0KSA9PiAoeyBzdGF0dXNDb2RlOiA0MDQsIGJvZHk6IHsgZXJyb3I6IGBOb3QgZm91bmQ6ICR7cmVxdWVzdC5wYXRofWAgfSB9KSxcbik6IFByb21pc2U8QVBJR2F0ZXdheVByb3h5UmVzdWx0PiB7XG4gIGNvbnNvbGUubG9nKGBFeGVjdXRpbmcgJHtjb250ZXh0LmZ1bmN0aW9uTmFtZX0gdmVyc2lvbjogJHtwcm9jZXNzLmVudi5DT01NSVRfSEFTSH1gKTtcbiAgY29uc3QgcmVxdWVzdCA9IHBhcnNlUmVxdWVzdChldmVudCk7XG5cbiAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByb3V0ZSA9IHJvdXRlc1tyZXF1ZXN0LnBhdGhdO1xuICAgIGlmICghcm91dGUpIHtcbiAgICAgIC8vIENhdGNoLWFsbCAvIDQwNFxuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjYXRjaEFsbChyZXF1ZXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaGFuZGxlckZ1bmN0aW9uID0gcm91dGVbcmVxdWVzdC5tZXRob2QgYXMga2V5b2YgUm91dGVdO1xuICAgICAgaWYgKCFoYW5kbGVyRnVuY3Rpb24pIHJldHVybiB7IHN0YXR1c0NvZGU6IDQwNSwgYm9keTogSlNPTi5zdHJpbmdpZnkoJ01ldGhvZCBub3QgYWxsb3dlZCcpIH07XG5cbiAgICAgIC8vIEhhbmRsZSB0aGUgcmVxdWVzdDpcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgaGFuZGxlckZ1bmN0aW9uKHJlcXVlc3QpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9XFxuJHsoZSBhcyBFcnJvcikuc3RhY2t9YCk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVycm9yIGhhbmRsaW5nXG4gICAgICByZXNwb25zZSA9IGF3YWl0IGVycm9ySGFuZGxlcihyZXF1ZXN0KTtcbiAgICB9IGNhdGNoIChlZSkge1xuICAgICAgcmVzcG9uc2UgPSB7IHN0YXR1c0NvZGU6IDUwMCwgYm9keTogeyBlcnJvcjogYEludGVybmFsIHNlcnZlciBlcnJvcjogJHtyZXF1ZXN0LnBhdGh9IFtlcnJvckhhbmRsZXJdYCB9IH07XG4gICAgfVxuICB9XG5cbiAgLy8gQVBJIEdhdGV3YXkgUHJveHkgcmVzdWx0XG4gIGNvbnN0IHJlc3VsdDogQVBJR2F0ZXdheVByb3h5UmVzdWx0ID0ge1xuICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c0NvZGUsXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UuYm9keSksXG4gICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycyxcbiAgfTtcblxuICAvLyBDb29raWVzIChpZiBzZXQpXG4gIGNvbnN0IGNvb2tpZUhlYWRlcnMgPSBidWlsZENvb2tpZShyZXNwb25zZS5jb29raWVzKTtcbiAgaWYgKGNvb2tpZUhlYWRlcnMpIHtcbiAgICByZXN1bHQubXVsdGlWYWx1ZUhlYWRlcnMgPSB7XG4gICAgICBDb29raWU6IGNvb2tpZUhlYWRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iXX0=
@@ -0,0 +1,45 @@
1
+ import { APIGatewayProxyEvent } from 'aws-lambda';
2
+ import { Request } from './types';
3
+ /**
4
+ * Ensures the path is lowercased, always has a leading slash and never a trailing slash
5
+ * @param path APIGatewayProxyEvent.path
6
+ */
7
+ export declare function standardPath(path: string): string;
8
+ /**
9
+ * Ensures a non-null object containing only query-string parameters that have a value.
10
+ * @param query APIGatewayProxyEvent.query
11
+ */
12
+ export declare function standardQueryParameters(query: {
13
+ [name: string]: string | undefined;
14
+ } | null): {
15
+ [name: string]: string;
16
+ };
17
+ /**
18
+ * Ensures all header names are lowercased for ease of access.
19
+ * @param headers APIGatewayProxyEvent.headers
20
+ */
21
+ export declare function standardHeaders(headers: {
22
+ [name: string]: string | undefined;
23
+ }): {
24
+ [name: string]: string;
25
+ };
26
+ /**
27
+ * Parses the body (if present) to a JSON string. Returns at mimimum an empty object.
28
+ * @param body APIGatewayProxyEvent.body
29
+ */
30
+ export declare function parseBody(body: string | null): {
31
+ [name: string]: string;
32
+ };
33
+ /**
34
+ * Parses the cookie, if any, returning at minimum an empty object.
35
+ * @param headers APIGatewayProxyEvent.headers
36
+ */
37
+ export declare function parseCookie(headers: {
38
+ [name: string]: string | undefined;
39
+ }): {
40
+ [name: string]: string;
41
+ };
42
+ export declare function buildCookie(values: {
43
+ [key: string]: string;
44
+ } | undefined): string[] | undefined;
45
+ export declare function parseRequest(event: APIGatewayProxyEvent): Request;
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.parseRequest = exports.buildCookie = exports.parseCookie = exports.parseBody = exports.standardHeaders = exports.standardQueryParameters = exports.standardPath = void 0;
27
+ const cookie = __importStar(require("cookie"));
28
+ /**
29
+ * Ensures the path is lowercased, always has a leading slash and never a trailing slash
30
+ * @param path APIGatewayProxyEvent.path
31
+ */
32
+ function standardPath(path) {
33
+ // Get path segments, filtering out any blanks
34
+ const segments = path.split('/').filter((segment) => segment);
35
+ // Return path
36
+ return `/${segments.join('/').toLowerCase()}`;
37
+ }
38
+ exports.standardPath = standardPath;
39
+ /**
40
+ * Ensures a non-null object containing only query-string parameters that have a value.
41
+ * @param query APIGatewayProxyEvent.query
42
+ */
43
+ function standardQueryParameters(query) {
44
+ if (!query)
45
+ return {};
46
+ const result = {};
47
+ Object.keys(query).forEach((parameter) => {
48
+ const value = query[parameter];
49
+ if (value)
50
+ result[parameter] = value;
51
+ });
52
+ return result;
53
+ }
54
+ exports.standardQueryParameters = standardQueryParameters;
55
+ /**
56
+ * Ensures all header names are lowercased for ease of access.
57
+ * @param headers APIGatewayProxyEvent.headers
58
+ */
59
+ function standardHeaders(headers) {
60
+ const result = {};
61
+ Object.keys(headers).forEach((name) => {
62
+ const value = headers[name];
63
+ if (value)
64
+ result[name.toLowerCase()] = value;
65
+ });
66
+ return result;
67
+ }
68
+ exports.standardHeaders = standardHeaders;
69
+ /**
70
+ * Parses the body (if present) to a JSON string. Returns at mimimum an empty object.
71
+ * @param body APIGatewayProxyEvent.body
72
+ */
73
+ function parseBody(body) {
74
+ if (!body)
75
+ return {};
76
+ let result = {};
77
+ try {
78
+ result = JSON.parse(body);
79
+ }
80
+ catch (e) {
81
+ console.error(`Error parsing request body: ${e}`);
82
+ }
83
+ return result;
84
+ }
85
+ exports.parseBody = parseBody;
86
+ /**
87
+ * Parses the cookie, if any, returning at minimum an empty object.
88
+ * @param headers APIGatewayProxyEvent.headers
89
+ */
90
+ function parseCookie(headers) {
91
+ const header = headers.cookie || headers.Cookie || '';
92
+ return cookie.parse(header);
93
+ }
94
+ exports.parseCookie = parseCookie;
95
+ function buildCookie(values) {
96
+ if (!values)
97
+ return undefined;
98
+ const header = [];
99
+ const oneYear = 60 * 60 * 24 * 365;
100
+ Object.keys(values).forEach((key) => {
101
+ const value = values[key];
102
+ if (value === '') {
103
+ // If explicitly unset, expire the cookie value
104
+ header.push(cookie.serialize(key, '', {
105
+ expires: new Date(), secure: true, httpOnly: true, sameSite: 'strict',
106
+ }));
107
+ }
108
+ else if (value) {
109
+ // Otherwise, set it only if a value was given
110
+ header.push(cookie.serialize(key, value, {
111
+ maxAge: oneYear, secure: true, httpOnly: true, sameSite: 'strict',
112
+ }));
113
+ }
114
+ });
115
+ return header;
116
+ }
117
+ exports.buildCookie = buildCookie;
118
+ function parseRequest(event) {
119
+ return {
120
+ method: event.httpMethod,
121
+ path: standardPath(event.path),
122
+ query: standardQueryParameters(event.queryStringParameters),
123
+ headers: standardHeaders(event.headers),
124
+ body: parseBody(event.body),
125
+ cookies: parseCookie(event.headers),
126
+ };
127
+ }
128
+ exports.parseRequest = parseRequest;
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsK0NBQWlDO0FBR2pDOzs7R0FHRztBQUNILFNBQWdCLFlBQVksQ0FBQyxJQUFZO0lBQ3ZDLDhDQUE4QztJQUM5QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUQsY0FBYztJQUNkLE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7QUFDaEQsQ0FBQztBQUxELG9DQUtDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQUMsS0FBcUQ7SUFDM0YsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN0QixNQUFNLE1BQU0sR0FBZ0MsRUFBRSxDQUFDO0lBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7UUFDdkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9CLElBQUksS0FBSztZQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBUkQsMERBUUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixlQUFlLENBQUMsT0FBZ0Q7SUFDOUUsTUFBTSxNQUFNLEdBQWdDLEVBQUUsQ0FBQztJQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixJQUFJLEtBQUs7WUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQVBELDBDQU9DO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLElBQW1CO0lBQzNDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDckIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLElBQUk7UUFDRixNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUMzQjtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNuRDtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFURCw4QkFTQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxPQUFnRDtJQUMxRSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM5QixDQUFDO0FBSEQsa0NBR0M7QUFFRCxTQUFnQixXQUFXLENBQUMsTUFBOEM7SUFDeEUsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUU5QixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsTUFBTSxPQUFPLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBRW5DLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDbEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRTtZQUNoQiwrQ0FBK0M7WUFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUU7Z0JBQ3BDLE9BQU8sRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUTthQUN0RSxDQUFDLENBQUMsQ0FBQztTQUNMO2FBQU0sSUFBSSxLQUFLLEVBQUU7WUFDaEIsOENBQThDO1lBQzlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFO2dCQUN2QyxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUTthQUNsRSxDQUFDLENBQUMsQ0FBQztTQUNMO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBdEJELGtDQXNCQztBQUVELFNBQWdCLFlBQVksQ0FBQyxLQUEyQjtJQUN0RCxPQUFPO1FBQ0wsTUFBTSxFQUFFLEtBQUssQ0FBQyxVQUFVO1FBQ3hCLElBQUksRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUM5QixLQUFLLEVBQUUsdUJBQXVCLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDO1FBQzNELE9BQU8sRUFBRSxlQUFlLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUN2QyxJQUFJLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDM0IsT0FBTyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0tBQ3BDLENBQUM7QUFDSixDQUFDO0FBVEQsb0NBU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBUElHYXRld2F5UHJveHlFdmVudCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgY29va2llIGZyb20gJ2Nvb2tpZSc7XG5pbXBvcnQgeyBSZXF1ZXN0IH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgcGF0aCBpcyBsb3dlcmNhc2VkLCBhbHdheXMgaGFzIGEgbGVhZGluZyBzbGFzaCBhbmQgbmV2ZXIgYSB0cmFpbGluZyBzbGFzaFxuICogQHBhcmFtIHBhdGggQVBJR2F0ZXdheVByb3h5RXZlbnQucGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhbmRhcmRQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEdldCBwYXRoIHNlZ21lbnRzLCBmaWx0ZXJpbmcgb3V0IGFueSBibGFua3NcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcvJykuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50KTtcbiAgLy8gUmV0dXJuIHBhdGhcbiAgcmV0dXJuIGAvJHtzZWdtZW50cy5qb2luKCcvJykudG9Mb3dlckNhc2UoKX1gO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgYSBub24tbnVsbCBvYmplY3QgY29udGFpbmluZyBvbmx5IHF1ZXJ5LXN0cmluZyBwYXJhbWV0ZXJzIHRoYXQgaGF2ZSBhIHZhbHVlLlxuICogQHBhcmFtIHF1ZXJ5IEFQSUdhdGV3YXlQcm94eUV2ZW50LnF1ZXJ5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFuZGFyZFF1ZXJ5UGFyYW1ldGVycyhxdWVyeTogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkOyB9IHwgbnVsbCk6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZzsgfSB7XG4gIGlmICghcXVlcnkpIHJldHVybiB7fTtcbiAgY29uc3QgcmVzdWx0OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmc7IH0gPSB7fTtcbiAgT2JqZWN0LmtleXMocXVlcnkpLmZvckVhY2goKHBhcmFtZXRlcikgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gcXVlcnlbcGFyYW1ldGVyXTtcbiAgICBpZiAodmFsdWUpIHJlc3VsdFtwYXJhbWV0ZXJdID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEVuc3VyZXMgYWxsIGhlYWRlciBuYW1lcyBhcmUgbG93ZXJjYXNlZCBmb3IgZWFzZSBvZiBhY2Nlc3MuXG4gKiBAcGFyYW0gaGVhZGVycyBBUElHYXRld2F5UHJveHlFdmVudC5oZWFkZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFuZGFyZEhlYWRlcnMoaGVhZGVyczogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkOyB9KTogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nOyB9IHtcbiAgY29uc3QgcmVzdWx0OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmc7IH0gPSB7fTtcbiAgT2JqZWN0LmtleXMoaGVhZGVycykuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gaGVhZGVyc1tuYW1lXTtcbiAgICBpZiAodmFsdWUpIHJlc3VsdFtuYW1lLnRvTG93ZXJDYXNlKCldID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgYm9keSAoaWYgcHJlc2VudCkgdG8gYSBKU09OIHN0cmluZy4gUmV0dXJucyBhdCBtaW1pbXVtIGFuIGVtcHR5IG9iamVjdC5cbiAqIEBwYXJhbSBib2R5IEFQSUdhdGV3YXlQcm94eUV2ZW50LmJvZHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQm9keShib2R5OiBzdHJpbmcgfCBudWxsKTogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nOyB9IHtcbiAgaWYgKCFib2R5KSByZXR1cm4ge307XG4gIGxldCByZXN1bHQgPSB7fTtcbiAgdHJ5IHtcbiAgICByZXN1bHQgPSBKU09OLnBhcnNlKGJvZHkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihgRXJyb3IgcGFyc2luZyByZXF1ZXN0IGJvZHk6ICR7ZX1gKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgY29va2llLCBpZiBhbnksIHJldHVybmluZyBhdCBtaW5pbXVtIGFuIGVtcHR5IG9iamVjdC5cbiAqIEBwYXJhbSBoZWFkZXJzIEFQSUdhdGV3YXlQcm94eUV2ZW50LmhlYWRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29va2llKGhlYWRlcnM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZDsgfSk6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZzsgfSB7XG4gIGNvbnN0IGhlYWRlciA9IGhlYWRlcnMuY29va2llIHx8IGhlYWRlcnMuQ29va2llIHx8ICcnO1xuICByZXR1cm4gY29va2llLnBhcnNlKGhlYWRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvb2tpZSh2YWx1ZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgdW5kZWZpbmVkKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlcykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBoZWFkZXI6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IG9uZVllYXIgPSA2MCAqIDYwICogMjQgKiAzNjU7XG5cbiAgT2JqZWN0LmtleXModmFsdWVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1trZXldO1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIC8vIElmIGV4cGxpY2l0bHkgdW5zZXQsIGV4cGlyZSB0aGUgY29va2llIHZhbHVlXG4gICAgICBoZWFkZXIucHVzaChjb29raWUuc2VyaWFsaXplKGtleSwgJycsIHtcbiAgICAgICAgZXhwaXJlczogbmV3IERhdGUoKSwgc2VjdXJlOiB0cnVlLCBodHRwT25seTogdHJ1ZSwgc2FtZVNpdGU6ICdzdHJpY3QnLFxuICAgICAgfSkpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgIC8vIE90aGVyd2lzZSwgc2V0IGl0IG9ubHkgaWYgYSB2YWx1ZSB3YXMgZ2l2ZW5cbiAgICAgIGhlYWRlci5wdXNoKGNvb2tpZS5zZXJpYWxpemUoa2V5LCB2YWx1ZSwge1xuICAgICAgICBtYXhBZ2U6IG9uZVllYXIsIHNlY3VyZTogdHJ1ZSwgaHR0cE9ubHk6IHRydWUsIHNhbWVTaXRlOiAnc3RyaWN0JyxcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBoZWFkZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlcXVlc3QoZXZlbnQ6IEFQSUdhdGV3YXlQcm94eUV2ZW50KTogUmVxdWVzdCB7XG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiBldmVudC5odHRwTWV0aG9kLFxuICAgIHBhdGg6IHN0YW5kYXJkUGF0aChldmVudC5wYXRoKSxcbiAgICBxdWVyeTogc3RhbmRhcmRRdWVyeVBhcmFtZXRlcnMoZXZlbnQucXVlcnlTdHJpbmdQYXJhbWV0ZXJzKSxcbiAgICBoZWFkZXJzOiBzdGFuZGFyZEhlYWRlcnMoZXZlbnQuaGVhZGVycyksXG4gICAgYm9keTogcGFyc2VCb2R5KGV2ZW50LmJvZHkpLFxuICAgIGNvb2tpZXM6IHBhcnNlQ29va2llKGV2ZW50LmhlYWRlcnMpLFxuICB9O1xufVxuIl19
@@ -0,0 +1,3 @@
1
+ export * from './handler';
2
+ export * as helpers from './helpers';
3
+ export * as types from './types';
package/dist/index.js ADDED
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
+ };
21
+ var __importStar = (this && this.__importStar) || function (mod) {
22
+ if (mod && mod.__esModule) return mod;
23
+ var result = {};
24
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
25
+ __setModuleDefault(result, mod);
26
+ return result;
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.types = exports.helpers = void 0;
30
+ __exportStar(require("./handler"), exports);
31
+ exports.helpers = __importStar(require("./helpers"));
32
+ exports.types = __importStar(require("./types"));
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBMEI7QUFDMUIscURBQXFDO0FBQ3JDLGlEQUFpQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vaGFuZGxlcic7XG5leHBvcnQgKiBhcyBoZWxwZXJzIGZyb20gJy4vaGVscGVycyc7XG5leHBvcnQgKiBhcyB0eXBlcyBmcm9tICcuL3R5cGVzJztcbiJdfQ==
@@ -0,0 +1,39 @@
1
+ export interface Request {
2
+ method: string;
3
+ path: string;
4
+ query: {
5
+ [name: string]: string;
6
+ };
7
+ headers: {
8
+ [name: string]: string;
9
+ };
10
+ cookies: {
11
+ [name: string]: string;
12
+ };
13
+ body: {
14
+ [name: string]: string;
15
+ };
16
+ }
17
+ export interface Response {
18
+ statusCode: number;
19
+ headers?: {
20
+ [name: string]: string;
21
+ };
22
+ cookies?: {
23
+ [name: string]: string;
24
+ };
25
+ body?: {
26
+ [name: string]: any;
27
+ };
28
+ }
29
+ export type Handler = (request: Request) => Promise<Response>;
30
+ export interface Route {
31
+ GET?: Handler;
32
+ POST?: Handler;
33
+ PUT?: Handler;
34
+ DELETE?: Handler;
35
+ OPTIONS?: Handler;
36
+ }
37
+ export interface Routes {
38
+ [path: string]: Route;
39
+ }
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdCB7XG4gIG1ldGhvZDogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIHF1ZXJ5OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmc7IH0sXG4gIGhlYWRlcnM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZzsgfSxcbiAgY29va2llczogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nOyB9LFxuICBib2R5OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmc7IH0sXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2Uge1xuICBzdGF0dXNDb2RlOiBudW1iZXIsXG4gIGhlYWRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmc7IH0sXG4gIGNvb2tpZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmc7IH0sXG4gIGJvZHk/OiB7IFtuYW1lOiBzdHJpbmddOiBhbnk7IH0sXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuZXhwb3J0IHR5cGUgSGFuZGxlciA9IChyZXF1ZXN0OiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPjtcbmV4cG9ydCBpbnRlcmZhY2UgUm91dGUge1xuICBHRVQ/OiBIYW5kbGVyLFxuICBQT1NUPzogSGFuZGxlcixcbiAgUFVUPzogSGFuZGxlcixcbiAgREVMRVRFPzogSGFuZGxlcixcbiAgT1BUSU9OUz86IEhhbmRsZXIsXG59XG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlcyB7IFtwYXRoOiBzdHJpbmddOiBSb3V0ZTsgfVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scloud/lambda-api",
3
- "version": "0.1.12",
3
+ "version": "0.1.14",
4
4
  "description": "Lambda handler for API Gateway proxy requests",
5
5
  "main": "dist/index.js",
6
6
  "files": [