---
sidebar_position: 2
---

# Script Tab in Node Settings

The **Script** tab is designed for placing JavaScript code that handles the node's programmatic logic. Here you define what exactly your node does - whether it processes text, calls APIs, transforms data, or performs calculations.

![Script tab interface](../img/script_tab.jpg)

## Code Structure

All Piper nodes, including custom ones, follow a specific JavaScript structure:

```javascript
export async function run({ inputs }) {
    const { FatalError, NextNode } = DEFINITIONS;
    
    // Your code here
    
    return NextNode.from({ 
        outputs: { 
            // Your results
        } 
    });
}
```

This structure ensures that your node can properly receive data from previous nodes and pass results to the next ones in your pipeline.

### Original Input Text Code
The basic **Input Text** node has this simple structure:

```javascript
export async function run({ inputs }) {
    const { FatalError, NextNode } = DEFINITIONS;

    const text = inputs.input_text;

    return NextNode.from({
        outputs: {
            output_text: text
        }
    });
}
```

### Custom Merge Text to JSON Code
We need to replace this with logic that processes multiple string inputs and creates a JSON array:

```javascript
export async function run({ inputs }) {
    const { FatalError, NextNode } = DEFINITIONS;

    const jsonArray = [];

    if (inputs.string1) {
        jsonArray.push(inputs.string1);
    }
    if (inputs.string2) {
        jsonArray.push(inputs.string2);
    }
    if (inputs.string3) {
        jsonArray.push(inputs.string3);
    }
    if (inputs.string4) {
        jsonArray.push(inputs.string4);
    }

    return NextNode.from({
        outputs: {
            json_output: jsonArray
        }
    });
}
```

## Understanding Custom Logic

The custom script implements the following logic:

1. **Initialize empty array** - `const jsonArray = []` creates an empty array to store our text strings
2. **Check each input** - `if` conditions check that each input has a value before adding
3. **Build array** - Only non-empty inputs are added to `jsonArray` using `push()`
4. **Return JSON output** - The final array is returned as `json_output`, matching our configuration in the Design tab

This approach ensures that:
- Empty or undefined inputs are ignored
- Only valid text strings are included in the final JSON array
- The output format matches the JSON type we defined in the Design tab

## Execution Types

Choose the appropriate execution type based on how much time your node requires to work:

|    Type    |   Time      |     Description       |
|------------|-------------|-----------------------|
| Rapid      | 0-20 sec    | Fast operations       |
| Regular    | 21-60 sec   | Standard processing   |
| Deferred   | 60-120 sec  | Complex operations    |
| Protracted | 120-300 sec | Heavy processing tasks |

For our **Merge text to JSON** node, **Rapid** execution is suitable since we're only manipulating text strings and there are no API calls to external services.

## Saving Changes

Always save changes to the script by clicking the **Save** button at the bottom of the interface. Any changes to the code should be saved by pressing the Save button at the bottom of the interface.

The Script tab is the core of your node's functionality, where you transform input data into output using JavaScript code.