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):
- analyze_commits: highest
ReleaseTypeacross plugins wins - generate_notes: results are concatenated in plugin order
- publish:
Some(release)published,Nonemeans “not handled” - others: run for effect; failure aborts the pipeline
Types
pub type AddChannel =
fn(config.PluginSpec, context.Context) -> Result(
option.Option(release.Release),
error.ReleaseError,
)
pub type AnalyzeCommits =
fn(config.PluginSpec, context.Context) -> Result(
option.Option(semver.ReleaseType),
error.ReleaseError,
)
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
-
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, ), ), )
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,
)