← Back to Cookbook

External TS File Pattern

Complex data transformations entirely in inline @ts blocks.

code

Source

/**
 * Demonstrates complex data transformation in code nodes.
 * All logic stays inline in @ts blocks.
 */

form data_input {
  label: "Data Input"
  schema: @json {
    {
      "type": "object",
      "required": ["items"],
      "properties": {
        "items": {
          "type": "array",
          "title": "Items",
          "items": {
            "type": "object",
            "properties": {
              "name": { "type": "string" },
              "value": { "type": "number" }
            }
          }
        }
      }
    }
  }
}

graph process_data {
  label: "Process Data"

  root {
    type: code
    label: "Extract data"
    code: @ts { return context.nodes.root.input }
    outputSchema: @json {
      {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": { "type": "string" },
                "value": { "type": "number" }
              }
            }
          }
        }
      }
    }
  }

  node transform {
    type: code
    label: "Transform data"
    code: @ts {
      const items = context.nodes.root.output.items || []
      const processed = items.map(function(item) {
        return {
          name: item.name ? item.name.toUpperCase() : "",
          value: item.value || 0,
          doubled: (item.value || 0) * 2
        }
      })
      const total = processed.reduce(function(sum, item) { return sum + item.value }, 0)
      return { items: processed, total: total }
    }
  }

  node summarize {
    type: code
    label: "Summarize results"
    code: @ts {
      const result = context.nodes.transform.output
      return {
        item_count: result.items ? result.items.length : 0,
        total: result.total || 0,
        processed_at: new Date().toISOString()
      }
    }
  }

  flow {
    root -> transform
    transform -> summarize
  }
}

trigger on_data {
  form:data_input -> process_data
  enabled: true
}

Flow

Trigger → graph

Graph nodes