Descrizione
Operatore enterprise di trasformazione JSON dichiarativo basato su JSONata — il Domain-Specific Language standard IETF 2015 specializzato in trasformazione di documenti JSON arbitrari, alternativa più potente e leggibile a JSON Path/JMESPath/jq adottata da molte enterprise (IBM API Connect, Camel Quarkus, Logic App di Azure usano JSONata o varianti) per le sue capability di functional composable transformation in singolo espressione one-liner che equivarrebbero a 30+ righe di JavaScript imperativo. JSONata combina selectors XPath-like ($.users[role=admin].email), funzioni higher-order built-in (map, filter, reduce, sort, groupBy, distinct, sum, count, count, avg), template literal con string interpolation (\'Hello \\(name)\'), date arithmetic ($millis() - $toMillis(created_at)), conditional ternario potente (price > 100 ? "expensive" : "cheap"), object construction con projection ({"name": full_name, "totalSpent": $sum(orders.total)}), nested traversal con preservation di context (parent.{child.{name, count(child.items)}}). Pattern d'uso enterprise tipico: ristrutturare il JSON di response di un'API esterna nel formato atteso dal nodo downstream, evitando di scrivere logic_run_js custom che sarebbe più verbose + meno auditable. Sandboxed enterprise execution: l'engine JSONata è isolato via timeout di valutazione 5s (override env FLOWFORGE_JSONATA_TIMEOUT_MS) + cap di profondità 500 (timeboxing ufficiale JSONata via callback __evaluate_entry/exit → kill di ricorsioni/loop non-terminanti = anti-DoS sulla CPU del container), pure function semantics (no side effect: JSONata non ha accesso a fetch/fs/process), output sempre JSON-serializable. Documentazione e playground ufficiale completi a https://jsonata.org dove l'utente può sperimentare expression complesse con preview live prima di paste nel nodo FlowForge. Cheatsheet quick reference: $count(items) per conta, items[price>100].name per filter+select, $sum(orders.total) per aggregate sum, $reduce(nums, function($a,$b){$a+$b}) per custom reducer, $groupBy(orders, "customer_id") per gruppi, $sort(items, function($x,$y){$x.price < $y.price}) per ordering custom, items{$.category: $count($)} per object construction con dynamic keys. Use case: pulire payload di un webhook removendo campi inutili che inquinerebbero il context downstream (es. metadata, debug_info, internal_id); unificare formati eterogenei di provider diversi in una struttura comune (Stripe webhook + PayPal webhook + bonifico bancario → schema canonical { amount, currency, customer_email, payment_method, paid_at }); aggregare array con filter+map+reduce in singola expression chained vs N nodi logic_loop + logic_aggregate; rename di campi (snake_case da REST API legacy → camelCase per ingest in DB del cliente che usa camelCase convention).
