Rewrites JavaScript import and require specifiers while collecting resolved paths.
@type rewrite_fun() :: (String.t(), String.t(), term() -> rewrite_result())
@type rewrite_result() :: :skip | {:ok, String.t() | nil, String.t()} | {:error, term()}
@spec rewrite(String.t(), String.t(), term(), rewrite_fun()) :: {:ok, String.t(), [String.t()]} | {:error, term()}