Skip to content

Bazel rules for building web applications written in Elm

License

Notifications You must be signed in to change notification settings

kczulko/rules_elm

Repository files navigation

Bazel build rules for Elm

CI osx_amd64 osx_amd64 osx_amd64

Elm is a functional programming language that can be transpiled to Javascript. This repository contains rules for building Elm applications using the Bazel build system. These rules depend on their own copy of the Elm compiler, meaning that Elm and any libraries used may be versioned as part of your Bazel project.

Adding these rules to your project

Check the releases for detailed instructions.

Examples on how to use these rules

  • examples directory - contains several 'end to end' projects consuming the rules provided by this repository.
  • The Bazel Elm SPA Example repository - contains a concrete example of how these rules may be used to build a web application written in Elm. Might be a bit out of date, however this example brings a copy of a well-known demonstration application that has been adjusted to be buildable using Bazel.

Build rules provided by this project

elm_binary()

load("@rules_elm//elm:defs.bzl", "elm_binary")

elm_binary(name, main, deps, visibility)

Purpose: transpile an Elm application to Javascript. The resulting Javascript file will be named ${name}.js.

  • main: The name of the source file containing the Program.
  • deps: List of elm_library() and elm_package() targets on which the application depends.

Note: When the compilation mode (-c) is equal to dbg, the resulting Javascript file will have the time traveling debugger enabled. When the compilation mode is opt, optimizations are performed and the resulting code is minified using UglifyJS.

elm_library()

load("@rules_elm//elm:defs.bzl", "elm_library")

elm_library(name, srcs, deps, strip_import_prefix, visibility)

Purpose: declare a collection of Elm source files that can be reused by multiple elm_binary()s.

  • srcs: List of source files to package together.
  • deps: List of elm_library() and elm_package() targets on which the library depends.
  • strip_import_prefix: Workspace root relative path prefix that should be removed from pathname resolution. For example, if the source file my/project/Foo/Bar.elm contains module Foo.Bar, strip_import_prefix should be set to my/project for module resolution to work.

elm_package()

load("@rules_elm//elm:defs.bzl", "elm_package")

elm_package(name, package_name, package_version, srcs, deps, visibility)

Purpose: make an off-the-shelf Elm package usable as a dependency.

  • package_name: The publicly used name of the package (e.g., elm/json).
  • package_version: The version of the package (e.g., 1.0.2).
  • srcs: Files that are part of this package. This list SHOULD include "elm.json".
  • deps: List of packages on which this package depends.

Note: This function is typically not used directly; it is often sufficient to use elm_repository().

elm_proto_library()

load("@rules_elm//proto:defs.bzl", "elm_proto_library")

elm_proto_library(name, proto, deps, plugin_opt_json, plugin_opt_grpc, visibility)

Purpose: generate Elm bindings for Protocol Buffers definitions using protoc-gen-elm and package them as an elm_library().

  • proto: The proto_library() that should be converted to Elm.
  • deps: Elm deps required to compile generated code.
  • plugin_opt_json: One of {json, json=encode, json=decode}, see protoc-gen-elm docs
  • plugin_opt_grpc: One of {grpc, grpc=false, grpc=true}, see protoc-gen-elm docs
  • plugin_opt_grpc_dev: Optional attr which can take following value: grpcDevTools, see protoc-gen-elm docs

Note: This function is implemented using Bazel aspects, meaning that it automatically instantiates build rules for all transitive dependencies of the proto_library() and sets up dependencies between them accordingly.

elm_test()

load("@rules_elm//elm:def.bzl", "elm_test")

elm_test(name, main, deps, visibility)

Purpose: compile an Elm testing application to Javascript and execute it using Node.js.

  • main: The name of the source file containing one or more Tests
  • deps: List of elm_library() and elm_package() targets on which the testing application depends.

Repository rules provided by this project

elm_repository()

load("@rules_elm//repository:defs.bzl", "elm_repository")

elm_repository(name, urls, sha256, strip_prefix, patches)

Purpose: download an Elm package over HTTP, extract it and create a BUILD.bazel file containing either an elm_package() or elm_library() declaration. For elm/* and elm-explorations/* an elm_package() is used. For others, elm_library() is used to prevent the Elm compiler from returning hard to debug dependency management related errors.

  • urls: List of URLs where the package tarball may be downloaded.
  • sha256: SHA-256 checksum of the tarball.
  • strip_prefix: Directory prefix that may be removed from the files upon extraction.
  • patches: List of labels of patches to apply after extraction.