diff options
author | Hayleigh Thompson <me@hayleigh.dev> | 2024-02-13 21:13:57 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-13 21:13:57 +0000 |
commit | 1be73ee8d2206a7f1520257d81c8a5a4f3cc195e (patch) | |
tree | c18785b9eac4612277ab70be164476ebd95a7303 /src/http_ffi.erl | |
parent | 7960593c4feee21b65171afa220c2b32b43dd788 (diff) | |
download | lustre-1be73ee8d2206a7f1520257d81c8a5a4f3cc195e.tar.gz lustre-1be73ee8d2206a7f1520257d81c8a5a4f3cc195e.zip |
🚧 Begin working on CLI things. (#45)
* :recycle: Rename http ffi to lustre_try_ffi.
* :wrench: Add any files under lustre/cli as internal modules.
* :recyle: Move lustre/try command into cli subdirectory.
* :heavy_plus_sign: Add justin, simplifile, and tom as dependencies.
* :sparkles: Write a 'lustre add' command for downloading esbuild.
* :construction: Begin work on a 'lustre build' command for bundling apps and components.
* :sparkles: Add 'main' function as CLI entrypoint to lustre.
* :bug: Fix `no-styles` flag's name
* :bug: Use consistent path for error reporting in lustre add
* :construction: Project module
* :truck: Move esbuild functions to their own module
* :construction: Use a temporary file to bundle components
* :construction: Build app and update to glint rc
* :heavy_plus_sign: Add filepath dependency
* :bug: Fix wrong paths in esbuild code
---------
Co-authored-by: Giacomo Cavalieri <giacomo.cavalieri@icloud.com>
Diffstat (limited to 'src/http_ffi.erl')
-rw-r--r-- | src/http_ffi.erl | 117 |
1 files changed, 0 insertions, 117 deletions
diff --git a/src/http_ffi.erl b/src/http_ffi.erl deleted file mode 100644 index 1261b13..0000000 --- a/src/http_ffi.erl +++ /dev/null @@ -1,117 +0,0 @@ --module(http_ffi). --export([exec/1, serve/3, response_default_headers/0]). - -exec(Command) -> - os:cmd(binary_to_list(Command)). - -serve({options, Host, Port, IncludeStyles}, OnStart, OnPortTaken) -> - {ok, Pattern} = re:compile("name *= *\"(?<Name>.+)\""), - {ok, Toml} = file:read_file("gleam.toml"), - {match, [Name]} = re:run(Toml, Pattern, [{capture, all_names, binary}]), - - Html = - << - "<!DOCTYPE html>\n" - "<html lang=\"en\">\n" - "<head>\n" - " <meta charset=\"UTF-8\">\n" - " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n" - " <title>Lustre preview server</title>\n", - case IncludeStyles of - true -> - <<" <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/gh/lustre-labs/ui/priv/styles.css\">\n">>; - false -> - <<"">> - end/binary, - " <script type=\"module\">\n" - " import { main } from './", - Name/binary, - "/", - Name/binary, - ".mjs'\n" - "\n" - " document.addEventListener(\"DOMContentLoaded\", () => {\n" - " main();\n" - " });\n" - " </script>\n" - "</head>\n" - "<body>\n" - " <div id=\"app\"></div>\n" - "</body>\n" - "</html>" - >>, - - file:write_file("build/dev/javascript/index.html", Html), - - AbsPath = - string:trim( - filename:absname("build/dev/javascript"), trailing, "/." - ), - - inets:start(), - Address = {127, 0, 0, 1}, - - ActualPort = - case port_available(Port) of - true -> - Port; - false -> - OnPortTaken(Port), - first_available_port(Port + 1) - end, - - {ok, Pid} = - httpd:start_service([ - {bind_address, Address}, - {document_root, AbsPath}, - {server_root, AbsPath}, - {directory_index, ["index.html"]}, - {server_name, binary_to_list(Host)}, - {port, ActualPort}, - {default_type, "text/html"}, - {mime_types, mime_types()}, - {customize, ?MODULE}, - {modules, [mod_alias, mod_dir, mod_get]} - ]), - - OnStart(ActualPort), - - receive - {From, shutdown} -> - ok = httpd:stop_service(Pid), - From ! done - end. - -port_available(Port) -> - case gen_tcp:listen(Port, []) of - {ok, Sock} -> - ok = gen_tcp:close(Sock), - true; - _ -> - false - end. - -first_available_port(Port) -> - case port_available(Port) of - true -> Port; - false -> first_available_port(Port + 1) - end. - -mime_types() -> - [ - {"html", "text/html"}, - {"htm", "text/html"}, - {"js", "text/javascript"}, - {"mjs", "text/javascript"}, - {"css", "text/css"}, - {"gif", "image/gif"}, - {"jpg", "image/jpeg"}, - {"jpeg", "image/jpeg"}, - {"png", "image/png"} - ]. - -response_default_headers() -> - [ - {"cache-control", "no-store, no-cache, must-revalidate, private"}, - {"pragma", "no-cache"} - ]. |