Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
e189539
refactor(tailwind): unify build and runtime ownership
dannote Sep 5, 2026
21f190a
Refactor asset preparation and scope development state by session
dannote Sep 8, 2026
83f795e
fix(vendor): isolate cached bundles by compilation context
dannote Sep 9, 2026
891ec86
refactor(dev): introduce owned session supervision and CSS lifecycle
dannote Sep 9, 2026
56980c8
refactor(dev): retain Tailwind contexts and unify managed startup
dannote Sep 10, 2026
e37e0f1
fix(dev): handle session lookup races and explicit host attachment
dannote Sep 10, 2026
fe15ac9
fix(build): map shared chunk imports to emitted manifest identities
dannote Sep 10, 2026
9b25b4d
fix(vue): assemble template-only component exports
dannote Sep 10, 2026
d0c3111
fix(dev): rewrite absolute asset-root imports in virtual modules
dannote Sep 10, 2026
4ba0df2
fix: address session request and dependency asset review findings
dannote Sep 13, 2026
93d485e
fix(vue): attach scoped CSS identity to script-bearing components
dannote Sep 13, 2026
af5ef72
Fix scoped Vue assembly with shadowed module bindings
dannote Sep 14, 2026
dab017e
Require QuickBEAM 0.11.1 and refresh runtime dependencies
dannote Sep 14, 2026
e3b5b26
Align source paths with established Volt module names
dannote Sep 14, 2026
6097ef5
Normalize Mix-task test namespaces and test support compilation
dannote Sep 14, 2026
7b320e3
Refresh Phoenix example lockfile for current Volt dependencies
dannote Sep 14, 2026
cdc4ecf
Clarify discovery and cleanup APIs and move helpers to their owners
dannote Sep 14, 2026
41c382a
Require patched Bandit and Igniter dependencies
dannote Sep 14, 2026
3cbc15d
Refresh example Phoenix and LiveView security patches
dannote Sep 14, 2026
f9bb77d
Preserve watcher session field access after cleanup rename
dannote Sep 14, 2026
5cf6fd2
Fix bundle-format collisions in JavaScript tooling (#36)
romankurakin Sep 14, 2026
e6ed03e
Assert the generated page URL in browser runner integration test
dannote Sep 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 32 additions & 3 deletions .reach.exs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ adapter = [
]

orchestrator = [
"Volt.Build",
"Volt.Builder",
"Volt.Builder.Collector",
"Volt.Builder.Compiler",
Expand All @@ -33,38 +34,56 @@ orchestrator = [
"Volt.JS.Vendor",
"Volt.Pipeline",
"Volt.Tailwind",
"Volt.Tailwind.Build",
"Volt.Watcher",
"Volt.Dev.Session.Watcher",
"Volt.Watcher.Ignore",
"Volt.Watcher.Path"
]

model = [
"Volt.Builder.BuildContext",
"Volt.Builder.Asset",
"Volt.Builder.Bundle",
"Volt.Builder.Collector.State",
"Volt.Builder.Context",
"Volt.Builder.Compiled",
"Volt.Builder.Dependencies",
"Volt.Builder.ManifestEntry",
"Volt.Builder.OutputContext",
"Volt.Builder.OutputFile",
"Volt.Builder.Result",
"Volt.Build.Result",
"Volt.Build.Layout",
"Volt.Config.Tailwind",
"Volt.ChunkGraph.Chunk",
"Volt.Config",
"Volt.Config.*",
"Volt.Dev.Session.Tables",
"Volt.DevServer.CacheEntry",
"Volt.DevServer.Config",
"Volt.HMR.Message",
"Volt.HMR.Channel",
"Volt.JS.ImportExtractor.Result",
"Volt.JS.PrebundleEntry.Export",
"Volt.JS.PrebundleEntry.Import",
"Volt.JS.Runtime.Installer.Metadata",
"Volt.JS.TSConfig",
"Volt.MIME",
"Volt.Paths",
"Volt.Pipeline.Result.Hashes"
"Volt.Pipeline.Result.Hashes",
"Volt.Tailwind.CompileError",
"Volt.Tailwind.ResolveError",
"Volt.Tailwind.Context",
"Volt.Tailwind.Metadata",
"Volt.Tailwind.State",
"Volt.Tailwind.Compilation"
]

logic = [
"Volt.Builder.Artifact",
"Volt.Builder.CSS.Prepared",
"Volt.Builder.Plan",
"Volt.Assets",
"Volt.Assets.Query",
"Volt.Builder.Naming",
Expand All @@ -82,7 +101,7 @@ logic = [
"Volt.JS.Check",
"Volt.JS.Extensions",
"Volt.JS.Format",
"Volt.JS.Helpers",
"Volt.JS.Discovery",
"Volt.JS.ImportExtractor",
"Volt.JS.Package",
"Volt.JS.Patch",
Expand Down Expand Up @@ -115,8 +134,14 @@ infrastructure = [
"Volt.Application",
"Volt.Builder.CSS",
"Volt.Builder.Writer",
"Volt.Builder.Publication",
"Volt.Cache",
"Volt.Dev",
"Volt.Dev.Cleanup",
"Volt.Dev.Assets",
"Volt.Dev.Session.Call",
"Volt.Dev.Session.State",
"Volt.Dev.Session.Supervisor",
"Volt.Dev.ConsoleForwarder",
"Volt.Dev.ConsoleForwarder.Payload",
"Volt.ETS",
Expand All @@ -136,7 +161,11 @@ infrastructure = [
"Volt.JS.Runtime.Error",
"Volt.JS.Runtime.Installer",
"Volt.JS.Runtime.PackageSet",
"Volt.Tailwind.Loader"
"Volt.Tailwind.Artifact",
"Volt.Tailwind.Loader",
"Volt.Tailwind.Runtime",
"Volt.Tailwind.Supervisor",
"Volt.Tailwind.Worker"
]

plugin = [
Expand Down
4 changes: 4 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# Project Guidelines

- Match primary Elixir module namespaces to their source paths. Nested data modules, protocol implementations, conditional definitions, and established acronym spellings are deliberate exceptions.
- Mirror source paths and namespaces in unit tests. Keep cross-module scenarios under the owning subsystem or integration directory; do not invent a production module merely to match a scenario test.
- Keep Mix tasks in nested `lib/mix/tasks/` paths as `.ex`, tests as `_test.exs`, and shared support as `.ex` under `test/support/`, compiled only in the test environment. `lib/volt/test/` contains shipped framework APIs, not project test support.

- Prefer parser/AST-backed solutions over hand-rolled regular expressions for source code, markup, and structured formats. Use existing parsers such as OXC for JavaScript/TypeScript and Floki for HTML-like markup when available.
31 changes: 31 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,37 @@

## Unreleased

### Breaking changes

- Rename `Volt.JS.Helpers` to `Volt.JS.Discovery`, with `files/0,1` and `format_files/0` replacing `discover_files/0,1` and `discover_format_files/0`.

### Added

- Add `Volt.build/1` as the library API for complete frontend builds with one typed result and merged manifest for scripts, styles, chunks, and emitted assets.
- Isolate Tailwind scanner and CSS state by profile and stylesheet root while sharing one supervised compiler runtime.
- Allow Tailwind roots to configure their logical output name, development URL, and source globs.

### Changed

- Require QuickBEAM 0.11.1 or later in the 0.11 series for release-optimized, baseline-CPU precompiled runtimes and the Mint 1.10 security dependency floor.
- Write one production manifest at the configured asset output root instead of separate JavaScript and Tailwind manifests.
- Make `mix volt.build` a thin adapter over `Volt.build/1`.
- Emit Tailwind development artifacts atomically and skip style HMR broadcasts when generated CSS is unchanged.
- Normalize in-memory build manifests and emitted asset metadata to typed structs before JSON serialization.

### Fixed

- Allow JavaScript formatting and checks when the bundle format is configured as `:esm`, without treating the format atom as formatter options ([#36](https://github.com/elixir-volt/volt/pull/36), fixes [#34](https://github.com/elixir-volt/volt/issues/34)).
- Handle filesystem watcher events for the watched root itself when normalizing macOS path aliases.
- Apply Vue scoped styles without capturing component-module bindings such as `Object`.

### Security

- Require Igniter 0.8.4 or later to prevent terminal escape injection through package metadata in installer confirmation prompts (CVE-2026-82584).
- Require Bandit 1.12.5 or later in the Phoenix examples to address HTTP/2 header validation and connection-window starvation (CVE-2026-75484, CVE-2026-74836).

- Update Phoenix example locks to patched Phoenix and LiveView releases for channel-join and long-poll denial of service, presence-client crashes, link scheme validation, and redirect validation.

## 0.17.11 - 2026-09-04

### Added
Expand Down
8 changes: 3 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,13 +88,11 @@ The `Volt.DevServer` Plug starts its supervised file watcher on the first develo
```
$ mix volt.build

Building Tailwind CSS...
app-1a2b3c4d.css 23.9 KB
Built Tailwind in 43ms
Building "assets/js/app.ts"...
Building ["assets/js/app.ts"]...
app-5e6f7a8b.js 128.4 KB (gzip: 38.2 KB)
app-1a2b3c4d.css 23.9 KB
manifest.json 2 entries
Built in 15ms
Built in 58ms
```

Tree-shaking, minification, code splitting, configurable env prefixes and asset URL prefixes, source maps, content-hashed JavaScript/CSS/assets, and manifest output. `Volt.Preload.tags/2` can generate modulepreload tags from the manifest, and the build is ready for `mix phx.digest`.
Expand Down
2 changes: 1 addition & 1 deletion examples/react/mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ defmodule ReactExample.MixProject do
{:telemetry_poller, "~> 1.0"},
{:jason, "~> 1.2"},
{:dns_cluster, "~> 0.2.0"},
{:bandit, "~> 1.5"},
{:bandit, ">= 1.12.5 and < 2.0.0"},
{:volt, path: "../..", override: true}
]
end
Expand Down
Loading
Loading