mendraw is the JavaScript-target package for using Mendix client values and
already-installed .mpk widget assets from Gleam.
Its responsibility is intentionally narrow:
- typed wrappers for the Mendix Pluggable Widget client API;
- Redraw interop for pluggable and classic widget components;
- deterministic binding generation from
build/widgets/*assets; - synthetic Mendix-compatible values for non-Mendix web applications.
mendraw does not search the Marketplace, authenticate a user, launch a
browser, download packages, manage a global cache, or write a lockfile. Those
package-manager responsibilities belong to
mxpak.
gleam add mendraw@2The package targets JavaScript. Applications rendering Mendix widgets also need the JavaScript peer packages required by those widgets, normally React and React DOM.
Configure package acquisition under mxpak's namespace:
[tools.mxpak]
mode = "extract"
[tools.mxpak.widgets.Charts]
version = "3.0.0"
# id = 12345
# s3_id = "com/..." # optional direct-download identifierRun the standalone mxp CLI from the project root:
mxp installFor a local Git/path dependency on mxpak, the equivalent Gleam entrypoint is:
gleam run -t erlang -m mxpak/installEither command owns package resolution and writes extracted assets below
build/widgets/.
gleam run -m mendraw/installMendraw reads the installed assets, generates src/widgets/*.gleam, and writes
the JavaScript component registry into Mendraw's build output. Running the
command again regenerates the same binding modules, so stale generated source
is not silently retained.
import gleam/result
import mendraw/interop
import mendraw/mendix
import mendraw/mendix/editable_value
import mendraw/widget
import redraw
pub fn view(
props props: mendix.JsProps,
) -> Result(redraw.Element, widget.WidgetError) {
let value = mendix.get_prop_required(props, "textAttr")
let current_text = editable_value.display_value(value)
use component <- result.try(widget.component("Switch"))
Ok(interop.component_el(component, [
widget.prop("caption", "Title"),
widget.editable_prop(
"textAttr",
current_text,
editable_value.display_value(value),
fn(updated_text) {
editable_value.set_text_value(value, updated_text)
},
),
widget.action_prop("onClick", fn() {
editable_value.set_text_value(value, "Updated")
}),
], []))
}Classic/Dojo assets installed by mxpak are wrapped in a React component by the Mendraw generator:
import mendraw/classic
classic.render("CameraWidget.widget.CameraWidget", [
#("mfToExecute", classic.to_value(microflow)),
#("preferRearCamera", classic.to_value(True)),
])Both render and render_with_class return a descriptive Result when a
binding is missing.
The mendraw/mendix/* modules wrap runtime-owned JavaScript handles instead of
recreating Mendix business behavior:
import gleam/option
import mendraw/mendix
import mendraw/mendix/action
import mendraw/mendix/editable_value
import mendraw/mendix/list_value
let status = list_value.status(data_source)
let display = editable_value.display_value(attribute)
editable_value.set_text_value(attribute, "Updated")
action.execute_action(on_click)
case mendix.get_prop(props, "optionalValue") {
option.Some(value) -> value
option.None -> fallback_value
}Important modules include:
| Module | Responsibility |
|---|---|
mendraw/mendix |
Core handles, status values, property access, option conversion |
mendraw/mendix/editable_value |
Editable values and validation |
mendraw/mendix/list_value |
Data-source paging, filtering, sorting, and reload |
mendraw/mendix/list_attribute |
Per-item attribute/action/expression access |
mendraw/mendix/filter |
Typed filter expression construction |
mendraw/mendix/date |
JavaScript date boundary |
mendraw/mendix/decimal |
Big.js boundary conversion |
mendraw/widget |
Generated pluggable component lookup and property adapters |
mendraw/classic |
Generated classic component lookup |
mendraw/interop |
Typed JavaScript component to Redraw element conversion |
mendraw/synthetic |
Mendix-compatible values for external data |
mendraw/synthetic can construct ListValue, ObjectItem, and
ListAttributeValue compatible objects for rendering an installed Mendix
widget outside the Mendix Runtime. It does not fetch remote data or install the
widget package; applications provide the data and mxpak provides the assets.
mxpak installs and caches package assets
↓ build/widgets/*
mendraw generates typed bindings and models Mendix client values
↓ public Gleam APIs
glendix builds Mendix widgets and provides the Lustre/React bridge
Each package can be used independently. A project that only needs Mendix client types or synthetic values depends on Mendraw alone. A project that only needs package acquisition uses mxpak alone.
gleam deps download
gleam format --check
gleam check
gleam build --warnings-as-errors
gleam docs build
gleam test --runtime bun