lustre/ssg

Types

This type represents possible errors that can occur when building the site.

pub type BuildError {
  CannotCreateTempDirectory(reason: simplifile.FileError)
  CannotWriteStaticAsset(
    reason: simplifile.FileError,
    path: String,
  )
  CannotGenerateRoute(reason: simplifile.FileError, path: String)
  CannotWriteToOutputDir(reason: simplifile.FileError)
  CannotCleanupTempDir(reason: simplifile.FileError)
}

Constructors

  • CannotCreateTempDirectory(reason: simplifile.FileError)

    An error that can occur when trying to create a temporary directory to work in: when generating a static site, lustre_ssg first writes all the files in a temporary directory. After the generation is over, all the contents of the temporary directory are copied over to the actual output directory.

  • CannotWriteStaticAsset(
      reason: simplifile.FileError,
      path: String,
    )

    An error that can occur when trying to write a static asset to a given path.

  • CannotGenerateRoute(reason: simplifile.FileError, path: String)

    An error that can occur when trying to generate a route at a given path.

  • CannotWriteToOutputDir(reason: simplifile.FileError)

    An error that can occur when the building step is over and all generated documents are moved from the temporary directory to the actual output directory.

  • CannotCleanupTempDir(reason: simplifile.FileError)

    An error that can occur when trying to delete the temporary directory.

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 might 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 either HasStaticRoutes or NoStaticRoutes.

    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 either HasStaticDir or NoStaticDir.

    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 either UseDirectRoutes or UseIndexRoutes.

    As with has_static_dir, the build 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: Dict(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_asset(
  config: Config(a, b, c),
  path: String,
  content: String,
) -> Config(a, b, c)

Include a static asset in the generated site. This might be something you want to be generated at build time, like a robots.txt, a sitemap.xml, or an RSS feed.

The path should be the path that the asset will be available at when served by an HTTP server. For example, the path “/robots.txt” would be available at “https://your_site.com/robots.txt”. The path will be converted to kebab-case and lowercased.

If you have configured a static assets directory to be copied over, any static asset added here will overwrite any file with the same path.

pub fn add_static_dir(
  config: Config(a, NoStaticDir, b),
  path: String,
) -> Config(a, HasStaticDir, b)

Include a static directory from which all files will be copied over into the temporary build directory before building the site.

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 add_static_xml(
  config: Config(a, b, c),
  path: String,
  page: Element(d),
) -> Config(a, b, c)
pub fn build(
  config: Config(HasStaticRoutes, a, b),
) -> Result(Nil, BuildError)

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 before any routes are generated.

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”.

Search Document