API Stability Notice

Macroforge is under active development. The API is not yet stable and may change between versions. Some documentation sections may be outdated.

Deno Plugin

@macroforge/deno-plugin expands macros in Deno projects. Deno has no Vite-style plugin hook for arbitrary transforms, so rather than hooking the module graph it expands sources into a cache directory that you then run or bundle.

CLI

deno run -A jsr:@macroforge/deno-plugin/cli expand
deno run -A jsr:@macroforge/deno-plugin/cli watch
deno run -A jsr:@macroforge/deno-plugin/cli clean
CommandPurpose
expandExpand the project once
watchExpand, then re-expand on change
cleanRemove the output directory

Options

FlagDefaultDescription
--root <path>current directoryProject root to scan
--out <path>.macroforge/cacheOutput directory for expanded files
--build-mode <dev\|prod>prodExpansion mode. prod enables reverse monomorphization for declarative macros; dev expands inline
--copy-passthroughoffAlso copy files that contain no macros, so the output tree is complete

Note that --build-mode defaults to prod here — the opposite of the Vite plugin, which follows Vite’s own dev/build state.

Programmatic API

import { expand, expandFile, expandProject, watchProject } from "@macroforge/deno-plugin";

// Expand a source string
const result = await expand(source, "src/user.ts", { root: Deno.cwd() });

// Expand a single file on disk
await expandFile("src/user.ts", { root: Deno.cwd(), out: ".macroforge/cache" });

// Expand every macro-using file under the root
await expandProject({ root: Deno.cwd(), out: ".macroforge/cache" });

// Watch and re-expand
await watchProject({ root: Deno.cwd(), out: ".macroforge/cache" });

expandProject and watchProject report per-file events including whether the file was expanded, skipped, or unchanged, along with any diagnostics.

The config file is read on every expand() call — it is not cached — so a long-running watchProject picks up macroforge.config.ts edits without a restart.

Attribute macros

The Deno plugin supports the same attribute macros as the other integrations — @cfg, @deprecated, @mustUse and @nonExhaustive — driven by the same macroforge.config.ts.

Availability

The package is developed in-repo and its manifest is currently marked private, so the jsr: specifier above may not resolve until it is published. To use it today, vendor the packages/deno-plugin directory or import it by relative path from a checkout.