Files
self 8fa8b5c10a feat: emit namespaced plugin manifests
Generate canonical plugin ids, slugs, display names, vendor-prefixed OTP apps, and fully-qualified capability ids in new plugin projects.
2026-05-27 19:05:01 +02:00

50 lines
1.3 KiB
Elixir

defmodule TribesPlugin.Options do
@moduledoc false
@capability_regex ~r/\A[a-z][a-z0-9_-]*(\.[a-z][a-z0-9_-]*)+@[1-9][0-9]*\z/
def parse_capabilities(value) when value in [nil, ""], do: []
def parse_capabilities(value) when is_binary(value) do
value
|> String.split(",", trim: true)
|> Enum.map(&String.trim/1)
|> Enum.reject(&(&1 == ""))
|> Enum.map(&validate_capability!/1)
end
def parse_capabilities(values) when is_list(values) do
values
|> Enum.flat_map(&parse_capabilities/1)
|> Enum.uniq()
end
def with_default_requires(opts) do
live_view? = Keyword.get(opts, :live_view?, true)
requires =
opts
|> Keyword.get(:requires, [])
|> parse_capabilities()
|> maybe_ensure_ui(live_view?)
Keyword.put(opts, :requires, requires)
end
defp maybe_ensure_ui(requires, true), do: ensure_capability(requires, "org.tribe-one.caps.ui@1")
defp maybe_ensure_ui(requires, false), do: requires
defp ensure_capability(caps, cap) do
if cap in caps, do: caps, else: caps ++ [cap]
end
defp validate_capability!(value) do
if Regex.match?(@capability_regex, value) do
value
else
raise ArgumentError,
"capability must be fully-qualified name@version, got: #{inspect(value)}"
end
end
end