# `Volt.JS.Transforms.Imports`
[🔗](https://github.com/elixir-volt/volt/blob/v0.23.0/lib/volt/js/transforms/imports.ex#L1)

Rewrite import specifiers in compiled JS output using AST positions.

Turns bare specifiers (`'vue'`) into dev server paths (`'/@vendor/vue.js'`)
and resolves relative imports to absolute URL paths. Uses `OXC.postwalk/3`
to find import nodes and `OXC.patch_string/2` to splice replacements
at exact byte offsets — no regex, no reformatting.

# `rewrite`

```elixir
@spec rewrite(String.t(), String.t(), (String.t() -&gt; {:rewrite, String.t()} | :keep)) ::
  {:ok, String.t()} | {:error, term()}
```

Rewrite import specifiers in JavaScript source code.

The `rewrite_fn` receives each import specifier string and returns
either `{:rewrite, new_specifier}` or `:keep`.

## Examples

    iex> source = "import { ref } from 'vue'\nimport a from './utils'"
    iex> Volt.JS.Transforms.Imports.rewrite(source, "test.ts", fn
    ...>   "vue" -> {:rewrite, "/@vendor/vue.js"}
    ...>   _ -> :keep
    ...> end)
    {:ok, "import { ref } from \"/@vendor/vue.js\"\nimport a from './utils'"}

# `rewrite!`

```elixir
@spec rewrite!(String.t(), String.t(), (String.t() -&gt; {:rewrite, String.t()} | :keep)) ::
  String.t()
```

Like `rewrite/3` but raises on errors.

# `rewrite_map`

```elixir
@spec rewrite_map(String.t(), String.t(), %{required(String.t()) =&gt; String.t()}) ::
  {:ok, String.t()} | {:error, term()}
```

Rewrite import specifiers using a map of `old → new`.

Convenience wrapper around `rewrite/3` for static rewrites.

## Examples

    iex> source = "import { ref } from 'vue'\nimport { h } from 'preact'"
    iex> Volt.JS.Transforms.Imports.rewrite_map(source, "test.ts", %{
    ...>   "vue" => "/@vendor/vue.js",
    ...>   "preact" => "/@vendor/preact.js"
    ...> })
    {:ok, "import { ref } from \"/@vendor/vue.js\"\nimport { h } from \"/@vendor/preact.js\""}

---

*Consult [api-reference.md](api-reference.md) for complete listing*
