@jaypie/express 1.1.18 → 1.2.0-rc.1

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.
@@ -1,8 +1,9 @@
1
1
  'use strict';
2
2
 
3
3
  var errors = require('@jaypie/errors');
4
- var core = require('@jaypie/core');
4
+ var kit = require('@jaypie/kit');
5
5
  var expressCors = require('cors');
6
+ var logger$1 = require('@jaypie/logger');
6
7
  var datadog = require('@jaypie/datadog');
7
8
  var serverlessExpress = require('@codegenie/serverless-express');
8
9
 
@@ -56,12 +57,12 @@ const dynamicOriginCallbackHandler = (origin) => {
56
57
  allowedOrigins.push(ensureProtocol(process.env.PROJECT_BASE_URL));
57
58
  }
58
59
  if (origin) {
59
- const additionalOrigins = core.force.array(origin);
60
+ const additionalOrigins = kit.force.array(origin);
60
61
  allowedOrigins.push(...additionalOrigins);
61
62
  }
62
63
  // Add localhost origins in sandbox
63
64
  if (process.env.PROJECT_ENV === SANDBOX_ENV ||
64
- core.envBoolean("PROJECT_SANDBOX_MODE")) {
65
+ kit.envBoolean("PROJECT_SANDBOX_MODE")) {
65
66
  allowedOrigins.push("http://localhost");
66
67
  allowedOrigins.push(/^http:\/\/localhost:\d+$/);
67
68
  }
@@ -132,8 +133,8 @@ const getCurrentInvokeUuid = () => getServerlessExpressUuid();
132
133
  // Main
133
134
  //
