@bool-ts/core 1.1.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.
- package/LICENSE +21 -21
- package/__test/controller.ts +64 -63
- package/__test/index.ts +11 -11
- package/__test/interfaces.ts +7 -7
- package/__test/module.ts +17 -17
- package/__test/repository.ts +16 -16
- package/__test/service.ts +20 -20
- package/bun.lockb +0 -0
- package/dist/decorators/controller.js +10 -6
- package/dist/decorators/http.js +34 -25
- package/dist/decorators/index.js +23 -5
- package/dist/decorators/inject.js +9 -5
- package/dist/decorators/injectable.js +8 -4
- package/dist/decorators/module.d.ts +1 -0
- package/dist/decorators/module.js +8 -4
- package/dist/hooks/factory.d.ts +1 -0
- package/dist/hooks/factory.js +66 -35
- package/dist/hooks/index.js +7 -2
- package/dist/hooks/injector.js +10 -7
- package/dist/http/clientError.js +7 -3
- package/dist/http/index.js +25 -7
- package/dist/http/serverError.js +7 -3
- package/dist/index.js +21 -5
- package/dist/interfaces/index.js +3 -1
- package/package.json +2 -2
- package/src/decorators/controller.ts +18 -18
- package/src/decorators/http.ts +185 -185
- package/src/decorators/index.ts +5 -5
- package/src/decorators/inject.ts +19 -19
- package/src/decorators/injectable.ts +12 -12
- package/src/decorators/module.ts +22 -21
- package/src/hooks/factory.ts +199 -193
- package/src/hooks/index.ts +2 -2
- package/src/hooks/injector.ts +43 -43
- package/src/http/clientError.ts +57 -57
- package/src/http/index.ts +68 -68
- package/src/http/serverError.ts +39 -39
- package/src/index.ts +6 -6
- package/src/interfaces/index.ts +3 -3
- package/test.http +28 -28
- package/tsconfig.json +108 -108
package/dist/hooks/factory.js
CHANGED
|
@@ -1,80 +1,108 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.BoolFactory = void 0;
|
|
27
|
+
require("reflect-metadata");
|
|
28
|
+
require("colors");
|
|
29
|
+
const Qs = __importStar(require("qs"));
|
|
30
|
+
const ResponseTime = __importStar(require("response-time"));
|
|
31
|
+
const decorators_1 = require("../decorators");
|
|
32
|
+
const express_1 = __importStar(require("express"));
|
|
33
|
+
const injector_1 = require("./injector");
|
|
34
|
+
const http_1 = require("../http");
|
|
9
35
|
/**
|
|
10
36
|
*
|
|
11
37
|
* @param target
|
|
12
38
|
* @param router
|
|
13
39
|
*/
|
|
14
|
-
const controllerCreator = (
|
|
15
|
-
if (!Reflect.getOwnMetadataKeys(
|
|
16
|
-
throw Error(`${
|
|
40
|
+
const controllerCreator = (controllerConstructor, parentRouter = (0, express_1.Router)()) => {
|
|
41
|
+
if (!Reflect.getOwnMetadataKeys(controllerConstructor).includes(decorators_1.controllerKey)) {
|
|
42
|
+
throw Error(`${controllerConstructor.name} is not a controller.`);
|
|
17
43
|
}
|
|
18
|
-
const controller = Injector.get(
|
|
44
|
+
const controller = injector_1.Injector.get(controllerConstructor);
|
|
19
45
|
if (!controller) {
|
|
20
46
|
throw Error("Can not initialize controller.");
|
|
21
47
|
}
|
|
22
|
-
const controllerMetadata = Reflect.getOwnMetadata(controllerKey,
|
|
23
|
-
const routesMetadata = (Reflect.getOwnMetadata(controllerRoutesKey,
|
|
24
|
-
const
|
|
25
|
-
routesMetadata.forEach(
|
|
26
|
-
if (typeof
|
|
48
|
+
const controllerMetadata = Reflect.getOwnMetadata(decorators_1.controllerKey, controllerConstructor) || "/";
|
|
49
|
+
const routesMetadata = (Reflect.getOwnMetadata(decorators_1.controllerRoutesKey, controllerConstructor) || []);
|
|
50
|
+
const router = (0, express_1.Router)();
|
|
51
|
+
routesMetadata.forEach(routeMetadata => {
|
|
52
|
+
if (typeof routeMetadata.descriptor.value !== "function") {
|
|
27
53
|
return;
|
|
28
54
|
}
|
|
29
|
-
|
|
55
|
+
const route = router.route(routeMetadata.path);
|
|
56
|
+
switch (routeMetadata.httpMethod) {
|
|
30
57
|
case "GET":
|
|
31
|
-
return
|
|
58
|
+
return route.get(routeMetadata.descriptor.value.bind(controller));
|
|
32
59
|
case "POST":
|
|
33
|
-
return
|
|
60
|
+
return route.post(routeMetadata.descriptor.value.bind(controller));
|
|
34
61
|
case "PUT":
|
|
35
|
-
return
|
|
62
|
+
return route.put(routeMetadata.descriptor.value.bind(controller));
|
|
36
63
|
case "PATCH":
|
|
37
|
-
return
|
|
64
|
+
return route.patch(routeMetadata.descriptor.value.bind(controller));
|
|
38
65
|
case "DELETE":
|
|
39
|
-
return
|
|
66
|
+
return route.delete(routeMetadata.descriptor.value.bind(controller));
|
|
40
67
|
case "OPTIONS":
|
|
41
|
-
return
|
|
68
|
+
return route.options(routeMetadata.descriptor.value.bind(controller));
|
|
42
69
|
}
|
|
43
70
|
});
|
|
44
|
-
return router;
|
|
71
|
+
return parentRouter.use(controllerMetadata, router);
|
|
45
72
|
};
|
|
46
73
|
/**
|
|
47
74
|
*
|
|
48
75
|
* @param target
|
|
49
76
|
*/
|
|
50
|
-
|
|
51
|
-
if (!Reflect.getOwnMetadataKeys(target).includes(moduleKey)) {
|
|
77
|
+
const BoolFactory = (target, options) => {
|
|
78
|
+
if (!Reflect.getOwnMetadataKeys(target).includes(decorators_1.moduleKey)) {
|
|
52
79
|
throw Error(`${target.name} is not a module.`);
|
|
53
80
|
}
|
|
54
|
-
const metadata = Reflect.getOwnMetadata(moduleKey, target);
|
|
55
|
-
const routers = !metadata?.controllers ? [] : metadata.controllers.map(controllerConstructor => controllerCreator(controllerConstructor));
|
|
81
|
+
const metadata = Reflect.getOwnMetadata(decorators_1.moduleKey, target);
|
|
56
82
|
const allowOrigins = !metadata?.allowOrigins ?
|
|
57
83
|
["*"] : typeof metadata.allowOrigins !== "string" ?
|
|
58
84
|
metadata.allowOrigins : [metadata.allowOrigins];
|
|
59
85
|
const allowMethods = !metadata?.allowMethods ?
|
|
60
86
|
["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"] : metadata.allowMethods;
|
|
61
|
-
const app =
|
|
87
|
+
const app = (0, express_1.default)();
|
|
62
88
|
const factoryOptions = Object.freeze({
|
|
63
89
|
allowLogsMethods: !options?.log?.methods ? ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"] : options.log.methods
|
|
64
90
|
});
|
|
91
|
+
const routers = !metadata?.controllers ?
|
|
92
|
+
[] : metadata.controllers.map(controllerConstructor => controllerCreator(controllerConstructor));
|
|
65
93
|
app.set("etag", "strong");
|
|
66
94
|
app.set("query parser", (query) => Qs.parse(query, {
|
|
67
95
|
depth: !options?.queryParser?.depth || options.queryParser.depth < 0 ? 10 : options.queryParser.depth,
|
|
68
96
|
arrayLimit: !options?.queryParser?.arrayLimit || options.queryParser.arrayLimit < 0 ? 50 : options.queryParser.arrayLimit
|
|
69
97
|
}));
|
|
70
|
-
app.use(urlencoded({
|
|
98
|
+
app.use((0, express_1.urlencoded)({
|
|
71
99
|
extended: true,
|
|
72
100
|
inflate: true,
|
|
73
101
|
limit: "1mb",
|
|
74
102
|
parameterLimit: 20,
|
|
75
103
|
type: "application/x-www-form-urlencoded",
|
|
76
104
|
verify: undefined
|
|
77
|
-
}), json({
|
|
105
|
+
}), (0, express_1.json)({
|
|
78
106
|
inflate: true,
|
|
79
107
|
limit: "5mb",
|
|
80
108
|
reviver: undefined,
|
|
@@ -98,7 +126,7 @@ export const BoolFactory = (target, options) => {
|
|
|
98
126
|
},
|
|
99
127
|
// Error catcher
|
|
100
128
|
(err, req, res, next) => {
|
|
101
|
-
errorInfer(res, err);
|
|
129
|
+
(0, http_1.errorInfer)(res, err);
|
|
102
130
|
if (!options?.debug) {
|
|
103
131
|
return;
|
|
104
132
|
}
|
|
@@ -137,8 +165,11 @@ export const BoolFactory = (target, options) => {
|
|
|
137
165
|
next();
|
|
138
166
|
});
|
|
139
167
|
if (routers.length > 0) {
|
|
140
|
-
|
|
168
|
+
!metadata?.prefix ?
|
|
169
|
+
app.use(routers) : app.use(!metadata.prefix.startsWith("/") ?
|
|
170
|
+
`/${metadata.prefix}` : metadata.prefix, routers);
|
|
141
171
|
}
|
|
142
172
|
return app;
|
|
143
173
|
};
|
|
144
|
-
|
|
174
|
+
exports.BoolFactory = BoolFactory;
|
|
175
|
+
exports.default = exports.BoolFactory;
|
package/dist/hooks/index.js
CHANGED
|
@@ -1,2 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Injector = exports.BoolFactory = void 0;
|
|
4
|
+
var factory_1 = require("./factory");
|
|
5
|
+
Object.defineProperty(exports, "BoolFactory", { enumerable: true, get: function () { return factory_1.BoolFactory; } });
|
|
6
|
+
var injector_1 = require("./injector");
|
|
7
|
+
Object.defineProperty(exports, "Injector", { enumerable: true, get: function () { return injector_1.Injector; } });
|
package/dist/hooks/injector.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Injector = void 0;
|
|
4
|
+
require("reflect-metadata");
|
|
5
|
+
const decorators_1 = require("../decorators");
|
|
6
|
+
exports.Injector = new class {
|
|
4
7
|
_mapper = new Map();
|
|
5
8
|
/**
|
|
6
9
|
*
|
|
@@ -11,15 +14,15 @@ export const Injector = new class {
|
|
|
11
14
|
return this._mapper.get(classDefinition);
|
|
12
15
|
}
|
|
13
16
|
const ownMetadataKeys = Reflect.getMetadataKeys(classDefinition);
|
|
14
|
-
if (!ownMetadataKeys.includes(injectableKey)) {
|
|
17
|
+
if (!ownMetadataKeys.includes(decorators_1.injectableKey)) {
|
|
15
18
|
throw Error("Missing dependency declaration, please check @Injectable() used on dependency(ies).");
|
|
16
19
|
}
|
|
17
20
|
// Initialize dependencies injection
|
|
18
|
-
const dependencies = Reflect.getOwnMetadata(injectKey, classDefinition) || [];
|
|
19
|
-
const injections = dependencies.map(dependency => Injector.get(dependency));
|
|
21
|
+
const dependencies = Reflect.getOwnMetadata(decorators_1.injectKey, classDefinition) || [];
|
|
22
|
+
const injections = dependencies.map(dependency => exports.Injector.get(dependency));
|
|
20
23
|
const instance = new classDefinition(...injections);
|
|
21
24
|
this._mapper.set(classDefinition, instance);
|
|
22
25
|
return instance;
|
|
23
26
|
}
|
|
24
27
|
};
|
|
25
|
-
|
|
28
|
+
exports.default = exports.Injector;
|
package/dist/http/clientError.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpClientError = exports.httpClientErrors = void 0;
|
|
4
|
+
exports.httpClientErrors = Object.freeze({
|
|
2
5
|
400: "BAD_REQUEST",
|
|
3
6
|
401: "UNAUTHORIZED",
|
|
4
7
|
402: "PAYMENT_REQUIRED",
|
|
@@ -29,14 +32,15 @@ export const httpClientErrors = Object.freeze({
|
|
|
29
32
|
431: "REQUEST_HEADER_FIELDS_TOO_LARGE",
|
|
30
33
|
451: "UNAVAILABLE_FOR_LEGAL_REASONS"
|
|
31
34
|
});
|
|
32
|
-
|
|
35
|
+
class HttpClientError extends Error {
|
|
33
36
|
httpCode;
|
|
34
37
|
message;
|
|
35
38
|
data;
|
|
36
39
|
constructor({ httpCode, data }) {
|
|
37
40
|
super();
|
|
38
41
|
this.httpCode = httpCode;
|
|
39
|
-
this.message = httpClientErrors[httpCode];
|
|
42
|
+
this.message = exports.httpClientErrors[httpCode];
|
|
40
43
|
this.data = data;
|
|
41
44
|
}
|
|
42
45
|
}
|
|
46
|
+
exports.HttpClientError = HttpClientError;
|
package/dist/http/index.js
CHANGED
|
@@ -1,15 +1,32 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.errorInfer = void 0;
|
|
18
|
+
const clientError_1 = require("./clientError");
|
|
19
|
+
const serverError_1 = require("./serverError");
|
|
20
|
+
const errorInfer = (res, data) => {
|
|
4
21
|
if (res.headersSent) {
|
|
5
22
|
return;
|
|
6
23
|
}
|
|
7
24
|
try {
|
|
8
|
-
if (data instanceof HttpClientError) {
|
|
25
|
+
if (data instanceof clientError_1.HttpClientError) {
|
|
9
26
|
res.status(data.httpCode).json(data);
|
|
10
27
|
return;
|
|
11
28
|
}
|
|
12
|
-
if (data instanceof HttpServerError) {
|
|
29
|
+
if (data instanceof serverError_1.HttpServerError) {
|
|
13
30
|
res.status(data.httpCode).json(data);
|
|
14
31
|
return;
|
|
15
32
|
}
|
|
@@ -54,5 +71,6 @@ export const errorInfer = (res, data) => {
|
|
|
54
71
|
res.end();
|
|
55
72
|
}
|
|
56
73
|
};
|
|
57
|
-
|
|
58
|
-
|
|
74
|
+
exports.errorInfer = errorInfer;
|
|
75
|
+
__exportStar(require("./clientError"), exports);
|
|
76
|
+
__exportStar(require("./serverError"), exports);
|
package/dist/http/serverError.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpServerError = exports.httpServerErrors = void 0;
|
|
4
|
+
exports.httpServerErrors = Object.freeze({
|
|
2
5
|
500: "INTERNAL_SERVER_ERROR",
|
|
3
6
|
501: "NOT_IMPLEMENTED",
|
|
4
7
|
502: "BAD_GATEWAY",
|
|
@@ -11,14 +14,15 @@ export const httpServerErrors = Object.freeze({
|
|
|
11
14
|
510: "NOT_EXTENDED",
|
|
12
15
|
511: "NETWORK_AUTHENTICATION_REQUIRED"
|
|
13
16
|
});
|
|
14
|
-
|
|
17
|
+
class HttpServerError extends Error {
|
|
15
18
|
httpCode;
|
|
16
19
|
message;
|
|
17
20
|
data;
|
|
18
21
|
constructor({ httpCode, data }) {
|
|
19
22
|
super();
|
|
20
23
|
this.httpCode = httpCode;
|
|
21
|
-
this.message = httpServerErrors[httpCode];
|
|
24
|
+
this.message = exports.httpServerErrors[httpCode];
|
|
22
25
|
this.data = data;
|
|
23
26
|
}
|
|
24
27
|
}
|
|
28
|
+
exports.HttpServerError = HttpServerError;
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
require("reflect-metadata");
|
|
18
|
+
__exportStar(require("./interfaces"), exports);
|
|
19
|
+
__exportStar(require("./hooks"), exports);
|
|
20
|
+
__exportStar(require("./decorators"), exports);
|
|
21
|
+
__exportStar(require("./http"), exports);
|
package/dist/interfaces/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bool-ts/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"test": "bun run __test/index.ts
|
|
7
|
+
"test": "bun --hot run __test/index.ts",
|
|
8
8
|
"build": "tsc"
|
|
9
9
|
},
|
|
10
10
|
"repository": {
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { injectableKey } from "./injectable";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export const controllerKey = "__bool:controller__";
|
|
5
|
-
|
|
6
|
-
export const Controller = (
|
|
7
|
-
prefix: string
|
|
8
|
-
) => <T extends Object>(
|
|
9
|
-
target: T,
|
|
10
|
-
context?: ClassDecoratorContext
|
|
11
|
-
) => {
|
|
12
|
-
Reflect.defineMetadata(controllerKey, !prefix.startsWith("/") ? `/${prefix}` : prefix, target);
|
|
13
|
-
Reflect.defineMetadata(injectableKey, undefined, target);
|
|
14
|
-
|
|
15
|
-
return target;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export default Controller;
|
|
1
|
+
import { injectableKey } from "./injectable";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
export const controllerKey = "__bool:controller__";
|
|
5
|
+
|
|
6
|
+
export const Controller = (
|
|
7
|
+
prefix: string
|
|
8
|
+
) => <T extends Object>(
|
|
9
|
+
target: T,
|
|
10
|
+
context?: ClassDecoratorContext
|
|
11
|
+
) => {
|
|
12
|
+
Reflect.defineMetadata(controllerKey, !prefix.startsWith("/") ? `/${prefix}` : prefix, target);
|
|
13
|
+
Reflect.defineMetadata(injectableKey, undefined, target);
|
|
14
|
+
|
|
15
|
+
return target;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default Controller;
|