version_bump/plugin

The plugin contract — the extensibility surface of the whole tool.

semantic-release plugins are JS modules that duck-type which lifecycle hooks they implement. Gleam has no dynamic dispatch, so a plugin is a record of optional hook functions. A plugin implements a hook by setting that field to Some(fn); the engine skips None fields.

Per-hook return semantics (enforced by the engine, not plugins):

Types

pub type Fail =
  fn(config.PluginSpec, context.Context) -> Result(
    Nil,
    error.ReleaseError,
  )
pub type GenerateNotes =
  fn(config.PluginSpec, context.Context) -> Result(
    String,
    error.ReleaseError,
  )
pub type Plugin {
  Plugin(
    name: String,
    verify_conditions: option.Option(
      fn(config.PluginSpec, context.Context) -> Result(
        Nil,
        error.ReleaseError,
      ),
    ),
    analyze_commits: option.Option(
      fn(config.PluginSpec, context.Context) -> Result(
        option.Option(semver.ReleaseType),
        error.ReleaseError,
      ),
    ),
    verify_release: option.Option(
      fn(config.PluginSpec, context.Context) -> Result(
        Nil,
        error.ReleaseError,
      ),
    ),
    generate_notes: option.Option(
      fn(config.PluginSpec, context.Context) -> Result(
        String,
        error.ReleaseError,
      ),
    ),
    add_channel: option.Option(
      fn(config.PluginSpec, context.Context) -> Result(
        option.Option(release.Release),
        error.ReleaseError,
      ),
    ),
    prepare: option.Option(
      fn(config.PluginSpec, context.Context) -> Result(
        Nil,
        error.ReleaseError,
      ),
    ),
    publish: option.Option(
      fn(config.PluginSpec, context.Context) -> task.Task(
        Result(option.Option(release.Release), error.ReleaseError),
      ),
    ),
    success: option.Option(
      fn(config.PluginSpec, context.Context) -> Result(
        Nil,
        error.ReleaseError,
      ),
    ),
    fail: option.Option(
      fn(config.PluginSpec, context.Context) -> Result(
        Nil,
        error.ReleaseError,
      ),
    ),
  )
}

Constructors

pub type Prepare =
  fn(config.PluginSpec, context.Context) -> Result(
    Nil,
    error.ReleaseError,
  )

publish is asynchronous (it may perform network I/O), so it returns a Task. On the Erlang target the task is synchronous; on JavaScript it is a promise. See bump/task.

pub type Publish =
  fn(config.PluginSpec, context.Context) -> task.Task(
    Result(option.Option(release.Release), error.ReleaseError),
  )
pub type Success =
  fn(config.PluginSpec, context.Context) -> Result(
    Nil,
    error.ReleaseError,
  )
pub type VerifyConditions =
  fn(config.PluginSpec, context.Context) -> Result(
    Nil,
    error.ReleaseError,
  )
pub type VerifyRelease =
  fn(config.PluginSpec, context.Context) -> Result(
    Nil,
    error.ReleaseError,
  )

Values

pub fn new(name: String) -> Plugin

A plugin implementing no hooks. Build concrete plugins with record updates, e.g. Plugin(..new("npm"), publish: Some(do_publish)).

Search Document