134
135
  const decorateResponse = (res, { handler = "", version = process.env.PROJECT_VERSION, } = {}) => {
135
- const log = core.log.lib({
136
- lib: core.JAYPIE.LIB.EXPRESS,
136
+ const log = logger$1.log.lib({
137
+ lib: kit.JAYPIE.LIB.EXPRESS,
137
138
  });
138
139
  //
139
140
  //
@@ -149,30 +150,30 @@ const decorateResponse = (res, { handler = "", version = process.env.PROJECT_VER
149
150
  // Decorate Headers
150
151
  //
151
152
  // X-Powered-By, override "Express" but nothing else
152
- if (!res.get(core.HTTP.HEADER.POWERED_BY) ||
153
- res.get(core.HTTP.HEADER.POWERED_BY) === "Express") {
154
- res.set(core.HTTP.HEADER.POWERED_BY, core.JAYPIE.LIB.EXPRESS);
153
+ if (!res.get(kit.HTTP.HEADER.POWERED_BY) ||
154
+ res.get(kit.HTTP.HEADER.POWERED_BY) === "Express") {
155
+ res.set(kit.HTTP.HEADER.POWERED_BY, kit.JAYPIE.LIB.EXPRESS);
155
156
  }
156
157
  // X-Project-Environment
157
158
  if (process.env.PROJECT_ENV) {
158
- res.set(core.HTTP.HEADER.PROJECT.ENVIRONMENT, process.env.PROJECT_ENV);
159
+ res.set(kit.HTTP.HEADER.PROJECT.ENVIRONMENT, process.env.PROJECT_ENV);
159
160
  }
160
161
  // X-Project-Handler
161
162
  if (handler) {
162
- res.set(core.HTTP.HEADER.PROJECT.HANDLER, handler);
163
+ res.set(kit.HTTP.HEADER.PROJECT.HANDLER, handler);
163
164
  }
164
165
  // X-Project-Invocation
165
166
  const currentInvoke = getCurrentInvokeUuid();
166
167
  if (currentInvoke) {
167
- res.set(core.HTTP.HEADER.PROJECT.INVOCATION, currentInvoke);
168
+ res.set(kit.HTTP.HEADER.PROJECT.INVOCATION, currentInvoke);
168
169
  }
169
170
  // X-Project-Key
170
171
  if (process.env.PROJECT_KEY) {
171
- res.set(core.HTTP.HEADER.PROJECT.KEY, process.env.PROJECT_KEY);
172
+ res.set(kit.HTTP.HEADER.PROJECT.KEY, process.env.PROJECT_KEY);
172
173
  }
173
174
  // X-Project-Version
174
175
  if (version) {
175
- res.set(core.HTTP.HEADER.PROJECT.VERSION, version);
176
+ res.set(kit.HTTP.HEADER.PROJECT.VERSION, version);
176
177
  }
177
178
  //
178
179
  //
@@ -231,7 +232,7 @@ function summarizeResponse(res, extras) {
231
232
  }
232
233
 
233
234
  // Cast logger to extended interface for runtime features not in type definitions
234
- const logger = core.log;
235
+ const logger = logger$1.log;
235
236
  function expressHandler(handlerOrOptions, optionsOrHandler) {
236
237
  /* eslint-enable no-redeclare */
237
238
  let handler;
@@ -251,10 +252,15 @@ function expressHandler(handlerOrOptions, optionsOrHandler) {
251
252
  // Validate
252
253
  //
253
254
  let { chaos, locals, name, setup = [], teardown = [], unavailable, validate, } = options;
254
- core.validate.function(handler);
255
- core.validate.optional.object(locals);
256
- setup = core.force.array(setup); // allows a single item
257
- teardown = core.force.array(teardown); // allows a single item
255
+ if (typeof handler !== "function") {
256
+ throw new errors.BadRequestError(`Argument "${handler}" doesn't match type "function"`);
257
+ }
258
+ if (locals !== undefined &&
259
+ (typeof locals !== "object" || locals === null || Array.isArray(locals))) {
260
+ throw new errors.BadRequestError(`Argument "${locals}" doesn't match type "object"`);
261
+ }
262
+ setup = kit.force.array(setup); // allows a single item
263
+ teardown = kit.force.array(teardown); // allows a single item
258
264
  //
259
265
  //
260
266
  // Setup
@@ -268,18 +274,18 @@ function expressHandler(handlerOrOptions, optionsOrHandler) {
268
274
  if (chaos === undefined) {
269
275
  chaos =
270
276
  process.env.PROJECT_CHAOS ||
271
- core.getHeaderFrom("X-Project-Chaos", req);
277
+ kit.getHeaderFrom("X-Project-Chaos", req);
272
278
  }
273
279
  // Re-init the logger
274
280
  logger.init();
275
281
  // Very low-level, internal sub-trace details
276
282
  const libLogger = logger.lib({
277
- lib: core.JAYPIE.LIB.EXPRESS,
283
+ lib: kit.JAYPIE.LIB.EXPRESS,
278
284
  });
279
285
  // Top-level, important details that run at the same level as the main logger
280
286
  const log = logger.lib({
281
287
  level: logger.level,
282
- lib: core.JAYPIE.LIB.EXPRESS,
288
+ lib: kit.JAYPIE.LIB.EXPRESS,
283
289
  });
284
290
  // Update the public logger with the request ID
285
291
  const invokeUuid = getCurrentInvokeUuid();
@@ -298,7 +304,7 @@ function expressHandler(handlerOrOptions, optionsOrHandler) {
298
304
  name = handler.name;
299
305
  }
300
306
  else {
301
- name = core.JAYPIE.UNKNOWN;
307
+ name = kit.JAYPIE.UNKNOWN;
302
308
  }
303
309
  }
304
310
  logger.tag({ handler: name });
@@ -373,11 +379,11 @@ function expressHandler(handlerOrOptions, optionsOrHandler) {
373
379
  }
374
380
  }
375
381
  let response;
376
- let status = core.HTTP.CODE.OK;
382
+ let status = kit.HTTP.CODE.OK;
377
383
  try {
378
384
  log.info.var({ req: summarizeRequest(req) });
379
385
  // Initialize after logging is set up
380
- jaypieFunction = core.jaypieHandler(handler, {
386
+ jaypieFunction = kit.jaypieHandler(handler, {
381
387
  chaos,
382
388
  name,
383
389
  setup,
@@ -402,13 +408,13 @@ function expressHandler(handlerOrOptions, optionsOrHandler) {
402
408
  if (jaypieError.status) {
403
409
  status = jaypieError.status;
404
410
  }
405
- if (typeof jaypieError.json === "function") {
406
- response = jaypieError.json();
411
+ if (typeof jaypieError.body === "function") {
412
+ response = jaypieError.body();
407
413
  }
408
414
  else {
409
415
  // This should never happen
410
- const unhandledError = new core.UnhandledError();
411
- response = unhandledError.json();
416
+ const unhandledError = new errors.UnhandledError();
417
+ response = unhandledError.body();
412
418
  status = unhandledError.status;
413
419
  }
414
420
  }
@@ -450,7 +456,7 @@ function expressHandler(handlerOrOptions, optionsOrHandler) {
450
456
  }
451
457
  }
452
458
  else if (response === true) {
453
- res.status(core.HTTP.CODE.CREATED).send();
459
+ res.status(kit.HTTP.CODE.CREATED).send();
454
460
  }
455
461
  else {
456
462
  res.status(status).send(response);
@@ -458,7 +464,7 @@ function expressHandler(handlerOrOptions, optionsOrHandler) {
458
464
  }
459
465
  else {
460
466
  // No response
461
- res.status(core.HTTP.CODE.NO_CONTENT).send();
467
+ res.status(kit.HTTP.CODE.NO_CONTENT).send();
462
468
  }
463
469
  }
464
470
  else {
@@ -532,7 +538,7 @@ function expressHandler(handlerOrOptions, optionsOrHandler) {
532
538
  //
533
539
  // Main
534
540
  //
535
- const httpHandler = (statusCode = core.HTTP.CODE.OK, context = {}) => {
541
+ const httpHandler = (statusCode = kit.HTTP.CODE.OK, context = {}) => {
536
542
  // Give a default name if there isn't one
537
543
  if (!context.name) {
538
544
  context.name = "_http";
@@ -541,30 +547,30 @@ const httpHandler = (statusCode = core.HTTP.CODE.OK, context = {}) => {
541
547
  return expressHandler(async (req, res) => {
542
548
  // Map the most throwable status codes to errors and throw them!
543
549
  const error = {
544
- [core.HTTP.CODE.BAD_REQUEST]: core.BadRequestError,
545
- [core.HTTP.CODE.UNAUTHORIZED]: core.UnauthorizedError,
546
- [core.HTTP.CODE.FORBIDDEN]: core.ForbiddenError,
547
- [core.HTTP.CODE.NOT_FOUND]: core.NotFoundError,
548
- [core.HTTP.CODE.METHOD_NOT_ALLOWED]: core.MethodNotAllowedError,
549
- [core.HTTP.CODE.GONE]: core.GoneError,
550
- [core.HTTP.CODE.TEAPOT]: core.TeapotError,
551
- [core.HTTP.CODE.INTERNAL_ERROR]: core.InternalError,
552
- [core.HTTP.CODE.BAD_GATEWAY]: core.BadGatewayError,
553
- [core.HTTP.CODE.UNAVAILABLE]: core.UnavailableError,
554
- [core.HTTP.CODE.GATEWAY_TIMEOUT]: core.GatewayTimeoutError,
550
+ [kit.HTTP.CODE.BAD_REQUEST]: errors.BadRequestError,
551
+ [kit.HTTP.CODE.UNAUTHORIZED]: errors.UnauthorizedError,
552
+ [kit.HTTP.CODE.FORBIDDEN]: errors.ForbiddenError,
553
+ [kit.HTTP.CODE.NOT_FOUND]: errors.NotFoundError,
554
+ [kit.HTTP.CODE.METHOD_NOT_ALLOWED]: errors.MethodNotAllowedError,
555
+ [kit.HTTP.CODE.GONE]: errors.GoneError,
556
+ [kit.HTTP.CODE.TEAPOT]: errors.TeapotError,
557
+ [kit.HTTP.CODE.INTERNAL_ERROR]: errors.InternalError,
558
+ [kit.HTTP.CODE.BAD_GATEWAY]: errors.BadGatewayError,
559
+ [kit.HTTP.CODE.UNAVAILABLE]: errors.UnavailableError,
560
+ [kit.HTTP.CODE.GATEWAY_TIMEOUT]: errors.GatewayTimeoutError,
555
561
  };
556
562
  // If this maps to an error, throw it
557
563
  if (error[statusCode]) {
558
- core.log.trace(`@knowdev/express: gracefully throwing ${statusCode} up to projectHandler`);
564
+ logger$1.log.trace(`@knowdev/express: gracefully throwing ${statusCode} up to projectHandler`);
559
565
  throw new error[statusCode]();
560
566
  }
561
567
  // If this is an error and we didn't get thrown, log a warning
562
568
  if (statusCode >= 400) {
563
- core.log.warn(`@knowdev/express: status code ${statusCode} not mapped as throwable`);
569
+ logger$1.log.warn(`@knowdev/express: status code ${statusCode} not mapped as throwable`);
564
570
  }
565
571
  // Send the response
566
572
  res.status(statusCode);
567
- return statusCode === core.HTTP.CODE.NO_CONTENT ? null : {};
573
+ return statusCode === kit.HTTP.CODE.NO_CONTENT ? null : {};
568
574
  }, context);
569
575
  };
570
576
 
@@ -573,7 +579,11 @@ const httpHandler = (statusCode = core.HTTP.CODE.OK, context = {}) => {
573
579
  // Main
574
580
  //
575
581
  const echoHandler = (context = {}) => {
576
- core.validate.object(context);
582
+ if (typeof context !== "object" ||
583
+ context === null ||
584
+ Array.isArray(context)) {
585
+ throw new errors.BadRequestError(`Argument "${context}" doesn't match type "object"`);
586
+ }
577
587
  // Give a default name if there isn't one
578
588
  if (!context.name) {
579
589
  context.name = "_echo";
@@ -591,17 +601,17 @@ const echoHandler = (context = {}) => {
591
601
  // Functions
592
602
  //
593
603
  const routes = {
594
- badRequestRoute: httpHandler(core.HTTP.CODE.BAD_REQUEST, { name: "_badRequest" }),
604
+ badRequestRoute: httpHandler(kit.HTTP.CODE.BAD_REQUEST, { name: "_badRequest" }),
595
605
  echoRoute: echoHandler(),
596
- forbiddenRoute: httpHandler(core.HTTP.CODE.FORBIDDEN, { name: "_forbidden" }),
597
- goneRoute: httpHandler(core.HTTP.CODE.GONE, { name: "_gone" }),
598
- methodNotAllowedRoute: httpHandler(core.HTTP.CODE.METHOD_NOT_ALLOWED, {
606
+ forbiddenRoute: httpHandler(kit.HTTP.CODE.FORBIDDEN, { name: "_forbidden" }),
607
+ goneRoute: httpHandler(kit.HTTP.CODE.GONE, { name: "_gone" }),
608
+ methodNotAllowedRoute: httpHandler(kit.HTTP.CODE.METHOD_NOT_ALLOWED, {
599
609
  name: "_methodNotAllowed",
600
610
  }),
601
- noContentRoute: httpHandler(core.HTTP.CODE.NO_CONTENT, { name: "_noContent" }),
602
- notFoundRoute: httpHandler(core.HTTP.CODE.NOT_FOUND, { name: "_notFound" }),
611
+ noContentRoute: httpHandler(kit.HTTP.CODE.NO_CONTENT, { name: "_noContent" }),
612
+ notFoundRoute: httpHandler(kit.HTTP.CODE.NOT_FOUND, { name: "_notFound" }),
603
613
  notImplementedRoute: expressHandler(() => {
604
- throw new core.NotImplementedError();
614
+ throw new errors.NotImplementedError();
605
615
  }, { name: "_notImplemented" }),
606
616
  };
607
617
  //
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/constants.ts","../../../src/cors.helper.ts","../../../src/getCurrentInvokeUuid.adapter.ts","../../../src/decorateResponse.helper.ts","../../../src/summarizeRequest.helper.ts","../../../src/summarizeResponse.helper.ts","../../../src/expressHandler.ts","../../../src/http.handler.ts","../../../src/echo.handler.ts","../../../src/routes.ts"],"sourcesContent":["//\n//\n// Constants\n//\n\nexport const EXPRESS = {\n PATH: {\n ANY: \"*\",\n ID: \"/:id\",\n ROOT: /^\\/?$/,\n },\n} as const;\n\nexport type ExpressConstants = typeof EXPRESS;\n","import type { Request, Response, NextFunction } from \"express\";\nimport { CorsError } from \"@jaypie/errors\";\nimport { envBoolean, force } from \"@jaypie/core\";\nimport expressCors from \"cors\";\n\n//\n//\n// Constants\n//\n\nconst HTTP_PROTOCOL = \"http://\";\nconst HTTPS_PROTOCOL = \"https://\";\nconst SANDBOX_ENV = \"sandbox\";\n\n//\n//\n// Types\n//\n\nexport interface CorsConfig {\n origin?: string | string[];\n overrides?: Record<string, unknown>;\n}\n\ntype CorsCallback = (err: Error | null, allow?: boolean) => void;\n\n//\n//\n// Helper Functions\n//\n\nconst ensureProtocol = (url: string | undefined): string | undefined => {\n if (!url) return url;\n if (url.startsWith(HTTP_PROTOCOL) || url.startsWith(HTTPS_PROTOCOL))\n return url;\n return HTTPS_PROTOCOL + url;\n};\n\nexport const dynamicOriginCallbackHandler = (\n origin?: string | string[],\n): ((requestOrigin: string | undefined, callback: CorsCallback) => void) => {\n return (requestOrigin: string | undefined, callback: CorsCallback) => {\n // Handle wildcard origin\n if (origin === \"*\") {\n callback(null, true);\n return;\n }\n\n // Allow requests with no origin (like mobile apps, curl, etc)\n if (!requestOrigin) {\n callback(null, true);\n return;\n }\n\n const allowedOrigins: (string | RegExp)[] = [];\n if (process.env.BASE_URL) {\n allowedOrigins.push(ensureProtocol(process.env.BASE_URL) as string);\n }\n if (process.env.PROJECT_BASE_URL) {\n allowedOrigins.push(\n ensureProtocol(process.env.PROJECT_BASE_URL) as string,\n );\n }\n if (origin) {\n const additionalOrigins = force.array<string>(origin);\n allowedOrigins.push(...additionalOrigins);\n }\n\n // Add localhost origins in sandbox\n if (\n process.env.PROJECT_ENV === SANDBOX_ENV ||\n envBoolean(\"PROJECT_SANDBOX_MODE\")\n ) {\n allowedOrigins.push(\"http://localhost\");\n allowedOrigins.push(/^http:\\/\\/localhost:\\d+$/);\n }\n\n const isAllowed = allowedOrigins.some((allowed) => {\n if (allowed instanceof RegExp) {\n return allowed.test(requestOrigin);\n }\n return requestOrigin.includes(allowed);\n });\n\n if (isAllowed) {\n callback(null, true);\n } else {\n callback(new CorsError());\n }\n };\n};\n\n//\n//\n// Main\n//\n\nconst corsHelper = (\n config: CorsConfig = {},\n): ReturnType<typeof expressCors> => {\n const { origin, overrides = {} } = config;\n\n const options = {\n origin: dynamicOriginCallbackHandler(origin),\n // * The default behavior is to allow any headers and methods so they are not included here\n ...overrides,\n };\n\n return expressCors(options);\n};\n\n//\n//\n// Export\n//\n\ninterface CorsErrorWithBody extends Error {\n status: number;\n body: () => Record<string, unknown>;\n}\n\nexport default (\n config?: CorsConfig,\n): ((req: Request, res: Response, next: NextFunction) => void) => {\n const cors = corsHelper(config);\n return (req: Request, res: Response, next: NextFunction) => {\n cors(req, res, (error?: Error | null) => {\n if (error) {\n const corsError = error as CorsErrorWithBody;\n res.status(corsError.status);\n res.setHeader(\"Content-Type\", \"application/json\");\n return res.json(corsError.body());\n }\n next();\n });\n };\n};\n","import { getCurrentInvoke } from \"@codegenie/serverless-express\";\n\n//\n//\n// Helper Functions\n//\n\n// Adapter for the \"@codegenie/serverless-express\" uuid\nfunction getServerlessExpressUuid(): string | undefined {\n const currentInvoke = getCurrentInvoke();\n if (\n currentInvoke &&\n currentInvoke.context &&\n currentInvoke.context.awsRequestId\n ) {\n return currentInvoke.context.awsRequestId;\n }\n return undefined;\n}\n\n//\n//\n// Main\n//\n\nconst getCurrentInvokeUuid = (): string | undefined =>\n getServerlessExpressUuid();\n\n//\n//\n// Export\n//\n\nexport default getCurrentInvokeUuid;\n","import type { Response } from \"express\";\nimport { HTTP, JAYPIE, log as publicLogger } from \"@jaypie/core\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\n\n//\n//\n// Types\n//\n\ninterface DecorateResponseOptions {\n handler?: string;\n version?: string;\n}\n\n//\n//\n// Main\n//\n\nconst decorateResponse = (\n res: Response,\n {\n handler = \"\",\n version = process.env.PROJECT_VERSION,\n }: DecorateResponseOptions = {},\n): void => {\n const log = publicLogger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n //\n //\n // Validate\n //\n if (typeof res !== \"object\" || res === null) {\n log.warn(\"decorateResponse called but response is not an object\");\n return;\n }\n\n try {\n //\n //\n // Decorate Headers\n //\n\n // X-Powered-By, override \"Express\" but nothing else\n if (\n !res.get(HTTP.HEADER.POWERED_BY) ||\n res.get(HTTP.HEADER.POWERED_BY) === \"Express\"\n ) {\n res.set(HTTP.HEADER.POWERED_BY, JAYPIE.LIB.EXPRESS);\n }\n\n // X-Project-Environment\n if (process.env.PROJECT_ENV) {\n res.set(HTTP.HEADER.PROJECT.ENVIRONMENT, process.env.PROJECT_ENV);\n }\n\n // X-Project-Handler\n if (handler) {\n res.set(HTTP.HEADER.PROJECT.HANDLER, handler);\n }\n\n // X-Project-Invocation\n const currentInvoke = getCurrentInvokeUuid();\n if (currentInvoke) {\n res.set(HTTP.HEADER.PROJECT.INVOCATION, currentInvoke);\n }\n\n // X-Project-Key\n if (process.env.PROJECT_KEY) {\n res.set(HTTP.HEADER.PROJECT.KEY, process.env.PROJECT_KEY);\n }\n\n // X-Project-Version\n if (version) {\n res.set(HTTP.HEADER.PROJECT.VERSION, version);\n }\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n log.warn(\"decorateResponse caught an internal error\");\n log.var({ error });\n }\n};\n\n//\n//\n// Export\n//\n\nexport default decorateResponse;\n\n//\n//\n// Footnotes\n//\n\n// This is a \"utility\" function but it needs a lot of \"context\"\n// about the environment's secret parameters, the special adapter,\n// HTTP, etc. There must be a better way to organize this\n","import type { Request } from \"express\";\n\n//\n//\n// Types\n//\n\nexport interface RequestSummary {\n baseUrl: string;\n body: unknown;\n headers: Request[\"headers\"];\n method: string;\n query: Request[\"query\"];\n url: string;\n}\n\n//\n//\n// Function Definition\n//\n\nfunction summarizeRequest(req: Request): RequestSummary {\n // If body is a buffer, convert it to a string\n let { body } = req;\n if (Buffer.isBuffer(body)) {\n body = body.toString();\n }\n\n return {\n baseUrl: req.baseUrl,\n body,\n headers: req.headers,\n method: req.method,\n query: req.query,\n url: req.url,\n };\n}\n\n//\n//\n// Export\n//\n\nexport default summarizeRequest;\n","import type { Response } from \"express\";\n\n//\n//\n// Types\n//\n\nexport interface ResponseSummary {\n statusCode: number;\n statusMessage: string;\n headers?: ReturnType<Response[\"getHeaders\"]>;\n [key: string]: unknown;\n}\n\n//\n//\n// Function Definition\n//\n\nfunction summarizeResponse(\n res: Response,\n extras?: Record<string, unknown>,\n): ResponseSummary {\n const response: ResponseSummary = {\n statusCode: res.statusCode,\n statusMessage: res.statusMessage,\n };\n if (typeof res.getHeaders === \"function\") {\n response.headers = res.getHeaders();\n }\n if (typeof extras === \"object\" && extras !== null) {\n Object.assign(response, extras);\n }\n return response;\n}\n\n//\n//\n// Export\n//\n\nexport default summarizeResponse;\n","import type { Request, Response } from \"express\";\nimport {\n force,\n getHeaderFrom,\n HTTP,\n JAYPIE,\n jaypieHandler,\n log as publicLogger,\n UnhandledError,\n validate as validateIs,\n} from \"@jaypie/core\";\nimport { DATADOG, hasDatadogEnv, submitMetric } from \"@jaypie/datadog\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\nimport decorateResponse from \"./decorateResponse.helper.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\nimport summarizeResponse from \"./summarizeResponse.helper.js\";\n\n//\n//\n// Types\n//\n\n// Extended logger interface for features not in the base type definitions\ninterface ExtendedLogger {\n init: () => void;\n level: string;\n debug: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n error: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n fatal: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n info: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n trace: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n warn: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n var(key: string | Record<string, unknown>, value?: unknown): void;\n tag(\n key: string | string[] | Record<string, unknown> | null,\n value?: string,\n ): void;\n untag(tags: string | string[] | Record<string, unknown> | null): void;\n lib(options: {\n level?: string;\n lib?: string;\n tags?: Record<string, unknown>;\n }): ExtendedLogger;\n}\n\n// Exported type aliases for defining handler lifecycle functions\nexport type JaypieHandlerSetup = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieHandlerTeardown = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieHandlerValidate = (\n req: Request,\n res: Response,\n) => Promise<boolean> | boolean;\n\nexport type ExpressHandlerLocals = (\n req: Request,\n res: Response,\n) => Promise<unknown> | unknown;\n\nexport interface ExpressHandlerOptions {\n chaos?: string;\n locals?: Record<string, unknown | ExpressHandlerLocals>;\n name?: string;\n setup?: JaypieHandlerSetup[] | JaypieHandlerSetup;\n teardown?: JaypieHandlerTeardown[] | JaypieHandlerTeardown;\n unavailable?: boolean;\n validate?: JaypieHandlerValidate[] | JaypieHandlerValidate;\n}\n\ninterface ExtendedRequest extends Request {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ninterface ExtendedResponse extends Response {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ntype ExpressHandler<T> = (\n req: Request,\n res: Response,\n ...params: unknown[]\n) => Promise<T>;\n\ninterface JaypieError extends Error {\n status?: number;\n json?: () => Record<string, unknown>;\n}\n\ninterface ResponseWithJson {\n json: () => Record<string, unknown>;\n}\n\n// Cast logger to extended interface for runtime features not in type definitions\nconst logger = publicLogger as unknown as ExtendedLogger;\n\n//\n//\n// Main\n//\n\n/* eslint-disable no-redeclare */\nfunction expressHandler<T>(\n handler: ExpressHandler<T>,\n options?: ExpressHandlerOptions,\n): ExpressHandler<T>;\nfunction expressHandler<T>(\n options: ExpressHandlerOptions,\n handler: ExpressHandler<T>,\n): ExpressHandler<T>;\nfunction expressHandler<T>(\n handlerOrOptions: ExpressHandler<T> | ExpressHandlerOptions,\n optionsOrHandler?: ExpressHandlerOptions | ExpressHandler<T>,\n): ExpressHandler<T> {\n /* eslint-enable no-redeclare */\n let handler: ExpressHandler<T>;\n let options: ExpressHandlerOptions;\n\n // If handler is an object and options is a function, swap them\n if (\n typeof handlerOrOptions === \"object\" &&\n typeof optionsOrHandler === \"function\"\n ) {\n handler = optionsOrHandler as ExpressHandler<T>;\n options = handlerOrOptions as ExpressHandlerOptions;\n } else {\n handler = handlerOrOptions as ExpressHandler<T>;\n options = (optionsOrHandler || {}) as ExpressHandlerOptions;\n }\n\n //\n //\n // Validate\n //\n let {\n chaos,\n locals,\n name,\n setup = [],\n teardown = [],\n unavailable,\n validate,\n } = options;\n validateIs.function(handler);\n validateIs.optional.object(locals);\n setup = force.array(setup) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[]; // allows a single item\n teardown = force.array(teardown) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[]; // allows a single item\n\n //\n //\n // Setup\n //\n\n let jaypieFunction: ReturnType<typeof jaypieHandler>;\n\n return async (\n req: Request,\n res: Response,\n ...params: unknown[]\n ): Promise<T> => {\n // * This is the first line of code that runs when a request is received\n const extReq = req as ExtendedRequest;\n const extRes = res as ExtendedResponse;\n\n // Set default chaos value\n if (chaos === undefined) {\n chaos =\n process.env.PROJECT_CHAOS ||\n (getHeaderFrom(\n \"X-Project-Chaos\",\n req as unknown as Record<string, unknown>,\n ) as string | undefined);\n }\n\n // Re-init the logger\n logger.init();\n // Very low-level, internal sub-trace details\n const libLogger = logger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n // Top-level, important details that run at the same level as the main logger\n const log = logger.lib({\n level: logger.level,\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n // Update the public logger with the request ID\n const invokeUuid = getCurrentInvokeUuid();\n if (invokeUuid) {\n logger.tag({ invoke: invokeUuid });\n logger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n // TODO: in theory this is redundant\n libLogger.tag({ invoke: invokeUuid });\n libLogger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n log.tag({ invoke: invokeUuid });\n log.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n }\n\n if (!name) {\n // If handler has a name, use it\n if (handler.name) {\n name = handler.name;\n } else {\n name = JAYPIE.UNKNOWN;\n }\n }\n logger.tag({ handler: name });\n // TODO: in theory this is redundant\n libLogger.tag({ handler: name });\n log.tag({ handler: name });\n\n libLogger.trace(\"[jaypie] Express init\");\n\n // Set req.locals if it doesn't exist\n if (!extReq.locals) extReq.locals = {};\n if (!extReq.locals._jaypie) extReq.locals._jaypie = {};\n\n // Set res.locals if it doesn't exist\n if (!extRes.locals) extRes.locals = {};\n if (!extRes.locals._jaypie) extRes.locals._jaypie = {};\n\n const originalRes = {\n attemptedCall: undefined as ((...args: unknown[]) => unknown) | undefined,\n attemptedParams: undefined as unknown[] | undefined,\n end: res.end.bind(res) as typeof res.end,\n json: res.json.bind(res) as typeof res.json,\n send: res.send.bind(res) as typeof res.send,\n status: res.status.bind(res) as typeof res.status,\n statusSent: false as boolean | number,\n };\n\n res.end = ((...endParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.end as unknown as (\n ...args: unknown[]\n ) => unknown;\n originalRes.attemptedParams = endParams;\n log.warn(\n \"[jaypie] Illegal call to res.end(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.end;\n\n res.json = ((...jsonParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.json;\n originalRes.attemptedParams = jsonParams;\n log.warn(\n \"[jaypie] Illegal call to res.json(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.json;\n\n res.send = ((...sendParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.send;\n originalRes.attemptedParams = sendParams;\n log.warn(\n \"[jaypie] Illegal call to res.send(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.send;\n\n res.status = ((...statusParams: [number]) => {\n originalRes.statusSent = statusParams[0];\n return originalRes.status(...statusParams);\n }) as typeof res.status;\n\n //\n //\n // Preprocess\n //\n\n if (locals) {\n // Locals\n const keys = Object.keys(locals);\n if (keys.length > 0) {\n const localsSetup = async (localsReq: Request, localsRes: Response) => {\n const extLocalsReq = localsReq as ExtendedRequest;\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n libLogger.trace(`[jaypie] Locals: ${key}`);\n const localValue = locals[key];\n if (typeof localValue === \"function\") {\n extLocalsReq.locals[key] = await localValue(localsReq, localsRes);\n } else {\n extLocalsReq.locals[key] = localValue;\n }\n }\n };\n setup.push(localsSetup);\n }\n }\n\n let response: T | Record<string, unknown> | undefined;\n let status: number = HTTP.CODE.OK;\n\n try {\n log.info.var({ req: summarizeRequest(req) });\n\n // Initialize after logging is set up\n\n jaypieFunction = jaypieHandler(\n handler as unknown as (...args: unknown[]) => unknown,\n {\n chaos,\n name,\n setup,\n teardown,\n unavailable,\n validate,\n } as any,\n );\n\n libLogger.trace(\"[jaypie] Express execution\");\n\n //\n //\n // Process\n //\n\n response = (await jaypieFunction(req, res, ...params)) as\n | T\n | Record<string, unknown>\n | undefined;\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n // In theory jaypieFunction has handled all errors\n const jaypieError = error as JaypieError;\n if (jaypieError.status) {\n status = jaypieError.status;\n }\n if (typeof jaypieError.json === \"function\") {\n response = jaypieError.json();\n } else {\n // This should never happen\n const unhandledError = new UnhandledError();\n response = unhandledError.json();\n status = unhandledError.status;\n }\n }\n\n //\n //\n // Postprocess\n //\n\n // Restore original res functions\n res.end = originalRes.end;\n res.json = originalRes.json;\n res.send = originalRes.send;\n res.status = originalRes.status;\n\n // Decorate response\n decorateResponse(res, { handler: name });\n\n // Allow the sent status to override the status in the response\n if (originalRes.statusSent) {\n status = originalRes.statusSent as number;\n }\n\n // Send response\n try {\n if (!originalRes.attemptedCall) {\n // Body\n if (response) {\n if (typeof response === \"object\") {\n if (\n typeof (response as unknown as ResponseWithJson).json ===\n \"function\"\n ) {\n res.json((response as unknown as ResponseWithJson).json());\n } else {\n res.status(status).json(response);\n }\n } else if (typeof response === \"string\") {\n try {\n res.status(status).json(JSON.parse(response));\n } catch {\n res.status(status).send(response);\n }\n } else if (response === true) {\n res.status(HTTP.CODE.CREATED).send();\n } else {\n res.status(status).send(response as unknown as string);\n }\n } else {\n // No response\n res.status(HTTP.CODE.NO_CONTENT).send();\n }\n } else {\n // Resolve illegal call to res.end(), res.json(), or res.send()\n log.debug(\"[jaypie] Resolving illegal call to res\");\n log.var({\n attemptedCall: {\n name: originalRes.attemptedCall.name,\n params: originalRes.attemptedParams,\n },\n });\n // Call the original function with the original parameters and the original `this` (res)\n (originalRes.attemptedCall as (...args: unknown[]) => unknown).call(\n res,\n ...(originalRes.attemptedParams || []),\n );\n }\n } catch (error) {\n log.fatal(\"Express encountered an error while sending the response\");\n log.var({ responseError: error });\n }\n\n // Log response\n const extras: Record<string, unknown> = {};\n if (response) extras.body = response;\n log.info.var({\n res: summarizeResponse(res, extras),\n });\n\n // Submit metric if Datadog is configured\n if (hasDatadogEnv()) {\n // Construct path from baseUrl and url\n let path = (req.baseUrl || \"\") + (req.url || \"\");\n // Ensure path starts with /\n if (!path.startsWith(\"/\")) {\n path = \"/\" + path;\n }\n // Remove trailing slash unless it's the root path\n if (path.length > 1 && path.endsWith(\"/\")) {\n path = path.slice(0, -1);\n }\n\n // Replace UUIDs with :id for better aggregation\n // Matches standard UUID v4 format (8-4-4-4-12 hex characters)\n path = path.replace(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n \":id\",\n );\n\n // Determine metric name based on environment variables\n let metricPrefix = \"project\";\n if (process.env.PROJECT_SPONSOR) {\n metricPrefix = process.env.PROJECT_SPONSOR;\n } else if (process.env.PROJECT_KEY) {\n metricPrefix = `project.${process.env.PROJECT_KEY}`;\n }\n\n await submitMetric({\n name: `${metricPrefix}.api.response`,\n type: DATADOG.METRIC.TYPE.COUNT,\n value: 1,\n tags: {\n status: String(res.statusCode),\n path,\n },\n });\n }\n\n // Clean up the public logger\n logger.untag(\"handler\");\n\n //\n //\n // Return\n //\n\n return response as T;\n };\n}\n\n//\n//\n// Export\n//\n\nexport default expressHandler;\n","import type { Request, Response } from \"express\";\nimport {\n BadGatewayError,\n BadRequestError,\n ForbiddenError,\n GatewayTimeoutError,\n GoneError,\n HTTP,\n InternalError,\n log,\n MethodNotAllowedError,\n NotFoundError,\n TeapotError,\n UnauthorizedError,\n UnavailableError,\n} from \"@jaypie/core\";\n\nimport expressHandler, { ExpressHandlerOptions } from \"./expressHandler.js\";\n\n//\n//\n// Types\n//\n\ntype ErrorConstructor = new () => Error;\n\n//\n//\n// Main\n//\n\nconst httpHandler = (\n statusCode: number = HTTP.CODE.OK,\n context: ExpressHandlerOptions = {},\n): ((\n req: Request,\n res: Response,\n) => Promise<Record<string, unknown> | null>) => {\n // Give a default name if there isn't one\n if (!context.name) {\n context.name = \"_http\";\n }\n\n // Return a function that will be used as an express route\n return expressHandler(\n async (\n req: Request,\n res: Response,\n ): Promise<Record<string, unknown> | null> => {\n // Map the most throwable status codes to errors and throw them!\n const error: Record<number, ErrorConstructor> = {\n [HTTP.CODE.BAD_REQUEST]: BadRequestError,\n [HTTP.CODE.UNAUTHORIZED]: UnauthorizedError,\n [HTTP.CODE.FORBIDDEN]: ForbiddenError,\n [HTTP.CODE.NOT_FOUND]: NotFoundError,\n [HTTP.CODE.METHOD_NOT_ALLOWED]: MethodNotAllowedError,\n [HTTP.CODE.GONE]: GoneError,\n [HTTP.CODE.TEAPOT]: TeapotError,\n [HTTP.CODE.INTERNAL_ERROR]: InternalError,\n [HTTP.CODE.BAD_GATEWAY]: BadGatewayError,\n [HTTP.CODE.UNAVAILABLE]: UnavailableError,\n [HTTP.CODE.GATEWAY_TIMEOUT]: GatewayTimeoutError,\n };\n\n // If this maps to an error, throw it\n if (error[statusCode]) {\n log.trace(\n `@knowdev/express: gracefully throwing ${statusCode} up to projectHandler`,\n );\n throw new error[statusCode]();\n }\n\n // If this is an error and we didn't get thrown, log a warning\n if (statusCode >= 400) {\n log.warn(\n `@knowdev/express: status code ${statusCode} not mapped as throwable`,\n );\n }\n\n // Send the response\n res.status(statusCode);\n return statusCode === HTTP.CODE.NO_CONTENT ? null : {};\n },\n context,\n );\n};\n\n//\n//\n// Export\n//\n\nexport default httpHandler;\n","import type { Request, Response } from \"express\";\nimport { validate } from \"@jaypie/core\";\n\nimport expressHandler, { ExpressHandlerOptions } from \"./expressHandler.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\n\n//\n//\n// Types\n//\n\nexport interface EchoResponse {\n req: ReturnType<typeof summarizeRequest>;\n}\n\n//\n//\n// Main\n//\n\nconst echoHandler = (\n context: ExpressHandlerOptions = {},\n): ((req: Request, res: Response) => Promise<EchoResponse>) => {\n validate.object(context);\n // Give a default name if there isn't one\n if (!context.name) {\n context.name = \"_echo\";\n }\n\n // Return a function that will be used as an express route\n return expressHandler(async (req: Request): Promise<EchoResponse> => {\n return {\n req: summarizeRequest(req),\n };\n }, context);\n};\n\n//\n//\n// Export\n//\n\nexport default echoHandler;\n","import { HTTP, NotImplementedError } from \"@jaypie/core\";\n\nimport expressHandler from \"./expressHandler.js\";\nimport httpHandler from \"./http.handler.js\";\nimport echoHandler from \"./echo.handler.js\";\n\n//\n//\n// Functions\n//\n\nconst routes = {\n badRequestRoute: httpHandler(HTTP.CODE.BAD_REQUEST, { name: \"_badRequest\" }),\n echoRoute: echoHandler(),\n forbiddenRoute: httpHandler(HTTP.CODE.FORBIDDEN, { name: \"_forbidden\" }),\n goneRoute: httpHandler(HTTP.CODE.GONE, { name: \"_gone\" }),\n methodNotAllowedRoute: httpHandler(HTTP.CODE.METHOD_NOT_ALLOWED, {\n name: \"_methodNotAllowed\",\n }),\n noContentRoute: httpHandler(HTTP.CODE.NO_CONTENT, { name: \"_noContent\" }),\n notFoundRoute: httpHandler(HTTP.CODE.NOT_FOUND, { name: \"_notFound\" }),\n notImplementedRoute: expressHandler(\n (): never => {\n throw new NotImplementedError();\n },\n { name: \"_notImplemented\" },\n ),\n};\n\n//\n//\n// Export\n//\n\nexport const badRequestRoute = routes.badRequestRoute;\nexport const echoRoute = routes.echoRoute;\nexport const forbiddenRoute = routes.forbiddenRoute;\nexport const goneRoute = routes.goneRoute;\nexport const methodNotAllowedRoute = routes.methodNotAllowedRoute;\nexport const noContentRoute = routes.noContentRoute;\nexport const notFoundRoute = routes.notFoundRoute;\nexport const notImplementedRoute = routes.notImplementedRoute;\n"],"names":["force","envBoolean","CorsError","getCurrentInvoke","publicLogger","JAYPIE","HTTP","validateIs","getHeaderFrom","jaypieHandler","UnhandledError","hasDatadogEnv","submitMetric","DATADOG","BadRequestError","UnauthorizedError","ForbiddenError","NotFoundError","MethodNotAllowedError","GoneError","TeapotError","InternalError","BadGatewayError","UnavailableError","GatewayTimeoutError","log","validate","NotImplementedError"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/constants.ts","../../../src/cors.helper.ts","../../../src/getCurrentInvokeUuid.adapter.ts","../../../src/decorateResponse.helper.ts","../../../src/summarizeRequest.helper.ts","../../../src/summarizeResponse.helper.ts","../../../src/expressHandler.ts","../../../src/http.handler.ts","../../../src/echo.handler.ts","../../../src/routes.ts"],"sourcesContent":["//\n//\n// Constants\n//\n\nexport const EXPRESS = {\n PATH: {\n ANY: \"*\",\n ID: \"/:id\",\n ROOT: /^\\/?$/,\n },\n} as const;\n\nexport type ExpressConstants = typeof EXPRESS;\n","import type { Request, Response, NextFunction } from \"express\";\nimport { CorsError } from \"@jaypie/errors\";\nimport { envBoolean, force } from \"@jaypie/kit\";\nimport expressCors from \"cors\";\n\n//\n//\n// Constants\n//\n\nconst HTTP_PROTOCOL = \"http://\";\nconst HTTPS_PROTOCOL = \"https://\";\nconst SANDBOX_ENV = \"sandbox\";\n\n//\n//\n// Types\n//\n\nexport interface CorsConfig {\n origin?: string | string[];\n overrides?: Record<string, unknown>;\n}\n\ntype CorsCallback = (err: Error | null, allow?: boolean) => void;\n\n//\n//\n// Helper Functions\n//\n\nconst ensureProtocol = (url: string | undefined): string | undefined => {\n if (!url) return url;\n if (url.startsWith(HTTP_PROTOCOL) || url.startsWith(HTTPS_PROTOCOL))\n return url;\n return HTTPS_PROTOCOL + url;\n};\n\nexport const dynamicOriginCallbackHandler = (\n origin?: string | string[],\n): ((requestOrigin: string | undefined, callback: CorsCallback) => void) => {\n return (requestOrigin: string | undefined, callback: CorsCallback) => {\n // Handle wildcard origin\n if (origin === \"*\") {\n callback(null, true);\n return;\n }\n\n // Allow requests with no origin (like mobile apps, curl, etc)\n if (!requestOrigin) {\n callback(null, true);\n return;\n }\n\n const allowedOrigins: (string | RegExp)[] = [];\n if (process.env.BASE_URL) {\n allowedOrigins.push(ensureProtocol(process.env.BASE_URL) as string);\n }\n if (process.env.PROJECT_BASE_URL) {\n allowedOrigins.push(\n ensureProtocol(process.env.PROJECT_BASE_URL) as string,\n );\n }\n if (origin) {\n const additionalOrigins = force.array<string>(origin);\n allowedOrigins.push(...additionalOrigins);\n }\n\n // Add localhost origins in sandbox\n if (\n process.env.PROJECT_ENV === SANDBOX_ENV ||\n envBoolean(\"PROJECT_SANDBOX_MODE\")\n ) {\n allowedOrigins.push(\"http://localhost\");\n allowedOrigins.push(/^http:\\/\\/localhost:\\d+$/);\n }\n\n const isAllowed = allowedOrigins.some((allowed) => {\n if (allowed instanceof RegExp) {\n return allowed.test(requestOrigin);\n }\n return requestOrigin.includes(allowed);\n });\n\n if (isAllowed) {\n callback(null, true);\n } else {\n callback(new CorsError());\n }\n };\n};\n\n//\n//\n// Main\n//\n\nconst corsHelper = (\n config: CorsConfig = {},\n): ReturnType<typeof expressCors> => {\n const { origin, overrides = {} } = config;\n\n const options = {\n origin: dynamicOriginCallbackHandler(origin),\n // * The default behavior is to allow any headers and methods so they are not included here\n ...overrides,\n };\n\n return expressCors(options);\n};\n\n//\n//\n// Export\n//\n\ninterface CorsErrorWithBody extends Error {\n status: number;\n body: () => Record<string, unknown>;\n}\n\nexport default (\n config?: CorsConfig,\n): ((req: Request, res: Response, next: NextFunction) => void) => {\n const cors = corsHelper(config);\n return (req: Request, res: Response, next: NextFunction) => {\n cors(req, res, (error?: Error | null) => {\n if (error) {\n const corsError = error as CorsErrorWithBody;\n res.status(corsError.status);\n res.setHeader(\"Content-Type\", \"application/json\");\n return res.json(corsError.body());\n }\n next();\n });\n };\n};\n","import { getCurrentInvoke } from \"@codegenie/serverless-express\";\n\n//\n//\n// Helper Functions\n//\n\n// Adapter for the \"@codegenie/serverless-express\" uuid\nfunction getServerlessExpressUuid(): string | undefined {\n const currentInvoke = getCurrentInvoke();\n if (\n currentInvoke &&\n currentInvoke.context &&\n currentInvoke.context.awsRequestId\n ) {\n return currentInvoke.context.awsRequestId;\n }\n return undefined;\n}\n\n//\n//\n// Main\n//\n\nconst getCurrentInvokeUuid = (): string | undefined =>\n getServerlessExpressUuid();\n\n//\n//\n// Export\n//\n\nexport default getCurrentInvokeUuid;\n","import type { Response } from \"express\";\nimport { HTTP, JAYPIE } from \"@jaypie/kit\";\nimport { log as publicLogger } from \"@jaypie/logger\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\n\n//\n//\n// Types\n//\n\ninterface DecorateResponseOptions {\n handler?: string;\n version?: string;\n}\n\n//\n//\n// Main\n//\n\nconst decorateResponse = (\n res: Response,\n {\n handler = \"\",\n version = process.env.PROJECT_VERSION,\n }: DecorateResponseOptions = {},\n): void => {\n const log = publicLogger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n //\n //\n // Validate\n //\n if (typeof res !== \"object\" || res === null) {\n log.warn(\"decorateResponse called but response is not an object\");\n return;\n }\n\n try {\n //\n //\n // Decorate Headers\n //\n\n // X-Powered-By, override \"Express\" but nothing else\n if (\n !res.get(HTTP.HEADER.POWERED_BY) ||\n res.get(HTTP.HEADER.POWERED_BY) === \"Express\"\n ) {\n res.set(HTTP.HEADER.POWERED_BY, JAYPIE.LIB.EXPRESS);\n }\n\n // X-Project-Environment\n if (process.env.PROJECT_ENV) {\n res.set(HTTP.HEADER.PROJECT.ENVIRONMENT, process.env.PROJECT_ENV);\n }\n\n // X-Project-Handler\n if (handler) {\n res.set(HTTP.HEADER.PROJECT.HANDLER, handler);\n }\n\n // X-Project-Invocation\n const currentInvoke = getCurrentInvokeUuid();\n if (currentInvoke) {\n res.set(HTTP.HEADER.PROJECT.INVOCATION, currentInvoke);\n }\n\n // X-Project-Key\n if (process.env.PROJECT_KEY) {\n res.set(HTTP.HEADER.PROJECT.KEY, process.env.PROJECT_KEY);\n }\n\n // X-Project-Version\n if (version) {\n res.set(HTTP.HEADER.PROJECT.VERSION, version);\n }\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n log.warn(\"decorateResponse caught an internal error\");\n log.var({ error });\n }\n};\n\n//\n//\n// Export\n//\n\nexport default decorateResponse;\n\n//\n//\n// Footnotes\n//\n\n// This is a \"utility\" function but it needs a lot of \"context\"\n// about the environment's secret parameters, the special adapter,\n// HTTP, etc. There must be a better way to organize this\n","import type { Request } from \"express\";\n\n//\n//\n// Types\n//\n\nexport interface RequestSummary {\n baseUrl: string;\n body: unknown;\n headers: Request[\"headers\"];\n method: string;\n query: Request[\"query\"];\n url: string;\n}\n\n//\n//\n// Function Definition\n//\n\nfunction summarizeRequest(req: Request): RequestSummary {\n // If body is a buffer, convert it to a string\n let { body } = req;\n if (Buffer.isBuffer(body)) {\n body = body.toString();\n }\n\n return {\n baseUrl: req.baseUrl,\n body,\n headers: req.headers,\n method: req.method,\n query: req.query,\n url: req.url,\n };\n}\n\n//\n//\n// Export\n//\n\nexport default summarizeRequest;\n","import type { Response } from \"express\";\n\n//\n//\n// Types\n//\n\nexport interface ResponseSummary {\n statusCode: number;\n statusMessage: string;\n headers?: ReturnType<Response[\"getHeaders\"]>;\n [key: string]: unknown;\n}\n\n//\n//\n// Function Definition\n//\n\nfunction summarizeResponse(\n res: Response,\n extras?: Record<string, unknown>,\n): ResponseSummary {\n const response: ResponseSummary = {\n statusCode: res.statusCode,\n statusMessage: res.statusMessage,\n };\n if (typeof res.getHeaders === \"function\") {\n response.headers = res.getHeaders();\n }\n if (typeof extras === \"object\" && extras !== null) {\n Object.assign(response, extras);\n }\n return response;\n}\n\n//\n//\n// Export\n//\n\nexport default summarizeResponse;\n","import type { Request, Response } from \"express\";\nimport { BadRequestError, UnhandledError } from \"@jaypie/errors\";\nimport { force, getHeaderFrom, HTTP, JAYPIE, jaypieHandler } from \"@jaypie/kit\";\nimport { log as publicLogger } from \"@jaypie/logger\";\nimport { DATADOG, hasDatadogEnv, submitMetric } from \"@jaypie/datadog\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\nimport decorateResponse from \"./decorateResponse.helper.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\nimport summarizeResponse from \"./summarizeResponse.helper.js\";\n\n//\n//\n// Types\n//\n\n// Extended logger interface for features not in the base type definitions\ninterface ExtendedLogger {\n init: () => void;\n level: string;\n debug: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n error: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n fatal: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n info: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n trace: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n warn: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n var(key: string | Record<string, unknown>, value?: unknown): void;\n tag(\n key: string | string[] | Record<string, unknown> | null,\n value?: string,\n ): void;\n untag(tags: string | string[] | Record<string, unknown> | null): void;\n lib(options: {\n level?: string;\n lib?: string;\n tags?: Record<string, unknown>;\n }): ExtendedLogger;\n}\n\n// Exported type aliases for defining handler lifecycle functions\nexport type JaypieHandlerSetup = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieHandlerTeardown = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieHandlerValidate = (\n req: Request,\n res: Response,\n) => Promise<boolean> | boolean;\n\nexport type ExpressHandlerLocals = (\n req: Request,\n res: Response,\n) => Promise<unknown> | unknown;\n\nexport interface ExpressHandlerOptions {\n chaos?: string;\n locals?: Record<string, unknown | ExpressHandlerLocals>;\n name?: string;\n setup?: JaypieHandlerSetup[] | JaypieHandlerSetup;\n teardown?: JaypieHandlerTeardown[] | JaypieHandlerTeardown;\n unavailable?: boolean;\n validate?: JaypieHandlerValidate[] | JaypieHandlerValidate;\n}\n\ninterface ExtendedRequest extends Request {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ninterface ExtendedResponse extends Response {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ntype ExpressHandler<T> = (\n req: Request,\n res: Response,\n ...params: unknown[]\n) => Promise<T>;\n\ninterface JaypieError extends Error {\n status?: number;\n body?: () => Record<string, unknown>;\n}\n\ninterface ResponseWithJson {\n json: () => Record<string, unknown>;\n}\n\n// Cast logger to extended interface for runtime features not in type definitions\nconst logger = publicLogger as unknown as ExtendedLogger;\n\n//\n//\n// Main\n//\n\n/* eslint-disable no-redeclare */\nfunction expressHandler<T>(\n handler: ExpressHandler<T>,\n options?: ExpressHandlerOptions,\n): ExpressHandler<T>;\nfunction expressHandler<T>(\n options: ExpressHandlerOptions,\n handler: ExpressHandler<T>,\n): ExpressHandler<T>;\nfunction expressHandler<T>(\n handlerOrOptions: ExpressHandler<T> | ExpressHandlerOptions,\n optionsOrHandler?: ExpressHandlerOptions | ExpressHandler<T>,\n): ExpressHandler<T> {\n /* eslint-enable no-redeclare */\n let handler: ExpressHandler<T>;\n let options: ExpressHandlerOptions;\n\n // If handler is an object and options is a function, swap them\n if (\n typeof handlerOrOptions === \"object\" &&\n typeof optionsOrHandler === \"function\"\n ) {\n handler = optionsOrHandler as ExpressHandler<T>;\n options = handlerOrOptions as ExpressHandlerOptions;\n } else {\n handler = handlerOrOptions as ExpressHandler<T>;\n options = (optionsOrHandler || {}) as ExpressHandlerOptions;\n }\n\n //\n //\n // Validate\n //\n let {\n chaos,\n locals,\n name,\n setup = [],\n teardown = [],\n unavailable,\n validate,\n } = options;\n if (typeof handler !== \"function\") {\n throw new BadRequestError(\n `Argument \"${handler}\" doesn't match type \"function\"`,\n );\n }\n if (\n locals !== undefined &&\n (typeof locals !== \"object\" || locals === null || Array.isArray(locals))\n ) {\n throw new BadRequestError(\n `Argument \"${locals}\" doesn't match type \"object\"`,\n );\n }\n setup = force.array(setup) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[]; // allows a single item\n teardown = force.array(teardown) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[]; // allows a single item\n\n //\n //\n // Setup\n //\n\n let jaypieFunction: ReturnType<typeof jaypieHandler>;\n\n return async (\n req: Request,\n res: Response,\n ...params: unknown[]\n ): Promise<T> => {\n // * This is the first line of code that runs when a request is received\n const extReq = req as ExtendedRequest;\n const extRes = res as ExtendedResponse;\n\n // Set default chaos value\n if (chaos === undefined) {\n chaos =\n process.env.PROJECT_CHAOS ||\n (getHeaderFrom(\n \"X-Project-Chaos\",\n req as unknown as Record<string, unknown>,\n ) as string | undefined);\n }\n\n // Re-init the logger\n logger.init();\n // Very low-level, internal sub-trace details\n const libLogger = logger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n // Top-level, important details that run at the same level as the main logger\n const log = logger.lib({\n level: logger.level,\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n // Update the public logger with the request ID\n const invokeUuid = getCurrentInvokeUuid();\n if (invokeUuid) {\n logger.tag({ invoke: invokeUuid });\n logger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n // TODO: in theory this is redundant\n libLogger.tag({ invoke: invokeUuid });\n libLogger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n log.tag({ invoke: invokeUuid });\n log.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n }\n\n if (!name) {\n // If handler has a name, use it\n if (handler.name) {\n name = handler.name;\n } else {\n name = JAYPIE.UNKNOWN;\n }\n }\n logger.tag({ handler: name });\n // TODO: in theory this is redundant\n libLogger.tag({ handler: name });\n log.tag({ handler: name });\n\n libLogger.trace(\"[jaypie] Express init\");\n\n // Set req.locals if it doesn't exist\n if (!extReq.locals) extReq.locals = {};\n if (!extReq.locals._jaypie) extReq.locals._jaypie = {};\n\n // Set res.locals if it doesn't exist\n if (!extRes.locals) extRes.locals = {};\n if (!extRes.locals._jaypie) extRes.locals._jaypie = {};\n\n const originalRes = {\n attemptedCall: undefined as ((...args: unknown[]) => unknown) | undefined,\n attemptedParams: undefined as unknown[] | undefined,\n end: res.end.bind(res) as typeof res.end,\n json: res.json.bind(res) as typeof res.json,\n send: res.send.bind(res) as typeof res.send,\n status: res.status.bind(res) as typeof res.status,\n statusSent: false as boolean | number,\n };\n\n res.end = ((...endParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.end as unknown as (\n ...args: unknown[]\n ) => unknown;\n originalRes.attemptedParams = endParams;\n log.warn(\n \"[jaypie] Illegal call to res.end(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.end;\n\n res.json = ((...jsonParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.json;\n originalRes.attemptedParams = jsonParams;\n log.warn(\n \"[jaypie] Illegal call to res.json(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.json;\n\n res.send = ((...sendParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.send;\n originalRes.attemptedParams = sendParams;\n log.warn(\n \"[jaypie] Illegal call to res.send(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.send;\n\n res.status = ((...statusParams: [number]) => {\n originalRes.statusSent = statusParams[0];\n return originalRes.status(...statusParams);\n }) as typeof res.status;\n\n //\n //\n // Preprocess\n //\n\n if (locals) {\n // Locals\n const keys = Object.keys(locals);\n if (keys.length > 0) {\n const localsSetup = async (localsReq: Request, localsRes: Response) => {\n const extLocalsReq = localsReq as ExtendedRequest;\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n libLogger.trace(`[jaypie] Locals: ${key}`);\n const localValue = locals[key];\n if (typeof localValue === \"function\") {\n extLocalsReq.locals[key] = await localValue(localsReq, localsRes);\n } else {\n extLocalsReq.locals[key] = localValue;\n }\n }\n };\n setup.push(localsSetup);\n }\n }\n\n let response: T | Record<string, unknown> | undefined;\n let status: number = HTTP.CODE.OK;\n\n try {\n log.info.var({ req: summarizeRequest(req) });\n\n // Initialize after logging is set up\n\n jaypieFunction = jaypieHandler(\n handler as unknown as (...args: unknown[]) => Promise<unknown>,\n {\n chaos,\n name,\n setup,\n teardown,\n unavailable,\n validate,\n } as any,\n );\n\n libLogger.trace(\"[jaypie] Express execution\");\n\n //\n //\n // Process\n //\n\n response = (await jaypieFunction(req, res, ...params)) as\n | T\n | Record<string, unknown>\n | undefined;\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n // In theory jaypieFunction has handled all errors\n const jaypieError = error as JaypieError;\n if (jaypieError.status) {\n status = jaypieError.status;\n }\n if (typeof jaypieError.body === \"function\") {\n response = jaypieError.body();\n } else {\n // This should never happen\n const unhandledError = new UnhandledError();\n response = unhandledError.body() as unknown as Record<string, unknown>;\n status = unhandledError.status;\n }\n }\n\n //\n //\n // Postprocess\n //\n\n // Restore original res functions\n res.end = originalRes.end;\n res.json = originalRes.json;\n res.send = originalRes.send;\n res.status = originalRes.status;\n\n // Decorate response\n decorateResponse(res, { handler: name });\n\n // Allow the sent status to override the status in the response\n if (originalRes.statusSent) {\n status = originalRes.statusSent as number;\n }\n\n // Send response\n try {\n if (!originalRes.attemptedCall) {\n // Body\n if (response) {\n if (typeof response === \"object\") {\n if (\n typeof (response as unknown as ResponseWithJson).json ===\n \"function\"\n ) {\n res.json((response as unknown as ResponseWithJson).json());\n } else {\n res.status(status).json(response);\n }\n } else if (typeof response === \"string\") {\n try {\n res.status(status).json(JSON.parse(response));\n } catch {\n res.status(status).send(response);\n }\n } else if (response === true) {\n res.status(HTTP.CODE.CREATED).send();\n } else {\n res.status(status).send(response as unknown as string);\n }\n } else {\n // No response\n res.status(HTTP.CODE.NO_CONTENT).send();\n }\n } else {\n // Resolve illegal call to res.end(), res.json(), or res.send()\n log.debug(\"[jaypie] Resolving illegal call to res\");\n log.var({\n attemptedCall: {\n name: originalRes.attemptedCall.name,\n params: originalRes.attemptedParams,\n },\n });\n // Call the original function with the original parameters and the original `this` (res)\n (originalRes.attemptedCall as (...args: unknown[]) => unknown).call(\n res,\n ...(originalRes.attemptedParams || []),\n );\n }\n } catch (error) {\n log.fatal(\"Express encountered an error while sending the response\");\n log.var({ responseError: error });\n }\n\n // Log response\n const extras: Record<string, unknown> = {};\n if (response) extras.body = response;\n log.info.var({\n res: summarizeResponse(res, extras),\n });\n\n // Submit metric if Datadog is configured\n if (hasDatadogEnv()) {\n // Construct path from baseUrl and url\n let path = (req.baseUrl || \"\") + (req.url || \"\");\n // Ensure path starts with /\n if (!path.startsWith(\"/\")) {\n path = \"/\" + path;\n }\n // Remove trailing slash unless it's the root path\n if (path.length > 1 && path.endsWith(\"/\")) {\n path = path.slice(0, -1);\n }\n\n // Replace UUIDs with :id for better aggregation\n // Matches standard UUID v4 format (8-4-4-4-12 hex characters)\n path = path.replace(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n \":id\",\n );\n\n // Determine metric name based on environment variables\n let metricPrefix = \"project\";\n if (process.env.PROJECT_SPONSOR) {\n metricPrefix = process.env.PROJECT_SPONSOR;\n } else if (process.env.PROJECT_KEY) {\n metricPrefix = `project.${process.env.PROJECT_KEY}`;\n }\n\n await submitMetric({\n name: `${metricPrefix}.api.response`,\n type: DATADOG.METRIC.TYPE.COUNT,\n value: 1,\n tags: {\n status: String(res.statusCode),\n path,\n },\n });\n }\n\n // Clean up the public logger\n logger.untag(\"handler\");\n\n //\n //\n // Return\n //\n\n return response as T;\n };\n}\n\n//\n//\n// Export\n//\n\nexport default expressHandler;\n","import type { Request, Response } from \"express\";\nimport {\n BadGatewayError,\n BadRequestError,\n ForbiddenError,\n GatewayTimeoutError,\n GoneError,\n InternalError,\n MethodNotAllowedError,\n NotFoundError,\n TeapotError,\n UnauthorizedError,\n UnavailableError,\n} from \"@jaypie/errors\";\nimport { HTTP } from \"@jaypie/kit\";\nimport { log } from \"@jaypie/logger\";\n\nimport expressHandler, { ExpressHandlerOptions } from \"./expressHandler.js\";\n\n//\n//\n// Types\n//\n\ntype ErrorConstructor = new () => Error;\n\n//\n//\n// Main\n//\n\nconst httpHandler = (\n statusCode: number = HTTP.CODE.OK,\n context: ExpressHandlerOptions = {},\n): ((\n req: Request,\n res: Response,\n) => Promise<Record<string, unknown> | null>) => {\n // Give a default name if there isn't one\n if (!context.name) {\n context.name = \"_http\";\n }\n\n // Return a function that will be used as an express route\n return expressHandler(\n async (\n req: Request,\n res: Response,\n ): Promise<Record<string, unknown> | null> => {\n // Map the most throwable status codes to errors and throw them!\n const error: Record<number, ErrorConstructor> = {\n [HTTP.CODE.BAD_REQUEST]: BadRequestError,\n [HTTP.CODE.UNAUTHORIZED]: UnauthorizedError,\n [HTTP.CODE.FORBIDDEN]: ForbiddenError,\n [HTTP.CODE.NOT_FOUND]: NotFoundError,\n [HTTP.CODE.METHOD_NOT_ALLOWED]: MethodNotAllowedError,\n [HTTP.CODE.GONE]: GoneError,\n [HTTP.CODE.TEAPOT]: TeapotError,\n [HTTP.CODE.INTERNAL_ERROR]: InternalError,\n [HTTP.CODE.BAD_GATEWAY]: BadGatewayError,\n [HTTP.CODE.UNAVAILABLE]: UnavailableError,\n [HTTP.CODE.GATEWAY_TIMEOUT]: GatewayTimeoutError,\n };\n\n // If this maps to an error, throw it\n if (error[statusCode]) {\n log.trace(\n `@knowdev/express: gracefully throwing ${statusCode} up to projectHandler`,\n );\n throw new error[statusCode]();\n }\n\n // If this is an error and we didn't get thrown, log a warning\n if (statusCode >= 400) {\n log.warn(\n `@knowdev/express: status code ${statusCode} not mapped as throwable`,\n );\n }\n\n // Send the response\n res.status(statusCode);\n return statusCode === HTTP.CODE.NO_CONTENT ? null : {};\n },\n context,\n );\n};\n\n//\n//\n// Export\n//\n\nexport default httpHandler;\n","import type { Request, Response } from \"express\";\nimport { BadRequestError } from \"@jaypie/errors\";\n\nimport expressHandler, { ExpressHandlerOptions } from \"./expressHandler.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\n\n//\n//\n// Types\n//\n\nexport interface EchoResponse {\n req: ReturnType<typeof summarizeRequest>;\n}\n\n//\n//\n// Main\n//\n\nconst echoHandler = (\n context: ExpressHandlerOptions = {},\n): ((req: Request, res: Response) => Promise<EchoResponse>) => {\n if (\n typeof context !== \"object\" ||\n context === null ||\n Array.isArray(context)\n ) {\n throw new BadRequestError(\n `Argument \"${context}\" doesn't match type \"object\"`,\n );\n }\n // Give a default name if there isn't one\n if (!context.name) {\n context.name = \"_echo\";\n }\n\n // Return a function that will be used as an express route\n return expressHandler(async (req: Request): Promise<EchoResponse> => {\n return {\n req: summarizeRequest(req),\n };\n }, context);\n};\n\n//\n//\n// Export\n//\n\nexport default echoHandler;\n","import { NotImplementedError } from \"@jaypie/errors\";\nimport { HTTP } from \"@jaypie/kit\";\n\nimport expressHandler from \"./expressHandler.js\";\nimport httpHandler from \"./http.handler.js\";\nimport echoHandler from \"./echo.handler.js\";\n\n//\n//\n// Functions\n//\n\nconst routes = {\n badRequestRoute: httpHandler(HTTP.CODE.BAD_REQUEST, { name: \"_badRequest\" }),\n echoRoute: echoHandler(),\n forbiddenRoute: httpHandler(HTTP.CODE.FORBIDDEN, { name: \"_forbidden\" }),\n goneRoute: httpHandler(HTTP.CODE.GONE, { name: \"_gone\" }),\n methodNotAllowedRoute: httpHandler(HTTP.CODE.METHOD_NOT_ALLOWED, {\n name: \"_methodNotAllowed\",\n }),\n noContentRoute: httpHandler(HTTP.CODE.NO_CONTENT, { name: \"_noContent\" }),\n notFoundRoute: httpHandler(HTTP.CODE.NOT_FOUND, { name: \"_notFound\" }),\n notImplementedRoute: expressHandler(\n (): never => {\n throw new NotImplementedError();\n },\n { name: \"_notImplemented\" },\n ),\n};\n\n//\n//\n// Export\n//\n\nexport const badRequestRoute = routes.badRequestRoute;\nexport const echoRoute = routes.echoRoute;\nexport const forbiddenRoute = routes.forbiddenRoute;\nexport const goneRoute = routes.goneRoute;\nexport const methodNotAllowedRoute = routes.methodNotAllowedRoute;\nexport const noContentRoute = routes.noContentRoute;\nexport const notFoundRoute = routes.notFoundRoute;\nexport const notImplementedRoute = routes.notImplementedRoute;\n"],"names":["force","envBoolean","CorsError","getCurrentInvoke","publicLogger","JAYPIE","HTTP","BadRequestError","getHeaderFrom","jaypieHandler","UnhandledError","hasDatadogEnv","submitMetric","DATADOG","UnauthorizedError","ForbiddenError","NotFoundError","MethodNotAllowedError","GoneError","TeapotError","InternalError","BadGatewayError","UnavailableError","GatewayTimeoutError","log","NotImplementedError"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AAEO,MAAM,OAAO,GAAG;AACrB,IAAA,IAAI,EAAE;AACJ,QAAA,GAAG,EAAE,GAAG;AACR,QAAA,EAAE,EAAE,MAAM;AACV,QAAA,IAAI,EAAE,OAAO;AACd,KAAA;;;ACLH;AACA;AACA;AACA;AAEA,MAAM,aAAa,GAAG,SAAS;AAC/B,MAAM,cAAc,GAAG,UAAU;AACjC,MAAM,WAAW,GAAG,SAAS;AAc7B;AACA;AACA;AACA;AAEA,MAAM,cAAc,GAAG,CAAC,GAAuB,KAAwB;AACrE,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,OAAO,GAAG;AACpB,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;AACjE,QAAA,OAAO,GAAG;IACZ,OAAO,cAAc,GAAG,GAAG;AAC7B,CAAC;AAEM,MAAM,4BAA4B,GAAG,CAC1C,MAA0B,KAC+C;AACzE,IAAA,OAAO,CAAC,aAAiC,EAAE,QAAsB,KAAI;;AAEnE,QAAA,IAAI,MAAM,KAAK,GAAG,EAAE;AAClB,YAAA,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;YACpB;QACF;;QAGA,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;YACpB;QACF;QAEA,MAAM,cAAc,GAAwB,EAAE;AAC9C,QAAA,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;AACxB,YAAA,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAW,CAAC;QACrE;AACA,QAAA,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE;AAChC,YAAA,cAAc,CAAC,IAAI,CACjB,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAW,CACvD;QACH;QACA,IAAI,MAAM,EAAE;YACV,MAAM,iBAAiB,GAAGA,SAAK,CAAC,KAAK,CAAS,MAAM,CAAC;AACrD,YAAA,cAAc,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC;QAC3C;;AAGA,QAAA,IACE,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,WAAW;AACvC,YAAAC,cAAU,CAAC,sBAAsB,CAAC,EAClC;AACA,YAAA,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACvC,YAAA,cAAc,CAAC,IAAI,CAAC,0BAA0B,CAAC;QACjD;QAEA,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,KAAI;AAChD,YAAA,IAAI,OAAO,YAAY,MAAM,EAAE;AAC7B,gBAAA,OAAO,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;YACpC;AACA,YAAA,OAAO,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC;AACxC,QAAA,CAAC,CAAC;QAEF,IAAI,SAAS,EAAE;AACb,YAAA,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;QACtB;aAAO;AACL,YAAA,QAAQ,CAAC,IAAIC,gBAAS,EAAE,CAAC;QAC3B;AACF,IAAA,CAAC;AACH,CAAC;AAED;AACA;AACA;AACA;AAEA,MAAM,UAAU,GAAG,CACjB,MAAA,GAAqB,EAAE,KACW;IAClC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,MAAM;AAEzC,IAAA,MAAM,OAAO,GAAG;AACd,QAAA,MAAM,EAAE,4BAA4B,CAAC,MAAM,CAAC;;AAE5C,QAAA,GAAG,SAAS;KACb;AAED,IAAA,OAAO,WAAW,CAAC,OAAO,CAAC;AAC7B,CAAC;AAYD,kBAAe,CACb,MAAmB,KAC4C;AAC/D,IAAA,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC;AAC/B,IAAA,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,KAAI;QACzD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAoB,KAAI;YACtC,IAAI,KAAK,EAAE;gBACT,MAAM,SAAS,GAAG,KAA0B;AAC5C,gBAAA,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;AAC5B,gBAAA,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC;gBACjD,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACnC;AACA,YAAA,IAAI,EAAE;AACR,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AACH,CAAC;;ACtID;AACA;AACA;AACA;AAEA;AACA,SAAS,wBAAwB,GAAA;AAC/B,IAAA,MAAM,aAAa,GAAGC,kCAAgB,EAAE;AACxC,IAAA,IACE,aAAa;AACb,QAAA,aAAa,CAAC,OAAO;AACrB,QAAA,aAAa,CAAC,OAAO,CAAC,YAAY,EAClC;AACA,QAAA,OAAO,aAAa,CAAC,OAAO,CAAC,YAAY;IAC3C;AACA,IAAA,OAAO,SAAS;AAClB;AAEA;AACA;AACA;AACA;AAEA,MAAM,oBAAoB,GAAG,MAC3B,wBAAwB,EAAE;;ACV5B;AACA;AACA;AACA;AAEA,MAAM,gBAAgB,GAAG,CACvB,GAAa,EACb,EACE,OAAO,GAAG,EAAE,EACZ,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,GAAA,GACV,EAAE,KACvB;AACR,IAAA,MAAM,GAAG,GAAGC,YAAY,CAAC,GAAG,CAAC;AAC3B,QAAA,GAAG,EAAEC,UAAM,CAAC,GAAG,CAAC,OAAO;AACxB,KAAA,CAAC;;;;;IAMF,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE;AAC3C,QAAA,GAAG,CAAC,IAAI,CAAC,uDAAuD,CAAC;QACjE;IACF;AAEA,IAAA,IAAI;;;;;;QAOF,IACE,CAAC,GAAG,CAAC,GAAG,CAACC,QAAI,CAAC,MAAM,CAAC,UAAU,CAAC;AAChC,YAAA,GAAG,CAAC,GAAG,CAACA,QAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,SAAS,EAC7C;AACA,YAAA,GAAG,CAAC,GAAG,CAACA,QAAI,CAAC,MAAM,CAAC,UAAU,EAAED,UAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QACrD;;AAGA,QAAA,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE;AAC3B,YAAA,GAAG,CAAC,GAAG,CAACC,QAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QACnE;;QAGA,IAAI,OAAO,EAAE;AACX,YAAA,GAAG,CAAC,GAAG,CAACA,QAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;QAC/C;;AAGA,QAAA,MAAM,aAAa,GAAG,oBAAoB,EAAE;QAC5C,IAAI,aAAa,EAAE;AACjB,YAAA,GAAG,CAAC,GAAG,CAACA,QAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,aAAa,CAAC;QACxD;;AAGA,QAAA,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE;AAC3B,YAAA,GAAG,CAAC,GAAG,CAACA,QAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QAC3D;;QAGA,IAAI,OAAO,EAAE;AACX,YAAA,GAAG,CAAC,GAAG,CAACA,QAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;QAC/C;;;;;IAMF;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,GAAG,CAAC,IAAI,CAAC,2CAA2C,CAAC;AACrD,QAAA,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;IACpB;AACF,CAAC;AASD;AACA;AACA;AACA;AAEA;AACA;AACA;;ACzFA;AACA;AACA;AACA;AAEA,SAAS,gBAAgB,CAAC,GAAY,EAAA;;AAEpC,IAAA,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG;AAClB,IAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACzB,QAAA,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;IACxB;IAEA,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI;QACJ,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG,EAAE,GAAG,CAAC,GAAG;KACb;AACH;;ACtBA;AACA;AACA;AACA;AAEA,SAAS,iBAAiB,CACxB,GAAa,EACb,MAAgC,EAAA;AAEhC,IAAA,MAAM,QAAQ,GAAoB;QAChC,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,aAAa,EAAE,GAAG,CAAC,aAAa;KACjC;AACD,IAAA,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,UAAU,EAAE;AACxC,QAAA,QAAQ,CAAC,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE;IACrC;IACA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;AACjD,QAAA,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;IACjC;AACA,IAAA,OAAO,QAAQ;AACjB;;ACiFA;AACA,MAAM,MAAM,GAAGF,YAAyC;AAgBxD,SAAS,cAAc,CACrB,gBAA2D,EAC3D,gBAA4D,EAAA;;AAG5D,IAAA,IAAI,OAA0B;AAC9B,IAAA,IAAI,OAA8B;;IAGlC,IACE,OAAO,gBAAgB,KAAK,QAAQ;AACpC,QAAA,OAAO,gBAAgB,KAAK,UAAU,EACtC;QACA,OAAO,GAAG,gBAAqC;QAC/C,OAAO,GAAG,gBAAyC;IACrD;SAAO;QACL,OAAO,GAAG,gBAAqC;AAC/C,QAAA,OAAO,IAAI,gBAAgB,IAAI,EAAE,CAA0B;IAC7D;;;;;IAMA,IAAI,EACF,KAAK,EACL,MAAM,EACN,IAAI,EACJ,KAAK,GAAG,EAAE,EACV,QAAQ,GAAG,EAAE,EACb,WAAW,EACX,QAAQ,GACT,GAAG,OAAO;AACX,IAAA,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;AACjC,QAAA,MAAM,IAAIG,sBAAe,CACvB,aAAa,OAAO,CAAA,+BAAA,CAAiC,CACtD;IACH;IACA,IACE,MAAM,KAAK,SAAS;AACpB,SAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EACxE;AACA,QAAA,MAAM,IAAIA,sBAAe,CACvB,aAAa,MAAM,CAAA,6BAAA,CAA+B,CACnD;IACH;IACA,KAAK,GAAGP,SAAK,CAAC,KAAK,CAAC,KAAK,CAGJ,CAAC;IACtB,QAAQ,GAAGA,SAAK,CAAC,KAAK,CAAC,QAAQ,CAGV,CAAC;;;;;AAOtB,IAAA,IAAI,cAAgD;IAEpD,OAAO,OACL,GAAY,EACZ,GAAa,EACb,GAAG,MAAiB,KACN;;QAEd,MAAM,MAAM,GAAG,GAAsB;QACrC,MAAM,MAAM,GAAG,GAAuB;;AAGtC,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,KAAK;gBACH,OAAO,CAAC,GAAG,CAAC,aAAa;AACxB,oBAAAQ,iBAAa,CACZ,iBAAiB,EACjB,GAAyC,CACnB;QAC5B;;QAGA,MAAM,CAAC,IAAI,EAAE;;AAEb,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC;AAC3B,YAAA,GAAG,EAAEH,UAAM,CAAC,GAAG,CAAC,OAAO;AACxB,SAAA,CAAC;;AAEF,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;AACnB,YAAA,GAAG,EAAEA,UAAM,CAAC,GAAG,CAAC,OAAO;AACxB,SAAA,CAAC;;AAGF,QAAA,MAAM,UAAU,GAAG,oBAAoB,EAAE;QACzC,IAAI,UAAU,EAAE;YACd,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAClC,YAAA,MAAM,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;;YAEnD,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACrC,YAAA,SAAS,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAC/B,YAAA,GAAG,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAClD;QAEA,IAAI,CAAC,IAAI,EAAE;;AAET,YAAA,IAAI,OAAO,CAAC,IAAI,EAAE;AAChB,gBAAA,IAAI,GAAG,OAAO,CAAC,IAAI;YACrB;iBAAO;AACL,gBAAA,IAAI,GAAGA,UAAM,CAAC,OAAO;YACvB;QACF;QACA,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;QAE7B,SAAS,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAChC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAE1B,QAAA,SAAS,CAAC,KAAK,CAAC,uBAAuB,CAAC;;QAGxC,IAAI,CAAC,MAAM,CAAC,MAAM;AAAE,YAAA,MAAM,CAAC,MAAM,GAAG,EAAE;AACtC,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;AAAE,YAAA,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,EAAE;;QAGtD,IAAI,CAAC,MAAM,CAAC,MAAM;AAAE,YAAA,MAAM,CAAC,MAAM,GAAG,EAAE;AACtC,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;AAAE,YAAA,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,EAAE;AAEtD,QAAA,MAAM,WAAW,GAAG;AAClB,YAAA,aAAa,EAAE,SAA0D;AACzE,YAAA,eAAe,EAAE,SAAkC;YACnD,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAmB;YACxC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAoB;YAC3C,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAoB;YAC3C,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAsB;AACjD,YAAA,UAAU,EAAE,KAAyB;SACtC;QAED,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,SAAoB,KAAI;AACrC,YAAA,WAAW,CAAC,aAAa,GAAG,WAAW,CAAC,GAE5B;AACZ,YAAA,WAAW,CAAC,eAAe,GAAG,SAAS;AACvC,YAAA,GAAG,CAAC,IAAI,CACN,wEAAwE,CACzE;AACD,YAAA,OAAO,GAAG;AACZ,QAAA,CAAC,CAAmB;QAEpB,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,UAAqB,KAAI;AACvC,YAAA,WAAW,CAAC,aAAa,GAAG,WAAW,CAAC,IAAI;AAC5C,YAAA,WAAW,CAAC,eAAe,GAAG,UAAU;AACxC,YAAA,GAAG,CAAC,IAAI,CACN,yEAAyE,CAC1E;AACD,YAAA,OAAO,GAAG;AACZ,QAAA,CAAC,CAAoB;QAErB,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,UAAqB,KAAI;AACvC,YAAA,WAAW,CAAC,aAAa,GAAG,WAAW,CAAC,IAAI;AAC5C,YAAA,WAAW,CAAC,eAAe,GAAG,UAAU;AACxC,YAAA,GAAG,CAAC,IAAI,CACN,yEAAyE,CAC1E;AACD,YAAA,OAAO,GAAG;AACZ,QAAA,CAAC,CAAoB;QAErB,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,YAAsB,KAAI;AAC1C,YAAA,WAAW,CAAC,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC;AACxC,YAAA,OAAO,WAAW,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC;AAC5C,QAAA,CAAC,CAAsB;;;;;QAOvB,IAAI,MAAM,EAAE;;YAEV,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;AAChC,YAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnB,MAAM,WAAW,GAAG,OAAO,SAAkB,EAAE,SAAmB,KAAI;oBACpE,MAAM,YAAY,GAAG,SAA4B;AACjD,oBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;AACvC,wBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,wBAAA,SAAS,CAAC,KAAK,CAAC,oBAAoB,GAAG,CAAA,CAAE,CAAC;AAC1C,wBAAA,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC;AAC9B,wBAAA,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE;AACpC,4BAAA,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC;wBACnE;6BAAO;AACL,4BAAA,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU;wBACvC;oBACF;AACF,gBAAA,CAAC;AACD,gBAAA,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;YACzB;QACF;AAEA,QAAA,IAAI,QAAiD;AACrD,QAAA,IAAI,MAAM,GAAWC,QAAI,CAAC,IAAI,CAAC,EAAE;AAEjC,QAAA,IAAI;AACF,YAAA,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;;AAI5C,YAAA,cAAc,GAAGG,iBAAa,CAC5B,OAA8D,EAC9D;gBACE,KAAK;gBACL,IAAI;gBACJ,KAAK;gBACL,QAAQ;gBACR,WAAW;gBACX,QAAQ;AACF,aAAA,CACT;AAED,YAAA,SAAS,CAAC,KAAK,CAAC,4BAA4B,CAAC;;;;;AAO7C,YAAA,QAAQ,IAAI,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,CAGxC;;;;;QAMf;QAAE,OAAO,KAAK,EAAE;;YAEd,MAAM,WAAW,GAAG,KAAoB;AACxC,YAAA,IAAI,WAAW,CAAC,MAAM,EAAE;AACtB,gBAAA,MAAM,GAAG,WAAW,CAAC,MAAM;YAC7B;AACA,YAAA,IAAI,OAAO,WAAW,CAAC,IAAI,KAAK,UAAU,EAAE;AAC1C,gBAAA,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE;YAC/B;iBAAO;;AAEL,gBAAA,MAAM,cAAc,GAAG,IAAIC,qBAAc,EAAE;AAC3C,gBAAA,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAwC;AACtE,gBAAA,MAAM,GAAG,cAAc,CAAC,MAAM;YAChC;QACF;;;;;;AAQA,QAAA,GAAG,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG;AACzB,QAAA,GAAG,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI;AAC3B,QAAA,GAAG,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI;AAC3B,QAAA,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM;;QAG/B,gBAAgB,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;AAGxC,QAAA,IAAI,WAAW,CAAC,UAAU,EAAE;AAC1B,YAAA,MAAM,GAAG,WAAW,CAAC,UAAoB;QAC3C;;AAGA,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;;gBAE9B,IAAI,QAAQ,EAAE;AACZ,oBAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;wBAChC,IACE,OAAQ,QAAwC,CAAC,IAAI;AACrD,4BAAA,UAAU,EACV;4BACA,GAAG,CAAC,IAAI,CAAE,QAAwC,CAAC,IAAI,EAAE,CAAC;wBAC5D;6BAAO;4BACL,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;wBACnC;oBACF;AAAO,yBAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AACvC,wBAAA,IAAI;AACF,4BAAA,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;wBAC/C;AAAE,wBAAA,MAAM;4BACN,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;wBACnC;oBACF;AAAO,yBAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;AAC5B,wBAAA,GAAG,CAAC,MAAM,CAACJ,QAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE;oBACtC;yBAAO;wBACL,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAA6B,CAAC;oBACxD;gBACF;qBAAO;;AAEL,oBAAA,GAAG,CAAC,MAAM,CAACA,QAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE;gBACzC;YACF;iBAAO;;AAEL,gBAAA,GAAG,CAAC,KAAK,CAAC,wCAAwC,CAAC;gBACnD,GAAG,CAAC,GAAG,CAAC;AACN,oBAAA,aAAa,EAAE;AACb,wBAAA,IAAI,EAAE,WAAW,CAAC,aAAa,CAAC,IAAI;wBACpC,MAAM,EAAE,WAAW,CAAC,eAAe;AACpC,qBAAA;AACF,iBAAA,CAAC;;AAED,gBAAA,WAAW,CAAC,aAAiD,CAAC,IAAI,CACjE,GAAG,EACH,IAAI,WAAW,CAAC,eAAe,IAAI,EAAE,CAAC,CACvC;YACH;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,GAAG,CAAC,KAAK,CAAC,yDAAyD,CAAC;YACpE,GAAG,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;QACnC;;QAGA,MAAM,MAAM,GAA4B,EAAE;AAC1C,QAAA,IAAI,QAAQ;AAAE,YAAA,MAAM,CAAC,IAAI,GAAG,QAAQ;AACpC,QAAA,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;AACX,YAAA,GAAG,EAAE,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC;AACpC,SAAA,CAAC;;QAGF,IAAIK,qBAAa,EAAE,EAAE;;AAEnB,YAAA,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;;YAEhD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACzB,gBAAA,IAAI,GAAG,GAAG,GAAG,IAAI;YACnB;;AAEA,YAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBACzC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YAC1B;;;YAIA,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,gEAAgE,EAChE,KAAK,CACN;;YAGD,IAAI,YAAY,GAAG,SAAS;AAC5B,YAAA,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE;AAC/B,gBAAA,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe;YAC5C;AAAO,iBAAA,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE;gBAClC,YAAY,GAAG,WAAW,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE;YACrD;AAEA,YAAA,MAAMC,oBAAY,CAAC;gBACjB,IAAI,EAAE,CAAA,EAAG,YAAY,CAAA,aAAA,CAAe;AACpC,gBAAA,IAAI,EAAEC,eAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK;AAC/B,gBAAA,KAAK,EAAE,CAAC;AACR,gBAAA,IAAI,EAAE;AACJ,oBAAA,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;oBAC9B,IAAI;AACL,iBAAA;AACF,aAAA,CAAC;QACJ;;AAGA,QAAA,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;;;;;AAOvB,QAAA,OAAO,QAAa;AACtB,IAAA,CAAC;AACH;;ACheA;AACA;AACA;AACA;AAEA,MAAM,WAAW,GAAG,CAClB,UAAA,GAAqBP,QAAI,CAAC,IAAI,CAAC,EAAE,EACjC,OAAA,GAAiC,EAAE,KAIW;;AAE9C,IAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACjB,QAAA,OAAO,CAAC,IAAI,GAAG,OAAO;IACxB;;IAGA,OAAO,cAAc,CACnB,OACE,GAAY,EACZ,GAAa,KAC8B;;AAE3C,QAAA,MAAM,KAAK,GAAqC;AAC9C,YAAA,CAACA,QAAI,CAAC,IAAI,CAAC,WAAW,GAAGC,sBAAe;AACxC,YAAA,CAACD,QAAI,CAAC,IAAI,CAAC,YAAY,GAAGQ,wBAAiB;AAC3C,YAAA,CAACR,QAAI,CAAC,IAAI,CAAC,SAAS,GAAGS,qBAAc;AACrC,YAAA,CAACT,QAAI,CAAC,IAAI,CAAC,SAAS,GAAGU,oBAAa;AACpC,YAAA,CAACV,QAAI,CAAC,IAAI,CAAC,kBAAkB,GAAGW,4BAAqB;AACrD,YAAA,CAACX,QAAI,CAAC,IAAI,CAAC,IAAI,GAAGY,gBAAS;AAC3B,YAAA,CAACZ,QAAI,CAAC,IAAI,CAAC,MAAM,GAAGa,kBAAW;AAC/B,YAAA,CAACb,QAAI,CAAC,IAAI,CAAC,cAAc,GAAGc,oBAAa;AACzC,YAAA,CAACd,QAAI,CAAC,IAAI,CAAC,WAAW,GAAGe,sBAAe;AACxC,YAAA,CAACf,QAAI,CAAC,IAAI,CAAC,WAAW,GAAGgB,uBAAgB;AACzC,YAAA,CAAChB,QAAI,CAAC,IAAI,CAAC,eAAe,GAAGiB,0BAAmB;SACjD;;AAGD,QAAA,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE;AACrB,YAAAC,YAAG,CAAC,KAAK,CACP,yCAAyC,UAAU,CAAA,qBAAA,CAAuB,CAC3E;AACD,YAAA,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE;QAC/B;;AAGA,QAAA,IAAI,UAAU,IAAI,GAAG,EAAE;AACrB,YAAAA,YAAG,CAAC,IAAI,CACN,iCAAiC,UAAU,CAAA,wBAAA,CAA0B,CACtE;QACH;;AAGA,QAAA,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;AACtB,QAAA,OAAO,UAAU,KAAKlB,QAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,EAAE;IACxD,CAAC,EACD,OAAO,CACR;AACH;;ACtEA;AACA;AACA;AACA;AAEA,MAAM,WAAW,GAAG,CAClB,OAAA,GAAiC,EAAE,KACyB;IAC5D,IACE,OAAO,OAAO,KAAK,QAAQ;AAC3B,QAAA,OAAO,KAAK,IAAI;AAChB,QAAA,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EACtB;AACA,QAAA,MAAM,IAAIC,sBAAe,CACvB,aAAa,OAAO,CAAA,6BAAA,CAA+B,CACpD;IACH;;AAEA,IAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACjB,QAAA,OAAO,CAAC,IAAI,GAAG,OAAO;IACxB;;AAGA,IAAA,OAAO,cAAc,CAAC,OAAO,GAAY,KAA2B;QAClE,OAAO;AACL,YAAA,GAAG,EAAE,gBAAgB,CAAC,GAAG,CAAC;SAC3B;IACH,CAAC,EAAE,OAAO,CAAC;AACb,CAAC;;ACpCD;AACA;AACA;AACA;AAEA,MAAM,MAAM,GAAG;AACb,IAAA,eAAe,EAAE,WAAW,CAACD,QAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IAC5E,SAAS,EAAE,WAAW,EAAE;AACxB,IAAA,cAAc,EAAE,WAAW,CAACA,QAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AACxE,IAAA,SAAS,EAAE,WAAW,CAACA,QAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACzD,qBAAqB,EAAE,WAAW,CAACA,QAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;AAC/D,QAAA,IAAI,EAAE,mBAAmB;KAC1B,CAAC;AACF,IAAA,cAAc,EAAE,WAAW,CAACA,QAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AACzE,IAAA,aAAa,EAAE,WAAW,CAACA,QAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AACtE,IAAA,mBAAmB,EAAE,cAAc,CACjC,MAAY;QACV,MAAM,IAAImB,0BAAmB,EAAE;AACjC,IAAA,CAAC,EACD,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAC5B;CACF;AAED;AACA;AACA;AACA;AAEO,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,cAAc,GAAG,MAAM,CAAC;AAC9B,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,qBAAqB,GAAG,MAAM,CAAC;AACrC,MAAM,cAAc,GAAG,MAAM,CAAC;AAC9B,MAAM,aAAa,GAAG,MAAM,CAAC;AAC7B,MAAM,mBAAmB,GAAG,MAAM,CAAC;;;;;;;;;;;;;;;"}
package/dist/esm/index.js CHANGED
@@ -1,6 +1,7 @@
1
- import { CorsError } from '@jaypie/errors';
2
- import { force, envBoolean, log, JAYPIE, HTTP, validate, getHeaderFrom, jaypieHandler, UnhandledError, GatewayTimeoutError, UnavailableError, BadGatewayError, InternalError, TeapotError, GoneError, MethodNotAllowedError, NotFoundError, ForbiddenError, UnauthorizedError, BadRequestError, NotImplementedError } from '@jaypie/core';
1
+ import { CorsError, BadRequestError, UnhandledError, GatewayTimeoutError, UnavailableError, BadGatewayError, InternalError, TeapotError, GoneError, MethodNotAllowedError, NotFoundError, ForbiddenError, UnauthorizedError, NotImplementedError } from '@jaypie/errors';
2
+ import { force, envBoolean, JAYPIE, HTTP, getHeaderFrom, jaypieHandler } from '@jaypie/kit';
3
3
  import expressCors from 'cors';
4
+ import { log } from '@jaypie/logger';
4
5
  import { hasDatadogEnv, submitMetric, DATADOG } from '@jaypie/datadog';
5
6
  import { getCurrentInvoke } from '@codegenie/serverless-express';
6
7
 
@@ -248,9 +249,14 @@ function expressHandler(handlerOrOptions, optionsOrHandler) {
248
249
  //
249
250
  // Validate
250
251
  //
251
- let { chaos, locals, name, setup = [], teardown = [], unavailable, validate: validate$1, } = options;
252
- validate.function(handler);
253
- validate.optional.object(locals);
252
+ let { chaos, locals, name, setup = [], teardown = [], unavailable, validate, } = options;
253
+ if (typeof handler !== "function") {
254
+ throw new BadRequestError(`Argument "${handler}" doesn't match type "function"`);
255
+ }
256
+ if (locals !== undefined &&
257
+ (typeof locals !== "object" || locals === null || Array.isArray(locals))) {
258
+ throw new BadRequestError(`Argument "${locals}" doesn't match type "object"`);
259
+ }
254
260
  setup = force.array(setup); // allows a single item
255
261
  teardown = force.array(teardown); // allows a single item
256
262
  //
@@ -381,7 +387,7 @@ function expressHandler(handlerOrOptions, optionsOrHandler) {
381
387
  setup,
382
388
  teardown,
383
389
  unavailable,
384
- validate: validate$1,
390
+ validate,
385
391
  });
386
392
  libLogger.trace("[jaypie] Express execution");
387
393
  //
@@ -400,13 +406,13 @@ function expressHandler(handlerOrOptions, optionsOrHandler) {
400
406
  if (jaypieError.status) {
401
407
  status = jaypieError.status;
402
408
  }
403
- if (typeof jaypieError.json === "function") {
404
- response = jaypieError.json();
409
+ if (typeof jaypieError.body === "function") {
410
+ response = jaypieError.body();
405
411
  }
406
412
  else {
407
413
  // This should never happen
408
414
  const unhandledError = new UnhandledError();
409
- response = unhandledError.json();
415
+ response = unhandledError.body();
410
416
  status = unhandledError.status;
411
417
  }
412
418
  }
@@ -571,7 +577,11 @@ const httpHandler = (statusCode = HTTP.CODE.OK, context = {}) => {
571
577
  // Main
572
578
  //
573
579
  const echoHandler = (context = {}) => {
574
- validate.object(context);
580
+ if (typeof context !== "object" ||
581
+ context === null ||
582
+ Array.isArray(context)) {
583
+ throw new BadRequestError(`Argument "${context}" doesn't match type "object"`);
584
+ }
575
585
  // Give a default name if there isn't one
576
586
  if (!context.name) {
577
587
  context.name = "_echo";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/constants.ts","../../../src/cors.helper.ts","../../../src/getCurrentInvokeUuid.adapter.ts","../../../src/decorateResponse.helper.ts","../../../src/summarizeRequest.helper.ts","../../../src/summarizeResponse.helper.ts","../../../src/expressHandler.ts","../../../src/http.handler.ts","../../../src/echo.handler.ts","../../../src/routes.ts"],"sourcesContent":["//\n//\n// Constants\n//\n\nexport const EXPRESS = {\n PATH: {\n ANY: \"*\",\n ID: \"/:id\",\n ROOT: /^\\/?$/,\n },\n} as const;\n\nexport type ExpressConstants = typeof EXPRESS;\n","import type { Request, Response, NextFunction } from \"express\";\nimport { CorsError } from \"@jaypie/errors\";\nimport { envBoolean, force } from \"@jaypie/core\";\nimport expressCors from \"cors\";\n\n//\n//\n// Constants\n//\n\nconst HTTP_PROTOCOL = \"http://\";\nconst HTTPS_PROTOCOL = \"https://\";\nconst SANDBOX_ENV = \"sandbox\";\n\n//\n//\n// Types\n//\n\nexport interface CorsConfig {\n origin?: string | string[];\n overrides?: Record<string, unknown>;\n}\n\ntype CorsCallback = (err: Error | null, allow?: boolean) => void;\n\n//\n//\n// Helper Functions\n//\n\nconst ensureProtocol = (url: string | undefined): string | undefined => {\n if (!url) return url;\n if (url.startsWith(HTTP_PROTOCOL) || url.startsWith(HTTPS_PROTOCOL))\n return url;\n return HTTPS_PROTOCOL + url;\n};\n\nexport const dynamicOriginCallbackHandler = (\n origin?: string | string[],\n): ((requestOrigin: string | undefined, callback: CorsCallback) => void) => {\n return (requestOrigin: string | undefined, callback: CorsCallback) => {\n // Handle wildcard origin\n if (origin === \"*\") {\n callback(null, true);\n return;\n }\n\n // Allow requests with no origin (like mobile apps, curl, etc)\n if (!requestOrigin) {\n callback(null, true);\n return;\n }\n\n const allowedOrigins: (string | RegExp)[] = [];\n if (process.env.BASE_URL) {\n allowedOrigins.push(ensureProtocol(process.env.BASE_URL) as string);\n }\n if (process.env.PROJECT_BASE_URL) {\n allowedOrigins.push(\n ensureProtocol(process.env.PROJECT_BASE_URL) as string,\n );\n }\n if (origin) {\n const additionalOrigins = force.array<string>(origin);\n allowedOrigins.push(...additionalOrigins);\n }\n\n // Add localhost origins in sandbox\n if (\n process.env.PROJECT_ENV === SANDBOX_ENV ||\n envBoolean(\"PROJECT_SANDBOX_MODE\")\n ) {\n allowedOrigins.push(\"http://localhost\");\n allowedOrigins.push(/^http:\\/\\/localhost:\\d+$/);\n }\n\n const isAllowed = allowedOrigins.some((allowed) => {\n if (allowed instanceof RegExp) {\n return allowed.test(requestOrigin);\n }\n return requestOrigin.includes(allowed);\n });\n\n if (isAllowed) {\n callback(null, true);\n } else {\n callback(new CorsError());\n }\n };\n};\n\n//\n//\n// Main\n//\n\nconst corsHelper = (\n config: CorsConfig = {},\n): ReturnType<typeof expressCors> => {\n const { origin, overrides = {} } = config;\n\n const options = {\n origin: dynamicOriginCallbackHandler(origin),\n // * The default behavior is to allow any headers and methods so they are not included here\n ...overrides,\n };\n\n return expressCors(options);\n};\n\n//\n//\n// Export\n//\n\ninterface CorsErrorWithBody extends Error {\n status: number;\n body: () => Record<string, unknown>;\n}\n\nexport default (\n config?: CorsConfig,\n): ((req: Request, res: Response, next: NextFunction) => void) => {\n const cors = corsHelper(config);\n return (req: Request, res: Response, next: NextFunction) => {\n cors(req, res, (error?: Error | null) => {\n if (error) {\n const corsError = error as CorsErrorWithBody;\n res.status(corsError.status);\n res.setHeader(\"Content-Type\", \"application/json\");\n return res.json(corsError.body());\n }\n next();\n });\n };\n};\n","import { getCurrentInvoke } from \"@codegenie/serverless-express\";\n\n//\n//\n// Helper Functions\n//\n\n// Adapter for the \"@codegenie/serverless-express\" uuid\nfunction getServerlessExpressUuid(): string | undefined {\n const currentInvoke = getCurrentInvoke();\n if (\n currentInvoke &&\n currentInvoke.context &&\n currentInvoke.context.awsRequestId\n ) {\n return currentInvoke.context.awsRequestId;\n }\n return undefined;\n}\n\n//\n//\n// Main\n//\n\nconst getCurrentInvokeUuid = (): string | undefined =>\n getServerlessExpressUuid();\n\n//\n//\n// Export\n//\n\nexport default getCurrentInvokeUuid;\n","import type { Response } from \"express\";\nimport { HTTP, JAYPIE, log as publicLogger } from \"@jaypie/core\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\n\n//\n//\n// Types\n//\n\ninterface DecorateResponseOptions {\n handler?: string;\n version?: string;\n}\n\n//\n//\n// Main\n//\n\nconst decorateResponse = (\n res: Response,\n {\n handler = \"\",\n version = process.env.PROJECT_VERSION,\n }: DecorateResponseOptions = {},\n): void => {\n const log = publicLogger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n //\n //\n // Validate\n //\n if (typeof res !== \"object\" || res === null) {\n log.warn(\"decorateResponse called but response is not an object\");\n return;\n }\n\n try {\n //\n //\n // Decorate Headers\n //\n\n // X-Powered-By, override \"Express\" but nothing else\n if (\n !res.get(HTTP.HEADER.POWERED_BY) ||\n res.get(HTTP.HEADER.POWERED_BY) === \"Express\"\n ) {\n res.set(HTTP.HEADER.POWERED_BY, JAYPIE.LIB.EXPRESS);\n }\n\n // X-Project-Environment\n if (process.env.PROJECT_ENV) {\n res.set(HTTP.HEADER.PROJECT.ENVIRONMENT, process.env.PROJECT_ENV);\n }\n\n // X-Project-Handler\n if (handler) {\n res.set(HTTP.HEADER.PROJECT.HANDLER, handler);\n }\n\n // X-Project-Invocation\n const currentInvoke = getCurrentInvokeUuid();\n if (currentInvoke) {\n res.set(HTTP.HEADER.PROJECT.INVOCATION, currentInvoke);\n }\n\n // X-Project-Key\n if (process.env.PROJECT_KEY) {\n res.set(HTTP.HEADER.PROJECT.KEY, process.env.PROJECT_KEY);\n }\n\n // X-Project-Version\n if (version) {\n res.set(HTTP.HEADER.PROJECT.VERSION, version);\n }\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n log.warn(\"decorateResponse caught an internal error\");\n log.var({ error });\n }\n};\n\n//\n//\n// Export\n//\n\nexport default decorateResponse;\n\n//\n//\n// Footnotes\n//\n\n// This is a \"utility\" function but it needs a lot of \"context\"\n// about the environment's secret parameters, the special adapter,\n// HTTP, etc. There must be a better way to organize this\n","import type { Request } from \"express\";\n\n//\n//\n// Types\n//\n\nexport interface RequestSummary {\n baseUrl: string;\n body: unknown;\n headers: Request[\"headers\"];\n method: string;\n query: Request[\"query\"];\n url: string;\n}\n\n//\n//\n// Function Definition\n//\n\nfunction summarizeRequest(req: Request): RequestSummary {\n // If body is a buffer, convert it to a string\n let { body } = req;\n if (Buffer.isBuffer(body)) {\n body = body.toString();\n }\n\n return {\n baseUrl: req.baseUrl,\n body,\n headers: req.headers,\n method: req.method,\n query: req.query,\n url: req.url,\n };\n}\n\n//\n//\n// Export\n//\n\nexport default summarizeRequest;\n","import type { Response } from \"express\";\n\n//\n//\n// Types\n//\n\nexport interface ResponseSummary {\n statusCode: number;\n statusMessage: string;\n headers?: ReturnType<Response[\"getHeaders\"]>;\n [key: string]: unknown;\n}\n\n//\n//\n// Function Definition\n//\n\nfunction summarizeResponse(\n res: Response,\n extras?: Record<string, unknown>,\n): ResponseSummary {\n const response: ResponseSummary = {\n statusCode: res.statusCode,\n statusMessage: res.statusMessage,\n };\n if (typeof res.getHeaders === \"function\") {\n response.headers = res.getHeaders();\n }\n if (typeof extras === \"object\" && extras !== null) {\n Object.assign(response, extras);\n }\n return response;\n}\n\n//\n//\n// Export\n//\n\nexport default summarizeResponse;\n","import type { Request, Response } from \"express\";\nimport {\n force,\n getHeaderFrom,\n HTTP,\n JAYPIE,\n jaypieHandler,\n log as publicLogger,\n UnhandledError,\n validate as validateIs,\n} from \"@jaypie/core\";\nimport { DATADOG, hasDatadogEnv, submitMetric } from \"@jaypie/datadog\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\nimport decorateResponse from \"./decorateResponse.helper.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\nimport summarizeResponse from \"./summarizeResponse.helper.js\";\n\n//\n//\n// Types\n//\n\n// Extended logger interface for features not in the base type definitions\ninterface ExtendedLogger {\n init: () => void;\n level: string;\n debug: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n error: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n fatal: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n info: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n trace: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n warn: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n var(key: string | Record<string, unknown>, value?: unknown): void;\n tag(\n key: string | string[] | Record<string, unknown> | null,\n value?: string,\n ): void;\n untag(tags: string | string[] | Record<string, unknown> | null): void;\n lib(options: {\n level?: string;\n lib?: string;\n tags?: Record<string, unknown>;\n }): ExtendedLogger;\n}\n\n// Exported type aliases for defining handler lifecycle functions\nexport type JaypieHandlerSetup = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieHandlerTeardown = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieHandlerValidate = (\n req: Request,\n res: Response,\n) => Promise<boolean> | boolean;\n\nexport type ExpressHandlerLocals = (\n req: Request,\n res: Response,\n) => Promise<unknown> | unknown;\n\nexport interface ExpressHandlerOptions {\n chaos?: string;\n locals?: Record<string, unknown | ExpressHandlerLocals>;\n name?: string;\n setup?: JaypieHandlerSetup[] | JaypieHandlerSetup;\n teardown?: JaypieHandlerTeardown[] | JaypieHandlerTeardown;\n unavailable?: boolean;\n validate?: JaypieHandlerValidate[] | JaypieHandlerValidate;\n}\n\ninterface ExtendedRequest extends Request {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ninterface ExtendedResponse extends Response {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ntype ExpressHandler<T> = (\n req: Request,\n res: Response,\n ...params: unknown[]\n) => Promise<T>;\n\ninterface JaypieError extends Error {\n status?: number;\n json?: () => Record<string, unknown>;\n}\n\ninterface ResponseWithJson {\n json: () => Record<string, unknown>;\n}\n\n// Cast logger to extended interface for runtime features not in type definitions\nconst logger = publicLogger as unknown as ExtendedLogger;\n\n//\n//\n// Main\n//\n\n/* eslint-disable no-redeclare */\nfunction expressHandler<T>(\n handler: ExpressHandler<T>,\n options?: ExpressHandlerOptions,\n): ExpressHandler<T>;\nfunction expressHandler<T>(\n options: ExpressHandlerOptions,\n handler: ExpressHandler<T>,\n): ExpressHandler<T>;\nfunction expressHandler<T>(\n handlerOrOptions: ExpressHandler<T> | ExpressHandlerOptions,\n optionsOrHandler?: ExpressHandlerOptions | ExpressHandler<T>,\n): ExpressHandler<T> {\n /* eslint-enable no-redeclare */\n let handler: ExpressHandler<T>;\n let options: ExpressHandlerOptions;\n\n // If handler is an object and options is a function, swap them\n if (\n typeof handlerOrOptions === \"object\" &&\n typeof optionsOrHandler === \"function\"\n ) {\n handler = optionsOrHandler as ExpressHandler<T>;\n options = handlerOrOptions as ExpressHandlerOptions;\n } else {\n handler = handlerOrOptions as ExpressHandler<T>;\n options = (optionsOrHandler || {}) as ExpressHandlerOptions;\n }\n\n //\n //\n // Validate\n //\n let {\n chaos,\n locals,\n name,\n setup = [],\n teardown = [],\n unavailable,\n validate,\n } = options;\n validateIs.function(handler);\n validateIs.optional.object(locals);\n setup = force.array(setup) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[]; // allows a single item\n teardown = force.array(teardown) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[]; // allows a single item\n\n //\n //\n // Setup\n //\n\n let jaypieFunction: ReturnType<typeof jaypieHandler>;\n\n return async (\n req: Request,\n res: Response,\n ...params: unknown[]\n ): Promise<T> => {\n // * This is the first line of code that runs when a request is received\n const extReq = req as ExtendedRequest;\n const extRes = res as ExtendedResponse;\n\n // Set default chaos value\n if (chaos === undefined) {\n chaos =\n process.env.PROJECT_CHAOS ||\n (getHeaderFrom(\n \"X-Project-Chaos\",\n req as unknown as Record<string, unknown>,\n ) as string | undefined);\n }\n\n // Re-init the logger\n logger.init();\n // Very low-level, internal sub-trace details\n const libLogger = logger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n // Top-level, important details that run at the same level as the main logger\n const log = logger.lib({\n level: logger.level,\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n // Update the public logger with the request ID\n const invokeUuid = getCurrentInvokeUuid();\n if (invokeUuid) {\n logger.tag({ invoke: invokeUuid });\n logger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n // TODO: in theory this is redundant\n libLogger.tag({ invoke: invokeUuid });\n libLogger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n log.tag({ invoke: invokeUuid });\n log.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n }\n\n if (!name) {\n // If handler has a name, use it\n if (handler.name) {\n name = handler.name;\n } else {\n name = JAYPIE.UNKNOWN;\n }\n }\n logger.tag({ handler: name });\n // TODO: in theory this is redundant\n libLogger.tag({ handler: name });\n log.tag({ handler: name });\n\n libLogger.trace(\"[jaypie] Express init\");\n\n // Set req.locals if it doesn't exist\n if (!extReq.locals) extReq.locals = {};\n if (!extReq.locals._jaypie) extReq.locals._jaypie = {};\n\n // Set res.locals if it doesn't exist\n if (!extRes.locals) extRes.locals = {};\n if (!extRes.locals._jaypie) extRes.locals._jaypie = {};\n\n const originalRes = {\n attemptedCall: undefined as ((...args: unknown[]) => unknown) | undefined,\n attemptedParams: undefined as unknown[] | undefined,\n end: res.end.bind(res) as typeof res.end,\n json: res.json.bind(res) as typeof res.json,\n send: res.send.bind(res) as typeof res.send,\n status: res.status.bind(res) as typeof res.status,\n statusSent: false as boolean | number,\n };\n\n res.end = ((...endParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.end as unknown as (\n ...args: unknown[]\n ) => unknown;\n originalRes.attemptedParams = endParams;\n log.warn(\n \"[jaypie] Illegal call to res.end(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.end;\n\n res.json = ((...jsonParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.json;\n originalRes.attemptedParams = jsonParams;\n log.warn(\n \"[jaypie] Illegal call to res.json(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.json;\n\n res.send = ((...sendParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.send;\n originalRes.attemptedParams = sendParams;\n log.warn(\n \"[jaypie] Illegal call to res.send(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.send;\n\n res.status = ((...statusParams: [number]) => {\n originalRes.statusSent = statusParams[0];\n return originalRes.status(...statusParams);\n }) as typeof res.status;\n\n //\n //\n // Preprocess\n //\n\n if (locals) {\n // Locals\n const keys = Object.keys(locals);\n if (keys.length > 0) {\n const localsSetup = async (localsReq: Request, localsRes: Response) => {\n const extLocalsReq = localsReq as ExtendedRequest;\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n libLogger.trace(`[jaypie] Locals: ${key}`);\n const localValue = locals[key];\n if (typeof localValue === \"function\") {\n extLocalsReq.locals[key] = await localValue(localsReq, localsRes);\n } else {\n extLocalsReq.locals[key] = localValue;\n }\n }\n };\n setup.push(localsSetup);\n }\n }\n\n let response: T | Record<string, unknown> | undefined;\n let status: number = HTTP.CODE.OK;\n\n try {\n log.info.var({ req: summarizeRequest(req) });\n\n // Initialize after logging is set up\n\n jaypieFunction = jaypieHandler(\n handler as unknown as (...args: unknown[]) => unknown,\n {\n chaos,\n name,\n setup,\n teardown,\n unavailable,\n validate,\n } as any,\n );\n\n libLogger.trace(\"[jaypie] Express execution\");\n\n //\n //\n // Process\n //\n\n response = (await jaypieFunction(req, res, ...params)) as\n | T\n | Record<string, unknown>\n | undefined;\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n // In theory jaypieFunction has handled all errors\n const jaypieError = error as JaypieError;\n if (jaypieError.status) {\n status = jaypieError.status;\n }\n if (typeof jaypieError.json === \"function\") {\n response = jaypieError.json();\n } else {\n // This should never happen\n const unhandledError = new UnhandledError();\n response = unhandledError.json();\n status = unhandledError.status;\n }\n }\n\n //\n //\n // Postprocess\n //\n\n // Restore original res functions\n res.end = originalRes.end;\n res.json = originalRes.json;\n res.send = originalRes.send;\n res.status = originalRes.status;\n\n // Decorate response\n decorateResponse(res, { handler: name });\n\n // Allow the sent status to override the status in the response\n if (originalRes.statusSent) {\n status = originalRes.statusSent as number;\n }\n\n // Send response\n try {\n if (!originalRes.attemptedCall) {\n // Body\n if (response) {\n if (typeof response === \"object\") {\n if (\n typeof (response as unknown as ResponseWithJson).json ===\n \"function\"\n ) {\n res.json((response as unknown as ResponseWithJson).json());\n } else {\n res.status(status).json(response);\n }\n } else if (typeof response === \"string\") {\n try {\n res.status(status).json(JSON.parse(response));\n } catch {\n res.status(status).send(response);\n }\n } else if (response === true) {\n res.status(HTTP.CODE.CREATED).send();\n } else {\n res.status(status).send(response as unknown as string);\n }\n } else {\n // No response\n res.status(HTTP.CODE.NO_CONTENT).send();\n }\n } else {\n // Resolve illegal call to res.end(), res.json(), or res.send()\n log.debug(\"[jaypie] Resolving illegal call to res\");\n log.var({\n attemptedCall: {\n name: originalRes.attemptedCall.name,\n params: originalRes.attemptedParams,\n },\n });\n // Call the original function with the original parameters and the original `this` (res)\n (originalRes.attemptedCall as (...args: unknown[]) => unknown).call(\n res,\n ...(originalRes.attemptedParams || []),\n );\n }\n } catch (error) {\n log.fatal(\"Express encountered an error while sending the response\");\n log.var({ responseError: error });\n }\n\n // Log response\n const extras: Record<string, unknown> = {};\n if (response) extras.body = response;\n log.info.var({\n res: summarizeResponse(res, extras),\n });\n\n // Submit metric if Datadog is configured\n if (hasDatadogEnv()) {\n // Construct path from baseUrl and url\n let path = (req.baseUrl || \"\") + (req.url || \"\");\n // Ensure path starts with /\n if (!path.startsWith(\"/\")) {\n path = \"/\" + path;\n }\n // Remove trailing slash unless it's the root path\n if (path.length > 1 && path.endsWith(\"/\")) {\n path = path.slice(0, -1);\n }\n\n // Replace UUIDs with :id for better aggregation\n // Matches standard UUID v4 format (8-4-4-4-12 hex characters)\n path = path.replace(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n \":id\",\n );\n\n // Determine metric name based on environment variables\n let metricPrefix = \"project\";\n if (process.env.PROJECT_SPONSOR) {\n metricPrefix = process.env.PROJECT_SPONSOR;\n } else if (process.env.PROJECT_KEY) {\n metricPrefix = `project.${process.env.PROJECT_KEY}`;\n }\n\n await submitMetric({\n name: `${metricPrefix}.api.response`,\n type: DATADOG.METRIC.TYPE.COUNT,\n value: 1,\n tags: {\n status: String(res.statusCode),\n path,\n },\n });\n }\n\n // Clean up the public logger\n logger.untag(\"handler\");\n\n //\n //\n // Return\n //\n\n return response as T;\n };\n}\n\n//\n//\n// Export\n//\n\nexport default expressHandler;\n","import type { Request, Response } from \"express\";\nimport {\n BadGatewayError,\n BadRequestError,\n ForbiddenError,\n GatewayTimeoutError,\n GoneError,\n HTTP,\n InternalError,\n log,\n MethodNotAllowedError,\n NotFoundError,\n TeapotError,\n UnauthorizedError,\n UnavailableError,\n} from \"@jaypie/core\";\n\nimport expressHandler, { ExpressHandlerOptions } from \"./expressHandler.js\";\n\n//\n//\n// Types\n//\n\ntype ErrorConstructor = new () => Error;\n\n//\n//\n// Main\n//\n\nconst httpHandler = (\n statusCode: number = HTTP.CODE.OK,\n context: ExpressHandlerOptions = {},\n): ((\n req: Request,\n res: Response,\n) => Promise<Record<string, unknown> | null>) => {\n // Give a default name if there isn't one\n if (!context.name) {\n context.name = \"_http\";\n }\n\n // Return a function that will be used as an express route\n return expressHandler(\n async (\n req: Request,\n res: Response,\n ): Promise<Record<string, unknown> | null> => {\n // Map the most throwable status codes to errors and throw them!\n const error: Record<number, ErrorConstructor> = {\n [HTTP.CODE.BAD_REQUEST]: BadRequestError,\n [HTTP.CODE.UNAUTHORIZED]: UnauthorizedError,\n [HTTP.CODE.FORBIDDEN]: ForbiddenError,\n [HTTP.CODE.NOT_FOUND]: NotFoundError,\n [HTTP.CODE.METHOD_NOT_ALLOWED]: MethodNotAllowedError,\n [HTTP.CODE.GONE]: GoneError,\n [HTTP.CODE.TEAPOT]: TeapotError,\n [HTTP.CODE.INTERNAL_ERROR]: InternalError,\n [HTTP.CODE.BAD_GATEWAY]: BadGatewayError,\n [HTTP.CODE.UNAVAILABLE]: UnavailableError,\n [HTTP.CODE.GATEWAY_TIMEOUT]: GatewayTimeoutError,\n };\n\n // If this maps to an error, throw it\n if (error[statusCode]) {\n log.trace(\n `@knowdev/express: gracefully throwing ${statusCode} up to projectHandler`,\n );\n throw new error[statusCode]();\n }\n\n // If this is an error and we didn't get thrown, log a warning\n if (statusCode >= 400) {\n log.warn(\n `@knowdev/express: status code ${statusCode} not mapped as throwable`,\n );\n }\n\n // Send the response\n res.status(statusCode);\n return statusCode === HTTP.CODE.NO_CONTENT ? null : {};\n },\n context,\n );\n};\n\n//\n//\n// Export\n//\n\nexport default httpHandler;\n","import type { Request, Response } from \"express\";\nimport { validate } from \"@jaypie/core\";\n\nimport expressHandler, { ExpressHandlerOptions } from \"./expressHandler.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\n\n//\n//\n// Types\n//\n\nexport interface EchoResponse {\n req: ReturnType<typeof summarizeRequest>;\n}\n\n//\n//\n// Main\n//\n\nconst echoHandler = (\n context: ExpressHandlerOptions = {},\n): ((req: Request, res: Response) => Promise<EchoResponse>) => {\n validate.object(context);\n // Give a default name if there isn't one\n if (!context.name) {\n context.name = \"_echo\";\n }\n\n // Return a function that will be used as an express route\n return expressHandler(async (req: Request): Promise<EchoResponse> => {\n return {\n req: summarizeRequest(req),\n };\n }, context);\n};\n\n//\n//\n// Export\n//\n\nexport default echoHandler;\n","import { HTTP, NotImplementedError } from \"@jaypie/core\";\n\nimport expressHandler from \"./expressHandler.js\";\nimport httpHandler from \"./http.handler.js\";\nimport echoHandler from \"./echo.handler.js\";\n\n//\n//\n// Functions\n//\n\nconst routes = {\n badRequestRoute: httpHandler(HTTP.CODE.BAD_REQUEST, { name: \"_badRequest\" }),\n echoRoute: echoHandler(),\n forbiddenRoute: httpHandler(HTTP.CODE.FORBIDDEN, { name: \"_forbidden\" }),\n goneRoute: httpHandler(HTTP.CODE.GONE, { name: \"_gone\" }),\n methodNotAllowedRoute: httpHandler(HTTP.CODE.METHOD_NOT_ALLOWED, {\n name: \"_methodNotAllowed\",\n }),\n noContentRoute: httpHandler(HTTP.CODE.NO_CONTENT, { name: \"_noContent\" }),\n notFoundRoute: httpHandler(HTTP.CODE.NOT_FOUND, { name: \"_notFound\" }),\n notImplementedRoute: expressHandler(\n (): never => {\n throw new NotImplementedError();\n },\n { name: \"_notImplemented\" },\n ),\n};\n\n//\n//\n// Export\n//\n\nexport const badRequestRoute = routes.badRequestRoute;\nexport const echoRoute = routes.echoRoute;\nexport const forbiddenRoute = routes.forbiddenRoute;\nexport const goneRoute = routes.goneRoute;\nexport const methodNotAllowedRoute = routes.methodNotAllowedRoute;\nexport const noContentRoute = routes.noContentRoute;\nexport const notFoundRoute = routes.notFoundRoute;\nexport const notImplementedRoute = routes.notImplementedRoute;\n"],"names":["log","publicLogger","validate","validateIs"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/constants.ts","../../../src/cors.helper.ts","../../../src/getCurrentInvokeUuid.adapter.ts","../../../src/decorateResponse.helper.ts","../../../src/summarizeRequest.helper.ts","../../../src/summarizeResponse.helper.ts","../../../src/expressHandler.ts","../../../src/http.handler.ts","../../../src/echo.handler.ts","../../../src/routes.ts"],"sourcesContent":["//\n//\n// Constants\n//\n\nexport const EXPRESS = {\n PATH: {\n ANY: \"*\",\n ID: \"/:id\",\n ROOT: /^\\/?$/,\n },\n} as const;\n\nexport type ExpressConstants = typeof EXPRESS;\n","import type { Request, Response, NextFunction } from \"express\";\nimport { CorsError } from \"@jaypie/errors\";\nimport { envBoolean, force } from \"@jaypie/kit\";\nimport expressCors from \"cors\";\n\n//\n//\n// Constants\n//\n\nconst HTTP_PROTOCOL = \"http://\";\nconst HTTPS_PROTOCOL = \"https://\";\nconst SANDBOX_ENV = \"sandbox\";\n\n//\n//\n// Types\n//\n\nexport interface CorsConfig {\n origin?: string | string[];\n overrides?: Record<string, unknown>;\n}\n\ntype CorsCallback = (err: Error | null, allow?: boolean) => void;\n\n//\n//\n// Helper Functions\n//\n\nconst ensureProtocol = (url: string | undefined): string | undefined => {\n if (!url) return url;\n if (url.startsWith(HTTP_PROTOCOL) || url.startsWith(HTTPS_PROTOCOL))\n return url;\n return HTTPS_PROTOCOL + url;\n};\n\nexport const dynamicOriginCallbackHandler = (\n origin?: string | string[],\n): ((requestOrigin: string | undefined, callback: CorsCallback) => void) => {\n return (requestOrigin: string | undefined, callback: CorsCallback) => {\n // Handle wildcard origin\n if (origin === \"*\") {\n callback(null, true);\n return;\n }\n\n // Allow requests with no origin (like mobile apps, curl, etc)\n if (!requestOrigin) {\n callback(null, true);\n return;\n }\n\n const allowedOrigins: (string | RegExp)[] = [];\n if (process.env.BASE_URL) {\n allowedOrigins.push(ensureProtocol(process.env.BASE_URL) as string);\n }\n if (process.env.PROJECT_BASE_URL) {\n allowedOrigins.push(\n ensureProtocol(process.env.PROJECT_BASE_URL) as string,\n );\n }\n if (origin) {\n const additionalOrigins = force.array<string>(origin);\n allowedOrigins.push(...additionalOrigins);\n }\n\n // Add localhost origins in sandbox\n if (\n process.env.PROJECT_ENV === SANDBOX_ENV ||\n envBoolean(\"PROJECT_SANDBOX_MODE\")\n ) {\n allowedOrigins.push(\"http://localhost\");\n allowedOrigins.push(/^http:\\/\\/localhost:\\d+$/);\n }\n\n const isAllowed = allowedOrigins.some((allowed) => {\n if (allowed instanceof RegExp) {\n return allowed.test(requestOrigin);\n }\n return requestOrigin.includes(allowed);\n });\n\n if (isAllowed) {\n callback(null, true);\n } else {\n callback(new CorsError());\n }\n };\n};\n\n//\n//\n// Main\n//\n\nconst corsHelper = (\n config: CorsConfig = {},\n): ReturnType<typeof expressCors> => {\n const { origin, overrides = {} } = config;\n\n const options = {\n origin: dynamicOriginCallbackHandler(origin),\n // * The default behavior is to allow any headers and methods so they are not included here\n ...overrides,\n };\n\n return expressCors(options);\n};\n\n//\n//\n// Export\n//\n\ninterface CorsErrorWithBody extends Error {\n status: number;\n body: () => Record<string, unknown>;\n}\n\nexport default (\n config?: CorsConfig,\n): ((req: Request, res: Response, next: NextFunction) => void) => {\n const cors = corsHelper(config);\n return (req: Request, res: Response, next: NextFunction) => {\n cors(req, res, (error?: Error | null) => {\n if (error) {\n const corsError = error as CorsErrorWithBody;\n res.status(corsError.status);\n res.setHeader(\"Content-Type\", \"application/json\");\n return res.json(corsError.body());\n }\n next();\n });\n };\n};\n","import { getCurrentInvoke } from \"@codegenie/serverless-express\";\n\n//\n//\n// Helper Functions\n//\n\n// Adapter for the \"@codegenie/serverless-express\" uuid\nfunction getServerlessExpressUuid(): string | undefined {\n const currentInvoke = getCurrentInvoke();\n if (\n currentInvoke &&\n currentInvoke.context &&\n currentInvoke.context.awsRequestId\n ) {\n return currentInvoke.context.awsRequestId;\n }\n return undefined;\n}\n\n//\n//\n// Main\n//\n\nconst getCurrentInvokeUuid = (): string | undefined =>\n getServerlessExpressUuid();\n\n//\n//\n// Export\n//\n\nexport default getCurrentInvokeUuid;\n","import type { Response } from \"express\";\nimport { HTTP, JAYPIE } from \"@jaypie/kit\";\nimport { log as publicLogger } from \"@jaypie/logger\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\n\n//\n//\n// Types\n//\n\ninterface DecorateResponseOptions {\n handler?: string;\n version?: string;\n}\n\n//\n//\n// Main\n//\n\nconst decorateResponse = (\n res: Response,\n {\n handler = \"\",\n version = process.env.PROJECT_VERSION,\n }: DecorateResponseOptions = {},\n): void => {\n const log = publicLogger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n //\n //\n // Validate\n //\n if (typeof res !== \"object\" || res === null) {\n log.warn(\"decorateResponse called but response is not an object\");\n return;\n }\n\n try {\n //\n //\n // Decorate Headers\n //\n\n // X-Powered-By, override \"Express\" but nothing else\n if (\n !res.get(HTTP.HEADER.POWERED_BY) ||\n res.get(HTTP.HEADER.POWERED_BY) === \"Express\"\n ) {\n res.set(HTTP.HEADER.POWERED_BY, JAYPIE.LIB.EXPRESS);\n }\n\n // X-Project-Environment\n if (process.env.PROJECT_ENV) {\n res.set(HTTP.HEADER.PROJECT.ENVIRONMENT, process.env.PROJECT_ENV);\n }\n\n // X-Project-Handler\n if (handler) {\n res.set(HTTP.HEADER.PROJECT.HANDLER, handler);\n }\n\n // X-Project-Invocation\n const currentInvoke = getCurrentInvokeUuid();\n if (currentInvoke) {\n res.set(HTTP.HEADER.PROJECT.INVOCATION, currentInvoke);\n }\n\n // X-Project-Key\n if (process.env.PROJECT_KEY) {\n res.set(HTTP.HEADER.PROJECT.KEY, process.env.PROJECT_KEY);\n }\n\n // X-Project-Version\n if (version) {\n res.set(HTTP.HEADER.PROJECT.VERSION, version);\n }\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n log.warn(\"decorateResponse caught an internal error\");\n log.var({ error });\n }\n};\n\n//\n//\n// Export\n//\n\nexport default decorateResponse;\n\n//\n//\n// Footnotes\n//\n\n// This is a \"utility\" function but it needs a lot of \"context\"\n// about the environment's secret parameters, the special adapter,\n// HTTP, etc. There must be a better way to organize this\n","import type { Request } from \"express\";\n\n//\n//\n// Types\n//\n\nexport interface RequestSummary {\n baseUrl: string;\n body: unknown;\n headers: Request[\"headers\"];\n method: string;\n query: Request[\"query\"];\n url: string;\n}\n\n//\n//\n// Function Definition\n//\n\nfunction summarizeRequest(req: Request): RequestSummary {\n // If body is a buffer, convert it to a string\n let { body } = req;\n if (Buffer.isBuffer(body)) {\n body = body.toString();\n }\n\n return {\n baseUrl: req.baseUrl,\n body,\n headers: req.headers,\n method: req.method,\n query: req.query,\n url: req.url,\n };\n}\n\n//\n//\n// Export\n//\n\nexport default summarizeRequest;\n","import type { Response } from \"express\";\n\n//\n//\n// Types\n//\n\nexport interface ResponseSummary {\n statusCode: number;\n statusMessage: string;\n headers?: ReturnType<Response[\"getHeaders\"]>;\n [key: string]: unknown;\n}\n\n//\n//\n// Function Definition\n//\n\nfunction summarizeResponse(\n res: Response,\n extras?: Record<string, unknown>,\n): ResponseSummary {\n const response: ResponseSummary = {\n statusCode: res.statusCode,\n statusMessage: res.statusMessage,\n };\n if (typeof res.getHeaders === \"function\") {\n response.headers = res.getHeaders();\n }\n if (typeof extras === \"object\" && extras !== null) {\n Object.assign(response, extras);\n }\n return response;\n}\n\n//\n//\n// Export\n//\n\nexport default summarizeResponse;\n","import type { Request, Response } from \"express\";\nimport { BadRequestError, UnhandledError } from \"@jaypie/errors\";\nimport { force, getHeaderFrom, HTTP, JAYPIE, jaypieHandler } from \"@jaypie/kit\";\nimport { log as publicLogger } from \"@jaypie/logger\";\nimport { DATADOG, hasDatadogEnv, submitMetric } from \"@jaypie/datadog\";\n\nimport getCurrentInvokeUuid from \"./getCurrentInvokeUuid.adapter.js\";\nimport decorateResponse from \"./decorateResponse.helper.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\nimport summarizeResponse from \"./summarizeResponse.helper.js\";\n\n//\n//\n// Types\n//\n\n// Extended logger interface for features not in the base type definitions\ninterface ExtendedLogger {\n init: () => void;\n level: string;\n debug: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n error: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n fatal: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n info: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n trace: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n warn: {\n (...args: unknown[]): void;\n var(key: string | Record<string, unknown>, value?: unknown): void;\n };\n var(key: string | Record<string, unknown>, value?: unknown): void;\n tag(\n key: string | string[] | Record<string, unknown> | null,\n value?: string,\n ): void;\n untag(tags: string | string[] | Record<string, unknown> | null): void;\n lib(options: {\n level?: string;\n lib?: string;\n tags?: Record<string, unknown>;\n }): ExtendedLogger;\n}\n\n// Exported type aliases for defining handler lifecycle functions\nexport type JaypieHandlerSetup = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieHandlerTeardown = (\n req: Request,\n res: Response,\n) => Promise<void> | void;\n\nexport type JaypieHandlerValidate = (\n req: Request,\n res: Response,\n) => Promise<boolean> | boolean;\n\nexport type ExpressHandlerLocals = (\n req: Request,\n res: Response,\n) => Promise<unknown> | unknown;\n\nexport interface ExpressHandlerOptions {\n chaos?: string;\n locals?: Record<string, unknown | ExpressHandlerLocals>;\n name?: string;\n setup?: JaypieHandlerSetup[] | JaypieHandlerSetup;\n teardown?: JaypieHandlerTeardown[] | JaypieHandlerTeardown;\n unavailable?: boolean;\n validate?: JaypieHandlerValidate[] | JaypieHandlerValidate;\n}\n\ninterface ExtendedRequest extends Request {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ninterface ExtendedResponse extends Response {\n locals: Record<string, unknown> & {\n _jaypie?: Record<string, unknown>;\n };\n}\n\ntype ExpressHandler<T> = (\n req: Request,\n res: Response,\n ...params: unknown[]\n) => Promise<T>;\n\ninterface JaypieError extends Error {\n status?: number;\n body?: () => Record<string, unknown>;\n}\n\ninterface ResponseWithJson {\n json: () => Record<string, unknown>;\n}\n\n// Cast logger to extended interface for runtime features not in type definitions\nconst logger = publicLogger as unknown as ExtendedLogger;\n\n//\n//\n// Main\n//\n\n/* eslint-disable no-redeclare */\nfunction expressHandler<T>(\n handler: ExpressHandler<T>,\n options?: ExpressHandlerOptions,\n): ExpressHandler<T>;\nfunction expressHandler<T>(\n options: ExpressHandlerOptions,\n handler: ExpressHandler<T>,\n): ExpressHandler<T>;\nfunction expressHandler<T>(\n handlerOrOptions: ExpressHandler<T> | ExpressHandlerOptions,\n optionsOrHandler?: ExpressHandlerOptions | ExpressHandler<T>,\n): ExpressHandler<T> {\n /* eslint-enable no-redeclare */\n let handler: ExpressHandler<T>;\n let options: ExpressHandlerOptions;\n\n // If handler is an object and options is a function, swap them\n if (\n typeof handlerOrOptions === \"object\" &&\n typeof optionsOrHandler === \"function\"\n ) {\n handler = optionsOrHandler as ExpressHandler<T>;\n options = handlerOrOptions as ExpressHandlerOptions;\n } else {\n handler = handlerOrOptions as ExpressHandler<T>;\n options = (optionsOrHandler || {}) as ExpressHandlerOptions;\n }\n\n //\n //\n // Validate\n //\n let {\n chaos,\n locals,\n name,\n setup = [],\n teardown = [],\n unavailable,\n validate,\n } = options;\n if (typeof handler !== \"function\") {\n throw new BadRequestError(\n `Argument \"${handler}\" doesn't match type \"function\"`,\n );\n }\n if (\n locals !== undefined &&\n (typeof locals !== \"object\" || locals === null || Array.isArray(locals))\n ) {\n throw new BadRequestError(\n `Argument \"${locals}\" doesn't match type \"object\"`,\n );\n }\n setup = force.array(setup) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[]; // allows a single item\n teardown = force.array(teardown) as ((\n req: Request,\n res: Response,\n ) => Promise<void>)[]; // allows a single item\n\n //\n //\n // Setup\n //\n\n let jaypieFunction: ReturnType<typeof jaypieHandler>;\n\n return async (\n req: Request,\n res: Response,\n ...params: unknown[]\n ): Promise<T> => {\n // * This is the first line of code that runs when a request is received\n const extReq = req as ExtendedRequest;\n const extRes = res as ExtendedResponse;\n\n // Set default chaos value\n if (chaos === undefined) {\n chaos =\n process.env.PROJECT_CHAOS ||\n (getHeaderFrom(\n \"X-Project-Chaos\",\n req as unknown as Record<string, unknown>,\n ) as string | undefined);\n }\n\n // Re-init the logger\n logger.init();\n // Very low-level, internal sub-trace details\n const libLogger = logger.lib({\n lib: JAYPIE.LIB.EXPRESS,\n });\n // Top-level, important details that run at the same level as the main logger\n const log = logger.lib({\n level: logger.level,\n lib: JAYPIE.LIB.EXPRESS,\n });\n\n // Update the public logger with the request ID\n const invokeUuid = getCurrentInvokeUuid();\n if (invokeUuid) {\n logger.tag({ invoke: invokeUuid });\n logger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n // TODO: in theory this is redundant\n libLogger.tag({ invoke: invokeUuid });\n libLogger.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n log.tag({ invoke: invokeUuid });\n log.tag({ shortInvoke: invokeUuid.slice(0, 8) });\n }\n\n if (!name) {\n // If handler has a name, use it\n if (handler.name) {\n name = handler.name;\n } else {\n name = JAYPIE.UNKNOWN;\n }\n }\n logger.tag({ handler: name });\n // TODO: in theory this is redundant\n libLogger.tag({ handler: name });\n log.tag({ handler: name });\n\n libLogger.trace(\"[jaypie] Express init\");\n\n // Set req.locals if it doesn't exist\n if (!extReq.locals) extReq.locals = {};\n if (!extReq.locals._jaypie) extReq.locals._jaypie = {};\n\n // Set res.locals if it doesn't exist\n if (!extRes.locals) extRes.locals = {};\n if (!extRes.locals._jaypie) extRes.locals._jaypie = {};\n\n const originalRes = {\n attemptedCall: undefined as ((...args: unknown[]) => unknown) | undefined,\n attemptedParams: undefined as unknown[] | undefined,\n end: res.end.bind(res) as typeof res.end,\n json: res.json.bind(res) as typeof res.json,\n send: res.send.bind(res) as typeof res.send,\n status: res.status.bind(res) as typeof res.status,\n statusSent: false as boolean | number,\n };\n\n res.end = ((...endParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.end as unknown as (\n ...args: unknown[]\n ) => unknown;\n originalRes.attemptedParams = endParams;\n log.warn(\n \"[jaypie] Illegal call to res.end(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.end;\n\n res.json = ((...jsonParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.json;\n originalRes.attemptedParams = jsonParams;\n log.warn(\n \"[jaypie] Illegal call to res.json(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.json;\n\n res.send = ((...sendParams: unknown[]) => {\n originalRes.attemptedCall = originalRes.send;\n originalRes.attemptedParams = sendParams;\n log.warn(\n \"[jaypie] Illegal call to res.send(); prefer Jaypie response conventions\",\n );\n return res;\n }) as typeof res.send;\n\n res.status = ((...statusParams: [number]) => {\n originalRes.statusSent = statusParams[0];\n return originalRes.status(...statusParams);\n }) as typeof res.status;\n\n //\n //\n // Preprocess\n //\n\n if (locals) {\n // Locals\n const keys = Object.keys(locals);\n if (keys.length > 0) {\n const localsSetup = async (localsReq: Request, localsRes: Response) => {\n const extLocalsReq = localsReq as ExtendedRequest;\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n libLogger.trace(`[jaypie] Locals: ${key}`);\n const localValue = locals[key];\n if (typeof localValue === \"function\") {\n extLocalsReq.locals[key] = await localValue(localsReq, localsRes);\n } else {\n extLocalsReq.locals[key] = localValue;\n }\n }\n };\n setup.push(localsSetup);\n }\n }\n\n let response: T | Record<string, unknown> | undefined;\n let status: number = HTTP.CODE.OK;\n\n try {\n log.info.var({ req: summarizeRequest(req) });\n\n // Initialize after logging is set up\n\n jaypieFunction = jaypieHandler(\n handler as unknown as (...args: unknown[]) => Promise<unknown>,\n {\n chaos,\n name,\n setup,\n teardown,\n unavailable,\n validate,\n } as any,\n );\n\n libLogger.trace(\"[jaypie] Express execution\");\n\n //\n //\n // Process\n //\n\n response = (await jaypieFunction(req, res, ...params)) as\n | T\n | Record<string, unknown>\n | undefined;\n\n //\n //\n // Error Handling\n //\n } catch (error) {\n // In theory jaypieFunction has handled all errors\n const jaypieError = error as JaypieError;\n if (jaypieError.status) {\n status = jaypieError.status;\n }\n if (typeof jaypieError.body === \"function\") {\n response = jaypieError.body();\n } else {\n // This should never happen\n const unhandledError = new UnhandledError();\n response = unhandledError.body() as unknown as Record<string, unknown>;\n status = unhandledError.status;\n }\n }\n\n //\n //\n // Postprocess\n //\n\n // Restore original res functions\n res.end = originalRes.end;\n res.json = originalRes.json;\n res.send = originalRes.send;\n res.status = originalRes.status;\n\n // Decorate response\n decorateResponse(res, { handler: name });\n\n // Allow the sent status to override the status in the response\n if (originalRes.statusSent) {\n status = originalRes.statusSent as number;\n }\n\n // Send response\n try {\n if (!originalRes.attemptedCall) {\n // Body\n if (response) {\n if (typeof response === \"object\") {\n if (\n typeof (response as unknown as ResponseWithJson).json ===\n \"function\"\n ) {\n res.json((response as unknown as ResponseWithJson).json());\n } else {\n res.status(status).json(response);\n }\n } else if (typeof response === \"string\") {\n try {\n res.status(status).json(JSON.parse(response));\n } catch {\n res.status(status).send(response);\n }\n } else if (response === true) {\n res.status(HTTP.CODE.CREATED).send();\n } else {\n res.status(status).send(response as unknown as string);\n }\n } else {\n // No response\n res.status(HTTP.CODE.NO_CONTENT).send();\n }\n } else {\n // Resolve illegal call to res.end(), res.json(), or res.send()\n log.debug(\"[jaypie] Resolving illegal call to res\");\n log.var({\n attemptedCall: {\n name: originalRes.attemptedCall.name,\n params: originalRes.attemptedParams,\n },\n });\n // Call the original function with the original parameters and the original `this` (res)\n (originalRes.attemptedCall as (...args: unknown[]) => unknown).call(\n res,\n ...(originalRes.attemptedParams || []),\n );\n }\n } catch (error) {\n log.fatal(\"Express encountered an error while sending the response\");\n log.var({ responseError: error });\n }\n\n // Log response\n const extras: Record<string, unknown> = {};\n if (response) extras.body = response;\n log.info.var({\n res: summarizeResponse(res, extras),\n });\n\n // Submit metric if Datadog is configured\n if (hasDatadogEnv()) {\n // Construct path from baseUrl and url\n let path = (req.baseUrl || \"\") + (req.url || \"\");\n // Ensure path starts with /\n if (!path.startsWith(\"/\")) {\n path = \"/\" + path;\n }\n // Remove trailing slash unless it's the root path\n if (path.length > 1 && path.endsWith(\"/\")) {\n path = path.slice(0, -1);\n }\n\n // Replace UUIDs with :id for better aggregation\n // Matches standard UUID v4 format (8-4-4-4-12 hex characters)\n path = path.replace(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n \":id\",\n );\n\n // Determine metric name based on environment variables\n let metricPrefix = \"project\";\n if (process.env.PROJECT_SPONSOR) {\n metricPrefix = process.env.PROJECT_SPONSOR;\n } else if (process.env.PROJECT_KEY) {\n metricPrefix = `project.${process.env.PROJECT_KEY}`;\n }\n\n await submitMetric({\n name: `${metricPrefix}.api.response`,\n type: DATADOG.METRIC.TYPE.COUNT,\n value: 1,\n tags: {\n status: String(res.statusCode),\n path,\n },\n });\n }\n\n // Clean up the public logger\n logger.untag(\"handler\");\n\n //\n //\n // Return\n //\n\n return response as T;\n };\n}\n\n//\n//\n// Export\n//\n\nexport default expressHandler;\n","import type { Request, Response } from \"express\";\nimport {\n BadGatewayError,\n BadRequestError,\n ForbiddenError,\n GatewayTimeoutError,\n GoneError,\n InternalError,\n MethodNotAllowedError,\n NotFoundError,\n TeapotError,\n UnauthorizedError,\n UnavailableError,\n} from \"@jaypie/errors\";\nimport { HTTP } from \"@jaypie/kit\";\nimport { log } from \"@jaypie/logger\";\n\nimport expressHandler, { ExpressHandlerOptions } from \"./expressHandler.js\";\n\n//\n//\n// Types\n//\n\ntype ErrorConstructor = new () => Error;\n\n//\n//\n// Main\n//\n\nconst httpHandler = (\n statusCode: number = HTTP.CODE.OK,\n context: ExpressHandlerOptions = {},\n): ((\n req: Request,\n res: Response,\n) => Promise<Record<string, unknown> | null>) => {\n // Give a default name if there isn't one\n if (!context.name) {\n context.name = \"_http\";\n }\n\n // Return a function that will be used as an express route\n return expressHandler(\n async (\n req: Request,\n res: Response,\n ): Promise<Record<string, unknown> | null> => {\n // Map the most throwable status codes to errors and throw them!\n const error: Record<number, ErrorConstructor> = {\n [HTTP.CODE.BAD_REQUEST]: BadRequestError,\n [HTTP.CODE.UNAUTHORIZED]: UnauthorizedError,\n [HTTP.CODE.FORBIDDEN]: ForbiddenError,\n [HTTP.CODE.NOT_FOUND]: NotFoundError,\n [HTTP.CODE.METHOD_NOT_ALLOWED]: MethodNotAllowedError,\n [HTTP.CODE.GONE]: GoneError,\n [HTTP.CODE.TEAPOT]: TeapotError,\n [HTTP.CODE.INTERNAL_ERROR]: InternalError,\n [HTTP.CODE.BAD_GATEWAY]: BadGatewayError,\n [HTTP.CODE.UNAVAILABLE]: UnavailableError,\n [HTTP.CODE.GATEWAY_TIMEOUT]: GatewayTimeoutError,\n };\n\n // If this maps to an error, throw it\n if (error[statusCode]) {\n log.trace(\n `@knowdev/express: gracefully throwing ${statusCode} up to projectHandler`,\n );\n throw new error[statusCode]();\n }\n\n // If this is an error and we didn't get thrown, log a warning\n if (statusCode >= 400) {\n log.warn(\n `@knowdev/express: status code ${statusCode} not mapped as throwable`,\n );\n }\n\n // Send the response\n res.status(statusCode);\n return statusCode === HTTP.CODE.NO_CONTENT ? null : {};\n },\n context,\n );\n};\n\n//\n//\n// Export\n//\n\nexport default httpHandler;\n","import type { Request, Response } from \"express\";\nimport { BadRequestError } from \"@jaypie/errors\";\n\nimport expressHandler, { ExpressHandlerOptions } from \"./expressHandler.js\";\nimport summarizeRequest from \"./summarizeRequest.helper.js\";\n\n//\n//\n// Types\n//\n\nexport interface EchoResponse {\n req: ReturnType<typeof summarizeRequest>;\n}\n\n//\n//\n// Main\n//\n\nconst echoHandler = (\n context: ExpressHandlerOptions = {},\n): ((req: Request, res: Response) => Promise<EchoResponse>) => {\n if (\n typeof context !== \"object\" ||\n context === null ||\n Array.isArray(context)\n ) {\n throw new BadRequestError(\n `Argument \"${context}\" doesn't match type \"object\"`,\n );\n }\n // Give a default name if there isn't one\n if (!context.name) {\n context.name = \"_echo\";\n }\n\n // Return a function that will be used as an express route\n return expressHandler(async (req: Request): Promise<EchoResponse> => {\n return {\n req: summarizeRequest(req),\n };\n }, context);\n};\n\n//\n//\n// Export\n//\n\nexport default echoHandler;\n","import { NotImplementedError } from \"@jaypie/errors\";\nimport { HTTP } from \"@jaypie/kit\";\n\nimport expressHandler from \"./expressHandler.js\";\nimport httpHandler from \"./http.handler.js\";\nimport echoHandler from \"./echo.handler.js\";\n\n//\n//\n// Functions\n//\n\nconst routes = {\n badRequestRoute: httpHandler(HTTP.CODE.BAD_REQUEST, { name: \"_badRequest\" }),\n echoRoute: echoHandler(),\n forbiddenRoute: httpHandler(HTTP.CODE.FORBIDDEN, { name: \"_forbidden\" }),\n goneRoute: httpHandler(HTTP.CODE.GONE, { name: \"_gone\" }),\n methodNotAllowedRoute: httpHandler(HTTP.CODE.METHOD_NOT_ALLOWED, {\n name: \"_methodNotAllowed\",\n }),\n noContentRoute: httpHandler(HTTP.CODE.NO_CONTENT, { name: \"_noContent\" }),\n notFoundRoute: httpHandler(HTTP.CODE.NOT_FOUND, { name: \"_notFound\" }),\n notImplementedRoute: expressHandler(\n (): never => {\n throw new NotImplementedError();\n },\n { name: \"_notImplemented\" },\n ),\n};\n\n//\n//\n// Export\n//\n\nexport const badRequestRoute = routes.badRequestRoute;\nexport const echoRoute = routes.echoRoute;\nexport const forbiddenRoute = routes.forbiddenRoute;\nexport const goneRoute = routes.goneRoute;\nexport const methodNotAllowedRoute = routes.methodNotAllowedRoute;\nexport const noContentRoute = routes.noContentRoute;\nexport const notFoundRoute = routes.notFoundRoute;\nexport const notImplementedRoute = routes.notImplementedRoute;\n"],"names":["log","publicLogger"],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@jaypie/express",
3
- "version": "1.1.18",
3
+ "version": "1.2.0-rc.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/finlaysonstudio/jaypie"
7
7
  },
8
8
  "license": "MIT",
9
9
  "author": "Finlayson Studio",
10
+ "sideEffects": false,
10
11
  "type": "module",
11
12
  "exports": {
12
13
  ".": {
@@ -44,9 +45,8 @@
44
45
  },
45
46
  "dependencies": {
46
47
  "@codegenie/serverless-express": "^4.15.0",
47
- "@jaypie/core": "^1.1.14",
48
- "@jaypie/datadog": "^1.1.8",
49
- "@jaypie/errors": "^1.1.6",
48
+ "@jaypie/datadog": "1.2.0-rc.1",
49
+ "@jaypie/errors": "1.2.0-rc.1",
50
50
  "cors": "^2.8.5"
51
51
  },
52
52
  "devDependencies": {
@@ -59,6 +59,5 @@
59
59
  },
60
60
  "publishConfig": {
61
61
  "access": "public"
62
- },
63
- "gitHead": "45fe048c6687a807ed52bbc0b25963f45450f9c9"
62
+ }
64
63
  }