defmodule NPM.Install.Hooks do @moduledoc """ Hooks for integrating npm operations with Mix workflows. Provides callbacks that can be triggered before and after npm operations, useful for mix compiler integration and build pipelines. """ @type hook :: :pre_install | :post_install | :pre_resolve | :post_resolve @doc """ Run a hook callback if configured. Hooks are configured via application config: config :duskmoon_npm, hooks: %{ post_install: {MyApp, :on_npm_install, []} } """ @spec run(hook(), keyword()) :: :ok def run(hook, context \\ []) do case get_hook(hook) do nil -> :ok {mod, fun, extra_args} -> apply(mod, fun, [context | extra_args]) fun when is_function(fun, 1) -> fun.(context) end :ok end @doc """ List all configured hooks. """ @spec configured :: %{hook() => term()} def configured do Application.get_env(:duskmoon_npm, :hooks, %{}) end @doc """ Check if a hook is configured. """ @spec configured?(hook()) :: boolean() def configured?(hook) do Map.has_key?(configured(), hook) end @doc """ Available hook points. """ @spec available :: [hook()] def available do [:pre_install, :post_install, :pre_resolve, :post_resolve] end defp get_hook(hook) do Map.get(configured(), hook) end end