From fdb4c7564d00a2442ff89816469d0e225f5b5c8d Mon Sep 17 00:00:00 2001 From: Endercheif Date: Fri, 29 Dec 2023 15:32:32 -0800 Subject: [PATCH] feat: quick cli for bundle and serve --- README.md | 24 +++++++++++++++++------- gleam.toml | 4 +++- src/esgleam/bundle.gleam | 9 +++++++++ src/esgleam/internal.gleam | 21 +++++++++++++++++++++ src/esgleam/serve.gleam | 10 ++++++++++ 5 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 src/esgleam/bundle.gleam create mode 100644 src/esgleam/serve.gleam diff --git a/README.md b/README.md index 4719266..874d0a2 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,28 @@ ## Quick start -1. Create a Gleam project as you would normally. +1. Create a Gleam project as you would normally and make sure you have a file in `src` with the name of your project (as specified in `gleam.toml`) 2. Install `esbuild` ```sh $ gleam run -m esgleam/install ``` +3. +```sh +$ gleam run -m esgleam/bundle +``` +See `/dist` for your bundled code + +4. To start a development server +```sh +$ gleam run -m esgleam/serve +``` + +## Advanced Usage + +(Follow steps 1-2) + 3. Create `/src/build.gleam` with the following ```gleam import esgleam @@ -27,12 +42,7 @@ pub fn main() { } ``` -4. Build for JavaScript -```sh -$ gleam build --target=javascript -``` - -5. Run your build script (in any target) +5. Run your build script ```sh $ gleam run -m build ``` diff --git a/gleam.toml b/gleam.toml index 4a1797a..551f92e 100644 --- a/gleam.toml +++ b/gleam.toml @@ -1,5 +1,5 @@ name = "esgleam" -version = "0.1.0" +version = "0.2.0" gleam = ">= 0.32.0" description = "esbuild for Gleam" @@ -7,6 +7,8 @@ licences = ["Apache-2.0"] repository = { type = "github", user = "Enderchief", repo = "esgleam" } # links = [{ title = "Website", href = "https://gleam.run" }] +target = "javascript" + [dependencies] gleam_stdlib = "~> 0.34" simplifile = "~> 1.1" diff --git a/src/esgleam/bundle.gleam b/src/esgleam/bundle.gleam new file mode 100644 index 0000000..88508df --- /dev/null +++ b/src/esgleam/bundle.gleam @@ -0,0 +1,9 @@ +import esgleam +import esgleam/internal + +/// Bundles using ESM to the `./dist` directory. +pub fn main() { + esgleam.new(outdir: "./dist") + |> esgleam.entry(internal.get_project_name() <> ".gleam") + |> esgleam.bundle +} diff --git a/src/esgleam/internal.gleam b/src/esgleam/internal.gleam index 8054117..08ed8e3 100644 --- a/src/esgleam/internal.gleam +++ b/src/esgleam/internal.gleam @@ -1,3 +1,8 @@ +import gleam/regex +import gleam/result +import gleam/list +import gleam/option.{type Option, Some} +import simplifile @target(javascript) import gleam/string @@ -34,3 +39,19 @@ pub fn exec_shell(command: String, cwd: String) -> Nil { |> os_cmd Nil } + +pub fn get_project_name() -> String { + let assert Ok(project_name) = + simplifile.read("./gleam.toml") + |> result.map(with: fn(file) { + let assert Ok(re) = regex.from_string("name *= *\"(\\w[\\w_]*)\"") + let assert Ok(match) = + regex.scan(re, file) + |> list.first + + let assert Ok(first_maybe) = list.first(match.submatches) + let assert Some(name): Option(String) = first_maybe + name + }) + project_name +} diff --git a/src/esgleam/serve.gleam b/src/esgleam/serve.gleam new file mode 100644 index 0000000..ab6d9de --- /dev/null +++ b/src/esgleam/serve.gleam @@ -0,0 +1,10 @@ +import esgleam +import esgleam/internal + +/// Serves the `/dist` directory as `/` on http://127.0.0.1:8000. +pub fn main() { + esgleam.new(outdir: "./dist") + |> esgleam.entry(internal.get_project_name() <> ".gleam") + |> esgleam.serve(dir: "./dist") + |> esgleam.bundle +}