@tsed/platform-serverless 6.70.1 → 6.72.0

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.
package/jest.config.js CHANGED
@@ -5,10 +5,10 @@ module.exports = {
5
5
  ...require("@tsed/jest-config")(__dirname, "platform-serverless"),
6
6
  coverageThreshold: {
7
7
  global: {
8
- branches: 71.05,
9
- functions: 84.31,
10
- lines: 91.75,
11
- statements: 91.53
8
+ branches: 75.56,
9
+ functions: 87.76,
10
+ lines: 94.37,
11
+ statements: 94.1
12
12
  }
13
13
  }
14
14
  };
@@ -12,7 +12,6 @@ export declare class PlatformServerlessHandler {
12
12
  headers: {
13
13
  "x-request-id": string;
14
14
  };
15
- multiValueHeaders: Record<string, (string | number | boolean)[]>;
16
15
  isBase64Encoded: boolean;
17
16
  }>;
18
17
  private flush;
@@ -5,7 +5,7 @@ export interface ServerlessResponseOptions {
5
5
  context: Context;
6
6
  request: ServerlessRequest;
7
7
  }
8
- export declare type HeaderValue = Array<boolean | number | string> | boolean | number | string;
8
+ export declare type HeaderValue = boolean | number | string;
9
9
  /**
10
10
  * @platform
11
11
  */
package/lib/index.js CHANGED
@@ -6,9 +6,9 @@ var jsonMapper = require('@tsed/json-mapper');
6
6
  var platformExceptions = require('@tsed/platform-exceptions');
7
7
  var logger = require('@tsed/logger');
8
8
  var schema = require('@tsed/schema');
9
+ var uuid = require('uuid');
9
10
  var encodeUrl = require('encodeurl');
10
11
  var mime = require('mime');
11
- var statuses = require('statuses');
12
12
 
13
13
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
14
14
 
