@tsed/platform-exceptions 7.0.0-alpha.1 → 7.0.0-beta.3
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/lib/cjs/components/ErrorFilter.js +48 -0
- package/lib/cjs/components/ErrorFilter.js.map +1 -0
- package/lib/cjs/components/ExceptionFilter.js +23 -0
- package/lib/cjs/components/ExceptionFilter.js.map +1 -0
- package/lib/cjs/components/MongooseErrorFilter.js +17 -0
- package/lib/cjs/components/MongooseErrorFilter.js.map +1 -0
- package/lib/cjs/components/StringErrorFilter.js +16 -0
- package/lib/cjs/components/StringErrorFilter.js.map +1 -0
- package/lib/cjs/decorators/catch.js +23 -0
- package/lib/cjs/decorators/catch.js.map +1 -0
- package/lib/cjs/domain/ExceptionFiltersContainer.js +16 -0
- package/lib/cjs/domain/ExceptionFiltersContainer.js.map +1 -0
- package/lib/cjs/domain/ExceptionSchema.js +36 -0
- package/lib/cjs/domain/ExceptionSchema.js.map +1 -0
- package/lib/cjs/errors/ResourceNotFound.js +12 -0
- package/lib/cjs/errors/ResourceNotFound.js.map +1 -0
- package/lib/cjs/index.js +19 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/interfaces/ExceptionFilterMethods.js +3 -0
- package/lib/cjs/interfaces/ExceptionFilterMethods.js.map +1 -0
- package/lib/cjs/services/PlatformExceptions.js +55 -0
- package/lib/cjs/services/PlatformExceptions.js.map +1 -0
- package/lib/esm/components/ErrorFilter.js +45 -0
- package/lib/esm/components/ErrorFilter.js.map +1 -0
- package/lib/esm/components/ExceptionFilter.js +20 -0
- package/lib/esm/components/ExceptionFilter.js.map +1 -0
- package/lib/esm/components/MongooseErrorFilter.js +14 -0
- package/lib/esm/components/MongooseErrorFilter.js.map +1 -0
- package/lib/esm/components/StringErrorFilter.js +13 -0
- package/lib/esm/components/StringErrorFilter.js.map +1 -0
- package/lib/esm/decorators/catch.js +19 -0
- package/lib/esm/decorators/catch.js.map +1 -0
- package/lib/esm/domain/ExceptionFiltersContainer.js +12 -0
- package/lib/esm/domain/ExceptionFiltersContainer.js.map +1 -0
- package/lib/esm/domain/ExceptionSchema.js +33 -0
- package/lib/esm/domain/ExceptionSchema.js.map +1 -0
- package/lib/esm/errors/ResourceNotFound.js +8 -0
- package/lib/esm/errors/ResourceNotFound.js.map +1 -0
- package/lib/esm/index.js +16 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/interfaces/ExceptionFilterMethods.js +2 -0
- package/lib/esm/interfaces/ExceptionFilterMethods.js.map +1 -0
- package/lib/esm/services/PlatformExceptions.js +52 -0
- package/lib/esm/services/PlatformExceptions.js.map +1 -0
- package/lib/{components → types/components}/ErrorFilter.d.ts +0 -0
- package/lib/{components → types/components}/ExceptionFilter.d.ts +0 -0
- package/lib/{components → types/components}/MongooseErrorFilter.d.ts +0 -0
- package/lib/{components → types/components}/StringErrorFilter.d.ts +0 -0
- package/lib/{decorators → types/decorators}/catch.d.ts +0 -0
- package/lib/{domain → types/domain}/ExceptionFiltersContainer.d.ts +0 -0
- package/lib/{domain → types/domain}/ExceptionSchema.d.ts +0 -0
- package/lib/{errors → types/errors}/ResourceNotFound.d.ts +0 -0
- package/lib/{index.d.ts → types/index.d.ts} +0 -0
- package/lib/{interfaces → types/interfaces}/ExceptionFilterMethods.d.ts +0 -0
- package/lib/{services → types/services}/PlatformExceptions.d.ts +0 -4
- package/package.json +19 -15
- package/tsconfig.compile.esm.json +23 -0
- package/lib/index.js +0 -246
- package/lib/index.js.map +0 -1
- package/lib/index.modern.js +0 -222
- package/lib/index.modern.js.map +0 -1
package/lib/index.modern.js
DELETED
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
import { __decorate, __metadata } from 'tslib';
|
|
2
|
-
import { registerProvider, Inject, InjectorService, Injectable } from '@tsed/di';
|
|
3
|
-
import * as Exceptions from '@tsed/exceptions';
|
|
4
|
-
import { Exception, BadRequest, NotFound } from '@tsed/exceptions';
|
|
5
|
-
import { Env, nameOf, classOf, ancestorsOf } from '@tsed/core';
|
|
6
|
-
import { object, string, from, number, array, getStatusConstant, defineStatusModel } from '@tsed/schema';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* @ignore
|
|
10
|
-
*/
|
|
11
|
-
// tslint:disable-next-line:variable-name
|
|
12
|
-
const ExceptionFiltersContainer = new Map();
|
|
13
|
-
/**
|
|
14
|
-
* @ignore
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
function registerExceptionType(type, token) {
|
|
18
|
-
ExceptionFiltersContainer.set(type, token);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Register a new class to handle an specific exception.
|
|
23
|
-
* @decorator
|
|
24
|
-
* @param types
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
function Catch(...types) {
|
|
28
|
-
return target => {
|
|
29
|
-
types.forEach(type => {
|
|
30
|
-
registerExceptionType(type, target);
|
|
31
|
-
});
|
|
32
|
-
registerProvider({
|
|
33
|
-
provide: target,
|
|
34
|
-
useClass: target
|
|
35
|
-
});
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const toHTML = (message = "") => message.replace(/\n/gi, "<br />");
|
|
40
|
-
|
|
41
|
-
let StringErrorFilter = class StringErrorFilter {
|
|
42
|
-
catch(error, ctx) {
|
|
43
|
-
ctx.response.status(404).body(toHTML(error));
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
};
|
|
47
|
-
StringErrorFilter = __decorate([Catch(String)], StringErrorFilter);
|
|
48
|
-
|
|
49
|
-
function _extends() {
|
|
50
|
-
_extends = Object.assign || function (target) {
|
|
51
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
52
|
-
var source = arguments[i];
|
|
53
|
-
|
|
54
|
-
for (var key in source) {
|
|
55
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
56
|
-
target[key] = source[key];
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return target;
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
return _extends.apply(this, arguments);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
let ErrorFilter = class ErrorFilter {
|
|
68
|
-
catch(error, ctx) {
|
|
69
|
-
const {
|
|
70
|
-
response,
|
|
71
|
-
logger,
|
|
72
|
-
env
|
|
73
|
-
} = ctx;
|
|
74
|
-
const err = this.mapError(error, env);
|
|
75
|
-
logger.error({
|
|
76
|
-
error: _extends({}, err, {
|
|
77
|
-
stack: error.stack
|
|
78
|
-
})
|
|
79
|
-
});
|
|
80
|
-
response.setHeaders(this.getHeaders(error)).status(err.status).contentType("application/json").body(env === Env.PROD ? "InternalServerError" : err);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
mapError(error, env) {
|
|
84
|
-
var _error$origin;
|
|
85
|
-
|
|
86
|
-
return {
|
|
87
|
-
name: ((_error$origin = error.origin) == null ? void 0 : _error$origin.name) || error.name,
|
|
88
|
-
message: error.message,
|
|
89
|
-
status: error.status || 500,
|
|
90
|
-
errors: this.getErrors(error),
|
|
91
|
-
stack: env === Env.DEV ? error.stack : undefined
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
getErrors(error) {
|
|
96
|
-
return [error, error.origin].filter(Boolean).reduce((errs, {
|
|
97
|
-
errors
|
|
98
|
-
}) => {
|
|
99
|
-
return errs.concat(errors).filter(Boolean);
|
|
100
|
-
}, []);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
getHeaders(error) {
|
|
104
|
-
return [error, error.origin].filter(Boolean).reduce((obj, {
|
|
105
|
-
headers
|
|
106
|
-
}) => {
|
|
107
|
-
return _extends({}, obj, headers || {});
|
|
108
|
-
}, {});
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
};
|
|
112
|
-
ErrorFilter = __decorate([Catch(Error)], ErrorFilter);
|
|
113
|
-
|
|
114
|
-
let ExceptionFilter = class ExceptionFilter extends ErrorFilter {
|
|
115
|
-
catch(error, ctx) {
|
|
116
|
-
const {
|
|
117
|
-
response,
|
|
118
|
-
logger,
|
|
119
|
-
env
|
|
120
|
-
} = ctx;
|
|
121
|
-
const err = this.mapError(error, env);
|
|
122
|
-
logger.error({
|
|
123
|
-
error: err,
|
|
124
|
-
stack: error.stack
|
|
125
|
-
});
|
|
126
|
-
response.setHeaders(this.getHeaders(error)).contentType("application/json").status(error.status).body(err);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
};
|
|
130
|
-
ExceptionFilter = __decorate([Catch(Exception)], ExceptionFilter);
|
|
131
|
-
|
|
132
|
-
let MongooseErrorFilter = class MongooseErrorFilter extends ErrorFilter {
|
|
133
|
-
catch(error, ctx) {
|
|
134
|
-
return super.catch(new BadRequest(error.message, error), ctx);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
};
|
|
138
|
-
MongooseErrorFilter = __decorate([Catch("MongooseError", "MongoError")], MongooseErrorFilter);
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* @ignore
|
|
142
|
-
*/
|
|
143
|
-
|
|
144
|
-
const ErrorSchema = object({
|
|
145
|
-
name: string().required().description("The error name"),
|
|
146
|
-
message: string().required().description("An error message")
|
|
147
|
-
}).label("GenericError").unknown();
|
|
148
|
-
from(Exception).properties({
|
|
149
|
-
name: string().required().description("The error name"),
|
|
150
|
-
message: string().required().description("An error message"),
|
|
151
|
-
status: number().required().description("The status code of the exception"),
|
|
152
|
-
errors: array().items(ErrorSchema).description("A list of related errors"),
|
|
153
|
-
stack: string().description("The stack trace (only in development mode)")
|
|
154
|
-
}); // Auto load models for all Exceptions
|
|
155
|
-
|
|
156
|
-
Object.values(Exceptions).forEach(target => {
|
|
157
|
-
if (target !== Exception && target.STATUS) {
|
|
158
|
-
if (target.STATUS > 302) {
|
|
159
|
-
const name = getStatusConstant(target.STATUS);
|
|
160
|
-
from(target).properties({
|
|
161
|
-
name: string().required().example(name).default(name).description("The error name"),
|
|
162
|
-
status: number().required().example(target.STATUS).default(target.STATUS).description("The status code of the exception")
|
|
163
|
-
});
|
|
164
|
-
defineStatusModel(target.STATUS, target);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
class ResourceNotFound extends NotFound {
|
|
170
|
-
constructor(url) {
|
|
171
|
-
super(`Resource "${url}" not found`);
|
|
172
|
-
this.url = url;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Catch all errors and return the json error with the right status code when it's possible.
|
|
179
|
-
*
|
|
180
|
-
* @platform
|
|
181
|
-
*/
|
|
182
|
-
|
|
183
|
-
let PlatformExceptions = class PlatformExceptions {
|
|
184
|
-
constructor() {
|
|
185
|
-
this.types = new Map();
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
$onInit() {
|
|
189
|
-
ExceptionFiltersContainer.forEach((token, type) => {
|
|
190
|
-
this.types.set(type, this.injector.get(token));
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
catch(error, ctx) {
|
|
195
|
-
const name = nameOf(classOf(error));
|
|
196
|
-
|
|
197
|
-
if (name && this.types.has(name)) {
|
|
198
|
-
return this.types.get(name).catch(error, ctx);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
const target = ancestorsOf(error).reverse().find(target => this.types.has(target));
|
|
202
|
-
|
|
203
|
-
if (target) {
|
|
204
|
-
return this.types.get(target).catch(error, ctx);
|
|
205
|
-
} // default
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
return this.types.get(Error).catch(error, ctx);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
resourceNotFound(ctx) {
|
|
212
|
-
return this.catch(new ResourceNotFound(ctx.request.url), ctx);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
};
|
|
216
|
-
|
|
217
|
-
__decorate([Inject(), __metadata("design:type", InjectorService)], PlatformExceptions.prototype, "injector", void 0);
|
|
218
|
-
|
|
219
|
-
PlatformExceptions = __decorate([Injectable()], PlatformExceptions);
|
|
220
|
-
|
|
221
|
-
export { Catch, ErrorFilter, ExceptionFilter, ExceptionFiltersContainer, MongooseErrorFilter, PlatformExceptions, ResourceNotFound, StringErrorFilter, registerExceptionType };
|
|
222
|
-
//# sourceMappingURL=index.modern.js.map
|
package/lib/index.modern.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.modern.js","sources":["../src/domain/ExceptionFiltersContainer.ts","../src/decorators/catch.ts","../src/components/StringErrorFilter.ts","../src/components/ErrorFilter.ts","../src/components/ExceptionFilter.ts","../src/components/MongooseErrorFilter.ts","../src/domain/ExceptionSchema.ts","../src/errors/ResourceNotFound.ts","../src/services/PlatformExceptions.ts"],"sourcesContent":["import {Type} from \"@tsed/core\";\nimport type {ExceptionFilterMethods} from \"../interfaces/ExceptionFilterMethods\";\n/**\n * @ignore\n */\nexport type ExceptionFilterKey = Type<any> | Symbol | string;\n/**\n * @ignore\n */\n// tslint:disable-next-line:variable-name\nexport const ExceptionFiltersContainer = new Map<ExceptionFilterKey, Type<ExceptionFilterMethods>>();\n/**\n * @ignore\n */\nexport function registerExceptionType(type: ExceptionFilterKey, token: Type<ExceptionFilterMethods>) {\n ExceptionFiltersContainer.set(type, token);\n}\n","import {Type} from \"@tsed/core\";\nimport {registerProvider} from \"@tsed/di\";\nimport {registerExceptionType} from \"../domain/ExceptionFiltersContainer\";\n\n/**\n * Register a new class to handle an specific exception.\n * @decorator\n * @param types\n */\nexport function Catch(...types: (Type<Error | any> | string)[]) {\n return (target: any) => {\n types.forEach((type) => {\n registerExceptionType(type, target as any);\n });\n registerProvider({\n provide: target,\n useClass: target\n });\n };\n}\n","import {BaseContext} from \"@tsed/di\";\nimport {Catch} from \"../decorators/catch\";\nimport type {ExceptionFilterMethods} from \"../interfaces/ExceptionFilterMethods\";\n\nconst toHTML = (message = \"\") => message.replace(/\\n/gi, \"<br />\");\n\n@Catch(String)\nexport class StringErrorFilter implements ExceptionFilterMethods {\n catch(error: string, ctx: BaseContext): void {\n ctx.response.status(404).body(toHTML(error));\n }\n}\n","import {Env} from \"@tsed/core\";\nimport {BaseContext} from \"@tsed/di\";\nimport {Catch} from \"../decorators/catch\";\nimport type {ExceptionFilterMethods} from \"../interfaces/ExceptionFilterMethods\";\n\n@Catch(Error)\nexport class ErrorFilter implements ExceptionFilterMethods {\n catch(error: any, ctx: BaseContext): void {\n const {response, logger, env} = ctx;\n const err = this.mapError(error, env);\n\n logger.error({\n error: {...err, stack: error.stack}\n });\n\n response\n .setHeaders(this.getHeaders(error))\n .status(err.status)\n .contentType(\"application/json\")\n .body(env === Env.PROD ? \"InternalServerError\" : err);\n }\n\n mapError(error: any, env?: Env) {\n return {\n name: error.origin?.name || error.name,\n message: error.message,\n status: error.status || 500,\n errors: this.getErrors(error),\n stack: env === Env.DEV ? error.stack : undefined\n };\n }\n\n protected getErrors(error: any) {\n return [error, error.origin].filter(Boolean).reduce((errs, {errors}: any) => {\n return errs.concat(errors).filter(Boolean);\n }, []);\n }\n\n protected getHeaders(error: any) {\n return [error, error.origin].filter(Boolean).reduce((obj, {headers}: any) => {\n return {\n ...obj,\n ...(headers || {})\n };\n }, {});\n }\n}\n","import {BaseContext} from \"@tsed/di\";\nimport {Exception} from \"@tsed/exceptions\";\nimport {Catch} from \"../decorators/catch\";\nimport {ErrorFilter} from \"./ErrorFilter\";\n\n@Catch(Exception)\nexport class ExceptionFilter extends ErrorFilter {\n catch(error: Exception, ctx: BaseContext) {\n const {response, logger, env} = ctx;\n const err = this.mapError(error, env);\n logger.error({\n error: err,\n stack: error.stack\n });\n\n response.setHeaders(this.getHeaders(error)).contentType(\"application/json\").status(error.status).body(err);\n }\n}\n","import {BaseContext} from \"@tsed/di\";\nimport {BadRequest} from \"@tsed/exceptions\";\nimport {Catch} from \"../decorators/catch\";\nimport {ErrorFilter} from \"./ErrorFilter\";\n\n@Catch(\"MongooseError\", \"MongoError\")\nexport class MongooseErrorFilter extends ErrorFilter {\n catch(error: Error, ctx: BaseContext) {\n return super.catch(new BadRequest(error.message, error), ctx);\n }\n}\n","import * as Exceptions from \"@tsed/exceptions\";\nimport {Exception} from \"@tsed/exceptions\";\nimport {array, defineStatusModel, from, getStatusConstant, number, object, string} from \"@tsed/schema\";\n\n/**\n * @ignore\n */\nconst ErrorSchema = object({\n name: string().required().description(\"The error name\"),\n message: string().required().description(\"An error message\")\n})\n .label(\"GenericError\")\n .unknown();\n\nfrom(Exception).properties({\n name: string().required().description(\"The error name\"),\n message: string().required().description(\"An error message\"),\n status: number().required().description(\"The status code of the exception\"),\n errors: array().items(ErrorSchema).description(\"A list of related errors\"),\n stack: string().description(\"The stack trace (only in development mode)\")\n});\n\n// Auto load models for all Exceptions\nObject.values(Exceptions).forEach((target) => {\n if (target !== Exception && target.STATUS) {\n if (target.STATUS > 302) {\n const name = getStatusConstant(target.STATUS);\n from(target).properties({\n name: string().required().example(name).default(name).description(\"The error name\"),\n status: number().required().example(target.STATUS).default(target.STATUS).description(\"The status code of the exception\")\n });\n\n defineStatusModel(target.STATUS, target);\n }\n }\n});\n","import {NotFound} from \"@tsed/exceptions\";\n\nexport class ResourceNotFound extends NotFound {\n readonly url: string;\n\n constructor(url: string) {\n super(`Resource \"${url}\" not found`);\n\n this.url = url;\n }\n}\n","import {ancestorsOf, classOf, nameOf} from \"@tsed/core\";\nimport {BaseContext, Inject, Injectable, InjectorService} from \"@tsed/di\";\nimport \"../components/ErrorFilter\";\nimport \"../components/ExceptionFilter\";\nimport \"../components/MongooseErrorFilter\";\nimport \"../components/StringErrorFilter\";\nimport {ExceptionFilterKey, ExceptionFiltersContainer} from \"../domain/ExceptionFiltersContainer\";\nimport {ResourceNotFound} from \"../errors/ResourceNotFound\";\nimport {ExceptionFilterMethods} from \"../interfaces/ExceptionFilterMethods\";\n\n/**\n * Catch all errors and return the json error with the right status code when it's possible.\n *\n * @platform\n */\n@Injectable()\nexport class PlatformExceptions {\n types: Map<ExceptionFilterKey, ExceptionFilterMethods> = new Map();\n\n @Inject()\n injector: InjectorService;\n\n $onInit() {\n ExceptionFiltersContainer.forEach((token, type) => {\n this.types.set(type, this.injector.get(token)!);\n });\n }\n\n catch(error: unknown, ctx: BaseContext) {\n const name = nameOf(classOf(error));\n\n if (name && this.types.has(name)) {\n return this.types.get(name)!.catch(error, ctx);\n }\n\n const target = ancestorsOf(error)\n .reverse()\n .find((target) => this.types.has(target));\n\n if (target) {\n return this.types.get(target)!.catch(error, ctx);\n }\n\n // default\n return this.types.get(Error)!.catch(error, ctx);\n }\n\n resourceNotFound(ctx: BaseContext) {\n return this.catch(new ResourceNotFound(ctx.request.url), ctx);\n }\n}\n"],"names":["ExceptionFiltersContainer","Map","registerExceptionType","type","token","set","Catch","types","target","forEach","registerProvider","provide","useClass","toHTML","message","replace","StringErrorFilter","catch","error","ctx","response","status","body","String","ErrorFilter","logger","env","err","mapError","stack","setHeaders","getHeaders","contentType","Env","PROD","name","origin","errors","getErrors","DEV","undefined","filter","Boolean","reduce","errs","concat","obj","headers","Error","ExceptionFilter","Exception","MongooseErrorFilter","BadRequest","ErrorSchema","object","string","required","description","label","unknown","from","properties","number","array","items","Object","values","Exceptions","STATUS","getStatusConstant","example","default","defineStatusModel","ResourceNotFound","NotFound","constructor","url","PlatformExceptions","$onInit","injector","get","nameOf","classOf","has","ancestorsOf","reverse","find","resourceNotFound","request","__decorate","Inject","InjectorService","Injectable"],"mappings":"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"}
|