@gieo/express 1.0.3 → 1.0.5
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/index.js +2 -0
- package/dist/test.js +57 -26
- package/package.json +2 -2
- package/src/index.js +89 -0
- package/src/index.ts +3 -1
- package/src/test.js +106 -0
- package/src/test.ts +47 -26
- package/tsconfig.json +6 -4
package/dist/index.js
CHANGED
package/dist/test.js
CHANGED
@@ -35,42 +35,73 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
35
35
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
36
36
|
}
|
37
37
|
};
|
38
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
39
|
+
var t = {};
|
40
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
41
|
+
t[p] = s[p];
|
42
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
43
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
44
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
45
|
+
t[p[i]] = s[p[i]];
|
46
|
+
}
|
47
|
+
return t;
|
48
|
+
};
|
38
49
|
Object.defineProperty(exports, "__esModule", { value: true });
|
39
50
|
var index_1 = require("./index");
|
40
51
|
var utils_1 = require("@gieo/utils");
|
41
52
|
var app = new index_1.default();
|
42
53
|
app.post("/calc", function (req, res) { return __awaiter(void 0, void 0, void 0, function () {
|
43
|
-
var _a,
|
54
|
+
var _a, op, numbers, values, result;
|
44
55
|
return __generator(this, function (_b) {
|
45
56
|
switch (_b.label) {
|
46
57
|
case 0: return [4 /*yield*/, req.getBody()];
|
47
58
|
case 1:
|
48
|
-
_a = _b.sent(),
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
break;
|
59
|
-
case "div":
|
60
|
-
result = (0, utils_1.div)(a, b);
|
61
|
-
break;
|
62
|
-
default:
|
63
|
-
return [2 /*return*/, res.status(400).json({
|
64
|
-
statusCode: 400,
|
65
|
-
success: false,
|
66
|
-
message: "Invalid operator",
|
67
|
-
})];
|
59
|
+
_a = _b.sent(), op = _a.op, numbers = __rest(_a, ["op"]);
|
60
|
+
values = Object.values(numbers)
|
61
|
+
.map(Number)
|
62
|
+
.filter(function (v) { return !isNaN(v); });
|
63
|
+
if (values.length < 2) {
|
64
|
+
return [2 /*return*/, res.status(400).json({
|
65
|
+
statusCode: 400,
|
66
|
+
success: false,
|
67
|
+
message: "Need at least two numeric values",
|
68
|
+
})];
|
68
69
|
}
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
70
|
+
try {
|
71
|
+
switch (op) {
|
72
|
+
case "sum":
|
73
|
+
result = utils_1.sum.apply(void 0, values);
|
74
|
+
break;
|
75
|
+
case "sub":
|
76
|
+
result = utils_1.sub.apply(void 0, values);
|
77
|
+
break;
|
78
|
+
case "mul":
|
79
|
+
result = utils_1.mul.apply(void 0, values);
|
80
|
+
break;
|
81
|
+
case "div":
|
82
|
+
result = utils_1.div.apply(void 0, values);
|
83
|
+
break;
|
84
|
+
default:
|
85
|
+
return [2 /*return*/, res.status(400).json({
|
86
|
+
statusCode: 400,
|
87
|
+
success: false,
|
88
|
+
message: "Invalid operator",
|
89
|
+
})];
|
90
|
+
}
|
91
|
+
return [2 /*return*/, res.status(200).json({
|
92
|
+
statusCode: 200,
|
93
|
+
success: true,
|
94
|
+
result: result,
|
95
|
+
})];
|
96
|
+
}
|
97
|
+
catch (err) {
|
98
|
+
return [2 /*return*/, res.status(500).json({
|
99
|
+
statusCode: 500,
|
100
|
+
success: false,
|
101
|
+
message: err.message,
|
102
|
+
})];
|
103
|
+
}
|
104
|
+
return [2 /*return*/];
|
74
105
|
}
|
75
106
|
});
|
76
107
|
}); });
|
package/package.json
CHANGED
package/src/index.js
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const http_1 = require("http");
|
4
|
+
const url_1 = require("url");
|
5
|
+
class ExpressPlus {
|
6
|
+
constructor() {
|
7
|
+
this.routes = {
|
8
|
+
GET: [],
|
9
|
+
POST: [],
|
10
|
+
PUT: [],
|
11
|
+
PATCH: [],
|
12
|
+
DELETE: [],
|
13
|
+
};
|
14
|
+
this.middlewares = [];
|
15
|
+
}
|
16
|
+
addRoute(method, path, handler) {
|
17
|
+
this.routes[method].push({ path, handler });
|
18
|
+
}
|
19
|
+
use(middleware) {
|
20
|
+
this.middlewares.push(middleware);
|
21
|
+
}
|
22
|
+
get(path, handler) {
|
23
|
+
this.addRoute("GET", path, handler);
|
24
|
+
}
|
25
|
+
post(path, handler) {
|
26
|
+
this.addRoute("POST", path, handler);
|
27
|
+
}
|
28
|
+
put(path, handler) {
|
29
|
+
this.addRoute("PUT", path, handler);
|
30
|
+
}
|
31
|
+
patch(path, handler) {
|
32
|
+
this.addRoute("PATCH", path, handler);
|
33
|
+
}
|
34
|
+
delete(path, handler) {
|
35
|
+
this.addRoute("DELETE", path, handler);
|
36
|
+
}
|
37
|
+
listen(port, callback) {
|
38
|
+
const server = (0, http_1.createServer)((req, res) => {
|
39
|
+
const method = req.method;
|
40
|
+
const parsedUrl = (0, url_1.parse)(req.url || "", true);
|
41
|
+
const pathname = parsedUrl.pathname || "/";
|
42
|
+
const route = this.routes[method].find((r) => r.path === pathname);
|
43
|
+
const extendedReq = req;
|
44
|
+
const extendedRes = res;
|
45
|
+
extendedReq.query = parsedUrl.query;
|
46
|
+
extendedReq.getBody = async () => {
|
47
|
+
if (extendedReq.body)
|
48
|
+
return extendedReq.body;
|
49
|
+
const chunks = [];
|
50
|
+
for await (const chunk of extendedReq) {
|
51
|
+
chunks.push(chunk);
|
52
|
+
}
|
53
|
+
const raw = Buffer.concat(chunks).toString();
|
54
|
+
extendedReq.bodyRaw = raw;
|
55
|
+
try {
|
56
|
+
extendedReq.body = JSON.parse(raw);
|
57
|
+
}
|
58
|
+
catch {
|
59
|
+
extendedReq.body = {};
|
60
|
+
}
|
61
|
+
return extendedReq.body;
|
62
|
+
};
|
63
|
+
extendedRes.status = function (code) {
|
64
|
+
extendedRes.statusCode = code;
|
65
|
+
return extendedRes;
|
66
|
+
};
|
67
|
+
extendedRes.json = function (data) {
|
68
|
+
extendedRes.setHeader("Content-Type", "application/json");
|
69
|
+
extendedRes.end(JSON.stringify(data));
|
70
|
+
};
|
71
|
+
let i = 0;
|
72
|
+
const next = () => {
|
73
|
+
const middleware = this.middlewares[i++];
|
74
|
+
if (middleware) {
|
75
|
+
middleware(extendedReq, extendedRes, next);
|
76
|
+
}
|
77
|
+
else if (route) {
|
78
|
+
route.handler(extendedReq, extendedRes);
|
79
|
+
}
|
80
|
+
else {
|
81
|
+
extendedRes.status(404).end("Not Found");
|
82
|
+
}
|
83
|
+
};
|
84
|
+
next();
|
85
|
+
});
|
86
|
+
server.listen(port, callback);
|
87
|
+
}
|
88
|
+
}
|
89
|
+
exports.default = ExpressPlus;
|
package/src/index.ts
CHANGED
@@ -23,7 +23,7 @@ interface Route {
|
|
23
23
|
handler: Handler;
|
24
24
|
}
|
25
25
|
|
26
|
-
|
26
|
+
class ExpressPlus {
|
27
27
|
private routes: Record<Method, Route[]> = {
|
28
28
|
GET: [],
|
29
29
|
POST: [],
|
@@ -132,3 +132,5 @@ export default class ExpressPlus {
|
|
132
132
|
server.listen(port, callback);
|
133
133
|
}
|
134
134
|
}
|
135
|
+
|
136
|
+
export default ExpressPlus;
|
package/src/test.js
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const index_1 = __importDefault(require("./index"));
|
7
|
+
const utils_1 = require("@gieo/utils");
|
8
|
+
const app = new index_1.default();
|
9
|
+
app.post("/calc", async (req, res) => {
|
10
|
+
const { op, ...numbers } = await req.getBody();
|
11
|
+
// Lấy tất cả giá trị số từ body
|
12
|
+
const values = Object.values(numbers)
|
13
|
+
.map(Number)
|
14
|
+
.filter((v) => !isNaN(v));
|
15
|
+
if (values.length < 2) {
|
16
|
+
return res.status(400).json({
|
17
|
+
statusCode: 400,
|
18
|
+
success: false,
|
19
|
+
message: "Need at least two numeric values",
|
20
|
+
});
|
21
|
+
}
|
22
|
+
let result;
|
23
|
+
try {
|
24
|
+
switch (op) {
|
25
|
+
case "sum":
|
26
|
+
result = (0, utils_1.sum)(...values);
|
27
|
+
break;
|
28
|
+
case "sub":
|
29
|
+
result = (0, utils_1.sub)(...values);
|
30
|
+
break;
|
31
|
+
case "mul":
|
32
|
+
result = (0, utils_1.mul)(...values);
|
33
|
+
break;
|
34
|
+
case "div":
|
35
|
+
result = (0, utils_1.div)(...values);
|
36
|
+
break;
|
37
|
+
default:
|
38
|
+
return res.status(400).json({
|
39
|
+
statusCode: 400,
|
40
|
+
success: false,
|
41
|
+
message: "Invalid operator",
|
42
|
+
});
|
43
|
+
}
|
44
|
+
return res.status(200).json({
|
45
|
+
statusCode: 200,
|
46
|
+
success: true,
|
47
|
+
result,
|
48
|
+
});
|
49
|
+
}
|
50
|
+
catch (err) {
|
51
|
+
return res.status(500).json({
|
52
|
+
statusCode: 500,
|
53
|
+
success: false,
|
54
|
+
message: err.message,
|
55
|
+
});
|
56
|
+
}
|
57
|
+
});
|
58
|
+
// Các route cơ bản
|
59
|
+
app.get("/", (req, res) => res.status(200).json({ success: true, status: 200, result: "GET / OK" }));
|
60
|
+
app.put("/", (req, res) => res.status(200).json({ success: true, status: 200, result: "PUT / OK" }));
|
61
|
+
app.post("/", (req, res) => res.status(200).json({ success: true, status: 200, result: "POST / OK" }));
|
62
|
+
app.patch("/", (req, res) => res.status(200).json({ success: true, status: 200, result: "PATCH / OK" }));
|
63
|
+
app.delete("/", (req, res) => res.status(200).json({ success: true, status: 200, result: "DELETE / OK" }));
|
64
|
+
const mathRoute = (op) => async (req, res) => {
|
65
|
+
const { a, b } = await req.getBody();
|
66
|
+
if (typeof a !== "number" || typeof b !== "number") {
|
67
|
+
return res.status(400).json({
|
68
|
+
success: false,
|
69
|
+
status: 400,
|
70
|
+
result: "Invalid input. 'a' and 'b' must be numbers.",
|
71
|
+
});
|
72
|
+
}
|
73
|
+
try {
|
74
|
+
const result = op(a, b);
|
75
|
+
res.status(200).json({ success: true, status: 200, result });
|
76
|
+
}
|
77
|
+
catch (err) {
|
78
|
+
res
|
79
|
+
.status(500)
|
80
|
+
.json({ success: false, status: 500, result: err.message });
|
81
|
+
}
|
82
|
+
};
|
83
|
+
// Math operations
|
84
|
+
app.post("/sum", mathRoute(utils_1.sum));
|
85
|
+
app.post("/sub", mathRoute(utils_1.sub));
|
86
|
+
app.post("/mul", mathRoute(utils_1.mul));
|
87
|
+
app.post("/div", async (req, res) => {
|
88
|
+
const { a, b } = await req.getBody();
|
89
|
+
if (typeof a !== "number" || typeof b !== "number") {
|
90
|
+
return res.status(400).json({
|
91
|
+
success: false,
|
92
|
+
status: 400,
|
93
|
+
result: "Invalid input. 'a' and 'b' must be numbers.",
|
94
|
+
});
|
95
|
+
}
|
96
|
+
if (b === 0) {
|
97
|
+
return res
|
98
|
+
.status(400)
|
99
|
+
.json({ success: false, status: 400, result: "Cannot divide by zero" });
|
100
|
+
}
|
101
|
+
const result = (0, utils_1.div)(a, b);
|
102
|
+
res.status(200).json({ success: true, status: 200, result });
|
103
|
+
});
|
104
|
+
app.listen(3000, () => {
|
105
|
+
console.log("✅ Server is running at http://localhost:3000");
|
106
|
+
});
|
package/src/test.ts
CHANGED
@@ -3,35 +3,56 @@ import { sum, sub, mul, div } from "@gieo/utils";
|
|
3
3
|
const app = new ExpressPlus();
|
4
4
|
|
5
5
|
app.post("/calc", async (req, res) => {
|
6
|
-
const {
|
6
|
+
const { op, ...numbers } = await req.getBody();
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
case "div":
|
20
|
-
result = div(a, b);
|
21
|
-
break;
|
22
|
-
default:
|
23
|
-
return res.status(400).json({
|
24
|
-
statusCode: 400,
|
25
|
-
success: false,
|
26
|
-
message: "Invalid operator",
|
27
|
-
});
|
8
|
+
// Lấy tất cả giá trị số từ body
|
9
|
+
const values = Object.values(numbers)
|
10
|
+
.map(Number)
|
11
|
+
.filter((v) => !isNaN(v));
|
12
|
+
|
13
|
+
if (values.length < 2) {
|
14
|
+
return res.status(400).json({
|
15
|
+
statusCode: 400,
|
16
|
+
success: false,
|
17
|
+
message: "Need at least two numeric values",
|
18
|
+
});
|
28
19
|
}
|
29
20
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
21
|
+
let result: number;
|
22
|
+
try {
|
23
|
+
switch (op) {
|
24
|
+
case "sum":
|
25
|
+
result = sum(...values);
|
26
|
+
break;
|
27
|
+
case "sub":
|
28
|
+
result = sub(...values);
|
29
|
+
break;
|
30
|
+
case "mul":
|
31
|
+
result = mul(...values);
|
32
|
+
break;
|
33
|
+
case "div":
|
34
|
+
result = div(...values);
|
35
|
+
break;
|
36
|
+
default:
|
37
|
+
return res.status(400).json({
|
38
|
+
statusCode: 400,
|
39
|
+
success: false,
|
40
|
+
message: "Invalid operator",
|
41
|
+
});
|
42
|
+
}
|
43
|
+
|
44
|
+
return res.status(200).json({
|
45
|
+
statusCode: 200,
|
46
|
+
success: true,
|
47
|
+
result,
|
48
|
+
});
|
49
|
+
} catch (err: any) {
|
50
|
+
return res.status(500).json({
|
51
|
+
statusCode: 500,
|
52
|
+
success: false,
|
53
|
+
message: err.message,
|
54
|
+
});
|
55
|
+
}
|
35
56
|
});
|
36
57
|
|
37
58
|
// Các route cơ bản
|
package/tsconfig.json
CHANGED