@@ -34,7 +34,6 @@ function _interopNamespace(e) {
34
34
 
35
35
  var encodeUrl__default = /*#__PURE__*/_interopDefaultLegacy(encodeUrl);
36
36
  var mime__namespace = /*#__PURE__*/_interopNamespace(mime);
37
- var statuses__default = /*#__PURE__*/_interopDefaultLegacy(statuses);
38
37
 
39
38
  function _extends() {
40
39
  _extends = Object.assign || function (target) {
@@ -83,35 +82,13 @@ function _classPrivateFieldLooseBase(receiver, privateKey) {
83
82
  return receiver;
84
83
  }
85
84
 
86
- function mapResponseHeaders(headers) {
87
- return Object.entries(headers).reduce((headers, [key, value]) => {
88
- if (core.isArray(value)) {
89
- return headers;
90
- }
91
-
92
- return _extends({}, headers, {
93
- [key]: value
94
- });
95
- }, {});
96
- }
97
- function mapResponseMultiValueHeaders(headers) {
98
- return Object.entries(headers).reduce((headers, [key, value]) => {
99
- if (!core.isArray(value)) {
100
- return headers;
101
- }
102
-
85
+ function mergeHeaders(specHeaders, headers) {
86
+ return Object.entries(specHeaders).reduce((headers, [key, item]) => {
87
+ key = key.toLowerCase();
103
88
  return _extends({}, headers, {
104
- [key]: value
89
+ [key]: headers[key] === undefined ? String(item.example) : headers[key]
105
90
  });
106
- }, {});
107
- }
108
-
109
- function toHeaders(headers) {
110
- return Object.entries(headers).reduce((headers, [key, item]) => {
111
- return _extends({}, headers, {
112
- [key]: item.example
113
- });
114
- }, {});
91
+ }, headers);
115
92
  }
116
93
  /**
117
94
  * @ignore
@@ -134,15 +111,13 @@ function setResponseHeaders(ctx) {
134
111
  response.status(operation.getStatus());
135
112
  }
136
113
 
114
+ const statusCode = response.statusCode;
137
115
  const headers = operation.getHeadersOf(response.statusCode);
138
- response.setHeaders(toHeaders(headers));
116
+ const mergedHeaders = mergeHeaders(headers, response.getHeaders());
117
+ response.setHeaders(mergedHeaders);
139
118
 
140
- if (endpoint.redirect) {
141
- response.redirect(endpoint.redirect.status, endpoint.redirect.url);
142
- }
143
-
144
- if (endpoint.location) {
145
- response.location(endpoint.location);
119
+ if (operation.isRedirection(statusCode)) {
120
+ response.redirect(statusCode, String(mergedHeaders["location"]));
146
121
  }
147
122
  }
148
123
 
@@ -191,10 +166,9 @@ exports.PlatformServerlessHandler = class PlatformServerlessHandler {
191
166
  const response = {
192
167
  statusCode: $ctx.response.getStatus(),
193
168
  body: body === undefined ? "" : body,
194
- headers: _extends({}, mapResponseHeaders($ctx.response.getHeaders()), {
169
+ headers: _extends({}, $ctx.response.getHeaders(), {
195
170
  "x-request-id": $ctx.id
196
171
  }),
197
- multiValueHeaders: mapResponseMultiValueHeaders($ctx.response.getHeaders()),
198
172
  isBase64Encoded: false
199
173
  };
200
174
  $ctx.destroy();
@@ -472,6 +446,17 @@ class ServerlessResponse {
472
446
 
473
447
  setHeader(key, item) {
474
448
  if (item !== null && item !== undefined) {
449
+ key = key.toLowerCase();
450
+
451
+ if (key === "location") {
452
+ // "back" is an alias for the referrer
453
+ if (item === "back") {
454
+ item = this.request.get("Referrer") || "/";
455
+ }
456
+
457
+ item = encodeUrl__default['default'](String(item));
458
+ }
459
+
475
460
  _classPrivateFieldLooseBase(this, _headers)[_headers] = _extends({}, _classPrivateFieldLooseBase(this, _headers)[_headers], {
476
461
  [key.toLowerCase()]: item
477
462
  });
@@ -524,7 +509,7 @@ class ServerlessResponse {
524
509
  redirect(status, url) {
525
510
  // Set location header
526
511
  const address = this.location(url).get("Location");
527
- const body = `${statuses__default['default'][status]}. Redirecting to ${address}`;
512
+ const body = `${schema.getStatusMessage(status)}. Redirecting to ${address}`;
528
513
  this.status(status).set("Content-Length", Buffer.byteLength(body)).body(body);
529
514
  return this;
530
515
  }
@@ -536,14 +521,7 @@ class ServerlessResponse {
536
521
 
537
522
 
538
523
  location(url) {
539
- let loc = url; // "back" is an alias for the referrer
540
-
541
- if (url === "back") {
542
- loc = this.request.get("Referrer") || "/";
543
- } // set location
544
-
545
-
546
- return this.set("Location", encodeUrl__default['default'](loc));
524
+ return this.set("Location", url);
547
525
  }
548
526
  /**
549
527
  * Send any data to your consumer.
@@ -621,10 +599,20 @@ class ServerlessContext extends di.DIContext {
621
599
 
622
600
  }
623
601
 
602
+ function getReqId(event, context) {
603
+ var _event$requestContext;
604
+
605
+ if (event != null && event.headers && event.headers["x-request-id"]) {
606
+ return event.headers["x-request-id"];
607
+ }
608
+
609
+ return (event == null ? void 0 : (_event$requestContext = event.requestContext) == null ? void 0 : _event$requestContext.requestId) || (context == null ? void 0 : context.awsRequestId) || uuid.v4().replace(/-/gi, "");
610
+ }
624
611
  /**
625
612
  * @platform
626
613
  */
627
614
 
615
+
628
616
  var _injector = /*#__PURE__*/_classPrivateFieldLooseKey("injector");
629
617
 
630
618
  var _promise = /*#__PURE__*/_classPrivateFieldLooseKey("promise");
@@ -697,7 +685,7 @@ class PlatformServerless {
697
685
  const $ctx = new ServerlessContext({
698
686
  event,
699
687
  context,
700
- id: event.requestContext.requestId,
688
+ id: getReqId(event, context),
701
689
  logger: this.injector.logger,
702
690
  injector: this.injector,
703
691
  endpoint: entity
@@ -856,6 +844,11 @@ class LambdaClientRequest extends Promise {
856
844
  return this;
857
845
  }
858
846
 
847
+ headers(headers) {
848
+ this.event.headers = _extends({}, this.event.headers, JSON.parse(JSON.stringify(headers)));
849
+ return this;
850
+ }
851
+
859
852
  body(body) {
860
853
  if (body !== undefined) {
861
854
  this.event.headers["content-type"] = "application/json";
@@ -909,7 +902,7 @@ class PlatformServerlessTest extends di.DITest {
909
902
  endpoint
910
903
  }) {
911
904
  const context = LambdaClientRequest.createFakeContext();
912
- const event = LambdaClientRequest.createFakeContext();
905
+ const event = LambdaClientRequest.createFakeEvent();
913
906
  return new ServerlessContext({
914
907
  event,
915
908
  context,
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/utils/mapResponseHeaders.ts","../src/utils/setResponseHeaders.ts","../src/builder/PlatformServerlessHandler.ts","../src/domain/ServerlessRequest.ts","../src/domain/ServerlessResponse.ts","../src/domain/ServerlessContext.ts","../src/builder/PlatformServerless.ts","../src/services/PlatformServerlessTest.ts","../src/decorators/lambda.ts"],"sourcesContent":["import {HeaderValue} from \"../domain/ServerlessResponse\";\nimport {isArray} from \"@tsed/core\";\n\nexport function mapResponseHeaders(headers: Record<string, HeaderValue>): Record<string, boolean | string | number> {\n return Object.entries(headers).reduce((headers, [key, value]) => {\n if (isArray(value)) {\n return headers;\n }\n return {\n ...headers,\n [key]: value\n };\n }, {});\n}\n\nexport function mapResponseMultiValueHeaders(headers: Record<string, HeaderValue>): Record<string, Array<boolean | string | number>> {\n return Object.entries(headers).reduce((headers, [key, value]) => {\n if (!isArray(value)) {\n return headers;\n }\n\n return {\n ...headers,\n [key]: value\n };\n }, {});\n}\n","import {ServerlessContext} from \"../domain/ServerlessContext\";\n\nfunction toHeaders(headers: {[key: string]: any}) {\n return Object.entries(headers).reduce((headers, [key, item]) => {\n return {\n ...headers,\n [key]: item.example as any\n };\n }, {});\n}\n\n/**\n * @ignore\n */\nexport function setResponseHeaders(ctx: ServerlessContext) {\n const {response, endpoint} = ctx;\n const operation = endpoint.operation!;\n\n if (response.isDone()) {\n return;\n }\n\n if (!response.hasStatus()) {\n // apply status only if the isn't already modified\n response.status(operation.getStatus());\n }\n\n const headers = operation.getHeadersOf(response.statusCode);\n response.setHeaders(toHeaders(headers));\n\n if (endpoint.redirect) {\n response.redirect(endpoint.redirect.status, endpoint.redirect.url);\n }\n\n if (endpoint.location) {\n response.location(endpoint.location);\n }\n}\n","import {AnyPromiseResult, AnyToPromise, isBoolean, isNumber, isStream, isString} from \"@tsed/core\";\nimport {BaseContext, Inject, Injectable, InjectorService, ProviderScope, TokenProvider} from \"@tsed/di\";\nimport {serialize} from \"@tsed/json-mapper\";\nimport {PlatformExceptions} from \"@tsed/platform-exceptions\";\nimport {DeserializerPipe, PlatformParams, ValidationPipe} from \"@tsed/platform-params\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\nimport {mapResponseHeaders, mapResponseMultiValueHeaders} from \"../utils/mapResponseHeaders\";\nimport {setResponseHeaders} from \"../utils/setResponseHeaders\";\n\nfunction shouldBeSent(data: any) {\n return Buffer.isBuffer(data) || isBoolean(data) || isNumber(data) || isString(data) || data === null;\n}\n\nfunction shouldBeSerialized(data: any) {\n return !(isStream(data) || shouldBeSent(data) || data === undefined);\n}\n\n@Injectable({\n scope: ProviderScope.SINGLETON,\n imports: [DeserializerPipe, ValidationPipe]\n})\nexport class PlatformServerlessHandler {\n @Inject()\n protected injector: InjectorService;\n\n @Inject()\n protected params: PlatformParams;\n\n @Inject()\n protected exceptions: PlatformExceptions;\n\n createHandler(token: TokenProvider, propertyKey: string | symbol) {\n const promisedHandler = this.params.compileHandler({\n token,\n propertyKey\n });\n\n return async ($ctx: ServerlessContext) => {\n await this.injector.emit(\"$onRequest\", $ctx);\n\n await this.injector.runInContext($ctx, async () => {\n try {\n const resolver = new AnyToPromise();\n const handler = await promisedHandler;\n const result = await resolver.call(() => handler({$ctx}));\n\n this.processResult(result, $ctx);\n } catch (er) {\n $ctx.response.status(500).body(er);\n await this.exceptions.catch(er, ($ctx as unknown) as BaseContext);\n }\n });\n\n await this.injector.emit(\"$onResponse\", $ctx);\n\n return this.flush($ctx);\n };\n }\n\n private flush($ctx: ServerlessContext) {\n setResponseHeaders($ctx);\n\n let body: any = $ctx.response.getBody();\n\n if (shouldBeSerialized(body)) {\n body = JSON.stringify(body);\n }\n\n const response = {\n statusCode: $ctx.response.getStatus(),\n body: body === undefined ? \"\" : body,\n headers: {\n ...mapResponseHeaders($ctx.response.getHeaders()),\n \"x-request-id\": $ctx.id\n },\n multiValueHeaders: mapResponseMultiValueHeaders($ctx.response.getHeaders()),\n isBase64Encoded: false\n };\n\n $ctx.destroy();\n\n return response;\n }\n\n private processResult({status, headers, data}: AnyPromiseResult, $ctx: ServerlessContext) {\n if (status) {\n $ctx.response.status(status);\n }\n\n if (headers) {\n $ctx.response.setHeaders(headers);\n }\n\n if (data !== undefined) {\n data = $ctx.response.getStatus() !== 204 ? data : \"\";\n\n if (shouldBeSerialized(data)) {\n data = serialize(data, {\n ...$ctx.endpoint.getResponseOptions()\n });\n }\n\n $ctx.response.body(data);\n }\n }\n}\n","import type {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, Context} from \"aws-lambda\";\nimport {getValue} from \"@tsed/core\";\n\nexport interface ServerlessRequestOptions {\n event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n context: Context;\n}\n/**\n * @platform\n */\nexport class ServerlessRequest {\n readonly raw: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n\n constructor({event}: ServerlessRequestOptions) {\n this.raw = event;\n }\n\n get secure(): boolean {\n return true;\n }\n\n get host(): string {\n return this.get(\"host\");\n }\n\n get protocol(): string {\n return \"https\";\n }\n\n /**\n * Get the url of the request.\n *\n * Is equivalent of `express.response.originalUrl || express.response.url`.\n */\n get url(): string {\n return this.raw.path;\n }\n\n get headers() {\n return this.raw.headers;\n }\n\n get method(): string {\n return this.raw.httpMethod;\n }\n\n /**\n * Contains key-value pairs of data submitted in the request body. By default, it is `undefined`, and is populated when you use\n * `body-parsing` middleware such as `express.json()` or `express.urlencoded()`.\n */\n get body(): any {\n try {\n return this.raw.body ? JSON.parse(this.raw.body) : {};\n } catch (er) {\n return {};\n }\n }\n\n get rawBody(): any {\n return this.raw.body;\n }\n\n /**\n * This property is an object containing properties mapped to the named route `parameters`.\n * For example, if you have the route `/user/:name`, then the `name` property is available as `req.params.name`.\n * This object defaults to `{}`.\n */\n get params(): {[key: string]: any} {\n return this.raw.pathParameters || {};\n }\n\n /**\n * This property is an object containing a property for each query string parameter in the route.\n * When query parser is set to disabled, it is an empty object `{}`, otherwise it is the result of the configured query parser.\n */\n get query(): {[key: string]: any} {\n return this.raw.queryStringParameters || {};\n }\n\n /**\n * Returns the HTTP request header specified by field. The match is case-insensitive.\n *\n * ```typescript\n * request.get('Content-Type') // => \"text/plain\"\n * ```\n *\n * @param name\n */\n get(name: string) {\n return getValue(this.raw.headers, name);\n }\n\n destroy() {}\n}\n","import {getValue} from \"@tsed/core\";\nimport type {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, Context} from \"aws-lambda\";\nimport encodeUrl from \"encodeurl\";\nimport * as mime from \"mime\";\nimport statuses from \"statuses\";\nimport type {ServerlessRequest} from \"./ServerlessRequest\";\n\nexport interface ServerlessResponseOptions {\n event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n context: Context;\n request: ServerlessRequest;\n}\n\nexport type HeaderValue = Array<boolean | number | string> | boolean | number | string;\n\n/**\n * @platform\n */\nexport class ServerlessResponse {\n readonly event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n readonly request: ServerlessRequest;\n\n #status: number = 200;\n #body: any = undefined;\n #headers: Record<string, HeaderValue> = {};\n #locals: Record<string, any> = {};\n #isHeadersSent = false;\n #endListeners: Function[] = [];\n\n constructor({event, request}: ServerlessResponseOptions) {\n this.event = event;\n this.request = request;\n }\n\n /**\n * Get the current statusCode\n */\n get statusCode() {\n return this.#status;\n }\n\n set statusCode(status) {\n this.#status = status;\n }\n\n /**\n * An object that contains response local variables scoped to the request, and therefore available only to the view(s) rendered during that request / response cycle (if any). Otherwise, this property is identical to app.locals.\n *\n * This property is useful for exposing request-level information such as the request path name, authenticated user, user settings, and so on.\n */\n get locals() {\n return this.#locals;\n }\n\n getStatus() {\n return this.#status;\n }\n\n /**\n * Sets the HTTP status for the response.\n *\n * @param status\n */\n status(status: number) {\n this.#status = status;\n return this;\n }\n\n set(name: string, value: any) {\n return this.setHeader(name, value);\n }\n\n /**\n * Returns the HTTP response header specified by field. The match is case-insensitive.\n *\n * ```typescript\n * response.get('Content-Type') // => \"text/plain\"\n * ```\n *\n * @param name\n */\n get(name: string): string | number | boolean | undefined {\n return getValue(this.#headers, name.toLowerCase());\n }\n\n getHeaders(): Record<string, HeaderValue> {\n return {\n ...this.#headers\n };\n }\n\n hasStatus() {\n return this.#status !== 200;\n }\n\n /**\n * Set header `field` to `val`, or pass\n * an object of header fields.\n *\n * Examples:\n * ```typescript\n * response.setHeaders({ Accept: 'text/plain', 'X-API-Key': 'tobi' });\n * ```\n *\n * Aliased as `res.header()`.\n */\n setHeaders(headers: Record<string, HeaderValue>) {\n // apply headers\n Object.entries(headers).forEach(([key, item]) => {\n this.setHeader(key, item);\n });\n\n return this;\n }\n\n setHeader(key: string, item: HeaderValue | null | undefined) {\n if (item !== null && item !== undefined) {\n this.#headers = {\n ...this.#headers,\n [key.toLowerCase()]: item\n };\n }\n\n return this;\n }\n\n /**\n * Set `Content-Type` response header with `type` through `mime.lookup()`\n * when it does not contain \"/\", or set the Content-Type to `type` otherwise.\n *\n * Examples:\n *\n * res.type('.html');\n * res.type('html');\n * res.type('json');\n * res.type('application/json');\n * res.type('png');\n */\n contentType(contentType: string) {\n this.setHeader(\"Content-Type\", mime.getType(contentType));\n\n return this;\n }\n\n contentLength(length: number) {\n this.setHeader(\"Content-Length\", length);\n return this;\n }\n\n getContentLength() {\n if (this.get(\"Content-Length\")) {\n return parseInt(this.get(\"Content-Length\") as any, 10) || 0;\n }\n }\n\n getContentType() {\n return String(this.get(\"Content-Type\") || \"\").split(\";\")[0];\n }\n\n /**\n * Redirects to the URL derived from the specified path, with specified status, a positive integer that corresponds to an [HTTP status code](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html).\n * If not specified, status defaults to `302 Found`.\n *\n * @param status\n * @param url\n */\n redirect(status: number, url: string) {\n // Set location header\n const address = this.location(url).get(\"Location\");\n const body = `${(statuses as any)[status]}. Redirecting to ${address}`;\n\n this.status(status).set(\"Content-Length\", Buffer.byteLength(body)).body(body);\n\n return this;\n }\n\n /**\n * Sets the response Location HTTP header to the specified path parameter.\n *\n * @param url\n */\n location(url: string) {\n let loc = url;\n\n // \"back\" is an alias for the referrer\n if (url === \"back\") {\n loc = this.request.get(\"Referrer\") || \"/\";\n }\n\n // set location\n return this.set(\"Location\", encodeUrl(loc));\n }\n\n /**\n * Send any data to your consumer.\n *\n * This method accept a ReadableStream, a plain object, boolean, string, number, null and undefined data.\n * It choose the better way to send the data.\n *\n * @param body\n */\n body(body: any) {\n this.#body = body;\n\n return this;\n }\n\n getBody() {\n return this.#body;\n }\n\n isDone(): boolean {\n return this.#isHeadersSent;\n }\n\n onEnd(cb: Function) {\n this.#endListeners.push(cb);\n\n return this;\n }\n\n destroy() {\n this.#endListeners.forEach((cb: Function) => cb());\n this.#isHeadersSent = true;\n }\n\n isHeadersSent() {\n return this.#isHeadersSent;\n }\n}\n","import {DIContext, DIContextOptions, LocalsContainer} from \"@tsed/di\";\nimport {JsonEntityStore} from \"@tsed/schema\";\nimport {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, Context} from \"aws-lambda\";\nimport {ServerlessRequest} from \"./ServerlessRequest\";\nimport {ServerlessResponse} from \"./ServerlessResponse\";\n\nexport interface ServerlessContextOptions extends DIContextOptions {\n event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n context: Context;\n endpoint: JsonEntityStore;\n}\n\nexport class ServerlessContext extends DIContext {\n readonly response: ServerlessResponse;\n readonly request: ServerlessRequest;\n readonly context: Context;\n readonly event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n readonly endpoint: JsonEntityStore;\n\n constructor({event, context, endpoint, ...options}: ServerlessContextOptions) {\n super({\n ...options,\n maxStackSize: 0\n });\n this.context = context;\n this.event = event;\n this.request = new ServerlessRequest({event, context});\n this.response = new ServerlessResponse({event, context, request: this.request});\n this.endpoint = endpoint;\n }\n\n async destroy() {\n await super.destroy();\n\n this.request.destroy();\n this.response.destroy();\n }\n}\n","import {Env, Type} from \"@tsed/core\";\nimport {createContainer, InjectorService, setLoggerLevel} from \"@tsed/di\";\nimport {$log, Logger} from \"@tsed/logger\";\nimport {JsonEntityStore} from \"@tsed/schema\";\nimport type {\n APIGatewayEventDefaultAuthorizerContext,\n APIGatewayProxyEventBase,\n APIGatewayProxyHandler,\n APIGatewayProxyResult,\n Context\n} from \"aws-lambda\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\nimport {PlatformServerlessHandler} from \"./PlatformServerlessHandler\";\n\n/**\n * @platform\n */\nexport class PlatformServerless {\n readonly name: string = \"PlatformServerless\";\n\n #injector: InjectorService;\n #promise: Promise<void>;\n\n get injector(): InjectorService {\n return this.#injector;\n }\n\n get settings() {\n return this.injector.settings;\n }\n\n get promise() {\n return this.#promise;\n }\n\n static bootstrap(settings: Partial<TsED.Configuration> & {lambda?: Type[]} = {}): PlatformServerless {\n const platform = new PlatformServerless();\n\n platform.bootstrap(settings);\n\n return platform;\n }\n\n public callbacks(tokens: Type | Type[] = [], exports = {}): Record<string, APIGatewayProxyHandler> {\n return this.settings\n .get<Type[]>(\"lambda\", [])\n .concat(tokens)\n .map((token) => {\n const store = JsonEntityStore.from(token);\n\n return [...store.children.values()].reduce((list, store) => {\n const operationId = store.operation?.get(\"operationId\");\n\n return operationId ? [...list, {store, operationId}] : list;\n }, []);\n })\n .flat()\n .reduce((exports, {store, operationId}) => {\n return {\n ...exports,\n [operationId]: this.callback(store.token, store.propertyName)\n };\n }, exports);\n }\n\n public callback(token: Type<any>, propertyKey: string): APIGatewayProxyHandler {\n const entity = JsonEntityStore.fromMethod(token, propertyKey);\n let handler: ($ctx: ServerlessContext) => Promise<APIGatewayProxyResult>;\n\n return async (event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>, context: Context) => {\n await this.#promise;\n\n if (!handler) {\n const platformHandler = this.#injector.get<PlatformServerlessHandler>(PlatformServerlessHandler)!;\n handler = await platformHandler.createHandler(token, propertyKey);\n }\n\n const $ctx = new ServerlessContext({\n event,\n context,\n id: event.requestContext.requestId,\n logger: this.injector.logger as Logger,\n injector: this.injector,\n endpoint: entity\n });\n\n return handler($ctx);\n };\n }\n\n public async ready() {\n await this.#injector.emit(\"$onReady\");\n }\n\n public async stop() {\n await this.#injector.emit(\"$onDestroy\");\n return this.injector.destroy();\n }\n\n protected bootstrap(settings: Partial<TsED.Configuration> = {}) {\n this.#promise = this.createInjector({\n ...settings,\n PLATFORM_NAME: this.name\n })\n .loadInjector()\n .then(() => this.ready());\n\n return this;\n }\n\n protected createInjector(settings: any) {\n this.#injector = new InjectorService();\n this.#injector.logger = $log;\n this.#injector.settings.set(settings);\n\n if (this.#injector.settings.get(\"env\") === Env.TEST && !settings?.logger?.level) {\n $log.stop();\n }\n\n return this;\n }\n\n protected async loadInjector() {\n const container = createContainer();\n\n setLoggerLevel(this.#injector);\n\n await this.#injector.emit(\"$beforeInit\");\n\n await this.#injector.load(container);\n\n await this.#injector.emit(\"$afterInit\");\n }\n}\n","import {Type} from \"@tsed/core\";\nimport {DITest} from \"@tsed/di\";\nimport {Logger} from \"@tsed/logger\";\nimport {JsonEntityStore} from \"@tsed/schema\";\nimport {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, APIGatewayProxyHandler, Context} from \"aws-lambda\";\nimport {APIGatewayProxyResult} from \"aws-lambda/trigger/api-gateway-proxy\";\nimport {PlatformServerless} from \"../builder/PlatformServerless\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\n\nexport interface LambdaPromiseResult extends Promise<APIGatewayProxyResult> {}\n\nexport class LambdaClientRequest extends Promise<APIGatewayProxyResult> {\n event = LambdaClientRequest.createFakeEvent();\n context = LambdaClientRequest.createFakeContext();\n\n static call(lambdaName: string) {\n const resolvers: any = {};\n const promise = new LambdaClientRequest((resolve, reject) => {\n resolvers.resolve = resolve;\n resolvers.reject = reject;\n });\n\n promise.init(lambdaName, resolvers.resolve, resolvers.reject);\n\n return promise;\n }\n\n static createFakeEvent(event: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n return {\n body: \"\",\n headers: {},\n httpMethod: \"\",\n isBase64Encoded: false,\n multiValueHeaders: {},\n multiValueQueryStringParameters: {},\n path: event.path || \"/\",\n pathParameters: {},\n queryStringParameters: {},\n resource: \"\",\n stageVariables: {},\n ...event,\n requestContext: {\n ...event?.requestContext,\n accountId: \"\",\n apiId: \"\",\n protocol: \"https\",\n httpMethod: \"\",\n identity: {} as any,\n path: event.path || \"/\",\n stage: \"\",\n requestId: \"requestId\",\n requestTimeEpoch: 0,\n resourceId: 1,\n resourcePath: event.path || \"/\"\n } as any\n } as APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n }\n\n static createFakeContext(context?: Context): Context {\n return {\n awsRequestId: \"awsRequestId\",\n callbackWaitsForEmptyEventLoop: false,\n functionName: \"\",\n functionVersion: \"\",\n invokedFunctionArn: \"\",\n logGroupName: \"\",\n logStreamName: \"\",\n memoryLimitInMB: \"\",\n ...(context || {})\n } as Context;\n }\n\n get(path: string, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"GET\";\n\n return this;\n }\n\n post(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"POST\";\n\n this.body(body);\n\n return this;\n }\n\n patch(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"PATCH\";\n\n this.body(body);\n\n return this;\n }\n\n put(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"PUT\";\n\n this.body(body);\n\n return this;\n }\n\n delete(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"POST\";\n\n this.body(body);\n\n return this;\n }\n\n query(query: any) {\n this.event.queryStringParameters = {\n ...this.event.queryStringParameters,\n ...JSON.parse(JSON.stringify(query))\n };\n\n return this;\n }\n\n params(pathParameters: any) {\n this.event.pathParameters = {\n ...this.event.pathParameters,\n ...JSON.parse(JSON.stringify(pathParameters))\n };\n\n return this;\n }\n\n body(body: any) {\n if (body !== undefined) {\n this.event.headers[\"content-type\"] = \"application/json\";\n\n this.event.body = JSON.stringify(body);\n }\n\n return this;\n }\n\n protected init(lambda: string, resolve: Function, reject: Function) {\n setTimeout(async () => {\n try {\n const result = await PlatformServerlessTest.callbacks[lambda](this.event, this.context, resolve as any);\n resolve(result as any);\n } catch (er) {\n reject(er);\n }\n });\n }\n}\n\nexport class PlatformServerlessTest extends DITest {\n static callbacks: Record<string, APIGatewayProxyHandler> = {};\n static instance: PlatformServerless;\n static request = LambdaClientRequest;\n\n static bootstrap(settings: Partial<TsED.Configuration & {lambda: Type[]}> = {}) {\n return async function before(): Promise<void> {\n // @ts-ignore\n const instance = await PlatformServerless.bootstrap(DITest.configure(settings));\n PlatformServerlessTest.instance = instance;\n PlatformServerlessTest.callbacks = instance.callbacks();\n // used by inject method\n DITest.injector = instance.injector;\n\n return instance.promise;\n };\n }\n\n /**\n * Resets the test injector of the test context, so it won't pollute your next test. Call this in your `tearDown` logic.\n */\n static async reset() {\n if (PlatformServerlessTest.instance) {\n await PlatformServerlessTest.instance.stop();\n }\n if (DITest.hasInjector()) {\n await DITest.injector.destroy();\n DITest._injector = null;\n }\n }\n\n static createServerlessContext({endpoint}: {endpoint: JsonEntityStore}) {\n const context: any = LambdaClientRequest.createFakeContext();\n const event: any = LambdaClientRequest.createFakeContext();\n\n return new ServerlessContext({\n event,\n context,\n id: context.awsRequestId,\n logger: PlatformServerlessTest.injector.logger as Logger,\n injector: PlatformServerlessTest.injector,\n endpoint\n });\n }\n}\n","import {useDecorators} from \"@tsed/core\";\nimport {JsonEntityFn, JsonSchemaObject, OperationId, OperationMethods, OperationPath} from \"@tsed/schema\";\n\nexport interface LambdaOptions {\n name?: string;\n path: string;\n method: OperationMethods | string;\n}\n\nexport interface LambdaChainedDecorators {\n <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>): TypedPropertyDescriptor<T> | void;\n\n /**\n *\n * @param name\n */\n Name(name: string): this;\n\n Method(method: string): this;\n\n Path(path: string): this;\n}\n/**\n * Declare a lambda endpoint.\n *\n * ```typescript\n * export class Lambda {\n *\n * }\n * ```\n *\n * @decorator\n */\nexport function Lambda(name?: string): LambdaChainedDecorators {\n const options: LambdaOptions = {\n path: \"/\",\n method: \"\",\n name\n };\n\n const decorator: any = JsonEntityFn((entity) => {\n return useDecorators(OperationPath(options.method, options.path), OperationId(options.name || String(entity.propertyKey)));\n });\n\n decorator.Name = (name: string) => {\n options.name = name;\n return decorator;\n };\n\n decorator.Path = (path: string) => {\n options.path = path;\n return decorator;\n };\n\n decorator.Method = (method: string) => {\n options.method = method;\n return decorator;\n };\n\n return decorator;\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Get(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.GET);\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Post(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.POST);\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Put(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.PUT);\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Patch(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.PATCH);\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Delete(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.DELETE);\n}\n"],"names":["mapResponseHeaders","headers","Object","entries","reduce","key","value","isArray","mapResponseMultiValueHeaders","toHeaders","item","example","setResponseHeaders","ctx","response","endpoint","operation","isDone","hasStatus","status","getStatus","getHeadersOf","statusCode","setHeaders","redirect","url","location","shouldBeSent","data","Buffer","isBuffer","isBoolean","isNumber","isString","shouldBeSerialized","isStream","undefined","PlatformServerlessHandler","createHandler","token","propertyKey","promisedHandler","params","compileHandler","$ctx","injector","emit","runInContext","resolver","AnyToPromise","handler","result","call","processResult","er","body","exceptions","catch","flush","getBody","JSON","stringify","getHeaders","id","multiValueHeaders","isBase64Encoded","destroy","serialize","getResponseOptions","__decorate","Inject","InjectorService","PlatformParams","PlatformExceptions","Injectable","scope","ProviderScope","SINGLETON","imports","DeserializerPipe","ValidationPipe","ServerlessRequest","constructor","event","raw","secure","host","get","protocol","path","method","httpMethod","parse","rawBody","pathParameters","query","queryStringParameters","name","getValue","ServerlessResponse","request","locals","set","setHeader","toLowerCase","forEach","contentType","mime","getType","contentLength","length","getContentLength","parseInt","getContentType","String","split","address","statuses","byteLength","loc","encodeUrl","onEnd","cb","push","isHeadersSent","ServerlessContext","DIContext","context","options","maxStackSize","PlatformServerless","settings","promise","bootstrap","platform","callbacks","tokens","exports","concat","map","store","JsonEntityStore","from","children","values","list","operationId","flat","callback","propertyName","entity","fromMethod","platformHandler","requestContext","requestId","logger","ready","stop","createInjector","PLATFORM_NAME","loadInjector","then","$log","Env","TEST","level","container","createContainer","setLoggerLevel","load","LambdaClientRequest","Promise","createFakeEvent","createFakeContext","lambdaName","resolvers","resolve","reject","init","multiValueQueryStringParameters","resource","stageVariables","accountId","apiId","identity","stage","requestTimeEpoch","resourceId","resourcePath","awsRequestId","callbackWaitsForEmptyEventLoop","functionName","functionVersion","invokedFunctionArn","logGroupName","logStreamName","memoryLimitInMB","assign","post","patch","put","delete","lambda","setTimeout","PlatformServerlessTest","DITest","before","instance","configure","reset","hasInjector","_injector","createServerlessContext","Lambda","decorator","JsonEntityFn","useDecorators","OperationPath","OperationId","Name","Path","Method","Get","OperationMethods","GET","Post","POST","Put","PUT","Patch","PATCH","Delete","DELETE"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAGgBA,mBAAmBC;AACjC,SAAOC,MAAM,CAACC,OAAP,CAAeF,OAAf,EAAwBG,MAAxB,CAA+B,CAACH,OAAD,EAAU,CAACI,GAAD,EAAMC,KAAN,CAAV;AACpC,QAAIC,YAAO,CAACD,KAAD,CAAX,EAAoB;AAClB,aAAOL,OAAP;AACD;;AACD,wBACKA,OADL;AAEE,OAACI,GAAD,GAAOC;AAFT;AAID,GARM,EAQJ,EARI,CAAP;AASD;SAEeE,6BAA6BP;AAC3C,SAAOC,MAAM,CAACC,OAAP,CAAeF,OAAf,EAAwBG,MAAxB,CAA+B,CAACH,OAAD,EAAU,CAACI,GAAD,EAAMC,KAAN,CAAV;AACpC,QAAI,CAACC,YAAO,CAACD,KAAD,CAAZ,EAAqB;AACnB,aAAOL,OAAP;AACD;;AAED,wBACKA,OADL;AAEE,OAACI,GAAD,GAAOC;AAFT;AAID,GATM,EASJ,EATI,CAAP;AAUD;;ACxBD,SAASG,SAAT,CAAmBR,OAAnB;AACE,SAAOC,MAAM,CAACC,OAAP,CAAeF,OAAf,EAAwBG,MAAxB,CAA+B,CAACH,OAAD,EAAU,CAACI,GAAD,EAAMK,IAAN,CAAV;AACpC,wBACKT,OADL;AAEE,OAACI,GAAD,GAAOK,IAAI,CAACC;AAFd;AAID,GALM,EAKJ,EALI,CAAP;AAMD;AAED;;;;;SAGgBC,mBAAmBC;AACjC,QAAM;AAACC,IAAAA,QAAD;AAAWC,IAAAA;AAAX,MAAuBF,GAA7B;AACA,QAAMG,SAAS,GAAGD,QAAQ,CAACC,SAA3B;;AAEA,MAAIF,QAAQ,CAACG,MAAT,EAAJ,EAAuB;AACrB;AACD;;AAED,MAAI,CAACH,QAAQ,CAACI,SAAT,EAAL,EAA2B;AACzB;AACAJ,IAAAA,QAAQ,CAACK,MAAT,CAAgBH,SAAS,CAACI,SAAV,EAAhB;AACD;;AAED,QAAMnB,OAAO,GAAGe,SAAS,CAACK,YAAV,CAAuBP,QAAQ,CAACQ,UAAhC,CAAhB;AACAR,EAAAA,QAAQ,CAACS,UAAT,CAAoBd,SAAS,CAACR,OAAD,CAA7B;;AAEA,MAAIc,QAAQ,CAACS,QAAb,EAAuB;AACrBV,IAAAA,QAAQ,CAACU,QAAT,CAAkBT,QAAQ,CAACS,QAAT,CAAkBL,MAApC,EAA4CJ,QAAQ,CAACS,QAAT,CAAkBC,GAA9D;AACD;;AAED,MAAIV,QAAQ,CAACW,QAAb,EAAuB;AACrBZ,IAAAA,QAAQ,CAACY,QAAT,CAAkBX,QAAQ,CAACW,QAA3B;AACD;AACF;;AC5BD,SAASC,YAAT,CAAsBC,IAAtB;AACE,SAAOC,MAAM,CAACC,QAAP,CAAgBF,IAAhB,KAAyBG,cAAS,CAACH,IAAD,CAAlC,IAA4CI,aAAQ,CAACJ,IAAD,CAApD,IAA8DK,aAAQ,CAACL,IAAD,CAAtE,IAAgFA,IAAI,KAAK,IAAhG;AACD;;AAED,SAASM,kBAAT,CAA4BN,IAA5B;AACE,SAAO,EAAEO,aAAQ,CAACP,IAAD,CAAR,IAAkBD,YAAY,CAACC,IAAD,CAA9B,IAAwCA,IAAI,KAAKQ,SAAnD,CAAP;AACD;;AAMYC,iCAAyB,GAAtC,MAAaA,yBAAb;AAUEC,EAAAA,aAAa,CAACC,KAAD,EAAuBC,WAAvB;AACX,UAAMC,eAAe,GAAG,KAAKC,MAAL,CAAYC,cAAZ,CAA2B;AACjDJ,MAAAA,KADiD;AAEjDC,MAAAA;AAFiD,KAA3B,CAAxB;AAKA,WAAO,MAAOI,IAAP;AACL,YAAM,KAAKC,QAAL,CAAcC,IAAd,CAAmB,YAAnB,EAAiCF,IAAjC,CAAN;AAEA,YAAM,KAAKC,QAAL,CAAcE,YAAd,CAA2BH,IAA3B,EAAiC;AACrC,YAAI;AACF,gBAAMI,QAAQ,GAAG,IAAIC,iBAAJ,EAAjB;AACA,gBAAMC,OAAO,GAAG,MAAMT,eAAtB;AACA,gBAAMU,MAAM,GAAG,MAAMH,QAAQ,CAACI,IAAT,CAAc,MAAMF,OAAO,CAAC;AAACN,YAAAA;AAAD,WAAD,CAA3B,CAArB;AAEA,eAAKS,aAAL,CAAmBF,MAAnB,EAA2BP,IAA3B;AACD,SAND,CAME,OAAOU,EAAP,EAAW;AACXV,UAAAA,IAAI,CAAC9B,QAAL,CAAcK,MAAd,CAAqB,GAArB,EAA0BoC,IAA1B,CAA+BD,EAA/B;AACA,gBAAM,KAAKE,UAAL,CAAgBC,KAAhB,CAAsBH,EAAtB,EAA2BV,IAA3B,CAAN;AACD;AACF,OAXK,CAAN;AAaA,YAAM,KAAKC,QAAL,CAAcC,IAAd,CAAmB,aAAnB,EAAkCF,IAAlC,CAAN;AAEA,aAAO,KAAKc,KAAL,CAAWd,IAAX,CAAP;AACD,KAnBD;AAoBD;;AAEOc,EAAAA,KAAK,CAACd,IAAD;AACXhC,IAAAA,kBAAkB,CAACgC,IAAD,CAAlB;AAEA,QAAIW,IAAI,GAAQX,IAAI,CAAC9B,QAAL,CAAc6C,OAAd,EAAhB;;AAEA,QAAIzB,kBAAkB,CAACqB,IAAD,CAAtB,EAA8B;AAC5BA,MAAAA,IAAI,GAAGK,IAAI,CAACC,SAAL,CAAeN,IAAf,CAAP;AACD;;AAED,UAAMzC,QAAQ,GAAG;AACfQ,MAAAA,UAAU,EAAEsB,IAAI,CAAC9B,QAAL,CAAcM,SAAd,EADG;AAEfmC,MAAAA,IAAI,EAAEA,IAAI,KAAKnB,SAAT,GAAqB,EAArB,GAA0BmB,IAFjB;AAGftD,MAAAA,OAAO,eACFD,kBAAkB,CAAC4C,IAAI,CAAC9B,QAAL,CAAcgD,UAAd,EAAD,CADhB;AAEL,wBAAgBlB,IAAI,CAACmB;AAFhB,QAHQ;AAOfC,MAAAA,iBAAiB,EAAExD,4BAA4B,CAACoC,IAAI,CAAC9B,QAAL,CAAcgD,UAAd,EAAD,CAPhC;AAQfG,MAAAA,eAAe,EAAE;AARF,KAAjB;AAWArB,IAAAA,IAAI,CAACsB,OAAL;AAEA,WAAOpD,QAAP;AACD;;AAEOuC,EAAAA,aAAa,CAAC;AAAClC,IAAAA,MAAD;AAASlB,IAAAA,OAAT;AAAkB2B,IAAAA;AAAlB,GAAD,EAA4CgB,IAA5C;AACnB,QAAIzB,MAAJ,EAAY;AACVyB,MAAAA,IAAI,CAAC9B,QAAL,CAAcK,MAAd,CAAqBA,MAArB;AACD;;AAED,QAAIlB,OAAJ,EAAa;AACX2C,MAAAA,IAAI,CAAC9B,QAAL,CAAcS,UAAd,CAAyBtB,OAAzB;AACD;;AAED,QAAI2B,IAAI,KAAKQ,SAAb,EAAwB;AACtBR,MAAAA,IAAI,GAAGgB,IAAI,CAAC9B,QAAL,CAAcM,SAAd,OAA8B,GAA9B,GAAoCQ,IAApC,GAA2C,EAAlD;;AAEA,UAAIM,kBAAkB,CAACN,IAAD,CAAtB,EAA8B;AAC5BA,QAAAA,IAAI,GAAGuC,oBAAS,CAACvC,IAAD,eACXgB,IAAI,CAAC7B,QAAL,CAAcqD,kBAAd,EADW,EAAhB;AAGD;;AAEDxB,MAAAA,IAAI,CAAC9B,QAAL,CAAcyC,IAAd,CAAmB3B,IAAnB;AACD;AACF;;;;AAjFDyC,kBADCC,SAAM,oCACaC,sFAApB;;AAGAF,kBADCC,SAAM,oCACWE,+FAAlB;;AAGAH,kBADCC,SAAM,oCACeG,2GAAtB;;AARWpC,iCAAyB,qBAJrCqC,aAAU,CAAC;AACVC,EAAAA,KAAK,EAAEC,gBAAa,CAACC,SADX;AAEVC,EAAAA,OAAO,EAAE,CAACC,+BAAD,EAAmBC,6BAAnB;AAFC,CAAD,IAIE3C,kCAAA;;ACdb;;;;MAGa4C;AAGXC,EAAAA,YAAY;AAACC,IAAAA;AAAD;AACV,SAAKC,GAAL,GAAWD,KAAX;AACD;;AAES,MAANE,MAAM;AACR,WAAO,IAAP;AACD;;AAEO,MAAJC,IAAI;AACN,WAAO,KAAKC,GAAL,CAAS,MAAT,CAAP;AACD;;AAEW,MAARC,QAAQ;AACV,WAAO,OAAP;AACD;AAED;;;;;;;AAKO,MAAH/D,GAAG;AACL,WAAO,KAAK2D,GAAL,CAASK,IAAhB;AACD;;AAEU,MAAPxF,OAAO;AACT,WAAO,KAAKmF,GAAL,CAASnF,OAAhB;AACD;;AAES,MAANyF,MAAM;AACR,WAAO,KAAKN,GAAL,CAASO,UAAhB;AACD;AAED;;;;;;AAIQ,MAAJpC,IAAI;AACN,QAAI;AACF,aAAO,KAAK6B,GAAL,CAAS7B,IAAT,GAAgBK,IAAI,CAACgC,KAAL,CAAW,KAAKR,GAAL,CAAS7B,IAApB,CAAhB,GAA4C,EAAnD;AACD,KAFD,CAEE,OAAOD,EAAP,EAAW;AACX,aAAO,EAAP;AACD;AACF;;AAEU,MAAPuC,OAAO;AACT,WAAO,KAAKT,GAAL,CAAS7B,IAAhB;AACD;AAED;;;;;;;AAKU,MAANb,MAAM;AACR,WAAO,KAAK0C,GAAL,CAASU,cAAT,IAA2B,EAAlC;AACD;AAED;;;;;;AAIS,MAALC,KAAK;AACP,WAAO,KAAKX,GAAL,CAASY,qBAAT,IAAkC,EAAzC;AACD;AAED;;;;;;;;;;;AASAT,EAAAA,GAAG,CAACU,IAAD;AACD,WAAOC,aAAQ,CAAC,KAAKd,GAAL,CAASnF,OAAV,EAAmBgG,IAAnB,CAAf;AACD;;AAED/B,EAAAA,OAAO;;;;AC7ET;;;;;;;;;;;;;;;;MAGaiC;AAWXjB,EAAAA,YAAY;AAACC,IAAAA,KAAD;AAAQiB,IAAAA;AAAR;;;;;;;;;;;;;;;;;;;;;;;;;AAPZ,0DAAkB,GAAlB;AACA,sDAAahE,SAAb;AACA,4DAAwC,EAAxC;AACA,0DAA+B,EAA/B;AACA,wEAAiB,KAAjB;AACA,sEAA4B,EAA5B;AAGE,SAAK+C,KAAL,GAAaA,KAAb;AACA,SAAKiB,OAAL,GAAeA,OAAf;AACD;;AAED;;;AAGc,MAAV9E,UAAU;AACZ,uCAAO,IAAP;AACD;;AAEa,MAAVA,UAAU,CAACH,MAAD;AACZ,0DAAeA,MAAf;AACD;AAED;;;;;;;AAKU,MAANkF,MAAM;AACR,uCAAO,IAAP;AACD;;AAEDjF,EAAAA,SAAS;AACP,uCAAO,IAAP;AACD;AAED;;;;;;;AAKAD,EAAAA,MAAM,CAACA,MAAD;AACJ,0DAAeA,MAAf;AACA,WAAO,IAAP;AACD;;AAEDmF,EAAAA,GAAG,CAACL,IAAD,EAAe3F,KAAf;AACD,WAAO,KAAKiG,SAAL,CAAeN,IAAf,EAAqB3F,KAArB,CAAP;AACD;AAED;;;;;;;;;;;AASAiF,EAAAA,GAAG,CAACU,IAAD;AACD,WAAOC,aAAQ,6BAAC,IAAD,uBAAgBD,IAAI,CAACO,WAAL,EAAhB,CAAf;AACD;;AAED1C,EAAAA,UAAU;AACR,oDACK,IADL;AAGD;;AAED5C,EAAAA,SAAS;AACP,WAAO,wDAAiB,GAAxB;AACD;AAED;;;;;;;;;;;;;AAWAK,EAAAA,UAAU,CAACtB,OAAD;AACR;AACAC,IAAAA,MAAM,CAACC,OAAP,CAAeF,OAAf,EAAwBwG,OAAxB,CAAgC,CAAC,CAACpG,GAAD,EAAMK,IAAN,CAAD;AAC9B,WAAK6F,SAAL,CAAelG,GAAf,EAAoBK,IAApB;AACD,KAFD;AAIA,WAAO,IAAP;AACD;;AAED6F,EAAAA,SAAS,CAAClG,GAAD,EAAcK,IAAd;AACP,QAAIA,IAAI,KAAK,IAAT,IAAiBA,IAAI,KAAK0B,SAA9B,EAAyC;AACvC,uGACK,IADL;AAEE,SAAC/B,GAAG,CAACmG,WAAJ,EAAD,GAAqB9F;AAFvB;AAID;;AAED,WAAO,IAAP;AACD;AAED;;;;;;;;;;;;;;AAYAgG,EAAAA,WAAW,CAACA,WAAD;AACT,SAAKH,SAAL,CAAe,cAAf,EAA+BI,eAAI,CAACC,OAAL,CAAaF,WAAb,CAA/B;AAEA,WAAO,IAAP;AACD;;AAEDG,EAAAA,aAAa,CAACC,MAAD;AACX,SAAKP,SAAL,CAAe,gBAAf,EAAiCO,MAAjC;AACA,WAAO,IAAP;AACD;;AAEDC,EAAAA,gBAAgB;AACd,QAAI,KAAKxB,GAAL,CAAS,gBAAT,CAAJ,EAAgC;AAC9B,aAAOyB,QAAQ,CAAC,KAAKzB,GAAL,CAAS,gBAAT,CAAD,EAAoC,EAApC,CAAR,IAAmD,CAA1D;AACD;AACF;;AAED0B,EAAAA,cAAc;AACZ,WAAOC,MAAM,CAAC,KAAK3B,GAAL,CAAS,cAAT,KAA4B,EAA7B,CAAN,CAAuC4B,KAAvC,CAA6C,GAA7C,EAAkD,CAAlD,CAAP;AACD;AAED;;;;;;;;;AAOA3F,EAAAA,QAAQ,CAACL,MAAD,EAAiBM,GAAjB;AACN;AACA,UAAM2F,OAAO,GAAG,KAAK1F,QAAL,CAAcD,GAAd,EAAmB8D,GAAnB,CAAuB,UAAvB,CAAhB;AACA,UAAMhC,IAAI,MAAO8D,4BAAgB,CAAClG,MAAD,qBAA4BiG,SAA7D;AAEA,SAAKjG,MAAL,CAAYA,MAAZ,EAAoBmF,GAApB,CAAwB,gBAAxB,EAA0CzE,MAAM,CAACyF,UAAP,CAAkB/D,IAAlB,CAA1C,EAAmEA,IAAnE,CAAwEA,IAAxE;AAEA,WAAO,IAAP;AACD;AAED;;;;;;;AAKA7B,EAAAA,QAAQ,CAACD,GAAD;AACN,QAAI8F,GAAG,GAAG9F,GAAV;;AAGA,QAAIA,GAAG,KAAK,MAAZ,EAAoB;AAClB8F,MAAAA,GAAG,GAAG,KAAKnB,OAAL,CAAab,GAAb,CAAiB,UAAjB,KAAgC,GAAtC;AACD;;;AAGD,WAAO,KAAKe,GAAL,CAAS,UAAT,EAAqBkB,6BAAS,CAACD,GAAD,CAA9B,CAAP;AACD;AAED;;;;;;;;;;AAQAhE,EAAAA,IAAI,CAACA,IAAD;AACF,sDAAaA,IAAb;AAEA,WAAO,IAAP;AACD;;AAEDI,EAAAA,OAAO;AACL,uCAAO,IAAP;AACD;;AAED1C,EAAAA,MAAM;AACJ,uCAAO,IAAP;AACD;;AAEDwG,EAAAA,KAAK,CAACC,EAAD;AACH,oEAAmBC,IAAnB,CAAwBD,EAAxB;;AAEA,WAAO,IAAP;AACD;;AAEDxD,EAAAA,OAAO;AACL,oEAAmBuC,OAAnB,CAA4BiB,EAAD,IAAkBA,EAAE,EAA/C;;AACA,wEAAsB,IAAtB;AACD;;AAEDE,EAAAA,aAAa;AACX,uCAAO,IAAP;AACD;;;;;MCxNUC,0BAA0BC;AAOrC5C,EAAAA;QAAY;AAACC,MAAAA,KAAD;AAAQ4C,MAAAA,OAAR;AAAiBhH,MAAAA;AAAjB;QAA8BiH;;AACxC,uBACKA,OADL;AAEEC,MAAAA,YAAY,EAAE;AAFhB;AAIA,SAAKF,OAAL,GAAeA,OAAf;AACA,SAAK5C,KAAL,GAAaA,KAAb;AACA,SAAKiB,OAAL,GAAe,IAAInB,iBAAJ,CAAsB;AAACE,MAAAA,KAAD;AAAQ4C,MAAAA;AAAR,KAAtB,CAAf;AACA,SAAKjH,QAAL,GAAgB,IAAIqF,kBAAJ,CAAuB;AAAChB,MAAAA,KAAD;AAAQ4C,MAAAA,OAAR;AAAiB3B,MAAAA,OAAO,EAAE,KAAKA;AAA/B,KAAvB,CAAhB;AACA,SAAKrF,QAAL,GAAgBA,QAAhB;AACD;;AAEY,QAAPmD,OAAO;AACX,UAAM,MAAMA,OAAN,EAAN;AAEA,SAAKkC,OAAL,CAAalC,OAAb;AACA,SAAKpD,QAAL,CAAcoD,OAAd;AACD;;;;ACtBH;;;;;;;;MAGagE;AAAbhD,EAAAA;;;;;;;;;AACW,aAAA,GAAe,oBAAf;AAmHV;;AA9Ga,MAARrC,QAAQ;AACV,uCAAO,IAAP;AACD;;AAEW,MAARsF,QAAQ;AACV,WAAO,KAAKtF,QAAL,CAAcsF,QAArB;AACD;;AAEU,MAAPC,OAAO;AACT,uCAAO,IAAP;AACD;;AAEe,SAATC,SAAS,CAACF,WAA4D,EAA7D;AACd,UAAMG,QAAQ,GAAG,IAAIJ,kBAAJ,EAAjB;AAEAI,IAAAA,QAAQ,CAACD,SAAT,CAAmBF,QAAnB;AAEA,WAAOG,QAAP;AACD;;AAEMC,EAAAA,SAAS,CAACC,SAAwB,EAAzB,EAA6BC,OAAO,GAAG,EAAvC;AACd,WAAO,KAAKN,QAAL,CACJ5C,GADI,CACQ,QADR,EACkB,EADlB,EAEJmD,MAFI,CAEGF,MAFH,EAGJG,GAHI,CAGCpG,KAAD;AACH,YAAMqG,KAAK,GAAGC,sBAAe,CAACC,IAAhB,CAAqBvG,KAArB,CAAd;AAEA,aAAO,CAAC,GAAGqG,KAAK,CAACG,QAAN,CAAeC,MAAf,EAAJ,EAA6B5I,MAA7B,CAAoC,CAAC6I,IAAD,EAAOL,KAAP;;;AACzC,cAAMM,WAAW,uBAAGN,KAAK,CAAC5H,SAAT,qBAAG,iBAAiBuE,GAAjB,CAAqB,aAArB,CAApB;AAEA,eAAO2D,WAAW,GAAG,CAAC,GAAGD,IAAJ,EAAU;AAACL,UAAAA,KAAD;AAAQM,UAAAA;AAAR,SAAV,CAAH,GAAqCD,IAAvD;AACD,OAJM,EAIJ,EAJI,CAAP;AAKD,KAXI,EAYJE,IAZI,GAaJ/I,MAbI,CAaG,CAACqI,OAAD,EAAU;AAACG,MAAAA,KAAD;AAAQM,MAAAA;AAAR,KAAV;AACN,0BACKT,OADL;AAEE,SAACS,WAAD,GAAe,KAAKE,QAAL,CAAcR,KAAK,CAACrG,KAApB,EAA2BqG,KAAK,CAACS,YAAjC;AAFjB;AAID,KAlBI,EAkBFZ,OAlBE,CAAP;AAmBD;;AAEMW,EAAAA,QAAQ,CAAC7G,KAAD,EAAmBC,WAAnB;AACb,UAAM8G,MAAM,GAAGT,sBAAe,CAACU,UAAhB,CAA2BhH,KAA3B,EAAkCC,WAAlC,CAAf;AACA,QAAIU,OAAJ;AAEA,WAAO,OAAOiC,KAAP,EAAiF4C,OAAjF;AACL,wCAAM,IAAN;;AAEA,UAAI,CAAC7E,OAAL,EAAc;AACZ,cAAMsG,eAAe,GAAG,wDAAejE,GAAf,CAA8ClD,iCAA9C,CAAxB;;AACAa,QAAAA,OAAO,GAAG,MAAMsG,eAAe,CAAClH,aAAhB,CAA8BC,KAA9B,EAAqCC,WAArC,CAAhB;AACD;;AAED,YAAMI,IAAI,GAAG,IAAIiF,iBAAJ,CAAsB;AACjC1C,QAAAA,KADiC;AAEjC4C,QAAAA,OAFiC;AAGjChE,QAAAA,EAAE,EAAEoB,KAAK,CAACsE,cAAN,CAAqBC,SAHQ;AAIjCC,QAAAA,MAAM,EAAE,KAAK9G,QAAL,CAAc8G,MAJW;AAKjC9G,QAAAA,QAAQ,EAAE,KAAKA,QALkB;AAMjC9B,QAAAA,QAAQ,EAAEuI;AANuB,OAAtB,CAAb;AASA,aAAOpG,OAAO,CAACN,IAAD,CAAd;AACD,KAlBD;AAmBD;;AAEiB,QAALgH,KAAK;AAChB,UAAM,wDAAe9G,IAAf,CAAoB,UAApB,CAAN;AACD;;AAEgB,QAAJ+G,IAAI;AACf,UAAM,wDAAe/G,IAAf,CAAoB,YAApB,CAAN;AACA,WAAO,KAAKD,QAAL,CAAcqB,OAAd,EAAP;AACD;;AAESmE,EAAAA,SAAS,CAACF,WAAwC,EAAzC;AACjB,4DAAgB,KAAK2B,cAAL,cACX3B,QADW;AAEd4B,MAAAA,aAAa,EAAE,KAAK9D;AAFN,QAIb+D,YAJa,GAKbC,IALa,CAKR,MAAM,KAAKL,KAAL,EALE,CAAhB;AAOA,WAAO,IAAP;AACD;;AAESE,EAAAA,cAAc,CAAC3B,QAAD;;;AACtB,8DAAiB,IAAI5D,kBAAJ,EAAjB;AACA,4DAAeoF,MAAf,GAAwBO,WAAxB;;AACA,4DAAe/B,QAAf,CAAwB7B,GAAxB,CAA4B6B,QAA5B;;AAEA,QAAI,wDAAeA,QAAf,CAAwB5C,GAAxB,CAA4B,KAA5B,MAAuC4E,QAAG,CAACC,IAA3C,IAAmD,EAACjC,QAAD,gCAACA,QAAQ,CAAEwB,MAAX,aAAC,iBAAkBU,KAAnB,CAAvD,EAAiF;AAC/EH,MAAAA,WAAI,CAACL,IAAL;AACD;;AAED,WAAO,IAAP;AACD;;AAE2B,QAAZG,YAAY;AAC1B,UAAMM,SAAS,GAAGC,kBAAe,EAAjC;AAEAC,IAAAA,iBAAc,6BAAC,IAAD,wBAAd;AAEA,UAAM,wDAAe1H,IAAf,CAAoB,aAApB,CAAN;AAEA,UAAM,wDAAe2H,IAAf,CAAoBH,SAApB,CAAN;AAEA,UAAM,wDAAexH,IAAf,CAAoB,YAApB,CAAN;AACD;;;;MCzHU4H,4BAA4BC;AAAzCzF,EAAAA;;AACE,cAAA,GAAQwF,mBAAmB,CAACE,eAApB,EAAR;AACA,gBAAA,GAAUF,mBAAmB,CAACG,iBAApB,EAAV;AAsJD;;AApJY,SAAJzH,IAAI,CAAC0H,UAAD;AACT,UAAMC,SAAS,GAAQ,EAAvB;AACA,UAAM3C,OAAO,GAAG,IAAIsC,mBAAJ,CAAwB,CAACM,OAAD,EAAUC,MAAV;AACtCF,MAAAA,SAAS,CAACC,OAAV,GAAoBA,OAApB;AACAD,MAAAA,SAAS,CAACE,MAAV,GAAmBA,MAAnB;AACD,KAHe,CAAhB;AAKA7C,IAAAA,OAAO,CAAC8C,IAAR,CAAaJ,UAAb,EAAyBC,SAAS,CAACC,OAAnC,EAA4CD,SAAS,CAACE,MAAtD;AAEA,WAAO7C,OAAP;AACD;;AAEqB,SAAfwC,eAAe,CAACzF,QAAoF,EAArF;AACpB;AACE5B,MAAAA,IAAI,EAAE,EADR;AAEEtD,MAAAA,OAAO,EAAE,EAFX;AAGE0F,MAAAA,UAAU,EAAE,EAHd;AAIE1B,MAAAA,eAAe,EAAE,KAJnB;AAKED,MAAAA,iBAAiB,EAAE,EALrB;AAMEmH,MAAAA,+BAA+B,EAAE,EANnC;AAOE1F,MAAAA,IAAI,EAAEN,KAAK,CAACM,IAAN,IAAc,GAPtB;AAQEK,MAAAA,cAAc,EAAE,EARlB;AASEE,MAAAA,qBAAqB,EAAE,EATzB;AAUEoF,MAAAA,QAAQ,EAAE,EAVZ;AAWEC,MAAAA,cAAc,EAAE;AAXlB,OAYKlG,KAZL;AAaEsE,MAAAA,cAAc,eACTtE,KADS,oBACTA,KAAK,CAAEsE,cADE;AAEZ6B,QAAAA,SAAS,EAAE,EAFC;AAGZC,QAAAA,KAAK,EAAE,EAHK;AAIZ/F,QAAAA,QAAQ,EAAE,OAJE;AAKZG,QAAAA,UAAU,EAAE,EALA;AAMZ6F,QAAAA,QAAQ,EAAE,EANE;AAOZ/F,QAAAA,IAAI,EAAEN,KAAK,CAACM,IAAN,IAAc,GAPR;AAQZgG,QAAAA,KAAK,EAAE,EARK;AASZ/B,QAAAA,SAAS,EAAE,WATC;AAUZgC,QAAAA,gBAAgB,EAAE,CAVN;AAWZC,QAAAA,UAAU,EAAE,CAXA;AAYZC,QAAAA,YAAY,EAAEzG,KAAK,CAACM,IAAN,IAAc;AAZhB;AAbhB;AA4BD;;AAEuB,SAAjBoF,iBAAiB,CAAC9C,OAAD;AACtB;AACE8D,MAAAA,YAAY,EAAE,cADhB;AAEEC,MAAAA,8BAA8B,EAAE,KAFlC;AAGEC,MAAAA,YAAY,EAAE,EAHhB;AAIEC,MAAAA,eAAe,EAAE,EAJnB;AAKEC,MAAAA,kBAAkB,EAAE,EALtB;AAMEC,MAAAA,YAAY,EAAE,EANhB;AAOEC,MAAAA,aAAa,EAAE,EAPjB;AAQEC,MAAAA,eAAe,EAAE;AARnB,OASMrE,OAAO,IAAI,EATjB;AAWD;;AAEDxC,EAAAA,GAAG,CAACE,IAAD,EAAeuC,UAAsF,EAArG;AACD9H,IAAAA,MAAM,CAACmM,MAAP,CAAc,KAAKlH,KAAnB,EAA0B6C,OAA1B;AAEA,SAAK7C,KAAL,CAAWM,IAAX,GAAkBA,IAAlB;AACA,SAAKN,KAAL,CAAWQ,UAAX,GAAwB,KAAxB;AAEA,WAAO,IAAP;AACD;;AAED2G,EAAAA,IAAI,CAAC7G,IAAD,EAAelC,OAAY,EAA3B,EAA+ByE,UAAsF,EAArH;AACF9H,IAAAA,MAAM,CAACmM,MAAP,CAAc,KAAKlH,KAAnB,EAA0B6C,OAA1B;AAEA,SAAK7C,KAAL,CAAWM,IAAX,GAAkBA,IAAlB;AACA,SAAKN,KAAL,CAAWQ,UAAX,GAAwB,MAAxB;AAEA,SAAKpC,IAAL,CAAUA,IAAV;AAEA,WAAO,IAAP;AACD;;AAEDgJ,EAAAA,KAAK,CAAC9G,IAAD,EAAelC,OAAY,EAA3B,EAA+ByE,UAAsF,EAArH;AACH9H,IAAAA,MAAM,CAACmM,MAAP,CAAc,KAAKlH,KAAnB,EAA0B6C,OAA1B;AAEA,SAAK7C,KAAL,CAAWM,IAAX,GAAkBA,IAAlB;AACA,SAAKN,KAAL,CAAWQ,UAAX,GAAwB,OAAxB;AAEA,SAAKpC,IAAL,CAAUA,IAAV;AAEA,WAAO,IAAP;AACD;;AAEDiJ,EAAAA,GAAG,CAAC/G,IAAD,EAAelC,OAAY,EAA3B,EAA+ByE,UAAsF,EAArH;AACD9H,IAAAA,MAAM,CAACmM,MAAP,CAAc,KAAKlH,KAAnB,EAA0B6C,OAA1B;AAEA,SAAK7C,KAAL,CAAWM,IAAX,GAAkBA,IAAlB;AACA,SAAKN,KAAL,CAAWQ,UAAX,GAAwB,KAAxB;AAEA,SAAKpC,IAAL,CAAUA,IAAV;AAEA,WAAO,IAAP;AACD;;AAEDkJ,EAAAA,MAAM,CAAChH,IAAD,EAAelC,OAAY,EAA3B,EAA+ByE,UAAsF,EAArH;AACJ9H,IAAAA,MAAM,CAACmM,MAAP,CAAc,KAAKlH,KAAnB,EAA0B6C,OAA1B;AAEA,SAAK7C,KAAL,CAAWM,IAAX,GAAkBA,IAAlB;AACA,SAAKN,KAAL,CAAWQ,UAAX,GAAwB,MAAxB;AAEA,SAAKpC,IAAL,CAAUA,IAAV;AAEA,WAAO,IAAP;AACD;;AAEDwC,EAAAA,KAAK,CAACA,KAAD;AACH,SAAKZ,KAAL,CAAWa,qBAAX,gBACK,KAAKb,KAAL,CAAWa,qBADhB,EAEKpC,IAAI,CAACgC,KAAL,CAAWhC,IAAI,CAACC,SAAL,CAAekC,KAAf,CAAX,CAFL;AAKA,WAAO,IAAP;AACD;;AAEDrD,EAAAA,MAAM,CAACoD,cAAD;AACJ,SAAKX,KAAL,CAAWW,cAAX,gBACK,KAAKX,KAAL,CAAWW,cADhB,EAEKlC,IAAI,CAACgC,KAAL,CAAWhC,IAAI,CAACC,SAAL,CAAeiC,cAAf,CAAX,CAFL;AAKA,WAAO,IAAP;AACD;;AAEDvC,EAAAA,IAAI,CAACA,IAAD;AACF,QAAIA,IAAI,KAAKnB,SAAb,EAAwB;AACtB,WAAK+C,KAAL,CAAWlF,OAAX,CAAmB,cAAnB,IAAqC,kBAArC;AAEA,WAAKkF,KAAL,CAAW5B,IAAX,GAAkBK,IAAI,CAACC,SAAL,CAAeN,IAAf,CAAlB;AACD;;AAED,WAAO,IAAP;AACD;;AAES2H,EAAAA,IAAI,CAACwB,MAAD,EAAiB1B,OAAjB,EAAoCC,MAApC;AACZ0B,IAAAA,UAAU,CAAC;AACT,UAAI;AACF,cAAMxJ,MAAM,GAAG,MAAMyJ,sBAAsB,CAACrE,SAAvB,CAAiCmE,MAAjC,EAAyC,KAAKvH,KAA9C,EAAqD,KAAK4C,OAA1D,EAAmEiD,OAAnE,CAArB;AACAA,QAAAA,OAAO,CAAC7H,MAAD,CAAP;AACD,OAHD,CAGE,OAAOG,EAAP,EAAW;AACX2H,QAAAA,MAAM,CAAC3H,EAAD,CAAN;AACD;AACF,KAPS,CAAV;AAQD;;;MAGUsJ,+BAA+BC;AAK1B,SAATxE,SAAS,CAACF,WAA2D,EAA5D;AACd,WAAO,eAAe2E,MAAf;AACL;AACA,YAAMC,QAAQ,GAAG,MAAM7E,kBAAkB,CAACG,SAAnB,CAA6BwE,SAAM,CAACG,SAAP,CAAiB7E,QAAjB,CAA7B,CAAvB;AACAyE,MAAAA,sBAAsB,CAACG,QAAvB,GAAkCA,QAAlC;AACAH,MAAAA,sBAAsB,CAACrE,SAAvB,GAAmCwE,QAAQ,CAACxE,SAAT,EAAnC;;AAEAsE,MAAAA,SAAM,CAAChK,QAAP,GAAkBkK,QAAQ,CAAClK,QAA3B;AAEA,aAAOkK,QAAQ,CAAC3E,OAAhB;AACD,KATD;AAUD;AAED;;;;;AAGkB,eAAL6E,KAAK;AAChB,QAAIL,sBAAsB,CAACG,QAA3B,EAAqC;AACnC,YAAMH,sBAAsB,CAACG,QAAvB,CAAgClD,IAAhC,EAAN;AACD;;AACD,QAAIgD,SAAM,CAACK,WAAP,EAAJ,EAA0B;AACxB,YAAML,SAAM,CAAChK,QAAP,CAAgBqB,OAAhB,EAAN;AACA2I,MAAAA,SAAM,CAACM,SAAP,GAAmB,IAAnB;AACD;AACF;;AAE6B,SAAvBC,uBAAuB,CAAC;AAACrM,IAAAA;AAAD,GAAD;AAC5B,UAAMgH,OAAO,GAAQ2C,mBAAmB,CAACG,iBAApB,EAArB;AACA,UAAM1F,KAAK,GAAQuF,mBAAmB,CAACG,iBAApB,EAAnB;AAEA,WAAO,IAAIhD,iBAAJ,CAAsB;AAC3B1C,MAAAA,KAD2B;AAE3B4C,MAAAA,OAF2B;AAG3BhE,MAAAA,EAAE,EAAEgE,OAAO,CAAC8D,YAHe;AAI3BlC,MAAAA,MAAM,EAAEiD,sBAAsB,CAAC/J,QAAvB,CAAgC8G,MAJb;AAK3B9G,MAAAA,QAAQ,EAAE+J,sBAAsB,CAAC/J,QALN;AAM3B9B,MAAAA;AAN2B,KAAtB,CAAP;AAQD;;;AA1CM6L,gCAAA,GAAoD,EAApD;AAEAA,8BAAA,GAAUlC,mBAAV;;AClJT;;;;;;;;;;;;SAWgB2C,OAAOpH;AACrB,QAAM+B,OAAO,GAAkB;AAC7BvC,IAAAA,IAAI,EAAE,GADuB;AAE7BC,IAAAA,MAAM,EAAE,EAFqB;AAG7BO,IAAAA;AAH6B,GAA/B;AAMA,QAAMqH,SAAS,GAAQC,mBAAY,CAAEjE,MAAD;AAClC,WAAOkE,kBAAa,CAACC,oBAAa,CAACzF,OAAO,CAACtC,MAAT,EAAiBsC,OAAO,CAACvC,IAAzB,CAAd,EAA8CiI,kBAAW,CAAC1F,OAAO,CAAC/B,IAAR,IAAgBiB,MAAM,CAACoC,MAAM,CAAC9G,WAAR,CAAvB,CAAzD,CAApB;AACD,GAFkC,CAAnC;;AAIA8K,EAAAA,SAAS,CAACK,IAAV,GAAkB1H,IAAD;AACf+B,IAAAA,OAAO,CAAC/B,IAAR,GAAeA,IAAf;AACA,WAAOqH,SAAP;AACD,GAHD;;AAKAA,EAAAA,SAAS,CAACM,IAAV,GAAkBnI,IAAD;AACfuC,IAAAA,OAAO,CAACvC,IAAR,GAAeA,IAAf;AACA,WAAO6H,SAAP;AACD,GAHD;;AAKAA,EAAAA,SAAS,CAACO,MAAV,GAAoBnI,MAAD;AACjBsC,IAAAA,OAAO,CAACtC,MAAR,GAAiBA,MAAjB;AACA,WAAO4H,SAAP;AACD,GAHD;;AAKA,SAAOA,SAAP;AACD;AAED;;;;;;SAKgBQ,IAAIrI,OAAe;AACjC,SAAO4H,MAAM,GAAGO,IAAT,CAAcnI,IAAd,EAAoBoI,MAApB,CAA2BE,uBAAgB,CAACC,GAA5C,CAAP;AACD;AAED;;;;;;SAKgBC,KAAKxI,OAAe;AAClC,SAAO4H,MAAM,GAAGO,IAAT,CAAcnI,IAAd,EAAoBoI,MAApB,CAA2BE,uBAAgB,CAACG,IAA5C,CAAP;AACD;AAED;;;;;;SAKgBC,IAAI1I,OAAe;AACjC,SAAO4H,MAAM,GAAGO,IAAT,CAAcnI,IAAd,EAAoBoI,MAApB,CAA2BE,uBAAgB,CAACK,GAA5C,CAAP;AACD;AAED;;;;;;SAKgBC,MAAM5I,OAAe;AACnC,SAAO4H,MAAM,GAAGO,IAAT,CAAcnI,IAAd,EAAoBoI,MAApB,CAA2BE,uBAAgB,CAACO,KAA5C,CAAP;AACD;AAED;;;;;;SAKgBC,OAAO9I,OAAe;AACpC,SAAO4H,MAAM,GAAGO,IAAT,CAAcnI,IAAd,EAAoBoI,MAApB,CAA2BE,uBAAgB,CAACS,MAA5C,CAAP;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../src/utils/setResponseHeaders.ts","../src/builder/PlatformServerlessHandler.ts","../src/domain/ServerlessRequest.ts","../src/domain/ServerlessResponse.ts","../src/domain/ServerlessContext.ts","../src/builder/PlatformServerless.ts","../src/services/PlatformServerlessTest.ts","../src/decorators/lambda.ts"],"sourcesContent":["import {JsonHeader} from \"@tsed/schema\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\nimport {HeaderValue} from \"../domain/ServerlessResponse\";\n\nfunction mergeHeaders(specHeaders: Record<string, JsonHeader & {example: string}>, headers: Record<string, HeaderValue>) {\n return Object.entries(specHeaders).reduce((headers, [key, item]) => {\n key = key.toLowerCase();\n return {\n ...headers,\n [key]: headers[key] === undefined ? String(item.example) : headers[key]\n };\n }, headers);\n}\n\n/**\n * @ignore\n */\nexport function setResponseHeaders(ctx: ServerlessContext) {\n const {response, endpoint} = ctx;\n const operation = endpoint.operation!;\n\n if (response.isDone()) {\n return;\n }\n\n if (!response.hasStatus()) {\n // apply status only if the isn't already modified\n response.status(operation.getStatus());\n }\n\n const statusCode = response.statusCode;\n const headers = operation.getHeadersOf(response.statusCode);\n const mergedHeaders = mergeHeaders(headers, response.getHeaders());\n\n response.setHeaders(mergedHeaders);\n\n if (operation.isRedirection(statusCode)) {\n response.redirect(statusCode, String(mergedHeaders[\"location\"]));\n }\n}\n","import {AnyPromiseResult, AnyToPromise, isBoolean, isNumber, isStream, isString} from \"@tsed/core\";\nimport {BaseContext, Inject, Injectable, InjectorService, ProviderScope, TokenProvider} from \"@tsed/di\";\nimport {serialize} from \"@tsed/json-mapper\";\nimport {PlatformExceptions} from \"@tsed/platform-exceptions\";\nimport {DeserializerPipe, PlatformParams, ValidationPipe} from \"@tsed/platform-params\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\nimport {setResponseHeaders} from \"../utils/setResponseHeaders\";\n\nfunction shouldBeSent(data: any) {\n return Buffer.isBuffer(data) || isBoolean(data) || isNumber(data) || isString(data) || data === null;\n}\n\nfunction shouldBeSerialized(data: any) {\n return !(isStream(data) || shouldBeSent(data) || data === undefined);\n}\n\n@Injectable({\n scope: ProviderScope.SINGLETON,\n imports: [DeserializerPipe, ValidationPipe]\n})\nexport class PlatformServerlessHandler {\n @Inject()\n protected injector: InjectorService;\n\n @Inject()\n protected params: PlatformParams;\n\n @Inject()\n protected exceptions: PlatformExceptions;\n\n createHandler(token: TokenProvider, propertyKey: string | symbol) {\n const promisedHandler = this.params.compileHandler({\n token,\n propertyKey\n });\n\n return async ($ctx: ServerlessContext) => {\n await this.injector.emit(\"$onRequest\", $ctx);\n\n await this.injector.runInContext($ctx, async () => {\n try {\n const resolver = new AnyToPromise();\n const handler = await promisedHandler;\n const result = await resolver.call(() => handler({$ctx}));\n\n this.processResult(result, $ctx);\n } catch (er) {\n $ctx.response.status(500).body(er);\n await this.exceptions.catch(er, ($ctx as unknown) as BaseContext);\n }\n });\n\n await this.injector.emit(\"$onResponse\", $ctx);\n\n return this.flush($ctx);\n };\n }\n\n private flush($ctx: ServerlessContext) {\n setResponseHeaders($ctx);\n\n let body: any = $ctx.response.getBody();\n\n if (shouldBeSerialized(body)) {\n body = JSON.stringify(body);\n }\n\n const response = {\n statusCode: $ctx.response.getStatus(),\n body: body === undefined ? \"\" : body,\n headers: {\n ...$ctx.response.getHeaders(),\n \"x-request-id\": $ctx.id\n },\n isBase64Encoded: false\n };\n\n $ctx.destroy();\n\n return response;\n }\n\n private processResult({status, headers, data}: AnyPromiseResult, $ctx: ServerlessContext) {\n if (status) {\n $ctx.response.status(status);\n }\n\n if (headers) {\n $ctx.response.setHeaders(headers);\n }\n\n if (data !== undefined) {\n data = $ctx.response.getStatus() !== 204 ? data : \"\";\n\n if (shouldBeSerialized(data)) {\n data = serialize(data, {\n ...$ctx.endpoint.getResponseOptions()\n });\n }\n\n $ctx.response.body(data);\n }\n }\n}\n","import type {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, Context} from \"aws-lambda\";\nimport {getValue} from \"@tsed/core\";\n\nexport interface ServerlessRequestOptions {\n event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n context: Context;\n}\n/**\n * @platform\n */\nexport class ServerlessRequest {\n readonly raw: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n\n constructor({event}: ServerlessRequestOptions) {\n this.raw = event;\n }\n\n get secure(): boolean {\n return true;\n }\n\n get host(): string {\n return this.get(\"host\");\n }\n\n get protocol(): string {\n return \"https\";\n }\n\n /**\n * Get the url of the request.\n *\n * Is equivalent of `express.response.originalUrl || express.response.url`.\n */\n get url(): string {\n return this.raw.path;\n }\n\n get headers() {\n return this.raw.headers;\n }\n\n get method(): string {\n return this.raw.httpMethod;\n }\n\n /**\n * Contains key-value pairs of data submitted in the request body. By default, it is `undefined`, and is populated when you use\n * `body-parsing` middleware such as `express.json()` or `express.urlencoded()`.\n */\n get body(): any {\n try {\n return this.raw.body ? JSON.parse(this.raw.body) : {};\n } catch (er) {\n return {};\n }\n }\n\n get rawBody(): any {\n return this.raw.body;\n }\n\n /**\n * This property is an object containing properties mapped to the named route `parameters`.\n * For example, if you have the route `/user/:name`, then the `name` property is available as `req.params.name`.\n * This object defaults to `{}`.\n */\n get params(): {[key: string]: any} {\n return this.raw.pathParameters || {};\n }\n\n /**\n * This property is an object containing a property for each query string parameter in the route.\n * When query parser is set to disabled, it is an empty object `{}`, otherwise it is the result of the configured query parser.\n */\n get query(): {[key: string]: any} {\n return this.raw.queryStringParameters || {};\n }\n\n /**\n * Returns the HTTP request header specified by field. The match is case-insensitive.\n *\n * ```typescript\n * request.get('Content-Type') // => \"text/plain\"\n * ```\n *\n * @param name\n */\n get(name: string) {\n return getValue(this.raw.headers, name);\n }\n\n destroy() {}\n}\n","import {getValue} from \"@tsed/core\";\nimport {getStatusMessage} from \"@tsed/schema\";\nimport type {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, Context} from \"aws-lambda\";\nimport encodeUrl from \"encodeurl\";\nimport * as mime from \"mime\";\nimport type {ServerlessRequest} from \"./ServerlessRequest\";\n\nexport interface ServerlessResponseOptions {\n event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n context: Context;\n request: ServerlessRequest;\n}\n\nexport type HeaderValue = boolean | number | string;\n\n/**\n * @platform\n */\nexport class ServerlessResponse {\n readonly event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n readonly request: ServerlessRequest;\n\n #status: number = 200;\n #body: any = undefined;\n #headers: Record<string, HeaderValue> = {};\n #locals: Record<string, any> = {};\n #isHeadersSent = false;\n #endListeners: Function[] = [];\n\n constructor({event, request}: ServerlessResponseOptions) {\n this.event = event;\n this.request = request;\n }\n\n /**\n * Get the current statusCode\n */\n get statusCode() {\n return this.#status;\n }\n\n set statusCode(status) {\n this.#status = status;\n }\n\n /**\n * An object that contains response local variables scoped to the request, and therefore available only to the view(s) rendered during that request / response cycle (if any). Otherwise, this property is identical to app.locals.\n *\n * This property is useful for exposing request-level information such as the request path name, authenticated user, user settings, and so on.\n */\n get locals() {\n return this.#locals;\n }\n\n getStatus() {\n return this.#status;\n }\n\n /**\n * Sets the HTTP status for the response.\n *\n * @param status\n */\n status(status: number) {\n this.#status = status;\n return this;\n }\n\n set(name: string, value: any) {\n return this.setHeader(name, value);\n }\n\n /**\n * Returns the HTTP response header specified by field. The match is case-insensitive.\n *\n * ```typescript\n * response.get('Content-Type') // => \"text/plain\"\n * ```\n *\n * @param name\n */\n get(name: string): string | number | boolean | undefined {\n return getValue(this.#headers, name.toLowerCase());\n }\n\n getHeaders(): Record<string, HeaderValue> {\n return {\n ...this.#headers\n };\n }\n\n hasStatus() {\n return this.#status !== 200;\n }\n\n /**\n * Set header `field` to `val`, or pass\n * an object of header fields.\n *\n * Examples:\n * ```typescript\n * response.setHeaders({ Accept: 'text/plain', 'X-API-Key': 'tobi' });\n * ```\n *\n * Aliased as `res.header()`.\n */\n setHeaders(headers: Record<string, HeaderValue>) {\n // apply headers\n Object.entries(headers).forEach(([key, item]) => {\n this.setHeader(key, item);\n });\n\n return this;\n }\n\n setHeader(key: string, item: HeaderValue | null | undefined) {\n if (item !== null && item !== undefined) {\n key = key.toLowerCase();\n\n if (key === \"location\") {\n // \"back\" is an alias for the referrer\n if (item === \"back\") {\n item = this.request.get(\"Referrer\") || \"/\";\n }\n\n item = encodeUrl(String(item));\n }\n\n this.#headers = {\n ...this.#headers,\n [key.toLowerCase()]: item as any\n };\n }\n\n return this;\n }\n\n /**\n * Set `Content-Type` response header with `type` through `mime.lookup()`\n * when it does not contain \"/\", or set the Content-Type to `type` otherwise.\n *\n * Examples:\n *\n * res.type('.html');\n * res.type('html');\n * res.type('json');\n * res.type('application/json');\n * res.type('png');\n */\n contentType(contentType: string) {\n this.setHeader(\"Content-Type\", mime.getType(contentType));\n\n return this;\n }\n\n contentLength(length: number) {\n this.setHeader(\"Content-Length\", length);\n return this;\n }\n\n getContentLength() {\n if (this.get(\"Content-Length\")) {\n return parseInt(this.get(\"Content-Length\") as any, 10) || 0;\n }\n }\n\n getContentType() {\n return String(this.get(\"Content-Type\") || \"\").split(\";\")[0];\n }\n\n /**\n * Redirects to the URL derived from the specified path, with specified status, a positive integer that corresponds to an [HTTP status code](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html).\n * If not specified, status defaults to `302 Found`.\n *\n * @param status\n * @param url\n */\n redirect(status: number, url: string) {\n // Set location header\n const address = this.location(url).get(\"Location\");\n const body = `${getStatusMessage(status)}. Redirecting to ${address}`;\n\n this.status(status).set(\"Content-Length\", Buffer.byteLength(body)).body(body);\n\n return this;\n }\n\n /**\n * Sets the response Location HTTP header to the specified path parameter.\n *\n * @param url\n */\n location(url: string) {\n return this.set(\"Location\", url);\n }\n\n /**\n * Send any data to your consumer.\n *\n * This method accept a ReadableStream, a plain object, boolean, string, number, null and undefined data.\n * It choose the better way to send the data.\n *\n * @param body\n */\n body(body: any) {\n this.#body = body;\n\n return this;\n }\n\n getBody() {\n return this.#body;\n }\n\n isDone(): boolean {\n return this.#isHeadersSent;\n }\n\n onEnd(cb: Function) {\n this.#endListeners.push(cb);\n\n return this;\n }\n\n destroy() {\n this.#endListeners.forEach((cb: Function) => cb());\n this.#isHeadersSent = true;\n }\n\n isHeadersSent() {\n return this.#isHeadersSent;\n }\n}\n","import {DIContext, DIContextOptions, LocalsContainer} from \"@tsed/di\";\nimport {JsonEntityStore} from \"@tsed/schema\";\nimport {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, Context} from \"aws-lambda\";\nimport {ServerlessRequest} from \"./ServerlessRequest\";\nimport {ServerlessResponse} from \"./ServerlessResponse\";\n\nexport interface ServerlessContextOptions extends DIContextOptions {\n event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n context: Context;\n endpoint: JsonEntityStore;\n}\n\nexport class ServerlessContext extends DIContext {\n readonly response: ServerlessResponse;\n readonly request: ServerlessRequest;\n readonly context: Context;\n readonly event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n readonly endpoint: JsonEntityStore;\n\n constructor({event, context, endpoint, ...options}: ServerlessContextOptions) {\n super({\n ...options,\n maxStackSize: 0\n });\n this.context = context;\n this.event = event;\n this.request = new ServerlessRequest({event, context});\n this.response = new ServerlessResponse({event, context, request: this.request});\n this.endpoint = endpoint;\n }\n\n async destroy() {\n await super.destroy();\n\n this.request.destroy();\n this.response.destroy();\n }\n}\n","import {Env, Type} from \"@tsed/core\";\nimport {createContainer, InjectorService, setLoggerLevel} from \"@tsed/di\";\nimport {$log, Logger} from \"@tsed/logger\";\nimport {JsonEntityStore} from \"@tsed/schema\";\nimport type {\n APIGatewayEventDefaultAuthorizerContext,\n APIGatewayProxyEventBase,\n APIGatewayProxyHandler,\n APIGatewayProxyResult,\n Context\n} from \"aws-lambda\";\nimport {v4} from \"uuid\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\nimport {PlatformServerlessHandler} from \"./PlatformServerlessHandler\";\n\nfunction getReqId(event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>, context: Context) {\n if (event?.headers && event.headers[\"x-request-id\"]) {\n return event.headers[\"x-request-id\"];\n }\n\n return event?.requestContext?.requestId || context?.awsRequestId || v4().replace(/-/gi, \"\");\n}\n\n/**\n * @platform\n */\nexport class PlatformServerless {\n readonly name: string = \"PlatformServerless\";\n\n #injector: InjectorService;\n #promise: Promise<void>;\n\n get injector(): InjectorService {\n return this.#injector;\n }\n\n get settings() {\n return this.injector.settings;\n }\n\n get promise() {\n return this.#promise;\n }\n\n static bootstrap(settings: Partial<TsED.Configuration> & {lambda?: Type[]} = {}): PlatformServerless {\n const platform = new PlatformServerless();\n\n platform.bootstrap(settings);\n\n return platform;\n }\n\n public callbacks(tokens: Type | Type[] = [], exports = {}): Record<string, APIGatewayProxyHandler> {\n return this.settings\n .get<Type[]>(\"lambda\", [])\n .concat(tokens)\n .map((token) => {\n const store = JsonEntityStore.from(token);\n\n return [...store.children.values()].reduce((list, store) => {\n const operationId = store.operation?.get(\"operationId\");\n\n return operationId ? [...list, {store, operationId}] : list;\n }, []);\n })\n .flat()\n .reduce((exports, {store, operationId}) => {\n return {\n ...exports,\n [operationId]: this.callback(store.token, store.propertyName)\n };\n }, exports);\n }\n\n public callback(token: Type<any>, propertyKey: string): APIGatewayProxyHandler {\n const entity = JsonEntityStore.fromMethod(token, propertyKey);\n let handler: ($ctx: ServerlessContext) => Promise<APIGatewayProxyResult>;\n\n return async (event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>, context: Context) => {\n await this.#promise;\n\n if (!handler) {\n const platformHandler = this.#injector.get<PlatformServerlessHandler>(PlatformServerlessHandler)!;\n handler = await platformHandler.createHandler(token, propertyKey);\n }\n\n const $ctx = new ServerlessContext({\n event,\n context,\n id: getReqId(event, context),\n logger: this.injector.logger as Logger,\n injector: this.injector,\n endpoint: entity\n });\n\n return handler($ctx);\n };\n }\n\n public async ready() {\n await this.#injector.emit(\"$onReady\");\n }\n\n public async stop() {\n await this.#injector.emit(\"$onDestroy\");\n return this.injector.destroy();\n }\n\n protected bootstrap(settings: Partial<TsED.Configuration> = {}) {\n this.#promise = this.createInjector({\n ...settings,\n PLATFORM_NAME: this.name\n })\n .loadInjector()\n .then(() => this.ready());\n\n return this;\n }\n\n protected createInjector(settings: any) {\n this.#injector = new InjectorService();\n this.#injector.logger = $log;\n this.#injector.settings.set(settings);\n\n if (this.#injector.settings.get(\"env\") === Env.TEST && !settings?.logger?.level) {\n $log.stop();\n }\n\n return this;\n }\n\n protected async loadInjector() {\n const container = createContainer();\n\n setLoggerLevel(this.#injector);\n\n await this.#injector.emit(\"$beforeInit\");\n\n await this.#injector.load(container);\n\n await this.#injector.emit(\"$afterInit\");\n }\n}\n","import {Type} from \"@tsed/core\";\nimport {DITest} from \"@tsed/di\";\nimport {Logger} from \"@tsed/logger\";\nimport {JsonEntityStore} from \"@tsed/schema\";\nimport {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, APIGatewayProxyHandler, Context} from \"aws-lambda\";\nimport {APIGatewayProxyResult} from \"aws-lambda/trigger/api-gateway-proxy\";\nimport {PlatformServerless} from \"../builder/PlatformServerless\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\n\nexport interface LambdaPromiseResult extends Promise<APIGatewayProxyResult> {}\n\nexport class LambdaClientRequest extends Promise<APIGatewayProxyResult> {\n event = LambdaClientRequest.createFakeEvent();\n context = LambdaClientRequest.createFakeContext();\n\n static call(lambdaName: string) {\n const resolvers: any = {};\n const promise = new LambdaClientRequest((resolve, reject) => {\n resolvers.resolve = resolve;\n resolvers.reject = reject;\n });\n\n promise.init(lambdaName, resolvers.resolve, resolvers.reject);\n\n return promise;\n }\n\n static createFakeEvent(event: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n return {\n body: \"\",\n headers: {},\n httpMethod: \"\",\n isBase64Encoded: false,\n multiValueHeaders: {},\n multiValueQueryStringParameters: {},\n path: event.path || \"/\",\n pathParameters: {},\n queryStringParameters: {},\n resource: \"\",\n stageVariables: {},\n ...event,\n requestContext: {\n ...event?.requestContext,\n accountId: \"\",\n apiId: \"\",\n protocol: \"https\",\n httpMethod: \"\",\n identity: {} as any,\n path: event.path || \"/\",\n stage: \"\",\n requestId: \"requestId\",\n requestTimeEpoch: 0,\n resourceId: 1,\n resourcePath: event.path || \"/\"\n } as any\n } as APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n }\n\n static createFakeContext(context?: Context): Context {\n return {\n awsRequestId: \"awsRequestId\",\n callbackWaitsForEmptyEventLoop: false,\n functionName: \"\",\n functionVersion: \"\",\n invokedFunctionArn: \"\",\n logGroupName: \"\",\n logStreamName: \"\",\n memoryLimitInMB: \"\",\n ...(context || {})\n } as Context;\n }\n\n get(path: string, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"GET\";\n\n return this;\n }\n\n post(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"POST\";\n\n this.body(body);\n\n return this;\n }\n\n patch(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"PATCH\";\n\n this.body(body);\n\n return this;\n }\n\n put(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"PUT\";\n\n this.body(body);\n\n return this;\n }\n\n delete(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"POST\";\n\n this.body(body);\n\n return this;\n }\n\n query(query: any) {\n this.event.queryStringParameters = {\n ...this.event.queryStringParameters,\n ...JSON.parse(JSON.stringify(query))\n };\n\n return this;\n }\n\n params(pathParameters: any) {\n this.event.pathParameters = {\n ...this.event.pathParameters,\n ...JSON.parse(JSON.stringify(pathParameters))\n };\n\n return this;\n }\n\n headers(headers: Record<string, any>) {\n this.event.headers = {\n ...this.event.headers,\n ...JSON.parse(JSON.stringify(headers))\n };\n\n return this;\n }\n\n body(body: any) {\n if (body !== undefined) {\n this.event.headers[\"content-type\"] = \"application/json\";\n\n this.event.body = JSON.stringify(body);\n }\n\n return this;\n }\n\n protected init(lambda: string, resolve: Function, reject: Function) {\n setTimeout(async () => {\n try {\n const result = await PlatformServerlessTest.callbacks[lambda](this.event, this.context, resolve as any);\n resolve(result as any);\n } catch (er) {\n reject(er);\n }\n });\n }\n}\n\nexport class PlatformServerlessTest extends DITest {\n static callbacks: Record<string, APIGatewayProxyHandler> = {};\n static instance: PlatformServerless;\n static request = LambdaClientRequest;\n\n static bootstrap(settings: Partial<TsED.Configuration & {lambda: Type[]}> = {}) {\n return async function before(): Promise<void> {\n // @ts-ignore\n const instance = await PlatformServerless.bootstrap(DITest.configure(settings));\n PlatformServerlessTest.instance = instance;\n PlatformServerlessTest.callbacks = instance.callbacks();\n // used by inject method\n DITest.injector = instance.injector;\n\n return instance.promise;\n };\n }\n\n /**\n * Resets the test injector of the test context, so it won't pollute your next test. Call this in your `tearDown` logic.\n */\n static async reset() {\n if (PlatformServerlessTest.instance) {\n await PlatformServerlessTest.instance.stop();\n }\n if (DITest.hasInjector()) {\n await DITest.injector.destroy();\n DITest._injector = null;\n }\n }\n\n static createServerlessContext({endpoint}: {endpoint: JsonEntityStore}) {\n const context: any = LambdaClientRequest.createFakeContext();\n const event: any = LambdaClientRequest.createFakeEvent();\n\n return new ServerlessContext({\n event,\n context,\n id: context.awsRequestId,\n logger: PlatformServerlessTest.injector.logger as Logger,\n injector: PlatformServerlessTest.injector,\n endpoint\n });\n }\n}\n","import {useDecorators} from \"@tsed/core\";\nimport {JsonEntityFn, JsonSchemaObject, OperationId, OperationMethods, OperationPath} from \"@tsed/schema\";\n\nexport interface LambdaOptions {\n name?: string;\n path: string;\n method: OperationMethods | string;\n}\n\nexport interface LambdaChainedDecorators {\n <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>): TypedPropertyDescriptor<T> | void;\n\n /**\n *\n * @param name\n */\n Name(name: string): this;\n\n Method(method: string): this;\n\n Path(path: string): this;\n}\n/**\n * Declare a lambda endpoint.\n *\n * ```typescript\n * export class Lambda {\n *\n * }\n * ```\n *\n * @decorator\n */\nexport function Lambda(name?: string): LambdaChainedDecorators {\n const options: LambdaOptions = {\n path: \"/\",\n method: \"\",\n name\n };\n\n const decorator: any = JsonEntityFn((entity) => {\n return useDecorators(OperationPath(options.method, options.path), OperationId(options.name || String(entity.propertyKey)));\n });\n\n decorator.Name = (name: string) => {\n options.name = name;\n return decorator;\n };\n\n decorator.Path = (path: string) => {\n options.path = path;\n return decorator;\n };\n\n decorator.Method = (method: string) => {\n options.method = method;\n return decorator;\n };\n\n return decorator;\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Get(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.GET);\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Post(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.POST);\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Put(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.PUT);\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Patch(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.PATCH);\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Delete(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.DELETE);\n}\n"],"names":["mergeHeaders","specHeaders","headers","Object","entries","reduce","key","item","toLowerCase","undefined","String","example","setResponseHeaders","ctx","response","endpoint","operation","isDone","hasStatus","status","getStatus","statusCode","getHeadersOf","mergedHeaders","getHeaders","setHeaders","isRedirection","redirect","shouldBeSent","data","Buffer","isBuffer","isBoolean","isNumber","isString","shouldBeSerialized","isStream","PlatformServerlessHandler","createHandler","token","propertyKey","promisedHandler","params","compileHandler","$ctx","injector","emit","runInContext","resolver","AnyToPromise","handler","result","call","processResult","er","body","exceptions","catch","flush","getBody","JSON","stringify","id","isBase64Encoded","destroy","serialize","getResponseOptions","__decorate","Inject","InjectorService","PlatformParams","PlatformExceptions","Injectable","scope","ProviderScope","SINGLETON","imports","DeserializerPipe","ValidationPipe","ServerlessRequest","constructor","event","raw","secure","host","get","protocol","url","path","method","httpMethod","parse","rawBody","pathParameters","query","queryStringParameters","name","getValue","ServerlessResponse","request","locals","set","value","setHeader","forEach","encodeUrl","contentType","mime","getType","contentLength","length","getContentLength","parseInt","getContentType","split","address","location","getStatusMessage","byteLength","onEnd","cb","push","isHeadersSent","ServerlessContext","DIContext","context","options","maxStackSize","getReqId","requestContext","requestId","awsRequestId","v4","replace","PlatformServerless","settings","promise","bootstrap","platform","callbacks","tokens","exports","concat","map","store","JsonEntityStore","from","children","values","list","operationId","flat","callback","propertyName","entity","fromMethod","platformHandler","logger","ready","stop","createInjector","PLATFORM_NAME","loadInjector","then","$log","Env","TEST","level","container","createContainer","setLoggerLevel","load","LambdaClientRequest","Promise","createFakeEvent","createFakeContext","lambdaName","resolvers","resolve","reject","init","multiValueHeaders","multiValueQueryStringParameters","resource","stageVariables","accountId","apiId","identity","stage","requestTimeEpoch","resourceId","resourcePath","callbackWaitsForEmptyEventLoop","functionName","functionVersion","invokedFunctionArn","logGroupName","logStreamName","memoryLimitInMB","assign","post","patch","put","delete","lambda","setTimeout","PlatformServerlessTest","DITest","before","instance","configure","reset","hasInjector","_injector","createServerlessContext","Lambda","decorator","JsonEntityFn","useDecorators","OperationPath","OperationId","Name","Path","Method","Get","OperationMethods","GET","Post","POST","Put","PUT","Patch","PATCH","Delete","DELETE"],"mappings":"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"}
@@ -3,14 +3,14 @@ export * from '@tsed/di';
3
3
  import { PlatformParams, DeserializerPipe, ValidationPipe } from '@tsed/platform-params';
4
4
  export * from '@tsed/platform-params';
5
5
  import { __decorate, __metadata } from 'tslib';
6
- import { isArray, AnyToPromise, isStream, isBoolean, isNumber, isString, getValue, Env, useDecorators } from '@tsed/core';
6
+ import { AnyToPromise, isStream, isBoolean, isNumber, isString, getValue, Env, useDecorators } from '@tsed/core';
7
7
  import { serialize } from '@tsed/json-mapper';
8
8
  import { PlatformExceptions } from '@tsed/platform-exceptions';
9
9
  import { $log } from '@tsed/logger';
10
- import { JsonEntityStore, JsonEntityFn, OperationPath, OperationId, OperationMethods } from '@tsed/schema';
10
+ import { getStatusMessage, JsonEntityStore, JsonEntityFn, OperationPath, OperationId, OperationMethods } from '@tsed/schema';
11
+ import { v4 } from 'uuid';
11
12
  import encodeUrl from 'encodeurl';
12
13
  import * as mime from 'mime';
13
- import statuses from 'statuses';
14
14
 
15
15
  function _extends() {
16
16
  _extends = Object.assign || function (target) {
@@ -59,35 +59,13 @@ function _classPrivateFieldLooseBase(receiver, privateKey) {
59
59
  return receiver;
60
60
  }
61
61
 
62
- function mapResponseHeaders(headers) {
63
- return Object.entries(headers).reduce((headers, [key, value]) => {
64
- if (isArray(value)) {
65
- return headers;
66
- }
67
-
68
- return _extends({}, headers, {
69
- [key]: value
70
- });
71
- }, {});
72
- }
73
- function mapResponseMultiValueHeaders(headers) {
74
- return Object.entries(headers).reduce((headers, [key, value]) => {
75
- if (!isArray(value)) {
76
- return headers;
77
- }
78
-
62
+ function mergeHeaders(specHeaders, headers) {
63
+ return Object.entries(specHeaders).reduce((headers, [key, item]) => {
64
+ key = key.toLowerCase();
79
65
  return _extends({}, headers, {
80
- [key]: value
66
+ [key]: headers[key] === undefined ? String(item.example) : headers[key]
81
67
  });
82
- }, {});
83
- }
84
-
85
- function toHeaders(headers) {
86
- return Object.entries(headers).reduce((headers, [key, item]) => {
87
- return _extends({}, headers, {
88
- [key]: item.example
89
- });
90
- }, {});
68
+ }, headers);
91
69
  }
92
70
  /**
93
71
  * @ignore
@@ -110,15 +88,13 @@ function setResponseHeaders(ctx) {
110
88
  response.status(operation.getStatus());
111
89
  }
112
90
 
91
+ const statusCode = response.statusCode;
113
92
  const headers = operation.getHeadersOf(response.statusCode);
114
- response.setHeaders(toHeaders(headers));
93
+ const mergedHeaders = mergeHeaders(headers, response.getHeaders());
94
+ response.setHeaders(mergedHeaders);
115
95
 
116
- if (endpoint.redirect) {
117
- response.redirect(endpoint.redirect.status, endpoint.redirect.url);
118
- }
119
-
120
- if (endpoint.location) {
121
- response.location(endpoint.location);
96
+ if (operation.isRedirection(statusCode)) {
97
+ response.redirect(statusCode, String(mergedHeaders["location"]));
122
98
  }
123
99
  }
124
100
 
@@ -170,10 +146,9 @@ let PlatformServerlessHandler = class PlatformServerlessHandler {
170
146
  const response = {
171
147
  statusCode: $ctx.response.getStatus(),
172
148
  body: body === undefined ? "" : body,
173
- headers: _extends({}, mapResponseHeaders($ctx.response.getHeaders()), {
149
+ headers: _extends({}, $ctx.response.getHeaders(), {
174
150
  "x-request-id": $ctx.id
175
151
  }),
176
- multiValueHeaders: mapResponseMultiValueHeaders($ctx.response.getHeaders()),
177
152
  isBase64Encoded: false
178
153
  };
179
154
  $ctx.destroy();
@@ -451,6 +426,17 @@ class ServerlessResponse {
451
426
 
452
427
  setHeader(key, item) {
453
428
  if (item !== null && item !== undefined) {
429
+ key = key.toLowerCase();
430
+
431
+ if (key === "location") {
432
+ // "back" is an alias for the referrer
433
+ if (item === "back") {
434
+ item = this.request.get("Referrer") || "/";
435
+ }
436
+
437
+ item = encodeUrl(String(item));
438
+ }
439
+
454
440
  _classPrivateFieldLooseBase(this, _headers)[_headers] = _extends({}, _classPrivateFieldLooseBase(this, _headers)[_headers], {
455
441
  [key.toLowerCase()]: item
456
442
  });
@@ -503,7 +489,7 @@ class ServerlessResponse {
503
489
  redirect(status, url) {
504
490
  // Set location header
505
491
  const address = this.location(url).get("Location");
506
- const body = `${statuses[status]}. Redirecting to ${address}`;
492
+ const body = `${getStatusMessage(status)}. Redirecting to ${address}`;
507
493
  this.status(status).set("Content-Length", Buffer.byteLength(body)).body(body);
508
494
  return this;
509
495
  }
@@ -515,14 +501,7 @@ class ServerlessResponse {
515
501
 
516
502
 
517
503
  location(url) {
518
- let loc = url; // "back" is an alias for the referrer
519
-
520
- if (url === "back") {
521
- loc = this.request.get("Referrer") || "/";
522
- } // set location
523
-
524
-
525
- return this.set("Location", encodeUrl(loc));
504
+ return this.set("Location", url);
526
505
  }
527
506
  /**
528
507
  * Send any data to your consumer.
@@ -600,10 +579,20 @@ class ServerlessContext extends DIContext {
600
579
 
601
580
  }
602
581
 
582
+ function getReqId(event, context) {
583
+ var _event$requestContext;
584
+
585
+ if (event != null && event.headers && event.headers["x-request-id"]) {
586
+ return event.headers["x-request-id"];
587
+ }
588
+
589
+ return (event == null ? void 0 : (_event$requestContext = event.requestContext) == null ? void 0 : _event$requestContext.requestId) || (context == null ? void 0 : context.awsRequestId) || v4().replace(/-/gi, "");
590
+ }
603
591
  /**
604
592
  * @platform
605
593
  */
606
594
 
595
+
607
596
  var _injector = /*#__PURE__*/_classPrivateFieldLooseKey("injector");
608
597
 
609
598
  var _promise = /*#__PURE__*/_classPrivateFieldLooseKey("promise");
@@ -678,7 +667,7 @@ class PlatformServerless {
678
667
  const $ctx = new ServerlessContext({
679
668
  event,
680
669
  context,
681
- id: event.requestContext.requestId,
670
+ id: getReqId(event, context),
682
671
  logger: _this.injector.logger,
683
672
  injector: _this.injector,
684
673
  endpoint: entity
@@ -837,6 +826,11 @@ class LambdaClientRequest extends Promise {
837
826
  return this;
838
827
  }
839
828
 
829
+ headers(headers) {
830
+ this.event.headers = _extends({}, this.event.headers, JSON.parse(JSON.stringify(headers)));
831
+ return this;
832
+ }
833
+
840
834
  body(body) {
841
835
  if (body !== undefined) {
842
836
  this.event.headers["content-type"] = "application/json";
@@ -892,7 +886,7 @@ class PlatformServerlessTest extends DITest {
892
886
  endpoint
893
887
  }) {
894
888
  const context = LambdaClientRequest.createFakeContext();
895
- const event = LambdaClientRequest.createFakeContext();
889
+ const event = LambdaClientRequest.createFakeEvent();
896
890
  return new ServerlessContext({
897
891
  event,
898
892
  context,
@@ -1 +1 @@
1
- {"version":3,"file":"index.modern.js","sources":["../src/utils/mapResponseHeaders.ts","../src/utils/setResponseHeaders.ts","../src/builder/PlatformServerlessHandler.ts","../src/domain/ServerlessRequest.ts","../src/domain/ServerlessResponse.ts","../src/domain/ServerlessContext.ts","../src/builder/PlatformServerless.ts","../src/services/PlatformServerlessTest.ts","../src/decorators/lambda.ts"],"sourcesContent":["import {HeaderValue} from \"../domain/ServerlessResponse\";\nimport {isArray} from \"@tsed/core\";\n\nexport function mapResponseHeaders(headers: Record<string, HeaderValue>): Record<string, boolean | string | number> {\n return Object.entries(headers).reduce((headers, [key, value]) => {\n if (isArray(value)) {\n return headers;\n }\n return {\n ...headers,\n [key]: value\n };\n }, {});\n}\n\nexport function mapResponseMultiValueHeaders(headers: Record<string, HeaderValue>): Record<string, Array<boolean | string | number>> {\n return Object.entries(headers).reduce((headers, [key, value]) => {\n if (!isArray(value)) {\n return headers;\n }\n\n return {\n ...headers,\n [key]: value\n };\n }, {});\n}\n","import {ServerlessContext} from \"../domain/ServerlessContext\";\n\nfunction toHeaders(headers: {[key: string]: any}) {\n return Object.entries(headers).reduce((headers, [key, item]) => {\n return {\n ...headers,\n [key]: item.example as any\n };\n }, {});\n}\n\n/**\n * @ignore\n */\nexport function setResponseHeaders(ctx: ServerlessContext) {\n const {response, endpoint} = ctx;\n const operation = endpoint.operation!;\n\n if (response.isDone()) {\n return;\n }\n\n if (!response.hasStatus()) {\n // apply status only if the isn't already modified\n response.status(operation.getStatus());\n }\n\n const headers = operation.getHeadersOf(response.statusCode);\n response.setHeaders(toHeaders(headers));\n\n if (endpoint.redirect) {\n response.redirect(endpoint.redirect.status, endpoint.redirect.url);\n }\n\n if (endpoint.location) {\n response.location(endpoint.location);\n }\n}\n","import {AnyPromiseResult, AnyToPromise, isBoolean, isNumber, isStream, isString} from \"@tsed/core\";\nimport {BaseContext, Inject, Injectable, InjectorService, ProviderScope, TokenProvider} from \"@tsed/di\";\nimport {serialize} from \"@tsed/json-mapper\";\nimport {PlatformExceptions} from \"@tsed/platform-exceptions\";\nimport {DeserializerPipe, PlatformParams, ValidationPipe} from \"@tsed/platform-params\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\nimport {mapResponseHeaders, mapResponseMultiValueHeaders} from \"../utils/mapResponseHeaders\";\nimport {setResponseHeaders} from \"../utils/setResponseHeaders\";\n\nfunction shouldBeSent(data: any) {\n return Buffer.isBuffer(data) || isBoolean(data) || isNumber(data) || isString(data) || data === null;\n}\n\nfunction shouldBeSerialized(data: any) {\n return !(isStream(data) || shouldBeSent(data) || data === undefined);\n}\n\n@Injectable({\n scope: ProviderScope.SINGLETON,\n imports: [DeserializerPipe, ValidationPipe]\n})\nexport class PlatformServerlessHandler {\n @Inject()\n protected injector: InjectorService;\n\n @Inject()\n protected params: PlatformParams;\n\n @Inject()\n protected exceptions: PlatformExceptions;\n\n createHandler(token: TokenProvider, propertyKey: string | symbol) {\n const promisedHandler = this.params.compileHandler({\n token,\n propertyKey\n });\n\n return async ($ctx: ServerlessContext) => {\n await this.injector.emit(\"$onRequest\", $ctx);\n\n await this.injector.runInContext($ctx, async () => {\n try {\n const resolver = new AnyToPromise();\n const handler = await promisedHandler;\n const result = await resolver.call(() => handler({$ctx}));\n\n this.processResult(result, $ctx);\n } catch (er) {\n $ctx.response.status(500).body(er);\n await this.exceptions.catch(er, ($ctx as unknown) as BaseContext);\n }\n });\n\n await this.injector.emit(\"$onResponse\", $ctx);\n\n return this.flush($ctx);\n };\n }\n\n private flush($ctx: ServerlessContext) {\n setResponseHeaders($ctx);\n\n let body: any = $ctx.response.getBody();\n\n if (shouldBeSerialized(body)) {\n body = JSON.stringify(body);\n }\n\n const response = {\n statusCode: $ctx.response.getStatus(),\n body: body === undefined ? \"\" : body,\n headers: {\n ...mapResponseHeaders($ctx.response.getHeaders()),\n \"x-request-id\": $ctx.id\n },\n multiValueHeaders: mapResponseMultiValueHeaders($ctx.response.getHeaders()),\n isBase64Encoded: false\n };\n\n $ctx.destroy();\n\n return response;\n }\n\n private processResult({status, headers, data}: AnyPromiseResult, $ctx: ServerlessContext) {\n if (status) {\n $ctx.response.status(status);\n }\n\n if (headers) {\n $ctx.response.setHeaders(headers);\n }\n\n if (data !== undefined) {\n data = $ctx.response.getStatus() !== 204 ? data : \"\";\n\n if (shouldBeSerialized(data)) {\n data = serialize(data, {\n ...$ctx.endpoint.getResponseOptions()\n });\n }\n\n $ctx.response.body(data);\n }\n }\n}\n","import type {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, Context} from \"aws-lambda\";\nimport {getValue} from \"@tsed/core\";\n\nexport interface ServerlessRequestOptions {\n event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n context: Context;\n}\n/**\n * @platform\n */\nexport class ServerlessRequest {\n readonly raw: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n\n constructor({event}: ServerlessRequestOptions) {\n this.raw = event;\n }\n\n get secure(): boolean {\n return true;\n }\n\n get host(): string {\n return this.get(\"host\");\n }\n\n get protocol(): string {\n return \"https\";\n }\n\n /**\n * Get the url of the request.\n *\n * Is equivalent of `express.response.originalUrl || express.response.url`.\n */\n get url(): string {\n return this.raw.path;\n }\n\n get headers() {\n return this.raw.headers;\n }\n\n get method(): string {\n return this.raw.httpMethod;\n }\n\n /**\n * Contains key-value pairs of data submitted in the request body. By default, it is `undefined`, and is populated when you use\n * `body-parsing` middleware such as `express.json()` or `express.urlencoded()`.\n */\n get body(): any {\n try {\n return this.raw.body ? JSON.parse(this.raw.body) : {};\n } catch (er) {\n return {};\n }\n }\n\n get rawBody(): any {\n return this.raw.body;\n }\n\n /**\n * This property is an object containing properties mapped to the named route `parameters`.\n * For example, if you have the route `/user/:name`, then the `name` property is available as `req.params.name`.\n * This object defaults to `{}`.\n */\n get params(): {[key: string]: any} {\n return this.raw.pathParameters || {};\n }\n\n /**\n * This property is an object containing a property for each query string parameter in the route.\n * When query parser is set to disabled, it is an empty object `{}`, otherwise it is the result of the configured query parser.\n */\n get query(): {[key: string]: any} {\n return this.raw.queryStringParameters || {};\n }\n\n /**\n * Returns the HTTP request header specified by field. The match is case-insensitive.\n *\n * ```typescript\n * request.get('Content-Type') // => \"text/plain\"\n * ```\n *\n * @param name\n */\n get(name: string) {\n return getValue(this.raw.headers, name);\n }\n\n destroy() {}\n}\n","import {getValue} from \"@tsed/core\";\nimport type {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, Context} from \"aws-lambda\";\nimport encodeUrl from \"encodeurl\";\nimport * as mime from \"mime\";\nimport statuses from \"statuses\";\nimport type {ServerlessRequest} from \"./ServerlessRequest\";\n\nexport interface ServerlessResponseOptions {\n event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n context: Context;\n request: ServerlessRequest;\n}\n\nexport type HeaderValue = Array<boolean | number | string> | boolean | number | string;\n\n/**\n * @platform\n */\nexport class ServerlessResponse {\n readonly event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n readonly request: ServerlessRequest;\n\n #status: number = 200;\n #body: any = undefined;\n #headers: Record<string, HeaderValue> = {};\n #locals: Record<string, any> = {};\n #isHeadersSent = false;\n #endListeners: Function[] = [];\n\n constructor({event, request}: ServerlessResponseOptions) {\n this.event = event;\n this.request = request;\n }\n\n /**\n * Get the current statusCode\n */\n get statusCode() {\n return this.#status;\n }\n\n set statusCode(status) {\n this.#status = status;\n }\n\n /**\n * An object that contains response local variables scoped to the request, and therefore available only to the view(s) rendered during that request / response cycle (if any). Otherwise, this property is identical to app.locals.\n *\n * This property is useful for exposing request-level information such as the request path name, authenticated user, user settings, and so on.\n */\n get locals() {\n return this.#locals;\n }\n\n getStatus() {\n return this.#status;\n }\n\n /**\n * Sets the HTTP status for the response.\n *\n * @param status\n */\n status(status: number) {\n this.#status = status;\n return this;\n }\n\n set(name: string, value: any) {\n return this.setHeader(name, value);\n }\n\n /**\n * Returns the HTTP response header specified by field. The match is case-insensitive.\n *\n * ```typescript\n * response.get('Content-Type') // => \"text/plain\"\n * ```\n *\n * @param name\n */\n get(name: string): string | number | boolean | undefined {\n return getValue(this.#headers, name.toLowerCase());\n }\n\n getHeaders(): Record<string, HeaderValue> {\n return {\n ...this.#headers\n };\n }\n\n hasStatus() {\n return this.#status !== 200;\n }\n\n /**\n * Set header `field` to `val`, or pass\n * an object of header fields.\n *\n * Examples:\n * ```typescript\n * response.setHeaders({ Accept: 'text/plain', 'X-API-Key': 'tobi' });\n * ```\n *\n * Aliased as `res.header()`.\n */\n setHeaders(headers: Record<string, HeaderValue>) {\n // apply headers\n Object.entries(headers).forEach(([key, item]) => {\n this.setHeader(key, item);\n });\n\n return this;\n }\n\n setHeader(key: string, item: HeaderValue | null | undefined) {\n if (item !== null && item !== undefined) {\n this.#headers = {\n ...this.#headers,\n [key.toLowerCase()]: item\n };\n }\n\n return this;\n }\n\n /**\n * Set `Content-Type` response header with `type` through `mime.lookup()`\n * when it does not contain \"/\", or set the Content-Type to `type` otherwise.\n *\n * Examples:\n *\n * res.type('.html');\n * res.type('html');\n * res.type('json');\n * res.type('application/json');\n * res.type('png');\n */\n contentType(contentType: string) {\n this.setHeader(\"Content-Type\", mime.getType(contentType));\n\n return this;\n }\n\n contentLength(length: number) {\n this.setHeader(\"Content-Length\", length);\n return this;\n }\n\n getContentLength() {\n if (this.get(\"Content-Length\")) {\n return parseInt(this.get(\"Content-Length\") as any, 10) || 0;\n }\n }\n\n getContentType() {\n return String(this.get(\"Content-Type\") || \"\").split(\";\")[0];\n }\n\n /**\n * Redirects to the URL derived from the specified path, with specified status, a positive integer that corresponds to an [HTTP status code](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html).\n * If not specified, status defaults to `302 Found`.\n *\n * @param status\n * @param url\n */\n redirect(status: number, url: string) {\n // Set location header\n const address = this.location(url).get(\"Location\");\n const body = `${(statuses as any)[status]}. Redirecting to ${address}`;\n\n this.status(status).set(\"Content-Length\", Buffer.byteLength(body)).body(body);\n\n return this;\n }\n\n /**\n * Sets the response Location HTTP header to the specified path parameter.\n *\n * @param url\n */\n location(url: string) {\n let loc = url;\n\n // \"back\" is an alias for the referrer\n if (url === \"back\") {\n loc = this.request.get(\"Referrer\") || \"/\";\n }\n\n // set location\n return this.set(\"Location\", encodeUrl(loc));\n }\n\n /**\n * Send any data to your consumer.\n *\n * This method accept a ReadableStream, a plain object, boolean, string, number, null and undefined data.\n * It choose the better way to send the data.\n *\n * @param body\n */\n body(body: any) {\n this.#body = body;\n\n return this;\n }\n\n getBody() {\n return this.#body;\n }\n\n isDone(): boolean {\n return this.#isHeadersSent;\n }\n\n onEnd(cb: Function) {\n this.#endListeners.push(cb);\n\n return this;\n }\n\n destroy() {\n this.#endListeners.forEach((cb: Function) => cb());\n this.#isHeadersSent = true;\n }\n\n isHeadersSent() {\n return this.#isHeadersSent;\n }\n}\n","import {DIContext, DIContextOptions, LocalsContainer} from \"@tsed/di\";\nimport {JsonEntityStore} from \"@tsed/schema\";\nimport {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, Context} from \"aws-lambda\";\nimport {ServerlessRequest} from \"./ServerlessRequest\";\nimport {ServerlessResponse} from \"./ServerlessResponse\";\n\nexport interface ServerlessContextOptions extends DIContextOptions {\n event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n context: Context;\n endpoint: JsonEntityStore;\n}\n\nexport class ServerlessContext extends DIContext {\n readonly response: ServerlessResponse;\n readonly request: ServerlessRequest;\n readonly context: Context;\n readonly event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n readonly endpoint: JsonEntityStore;\n\n constructor({event, context, endpoint, ...options}: ServerlessContextOptions) {\n super({\n ...options,\n maxStackSize: 0\n });\n this.context = context;\n this.event = event;\n this.request = new ServerlessRequest({event, context});\n this.response = new ServerlessResponse({event, context, request: this.request});\n this.endpoint = endpoint;\n }\n\n async destroy() {\n await super.destroy();\n\n this.request.destroy();\n this.response.destroy();\n }\n}\n","import {Env, Type} from \"@tsed/core\";\nimport {createContainer, InjectorService, setLoggerLevel} from \"@tsed/di\";\nimport {$log, Logger} from \"@tsed/logger\";\nimport {JsonEntityStore} from \"@tsed/schema\";\nimport type {\n APIGatewayEventDefaultAuthorizerContext,\n APIGatewayProxyEventBase,\n APIGatewayProxyHandler,\n APIGatewayProxyResult,\n Context\n} from \"aws-lambda\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\nimport {PlatformServerlessHandler} from \"./PlatformServerlessHandler\";\n\n/**\n * @platform\n */\nexport class PlatformServerless {\n readonly name: string = \"PlatformServerless\";\n\n #injector: InjectorService;\n #promise: Promise<void>;\n\n get injector(): InjectorService {\n return this.#injector;\n }\n\n get settings() {\n return this.injector.settings;\n }\n\n get promise() {\n return this.#promise;\n }\n\n static bootstrap(settings: Partial<TsED.Configuration> & {lambda?: Type[]} = {}): PlatformServerless {\n const platform = new PlatformServerless();\n\n platform.bootstrap(settings);\n\n return platform;\n }\n\n public callbacks(tokens: Type | Type[] = [], exports = {}): Record<string, APIGatewayProxyHandler> {\n return this.settings\n .get<Type[]>(\"lambda\", [])\n .concat(tokens)\n .map((token) => {\n const store = JsonEntityStore.from(token);\n\n return [...store.children.values()].reduce((list, store) => {\n const operationId = store.operation?.get(\"operationId\");\n\n return operationId ? [...list, {store, operationId}] : list;\n }, []);\n })\n .flat()\n .reduce((exports, {store, operationId}) => {\n return {\n ...exports,\n [operationId]: this.callback(store.token, store.propertyName)\n };\n }, exports);\n }\n\n public callback(token: Type<any>, propertyKey: string): APIGatewayProxyHandler {\n const entity = JsonEntityStore.fromMethod(token, propertyKey);\n let handler: ($ctx: ServerlessContext) => Promise<APIGatewayProxyResult>;\n\n return async (event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>, context: Context) => {\n await this.#promise;\n\n if (!handler) {\n const platformHandler = this.#injector.get<PlatformServerlessHandler>(PlatformServerlessHandler)!;\n handler = await platformHandler.createHandler(token, propertyKey);\n }\n\n const $ctx = new ServerlessContext({\n event,\n context,\n id: event.requestContext.requestId,\n logger: this.injector.logger as Logger,\n injector: this.injector,\n endpoint: entity\n });\n\n return handler($ctx);\n };\n }\n\n public async ready() {\n await this.#injector.emit(\"$onReady\");\n }\n\n public async stop() {\n await this.#injector.emit(\"$onDestroy\");\n return this.injector.destroy();\n }\n\n protected bootstrap(settings: Partial<TsED.Configuration> = {}) {\n this.#promise = this.createInjector({\n ...settings,\n PLATFORM_NAME: this.name\n })\n .loadInjector()\n .then(() => this.ready());\n\n return this;\n }\n\n protected createInjector(settings: any) {\n this.#injector = new InjectorService();\n this.#injector.logger = $log;\n this.#injector.settings.set(settings);\n\n if (this.#injector.settings.get(\"env\") === Env.TEST && !settings?.logger?.level) {\n $log.stop();\n }\n\n return this;\n }\n\n protected async loadInjector() {\n const container = createContainer();\n\n setLoggerLevel(this.#injector);\n\n await this.#injector.emit(\"$beforeInit\");\n\n await this.#injector.load(container);\n\n await this.#injector.emit(\"$afterInit\");\n }\n}\n","import {Type} from \"@tsed/core\";\nimport {DITest} from \"@tsed/di\";\nimport {Logger} from \"@tsed/logger\";\nimport {JsonEntityStore} from \"@tsed/schema\";\nimport {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, APIGatewayProxyHandler, Context} from \"aws-lambda\";\nimport {APIGatewayProxyResult} from \"aws-lambda/trigger/api-gateway-proxy\";\nimport {PlatformServerless} from \"../builder/PlatformServerless\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\n\nexport interface LambdaPromiseResult extends Promise<APIGatewayProxyResult> {}\n\nexport class LambdaClientRequest extends Promise<APIGatewayProxyResult> {\n event = LambdaClientRequest.createFakeEvent();\n context = LambdaClientRequest.createFakeContext();\n\n static call(lambdaName: string) {\n const resolvers: any = {};\n const promise = new LambdaClientRequest((resolve, reject) => {\n resolvers.resolve = resolve;\n resolvers.reject = reject;\n });\n\n promise.init(lambdaName, resolvers.resolve, resolvers.reject);\n\n return promise;\n }\n\n static createFakeEvent(event: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n return {\n body: \"\",\n headers: {},\n httpMethod: \"\",\n isBase64Encoded: false,\n multiValueHeaders: {},\n multiValueQueryStringParameters: {},\n path: event.path || \"/\",\n pathParameters: {},\n queryStringParameters: {},\n resource: \"\",\n stageVariables: {},\n ...event,\n requestContext: {\n ...event?.requestContext,\n accountId: \"\",\n apiId: \"\",\n protocol: \"https\",\n httpMethod: \"\",\n identity: {} as any,\n path: event.path || \"/\",\n stage: \"\",\n requestId: \"requestId\",\n requestTimeEpoch: 0,\n resourceId: 1,\n resourcePath: event.path || \"/\"\n } as any\n } as APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n }\n\n static createFakeContext(context?: Context): Context {\n return {\n awsRequestId: \"awsRequestId\",\n callbackWaitsForEmptyEventLoop: false,\n functionName: \"\",\n functionVersion: \"\",\n invokedFunctionArn: \"\",\n logGroupName: \"\",\n logStreamName: \"\",\n memoryLimitInMB: \"\",\n ...(context || {})\n } as Context;\n }\n\n get(path: string, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"GET\";\n\n return this;\n }\n\n post(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"POST\";\n\n this.body(body);\n\n return this;\n }\n\n patch(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"PATCH\";\n\n this.body(body);\n\n return this;\n }\n\n put(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"PUT\";\n\n this.body(body);\n\n return this;\n }\n\n delete(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"POST\";\n\n this.body(body);\n\n return this;\n }\n\n query(query: any) {\n this.event.queryStringParameters = {\n ...this.event.queryStringParameters,\n ...JSON.parse(JSON.stringify(query))\n };\n\n return this;\n }\n\n params(pathParameters: any) {\n this.event.pathParameters = {\n ...this.event.pathParameters,\n ...JSON.parse(JSON.stringify(pathParameters))\n };\n\n return this;\n }\n\n body(body: any) {\n if (body !== undefined) {\n this.event.headers[\"content-type\"] = \"application/json\";\n\n this.event.body = JSON.stringify(body);\n }\n\n return this;\n }\n\n protected init(lambda: string, resolve: Function, reject: Function) {\n setTimeout(async () => {\n try {\n const result = await PlatformServerlessTest.callbacks[lambda](this.event, this.context, resolve as any);\n resolve(result as any);\n } catch (er) {\n reject(er);\n }\n });\n }\n}\n\nexport class PlatformServerlessTest extends DITest {\n static callbacks: Record<string, APIGatewayProxyHandler> = {};\n static instance: PlatformServerless;\n static request = LambdaClientRequest;\n\n static bootstrap(settings: Partial<TsED.Configuration & {lambda: Type[]}> = {}) {\n return async function before(): Promise<void> {\n // @ts-ignore\n const instance = await PlatformServerless.bootstrap(DITest.configure(settings));\n PlatformServerlessTest.instance = instance;\n PlatformServerlessTest.callbacks = instance.callbacks();\n // used by inject method\n DITest.injector = instance.injector;\n\n return instance.promise;\n };\n }\n\n /**\n * Resets the test injector of the test context, so it won't pollute your next test. Call this in your `tearDown` logic.\n */\n static async reset() {\n if (PlatformServerlessTest.instance) {\n await PlatformServerlessTest.instance.stop();\n }\n if (DITest.hasInjector()) {\n await DITest.injector.destroy();\n DITest._injector = null;\n }\n }\n\n static createServerlessContext({endpoint}: {endpoint: JsonEntityStore}) {\n const context: any = LambdaClientRequest.createFakeContext();\n const event: any = LambdaClientRequest.createFakeContext();\n\n return new ServerlessContext({\n event,\n context,\n id: context.awsRequestId,\n logger: PlatformServerlessTest.injector.logger as Logger,\n injector: PlatformServerlessTest.injector,\n endpoint\n });\n }\n}\n","import {useDecorators} from \"@tsed/core\";\nimport {JsonEntityFn, JsonSchemaObject, OperationId, OperationMethods, OperationPath} from \"@tsed/schema\";\n\nexport interface LambdaOptions {\n name?: string;\n path: string;\n method: OperationMethods | string;\n}\n\nexport interface LambdaChainedDecorators {\n <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>): TypedPropertyDescriptor<T> | void;\n\n /**\n *\n * @param name\n */\n Name(name: string): this;\n\n Method(method: string): this;\n\n Path(path: string): this;\n}\n/**\n * Declare a lambda endpoint.\n *\n * ```typescript\n * export class Lambda {\n *\n * }\n * ```\n *\n * @decorator\n */\nexport function Lambda(name?: string): LambdaChainedDecorators {\n const options: LambdaOptions = {\n path: \"/\",\n method: \"\",\n name\n };\n\n const decorator: any = JsonEntityFn((entity) => {\n return useDecorators(OperationPath(options.method, options.path), OperationId(options.name || String(entity.propertyKey)));\n });\n\n decorator.Name = (name: string) => {\n options.name = name;\n return decorator;\n };\n\n decorator.Path = (path: string) => {\n options.path = path;\n return decorator;\n };\n\n decorator.Method = (method: string) => {\n options.method = method;\n return decorator;\n };\n\n return decorator;\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Get(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.GET);\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Post(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.POST);\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Put(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.PUT);\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Patch(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.PATCH);\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Delete(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.DELETE);\n}\n"],"names":["mapResponseHeaders","headers","Object","entries","reduce","key","value","isArray","mapResponseMultiValueHeaders","toHeaders","item","example","setResponseHeaders","ctx","response","endpoint","operation","isDone","hasStatus","status","getStatus","getHeadersOf","statusCode","setHeaders","redirect","url","location","shouldBeSent","data","Buffer","isBuffer","isBoolean","isNumber","isString","shouldBeSerialized","isStream","undefined","PlatformServerlessHandler","createHandler","token","propertyKey","promisedHandler","params","compileHandler","$ctx","injector","emit","runInContext","resolver","AnyToPromise","handler","result","call","processResult","er","body","exceptions","catch","flush","getBody","JSON","stringify","getHeaders","id","multiValueHeaders","isBase64Encoded","destroy","serialize","getResponseOptions","__decorate","Inject","InjectorService","PlatformParams","PlatformExceptions","Injectable","scope","ProviderScope","SINGLETON","imports","DeserializerPipe","ValidationPipe","ServerlessRequest","constructor","event","raw","secure","host","get","protocol","path","method","httpMethod","parse","rawBody","pathParameters","query","queryStringParameters","name","getValue","ServerlessResponse","request","locals","set","setHeader","toLowerCase","forEach","contentType","mime","getType","contentLength","length","getContentLength","parseInt","getContentType","String","split","address","statuses","byteLength","loc","encodeUrl","onEnd","cb","push","isHeadersSent","ServerlessContext","DIContext","context","options","maxStackSize","PlatformServerless","settings","promise","bootstrap","platform","callbacks","tokens","exports","concat","map","store","JsonEntityStore","from","children","values","list","operationId","flat","callback","propertyName","entity","fromMethod","platformHandler","requestContext","requestId","logger","ready","stop","createInjector","PLATFORM_NAME","loadInjector","then","$log","Env","TEST","level","container","createContainer","setLoggerLevel","load","LambdaClientRequest","Promise","createFakeEvent","createFakeContext","lambdaName","resolvers","resolve","reject","init","multiValueQueryStringParameters","resource","stageVariables","accountId","apiId","identity","stage","requestTimeEpoch","resourceId","resourcePath","awsRequestId","callbackWaitsForEmptyEventLoop","functionName","functionVersion","invokedFunctionArn","logGroupName","logStreamName","memoryLimitInMB","assign","post","patch","put","delete","lambda","setTimeout","PlatformServerlessTest","DITest","before","instance","configure","reset","hasInjector","_injector","createServerlessContext","Lambda","decorator","JsonEntityFn","useDecorators","OperationPath","OperationId","Name","Path","Method","Get","OperationMethods","GET","Post","POST","Put","PUT","Patch","PATCH","Delete","DELETE"],"mappings":"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"}
1
+ {"version":3,"file":"index.modern.js","sources":["../src/utils/setResponseHeaders.ts","../src/builder/PlatformServerlessHandler.ts","../src/domain/ServerlessRequest.ts","../src/domain/ServerlessResponse.ts","../src/domain/ServerlessContext.ts","../src/builder/PlatformServerless.ts","../src/services/PlatformServerlessTest.ts","../src/decorators/lambda.ts"],"sourcesContent":["import {JsonHeader} from \"@tsed/schema\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\nimport {HeaderValue} from \"../domain/ServerlessResponse\";\n\nfunction mergeHeaders(specHeaders: Record<string, JsonHeader & {example: string}>, headers: Record<string, HeaderValue>) {\n return Object.entries(specHeaders).reduce((headers, [key, item]) => {\n key = key.toLowerCase();\n return {\n ...headers,\n [key]: headers[key] === undefined ? String(item.example) : headers[key]\n };\n }, headers);\n}\n\n/**\n * @ignore\n */\nexport function setResponseHeaders(ctx: ServerlessContext) {\n const {response, endpoint} = ctx;\n const operation = endpoint.operation!;\n\n if (response.isDone()) {\n return;\n }\n\n if (!response.hasStatus()) {\n // apply status only if the isn't already modified\n response.status(operation.getStatus());\n }\n\n const statusCode = response.statusCode;\n const headers = operation.getHeadersOf(response.statusCode);\n const mergedHeaders = mergeHeaders(headers, response.getHeaders());\n\n response.setHeaders(mergedHeaders);\n\n if (operation.isRedirection(statusCode)) {\n response.redirect(statusCode, String(mergedHeaders[\"location\"]));\n }\n}\n","import {AnyPromiseResult, AnyToPromise, isBoolean, isNumber, isStream, isString} from \"@tsed/core\";\nimport {BaseContext, Inject, Injectable, InjectorService, ProviderScope, TokenProvider} from \"@tsed/di\";\nimport {serialize} from \"@tsed/json-mapper\";\nimport {PlatformExceptions} from \"@tsed/platform-exceptions\";\nimport {DeserializerPipe, PlatformParams, ValidationPipe} from \"@tsed/platform-params\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\nimport {setResponseHeaders} from \"../utils/setResponseHeaders\";\n\nfunction shouldBeSent(data: any) {\n return Buffer.isBuffer(data) || isBoolean(data) || isNumber(data) || isString(data) || data === null;\n}\n\nfunction shouldBeSerialized(data: any) {\n return !(isStream(data) || shouldBeSent(data) || data === undefined);\n}\n\n@Injectable({\n scope: ProviderScope.SINGLETON,\n imports: [DeserializerPipe, ValidationPipe]\n})\nexport class PlatformServerlessHandler {\n @Inject()\n protected injector: InjectorService;\n\n @Inject()\n protected params: PlatformParams;\n\n @Inject()\n protected exceptions: PlatformExceptions;\n\n createHandler(token: TokenProvider, propertyKey: string | symbol) {\n const promisedHandler = this.params.compileHandler({\n token,\n propertyKey\n });\n\n return async ($ctx: ServerlessContext) => {\n await this.injector.emit(\"$onRequest\", $ctx);\n\n await this.injector.runInContext($ctx, async () => {\n try {\n const resolver = new AnyToPromise();\n const handler = await promisedHandler;\n const result = await resolver.call(() => handler({$ctx}));\n\n this.processResult(result, $ctx);\n } catch (er) {\n $ctx.response.status(500).body(er);\n await this.exceptions.catch(er, ($ctx as unknown) as BaseContext);\n }\n });\n\n await this.injector.emit(\"$onResponse\", $ctx);\n\n return this.flush($ctx);\n };\n }\n\n private flush($ctx: ServerlessContext) {\n setResponseHeaders($ctx);\n\n let body: any = $ctx.response.getBody();\n\n if (shouldBeSerialized(body)) {\n body = JSON.stringify(body);\n }\n\n const response = {\n statusCode: $ctx.response.getStatus(),\n body: body === undefined ? \"\" : body,\n headers: {\n ...$ctx.response.getHeaders(),\n \"x-request-id\": $ctx.id\n },\n isBase64Encoded: false\n };\n\n $ctx.destroy();\n\n return response;\n }\n\n private processResult({status, headers, data}: AnyPromiseResult, $ctx: ServerlessContext) {\n if (status) {\n $ctx.response.status(status);\n }\n\n if (headers) {\n $ctx.response.setHeaders(headers);\n }\n\n if (data !== undefined) {\n data = $ctx.response.getStatus() !== 204 ? data : \"\";\n\n if (shouldBeSerialized(data)) {\n data = serialize(data, {\n ...$ctx.endpoint.getResponseOptions()\n });\n }\n\n $ctx.response.body(data);\n }\n }\n}\n","import type {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, Context} from \"aws-lambda\";\nimport {getValue} from \"@tsed/core\";\n\nexport interface ServerlessRequestOptions {\n event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n context: Context;\n}\n/**\n * @platform\n */\nexport class ServerlessRequest {\n readonly raw: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n\n constructor({event}: ServerlessRequestOptions) {\n this.raw = event;\n }\n\n get secure(): boolean {\n return true;\n }\n\n get host(): string {\n return this.get(\"host\");\n }\n\n get protocol(): string {\n return \"https\";\n }\n\n /**\n * Get the url of the request.\n *\n * Is equivalent of `express.response.originalUrl || express.response.url`.\n */\n get url(): string {\n return this.raw.path;\n }\n\n get headers() {\n return this.raw.headers;\n }\n\n get method(): string {\n return this.raw.httpMethod;\n }\n\n /**\n * Contains key-value pairs of data submitted in the request body. By default, it is `undefined`, and is populated when you use\n * `body-parsing` middleware such as `express.json()` or `express.urlencoded()`.\n */\n get body(): any {\n try {\n return this.raw.body ? JSON.parse(this.raw.body) : {};\n } catch (er) {\n return {};\n }\n }\n\n get rawBody(): any {\n return this.raw.body;\n }\n\n /**\n * This property is an object containing properties mapped to the named route `parameters`.\n * For example, if you have the route `/user/:name`, then the `name` property is available as `req.params.name`.\n * This object defaults to `{}`.\n */\n get params(): {[key: string]: any} {\n return this.raw.pathParameters || {};\n }\n\n /**\n * This property is an object containing a property for each query string parameter in the route.\n * When query parser is set to disabled, it is an empty object `{}`, otherwise it is the result of the configured query parser.\n */\n get query(): {[key: string]: any} {\n return this.raw.queryStringParameters || {};\n }\n\n /**\n * Returns the HTTP request header specified by field. The match is case-insensitive.\n *\n * ```typescript\n * request.get('Content-Type') // => \"text/plain\"\n * ```\n *\n * @param name\n */\n get(name: string) {\n return getValue(this.raw.headers, name);\n }\n\n destroy() {}\n}\n","import {getValue} from \"@tsed/core\";\nimport {getStatusMessage} from \"@tsed/schema\";\nimport type {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, Context} from \"aws-lambda\";\nimport encodeUrl from \"encodeurl\";\nimport * as mime from \"mime\";\nimport type {ServerlessRequest} from \"./ServerlessRequest\";\n\nexport interface ServerlessResponseOptions {\n event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n context: Context;\n request: ServerlessRequest;\n}\n\nexport type HeaderValue = boolean | number | string;\n\n/**\n * @platform\n */\nexport class ServerlessResponse {\n readonly event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n readonly request: ServerlessRequest;\n\n #status: number = 200;\n #body: any = undefined;\n #headers: Record<string, HeaderValue> = {};\n #locals: Record<string, any> = {};\n #isHeadersSent = false;\n #endListeners: Function[] = [];\n\n constructor({event, request}: ServerlessResponseOptions) {\n this.event = event;\n this.request = request;\n }\n\n /**\n * Get the current statusCode\n */\n get statusCode() {\n return this.#status;\n }\n\n set statusCode(status) {\n this.#status = status;\n }\n\n /**\n * An object that contains response local variables scoped to the request, and therefore available only to the view(s) rendered during that request / response cycle (if any). Otherwise, this property is identical to app.locals.\n *\n * This property is useful for exposing request-level information such as the request path name, authenticated user, user settings, and so on.\n */\n get locals() {\n return this.#locals;\n }\n\n getStatus() {\n return this.#status;\n }\n\n /**\n * Sets the HTTP status for the response.\n *\n * @param status\n */\n status(status: number) {\n this.#status = status;\n return this;\n }\n\n set(name: string, value: any) {\n return this.setHeader(name, value);\n }\n\n /**\n * Returns the HTTP response header specified by field. The match is case-insensitive.\n *\n * ```typescript\n * response.get('Content-Type') // => \"text/plain\"\n * ```\n *\n * @param name\n */\n get(name: string): string | number | boolean | undefined {\n return getValue(this.#headers, name.toLowerCase());\n }\n\n getHeaders(): Record<string, HeaderValue> {\n return {\n ...this.#headers\n };\n }\n\n hasStatus() {\n return this.#status !== 200;\n }\n\n /**\n * Set header `field` to `val`, or pass\n * an object of header fields.\n *\n * Examples:\n * ```typescript\n * response.setHeaders({ Accept: 'text/plain', 'X-API-Key': 'tobi' });\n * ```\n *\n * Aliased as `res.header()`.\n */\n setHeaders(headers: Record<string, HeaderValue>) {\n // apply headers\n Object.entries(headers).forEach(([key, item]) => {\n this.setHeader(key, item);\n });\n\n return this;\n }\n\n setHeader(key: string, item: HeaderValue | null | undefined) {\n if (item !== null && item !== undefined) {\n key = key.toLowerCase();\n\n if (key === \"location\") {\n // \"back\" is an alias for the referrer\n if (item === \"back\") {\n item = this.request.get(\"Referrer\") || \"/\";\n }\n\n item = encodeUrl(String(item));\n }\n\n this.#headers = {\n ...this.#headers,\n [key.toLowerCase()]: item as any\n };\n }\n\n return this;\n }\n\n /**\n * Set `Content-Type` response header with `type` through `mime.lookup()`\n * when it does not contain \"/\", or set the Content-Type to `type` otherwise.\n *\n * Examples:\n *\n * res.type('.html');\n * res.type('html');\n * res.type('json');\n * res.type('application/json');\n * res.type('png');\n */\n contentType(contentType: string) {\n this.setHeader(\"Content-Type\", mime.getType(contentType));\n\n return this;\n }\n\n contentLength(length: number) {\n this.setHeader(\"Content-Length\", length);\n return this;\n }\n\n getContentLength() {\n if (this.get(\"Content-Length\")) {\n return parseInt(this.get(\"Content-Length\") as any, 10) || 0;\n }\n }\n\n getContentType() {\n return String(this.get(\"Content-Type\") || \"\").split(\";\")[0];\n }\n\n /**\n * Redirects to the URL derived from the specified path, with specified status, a positive integer that corresponds to an [HTTP status code](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html).\n * If not specified, status defaults to `302 Found`.\n *\n * @param status\n * @param url\n */\n redirect(status: number, url: string) {\n // Set location header\n const address = this.location(url).get(\"Location\");\n const body = `${getStatusMessage(status)}. Redirecting to ${address}`;\n\n this.status(status).set(\"Content-Length\", Buffer.byteLength(body)).body(body);\n\n return this;\n }\n\n /**\n * Sets the response Location HTTP header to the specified path parameter.\n *\n * @param url\n */\n location(url: string) {\n return this.set(\"Location\", url);\n }\n\n /**\n * Send any data to your consumer.\n *\n * This method accept a ReadableStream, a plain object, boolean, string, number, null and undefined data.\n * It choose the better way to send the data.\n *\n * @param body\n */\n body(body: any) {\n this.#body = body;\n\n return this;\n }\n\n getBody() {\n return this.#body;\n }\n\n isDone(): boolean {\n return this.#isHeadersSent;\n }\n\n onEnd(cb: Function) {\n this.#endListeners.push(cb);\n\n return this;\n }\n\n destroy() {\n this.#endListeners.forEach((cb: Function) => cb());\n this.#isHeadersSent = true;\n }\n\n isHeadersSent() {\n return this.#isHeadersSent;\n }\n}\n","import {DIContext, DIContextOptions, LocalsContainer} from \"@tsed/di\";\nimport {JsonEntityStore} from \"@tsed/schema\";\nimport {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, Context} from \"aws-lambda\";\nimport {ServerlessRequest} from \"./ServerlessRequest\";\nimport {ServerlessResponse} from \"./ServerlessResponse\";\n\nexport interface ServerlessContextOptions extends DIContextOptions {\n event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n context: Context;\n endpoint: JsonEntityStore;\n}\n\nexport class ServerlessContext extends DIContext {\n readonly response: ServerlessResponse;\n readonly request: ServerlessRequest;\n readonly context: Context;\n readonly event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n readonly endpoint: JsonEntityStore;\n\n constructor({event, context, endpoint, ...options}: ServerlessContextOptions) {\n super({\n ...options,\n maxStackSize: 0\n });\n this.context = context;\n this.event = event;\n this.request = new ServerlessRequest({event, context});\n this.response = new ServerlessResponse({event, context, request: this.request});\n this.endpoint = endpoint;\n }\n\n async destroy() {\n await super.destroy();\n\n this.request.destroy();\n this.response.destroy();\n }\n}\n","import {Env, Type} from \"@tsed/core\";\nimport {createContainer, InjectorService, setLoggerLevel} from \"@tsed/di\";\nimport {$log, Logger} from \"@tsed/logger\";\nimport {JsonEntityStore} from \"@tsed/schema\";\nimport type {\n APIGatewayEventDefaultAuthorizerContext,\n APIGatewayProxyEventBase,\n APIGatewayProxyHandler,\n APIGatewayProxyResult,\n Context\n} from \"aws-lambda\";\nimport {v4} from \"uuid\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\nimport {PlatformServerlessHandler} from \"./PlatformServerlessHandler\";\n\nfunction getReqId(event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>, context: Context) {\n if (event?.headers && event.headers[\"x-request-id\"]) {\n return event.headers[\"x-request-id\"];\n }\n\n return event?.requestContext?.requestId || context?.awsRequestId || v4().replace(/-/gi, \"\");\n}\n\n/**\n * @platform\n */\nexport class PlatformServerless {\n readonly name: string = \"PlatformServerless\";\n\n #injector: InjectorService;\n #promise: Promise<void>;\n\n get injector(): InjectorService {\n return this.#injector;\n }\n\n get settings() {\n return this.injector.settings;\n }\n\n get promise() {\n return this.#promise;\n }\n\n static bootstrap(settings: Partial<TsED.Configuration> & {lambda?: Type[]} = {}): PlatformServerless {\n const platform = new PlatformServerless();\n\n platform.bootstrap(settings);\n\n return platform;\n }\n\n public callbacks(tokens: Type | Type[] = [], exports = {}): Record<string, APIGatewayProxyHandler> {\n return this.settings\n .get<Type[]>(\"lambda\", [])\n .concat(tokens)\n .map((token) => {\n const store = JsonEntityStore.from(token);\n\n return [...store.children.values()].reduce((list, store) => {\n const operationId = store.operation?.get(\"operationId\");\n\n return operationId ? [...list, {store, operationId}] : list;\n }, []);\n })\n .flat()\n .reduce((exports, {store, operationId}) => {\n return {\n ...exports,\n [operationId]: this.callback(store.token, store.propertyName)\n };\n }, exports);\n }\n\n public callback(token: Type<any>, propertyKey: string): APIGatewayProxyHandler {\n const entity = JsonEntityStore.fromMethod(token, propertyKey);\n let handler: ($ctx: ServerlessContext) => Promise<APIGatewayProxyResult>;\n\n return async (event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>, context: Context) => {\n await this.#promise;\n\n if (!handler) {\n const platformHandler = this.#injector.get<PlatformServerlessHandler>(PlatformServerlessHandler)!;\n handler = await platformHandler.createHandler(token, propertyKey);\n }\n\n const $ctx = new ServerlessContext({\n event,\n context,\n id: getReqId(event, context),\n logger: this.injector.logger as Logger,\n injector: this.injector,\n endpoint: entity\n });\n\n return handler($ctx);\n };\n }\n\n public async ready() {\n await this.#injector.emit(\"$onReady\");\n }\n\n public async stop() {\n await this.#injector.emit(\"$onDestroy\");\n return this.injector.destroy();\n }\n\n protected bootstrap(settings: Partial<TsED.Configuration> = {}) {\n this.#promise = this.createInjector({\n ...settings,\n PLATFORM_NAME: this.name\n })\n .loadInjector()\n .then(() => this.ready());\n\n return this;\n }\n\n protected createInjector(settings: any) {\n this.#injector = new InjectorService();\n this.#injector.logger = $log;\n this.#injector.settings.set(settings);\n\n if (this.#injector.settings.get(\"env\") === Env.TEST && !settings?.logger?.level) {\n $log.stop();\n }\n\n return this;\n }\n\n protected async loadInjector() {\n const container = createContainer();\n\n setLoggerLevel(this.#injector);\n\n await this.#injector.emit(\"$beforeInit\");\n\n await this.#injector.load(container);\n\n await this.#injector.emit(\"$afterInit\");\n }\n}\n","import {Type} from \"@tsed/core\";\nimport {DITest} from \"@tsed/di\";\nimport {Logger} from \"@tsed/logger\";\nimport {JsonEntityStore} from \"@tsed/schema\";\nimport {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, APIGatewayProxyHandler, Context} from \"aws-lambda\";\nimport {APIGatewayProxyResult} from \"aws-lambda/trigger/api-gateway-proxy\";\nimport {PlatformServerless} from \"../builder/PlatformServerless\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\n\nexport interface LambdaPromiseResult extends Promise<APIGatewayProxyResult> {}\n\nexport class LambdaClientRequest extends Promise<APIGatewayProxyResult> {\n event = LambdaClientRequest.createFakeEvent();\n context = LambdaClientRequest.createFakeContext();\n\n static call(lambdaName: string) {\n const resolvers: any = {};\n const promise = new LambdaClientRequest((resolve, reject) => {\n resolvers.resolve = resolve;\n resolvers.reject = reject;\n });\n\n promise.init(lambdaName, resolvers.resolve, resolvers.reject);\n\n return promise;\n }\n\n static createFakeEvent(event: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n return {\n body: \"\",\n headers: {},\n httpMethod: \"\",\n isBase64Encoded: false,\n multiValueHeaders: {},\n multiValueQueryStringParameters: {},\n path: event.path || \"/\",\n pathParameters: {},\n queryStringParameters: {},\n resource: \"\",\n stageVariables: {},\n ...event,\n requestContext: {\n ...event?.requestContext,\n accountId: \"\",\n apiId: \"\",\n protocol: \"https\",\n httpMethod: \"\",\n identity: {} as any,\n path: event.path || \"/\",\n stage: \"\",\n requestId: \"requestId\",\n requestTimeEpoch: 0,\n resourceId: 1,\n resourcePath: event.path || \"/\"\n } as any\n } as APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n }\n\n static createFakeContext(context?: Context): Context {\n return {\n awsRequestId: \"awsRequestId\",\n callbackWaitsForEmptyEventLoop: false,\n functionName: \"\",\n functionVersion: \"\",\n invokedFunctionArn: \"\",\n logGroupName: \"\",\n logStreamName: \"\",\n memoryLimitInMB: \"\",\n ...(context || {})\n } as Context;\n }\n\n get(path: string, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"GET\";\n\n return this;\n }\n\n post(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"POST\";\n\n this.body(body);\n\n return this;\n }\n\n patch(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"PATCH\";\n\n this.body(body);\n\n return this;\n }\n\n put(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"PUT\";\n\n this.body(body);\n\n return this;\n }\n\n delete(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"POST\";\n\n this.body(body);\n\n return this;\n }\n\n query(query: any) {\n this.event.queryStringParameters = {\n ...this.event.queryStringParameters,\n ...JSON.parse(JSON.stringify(query))\n };\n\n return this;\n }\n\n params(pathParameters: any) {\n this.event.pathParameters = {\n ...this.event.pathParameters,\n ...JSON.parse(JSON.stringify(pathParameters))\n };\n\n return this;\n }\n\n headers(headers: Record<string, any>) {\n this.event.headers = {\n ...this.event.headers,\n ...JSON.parse(JSON.stringify(headers))\n };\n\n return this;\n }\n\n body(body: any) {\n if (body !== undefined) {\n this.event.headers[\"content-type\"] = \"application/json\";\n\n this.event.body = JSON.stringify(body);\n }\n\n return this;\n }\n\n protected init(lambda: string, resolve: Function, reject: Function) {\n setTimeout(async () => {\n try {\n const result = await PlatformServerlessTest.callbacks[lambda](this.event, this.context, resolve as any);\n resolve(result as any);\n } catch (er) {\n reject(er);\n }\n });\n }\n}\n\nexport class PlatformServerlessTest extends DITest {\n static callbacks: Record<string, APIGatewayProxyHandler> = {};\n static instance: PlatformServerless;\n static request = LambdaClientRequest;\n\n static bootstrap(settings: Partial<TsED.Configuration & {lambda: Type[]}> = {}) {\n return async function before(): Promise<void> {\n // @ts-ignore\n const instance = await PlatformServerless.bootstrap(DITest.configure(settings));\n PlatformServerlessTest.instance = instance;\n PlatformServerlessTest.callbacks = instance.callbacks();\n // used by inject method\n DITest.injector = instance.injector;\n\n return instance.promise;\n };\n }\n\n /**\n * Resets the test injector of the test context, so it won't pollute your next test. Call this in your `tearDown` logic.\n */\n static async reset() {\n if (PlatformServerlessTest.instance) {\n await PlatformServerlessTest.instance.stop();\n }\n if (DITest.hasInjector()) {\n await DITest.injector.destroy();\n DITest._injector = null;\n }\n }\n\n static createServerlessContext({endpoint}: {endpoint: JsonEntityStore}) {\n const context: any = LambdaClientRequest.createFakeContext();\n const event: any = LambdaClientRequest.createFakeEvent();\n\n return new ServerlessContext({\n event,\n context,\n id: context.awsRequestId,\n logger: PlatformServerlessTest.injector.logger as Logger,\n injector: PlatformServerlessTest.injector,\n endpoint\n });\n }\n}\n","import {useDecorators} from \"@tsed/core\";\nimport {JsonEntityFn, JsonSchemaObject, OperationId, OperationMethods, OperationPath} from \"@tsed/schema\";\n\nexport interface LambdaOptions {\n name?: string;\n path: string;\n method: OperationMethods | string;\n}\n\nexport interface LambdaChainedDecorators {\n <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>): TypedPropertyDescriptor<T> | void;\n\n /**\n *\n * @param name\n */\n Name(name: string): this;\n\n Method(method: string): this;\n\n Path(path: string): this;\n}\n/**\n * Declare a lambda endpoint.\n *\n * ```typescript\n * export class Lambda {\n *\n * }\n * ```\n *\n * @decorator\n */\nexport function Lambda(name?: string): LambdaChainedDecorators {\n const options: LambdaOptions = {\n path: \"/\",\n method: \"\",\n name\n };\n\n const decorator: any = JsonEntityFn((entity) => {\n return useDecorators(OperationPath(options.method, options.path), OperationId(options.name || String(entity.propertyKey)));\n });\n\n decorator.Name = (name: string) => {\n options.name = name;\n return decorator;\n };\n\n decorator.Path = (path: string) => {\n options.path = path;\n return decorator;\n };\n\n decorator.Method = (method: string) => {\n options.method = method;\n return decorator;\n };\n\n return decorator;\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Get(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.GET);\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Post(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.POST);\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Put(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.PUT);\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Patch(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.PATCH);\n}\n\n/**\n * @param path\n * @decorators\n * @ignore\n */\nexport function Delete(path: string = \"/\") {\n return Lambda().Path(path).Method(OperationMethods.DELETE);\n}\n"],"names":["mergeHeaders","specHeaders","headers","Object","entries","reduce","key","item","toLowerCase","undefined","String","example","setResponseHeaders","ctx","response","endpoint","operation","isDone","hasStatus","status","getStatus","statusCode","getHeadersOf","mergedHeaders","getHeaders","setHeaders","isRedirection","redirect","shouldBeSent","data","Buffer","isBuffer","isBoolean","isNumber","isString","shouldBeSerialized","isStream","PlatformServerlessHandler","createHandler","token","propertyKey","promisedHandler","params","compileHandler","$ctx","injector","emit","runInContext","resolver","AnyToPromise","handler","result","call","processResult","er","body","exceptions","catch","flush","getBody","JSON","stringify","id","isBase64Encoded","destroy","serialize","getResponseOptions","__decorate","Inject","InjectorService","PlatformParams","PlatformExceptions","Injectable","scope","ProviderScope","SINGLETON","imports","DeserializerPipe","ValidationPipe","ServerlessRequest","constructor","event","raw","secure","host","get","protocol","url","path","method","httpMethod","parse","rawBody","pathParameters","query","queryStringParameters","name","getValue","ServerlessResponse","request","locals","set","value","setHeader","forEach","encodeUrl","contentType","mime","getType","contentLength","length","getContentLength","parseInt","getContentType","split","address","location","getStatusMessage","byteLength","onEnd","cb","push","isHeadersSent","ServerlessContext","DIContext","context","options","maxStackSize","getReqId","requestContext","requestId","awsRequestId","v4","replace","PlatformServerless","settings","promise","bootstrap","platform","callbacks","tokens","exports","concat","map","store","JsonEntityStore","from","children","values","list","operationId","flat","callback","propertyName","entity","fromMethod","platformHandler","logger","ready","stop","createInjector","PLATFORM_NAME","loadInjector","then","$log","Env","TEST","level","container","createContainer","setLoggerLevel","load","LambdaClientRequest","Promise","createFakeEvent","createFakeContext","lambdaName","resolvers","resolve","reject","init","multiValueHeaders","multiValueQueryStringParameters","resource","stageVariables","accountId","apiId","identity","stage","requestTimeEpoch","resourceId","resourcePath","callbackWaitsForEmptyEventLoop","functionName","functionVersion","invokedFunctionArn","logGroupName","logStreamName","memoryLimitInMB","assign","post","patch","put","delete","lambda","setTimeout","PlatformServerlessTest","DITest","before","instance","configure","reset","hasInjector","_injector","createServerlessContext","Lambda","decorator","JsonEntityFn","useDecorators","OperationPath","OperationId","Name","Path","Method","Get","OperationMethods","GET","Post","POST","Put","PUT","Patch","PATCH","Delete","DELETE"],"mappings":"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"}
@@ -20,6 +20,7 @@ export declare class LambdaClientRequest extends Promise<APIGatewayProxyResult>
20
20
  delete(path: string, body?: any, options?: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>>): this;
21
21
  query(query: any): this;
22
22
  params(pathParameters: any): this;
23
+ headers(headers: Record<string, any>): this;
23
24
  body(body: any): this;
24
25
  protected init(lambda: string, resolve: Function, reject: Function): void;
25
26
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tsed/platform-serverless",
3
- "version": "6.70.1",
3
+ "version": "6.72.0",
4
4
  "description": "Platform serverless module for Ts.ED Framework",
5
5
  "private": false,
6
6
  "source": "./src/index.ts",
@@ -15,24 +15,23 @@
15
15
  "test": "cross-env NODE_ENV=test jest"
16
16
  },
17
17
  "dependencies": {
18
- "@tsed/core": "6.70.1",
19
- "@tsed/di": "6.70.1",
20
- "@tsed/exceptions": "6.70.1",
21
- "@tsed/json-mapper": "6.70.1",
18
+ "@tsed/core": "6.72.0",
19
+ "@tsed/di": "6.72.0",
20
+ "@tsed/exceptions": "6.72.0",
21
+ "@tsed/json-mapper": "6.72.0",
22
22
  "@tsed/logger": "^5.17.0",
23
- "@tsed/platform-exceptions": "6.70.1",
24
- "@tsed/platform-params": "6.70.1",
25
- "@tsed/schema": "6.70.1",
23
+ "@tsed/platform-exceptions": "6.72.0",
24
+ "@tsed/platform-params": "6.72.0",
25
+ "@tsed/schema": "6.72.0",
26
26
  "encodeurl": "^1.0.2",
27
27
  "mime": "^2.5.2",
28
- "statuses": "^2.0.1",
29
- "tslib": "2.2.0"
28
+ "tslib": "2.2.0",
29
+ "uuid": "^8.3.2"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/aws-lambda": "^8.10.83",
33
33
  "@types/encodeurl": "^1.0.0",
34
- "@types/mime": "^2.0.3",
35
- "@types/statuses": "^2.0.0"
34
+ "@types/mime": "^2.0.3"
36
35
  },
37
36
  "peerDependencies": {},
38
37
  "repository": "https://github.com/tsedio/tsed",
@@ -1,3 +0,0 @@
1
- import { HeaderValue } from "../domain/ServerlessResponse";
2
- export declare function mapResponseHeaders(headers: Record<string, HeaderValue>): Record<string, boolean | string | number>;
3
- export declare function mapResponseMultiValueHeaders(headers: Record<string, HeaderValue>): Record<string, Array<boolean | string | number>>;