Skip to content

Releases: elixir-volt/volt

v0.14.12

28 Jun 10:06

Choose a tag to compare

Added

  • Volt.Assets.resolve/2 and Volt.Assets.resolve!/2 resolve asset source specifiers through Volt aliases, root-relative paths, relative importers, and extension probing.

v0.14.9

26 Jun 11:45

Choose a tag to compare

Added

  • Plugins can expose real-file-derived embedded modules through Volt.Plugin.EmbeddedModule query ids for custom file formats.
  • Embedded script and style modules participate in production builds, dev serving, CSS handling, JavaScript checks, and HMR invalidation.

v0.14.7

25 Jun 09:46

Choose a tag to compare

Added

  • :hmr_timeout option on Volt.DevServer (and the :server config profile) controls the HMR websocket idle timeout. Defaults to 60_000ms.
  • CSS @import and url() relationships are now tracked through Vize's parser-backed CSS selectors so HMR can invalidate and hot-swap stylesheets, CSS modules, and framework-emitted styles when an imported stylesheet or referenced asset changes.
  • CSS dependency tracking now resolves extensionless local imports to .css files and directory imports to index.css files.
  • Svelte-emitted styles participate in CSS asset dependency tracking for HMR.

Changed

  • CSS dependency graph updates for physical CSS, CSS modules, and framework-emitted styles now flow through one HMR path.
  • HMR websocket messages (ping, pong, update, error) now flow through Volt.HMR.Message, which uses JSONCodec for struct<->JSON (de)serialization with Jason performing the final binary encoding.
  • Added json_codec as a runtime dependency.

Fixed

  • Cyclic CSS import graphs no longer report the changed stylesheet as its own HMR dependent.
  • CSS module and framework-emitted style dependency links are removed when styles stop referencing an asset.
  • HMR websocket no longer drops idle connections after 60 seconds. The browser client now sends a periodic {"type":"ping"} heartbeat, and the server replies with {"type":"pong"}, preventing Bandit's websocket read_timeout from closing an otherwise idle socket. The client also tracks pongs and force-reconnects if the link goes half-open. This eliminates the spurious [Volt] Disconnected. Reconnecting... console noise observed on long-lived demo/dev pages with no file changes.

v0.14.6

19 Jun 16:38

Choose a tag to compare

Changed

  • Upgraded oxc to 0.17.1 and quickbeam to 0.10.18.
  • Dynamic import variable rewriting and CommonJS require() import extraction now use parser-backed OXC selectors instead of full AST parse/postwalk passes.

v0.14.3

19 Jun 09:30

Choose a tag to compare

Fixed

  • CSS asset URL rewriting now uses Vize's parser-backed source rewrite API, avoiding LightningCSS AST print failures on Monaco Editor CSS while preserving font asset hashing.

Changed

  • Upgraded vize to 0.12.0.

v0.14.2

19 Jun 06:48

Choose a tag to compare

Fixed

  • Production builds now rewrite CommonJS require() specifiers so bundled browser output does not leak runtime require() calls.
  • Development vendor prebundle scanning now skips dependency/build directories such as node_modules, avoiding slow dev asset requests in apps with local npm installs.
  • React, React DOM, and Solid framework proxy modules now derive public exports from the installed packages instead of hardcoded export lists.

Changed

  • Centralized common JavaScript extension and Volt path defaults.

v0.14.1

18 Jun 12:52

Choose a tag to compare

0.14.1

Fixed

  • Development vendor prebundling now uses one multi-entry OXC bundle so shared singleton dependencies, such as CodeMirror packages, are loaded only once.
  • Development vendor chunk files emitted by the optimizer are now served from the vendor cache.

Changed

  • Upgraded oxc to 0.16.0 and quickbeam to 0.10.16.

v0.14.0

24 May 12:49

Choose a tag to compare

Added

  • Volt.static_path/2 and Volt.static_url/2 resolve Volt-managed scripts, stylesheets, and emitted image/font assets with Phoenix-style helper names.
  • mix volt.build --tailwind now writes a CSS manifest using the existing production manifest format.

Deprecated

  • Volt.entry_path/2 is deprecated in favor of Volt.static_path/2.

Fixed

  • mix volt.js.check --type-aware --type-check now fails on TypeScript compiler diagnostics such as typescript/TS2322.
  • mix volt.build --tailwind now honors hash: false from Volt config for Tailwind CSS output filenames, while keeping CLI --hash/--no-hash overrides.

v0.13.1

22 May 17:23

Choose a tag to compare

Fixed

  • mix volt.js.check --type-aware now forwards only typescript/* rules to tsgolint, matching Oxlint's type-aware rule namespace and avoiding crashes when normal oxlint category rules such as "correctness" are configured.

v0.13.0

22 May 14:14

Choose a tag to compare

Added

  • env_prefix config for choosing which .env variables are exposed through import.meta.env, including Vite-compatible prefixes like "VITE_".
  • asset_url_prefix config and mix volt.build --asset-url-prefix for changing production JavaScript and CSS asset URLs without changing Phoenix output paths.
  • Production chunk manifests now include richer chunk metadata: imports, dynamicImports, chunk-local css, and emitted assets.
  • Plugin embedded_modules/3 hook for exposing JavaScript-like scripts embedded in custom file formats.

Changed

  • Upgraded oxc to 0.15.1, quickbeam to 0.10.15, and reach to 2.6.1.
  • mix volt.js.check now supports --type-aware and --type-check for TypeScript-aware linting through tsgolint.
  • Type-aware checks now analyze Vue and Svelte component scripts via plugin-provided virtual modules while leaving templates on the normal syntax lint path.
  • Production builds now tree-shake JavaScript by default, with tree_shaking: false and mix volt.build --no-tree-shaking available to preserve unused exports.
  • Code-split dynamic imports now preload dependency chunks and chunk-local CSS when doing so avoids loading waterfalls.
  • Code-split production builds now preserve dynamic import facades, rewrite chunk imports by exact resolved specifier, and avoid worker filename collisions.
  • HMR boundary lookup now uses a served module graph, with a dedicated glob graph for import.meta.glob() invalidation.
  • HMR updates now support self-accepting modules, dependency accept callbacks, multi-dependency accept callbacks, disposal data, CSS import updates, and full-reload fallback more closely to Vite's behavior.
  • Production builds now write the final merged manifest once after all entries are built.
  • Production JavaScript asset URL imports now emit hashed files and include them in manifest asset metadata.
  • Worker build failures now fail the parent build instead of being ignored.
  • JavaScript runtime installs now validate package signatures for reused install directories, and named runtimes reject option mismatches.
  • glob_ex is now a direct dependency for HMR glob invalidation.
  • Volt now dogfoods type-aware JavaScript checks in mix lint.

Breaking changes

  • Custom plugins that return {:proxy, filename, opts} from prebundle_entry/1 must use Volt.JS.PrebundleEntry.Import and Volt.JS.PrebundleEntry.Export entries for :imports and :exports; plain map entries are no longer accepted.
  • Custom extract_imports/3 plugin callbacks must return {:ok, %Volt.JS.ImportExtractor.Result{}} instead of plain maps.