diff options
author | Hayleigh Thompson <me@hayleigh.dev> | 2023-12-06 22:01:42 +0000 |
---|---|---|
committer | Hayleigh Thompson <me@hayleigh.dev> | 2023-12-06 22:01:42 +0000 |
commit | 507257ef238fa59687d33893596539a1ee546426 (patch) | |
tree | e3003a17627306def28693fde78697748c572391 /src/http.ffi.mjs | |
parent | 1231c522f4b85b8e1b224f8d14bba77166aa5c7e (diff) | |
download | lustre-507257ef238fa59687d33893596539a1ee546426.tar.gz lustre-507257ef238fa59687d33893596539a1ee546426.zip |
:sparkles: Create a simple preview server for trying out lustre.
Diffstat (limited to 'src/http.ffi.mjs')
-rw-r--r-- | src/http.ffi.mjs | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/http.ffi.mjs b/src/http.ffi.mjs new file mode 100644 index 0000000..56fd950 --- /dev/null +++ b/src/http.ffi.mjs @@ -0,0 +1,90 @@ +import { readFileSync } from "node:fs"; +import * as Fs from "node:fs/promises"; +import * as Http from "node:http"; +import * as Path from "node:path"; +import * as Process from "node:process"; + +const cwd = Process.cwd(); +const root = Path.join(cwd, "build/dev/javascript"); +const toml = readFileSync(Path.join(cwd, "gleam.toml"), "utf-8"); +const name = toml.match(/name *= *"(.+)"/)[1]; + +const html = `<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Lustre preview server</title> + + <script type="module"> + import { main } from "./${name}/${name}.mjs" + + document.addEventListener("DOMContentLoaded", () => { + main(); + }); + </script> +</head> +<body> + <div data-lustre-app></div> +</body> +</html>`; + +const server = Http.createServer((req, res) => { + switch (true) { + case req.url === "/": { + res.setHeader("Content-Type", "text/html"); + res.statusCode = 200; + res.end(html); + + break; + } + + case req.url.endsWith(".js"): + case req.url.endsWith(".mjs"): { + Fs.readFile(Path.join(root, req.url), "utf-8") + .then((src) => { + res.setHeader("Content-Type", "application/javascript"); + res.statusCode = 200; + res.end(src); + }) + .catch((err) => { + res.statusCode = 404; + res.end(err); + }); + + break; + } + + case req.url.endsWith(".css"): { + Fs.readFile(Path.join(root, req.url), "utf-8") + .then((src) => { + res.setHeader("Content-Type", "text/css"); + res.statusCode = 200; + res.end(src); + }) + .catch((err) => { + res.statusCode = 404; + res.end(err); + }); + + break; + } + + default: { + Fs.readFile(Path.join(root, req.url), "utf-8") + .then((src) => { + res.setHeader("Content-Type", "text/plain"); + res.statusCode = 200; + res.end(src); + }) + .catch((err) => { + res.statusCode = 404; + res.end(err); + }); + } + } +}); + +export const serve = (port) => { + server.listen(port, "localhost"); +}; |