Volt.JS.ImportRewriter (Volt v0.10.2)

Copy Markdown View Source

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

Rewrite import specifiers in JavaScript source code.

Rewrite import specifiers using a map of old → new.

Functions

rewrite(source, filename, rewrite_fn)

@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'"}

rewrite!(source, filename, rewrite_fn)

@spec rewrite!(String.t(), String.t(), (String.t() -> {:rewrite, String.t()} | :keep)) ::
  String.t()

Like rewrite/3 but raises on errors.

rewrite_map(source, filename, rewrites)

@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'"}