transform.script runs a typed TypeScript function in a secure WebAssembly
(QuickJS) sandbox. Reach for it whenever a transformation is deterministic but
too involved for a LiquidJS template, array map/filter/reduce, multi-step
calculations, conditional branching, date arithmetic, or regex parsing.
When to use Script vs LiquidJS
| Use case | Tool |
|---|---|
| Simple field access, basic filters, simple math | LiquidJS ({{ ... }}) |
| Array reduce/map/filter, multi-step calculations | Script |
| Conditional branching, date math, string parsing | Script |
The contract
The function must be namedscript. Its parameters come from the inputs
map (each key becomes a parameter, in declaration order), and its return-type
annotation is this step’s output schema. There is no separate
outputSchema: field.
- Parameter names and order must equal
Object.keys(inputs). Enforced at push time. - The
: Rreturn annotation is mandatory and is derived to JSON Schema, so downstream steps autocomplete against it. A too-loose annotation (such asunknown) leaves downstream field references unresolvable. - No
async,import(), orrequire(), the sandbox has no module loader and the worker calls the function synchronously.
Example
{ subtotal, tax, total } is the output schema, so a later step can read
{{ steps.calculate-totals.output.total }}.
Configuration
Configuration goes inside the step’swith: block.
Named inputs mapped from template expressions. Keys become the function parameter list in declaration order:
inputs: { items, taxRate } ⇒ function script(items: …, taxRate: …): R { … }.TypeScript function declaration. Must be
function script(args): R { … } where the parameter list equals Object.keys(inputs) in order and R is a return type annotation. The annotation IS this step’s output schema.Max execution time in milliseconds (default: 5000)
Max memory in bytes (default: 10MB)
Output
Returnsunknown. Value returned from script. Validated at runtime against the JSON Schema derived from the function’s return type annotation.