lustre/ssg
Types
The Config
type tells lustre_ssg
how to generate your site. It includes
things like the output directory and any routes you have configured.
The type parameters are used to track different facts about the configuration and prevent silly things from happening like building a site with no guaranteed routes.
If you’re looking at the generated documentation on hex.pm, these type parameters will be unhelpfully labelled “a”, “b”, “c”, etc. Here’s a look at what these type parameters are called in the source code:
pub opaque type Config(
has_static_routes,
has_static_dir,
use_index_routes
)
-
has_static_routes
indicates whether or not the configuration has at least one static route and so is guarnateed to generate at least one HTML file. It will be eitherHasStaticRoutes
orNoStaticRoutes
.You need to add at least one static route before you can build your site using
build
. This is to prevent you from providing empty dynamic routes and accidentally building nothing. -
has_static_dir
indicates whether or not the configuration has a static assets directory to copy. It will be eitherHasStaticDir
orNoStaticDir
.The
build
function will run regardless, but you may choose to wrap this function yourself to provider stricter compile-time guarantees if you want to ensure that your static assets are always configured. -
use_index_routes
indicates whether or not the configuration will generate HTML files that correspond directly to the route provided or if an index.html file will be generated at the route provided. It will be eitherUseDirectRoutes
orUseIndexRoutes
.As with
has_static_dir
, thebuild
function will run regardless, but you may use this parameter for stricter compile-time guarantees.
pub opaque type Config(has_static_routes, has_static_dir, use_index_routes)
This type is used to tag the Config
through the different builder functions.
It indicates a configuration that has a static assets directory to copy.
pub type HasStaticDir
This type is used to tag the Config
through the different builder functions.
It indicates a configuration that will generate least one static route.
pub type HasStaticRoutes
This type is used to tag the Config
through the different builder functions.
It indicates a configuration that does not have a statica ssets directory to
copy.
pub type NoStaticDir
This type is used to tag the Config
through the different builder functions.
It indicates a configuration that will not generate any static routes.
Your configuration must have at least one static route before it can be passed
to build
. This is to prevent you from accidentally building a completely
empty site.
pub type NoStaticRoutes
This type is used to tag the Config
through the different builder functions.
It indicates a configuration that will generate HTML files that correspond
directly to the route provided, for example the route “/blog” will generate
a file at “/blog.html”.
pub type UseDirectRoutes
This type is used to tag the Config
through the different builder functions.
It indicates a configuration that will generate an index.html
file at the
route provided, for example the route “/blog” will generate a file at
“/blog/index.html”.
pub type UseIndexRoutes
Functions
pub fn add_dynamic_route(config: Config(a, b, c), path: String, data: Map(
String,
d,
), page: fn(d) -> Element(e)) -> Config(a, b, c)
Configure a map of dynamic routes to be generated. As with add_static_route
the base path should be the route that each page will be available at when
served by a HTTP server.
The initial path is the base for all dynamic routes to be generated. The
keys of the data
map will be used to generate the dynamic routes. For
example, to generate dynamic routes for a blog where each page is a post
with the route “/blog/:post” you might do:
let posts = [
#("hello-world", Post(...)),
#("why-lustre-is-great", Post(...)),
]
...
ssg.config("./dist")
|> ...
|> ssg.add_dynamic_route("/blog", posts, render_post)
Paths are converted to kebab-case and lowercased. This means that the path “/Blog” will be available at “/blog” and and “/About me” will be available at “/about-me”.
pub fn add_static_dir(config: Config(a, NoStaticDir, b), path: String) -> Config(
a,
HasStaticDir,
b,
)
pub fn add_static_route(config: Config(a, b, c), path: String, page: Element(
d,
)) -> Config(HasStaticRoutes, b, c)
Configure a static route to be generated. The path should be the route that the page will be available at when served by a HTTP server. For example the path “/blog” would be available at “https://your_site.com/blog”.
You need to add at least one static route before you can build your site. This is to prevent you from providing empty dynamic routes and accidentally building nothing.
Paths are converted to kebab-case and lowercased. This means that the path “/Blog” will be available at “/blog” and and “/About me” will be available at “/about-me”.
pub fn build(config: Config(HasStaticRoutes, a, b)) -> Nil
Generate the static site. This will delete the output directory if it already exists and then generate all of the routes configured. If a static assets directory has been configured, its contents will be recursively copied into the output directory.
pub fn new(out_dir: String) -> Config(
NoStaticRoutes,
NoStaticDir,
UseDirectRoutes,
)
Initialise a new configuration for the static site generator. If you pass a relative path it will be resolved relative to the current working directory, not the directory of the Gleam file.
pub fn use_index_routes(config: Config(a, b, c)) -> Config(
a,
b,
UseIndexRoutes,
)
Configure the static site generator to generate an index.html
file at any
static route provided. For example, the route “/blog” will generate a file
at “/blog/index.html”.