An even more educational version of the Bandolier for Learn JS the Hard Way.
https://learnjsthehardway.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
2.7 KiB
106 lines
2.7 KiB
import Fastify from "fastify";
|
|
import { restartable } from "@fastify/restartable";
|
|
import FastifyStatic from "@fastify/static";
|
|
import Formbody from "@fastify/formbody";
|
|
import path from "path";
|
|
import fs from "fs";
|
|
import chokidar from "chokidar";
|
|
import nunjucks from "nunjucks";
|
|
import fg from "fast-glob";
|
|
|
|
export const description = "Runs your app.";
|
|
|
|
export const options = [];
|
|
|
|
export const required = [];
|
|
|
|
let CONFIGURED = false;
|
|
|
|
// nunjucks does it's own reload so let it do that
|
|
nunjucks.configure("pages", { watch: true });
|
|
|
|
const load_mode = async (mod) => {
|
|
const control_mod = await import(`../${mod}?update=${Date.now()}`);
|
|
const pf = path.parse(mod);
|
|
const url = `/${pf.name}`;
|
|
|
|
console.log("URL IS", url);
|
|
|
|
for(let verb of ["get", "post", "put", "delete"]) {
|
|
const handler = control_mod[verb];
|
|
|
|
if(handler !== undefined) {
|
|
console.log("ADDING VERB", verb);
|
|
app[verb](url, async (req, rep) => {
|
|
try {
|
|
await handler(req, rep);
|
|
} catch(error) {
|
|
console.error(error);
|
|
console.error(error.stack);
|
|
console.error(error.source);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
const configure = async (fastify, opts) => {
|
|
const app = fastify(opts);
|
|
|
|
// forces reload of the modules
|
|
for(let mod of fg.sync("{api,controllers}/*.js")) {
|
|
load_mode(mod);
|
|
}
|
|
|
|
app.register(Formbody);
|
|
|
|
app.get("/*", (req, rep) => {
|
|
const target = path.resolve(path.join("pages", req.url));
|
|
const index = path.resolve(path.join("pages", req.url, "index.html"));
|
|
console.log("TARGET", target, "INDEX", index);
|
|
|
|
if(fs.existsSync(index)) {
|
|
const fname = path.join(req.url.slice(1), "index.html");
|
|
console.log("RENDERING", fname);
|
|
const result = nunjucks.render(fname);
|
|
rep.code(200).type("text/html").send(result);
|
|
} else if(fs.existsSync(target)) {
|
|
const fname = req.url.slice(1);
|
|
const result = nunjucks.render(fname);
|
|
rep.code(200).type("text/html").send(result);
|
|
} else {
|
|
rep.code(404);
|
|
}
|
|
});
|
|
|
|
app.register(FastifyStatic, {
|
|
root: path.join(path.resolve("."), 'static'),
|
|
prefix: '/static',
|
|
constraints: {},
|
|
index: "index.html"
|
|
});
|
|
|
|
return app;
|
|
}
|
|
|
|
const app = await await restartable(configure, { logger: true});
|
|
const host = await app.listen({port: 3000});
|
|
|
|
const reload = () => {
|
|
if(CONFIGURED) {
|
|
app.restart();
|
|
}
|
|
}
|
|
|
|
export const main = async (arg, opts) => {
|
|
try {
|
|
chokidar.watch(["lib","commands","controllers","static","migrations","tests"])
|
|
.on("add", path => reload())
|
|
.on("change", path => reload())
|
|
.on("unlink", path => reload())
|
|
.on("ready", () => CONFIGURED = true);
|
|
} catch(err) {
|
|
fastify.log.error(err);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|