MallaDocs

Expression reference

Operators, scope variables, built-in fn functions and methods available in expressions.

User guide

Expressions are a safe subset of JavaScript. This page lists everything they can use. The editor’s autocomplete is built from the same definitions, so this list is always complete.

The same list is in the Reference zone of the Expression Studio, where a click inserts a function at the cursor.

Syntax

js
// Arithmetic       + - * / % **
// Comparison       == != === !== < > <= >=
// Logic            && || ! ?? and  cond ? a : b
// Access           a.b  a[b]  a?.b
// Literals         'text'  `Hi ${user.name}`  [1, ...list]  { a: 1, ...obj }
// Lambdas          items.filter(x => x.price > 10)   (as call arguments only)

Scope

NameHoldsAvailable
varspage and site variableseverywhere
queries{ data, loading, error, updatedAt } per querypages
item, index, parentthe current row, its position, the enclosing rowcollection lists, template pages
pagepath, params, querypages
sitename, localeeverywhere
userthe visitor, { isLoggedIn: false } when signed outeverywhere
steps, input, event, errorstep results, workflow input, the triggering event, a caught errorworkflows
rowthe row being read or writtenrow rules
fnbuilt-in functions below and your formulaseverywhere

Functions

Call built-ins as fn.name(…). Arguments marked ? are optional. Key arguments accept a field path ('author.name') or a lambda.

Formatting

FunctionReturnsDescription
fn.formatNumber(value, decimals?, locale?)stringLocale-formatted number with grouping. decimals is a fixed number of decimals or Intl.NumberFormat options ({ notation: "compact" }, { style: "percent" }). Empty string for null/undefined.
fn.formatNumber(1234.5, 2, 'en-US') // '1,234.50'
fn.formatCurrency(value, currency?, locale?, decimals?)stringLocale-formatted money amount (currency: ISO 4217 code, default USD).
fn.formatCurrency(item.price, 'EUR', 'de-DE') // '12,50 €'
fn.formatDate(date, format?, locale?, timeZone?)stringLocale-formatted date. Formats: short, medium (default), long, full, datetime, time, iso, isoDateTime, or Intl.DateTimeFormat options. Time zone defaults to UTC.
fn.formatDate(item.publishedAt, 'long', 'en-GB') // '1 March 2026'

Dates

FunctionReturnsDescription
fn.now()dateCurrent time as an ISO string.
fn.now()
fn.dateAdd(date, amount, unit)dateAdds an amount of a unit (year, quarter, month, week, day, hour, minute, second). UTC; month math clamps to the last day.
fn.dateAdd(fn.now(), 7, 'day')
fn.dateDiff(from, to, unit?)numberWhole units from from to to (default day; negative when to is earlier).
fn.dateDiff(item.publishedAt, fn.now(), 'day')
fn.startOf(date, unit)dateStart of the unit containing the date (UTC; weeks start on Monday).
fn.startOf(fn.now(), 'month')

Text

FunctionReturnsDescription
fn.truncate(text, length, suffix?)stringCuts to length characters (suffix included, default …) when longer.
fn.truncate(item.excerpt, 120)
fn.slugify(text)stringKebab-case ASCII slug (Café Ñandú → cafe-nandu).

Arrays

FunctionReturnsDescription
fn.length(value)numberItems in an array, characters in a string, keys in an object; 0 otherwise.
fn.sum(items, key?)numberSum of the numeric values (non-numbers skipped).
fn.sum(queries.cart.data, 'price')
fn.avg(items, key?)numberAverage of the numeric values; null when there are none.
fn.uniq(items, key?)arrayItems with duplicates removed (by deep value, or by key).
fn.groupBy(items, key)objectObject of arrays keyed by the key value.
fn.groupBy(queries.products.data, 'category')
fn.sortBy(items, key?, direction?)arraySorted copy (asc default or desc): numbers numerically, strings by code point, null last.
fn.sortBy(items, 'price', 'desc')
fn.range(start, end?, step?)arrayNumbers from start (inclusive) to end (exclusive); fn.range(3) → [0, 1, 2].

Math

