Vapor Moon is a MoonBit-first Single File Component compiler and tooling layer built on top of luna.mbt.
<script>
import {
"mizchi/luna/js/resource" @reactivity,
let signal = @reactivity.signal,
}
let count = signal(0)
</script>
<template>
<div class="counter">{{ count.get() }}</div>
</template>
<style>
.counter {
color: red;
}
</style>moon run src/cmd/vapor_moon -- compile examples/basic.mbtvimport {
"mizchi/luna/dom" @luna_dom,
"ubugeeei/vapor_moon/src/runtime" @hlp,
"ubugeeei/vapor_moon/src/runtime/dom" @dom,
"mizchi/luna/js/resource" @reactivity,
}
pub fn render_dom() -> @luna_dom.DomNode {
let signal = @reactivity.signal,
let count = signal(0)
(fn() {
let n0 = @dom.el("div")
@dom.setAttr(n0, ("class", @dom.attr("counter")))
@dom.setAttr(n0, ("data-vm-scope", @dom.attr("vm-4048536636")))
@dom.append(n0.as_node(), (fn() {
let n1 = @dom.text("")
@dom.setText(n1, fn() { count.get().to_string() })
n1
})())
@dom.into(n0)
})()
}import {
"mizchi/luna/core" @luna_core,
"ubugeeei/vapor_moon/src/runtime" @hlp,
"ubugeeei/vapor_moon/src/runtime/server" @vm_server,
"mizchi/luna/js/resource" @reactivity,
}
pub fn render_ssr() -> @luna_core.StaticDomNode {
let signal = @reactivity.signal,
let count = signal(0)
@luna_core.h("div", [("class", @luna_core.attr_static("counter")), ("data-vm-scope", @luna_core.attr_static("vm-4048536636"))], [
@luna_core.text_dyn(fn() { count.get().to_string() })
])
}[data-vm-scope="vm-4048536636"] .counter { color: red; }component=Basic
extension=.mbtv
scope=vm-4048536636
islands=<none>
props_binding=<none>
props=<none>
emits_binding=<none>
emits=<none>
slots_binding=<none>
slots=<none>struct Props {
title : String
count : Int
}
struct Emits {
save : String
cancel : Unit
}
struct Slots {
default : Unit
footer : String
}
let props : Props = defineProps()
let emit : Emits = defineEmits()
let slots : Slots = defineSlots()let props : Props = defineProps({
count: 0,
tone: "primary",
})<script generic="T, U : Show">
struct Props[T, U] {
items : Array[T]
selected : U
}
struct Emits[T] {
choose : T
}
struct Slots[T, U] {
default : T
label : U
}
let props : Props[T, U] = defineProps()
let emit : Emits[T] = defineEmits()
let slots : Slots[T, U] = defineSlots()
</script><script>
import {
"mizchi/luna/js/resource" @reactivity,
let signal = @reactivity.signal,
}
let count = signal(0)
</script>
<template>
<section class="counter">
<button @click='count.update(fn(n) { n + 1 })'>+</button>
<p>{{ "Count: " + count.get().to_string() }}</p>
<CounterPanel :count="count.get()" client:visible />
</section>
</template>
<style>
.counter {
display: grid;
gap: 12px;
}
</style>=== client ===
pub fn render_dom() -> @luna_dom.DomNode {
let signal = @reactivity.signal,
let count = signal(0)
(fn() {
let __vm_el = @dom.el("div")
@dom.setAttr(__vm_el, ("class", @dom.attr("counter")))
@dom.setAttr(__vm_el, ("data-vm-scope", @dom.attr("vm-4048536636")))
@dom.append(__vm_el.as_node(), @dom.setText(fn() { count.get().to_string() }))
@dom.into(__vm_el)
})()
}
=== server ===
pub fn render_ssr() -> @luna_core.StaticDomNode {
let signal = @reactivity.signal,
let count = signal(0)
@luna_core.h("div", [("class", @luna_core.attr_static("counter")), ("data-vm-scope", @luna_core.attr_static("vm-4048536636"))], [
@luna_core.text_dyn(fn() { count.get().to_string() })
])
}
=== css ===
[data-vm-scope="vm-4048536636"] .counter { color: red; }
=== meta ===
component=Basic
extension=.mbtv
scope=vm-4048536636struct Props {
title : String
count : Int
}
struct Emits {
save : String
cancel : Unit
}
struct Slots {
default : Unit
footer : String
}
struct Expose {
focus : Unit
}
let props : Props = defineProps()
let emit : Emits = defineEmits()
let slots : Slots = defineSlots()
let expose : Expose = defineExpose()let props : Props = defineProps({
count: 0,
tone: "primary",
})moon run src/cmd/vapor_moon -- compile examples/basic.mbtv
moon run src/cmd/vapor_moon -- analyze examples/basic.mbtv
moon run src/cmd/vapor_moon -- diagnostics examples/macros.mbtv
moon run src/cmd/vapor_moon -- hover examples/macros.mbtv 17 13
moon run src/cmd/vapor_moon -- definition examples/macros.mbtv 16 39
moon run src/cmd/vapor_moon -- references examples/macros.mbtv 16 39
moon run src/cmd/vapor_moon -- complete examples/macros.mbtv 17 18
moon run src/cmd/vapor_moon -- format examples/basic.mbtv
moon run --target js src/cmd/vapor_moon_lspmoon run --target js src/cmd/vapor_moon_lspbash scripts/patch_mooncakes.sh
moon fmt
moon check
moon test src/compiler
moon test src/tooling
moon build --target js src/lsp
moon test --target js src/lsp
moon build --target js src/cmd/vapor_moon_lsp
bash scripts/smoke_cli.sh
bash scripts/smoke_lsp.shmoon register # first time only
moon login
moon test
moon package --list
moon publishgit config core.hooksPath .githooksfn client_module_path(component_name : String) -> Stringfn complete_at(source : String, line : Int, character : Int, filename? : String) -> Array[ToolingCompletionItem]fn definition_at(source : String, line : Int, character : Int, filename? : String) -> ToolingDefinition?fn make_scope_id(component_name : String) -> Stringfn scope_css(css : String, scope_id : String) -> Stringfn show_style(visible : Bool, base : String) -> Stringfn use_id(component_name : String, index : Int) -> StringInstall
Download zipVapor Moon is a MoonBit-first Single File Component compiler and tooling layer built on top of luna.mbt.