@alanszp/express-common-fn 11.0.0 → 12.0.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.
- package/dist/commonErrorsHandler.js +37 -14
- package/dist/commonErrorsHandler.js.map +1 -1
- package/node_modules/@alanszp/audit/dist/errors/AuditError.d.ts +2 -2
- package/node_modules/@alanszp/audit/dist/errors/AuditError.js +1 -1
- package/node_modules/@alanszp/audit/dist/errors/AuditError.js.map +1 -1
- package/node_modules/@alanszp/audit/dist/errors/MissingAuditFieldsError.d.ts +3 -3
- package/node_modules/@alanszp/audit/dist/errors/MissingAuditFieldsError.js +2 -2
- package/node_modules/@alanszp/audit/dist/errors/MissingAuditFieldsError.js.map +1 -1
- package/node_modules/@alanszp/audit/package.json +7 -4
- package/node_modules/@alanszp/audit/src/errors/AuditError.ts +2 -2
- package/node_modules/@alanszp/audit/src/errors/MissingAuditFieldsError.ts +4 -7
- package/node_modules/@alanszp/errors/dist/BaseError.js.map +1 -0
- package/node_modules/@alanszp/errors/dist/HttpRenderableError.d.ts +4 -0
- package/node_modules/@alanszp/errors/dist/HttpRenderableError.js +8 -0
- package/node_modules/@alanszp/errors/dist/HttpRenderableError.js.map +1 -0
- package/node_modules/@alanszp/errors/dist/InternalServerError.d.ts +8 -0
- package/node_modules/@alanszp/errors/dist/InternalServerError.js +24 -0
- package/node_modules/@alanszp/errors/dist/InternalServerError.js.map +1 -0
- package/node_modules/@alanszp/errors/dist/RenderableError.d.ts +15 -0
- package/node_modules/@alanszp/errors/dist/RenderableError.js +27 -0
- package/node_modules/@alanszp/errors/dist/RenderableError.js.map +1 -0
- package/node_modules/@alanszp/errors/dist/index.d.ts +4 -3
- package/node_modules/@alanszp/errors/dist/index.js +4 -3
- package/node_modules/@alanszp/errors/dist/index.js.map +1 -1
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/.gitignore +3 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/.npmignore +3 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/LICENSE +21 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/app/appIdentifier.js.map +1 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/app/index.d.ts +1 -0
- package/node_modules/@alanszp/errors/{dist/errors/http → node_modules/@alanszp/core/dist/app}/index.js +6 -6
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/app/index.js.map +1 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/assignKey.d.ts +2 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/assignKey.js +20 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/assignKey.js.map +1 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/editable/index.d.ts +2 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/editable/index.js +19 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/editable/index.js.map +1 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/editable/keepOrUpdate.d.ts +3 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/editable/keepOrUpdate.js +26 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/editable/keepOrUpdate.js.map +1 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/editable/types.d.ts +6 -0
- package/node_modules/@alanszp/errors/{dist/errors/RenderableError.js → node_modules/@alanszp/core/dist/editable/types.js} +1 -1
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/editable/types.js.map +1 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/index.d.ts +4 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/index.js +21 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/index.js.map +1 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/lists/ListResult.d.ts +7 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/lists/ListResult.js +8 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/lists/ListResult.js.map +1 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/lists/Orderable.d.ts +11 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/lists/Orderable.js +13 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/lists/Orderable.js.map +1 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/lists/Paginable.d.ts +14 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/lists/Paginable.js +22 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/lists/Paginable.js.map +1 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/lists/index.d.ts +3 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/lists/index.js +20 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/dist/lists/index.js.map +1 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/package.json +25 -0
- package/node_modules/@alanszp/errors/node_modules/@alanszp/core/tsconfig.json +15 -0
- package/node_modules/@alanszp/errors/package.json +9 -2
- package/node_modules/@alanszp/errors/src/HttpRenderableError.ts +5 -0
- package/node_modules/@alanszp/errors/src/{errors/http/InternalServerError.ts → InternalServerError.ts} +8 -10
- package/node_modules/@alanszp/errors/src/RenderableError.ts +37 -0
- package/node_modules/@alanszp/errors/src/index.ts +4 -3
- package/node_modules/@alanszp/express/dist/helpers/renderErrorJson.d.ts +4 -0
- package/node_modules/@alanszp/express/dist/helpers/renderErrorJson.js +32 -0
- package/node_modules/@alanszp/express/dist/helpers/renderErrorJson.js.map +1 -0
- package/node_modules/@alanszp/express/dist/index.d.ts +0 -1
- package/node_modules/@alanszp/express/dist/index.js +0 -1
- package/node_modules/@alanszp/express/dist/index.js.map +1 -1
- package/node_modules/@alanszp/express/dist/middlewares/authedForOrg.js +3 -4
- package/node_modules/@alanszp/express/dist/middlewares/authedForOrg.js.map +1 -1
- package/node_modules/@alanszp/express/dist/middlewares/authenticateUser.js +4 -5
- package/node_modules/@alanszp/express/dist/middlewares/authenticateUser.js.map +1 -1
- package/node_modules/@alanszp/express/dist/middlewares/createContext.js +2 -2
- package/node_modules/@alanszp/express/dist/middlewares/createContext.js.map +1 -1
- package/node_modules/@alanszp/express/dist/middlewares/createContext.test.js +3 -3
- package/node_modules/@alanszp/express/dist/middlewares/createContext.test.js.map +1 -1
- package/node_modules/@alanszp/express/dist/middlewares/hasRoles.js +2 -3
- package/node_modules/@alanszp/express/dist/middlewares/hasRoles.js.map +1 -1
- package/node_modules/@alanszp/express/dist/middlewares/jsonBodyParser.js +3 -4
- package/node_modules/@alanszp/express/dist/middlewares/jsonBodyParser.js.map +1 -1
- package/node_modules/@alanszp/express/dist/middlewares/returnInternalServerError.js +1 -2
- package/node_modules/@alanszp/express/dist/middlewares/returnInternalServerError.js.map +1 -1
- package/node_modules/@alanszp/express/dist/middlewares/returnNotFound.js +2 -3
- package/node_modules/@alanszp/express/dist/middlewares/returnNotFound.js.map +1 -1
- package/node_modules/@alanszp/express/package.json +8 -7
- package/node_modules/@alanszp/express/src/helpers/renderErrorJson.ts +29 -0
- package/node_modules/@alanszp/express/src/index.ts +0 -1
- package/node_modules/@alanszp/express/src/middlewares/authedForOrg.ts +3 -4
- package/node_modules/@alanszp/express/src/middlewares/authenticateUser.ts +7 -10
- package/node_modules/@alanszp/express/src/middlewares/createContext.test.ts +1 -1
- package/node_modules/@alanszp/express/src/middlewares/createContext.ts +1 -1
- package/node_modules/@alanszp/express/src/middlewares/hasRoles.ts +2 -3
- package/node_modules/@alanszp/express/src/middlewares/jsonBodyParser.ts +3 -4
- package/node_modules/@alanszp/express/src/middlewares/returnInternalServerError.ts +1 -2
- package/node_modules/@alanszp/express/src/middlewares/returnNotFound.ts +2 -3
- package/node_modules/@alanszp/jwt/package.json +2 -3
- package/node_modules/@alanszp/logger/package.json +2 -3
- package/package.json +8 -6
- package/src/commonErrorsHandler.ts +44 -16
- package/node_modules/@alanszp/errors/dist/errors/BaseError.js.map +0 -1
- package/node_modules/@alanszp/errors/dist/errors/RenderableError.d.ts +0 -6
- package/node_modules/@alanszp/errors/dist/errors/RenderableError.js.map +0 -1
- package/node_modules/@alanszp/errors/dist/errors/http/BadRequestError.d.ts +0 -8
- package/node_modules/@alanszp/errors/dist/errors/http/BadRequestError.js +0 -20
- package/node_modules/@alanszp/errors/dist/errors/http/BadRequestError.js.map +0 -1
- package/node_modules/@alanszp/errors/dist/errors/http/HttpError.d.ts +0 -8
- package/node_modules/@alanszp/errors/dist/errors/http/HttpError.js +0 -18
- package/node_modules/@alanszp/errors/dist/errors/http/HttpError.js.map +0 -1
- package/node_modules/@alanszp/errors/dist/errors/http/InternalServerError.d.ts +0 -8
- package/node_modules/@alanszp/errors/dist/errors/http/InternalServerError.js +0 -32
- package/node_modules/@alanszp/errors/dist/errors/http/InternalServerError.js.map +0 -1
- package/node_modules/@alanszp/errors/dist/errors/http/NotFoundError.d.ts +0 -4
- package/node_modules/@alanszp/errors/dist/errors/http/NotFoundError.js +0 -11
- package/node_modules/@alanszp/errors/dist/errors/http/NotFoundError.js.map +0 -1
- package/node_modules/@alanszp/errors/dist/errors/http/UnauthorizedError.d.ts +0 -8
- package/node_modules/@alanszp/errors/dist/errors/http/UnauthorizedError.js +0 -20
- package/node_modules/@alanszp/errors/dist/errors/http/UnauthorizedError.js.map +0 -1
- package/node_modules/@alanszp/errors/dist/errors/http/index.d.ts +0 -5
- package/node_modules/@alanszp/errors/dist/errors/http/index.js.map +0 -1
- package/node_modules/@alanszp/errors/src/errors/RenderableError.ts +0 -7
- package/node_modules/@alanszp/errors/src/errors/http/BadRequestError.ts +0 -21
- package/node_modules/@alanszp/errors/src/errors/http/HttpError.ts +0 -19
- package/node_modules/@alanszp/errors/src/errors/http/NotFoundError.ts +0 -7
- package/node_modules/@alanszp/errors/src/errors/http/UnauthorizedError.ts +0 -21
- package/node_modules/@alanszp/errors/src/errors/http/index.ts +0 -5
- package/node_modules/@alanszp/express/dist/helpers/appIdentifier.js.map +0 -1
- package/node_modules/@alanszp/express/dist/views/errorView.d.ts +0 -2
- package/node_modules/@alanszp/express/dist/views/errorView.js +0 -14
- package/node_modules/@alanszp/express/dist/views/errorView.js.map +0 -1
- package/node_modules/@alanszp/express/src/helpers/appIdentifier.ts +0 -5
- package/node_modules/@alanszp/express/src/views/errorView.ts +0 -11
- /package/node_modules/@alanszp/errors/dist/{errors/BaseError.d.ts → BaseError.d.ts} +0 -0
- /package/node_modules/@alanszp/errors/dist/{errors/BaseError.js → BaseError.js} +0 -0
- /package/node_modules/@alanszp/{express/dist/helpers → errors/node_modules/@alanszp/core/dist/app}/appIdentifier.d.ts +0 -0
- /package/node_modules/@alanszp/{express/dist/helpers → errors/node_modules/@alanszp/core/dist/app}/appIdentifier.js +0 -0
- /package/node_modules/@alanszp/errors/src/{errors/BaseError.ts → BaseError.ts} +0 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { appIdentifier } from "@alanszp/core";
|
|
2
|
+
import { RenderableView } from "@alanszp/errors";
|
|
3
|
+
|
|
4
|
+
export function render401Error(requiredChecks: string[]): RenderableView {
|
|
5
|
+
return {
|
|
6
|
+
code: "unauthorized_error",
|
|
7
|
+
message: "Unauthorized Error",
|
|
8
|
+
context: { requiredChecks },
|
|
9
|
+
origin: appIdentifier(),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function render404Error(): RenderableView {
|
|
14
|
+
return {
|
|
15
|
+
code: "not_found",
|
|
16
|
+
message: "Not Found",
|
|
17
|
+
context: {},
|
|
18
|
+
origin: appIdentifier(),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function render400Error(message: string): RenderableView {
|
|
23
|
+
return {
|
|
24
|
+
code: "bad_request",
|
|
25
|
+
message,
|
|
26
|
+
context: {},
|
|
27
|
+
origin: appIdentifier(),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { NotFoundError, UnauthorizedError } from "@alanszp/errors";
|
|
2
|
-
import { errorView } from "../views/errorView";
|
|
3
1
|
import { NextFunction, Response } from "express";
|
|
4
2
|
import { getRequestLogger } from "../helpers/getRequestLogger";
|
|
5
3
|
import { GenericRequest } from "../types/GenericRequest";
|
|
4
|
+
import { render401Error, render404Error } from "../helpers/renderErrorJson";
|
|
6
5
|
|
|
7
6
|
function response401(res: Response): void {
|
|
8
|
-
res.status(401).json(
|
|
7
|
+
res.status(401).json(render401Error(["jwt"]));
|
|
9
8
|
}
|
|
10
9
|
|
|
11
10
|
export function authForOrg(
|
|
@@ -46,6 +45,6 @@ export function authForOrg(
|
|
|
46
45
|
logger.info("middleware.authForOrg.error.noOrganization", {
|
|
47
46
|
error,
|
|
48
47
|
});
|
|
49
|
-
res.status(404).json(
|
|
48
|
+
res.status(404).json(render404Error());
|
|
50
49
|
}
|
|
51
50
|
}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { JWTUser, verifyJWT, VerifyOptions } from "@alanszp/jwt";
|
|
2
|
-
import { UnauthorizedError } from "@alanszp/errors";
|
|
3
|
-
import { errorView } from "../views/errorView";
|
|
4
2
|
import { NextFunction, Response } from "express";
|
|
5
3
|
import { getRequestLogger } from "../helpers/getRequestLogger";
|
|
6
4
|
import { GenericRequest } from "../types/GenericRequest";
|
|
7
5
|
import { ILogger } from "@alanszp/logger";
|
|
8
6
|
import { compact, isEmpty, omit } from "lodash";
|
|
7
|
+
import { render401Error } from "../helpers/renderErrorJson";
|
|
9
8
|
|
|
10
9
|
function parseAuthorizationHeader(
|
|
11
10
|
authorization: string | undefined
|
|
@@ -143,13 +142,11 @@ export function createAuthContext<Options extends AuthOptions>(
|
|
|
143
142
|
res
|
|
144
143
|
.status(401)
|
|
145
144
|
.json(
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
])
|
|
152
|
-
)
|
|
145
|
+
render401Error([
|
|
146
|
+
authAttempts.includes(null)
|
|
147
|
+
? `Token invalid for methods ${authMethods}`
|
|
148
|
+
: `Token not set for methods ${authMethods}`,
|
|
149
|
+
])
|
|
153
150
|
);
|
|
154
151
|
return;
|
|
155
152
|
}
|
|
@@ -167,7 +164,7 @@ export function createAuthContext<Options extends AuthOptions>(
|
|
|
167
164
|
methods: AuthMethods,
|
|
168
165
|
error,
|
|
169
166
|
});
|
|
170
|
-
res.status(401).json(
|
|
167
|
+
res.status(401).json(render401Error(authMethods));
|
|
171
168
|
}
|
|
172
169
|
};
|
|
173
170
|
};
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
mockRequestWithBody,
|
|
9
9
|
mockResponse,
|
|
10
10
|
} from "../test/mocks/expressMocks";
|
|
11
|
-
import { appIdentifier } from "
|
|
11
|
+
import { appIdentifier } from "@alanszp/core";
|
|
12
12
|
jest.mock("@alanszp/shared-context");
|
|
13
13
|
|
|
14
14
|
const logger = createMockLogger({});
|
|
@@ -2,7 +2,7 @@ import { createId } from "@paralleldrive/cuid2";
|
|
|
2
2
|
import { NextFunction, Response } from "express";
|
|
3
3
|
import { ILogger } from "@alanszp/logger";
|
|
4
4
|
import { Audit } from "@alanszp/audit";
|
|
5
|
-
import { appIdentifier } from "
|
|
5
|
+
import { appIdentifier } from "@alanszp/core";
|
|
6
6
|
import { GenericRequest } from "../types/GenericRequest";
|
|
7
7
|
import { SharedContext } from "@alanszp/shared-context";
|
|
8
8
|
import { compact } from "lodash";
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { UnauthorizedError } from "@alanszp/errors";
|
|
2
|
-
import { errorView } from "../views/errorView";
|
|
3
1
|
import { NextFunction, Response } from "express";
|
|
4
2
|
import { GenericRequest } from "../types/GenericRequest";
|
|
3
|
+
import { render401Error } from "../helpers/renderErrorJson";
|
|
5
4
|
|
|
6
5
|
function response401(res: Response): void {
|
|
7
|
-
res.status(401).json(
|
|
6
|
+
res.status(401).json(render401Error(["permissions"]));
|
|
8
7
|
}
|
|
9
8
|
|
|
10
9
|
export function hasRoles(
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { json, OptionsJson } from "body-parser";
|
|
2
2
|
import { NextFunction, Response } from "express";
|
|
3
|
-
import { BadRequestError } from "@alanszp/errors";
|
|
4
|
-
import { errorView } from "../views/errorView";
|
|
5
3
|
import { GenericRequest } from "../types/GenericRequest";
|
|
4
|
+
import { render400Error } from "../helpers/renderErrorJson";
|
|
6
5
|
|
|
7
6
|
export function jsonBodyParser(options?: OptionsJson) {
|
|
8
7
|
const bodyParser = json({ limit: "1mb", ...options });
|
|
@@ -14,10 +13,10 @@ export function jsonBodyParser(options?: OptionsJson) {
|
|
|
14
13
|
try {
|
|
15
14
|
bodyParser(req, res, (error?: unknown) => {
|
|
16
15
|
if (!error) return next();
|
|
17
|
-
res.status(400).json(
|
|
16
|
+
res.status(400).json(render400Error("Malformed JSON"));
|
|
18
17
|
});
|
|
19
18
|
} catch (error: unknown) {
|
|
20
|
-
res.status(400).json(
|
|
19
|
+
res.status(400).json(render400Error("Malformed JSON"));
|
|
21
20
|
}
|
|
22
21
|
};
|
|
23
22
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ErrorRequestHandler, NextFunction, Response } from "express";
|
|
2
2
|
import { InternalServerError } from "@alanszp/errors";
|
|
3
|
-
import { errorView } from "../views/errorView";
|
|
4
3
|
import { GenericRequest } from "../types/GenericRequest";
|
|
5
4
|
import { ILogger } from "@alanszp/logger";
|
|
6
5
|
|
|
@@ -11,6 +10,6 @@ export type GetInternalServerErrorMiddleware = (
|
|
|
11
10
|
export const returnInternalServerError: GetInternalServerErrorMiddleware =
|
|
12
11
|
(getLogger: () => ILogger) =>
|
|
13
12
|
(error: unknown, req: GenericRequest, res: Response, _next: NextFunction) => {
|
|
14
|
-
res.status(500).json(
|
|
13
|
+
res.status(500).json(new InternalServerError(error).toView());
|
|
15
14
|
getLogger().error("error_to_client", { error });
|
|
16
15
|
};
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { NextFunction, Response } from "express";
|
|
2
|
-
import { NotFoundError } from "@alanszp/errors";
|
|
3
|
-
import { errorView } from "../views/errorView";
|
|
4
2
|
import { GenericRequest } from "../types/GenericRequest";
|
|
3
|
+
import { render404Error } from "../helpers/renderErrorJson";
|
|
5
4
|
|
|
6
5
|
export function returnNotFound(
|
|
7
6
|
_req: GenericRequest,
|
|
8
7
|
res: Response,
|
|
9
8
|
_next: NextFunction
|
|
10
9
|
): void {
|
|
11
|
-
res.status(404).json(
|
|
10
|
+
res.status(404).json(render404Error());
|
|
12
11
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alanszp/jwt",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "12.0.0",
|
|
4
4
|
"description": "Alan's jwt validator & signer.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"typings": "dist/index.d.ts",
|
|
@@ -25,6 +25,5 @@
|
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"jose": "^5.2.2"
|
|
28
|
-
}
|
|
29
|
-
"gitHead": "60b62fa2fff34ef094ea9af69c2bed2373c70f64"
|
|
28
|
+
}
|
|
30
29
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alanszp/logger",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "12.0.0",
|
|
4
4
|
"description": "Alan's logger util.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"typings": "dist/index.d.ts",
|
|
@@ -31,6 +31,5 @@
|
|
|
31
31
|
"ts-node": "^10.0.0",
|
|
32
32
|
"tslint": "^5.11.0",
|
|
33
33
|
"typescript": "^4.3.4"
|
|
34
|
-
}
|
|
35
|
-
"gitHead": "60b62fa2fff34ef094ea9af69c2bed2373c70f64"
|
|
34
|
+
}
|
|
36
35
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alanszp/express-common-fn",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "12.0.1",
|
|
4
4
|
"description": "Alan's express function to handle common errors and format uniformly.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"typings": "dist/index.d.ts",
|
|
@@ -19,20 +19,22 @@
|
|
|
19
19
|
"yalc-publish": "yarn run yalc publish"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@alanszp/
|
|
23
|
-
"@alanszp/express": "^
|
|
24
|
-
"@alanszp/logger": "^
|
|
25
|
-
"@alanszp/validations": "^
|
|
22
|
+
"@alanszp/core": "^12.0.0",
|
|
23
|
+
"@alanszp/express": "^12.0.1",
|
|
24
|
+
"@alanszp/logger": "^12.0.0",
|
|
25
|
+
"@alanszp/validations": "^12.0.1"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
|
+
"@alanszp/errors": ">=12.0.0",
|
|
28
29
|
"express": "^4.17.1",
|
|
29
30
|
"typeorm": "^0.2.34"
|
|
30
31
|
},
|
|
31
32
|
"devDependencies": {
|
|
33
|
+
"@alanszp/errors": "^12.0.1",
|
|
32
34
|
"@types/express": "^4.17.12",
|
|
33
35
|
"@types/node": "^20.11.17",
|
|
34
36
|
"typeorm": "^0.2.34",
|
|
35
37
|
"typescript": "4.7.4"
|
|
36
38
|
},
|
|
37
|
-
"gitHead": "
|
|
39
|
+
"gitHead": "2320e554850aec120e0e8bc71c00a2197187af40"
|
|
38
40
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { appIdentifier } from "@alanszp/core";
|
|
2
2
|
import {
|
|
3
|
-
BadRequestError,
|
|
4
3
|
InternalServerError,
|
|
5
|
-
|
|
4
|
+
RenderableError,
|
|
5
|
+
HttpRenderableError,
|
|
6
|
+
RenderableView,
|
|
6
7
|
} from "@alanszp/errors";
|
|
7
8
|
import { Context, ILogger } from "@alanszp/logger";
|
|
8
|
-
import { ModelValidationError } from "@alanszp/validations";
|
|
9
9
|
import { Response } from "express";
|
|
10
10
|
import { EntityNotFoundError, QueryFailedError } from "typeorm";
|
|
11
11
|
|
|
@@ -19,6 +19,24 @@ const defaultsOption: CommonErrorOptions = {
|
|
|
19
19
|
extraContext: {},
|
|
20
20
|
};
|
|
21
21
|
|
|
22
|
+
function render404Error(): RenderableView {
|
|
23
|
+
return {
|
|
24
|
+
code: "not_found",
|
|
25
|
+
message: "Not Found",
|
|
26
|
+
context: {},
|
|
27
|
+
origin: appIdentifier(),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function render400Error(message: string): RenderableView {
|
|
32
|
+
return {
|
|
33
|
+
code: "bad_request",
|
|
34
|
+
message,
|
|
35
|
+
context: {},
|
|
36
|
+
origin: appIdentifier(),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
22
40
|
export function commonErrorsHandler(loggerFn: () => ILogger) {
|
|
23
41
|
return function handleCommonErrors(
|
|
24
42
|
error: unknown,
|
|
@@ -34,9 +52,23 @@ export function commonErrorsHandler(loggerFn: () => ILogger) {
|
|
|
34
52
|
};
|
|
35
53
|
const instanceLogger = logger.child(opts.extraContext);
|
|
36
54
|
|
|
37
|
-
if (error instanceof
|
|
38
|
-
|
|
39
|
-
|
|
55
|
+
if (error instanceof RenderableError) {
|
|
56
|
+
const statusCode =
|
|
57
|
+
error instanceof HttpRenderableError ? error.httpCode() : 500;
|
|
58
|
+
|
|
59
|
+
if (statusCode >= 500) {
|
|
60
|
+
instanceLogger.error(`${baseLog}.error.${error.code()}`, {
|
|
61
|
+
statusCode,
|
|
62
|
+
error,
|
|
63
|
+
});
|
|
64
|
+
} else {
|
|
65
|
+
instanceLogger.info(`${baseLog}.error.${error.code()}`, {
|
|
66
|
+
statusCode,
|
|
67
|
+
error,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
res.status(statusCode).json(error.toView());
|
|
40
72
|
return;
|
|
41
73
|
}
|
|
42
74
|
|
|
@@ -45,11 +77,9 @@ export function commonErrorsHandler(loggerFn: () => ILogger) {
|
|
|
45
77
|
error,
|
|
46
78
|
});
|
|
47
79
|
if (opts.entityNotFound === 400) {
|
|
48
|
-
res
|
|
49
|
-
.status(400)
|
|
50
|
-
.json(errorView(new BadRequestError("Entity not present")));
|
|
80
|
+
res.status(400).json(render400Error("Entity not present"));
|
|
51
81
|
} else {
|
|
52
|
-
res.status(404).json(
|
|
82
|
+
res.status(404).json(render404Error());
|
|
53
83
|
}
|
|
54
84
|
return;
|
|
55
85
|
}
|
|
@@ -59,19 +89,17 @@ export function commonErrorsHandler(loggerFn: () => ILogger) {
|
|
|
59
89
|
instanceLogger.info(`${baseLog}.error.typeorm.query_error.duplicate`, {
|
|
60
90
|
error,
|
|
61
91
|
});
|
|
62
|
-
res
|
|
63
|
-
.status(400)
|
|
64
|
-
.json(errorView(new BadRequestError("Entity already exists")));
|
|
92
|
+
res.status(400).json(render400Error("Entity already exists"));
|
|
65
93
|
} else {
|
|
66
94
|
instanceLogger.error(`${baseLog}.error.typeorm.query_error.unknown`, {
|
|
67
95
|
error,
|
|
68
96
|
});
|
|
69
|
-
res.status(500).json(
|
|
97
|
+
res.status(500).json(new InternalServerError(error).toView());
|
|
70
98
|
}
|
|
71
99
|
return;
|
|
72
100
|
}
|
|
73
101
|
|
|
74
102
|
instanceLogger.error(`${baseLog}.error.unknown`, { error });
|
|
75
|
-
res.status(500).json(
|
|
103
|
+
res.status(500).json(new InternalServerError(error).toView());
|
|
76
104
|
};
|
|
77
105
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BaseError.js","sourceRoot":"","sources":["../../src/errors/BaseError.ts"],"names":[],"mappings":";;;AAAA,MAAa,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,IAAI,OAAO,KAAK,CAAC,iBAAiB,KAAK,UAAU,EAAE;YACjD,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;SACjD;aAAM;YACL,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC;SAC5C;QAED,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;CACF;AAbD,8BAaC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RenderableError.js","sourceRoot":"","sources":["../../src/errors/RenderableError.ts"],"names":[],"mappings":""}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { RenderableContext } from "../RenderableError";
|
|
2
|
-
import { HttpError } from "./HttpError";
|
|
3
|
-
export declare class BadRequestError extends HttpError {
|
|
4
|
-
private errors;
|
|
5
|
-
constructor(errors: string[] | string);
|
|
6
|
-
renderMessage(): string;
|
|
7
|
-
context(): RenderableContext;
|
|
8
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BadRequestError = void 0;
|
|
4
|
-
const HttpError_1 = require("./HttpError");
|
|
5
|
-
class BadRequestError extends HttpError_1.HttpError {
|
|
6
|
-
constructor(errors) {
|
|
7
|
-
super();
|
|
8
|
-
this.errors = errors;
|
|
9
|
-
}
|
|
10
|
-
renderMessage() {
|
|
11
|
-
return "Bad Request";
|
|
12
|
-
}
|
|
13
|
-
context() {
|
|
14
|
-
return {
|
|
15
|
-
errors: this.errors,
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
exports.BadRequestError = BadRequestError;
|
|
20
|
-
//# sourceMappingURL=BadRequestError.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BadRequestError.js","sourceRoot":"","sources":["../../../src/errors/http/BadRequestError.ts"],"names":[],"mappings":";;;AACA,2CAAwC;AAExC,MAAa,eAAgB,SAAQ,qBAAS;IAG5C,YAAmB,MAAyB;QAC1C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEM,aAAa;QAClB,OAAO,aAAa,CAAC;IACvB,CAAC;IAEM,OAAO;QACZ,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;CACF;AAjBD,0CAiBC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { BaseError } from "../BaseError";
|
|
2
|
-
import { RenderableContext, RenderableError } from "../RenderableError";
|
|
3
|
-
export declare abstract class HttpError extends BaseError implements RenderableError {
|
|
4
|
-
constructor();
|
|
5
|
-
abstract renderMessage(): string;
|
|
6
|
-
code(): string;
|
|
7
|
-
context(): RenderableContext;
|
|
8
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.HttpError = void 0;
|
|
4
|
-
const lodash_1 = require("lodash");
|
|
5
|
-
const BaseError_1 = require("../BaseError");
|
|
6
|
-
class HttpError extends BaseError_1.BaseError {
|
|
7
|
-
constructor() {
|
|
8
|
-
super("HttpError");
|
|
9
|
-
}
|
|
10
|
-
code() {
|
|
11
|
-
return (0, lodash_1.snakeCase)(this.renderMessage());
|
|
12
|
-
}
|
|
13
|
-
context() {
|
|
14
|
-
return {};
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
exports.HttpError = HttpError;
|
|
18
|
-
//# sourceMappingURL=HttpError.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HttpError.js","sourceRoot":"","sources":["../../../src/errors/http/HttpError.ts"],"names":[],"mappings":";;;AAAA,mCAAmC;AACnC,4CAAyC;AAGzC,MAAsB,SAAU,SAAQ,qBAAS;IAC/C;QACE,KAAK,CAAC,WAAW,CAAC,CAAC;IACrB,CAAC;IAIM,IAAI;QACT,OAAO,IAAA,kBAAS,EAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IACzC,CAAC;IAEM,OAAO;QACZ,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAdD,8BAcC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { RenderableContext } from "../RenderableError";
|
|
2
|
-
import { HttpError } from "./HttpError";
|
|
3
|
-
export declare class InternalServerError extends HttpError {
|
|
4
|
-
error: any;
|
|
5
|
-
constructor(error?: unknown);
|
|
6
|
-
renderMessage(): string;
|
|
7
|
-
context(): RenderableContext;
|
|
8
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.InternalServerError = void 0;
|
|
4
|
-
const HttpError_1 = require("./HttpError");
|
|
5
|
-
class InternalServerError extends HttpError_1.HttpError {
|
|
6
|
-
constructor(error) {
|
|
7
|
-
super();
|
|
8
|
-
this.error = error;
|
|
9
|
-
}
|
|
10
|
-
renderMessage() {
|
|
11
|
-
return "Internal Server Error";
|
|
12
|
-
}
|
|
13
|
-
context() {
|
|
14
|
-
if (process.env.NODE_ENV === "production") {
|
|
15
|
-
return {};
|
|
16
|
-
}
|
|
17
|
-
return {
|
|
18
|
-
error: {
|
|
19
|
-
name: this.error.name,
|
|
20
|
-
message: this.error.message,
|
|
21
|
-
code: this.error.code,
|
|
22
|
-
context: this.error.context,
|
|
23
|
-
renderMessage: this.error.renderMessage,
|
|
24
|
-
stack: this.error.stack,
|
|
25
|
-
status: this.error.status,
|
|
26
|
-
signal: this.error.signal,
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
exports.InternalServerError = InternalServerError;
|
|
32
|
-
//# sourceMappingURL=InternalServerError.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InternalServerError.js","sourceRoot":"","sources":["../../../src/errors/http/InternalServerError.ts"],"names":[],"mappings":";;;AACA,2CAAwC;AAExC,MAAa,mBAAoB,SAAQ,qBAAS;IAGhD,YAAY,KAAe;QACzB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEM,aAAa;QAClB,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAEM,OAAO;QACZ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE;YACzC,OAAO,EAAE,CAAC;SACX;QAED,OAAO;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;gBACrB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;gBAC3B,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;gBACrB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;gBAC3B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;gBACvC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;gBACvB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;gBACzB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;aAC1B;SACF,CAAC;IACJ,CAAC;CACF;AA9BD,kDA8BC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.NotFoundError = void 0;
|
|
4
|
-
const HttpError_1 = require("./HttpError");
|
|
5
|
-
class NotFoundError extends HttpError_1.HttpError {
|
|
6
|
-
renderMessage() {
|
|
7
|
-
return "Not Found";
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
exports.NotFoundError = NotFoundError;
|
|
11
|
-
//# sourceMappingURL=NotFoundError.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NotFoundError.js","sourceRoot":"","sources":["../../../src/errors/http/NotFoundError.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAExC,MAAa,aAAc,SAAQ,qBAAS;IACnC,aAAa;QAClB,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AAJD,sCAIC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { RenderableContext } from "../RenderableError";
|
|
2
|
-
import { HttpError } from "./HttpError";
|
|
3
|
-
export declare class UnauthorizedError extends HttpError {
|
|
4
|
-
requiredChecks: any;
|
|
5
|
-
constructor(requiredChecks: string[]);
|
|
6
|
-
renderMessage(): string;
|
|
7
|
-
context(): RenderableContext;
|
|
8
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.UnauthorizedError = void 0;
|
|
4
|
-
const HttpError_1 = require("./HttpError");
|
|
5
|
-
class UnauthorizedError extends HttpError_1.HttpError {
|
|
6
|
-
constructor(requiredChecks) {
|
|
7
|
-
super();
|
|
8
|
-
this.requiredChecks = requiredChecks;
|
|
9
|
-
}
|
|
10
|
-
renderMessage() {
|
|
11
|
-
return "Unauthorized Error";
|
|
12
|
-
}
|
|
13
|
-
context() {
|
|
14
|
-
return {
|
|
15
|
-
requiredChecks: this.requiredChecks,
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
exports.UnauthorizedError = UnauthorizedError;
|
|
20
|
-
//# sourceMappingURL=UnauthorizedError.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UnauthorizedError.js","sourceRoot":"","sources":["../../../src/errors/http/UnauthorizedError.ts"],"names":[],"mappings":";;;AACA,2CAAwC;AAExC,MAAa,iBAAkB,SAAQ,qBAAS;IAG9C,YAAmB,cAAwB;QACzC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAEM,aAAa;QAClB,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAEM,OAAO;QACZ,OAAO;YACL,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAC;IACJ,CAAC;CACF;AAjBD,8CAiBC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/errors/http/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8CAA4B;AAC5B,oDAAkC;AAClC,sDAAoC;AACpC,wDAAsC;AACtC,kDAAgC"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { RenderableContext } from "../RenderableError";
|
|
2
|
-
import { HttpError } from "./HttpError";
|
|
3
|
-
|
|
4
|
-
export class BadRequestError extends HttpError {
|
|
5
|
-
private errors;
|
|
6
|
-
|
|
7
|
-
public constructor(errors: string[] | string) {
|
|
8
|
-
super();
|
|
9
|
-
this.errors = errors;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
public renderMessage(): string {
|
|
13
|
-
return "Bad Request";
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
public context(): RenderableContext {
|
|
17
|
-
return {
|
|
18
|
-
errors: this.errors,
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { snakeCase } from "lodash";
|
|
2
|
-
import { BaseError } from "../BaseError";
|
|
3
|
-
import { RenderableContext, RenderableError } from "../RenderableError";
|
|
4
|
-
|
|
5
|
-
export abstract class HttpError extends BaseError implements RenderableError {
|
|
6
|
-
constructor() {
|
|
7
|
-
super("HttpError");
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
public abstract renderMessage(): string;
|
|
11
|
-
|
|
12
|
-
public code(): string {
|
|
13
|
-
return snakeCase(this.renderMessage());
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
public context(): RenderableContext {
|
|
17
|
-
return {};
|
|
18
|
-
}
|
|
19
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { RenderableContext } from "../RenderableError";
|
|
2
|
-
import { HttpError } from "./HttpError";
|
|
3
|
-
|
|
4
|
-
export class UnauthorizedError extends HttpError {
|
|
5
|
-
public requiredChecks;
|
|
6
|
-
|
|
7
|
-
public constructor(requiredChecks: string[]) {
|
|
8
|
-
super();
|
|
9
|
-
this.requiredChecks = requiredChecks;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
public renderMessage(): string {
|
|
13
|
-
return "Unauthorized Error";
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
public context(): RenderableContext {
|
|
17
|
-
return {
|
|
18
|
-
requiredChecks: this.requiredChecks,
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
}
|