first commit
This commit is contained in:
commit
110c3ddb0e
17
package.json
Normal file
17
package.json
Normal file
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"name": "flumm-express",
|
||||
"version": "1.0.0",
|
||||
"description": "Express für arme",
|
||||
"main": "src/index.mjs",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git@github.com:kein-Bot/flummpress.git"
|
||||
},
|
||||
"scripts": {},
|
||||
"author": "Flummi",
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/kein-Bot/flummpress/issues"
|
||||
},
|
||||
"homepage": "https://github.com/kein-Bot/flummpress#readme"
|
||||
}
|
37
src/index.mjs
Normal file
37
src/index.mjs
Normal file
|
@ -0,0 +1,37 @@
|
|||
import http from "http";
|
||||
import path from "path";
|
||||
import url from "url";
|
||||
import querystring from "querystring";
|
||||
|
||||
import router from "./router.mjs";
|
||||
import views from "./views.mjs";
|
||||
|
||||
export default class flummpress {
|
||||
constructor(opts) {
|
||||
this.Router = router;
|
||||
this.views = views;
|
||||
this.opts = { ...{
|
||||
views: path.resolve() + "/src/views",
|
||||
routes: path.resolve() + "/src/routes"
|
||||
}, ...opts };
|
||||
return (async () => {
|
||||
await router.loadRoutes(this.opts.routes);
|
||||
await views.loadViews(this.opts.views);
|
||||
return this;
|
||||
})();
|
||||
}
|
||||
listen(...args) {
|
||||
return http.createServer((req, res, r) => {
|
||||
req.url = url.parse(req.url.replace(/(?!^.)(\/+)?%/, ''));
|
||||
req.url.qs = querystring.parse(req.url.query);
|
||||
|
||||
req.post = new Promise((resolve, _, data = "") => req
|
||||
.on("data", d => void (data += d))
|
||||
.on("end", () => void resolve(Object.fromEntries(Object.entries(querystring.parse(data)).map(([k, v]) => [k, decodeURIComponent(v)])))));
|
||||
|
||||
console.log(`[${(new Date()).toLocaleTimeString()}] ${req.method} ${req.url.pathname}`);
|
||||
|
||||
!(r = router.routes.getRegex(req.url.pathname, req.method)) ? res.writeHead(404).end(`404 - ${req.url.pathname}`) : r(req, res);
|
||||
}).listen(...args);
|
||||
}
|
||||
};
|
28
src/router.mjs
Normal file
28
src/router.mjs
Normal file
|
@ -0,0 +1,28 @@
|
|||
import { promises as fs } from "fs";
|
||||
|
||||
export default new class {
|
||||
constructor() {
|
||||
this.routes = new Map();
|
||||
}
|
||||
async loadRoutes(path) {
|
||||
await Promise.all(
|
||||
(await fs.readdir(path))
|
||||
.filter(f => f.endsWith(".mjs"))
|
||||
.map(async route => await import(`${path}/${route}`))
|
||||
);
|
||||
}
|
||||
route(method, args) {
|
||||
this.routes.set(args[0], { method: method, f: args[1] });
|
||||
console.log("route set", method, args[0]);
|
||||
}
|
||||
get() {
|
||||
this.route("GET", arguments);
|
||||
}
|
||||
post() {
|
||||
this.route("POST", arguments);
|
||||
}
|
||||
};
|
||||
|
||||
Map.prototype.getRegex = function(path, method) {
|
||||
return [...this.entries()].filter(r => r[0].exec(path) && r[1].method.includes(method))[0]?.[1].f;
|
||||
};
|
15
src/views.mjs
Normal file
15
src/views.mjs
Normal file
|
@ -0,0 +1,15 @@
|
|||
import { promises as fs } from "fs";
|
||||
|
||||
export default new class {
|
||||
constructor() {
|
||||
this.views = new Map();
|
||||
}
|
||||
get(view) {
|
||||
return this.views.get(view) || false;
|
||||
}
|
||||
async loadViews(path) {
|
||||
(await fs.readdir(path))
|
||||
.filter(view => view.endsWith(".html"))
|
||||
.forEach(async view => this.views.set(view.slice(0, -5), await fs.readFile(`${path}/${view}`)));
|
||||
}
|
||||
};
|
Loading…
Reference in New Issue
Block a user