Data
Literals, type conversion, type tests, and every string, array, object, and JSON operation a graph is built out of.
Data holds the values a blueprint computes with. Reach for it when you need a constant, when a value arrives as the wrong type, or when you have to take apart a string, an array, or a JSON document. Almost nothing here has an exec pin — a Data node is read by whoever is wired to its output. Memo is the one exception, and it explains itself below.
Value types
Ten valueTypes appear on the pins below.
valueType | Holds | Produced by |
|---|---|---|
string | Text. | String, every string node. |
integer | A whole number. | Integer, lengths, indices, counts. |
float | A number. | Float, To Float, Parse Float. |
boolean | True or false. | Boolean, every type test and string test. |
json | Any JSON value: object, array, string, number, boolean, or null. | JSON, Parse JSON, Get JSON Field, Make Object. |
array | A JSON array, as a type of its own. | Make Array, the Array … nodes that return an array, Object Keys, Object Values. |
any | Anything. | Memo, Get Item Field, and the property reads whose shape follows a card selection. |
RGBAColor | { r, g, b, a }. | Color. |
Vector2D | { x, y }. | Vector2D, Make Vector2D, Rect Center, Get Center. |
Rect | { x, y, width, height }. | Rect, Make Rect, Get Bounds, Get Measured Rect. |
An edge between two data pins is allowed when the types are identical, or when one of these holds:
| From | To | Why |
|---|---|---|
integer | float | Every integer is a float. |
integer, float | string | The number is converted to text as the input is read. This is the only coercion that rewrites the value — every other permitted edge passes it through untouched. |
array | json | An array is a JSON value. |
Rect | json | A migration allowance rather than a rule about structured values — see below. |
any | anything | any matches in both directions. |
| anything | any |
Types from other categories widen the same way and nowhere else: element connects to any element:nl.… pin and back, and ImageAsset and string both reach an ImageAsset|null input.
Everything else is refused, including the reverses authors expect to work:
json→array,json→Rect. Every widening rule runs one way only. An arbitrary object is not a rectangle.float→integer. InsertTo Integer, which truncates toward zero.string→integerorfloat. InsertParse Int,Parse Float,To Integer, orTo Float.boolean→string,json→string. Only numbers coerce to text. InsertTo StringorStringify JSON.string,integer,float,boolean→json.arrayandRectare the only types that reach ajsoninput implicitly. InsertTo JSON.RGBAColor→json,Vector2D→json. They are structured types of their own, not JSON documents. Take them apart withBreak Vector2D, or build a document withMake Object.
Rect → json is there for graphs written before Rect was a type. The Rect literal and Get Bounds both published json until it became one, so rectangles authored back then still feed Get JSON Field and keep working. Vector2D never was a json pin and stays narrow.
array feeds a json input, never the reverse. A json value that happens to hold an array — Split's result, Parse JSON, Get JSON Field — will not connect to an array input such as Array Length or List's Set Items. For Each in Flow takes json, so iterating over it still works; the Array … nodes do not.
Conventions
- Every node here is pure but one. There are no exec pins to connect, so a Data node cannot sit on the execution path. Its output is computed when a consumer reads it, and recomputed on the next read.
Memois the exception: it is an exec node, because holding a value still is exactly what a pure node cannot do. - All three graph kinds accept them —
event,function, andmacro— and so does a Blueprint Value graph.Memoagain excepted:eventandmacroonly. - Nothing is modified in place. A node that writes returns a new value on its output pin and leaves its input alone.
- On-card literals exist for
string,integer,float, andbooleanpins only. Ajsonorarrayinput has no on-card editor; feed it aJSONliteral or aMake Object/Make Arraynode. - An unwired input is not an error. It reads the pin's on-card literal, or nothing when there is none, and each node normalizes: a missing array reads as empty, a missing string as
"", a missing number as0. - A chain of pure nodes resolves at most 32 links deep. Past that the read returns nothing, silently.
Array Push, Set JSON Field, Object Set Field, and every other writer on this page hand you a new value and leave the input untouched. Wiring Get Var → Array Push changes nothing on its own — you have to wire the result back into Set Var. See Variables.
Literals
A literal has one output pin and an on-card field. Its type is fixed by the node you pick, which is what makes the rest of the graph type-check.
String
blueprint.data.stringLiteral · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | out · data | string |
On-card fields
| Field | What |
|---|---|
value | The text. |
Integer
blueprint.data.integerLiteral · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | out · data | integer |
On-card fields
| Field | What |
|---|---|
value | A number. Truncated to a whole number when read. |
Float
blueprint.data.floatLiteral · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | out · data | float |
On-card fields
| Field | What |
|---|---|
value | A number. A value that is not finite reads as 0. |
Boolean
blueprint.data.booleanLiteral · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | out · data | boolean |
On-card fields
| Field | What |
|---|---|
value | A True / False dropdown. |
Null
blueprint.data.nullLiteral · Pure
The only literal with no on-card field — there is nothing to configure about null. Its output is typed json, so it reaches any json or any input.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | out · data | json | Always null. |
JSON
blueprint.data.jsonLiteral · Pure
The card shows the root type and a summary; editing opens a tree form with named fields for an object and ordered entries for an array. A new node starts as an empty object.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | out · data | json |
On-card fields
| Field | What |
|---|---|
value | The document, edited as a tree. Everything it writes is JSON-safe. |
Color
blueprint.data.colorLiteral · Pure
Edited with a color picker and shown as 8-digit RGBA hex. The output is always the normalized { r, g, b, a } record — r, g, b as bytes, a from 0 to 1.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | out · data | RGBAColor |
On-card fields
| Field | What |
|---|---|
value | A color picker. |
Vector2D
blueprint.data.vector2dLiteral · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | out · data | Vector2D |
On-card fields
| Field | What |
|---|---|
value | A fixed x / y number schema. Extra fields are rejected, and a field that is missing or not a number reads as 0. |
Rect
blueprint.data.rectLiteral · Pure
Like Color and Vector2D, Rect is a type of its own. Unlike them, it also widens into json, so it still connects to any json input — see the note under Value types.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | out · data | Rect |
On-card fields
| Field | What |
|---|---|
value | A fixed x / y / width / height number schema, validated the same way as Vector2D. |
Number
blueprint.data.numberLiteral · Pure
The legacy number constant, hidden from the palette so it cannot be added to a new graph. It stays registered so old graphs keep resolving. Use Float.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | out · data | float |
On-card fields
| Field | What |
|---|---|
value | A number. |
Literal
blueprint.data.literal · Pure
The legacy untyped constant, also hidden from the palette. Its any output type-checks against everything, which is exactly why the typed literals replaced it.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | out · data | any |
On-card fields
| Field | What |
|---|---|
value | An untyped value. |
Conversion
These are the nodes the connection rules send you to. None of them fail: an input that cannot be read produces the type's zero value rather than an error.
To String
blueprint.string.toString · Pure
null and an unwired input both read as "". An object or an array is serialized to JSON text.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | any | |
result | out · data | string |
To Integer
blueprint.data.toInteger · Pure
Truncates toward zero — -2.7 becomes -2, not -3. true reads as 1, false as 0, a numeric string is accepted, and anything else gives 0.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | any | |
result | out · data | integer |
To Float
blueprint.data.toFloat · Pure
Same acceptance as To Integer, without the truncation. A value that is not a finite number gives 0.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | any | |
result | out · data | float |
To Boolean
blueprint.data.toBoolean · Pure
Strings are matched after trimming and lowercasing: "", "false", "0", and "no" are false; "true", "1", and "yes" are true; any other non-empty string is true. 0 and a non-finite number are false.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | any | |
result | out · data | boolean |
To JSON
blueprint.data.toJson · Pure
A string is parsed as JSON, and kept as the original string when it does not parse — so this node never destroys text. Other values are made JSON-safe: a non-finite number and a cycle become null, a function or symbol becomes its text form.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | any | |
result | out · data | json |
Parse Int
blueprint.data.parseInt · Pure
Base 10, and the leading number wins — "12px" gives 12. No digits at all gives 0.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
result | out · data | integer |
Parse Float
blueprint.data.parseFloat · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
result | out · data | float |
Parse JSON
blueprint.data.parseJson · Pure
Strict: text that does not parse, and an empty string, both give null. Use To JSON instead when you would rather keep the original text.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
result | out · data | json |
Stringify JSON
blueprint.data.stringifyJson · Pure
An unwired input gives the text "null". A value that cannot be serialized gives "".
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | json | |
result | out · data | string |
Type tests
Each takes any and answers a question about the value that actually arrived, which is how you find out what a json or any pin is really carrying.
Is String
blueprint.data.isString · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | any | |
result | out · data | boolean |
Is Number
blueprint.data.isNumber · Pure
Finite numbers only — NaN and the infinities are false, and so is a numeric string. This asks about the type, not about parseability.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | any | |
result | out · data | boolean |
Is Boolean
blueprint.data.isBoolean · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | any | |
result | out · data | boolean |
Is Array
blueprint.data.isArray · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | any | |
result | out · data | boolean |
Is Object
blueprint.data.isObject · Pure
True for a non-null object that is not an array. An array answers Is Array, not this.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | any | |
result | out · data | boolean |
Is Null
blueprint.data.isNull · Pure
True for null, and also for an input that resolved to nothing — an unwired pin reads as null here.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | any | |
result | out · data | boolean |
Not Null
blueprint.data.notNull · Pure
The negation of Is Null, so you do not have to hang a Not off it.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | any | |
result | out · data | boolean |
Is Empty Value
blueprint.data.isEmptyValue · Pure
True for null, "", an empty array, and an empty object. 0 and false are values, not emptiness, and both answer false.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | any | |
result | out · data | boolean |
Strings
Every value input here takes an on-card literal, so a one-off string does not need its own literal node. Indices are zero-based, and out-of-range indices are clamped rather than rejected.
Concat
blueprint.string.concat · Pure
Joins its inputs in pin order with nothing between them. The card has an add-input control: beyond a and b you can append further string inputs, and the signature below shows only the two it starts with.
| Pin | Direction | Type | Notes |
|---|---|---|---|
a | in · data | string | Accepts an on-card literal. |
b | in · data | string | Accepts an on-card literal. |
result | out · data | string |
Format
blueprint.string.format · Pure
Replaces {name} in the template with the matching field of values, or {0}, {1} … when values is an array. A placeholder with no match becomes empty, and every placeholder becomes empty when values is neither an object nor an array.
| Pin | Direction | Type | Notes |
|---|---|---|---|
template | in · data | string | Accepts an on-card literal. |
values | in · data | json | Wire a JSON literal or a Make Object. |
result | out · data | string |
Length
blueprint.string.length · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
length | out · data | integer |
Is Empty
blueprint.string.isEmpty · Pure
Length zero. A string of spaces is not empty — that is Is Blank.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
result | out · data | boolean |
Is Blank
blueprint.string.isBlank · Pure
Empty, or nothing but whitespace.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
result | out · data | boolean |
Trim
blueprint.string.trim · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
result | out · data | string |
Trim Start
blueprint.string.trimStart · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
result | out · data | string |
Trim End
blueprint.string.trimEnd · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
result | out · data | string |
To Upper Case
blueprint.string.toUpperCase · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
result | out · data | string |
To Lower Case
blueprint.string.toLowerCase · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
result | out · data | string |
Capitalize
blueprint.string.capitalize · Pure
Upper-cases the first character and leaves the rest exactly as it is — this is not title case.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
result | out · data | string |
Equals
blueprint.string.equals · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
a | in · data | string | Accepts an on-card literal. |
b | in · data | string | Accepts an on-card literal. |
result | out · data | boolean |
Equals Ignore Case
blueprint.string.equalsIgnoreCase · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
a | in · data | string | Accepts an on-card literal. |
b | in · data | string | Accepts an on-card literal. |
result | out · data | boolean |
Contains
blueprint.string.contains · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
search | in · data | string | Accepts an on-card literal. |
result | out · data | boolean |
Starts With
blueprint.string.startsWith · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
search | in · data | string | Accepts an on-card literal. |
result | out · data | boolean |
Ends With
blueprint.string.endsWith · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
search | in · data | string | Accepts an on-card literal. |
result | out · data | boolean |
Index Of
blueprint.string.indexOf · Pure
Searches forward from start and gives -1 when there is no match. start is clamped into the string, so an out-of-range value searches from the beginning or the end rather than failing.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
search | in · data | string | Accepts an on-card literal. |
start | in · data | integer | Accepts an on-card literal. Defaults to 0. |
index | out · data | integer |
Last Index Of
blueprint.string.lastIndexOf · Pure
Searches backward from the end. There is no start pin — that is the one asymmetry with Index Of.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
search | in · data | string | Accepts an on-card literal. |
index | out · data | integer |
Count
blueprint.string.count · Pure
Counts non-overlapping occurrences. An empty search gives 0, not the string length.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
search | in · data | string | Accepts an on-card literal. |
count | out · data | integer |
Char At
blueprint.string.charAt · Pure
An index outside the string gives "", not an error.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
index | in · data | integer | Accepts an on-card literal. |
char | out · data | string |
Substring
blueprint.string.substring · Pure
The second pin is a length, not an end index. Both are clamped into the string, and an unwired length takes everything from start onwards.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
start | in · data | integer | Accepts an on-card literal. |
length | in · data | integer | Accepts an on-card literal. |
result | out · data | string |
Insert
blueprint.string.insert · Pure
index is clamped into the string, and an index that cannot be read appends at the end.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
index | in · data | integer | Accepts an on-card literal. |
insert | in · data | string | Accepts an on-card literal. |
result | out · data | string |
Replace
blueprint.string.replace · Pure
Replaces the first occurrence only. An empty search returns the value unchanged rather than splicing at every position.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
search | in · data | string | Accepts an on-card literal. |
replacement | in · data | string | Accepts an on-card literal. |
result | out · data | string |
Replace All
blueprint.string.replaceAll · Pure
Every occurrence. search is plain text, not a pattern — an empty search again returns the value unchanged.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
search | in · data | string | Accepts an on-card literal. |
replacement | in · data | string | Accepts an on-card literal. |
result | out · data | string |
Repeat
blueprint.string.repeat · Pure
count is clamped to 0–10000, so a runaway number cannot build an unbounded string.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
count | in · data | integer | Accepts an on-card literal. |
result | out · data | string |
Pad Start
blueprint.string.padStart · Pure
length is the target total length, not the number of characters to add. A string that is already long enough comes back unchanged.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
length | in · data | integer | Accepts an on-card literal. |
pad | in · data | string | Accepts an on-card literal. |
result | out · data | string |
Pad End
blueprint.string.padEnd · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
length | in · data | integer | Accepts an on-card literal. |
pad | in · data | string | Accepts an on-card literal. |
result | out · data | string |
Split
blueprint.string.split · Pure
The result is typed json, not array, so it reaches Join, For Each, and any other json input — but not the Array … nodes.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
separator | in · data | string | Accepts an on-card literal. |
result | out · data | json |
Join
blueprint.string.join · Pure
Takes json, unlike Array Join, which takes array. A values that is not an array gives "".
| Pin | Direction | Type | Notes |
|---|---|---|---|
values | in · data | json | |
separator | in · data | string | Accepts an on-card literal. |
result | out · data | string |
Matches Regex
blueprint.string.matchesRegex · Pure
pattern is the expression source with no delimiters and no flags. A pattern that does not compile gives false rather than raising.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
pattern | in · data | string | Accepts an on-card literal. |
result | out · data | boolean |
Extract Regex
blueprint.string.extractRegex · Pure
Returns the first capture group when the pattern has one, otherwise the whole match. No match, or a pattern that does not compile, gives "".
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
pattern | in · data | string | Accepts an on-card literal. |
result | out · data | string |
Normalize Line Breaks
blueprint.string.normalizeLineBreaks · Pure
Rewrites \r\n and lone \r to \n, so text pasted from any platform compares and splits consistently.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | string | Accepts an on-card literal. |
result | out · data | string |
Arrays
Every one of these reads its array input as an array and substitutes an empty one when it is not, so nothing throws. Every one that writes returns a new array on result.
Array Length
blueprint.collection.arrayLength · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
length | out · data | integer |
Array Get
blueprint.collection.arrayGet · Pure
An index that is negative or past the end gives null. The output is json because an array element can be any JSON value.
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
index | in · data | integer | Accepts an on-card literal. |
item | out · data | json |
Array Set
blueprint.collection.arraySet · Pure
Writes at index and returns the new array. A negative index, or one above 10000, returns the input unchanged; an index past the end extends the array, leaving the skipped slots empty.
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
index | in · data | integer | Accepts an on-card literal. |
item | in · data | any | |
result | out · data | array |
Array Push
blueprint.collection.arrayPush · Pure
Appends to the end.
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
item | in · data | any | |
result | out · data | array |
Array Insert
blueprint.collection.arrayInsert · Pure
index is clamped to 0–length, so an out-of-range index appends rather than failing.
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
index | in · data | integer | Accepts an on-card literal. |
item | in · data | any | |
result | out · data | array |
Array Remove
blueprint.collection.arrayRemove · Pure
Removes the first item equal to item, compared by JSON value — two objects with the same fields match, even though they are different objects. No match returns the input unchanged.
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
item | in · data | any | |
result | out · data | array |
Array Remove At
blueprint.collection.arrayRemoveAt · Pure
Removes one item and closes the gap. An out-of-range index returns the input unchanged.
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
index | in · data | integer | Accepts an on-card literal. |
result | out · data | array |
Array Contains
blueprint.collection.arrayContains · Pure
JSON-value equality, the same rule as Array Remove. This is deliberately looser than Equal in Math, which compares identity.
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
item | in · data | any | |
result | out · data | boolean |
Array Slice
blueprint.collection.arraySlice · Pure
end is exclusive. Both bounds are clamped into the array, and an unwired end runs to the end.
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
start | in · data | integer | Accepts an on-card literal. |
end | in · data | integer | Accepts an on-card literal. |
result | out · data | array |
Array Join
blueprint.collection.arrayJoin · Pure
Converts each item to text — objects and arrays become JSON — and joins them. Takes array, where the string Join takes json.
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
separator | in · data | string | Accepts an on-card literal. |
result | out · data | string |
Array First
blueprint.collection.arrayFirst · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
item | out · data | json | null for an empty array. |
Array Last
blueprint.collection.arrayLast · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
item | out · data | json | null for an empty array. |
Array Is Empty
blueprint.collection.arrayIsEmpty · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
result | out · data | boolean |
Array Index Of
blueprint.collection.arrayIndexOf · Pure
The position of the first item equal to item, compared by value the way Array Contains compares. -1 when nothing matches.
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
item | in · data | any | |
index | out · data | integer |
Array Concat
blueprint.collection.arrayConcat · Pure
a followed by b, as a new array.
| Pin | Direction | Type | Notes |
|---|---|---|---|
a | in · data | array | |
b | in · data | array | |
result | out · data | array |
Array Reverse
blueprint.collection.arrayReverse · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
result | out · data | array |
Array Unique
blueprint.collection.arrayUnique · Pure
Drops later duplicates, keeping the first of each. Items are compared by value, so two objects with the same fields count as one.
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
result | out · data | array |
Array Range
blueprint.collection.arrayRange · Pure
count numbers starting at start, each one step further on. The array a page needs when it has to draw N of something and the numbers are the content.
| Pin | Direction | Type | Notes |
|---|---|---|---|
start | in · data | integer | Accepts an on-card literal. Defaults to 0. |
count | in · data | integer | Accepts an on-card literal. Clamped to 0 or above. |
step | in · data | integer | Accepts an on-card literal. Defaults to 1, and a step of 0 is read as 1 — it would otherwise be count copies of start wearing the shape of a range. |
result | out · data | array |
Array Find By Key
blueprint.collection.arrayFind · Pure
The first item whose key field equals value, and where it was.
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
key | in · data | string | The field name. Accepts an on-card literal. |
value | in · data | any | |
item | out · data | json | null when nothing matches. |
index | out · data | integer | -1 when nothing matches. |
Array Filter By Key
blueprint.collection.arrayFilter · Pure
Every item whose key field equals value, in their original order.
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
key | in · data | string | Accepts an on-card literal. |
value | in · data | any | |
result | out · data | array |
Array Sort By Key
blueprint.collection.arraySort · Pure
Orders records by one of their fields. The three key-based nodes take a field name rather than a comparator, because a comparator is a function value and sorting records by one of their fields is what a list actually needs.
Numbers compare as numbers, booleans as false before true, and everything else as text, ordered the way the runtime collates strings. Items whose field is missing, null, or "" sort to the end in both directions, and ties keep the order they arrived in. An empty key returns the array unchanged.
| Pin | Direction | Type | Notes |
|---|---|---|---|
array | in · data | array | |
key | in · data | string | Accepts an on-card literal. |
descending | in · data | boolean | Accepts an on-card literal. |
result | out · data | array |
JSON Array Length
blueprint.data.jsonArrayLength · Pure
The older name for Array Length, kept so existing graphs keep resolving. A value that is not an array gives 0. Use Array Length in new graphs.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | array | |
length | out · data | integer |
Geometry
Vector2D and Rect are structured types rather than JSON documents, so they are built and taken apart with nodes of their own rather than with Get JSON Field. Every input reads a non-number as 0.
Make Vector2D
blueprint.data.makeVector2d · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
x | in · data | float | Accepts an on-card literal. |
y | in · data | float | Accepts an on-card literal. |
value | out · data | Vector2D |
Unlike the Vector2D literal, both components can be wired — which is what Move Mouse To wants when the point is computed.
Break Vector2D
blueprint.data.breakVector2d · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | Vector2D | |
x | out · data | float | |
y | out · data | float |
Make Rect
blueprint.data.makeRect · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
x | in · data | float | Accepts an on-card literal. |
y | in · data | float | Accepts an on-card literal. |
width | in · data | float | Accepts an on-card literal. |
height | in · data | float | Accepts an on-card literal. |
value | out · data | Rect |
A negative width or height is normalized rather than kept: the origin moves and the extent is made positive, so the rectangle you get is the one you drew.
Break Rect
blueprint.data.breakRect · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | Rect | |
x | out · data | float | |
y | out · data | float | |
width | out · data | float | |
height | out · data | float |
Rect Center
blueprint.data.rectCenter · Pure
The point equidistant from the rectangle's four edges.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | Rect | |
center | out · data | Vector2D |
Objects
These act on one field at a time, by name. They take no path — for a nested write use Set JSON Field. An input that is not an object is read as {}.
Object Keys
blueprint.collection.objectKeys · Pure
Field names in insertion order. An array or any other non-object gives an empty array.
| Pin | Direction | Type | Notes |
|---|---|---|---|
object | in · data | json | |
result | out · data | array |
Object Values
blueprint.collection.objectValues · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
object | in · data | json | |
result | out · data | array |
Object Set Field
blueprint.collection.objectSetField · Pure
field is a plain name, and a dot in it is part of the name rather than a path step. A blank name returns the copy unchanged.
| Pin | Direction | Type | Notes |
|---|---|---|---|
object | in · data | json | |
field | in · data | string | Accepts an on-card literal. |
value | in · data | any | |
result | out · data | json |
Object Remove Field
blueprint.collection.objectRemoveField · Pure
| Pin | Direction | Type | Notes |
|---|---|---|---|
object | in · data | json | |
field | in · data | string | Accepts an on-card literal. |
result | out · data | json |
Object Merge
blueprint.collection.objectMerge · Pure
Shallow merge; b wins on a collision. Nested objects are replaced, not merged. Merge JSON Object is the same operation under a second type id.
| Pin | Direction | Type | Notes |
|---|---|---|---|
a | in · data | json | |
b | in · data | json | |
result | out · data | json |
JSON
The path nodes address a document with dot notation: user.profile.name, and a numeric segment for an array index, items.0. Escape a literal dot in a key as \.. An empty path means the whole document, so Set JSON Field with no path replaces it outright.
Get JSON Field
blueprint.data.jsonGet · Pure
A path that does not exist gives null, so a missing field and a field holding null read the same. Use Has JSON Field when the difference matters.
| Pin | Direction | Type | Notes |
|---|---|---|---|
json | in · data | json | |
path | in · data | string | Accepts an on-card literal. |
result | out · data | json |
Has JSON Field
blueprint.data.jsonHas · Pure
Presence, not truthiness: a field whose value is null still exists.
| Pin | Direction | Type | Notes |
|---|---|---|---|
json | in · data | json | |
path | in · data | string | Accepts an on-card literal. |
result | out · data | boolean |
Set JSON Field
blueprint.data.jsonSet · Pure
Copies the input and writes into the copy. Missing containers along the path are created — an array when the next segment is a number, an object otherwise — so writing stats.hp into an empty document produces { "stats": { "hp": … } }.
| Pin | Direction | Type | Notes |
|---|---|---|---|
json | in · data | json | |
path | in · data | string | Accepts an on-card literal. |
value | in · data | any | Stored JSON-safe. |
result | out · data | json |
Remove JSON Field
blueprint.data.jsonRemove · Pure
Deletes an object field, or splices out an array entry so the later items shift down. A path that does not exist gives back the copy unchanged.
| Pin | Direction | Type | Notes |
|---|---|---|---|
json | in · data | json | |
path | in · data | string | Accepts an on-card literal. |
result | out · data | json |
Make Object
blueprint.data.jsonMakeObject · Pure
Builds an object from dynamic pin pairs, so the signature below is only the output. Each field on the card adds a Name input (string, takes an on-card literal) and a Value input (any); a new node starts with one pair. Names are read at run time, so a wired Name computes the key. A field whose name is blank, or repeats an earlier name, is skipped.
| Pin | Direction | Type | Notes |
|---|---|---|---|
result | out · data | json |
Make Array
blueprint.data.jsonMakeArray · Pure
Builds an array from dynamic Item inputs in pin order, so the signature below is only the output. A new node starts with none — add them on the card. This is the node that produces the array type, and therefore the way to hand a built array to Array Length or List's Set Items.
| Pin | Direction | Type | Notes |
|---|---|---|---|
result | out · data | array |
Merge JSON Object
blueprint.data.jsonMergeObject · Pure
Shallow merge with b winning, identical to Object Merge. A non-object input is treated as {}.
| Pin | Direction | Type | Notes |
|---|---|---|---|
a | in · data | json | |
b | in · data | json | |
result | out · data | json |
Clone JSON
blueprint.data.jsonClone · Pure
A deep, JSON-safe copy. The writer nodes already copy their input, so you only need this when you are about to hand the same document to two branches that must not see each other's edits.
| Pin | Direction | Type | Notes |
|---|---|---|---|
value | in · data | json | |
result | out · data | json |
Holding a value
Memo
blueprint.data.memo
Reads its input once, when execution passes through, and keeps that value on its output until the next time execution passes through.
It is the one data output in the catalogue that may feed several consumers. Everything else is single-consumer, and for two different reasons: a pure node re-evaluates at every read, so one Random Float wired to three pins gives three numbers; and an exec node's output belongs to the pulse that produced it. A Memo has exactly one writer — itself — so every read returns what that write left, and fanning it out cannot surprise anybody.
| Pin | Direction | Type | Notes |
|---|---|---|---|
in | in · exec | — | |
next | out · exec | — | |
value | in · data | any | Read once, as execution passes. |
result | out · data | any | Labelled Value on the card. |
Synchronous rather than latent on purpose: there is nothing to await, and a latent node would be barred from an inline story value. function graphs stay pure, so a Memo cannot go in one.