zebflow 0.9.1

Reactive web automation platform — pipelines, templates, and real-time collaboration in a single binary.
Documentation
//! Engine-level `{{ expr }}` expression resolution for pipeline node configs.
//!
//! Every string field in a node's `config` object may contain `{{ js_expr }}` placeholders.
//! Before a node executes, the pipeline engine resolves all such expressions in one Deno
//! sandbox trip — giving every node access to `$input`, `$trigger`, and `$nodes`
//! without any per-node implementation required.
//!
//! # Quick reference
//!
//! | Variable         | What you get                                            |
//! |------------------|---------------------------------------------------------|
//! | `$input`         | The current payload flowing into this node              |
//! | `$input.field`   | Specific field from upstream output                     |
//! | `$trigger.body`  | The envelope's fields as they arrived (manual or webhook) |
//! | `$trigger.files` | The envelope's FileRefs as they arrived                  |
//! | `$trigger.auth`  | Verified JWT claims from the original request           |
//! | `$trigger.params`| URL path params (`:id`, `:slug`, etc.)                  |
//! | `$trigger.query` | Query string params (`?page=2` etc.)                    |
//! | `$nodes.id`      | Output of a completed upstream node by its graph ID     |
//! | `$nodes.id.field`| Specific field from that node's output                  |
//! # Examples
//!
//! Whole-field expression (preserves native type):
//! ```text
//! --params-expr "{{ [$trigger.auth.sub] }}"
//! --url "{{ $input.endpoint }}"
//! ```
//!
//! Interpolated expression (result stringified):
//! ```text
//! --url "https://api.example.com/users/{{ $trigger.auth.sub }}/profile"
//! ```
//!
//! Accessing previous node output:
//! ```text
//! --url "{{ $nodes.userLookup.rows[0].api_endpoint }}"
//! ```

pub mod resolver;
pub mod scanner;

pub use resolver::{build_expression_scope_input, resolve_config_expressions};