@saasquatch/express-boilerplate 1.1.2-1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/async-wrapper.d.ts +1 -1
- package/dist/async-wrapper.js +21 -19
- package/dist/error.js +2 -6
- package/dist/healthcheck.d.ts +1 -1
- package/dist/healthcheck.js +11 -11
- package/dist/index.d.ts +9 -9
- package/dist/index.js +8 -17
- package/dist/middleware.d.ts +1 -1
- package/dist/middleware.js +8 -11
- package/dist/nanoid.d.ts +1 -1
- package/dist/nanoid.js +3 -6
- package/dist/shutdown.d.ts +1 -2
- package/dist/shutdown.js +19 -21
- package/package.json +15 -14
package/dist/async-wrapper.d.ts
CHANGED
|
@@ -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;
|
package/dist/async-wrapper.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
requestId
|
|
15
|
-
|
|
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 ((
|
|
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
|
|
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(
|
|
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(
|
|
45
|
+
.send(JSON.stringify({ message, ...error }, null, 2));
|
|
43
46
|
}
|
|
44
47
|
});
|
|
45
48
|
};
|
|
46
49
|
}
|
|
47
|
-
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtd3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hc3luYy13cmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLG1DQUE2QztBQUM3QyxxQ0FBa0M7QUFFbEMsU0FBZ0IsbUJBQW1CLENBQ2pDLE9BQW9ELEVBQ3BELGVBSW9CO0lBRXBCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDbEIsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTs7WUFDNUIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUE0QixDQUFDO1lBQ3ZELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBK0IsQ0FBQztZQUU3RCxNQUFNLE9BQU8sR0FBRyxJQUFBLGVBQU0sRUFBQyxDQUFDLENBQUMsQ0FBQztZQUUxQixNQUFNLEtBQUssbUJBQ1QsT0FBTztnQkFDUCxTQUFTLElBQ04sSUFBQSwwQkFBa0IsRUFBQyxDQUFDLENBQUMsQ0FDekIsQ0FBQztZQUVGLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUU1RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUM7WUFDbkIsTUFBTSxPQUFPLEdBQ1gsQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUM7WUFFaEUsaUVBQWlFO1lBQ2pFLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNwQixPQUFPO1lBQ1QsQ0FBQztZQUVELG9FQUFvRTtZQUNwRSw4REFBOEQ7WUFDOUQsSUFDRSxDQUFDLE1BQUEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUNBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztnQkFDbEQsZUFBZSxFQUNmLENBQUM7Z0JBQ0QsZUFBZSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO3FCQUN0QyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDYixHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEUsQ0FBQyxDQUFDO3FCQUNELEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNYLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLGlCQUNYLE9BQU8sRUFBRSw0Q0FBNEMsSUFDbEQsSUFBQSwwQkFBa0IsRUFBQyxDQUFDLENBQUMsRUFDeEIsQ0FBQztvQkFFSCxHQUFHO3lCQUNBLE1BQU0sQ0FBQyxNQUFNLENBQUM7eUJBQ2QsV0FBVyxDQUFDLGtCQUFrQixDQUFDO3lCQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsaUJBQUcsT0FBTyxJQUFLLEtBQUssR0FBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUQsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sR0FBRztxQkFDQSxNQUFNLENBQUMsTUFBTSxDQUFDO3FCQUNkLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQztxQkFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLGlCQUFHLE9BQU8sSUFBSyxLQUFLLEdBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQTdERCxrREE2REMifQ==
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtd3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hc3luYy13cmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFckMsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxPQUFvRCxFQUNwRCxlQUlvQjtJQUVwQixPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ2xCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBVSxFQUFFLEVBQUU7WUFDckMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQXVCLENBQUM7WUFDMUQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQXVCLENBQUM7WUFFaEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTFCLE1BQU0sS0FBSyxHQUFHO2dCQUNaLE9BQU87Z0JBQ1AsU0FBUztnQkFDVCxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQzthQUN6QixDQUFDO1lBRUYsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBRTVELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNuQixNQUFNLE9BQU8sR0FDWCxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQztZQUVoRSxpRUFBaUU7WUFDakUsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3BCLE9BQU87WUFDVCxDQUFDO1lBRUQsb0VBQW9FO1lBQ3BFLDhEQUE4RDtZQUM5RCxJQUNFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO2dCQUNsRCxlQUFlLEVBQ2YsQ0FBQztnQkFDRCxlQUFlLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7cUJBQ3RDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUNiLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLHdCQUF3QixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0RSxDQUFDLENBQUM7cUJBQ0QsS0FBSyxDQUFDLENBQUMsQ0FBVSxFQUFFLEVBQUU7b0JBQ3BCLE1BQU0sRUFBRSxLQUFLLENBQUM7d0JBQ1osT0FBTyxFQUFFLDRDQUE0Qzt3QkFDckQsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7cUJBQ3pCLENBQUMsQ0FBQztvQkFFSCxHQUFHO3lCQUNBLE1BQU0sQ0FBQyxNQUFNLENBQUM7eUJBQ2QsV0FBVyxDQUFDLGtCQUFrQixDQUFDO3lCQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7aUJBQU0sQ0FBQztnQkFDTixHQUFHO3FCQUNBLE1BQU0sQ0FBQyxNQUFNLENBQUM7cUJBQ2QsV0FBVyxDQUFDLGtCQUFrQixDQUFDO3FCQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNKLENBQUMifQ==
|
package/dist/error.js
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBTUEsU0FBZ0Isa0JBQWtCLENBQUMsQ0FBVTtJQUMzQyxPQUFPO1FBQ0wsQ0FBQztRQUNELCtFQUErRTtRQUMvRSxvRUFBb0U7UUFDcEUsK0VBQStFO1FBQy9FLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRTtRQUNaLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztLQUN6QixDQUFDO0FBQ0osQ0FBQztBQVRELGdEQVNDIn0=
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsTUFBTSxVQUFVLGtCQUFrQixDQUFDLENBQVU7SUFDM0MsT0FBTztRQUNMLENBQUM7UUFDRCwrRUFBK0U7UUFDL0Usb0VBQW9FO1FBQ3BFLCtFQUErRTtRQUMvRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUU7UUFDWixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7S0FDekIsQ0FBQztBQUNKLENBQUMifQ==
|
package/dist/healthcheck.d.ts
CHANGED
package/dist/healthcheck.js
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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[
|
|
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 =
|
|
29
|
-
logger.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
|
-
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
package/dist/middleware.d.ts
CHANGED
package/dist/middleware.js
CHANGED
|
@@ -1,22 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
|
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 =
|
|
15
|
-
res.locals
|
|
16
|
-
res.locals
|
|
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
|
-
|
|
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
|
|
1
|
+
export declare const nanoid: (size?: number) => string;
|
package/dist/nanoid.js
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
4
|
+
export const nanoid = customAlphabet(alphabet, 32);
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFub2lkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25hbm9pZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3hDLE1BQU0sUUFBUSxHQUNaLGdFQUFnRSxDQUFDO0FBRW5FLHVEQUF1RDtBQUN2RCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyJ9
|
package/dist/shutdown.d.ts
CHANGED
package/dist/shutdown.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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(
|
|
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
|
-
|
|
12
|
-
|
|
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",
|
|
27
|
-
const terminationDelaySeconds = optionalInt("SSQT_TERMINATION_DELAY_SECONDS",
|
|
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 =
|
|
39
|
+
const server = createServer(app);
|
|
41
40
|
// eslint-disable-next-line -- @typescript-eslint/no-unsafe-assignment
|
|
42
|
-
const shutdownManagerInstalled = app.locals[
|
|
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[
|
|
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[
|
|
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[
|
|
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
|
-
|
|
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": "
|
|
3
|
+
"version": "2.0.0",
|
|
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": "^
|
|
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": "
|
|
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
|
-
"@
|
|
40
|
-
"@
|
|
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/
|
|
43
|
-
"@types/
|
|
44
|
-
"@
|
|
45
|
-
"@typescript-eslint/
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
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",
|