@saasquatch/express-boilerplate 1.1.2-0 → 1.1.2-2

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,2 +1,2 @@
1
- import { Request, Response } from "express";
1
+ import type { Request, Response } from "express";
2
2
  export declare function asyncHandlerWrapper<T>(handler: (req: Request, res: Response) => Promise<T>, renderErrorPage?: (status: number, message: string, debugId: string) => Promise<string>): (req: Request, res: Response) => void;
@@ -1,18 +1,18 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.asyncHandlerWrapper = void 0;
4
- const error_1 = require("./error");
5
- const nanoid_1 = require("./nanoid");
6
- function asyncHandlerWrapper(handler, renderErrorPage) {
1
+ import { Logger } from "winston";
2
+ import { formatGenericError } from "./error.js";
3
+ import { nanoid } from "./nanoid.js";
4
+ export function asyncHandlerWrapper(handler, renderErrorPage) {
7
5
  return (req, res) => {
8
6
  handler(req, res).catch((e) => {
9
- var _a;
10
- const logger = res.locals.logger;
11
- const requestId = res.locals.requestId;
12
- const debugId = (0, nanoid_1.nanoid)(8);
13
- const error = Object.assign({ debugId,
14
- requestId }, (0, error_1.formatGenericError)(e));
15
- logger === null || logger === void 0 ? void 0 : logger.error({ message: "Fatal error occurred!!", error });
7
+ const logger = res.locals["logger"];
8
+ const requestId = res.locals["requestId"];
9
+ const debugId = nanoid(8);
10
+ const error = {
11
+ debugId,
12
+ requestId,
13
+ ...formatGenericError(e),
14
+ };
15
+ logger?.error({ message: "Fatal error occurred!!", error });
16
16
  const status = 500;
17
17
  const message = e instanceof Error ? e.message : "An internal error occurred";
18
18
  // cannot send any response if the headers have already been sent
@@ -21,28 +21,30 @@ function asyncHandlerWrapper(handler, renderErrorPage) {
21
21
  }
22
22
  // if the client accepts HTML and the error page render function was
23
23
  // provided, we will render the error page and return the HTML
24
- if (((_a = req.header("accept")) !== null && _a !== void 0 ? _a : "").includes("text/html") &&
24
+ if ((req.header("accept") ?? "").includes("text/html") &&
25
25
  renderErrorPage) {
26
26
  renderErrorPage(status, message, debugId)
27
27
  .then((html) => {
28
28
  res.status(status).contentType("text/html;charset=utf8").send(html);
29
29
  })
30
30
  .catch((e) => {
31
- logger === null || logger === void 0 ? void 0 : logger.error(Object.assign({ message: "Error occurred while rendering error page!" }, (0, error_1.formatGenericError)(e)));
31
+ logger?.error({
32
+ message: "Error occurred while rendering error page!",
33
+ ...formatGenericError(e),
34
+ });
32
35
  res
33
36
  .status(status)
34
37
  .contentType("application/json")
35
- .send(JSON.stringify(Object.assign({ message }, error), null, 2));
38
+ .send(JSON.stringify({ message, ...error }, null, 2));
36
39
  });
37
40
  }
38
41
  else {
39
42
  res
40
43
  .status(status)
41
44
  .contentType("application/json")
42
- .send(JSON.stringify(Object.assign({ message }, error), null, 2));
45
+ .send(JSON.stringify({ message, ...error }, null, 2));
43
46
  }
44
47
  });
45
48
  };
46
49
  }
47
- exports.asyncHandlerWrapper = asyncHandlerWrapper;
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtd3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hc3luYy13cmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLG1DQUE2QztBQUM3QyxxQ0FBa0M7QUFFbEMsU0FBZ0IsbUJBQW1CLENBQ2pDLE9BQW9ELEVBQ3BELGVBSW9CO0lBRXBCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDbEIsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTs7WUFDNUIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUE0QixDQUFDO1lBQ3ZELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBK0IsQ0FBQztZQUU3RCxNQUFNLE9BQU8sR0FBRyxJQUFBLGVBQU0sRUFBQyxDQUFDLENBQUMsQ0FBQztZQUUxQixNQUFNLEtBQUssbUJBQ1QsT0FBTztnQkFDUCxTQUFTLElBQ04sSUFBQSwwQkFBa0IsRUFBQyxDQUFDLENBQUMsQ0FDekIsQ0FBQztZQUVGLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUU1RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUM7WUFDbkIsTUFBTSxPQUFPLEdBQ1gsQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUM7WUFFaEUsaUVBQWlFO1lBQ2pFLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNwQixPQUFPO1lBQ1QsQ0FBQztZQUVELG9FQUFvRTtZQUNwRSw4REFBOEQ7WUFDOUQsSUFDRSxDQUFDLE1BQUEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUNBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztnQkFDbEQsZUFBZSxFQUNmLENBQUM7Z0JBQ0QsZUFBZSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO3FCQUN0QyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDYixHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEUsQ0FBQyxDQUFDO3FCQUNELEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNYLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLGlCQUNYLE9BQU8sRUFBRSw0Q0FBNEMsSUFDbEQsSUFBQSwwQkFBa0IsRUFBQyxDQUFDLENBQUMsRUFDeEIsQ0FBQztvQkFFSCxHQUFHO3lCQUNBLE1BQU0sQ0FBQyxNQUFNLENBQUM7eUJBQ2QsV0FBVyxDQUFDLGtCQUFrQixDQUFDO3lCQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsaUJBQUcsT0FBTyxJQUFLLEtBQUssR0FBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUQsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sR0FBRztxQkFDQSxNQUFNLENBQUMsTUFBTSxDQUFDO3FCQUNkLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQztxQkFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLGlCQUFHLE9BQU8sSUFBSyxLQUFLLEdBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQTdERCxrREE2REMifQ==
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtd3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hc3luYy13cmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFckMsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxPQUFvRCxFQUNwRCxlQUlvQjtJQUVwQixPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ2xCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBVSxFQUFFLEVBQUU7WUFDckMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQXVCLENBQUM7WUFDMUQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQXVCLENBQUM7WUFFaEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTFCLE1BQU0sS0FBSyxHQUFHO2dCQUNaLE9BQU87Z0JBQ1AsU0FBUztnQkFDVCxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQzthQUN6QixDQUFDO1lBRUYsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBRTVELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNuQixNQUFNLE9BQU8sR0FDWCxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQztZQUVoRSxpRUFBaUU7WUFDakUsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3BCLE9BQU87WUFDVCxDQUFDO1lBRUQsb0VBQW9FO1lBQ3BFLDhEQUE4RDtZQUM5RCxJQUNFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO2dCQUNsRCxlQUFlLEVBQ2YsQ0FBQztnQkFDRCxlQUFlLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7cUJBQ3RDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUNiLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLHdCQUF3QixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0RSxDQUFDLENBQUM7cUJBQ0QsS0FBSyxDQUFDLENBQUMsQ0FBVSxFQUFFLEVBQUU7b0JBQ3BCLE1BQU0sRUFBRSxLQUFLLENBQUM7d0JBQ1osT0FBTyxFQUFFLDRDQUE0Qzt3QkFDckQsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7cUJBQ3pCLENBQUMsQ0FBQztvQkFFSCxHQUFHO3lCQUNBLE1BQU0sQ0FBQyxNQUFNLENBQUM7eUJBQ2QsV0FBVyxDQUFDLGtCQUFrQixDQUFDO3lCQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7aUJBQU0sQ0FBQztnQkFDTixHQUFHO3FCQUNBLE1BQU0sQ0FBQyxNQUFNLENBQUM7cUJBQ2QsV0FBVyxDQUFDLGtCQUFrQixDQUFDO3FCQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNKLENBQUMifQ==
package/dist/error.js CHANGED
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.formatGenericError = void 0;
4
- function formatGenericError(e) {
1
+ export function formatGenericError(e) {
5
2
  return {
6
3
  e,
7
4
  // we don't care that the value of e might be weird in the string template, the
@@ -11,5 +8,4 @@ function formatGenericError(e) {
11
8
  eJson: JSON.stringify(e),
12
9
  };
13
10
  }
14
- exports.formatGenericError = formatGenericError;
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBTUEsU0FBZ0Isa0JBQWtCLENBQUMsQ0FBVTtJQUMzQyxPQUFPO1FBQ0wsQ0FBQztRQUNELCtFQUErRTtRQUMvRSxvRUFBb0U7UUFDcEUsK0VBQStFO1FBQy9FLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRTtRQUNaLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztLQUN6QixDQUFDO0FBQ0osQ0FBQztBQVRELGdEQVNDIn0=
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsTUFBTSxVQUFVLGtCQUFrQixDQUFDLENBQVU7SUFDM0MsT0FBTztRQUNMLENBQUM7UUFDRCwrRUFBK0U7UUFDL0Usb0VBQW9FO1FBQ3BFLCtFQUErRTtRQUMvRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUU7UUFDWixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7S0FDekIsQ0FBQztBQUNKLENBQUMifQ==
@@ -1,4 +1,4 @@
1
- import { Application, Request, Response } from "express";
1
+ import type { Application, Request, Response } from "express";
2
2
  import { Logger } from "winston";
3
3
  export type HealthCheckResult<T, E> = {
4
4
  status: "OK";
@@ -1,18 +1,16 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.healthCheck = void 0;
4
- const shutdown_1 = require("./shutdown");
5
- const error_1 = require("./error");
1
+ import { Logger } from "winston";
2
+ import { formatGenericError } from "./error.js";
3
+ import { TERMINATION_APP_LOCAL_KEY } from "./shutdown.js";
6
4
  /**
7
5
  * Return a request handler that can be used in Express
8
6
  * to respond to health checks in the application. The
9
7
  * health check will return HTTP code 503 if the app
10
8
  * is in a TERMINATING state.
11
9
  */
12
- function healthCheck(app, logger, customCheck) {
10
+ export function healthCheck(app, logger, customCheck) {
13
11
  return (_req, res) => {
14
12
  // eslint-disable-next-line -- @typescript-eslint/no-unsafe-assignment
15
- const terminating = app.locals[shutdown_1.TERMINATION_APP_LOCAL_KEY];
13
+ const terminating = app.locals[TERMINATION_APP_LOCAL_KEY];
16
14
  if (typeof terminating === "boolean" && terminating) {
17
15
  logger.info("App is in TERMINATING state, sending health check failure");
18
16
  return res.status(503).json({ status: "TERMINATING" });
@@ -25,8 +23,11 @@ function healthCheck(app, logger, customCheck) {
25
23
  })
26
24
  .catch((e) => {
27
25
  const code = 503;
28
- const error = (0, error_1.formatGenericError)(e);
29
- logger.error(Object.assign({ message: "Custom health check callback failed" }, error));
26
+ const error = formatGenericError(e);
27
+ logger.error({
28
+ message: "Custom health check callback failed",
29
+ ...error,
30
+ });
30
31
  res.status(code).json({ status: "ERROR", error });
31
32
  });
32
33
  return;
@@ -36,5 +37,4 @@ function healthCheck(app, logger, customCheck) {
36
37
  }
37
38
  };
38
39
  }
39
- exports.healthCheck = healthCheck;
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoY2hlY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaGVhbHRoY2hlY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEseUNBQXVEO0FBQ3ZELG1DQUE2QztBQVk3Qzs7Ozs7R0FLRztBQUNILFNBQWdCLFdBQVcsQ0FDekIsR0FBZ0IsRUFDaEIsTUFBYyxFQUNkLFdBQW9EO0lBRXBELE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDbkIsc0VBQXNFO1FBQ3RFLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsb0NBQXlCLENBQUMsQ0FBQztRQUMxRCxJQUFJLE9BQU8sV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNwRCxNQUFNLENBQUMsSUFBSSxDQUFDLDJEQUEyRCxDQUFDLENBQUM7WUFDekUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLFdBQVcsRUFBRTtpQkFDVixJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDZixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ2hELEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDWCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUM7Z0JBQ2pCLE1BQU0sS0FBSyxHQUFHLElBQUEsMEJBQWtCLEVBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRXBDLE1BQU0sQ0FBQyxLQUFLLGlCQUNWLE9BQU8sRUFBRSxxQ0FBcUMsSUFDM0MsS0FBSyxFQUNSLENBQUM7Z0JBRUgsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDcEQsQ0FBQyxDQUFDLENBQUM7WUFDTCxPQUFPO1FBQ1QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEQsQ0FBQztJQUNILENBQUMsQ0FBQztBQUNKLENBQUM7QUFuQ0Qsa0NBbUNDIn0=
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoY2hlY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaGVhbHRoY2hlY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBWTFEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FDekIsR0FBZ0IsRUFDaEIsTUFBYyxFQUNkLFdBQW9EO0lBRXBELE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDbkIsc0VBQXNFO1FBQ3RFLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUMxRCxJQUFJLE9BQU8sV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNwRCxNQUFNLENBQUMsSUFBSSxDQUFDLDJEQUEyRCxDQUFDLENBQUM7WUFDekUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLFdBQVcsRUFBRTtpQkFDVixJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDZixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ2hELEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsQ0FBQyxDQUFVLEVBQUUsRUFBRTtnQkFDcEIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDO2dCQUNqQixNQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFcEMsTUFBTSxDQUFDLEtBQUssQ0FBQztvQkFDWCxPQUFPLEVBQUUscUNBQXFDO29CQUM5QyxHQUFHLEtBQUs7aUJBQ1QsQ0FBQyxDQUFDO2dCQUVILEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELENBQUMsQ0FBQyxDQUFDO1lBQ0wsT0FBTztRQUNULENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDLENBQUM7QUFDSixDQUFDIn0=
package/dist/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
- import { asyncHandlerWrapper } from "./async-wrapper";
2
- import type { GenericError } from "./error";
3
- import { formatGenericError } from "./error";
4
- import type { HealthCheckResult } from "./healthcheck";
5
- import { healthCheck } from "./healthcheck";
6
- import { requestIdAndLogger } from "./middleware";
7
- import { nanoid } from "./nanoid";
8
- import type { ShutdownManagerConfig } from "./shutdown";
9
- import { installShutdownManager, shutdownManagerConfigFromEnv } from "./shutdown";
1
+ import { asyncHandlerWrapper } from "./async-wrapper.ts";
2
+ import type { GenericError } from "./error.ts";
3
+ import { formatGenericError } from "./error.ts";
4
+ import type { HealthCheckResult } from "./healthcheck.ts";
5
+ import { healthCheck } from "./healthcheck.ts";
6
+ import { requestIdAndLogger } from "./middleware.ts";
7
+ import { nanoid } from "./nanoid.ts";
8
+ import type { ShutdownManagerConfig } from "./shutdown.ts";
9
+ import { installShutdownManager, shutdownManagerConfigFromEnv } from "./shutdown.ts";
10
10
  export { asyncHandlerWrapper, formatGenericError, healthCheck, installShutdownManager, nanoid, requestIdAndLogger, shutdownManagerConfigFromEnv, };
11
11
  export type { GenericError, HealthCheckResult, ShutdownManagerConfig };
package/dist/index.js CHANGED
@@ -1,17 +1,8 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.shutdownManagerConfigFromEnv = exports.requestIdAndLogger = exports.nanoid = exports.installShutdownManager = exports.healthCheck = exports.formatGenericError = exports.asyncHandlerWrapper = void 0;
4
- const async_wrapper_1 = require("./async-wrapper");
5
- Object.defineProperty(exports, "asyncHandlerWrapper", { enumerable: true, get: function () { return async_wrapper_1.asyncHandlerWrapper; } });
6
- const error_1 = require("./error");
7
- Object.defineProperty(exports, "formatGenericError", { enumerable: true, get: function () { return error_1.formatGenericError; } });
8
- const healthcheck_1 = require("./healthcheck");
9
- Object.defineProperty(exports, "healthCheck", { enumerable: true, get: function () { return healthcheck_1.healthCheck; } });
10
- const middleware_1 = require("./middleware");
11
- Object.defineProperty(exports, "requestIdAndLogger", { enumerable: true, get: function () { return middleware_1.requestIdAndLogger; } });
12
- const nanoid_1 = require("./nanoid");
13
- Object.defineProperty(exports, "nanoid", { enumerable: true, get: function () { return nanoid_1.nanoid; } });
14
- const shutdown_1 = require("./shutdown");
15
- Object.defineProperty(exports, "installShutdownManager", { enumerable: true, get: function () { return shutdown_1.installShutdownManager; } });
16
- Object.defineProperty(exports, "shutdownManagerConfigFromEnv", { enumerable: true, get: function () { return shutdown_1.shutdownManagerConfigFromEnv; } });
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQXNEO0FBY3BELG9HQWRPLG1DQUFtQixPQWNQO0FBWnJCLG1DQUE2QztBQWEzQyxtR0FiTywwQkFBa0IsT0FhUDtBQVhwQiwrQ0FBNEM7QUFZMUMsNEZBWk8seUJBQVcsT0FZUDtBQVhiLDZDQUFrRDtBQWNoRCxtR0FkTywrQkFBa0IsT0FjUDtBQWJwQixxQ0FBa0M7QUFZaEMsdUZBWk8sZUFBTSxPQVlQO0FBVlIseUNBR29CO0FBTWxCLHVHQVJBLGlDQUFzQixPQVFBO0FBR3RCLDZHQVZBLHVDQUE0QixPQVVBIn0=
1
+ import { asyncHandlerWrapper } from "./async-wrapper.js";
2
+ import { formatGenericError } from "./error.js";
3
+ import { healthCheck } from "./healthcheck.js";
4
+ import { requestIdAndLogger } from "./middleware.js";
5
+ import { nanoid } from "./nanoid.js";
6
+ import { installShutdownManager, shutdownManagerConfigFromEnv, } from "./shutdown.js";
7
+ export { asyncHandlerWrapper, formatGenericError, healthCheck, installShutdownManager, nanoid, requestIdAndLogger, shutdownManagerConfigFromEnv, };
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWhELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXJDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsNEJBQTRCLEdBQzdCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxzQkFBc0IsRUFDdEIsTUFBTSxFQUNOLGtCQUFrQixFQUNsQiw0QkFBNEIsR0FDN0IsQ0FBQyJ9
@@ -1,4 +1,4 @@
1
- import { NextFunction, Request, Response } from "express";
1
+ import type { NextFunction, Request, Response } from "express";
2
2
  import { Logger } from "winston";
3
3
  /**
4
4
  * Generate a requestId and derived child logger
@@ -1,22 +1,19 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.requestIdAndLogger = void 0;
4
- const nanoid_1 = require("./nanoid");
1
+ import { Logger } from "winston";
2
+ import { nanoid } from "./nanoid.js";
5
3
  /**
6
4
  * Generate a requestId and derived child logger
7
5
  * for each request
8
6
  */
9
- function requestIdAndLogger(baseLogger) {
7
+ export function requestIdAndLogger(baseLogger) {
10
8
  return (_req, res, next) => {
11
- if (typeof res.locals.requestId !== "string") {
9
+ if (typeof res.locals["requestId"] !== "string") {
12
10
  // the requestId really doesn't need to be longer than 12 characters,
13
11
  // it's only used for debugging
14
- const requestId = (0, nanoid_1.nanoid)(12);
15
- res.locals.requestId = requestId;
16
- res.locals.logger = baseLogger.child({ requestId });
12
+ const requestId = nanoid(12);
13
+ res.locals["requestId"] = requestId;
14
+ res.locals["logger"] = baseLogger.child({ requestId });
17
15
  }
18
16
  next();
19
17
  };
20
18
  }
21
- exports.requestIdAndLogger = requestIdAndLogger;
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9taWRkbGV3YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHFDQUFrQztBQUVsQzs7O0dBR0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FDaEMsVUFBa0I7SUFFbEIsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDekIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzdDLHFFQUFxRTtZQUNyRSwrQkFBK0I7WUFDL0IsTUFBTSxTQUFTLEdBQUcsSUFBQSxlQUFNLEVBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQ2pDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxJQUFJLEVBQUUsQ0FBQztJQUNULENBQUMsQ0FBQztBQUNKLENBQUM7QUFiRCxnREFhQyJ9
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9taWRkbGV3YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVyQzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLFVBQWtCO0lBRWxCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ3pCLElBQUksT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2hELHFFQUFxRTtZQUNyRSwrQkFBK0I7WUFDL0IsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsU0FBUyxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUNELElBQUksRUFBRSxDQUFDO0lBQ1QsQ0FBQyxDQUFDO0FBQ0osQ0FBQyJ9
package/dist/nanoid.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const nanoid: (size?: number | undefined) => string;
1
+ export declare const nanoid: (size?: number) => string;
package/dist/nanoid.js CHANGED
@@ -1,8 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.nanoid = void 0;
4
- const nanoid_1 = require("nanoid");
1
+ import { customAlphabet } from "nanoid";
5
2
  const alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
6
3
  // security: nanoid uses cyrpto random bytes by default
7
- exports.nanoid = (0, nanoid_1.customAlphabet)(alphabet, 32);
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFub2lkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25hbm9pZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBd0M7QUFDeEMsTUFBTSxRQUFRLEdBQ1osZ0VBQWdFLENBQUM7QUFFbkUsdURBQXVEO0FBQzFDLFFBQUEsTUFBTSxHQUFHLElBQUEsdUJBQWMsRUFBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMifQ==
4
+ export const nanoid = customAlphabet(alphabet, 32);
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFub2lkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25hbm9pZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3hDLE1BQU0sUUFBUSxHQUNaLGdFQUFnRSxDQUFDO0FBRW5FLHVEQUF1RDtBQUN2RCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyJ9
@@ -1,5 +1,4 @@
1
- /// <reference types="node" />
2
- import { Application } from "express";
1
+ import type { Application } from "express";
3
2
  import { Server } from "http";
4
3
  import { Logger } from "winston";
5
4
  export declare const TERMINATION_APP_LOCAL_KEY = "__ssqt_terminating";
package/dist/shutdown.js CHANGED
@@ -1,17 +1,17 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.installShutdownManager = exports.shutdownManagerConfigFromEnv = exports.INSTALLATION_APP_LOCAL_KEY = exports.TERMINATION_APP_LOCAL_KEY = void 0;
4
- const http_1 = require("http");
5
- const error_1 = require("./error");
1
+ import { Server, createServer } from "http";
2
+ import { Logger } from "winston";
3
+ import { formatGenericError } from "./error.js";
6
4
  const handleHookError = (hook, logger) => (err) => {
7
- logger.error(Object.assign({ message: `Error ocurred inside shutdown-manager ${hook} hook` }, (0, error_1.formatGenericError)(err)));
5
+ logger.error({
6
+ message: `Error ocurred inside shutdown-manager ${hook} hook`,
7
+ ...formatGenericError(err),
8
+ });
8
9
  };
9
10
  // these should be kept opaque to consumers of the library. manipulating
10
11
  // these variables outside the library can result in unwanted behavior.
11
- exports.TERMINATION_APP_LOCAL_KEY = "__ssqt_terminating";
12
- exports.INSTALLATION_APP_LOCAL_KEY = "__ssqt_shutdown_manager_installed";
13
- function shutdownManagerConfigFromEnv(defaults) {
14
- var _a, _b;
12
+ export const TERMINATION_APP_LOCAL_KEY = "__ssqt_terminating";
13
+ export const INSTALLATION_APP_LOCAL_KEY = "__ssqt_shutdown_manager_installed";
14
+ export function shutdownManagerConfigFromEnv(defaults) {
15
15
  const optionalInt = (key, defaultVal) => {
16
16
  const env = process.env[key];
17
17
  if (!env) {
@@ -23,40 +23,39 @@ function shutdownManagerConfigFromEnv(defaults) {
23
23
  }
24
24
  return parsedEnv;
25
25
  };
26
- const keepAliveTimeoutSeconds = optionalInt("SSQT_HTTP_KEEP_ALIVE_SECONDS", (_a = defaults === null || defaults === void 0 ? void 0 : defaults.keepAliveTimeoutSeconds) !== null && _a !== void 0 ? _a : 60);
27
- const terminationDelaySeconds = optionalInt("SSQT_TERMINATION_DELAY_SECONDS", (_b = defaults === null || defaults === void 0 ? void 0 : defaults.terminationDelaySeconds) !== null && _b !== void 0 ? _b : 0);
26
+ const keepAliveTimeoutSeconds = optionalInt("SSQT_HTTP_KEEP_ALIVE_SECONDS", defaults?.keepAliveTimeoutSeconds ?? 60);
27
+ const terminationDelaySeconds = optionalInt("SSQT_TERMINATION_DELAY_SECONDS", defaults?.terminationDelaySeconds ?? 0);
28
28
  return {
29
29
  keepAliveTimeoutSeconds,
30
30
  terminationDelaySeconds,
31
31
  };
32
32
  }
33
- exports.shutdownManagerConfigFromEnv = shutdownManagerConfigFromEnv;
34
33
  /**
35
34
  * Install the signal handlers and graceful shutdown logic
36
35
  * into the application.
37
36
  */
38
- function installShutdownManager(app, logger, config) {
37
+ export function installShutdownManager(app, logger, config) {
39
38
  app.disable("x-powered-by");
40
- const server = (0, http_1.createServer)(app);
39
+ const server = createServer(app);
41
40
  // eslint-disable-next-line -- @typescript-eslint/no-unsafe-assignment
42
- const shutdownManagerInstalled = app.locals[exports.INSTALLATION_APP_LOCAL_KEY];
41
+ const shutdownManagerInstalled = app.locals[INSTALLATION_APP_LOCAL_KEY];
43
42
  if (typeof shutdownManagerInstalled === "boolean" &&
44
43
  shutdownManagerInstalled) {
45
44
  throw new Error("Shutdown manager can only be installed once");
46
45
  }
47
- app.locals[exports.INSTALLATION_APP_LOCAL_KEY] = true;
46
+ app.locals[INSTALLATION_APP_LOCAL_KEY] = true;
48
47
  // https://cloud.google.com/load-balancing/docs/https/https-logging-monitoring#failure-messages
49
48
  // (see the section on backend_connection_closed_before_data_sent_to_client)
50
49
  server.keepAliveTimeout = config.keepAliveTimeoutSeconds * 1000;
51
50
  server.headersTimeout = (config.keepAliveTimeoutSeconds + 1) * 1000;
52
51
  const gracefulShutdown = (signal) => () => {
53
52
  // eslint-disable-next-line -- @typescript-eslint/no-unsafe-assignment
54
- const isTerminating = app.locals[exports.TERMINATION_APP_LOCAL_KEY];
53
+ const isTerminating = app.locals[TERMINATION_APP_LOCAL_KEY];
55
54
  if (typeof isTerminating === "boolean" && isTerminating) {
56
55
  logger.warn("Server is already in TERMINATING state, not starting shutdown procedure again");
57
56
  return;
58
57
  }
59
- app.locals[exports.TERMINATION_APP_LOCAL_KEY] = true;
58
+ app.locals[TERMINATION_APP_LOCAL_KEY] = true;
60
59
  logger.notice(`Received ${signal} signal, starting shutdown procedure`);
61
60
  const shutdown = () => {
62
61
  setTimeout(() => {
@@ -102,5 +101,4 @@ function installShutdownManager(app, logger, config) {
102
101
  process.on("SIGINT", gracefulShutdown("SIGINT"));
103
102
  return server;
104
103
  }
105
- exports.installShutdownManager = installShutdownManager;
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2h1dGRvd24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2h1dGRvd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsK0JBQTRDO0FBRTVDLG1DQUE2QztBQUU3QyxNQUFNLGVBQWUsR0FBRyxDQUFDLElBQVksRUFBRSxNQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBWSxFQUFFLEVBQUU7SUFDekUsTUFBTSxDQUFDLEtBQUssaUJBQ1YsT0FBTyxFQUFFLHlDQUF5QyxJQUFJLE9BQU8sSUFDMUQsSUFBQSwwQkFBa0IsRUFBQyxHQUFHLENBQUMsRUFDMUIsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLHdFQUF3RTtBQUN4RSx1RUFBdUU7QUFDMUQsUUFBQSx5QkFBeUIsR0FBRyxvQkFBb0IsQ0FBQztBQUNqRCxRQUFBLDBCQUEwQixHQUFHLG1DQUFtQyxDQUFDO0FBVTlFLFNBQWdCLDRCQUE0QixDQUMxQyxRQUF5Qzs7SUFFekMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFXLEVBQUUsVUFBa0IsRUFBVSxFQUFFO1FBQzlELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRixNQUFNLHVCQUF1QixHQUFHLFdBQVcsQ0FDekMsOEJBQThCLEVBQzlCLE1BQUEsUUFBUSxhQUFSLFFBQVEsdUJBQVIs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
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2h1dGRvd24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2h1dGRvd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFaEQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxJQUFZLEVBQUUsTUFBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQVksRUFBRSxFQUFFO0lBQ3pFLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDWCxPQUFPLEVBQUUseUNBQXlDLElBQUksT0FBTztRQUM3RCxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQztLQUMzQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRix3RUFBd0U7QUFDeEUsdUVBQXVFO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLG9CQUFvQixDQUFDO0FBQzlELE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLG1DQUFtQyxDQUFDO0FBVTlFLE1BQU0sVUFBVSw0QkFBNEIsQ0FDMUMsUUFBeUM7SUFFekMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFXLEVBQUUsVUFBa0IsRUFBVSxFQUFFO1FBQzlELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsR0FB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
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "@saasquatch/express-boilerplate",
3
- "version": "1.1.2-0",
3
+ "version": "1.1.2-2",
4
4
  "description": "Boilerplate middleware and functions for building Express apps on Kubernetes",
5
5
  "main": "dist/index.js",
6
+ "type": "module",
6
7
  "private": false,
7
8
  "publishConfig": {
8
9
  "provenance": true,
@@ -11,7 +12,7 @@
11
12
  "author": "ReferralSaaSquatch.com, Inc.",
12
13
  "license": "MIT",
13
14
  "engines": {
14
- "node": "^18 || ^20 || ^22"
15
+ "node": "^24 || ^26"
15
16
  },
16
17
  "files": [
17
18
  "dist/*.js",
@@ -26,8 +27,9 @@
26
27
  },
27
28
  "homepage": "https://github.com/saasquatch/program-tools/packages/express-boilerplate#readme",
28
29
  "scripts": {
29
- "test": "npm run build && node --enable-source-maps node_modules/jest/bin/jest.js --roots dist/tests --coverage",
30
+ "test": "node --test --experimental-test-coverage --test-reporter=spec --test-reporter-destination=stdout src/tests/**/*.ts",
30
31
  "build": "tsc -b",
32
+ "check": "tsc --noEmit && npm run lint",
31
33
  "prepublishOnly": "if [ \"$CI\" != \"true\" ]; then echo Error: Publishing manually is not supported. Please use the GitHub action. && exit 1; fi",
32
34
  "prepack": "npm run build",
33
35
  "lint": "eslint ./src --report-unused-disable-directives"
@@ -36,18 +38,17 @@
36
38
  "nanoid": "^3.3.7"
37
39
  },
38
40
  "devDependencies": {
39
- "@jest/globals": "^29.7.0",
40
- "@saasquatch/logger": "^1.5.1",
41
+ "@eslint/eslintrc": "^3.3.5",
42
+ "@eslint/js": "^10.0.1",
43
+ "@saasquatch/logger": "^3.0.0",
41
44
  "@types/express": "4",
42
- "@types/jest": "^29.5.12",
43
- "@types/node": "18",
44
- "@types/supertest": "^6.0.2",
45
- "@typescript-eslint/eslint-plugin": "^7.1.1",
46
- "@typescript-eslint/parser": "^7.1.1",
47
- "eslint": "^8.57.0",
48
- "jest": "^29.7.0",
49
- "supertest": "^6.3.4",
50
- "ts-node": "^10.9.2"
45
+ "@types/node": "^24.12.4",
46
+ "@types/supertest": "^7.2.0",
47
+ "@typescript-eslint/eslint-plugin": "^8.59.4",
48
+ "@typescript-eslint/parser": "^8.59.4",
49
+ "eslint": "^10.4.0",
50
+ "supertest": "^7.2.2",
51
+ "typescript": "^6.0.3"
51
52
  },
52
53
  "peerDependencies": {
53
54
  "express": "4",