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.
Summary
Functions
@spec rewrite(String.t(), String.t(), (String.t() -> {: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.ImportRewriter.rewrite(source, "test.ts", fn
...> "vue" -> {:rewrite, "/@vendor/vue.js"}
...> _ -> :keep
...> end)
{:ok, "import { ref } from '/@vendor/vue.js'\nimport a from './utils'"}
@spec rewrite!(String.t(), String.t(), (String.t() -> {:rewrite, String.t()} | :keep)) :: String.t()
Like rewrite/3 but raises on errors.
@spec rewrite_map(String.t(), String.t(), %{required(String.t()) => 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.ImportRewriter.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'"}