FunctionReturnsDescription
fn.min(...values)anySmallest value: fn.min(1, 2), fn.min(items, "price").
fn.max(...values)anyLargest value: fn.max(1, 2), fn.max(items, "price").
fn.round(value, decimals?)numberRounds half away from zero to decimals places (default 0).

Objects

FunctionReturnsDescription
fn.keys(object)arrayOwn keys.
fn.values(object)arrayOwn values.
fn.entries(object)array[key, value] pairs.

Logic

FunctionReturnsDescription
fn.default(value, fallback)anyThe fallback when the value is null, undefined or "".
fn.default(item.subtitle, 'Untitled')
fn.toNumber(value, fallback?)numberNumber from a number or numeric string; the fallback (default null) otherwise.

JSON

FunctionReturnsDescription
fn.jsonStringify(value, indent?)stringJSON text (forbidden keys dropped; oversized values are errors).
fn.jsonParse(text, fallback?)anyParses JSON; the fallback (default null) when invalid. __proto__/constructor keys are dropped.

Methods

Values also have the familiar JavaScript methods. Methods never change the original: sort and reverse return copies.

Text methods

MethodReturnsDescription
.lengthnumberNumber of UTF-16 code units.
.toUpperCase()stringUpper-case copy.
.toLowerCase()stringLower-case copy.
.trim()stringRemoves leading and trailing whitespace.
.trimStart()stringRemoves leading whitespace.
.trimEnd()stringRemoves trailing whitespace.
.startsWith(search, position?)booleanTrue when the string starts with search.
.endsWith(search, length?)booleanTrue when the string ends with search.
.includes(search)booleanTrue when search occurs in the string.
.indexOf(search, from?)numberFirst index of search, or -1.
.lastIndexOf(search)numberLast index of search, or -1.
.slice(start?, end?)stringPart of the string (negative indexes count from the end).
.substring(start, end?)stringPart of the string between two indexes.
.split(separator, limit?)arraySplits on a literal separator.
.replace(search, replacement)stringReplaces the first literal occurrence.
.replaceAll(search, replacement)stringReplaces every literal occurrence.
.padStart(length, fill?)stringPads the start to length.
.padEnd(length, fill?)stringPads the end to length.
.repeat(count)stringThe string repeated count times.
.charAt(index)stringCharacter at an index.
.at(index)stringCharacter at an index (negative counts from the end).
.concat(...parts)stringAppends the parts.
.localeCompare(other, locale?)numberLocale-aware comparison (-1, 0, 1).
.toString()stringThe string itself.

Array methods

MethodReturnsDescription
.lengthnumberNumber of items.
.map(callback)arrayNew array with the callback result for each item: (item, index) => ….
.filter(callback)arrayItems for which the callback is truthy.
.find(callback)anyFirst item for which the callback is truthy.
.findIndex(callback)numberIndex of the first match, or -1.
.findLast(callback)anyLast item for which the callback is truthy.
.findLastIndex(callback)numberIndex of the last match, or -1.
.some(callback)booleanTrue when the callback is truthy for any item.
.every(callback)booleanTrue when the callback is truthy for every item.
.reduce(callback, initial?)anyFolds the items into one value: (acc, item, index) => ….
.flatMap(callback)arrayMaps, then flattens one level.
.includes(value)booleanTrue when the array contains the value (===).
.indexOf(value)numberFirst index of the value, or -1.
.lastIndexOf(value)numberLast index of the value, or -1.
.join(separator?)stringJoins the items into a string (default ,).
.slice(start?, end?)arrayPart of the array (negative indexes count from the end).
.concat(...values)arrayNew array with the values appended (arrays flattened one level).
.at(index)anyItem at an index (negative counts from the end).
.flat(depth?)arrayFlattens nested arrays (default depth 1, max 10).
.reverse()arrayReversed copy (the original never changes).
.sort(compare?)arraySorted copy (the original never changes). Without a comparator, sorts as strings like JS.

Number methods

MethodReturnsDescription
.toFixed(digits?)stringFixed-point notation (0–100 digits).
.toPrecision(precision)stringSignificant-digit notation (1–100).
.toString(radix?)stringText form, optionally in base 2–36.
.toLocaleString(locale?)stringLocale-formatted number (default: site locale).
.toString()string"true" or "false".