@n8n-as-code/skills 0.16.9-next.8a0732e → 0.16.9-next.913644e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -165,11 +165,12 @@ n8nac skills validate workflow.workflow.ts --strict
165
165
  ```
166
166
 
167
167
  ### `update-ai` - 🤖 Update AI Context
168
- Update AI Context (AGENTS.md, rule files, snippets).
168
+ Update AI Context (AGENTS.md and snippets).
169
169
 
170
170
  ```bash
171
171
  n8nac skills update-ai
172
- n8nac skills update-ai --version 1.70.0
172
+ n8nac skills update-ai --n8n-version 1.70.0
173
+ n8nac skills update-ai --n8n-version 1.70.0 --cli-version latest
173
174
  # Also available as:
174
175
  n8nac update-ai
175
176
  ```
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-02-28T19:03:27.748Z",
2
+ "generatedAt": "2026-03-01T16:48:35.805Z",
3
3
  "version": "1.0.0",
4
4
  "sourceUrl": "https://docs.n8n.io/llms.txt",
5
5
  "totalPages": 1249,
@@ -10179,7 +10179,7 @@
10179
10179
  "nodeName": null,
10180
10180
  "nodeType": null,
10181
10181
  "content": {
10182
- "markdown": "# Expression Reference\n\nThese are some commonly used expressions. A more exhaustive list appears below.\n\n| Category | Expression | Description |\n| ------------------------------ | --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Access current input item data | `$json` | JSON data of the current item |\n| | `$json.fieldName` | Field of the current item |\n| | `$binary` | Binary data of current item |\n| Access previous node data | `$(\"NodeName\").first()` | First item in a node |\n| | `$(\"NodeName\").item` | Linked item of a node. See [Item linking](../data-mapping/data-item-linking/) for more information. |\n| | `$(\"NodeName\").all()` | All items of a node |\n| | `$(\"NodeName\").last()` | Last item of a node |\n| Date/Time | `$now` | Current date and time |\n| | `$today` | Today's date |\n| | `$now.toFormat(\"yyyy-MM-dd\")` | Format current date as a string |\n| Conditionals | `$if(condition, \"true\", \"false\")` | Helper function that returns a value when a condition is true or false |\n| | `condition ? true : false` | Ternary operator: returns one value if a condition is true, another if false |\n| | `$ifEmpty(value, defaultValue)` | Helper function takes two parameters and tests the first to check if it's empty, then returns either the parameter (if not empty) or the second parameter (if the first is empty). The first parameter is empty if it's `undefined`, `null`, an empty string `''`, an array where `value.length` returns `false` , or an object where `Object.keys(value).length` returns `false` |\n| String Methods | `text.toUpperCase()` | Convert to uppercase |\n| | `text.toLowerCase()` | Convert to lowercase |\n| | `text.includes(\"foo\")` | Check if text contains search term |\n| | `text.extractEmail()` | Extract email from text |\n| Array Methods | `array.length` | Get array length |\n| | `array.join(\", \")` | Join array elements using a comma a separator |\n| | `array.filter(x => x <= 20)` | Filter items of array based on the filtering condition |\n| | `array.map(x => x.id)` | Transform items of an array |\n\nBrowse the tables below to find methods by the data type on which they act. Click a method name to read detailed documentation for it.\n\n## Array\n\n- [*`Array`*.**`append(elem1, elem2?, ..., elemN?)`**](array/#arrayappend)\n\n Adds new elements to the end of the array. Similar to `push()`, but returns the modified array. Consider using spread syntax instead (see examples).\n\n- [*`Array`*.**`average()`**](array/#arrayaverage)\n\n Returns the average of the numbers in the array. Throws an error if there are any non-numbers.\n\n- [*`Array`*.**`chunk(length)`**](array/#arraychunk)\n\n Splits the array into an array of sub-arrays, each with the given length\n\n- [*`Array`*.**`compact()`**](array/#arraycompact)\n\n Removes any empty values from the array. `null`, `\"\"` and `undefined` count as empty.\n\n- [*`Array`*.**`concat(array2, array3?, ... arrayN?)`**](array/#arrayconcat)\n\n Joins one or more arrays onto the end of the base array\n\n- [*`Array`*.**`difference(otherArray)`**](array/#arraydifference)\n\n Compares two arrays. Returns all elements in the base array that aren't present in `otherArray`.\n\n- [*`Array`*.**`filter(function(element, index?, array?), thisValue?)`**](array/#arrayfilter)\n\n Returns an array with only the elements satisfying a condition. The condition is a function that returns `true` or `false`.\n\n- [*`Array`*.**`find(function(element, index?, array?), thisValue?)`**](array/#arrayfind)\n\n Returns the first element from the array that satisfies the provided condition. The condition is a function that returns `true` or `false`. Returns `undefined` if no matches are found.\n\nIf you need all matching elements, use `filter()`.\n\n- [*`Array`*.**`first()`**](array/#arrayfirst)\n\n Returns the first element of the array\n\n- [*`Array`*.**`includes(element, start?)`**](array/#arrayincludes)\n\n Returns `true` if the array contains the specified element\n\n- [*`Array`*.**`indexOf(element, start?)`**](array/#arrayindexof)\n\n Returns the position of the first matching element in the array, or -1 if the element isn’t found. Positions start at 0.\n\n- [*`Array`*.**`intersection(otherArray)`**](array/#arrayintersection)\n\n Compares two arrays. Returns all elements in the base array that are also present in the other array.\n\n- [*`Array`*.**`isEmpty()`**](array/#arrayisempty)\n\n Returns `true` if the array has no elements or is `null`\n\n- [*`Array`*.**`isNotEmpty()`**](array/#arrayisnotempty)\n\n Returns `true` if the array has at least one element\n\n- [*`Array`*.**`join(separator?)`**](array/#arrayjoin)\n\n Merges all elements of the array into a single string, with an optional separator between each element.\n\nThe opposite of `split()`.\n\n- [*`Array`*.**`last()`**](array/#arraylast)\n\n Returns the last element of the array\n\n- [*`Array`*.**`length`**](array/#arraylength)\n\n The number of elements in the array\n\n- [*`Array`*.**`map(function(element, index?, array?), thisValue?)`**](array/#arraymap)\n\n Creates a new array by applying a function to each element of the original array\n\n- [*`Array`*.**`max()`**](array/#arraymax)\n\n Returns the largest number in the array. Throws an error if there are any non-numbers.\n\n- [*`Array`*.**`min()`**](array/#arraymin)\n\n Returns the smallest number in the array. Throws an error if there are any non-numbers.\n\n- [*`Array`*.**`pluck(fieldName1?, fieldName2?, …)`**](array/#arraypluck)\n\n Returns an array containing the values of the given field(s) in each Object of the array. Ignores any array elements that aren’t Objects or don’t have a key matching the field name(s) provided.\n\n- [*`Array`*.**`randomItem()`**](array/#arrayrandomitem)\n\n Returns a randomly-chosen element from the array\n\n- [*`Array`*.**`reduce(function(prevResult, currentElem, currentIndex?, array?), initResult)`**](array/#arrayreduce)\n\n Reduces an array to a single value by applying a function to each element. The function combines the current element with the result of reducing the previous elements, producing a new result.\n\n- [*`Array`*.**`removeDuplicates(keys?)`**](array/#arrayremoveduplicates)\n\n Removes any re-occurring elements from the array\n\n- [*`Array`*.**`renameKeys(from, to)`**](array/#arrayrenamekeys)\n\n Changes all matching keys (field names) of any Objects in the array. Rename more than one key by adding extra arguments, i.e. `from1, to1, from2, to2, ...`.\n\n- [*`Array`*.**`reverse()`**](array/#arrayreverse)\n\n Reverses the order of the elements in the array\n\n- [*`Array`*.**`slice(start, end)`**](array/#arrayslice)\n\n Returns a portion of the array, from the `start` index up to (but not including) the `end` index. Indexes start at 0.\n\n- [*`Array`*.**`smartJoin(keyField, nameField)`**](array/#arraysmartjoin)\n\n Creates a single Object from an array of Objects. Each Object in the array provides one field for the returned Object. Each Object in the array must contain a field with the key name and a field with the value.\n\n- [*`Array`*.**`sort(compareFunction(a, b)?)`**](array/#arraysort)\n\n Reorders the elements of the array. For sorting strings alphabetically, no parameter is required. For sorting numbers or Objects, see examples.\n\n- [*`Array`*.**`sum()`**](array/#arraysum)\n\n Returns the total of all the numbers in the array. Throws an error if there are any non-numbers.\n\n- [*`Array`*.**`toJsonString()`**](array/#arraytojsonstring)\n\n Converts the array to a JSON string. The same as JavaScript’s `JSON.stringify()`.\n\n- [*`Array`*.**`toSpliced(start, deleteCount, elem1, ....., elemN)`**](array/#arraytospliced)\n\n Adds and/or removes array elements at a given position.\n\nSee also `slice()` and `append()`.\n\n- [*`Array`*.**`toString()`**](array/#arraytostring)\n\n Converts the array to a string, with values separated by commas. To use a different separator, use `join()` instead.\n\n- [*`Array`*.**`union(otherArray)`**](array/#arrayunion)\n\n Concatenates two arrays and then removes any duplicates\n\n- [*`Array`*.**`unique()`**](array/#arrayunique)\n\n Removes any duplicate elements from the array\n\n## BinaryFile\n\n- [`binaryFile`.**`directory`**](binaryfile/#binaryfiledirectory)\n\n The path to the directory that the file is stored in. Useful for distinguishing between files with the same name in different directories. Not set if n8n is configured to store files in its database.\n\n- [`binaryFile`.**`fileExtension`**](binaryfile/#binaryfilefileextension)\n\n The suffix attached to the filename (e.g. `txt`)\n\n- [`binaryFile`.**`fileName`**](binaryfile/#binaryfilefilename)\n\n The name of the file, including extension\n\n- [`binaryFile`.**`fileSize`**](binaryfile/#binaryfilefilesize)\n\n A string representing the size of the file\n\n- [`binaryFile`.**`fileType`**](binaryfile/#binaryfilefiletype)\n\n A string representing the type of the file, e.g. `image`. Corresponds to the first part of the MIME type.\n\n- [`binaryFile`.**`id`**](binaryfile/#binaryfileid)\n\n The unique ID of the file. Used to identify the file when it is stored on disk or in a storage service such as S3.\n\n- [`binaryFile`.**`mimeType`**](binaryfile/#binaryfilemimetype)\n\n A string representing the format of the file’s contents, e.g. `image/jpeg`\n\n## Boolean\n\n- [*`Boolean`*.**`isEmpty()`**](boolean/#booleanisempty)\n\n Returns `false` for all booleans. Returns `true` for `null`.\n\n- [*`Boolean`*.**`toNumber()`**](boolean/#booleantonumber)\n\n Converts `true` to 1 and `false` to 0\n\n- [*`Boolean`*.**`toString()`**](boolean/#booleantostring)\n\n Converts `true` to the string ‘true’ and `false` to the string ‘false’\n\n## CustomData\n\n- [`$execution.customData`.**`get(key)`**](customdata/#executioncustomdataget)\n\n Returns the custom execution data stored under the given key. [More info](/workflows/executions/custom-executions-data/)\n\n- [`$execution.customData`.**`getAll()`**](customdata/#executioncustomdatagetall)\n\n Returns all the key-value pairs of custom data that have been set in the current execution. [More info](/workflows/executions/custom-executions-data/)\n\n- [`$execution.customData`.**`set(key, value)`**](customdata/#executioncustomdataset)\n\n Stores custom execution data under the key specified. Use this to easily filter executions by this data. [More info](/workflows/executions/custom-executions-data/)\n\n- [`$execution.customData`.**`setAll(obj)`**](customdata/#executioncustomdatasetall)\n\n Sets multiple key-value pairs of custom data for the execution. Use this to easily filter executions by this data. [More info](/workflows/executions/custom-executions-data/)\n\n## Date\n\n- [*`Date`*.**`toDateTime()`**](date/#datetodatetime)\n\n Converts a JavaScript Date to a Luxon DateTime. The DateTime contains the same information, but is easier to manipulate.\n\n## DateTime\n\n- [*`DateTime`*.**`day`**](datetime/#datetimeday)\n\n The day of the month (1-31)\n\n- [*`DateTime`*.**`diffTo(otherDateTime, unit)`**](datetime/#datetimediffto)\n\n Returns the difference between two DateTimes, in the given unit(s)\n\n- [*`DateTime`*.**`diffToNow(unit)`**](datetime/#datetimedifftonow)\n\n Returns the difference between the current moment and the DateTime, in the given unit(s). For a textual representation, use `toRelative()` instead.\n\n- [*`DateTime`*.**`endOf(unit, opts)`**](datetime/#datetimeendof)\n\n Rounds the DateTime up to the end of one of its units, e.g. the end of the month\n\n- [*`DateTime`*.**`equals(other)`**](datetime/#datetimeequals)\n\n Returns `true` if the two DateTimes represent exactly the same moment and are in the same time zone. For a less strict comparison, use `hasSame()`.\n\n- [*`DateTime`*.**`extract(unit?)`**](datetime/#datetimeextract)\n\n Extracts a part of the date or time, e.g. the month, as a number. To extract textual names instead, see `format()`.\n\n- [*`DateTime`*.**`format(fmt)`**](datetime/#datetimeformat)\n\n Converts the DateTime to a string, using the format specified. [Formatting guide](https://moment.github.io/luxon/#/formatting?id=table-of-tokens). For common formats, `toLocaleString()` may be easier.\n\n- [*`DateTime`*.**`hasSame(otherDateTime, unit)`**](datetime/#datetimehassame)\n\n Returns `true` if the two DateTimes are the same, down to the unit specified. Time zones are ignored (only local times are compared), so use `toUTC()` first if needed.\n\n- [*`DateTime`*.**`hour`**](datetime/#datetimehour)\n\n The hour of the day (0-23)\n\n- [*`DateTime`*.**`isBetween(date1, date2)`**](datetime/#datetimeisbetween)\n\n Returns `true` if the DateTime lies between the two moments specified\n\n- [*`DateTime`*.**`isInDST`**](datetime/#datetimeisindst)\n\n Whether the DateTime is in daylight saving time\n\n- [*`DateTime`*.**`locale`**](datetime/#datetimelocale)\n\n The locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime.\n\n- [*`DateTime`*.**`millisecond`**](datetime/#datetimemillisecond)\n\n The millisecond of the second (0-999)\n\n- [*`DateTime`*.**`minus(n, unit?)`**](datetime/#datetimeminus)\n\n Subtracts a given period of time from the DateTime\n\n- [*`DateTime`*.**`minute`**](datetime/#datetimeminute)\n\n The minute of the hour (0-59)\n\n- [*`DateTime`*.**`month`**](datetime/#datetimemonth)\n\n The month (1-12)\n\n- [*`DateTime`*.**`monthLong`**](datetime/#datetimemonthlong)\n\n The textual long month name, e.g. 'October'. Defaults to the system's locale if no locale has been specified.\n\n- [*`DateTime`*.**`monthShort`**](datetime/#datetimemonthshort)\n\n The textual abbreviated month name, e.g. 'Oct'. Defaults to the system's locale if no locale has been specified.\n\n- [*`DateTime`*.**`plus(n, unit?)`**](datetime/#datetimeplus)\n\n Adds a given period of time to the DateTime\n\n- [*`DateTime`*.**`quarter`**](datetime/#datetimequarter)\n\n The quarter of the year (1-4)\n\n- [*`DateTime`*.**`second`**](datetime/#datetimesecond)\n\n The second of the minute (0-59)\n\n- [*`DateTime`*.**`set(values)`**](datetime/#datetimeset)\n\n Assigns new values to specified units of the DateTime. To round a DateTime, see also `startOf()` and `endOf()`.\n\n- [*`DateTime`*.**`setLocale(locale)`**](datetime/#datetimesetlocale)\n\n Sets the locale, which determines the language and formatting for the DateTime. Useful when generating a textual representation of the DateTime, e.g. with `format()` or `toLocaleString()`.\n\n- [*`DateTime`*.**`setZone(zone, opts)`**](datetime/#datetimesetzone)\n\n Converts the DateTime to the given time zone. The DateTime still represents the same moment unless specified in the options. See also `toLocal()` and `toUTC()`.\n\n- [*`DateTime`*.**`startOf(unit, opts)`**](datetime/#datetimestartof)\n\n Rounds the DateTime down to the beginning of one of its units, e.g. the start of the month\n\n- [*`DateTime`*.**`toISO(opts)`**](datetime/#datetimetoiso)\n\n Returns an ISO 8601-compliant string representation of the DateTime\n\n- [*`DateTime`*.**`toLocal()`**](datetime/#datetimetolocal)\n\n Converts a DateTime to the workflow’s local time zone. The DateTime still represents the same moment unless specified in the parameters. The workflow’s time zone can be set in the workflow settings.\n\n- [*`DateTime`*.**`toLocaleString(formatOpts)`**](datetime/#datetimetolocalestring)\n\n Returns a localised string representing the DateTime, i.e. in the language and format corresponding to its locale. Defaults to the system's locale if none specified.\n\n- [*`DateTime`*.**`toMillis()`**](datetime/#datetimetomillis)\n\n Returns a Unix timestamp in milliseconds (the number elapsed since 1st Jan 1970)\n\n- [*`DateTime`*.**`toRelative(options)`**](datetime/#datetimetorelative)\n\n Returns a textual representation of the time relative to now, e.g. ‘in two days’. Rounds down by default.\n\n- [*`DateTime`*.**`toSeconds()`**](datetime/#datetimetoseconds)\n\n Returns a Unix timestamp in seconds (the number elapsed since 1st Jan 1970)\n\n- [*`DateTime`*.**`toString()`**](datetime/#datetimetostring)\n\n Returns a string representation of the DateTime. Similar to `toISO()`. For more formatting options, see `format()` or `toLocaleString()`.\n\n- [*`DateTime`*.**`toUTC(offset, opts)`**](datetime/#datetimetoutc)\n\n Converts a DateTime to the UTC time zone. The DateTime still represents the same moment unless specified in the parameters. Use `setZone()` to convert to other zones.\n\n- [*`DateTime`*.**`weekday`**](datetime/#datetimeweekday)\n\n The day of the week. 1 is Monday and 7 is Sunday.\n\n- [*`DateTime`*.**`weekdayLong`**](datetime/#datetimeweekdaylong)\n\n The textual long weekday name, e.g. 'Wednesday'. Defaults to the system's locale if no locale has been specified.\n\n- [*`DateTime`*.**`weekdayShort`**](datetime/#datetimeweekdayshort)\n\n The textual abbreviated weekday name, e.g. 'Wed'. Defaults to the system's locale if no locale has been specified.\n\n- [*`DateTime`*.**`weekNumber`**](datetime/#datetimeweeknumber)\n\n The week number of the year (1-52ish)\n\n- [*`DateTime`*.**`year`**](datetime/#datetimeyear)\n\n The year\n\n- [*`DateTime`*.**`zone`**](datetime/#datetimezone)\n\n The time zone associated with the DateTime\n\n## ExecData\n\n- [`$exec`.**`customData`**](execdata/#execcustomdata)\n\n Set and get custom execution data (e.g. to filter executions by). You can also do this with the ‘Execution Data’ node. [More info](/workflows/executions/custom-executions-data/)\n\n- [`$exec`.**`id`**](execdata/#execid)\n\n The ID of the current workflow execution\n\n- [`$exec`.**`mode`**](execdata/#execmode)\n\n Can be one of 3 values: either `test` (meaning the execution was triggered by clicking a button in n8n) or `production` (meaning the execution was triggered automatically). When running workflow tests, `evaluation` is used.\n\n- [`$exec`.**`resumeFormUrl`**](execdata/#execresumeformurl)\n\n The URL to access a form generated by the [’Wait’ node](/integrations/builtin/core-nodes/n8n-nodes-base.wait/).\n\n- [`$exec`.**`resumeUrl`**](execdata/#execresumeurl)\n\n The webhook URL to call to resume a workflow waiting at a [’Wait’ node](/integrations/builtin/core-nodes/n8n-nodes-base.wait/).\n\n## HTTPResponse\n\n- [`$response`.**`body`**](httpresponse/#responsebody)\n\n The body of the response object from the last HTTP call. Only available in the ‘HTTP Request’ node\n\n- [`$response`.**`headers`**](httpresponse/#responseheaders)\n\n The headers returned by the last HTTP call. Only available in the ‘HTTP Request’ node.\n\n- [`$response`.**`statusCode`**](httpresponse/#responsestatuscode)\n\n The HTTP status code returned by the last HTTP call. Only available in the ‘HTTP Request’ node.\n\n- [`$response`.**`statusMessage`**](httpresponse/#responsestatusmessage)\n\n An optional message regarding the request status. Only available in the ‘HTTP Request’ node.\n\n## Item\n\n- [`$item`.**`binary`**](item/#itembinary)\n\n Returns any binary data the item contains\n\n- [`$item`.**`json`**](item/#itemjson)\n\n Returns the JSON data the item contains. [More info](/data/data-structure/)\n\n## NodeInputData\n\n- [`$input`.**`all(branchIndex?, runIndex?)`**](nodeinputdata/#inputall)\n\n Returns an array of the current node’s input items\n\n- [`$input`.**`first(branchIndex?, runIndex?)`**](nodeinputdata/#inputfirst)\n\n Returns the current node’s first input item\n\n- [`$input`.**`item`**](nodeinputdata/#inputitem)\n\n Returns the input item currently being processed\n\n- [`$input`.**`last(branchIndex?, runIndex?)`**](nodeinputdata/#inputlast)\n\n Returns the current node’s last input item\n\n- [`$input`.**`params`**](nodeinputdata/#inputparams)\n\n The configuration settings of the current node. These are the parameters you fill out within the node when configuring it (e.g. its operation).\n\n## NodeOutputData\n\n- [`$()`.**`all(branchIndex?, runIndex?)`**](nodeoutputdata/#all)\n\n Returns an array of the node’s output items\n\n- [`$()`.**`first(branchIndex?, runIndex?)`**](nodeoutputdata/#first)\n\n Returns the first item output by the node\n\n- [`$()`.**`isExecuted`**](nodeoutputdata/#isexecuted)\n\n Is `true` if the node has executed, `false` otherwise\n\n- [`$()`.**`item`**](nodeoutputdata/#item)\n\n Returns the matching item, i.e. the one used to produce the current item in the current node. [More info](/data/data-mapping/data-item-linking/)\n\n- [`$()`.**`itemMatching(currentItemIndex?)`**](nodeoutputdata/#itemmatching)\n\n Returns the matching item, i.e. the one used to produce the item in the current node at the specified index. [More info](/data/data-mapping/data-item-linking/)\n\n- [`$()`.**`last(branchIndex?, runIndex?)`**](nodeoutputdata/#last)\n\n Returns the last item output by the node\n\n- [`$()`.**`params`**](nodeoutputdata/#params)\n\n The configuration settings of the given node. These are the parameters you fill out within the node’s UI (e.g. its operation).\n\n## Number\n\n- [*`Number`*.**`abs()`**](number/#numberabs)\n\n Returns the number’s absolute value, i.e. removes any minus sign\n\n- [*`Number`*.**`ceil()`**](number/#numberceil)\n\n Rounds the number up to the next whole number\n\n- [*`Number`*.**`floor()`**](number/#numberfloor)\n\n Rounds the number down to the nearest whole number\n\n- [*`Number`*.**`format(locale?, options?)`**](number/#numberformat)\n\n Returns a formatted string representing the number. Useful for formatting for a specific language or currency. The same as [`Intl.NumberFormat()`](%E2%80%9Dhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat%E2%80%9D).\n\n- [*`Number`*.**`isEmpty()`**](number/#numberisempty)\n\n Returns `false` for all numbers. Returns `true` for `null`.\n\n- [*`Number`*.**`isEven()`**](number/#numberiseven)\n\n Returns `true` if the number is even. Throws an error if the number isn’t a whole number.\n\n- [*`Number`*.**`isInteger()`**](number/#numberisinteger)\n\n Returns `true` if the number is a whole number\n\n- [*`Number`*.**`isOdd()`**](number/#numberisodd)\n\n Returns `true` if the number is odd. Throws an error if the number isn’t a whole number.\n\n- [*`Number`*.**`round(decimalPlaces?)`**](number/#numberround)\n\n Returns the number rounded to the nearest whole number (or specified number of decimal places)\n\n- [*`Number`*.**`toBoolean()`**](number/#numbertoboolean)\n\n Converts the number to a boolean value. `0` becomes `false`; everything else becomes `true`.\n\n- [*`Number`*.**`toDateTime(format?)`**](number/#numbertodatetime)\n\n Converts a numerical timestamp into a DateTime. The format of the timestamp must be specified if it’s not in milliseconds. Uses the time zone in n8n (or in the workflow���s settings).\n\n- [*`Number`*.**`toLocaleString(locales?, options?)`**](number/#numbertolocalestring)\n\n Returns a localised string representing the number, i.e. in the language and format corresponding to its locale. Defaults to the system's locale if none specified.\n\n- [*`Number`*.**`toString(radix?)`**](number/#numbertostring)\n\n Converts the number to a simple textual representation. For more formatting options, see `toLocaleString()`.\n\n## Object\n\n- [*`Object`*.**`compact()`**](object/#objectcompact)\n\n Removes all fields that have empty values, i.e. are `null` or `\"\"`\n\n- [*`Object`*.**`hasField(name)`**](object/#objecthasfield)\n\n Returns `true` if there is a field called `name`. Only checks top-level keys. Comparison is case-sensitive.\n\n- [*`Object`*.**`isEmpty()`**](object/#objectisempty)\n\n Returns `true` if the Object has no keys (fields) set or is `null`\n\n- [*`Object`*.**`isNotEmpty()`**](object/#objectisnotempty)\n\n Returns `true` if the Object has at least one key (field) set\n\n- [*`Object`*.**`keepFieldsContaining(value)`**](object/#objectkeepfieldscontaining)\n\n Removes any fields whose values don’t at least partly match the given `value`. Comparison is case-sensitive. Fields that aren’t strings will always be removed.\n\n- [*`Object`*.**`keys()`**](object/#objectkeys)\n\n Returns an array with all the field names (keys) the object contains. The same as JavaScript’s `Object.keys(obj)`.\n\n- [*`Object`*.**`merge(otherObject)`**](object/#objectmerge)\n\n Merges the two Objects into a single one. If a key (field name) exists in both Objects, the value from the first (base) Object is used.\n\n- [*`Object`*.**`removeField(key)`**](object/#objectremovefield)\n\n Removes a field from the Object. The same as JavaScript’s `delete`.\n\n- [*`Object`*.**`removeFieldsContaining(value)`**](object/#objectremovefieldscontaining)\n\n Removes keys (fields) whose values at least partly match the given `value`. Comparison is case-sensitive. Fields that aren’t strings are always kept.\n\n- [*`Object`*.**`toJsonString()`**](object/#objecttojsonstring)\n\n Converts the Object to a JSON string. Similar to JavaScript’s `JSON.stringify()`.\n\n- [*`Object`*.**`urlEncode()`**](object/#objecturlencode)\n\n Generates a URL parameter string from the Object’s keys and values. Only top-level keys are supported.\n\n- [*`Object`*.**`values()`**](object/#objectvalues)\n\n Returns an array with all the values of the fields the Object contains. The same as JavaScript’s `Object.values(obj)`.\n\n## PrevNodeData\n\n- [**`name`**](prevnodedata/#name)\n\n The name of the node that the current input came from.\n\nAlways uses the current node’s first input connector if there is more than one (e.g. in the ‘Merge’ node).\n\n- [**`outputIndex`**](prevnodedata/#outputindex)\n\n The index of the output connector that the current input came from. Use this when the previous node had multiple outputs (such as an ‘If’ or ‘Switch’ node).\n\nAlways uses the current node’s first input connector if there is more than one (e.g. in the ‘Merge’ node).\n\n- [**`runIndex`**](prevnodedata/#runindex)\n\n The run of the previous node that generated the current input.\n\nAlways uses the current node’s first input connector if there is more than one (e.g. in the ‘Merge’ node).\n\n## Root\n\n- [**`$(nodeName)`**](root/)\n\n Returns the data of the specified node\n\n- [**`$binary`**](root/#binary)\n\n Returns any binary input data to the current node, for the current item. Shorthand for `$input.item.binary`.\n\n- [**`$execution`**](root/#execution)\n\n Retrieve or set metadata for the current execution\n\n- [**`$fromAI(key, description?, type?, defaultValue?)`**](root/#fromai)\n\n Use when a large language model should provide the value of a node parameter. Consider providing a description for better results.\n\n- [**`$if(condition, valueIfTrue, valueIfFalse)`**](root/#if)\n\n Returns one of two values depending on the `condition`. Similar to the `?` operator in JavaScript.\n\n- [**`$ifEmpty(value, valueIfEmpty)`**](root/#ifempty)\n\n Returns the first parameter if it isn’t empty, otherwise returns the second parameter. The following count as empty: `””`, `[]`, `{}`, `null`, `undefined`\n\n- [**`$input`**](root/#input)\n\n The input data of the current node\n\n- [**`$itemIndex`**](root/#itemindex)\n\n The position of the item currently being processed in the list of input items\n\n- [**`$jmespath(obj, expression)`**](root/#jmespath)\n\n Extracts data from an object (or array of objects) using a [JMESPath](%E2%80%9D/code/cookbook/jmespath/%E2%80%9D) expression. Useful for querying complex, nested objects. Returns `undefined` if the expression is invalid.\n\n- [**`$json`**](root/#json)\n\n Returns the JSON input data to the current node, for the current item. Shorthand for `$input.item.json`. [More info](/data/data-structure/)\n\n- [**`$max(num1, num2, …, numN)`**](root/#max)\n\n Returns the highest of the given numbers\n\n- [**`$min(num1, num2, …, numN)`**](root/#min)\n\n Returns the lowest of the given numbers\n\n- [**`$nodeVersion`**](root/#nodeversion)\n\n The version of the current node (as displayed at the bottom of the nodes’s settings pane)\n\n- [**`$now`**](root/#now)\n\n A DateTime representing the current moment.\n\nUses the workflow’s time zone (which can be changed in the workflow settings).\n\n- [**`$pageCount`**](root/#pagecount)\n\n The number of results pages the node has fetched. Only available in the ‘HTTP Request’ node.\n\n- [**`$parameter`**](root/#parameter)\n\n The configuration settings of the current node. These are the parameters you fill out within the node’s UI (e.g. its operation).\n\n- [**`$prevNode`**](root/#prevnode)\n\n Information about the node that the current input came from.\n\nWhen in a ‘Merge’ node, always uses the first input connector.\n\n- [**`$request`**](root/#request)\n\n The request object sent during the last run of the node. Only available in the ‘HTTP Request’ node.\n\n- [**`$response`**](root/#response)\n\n The response returned by the last HTTP call. Only available in the ‘HTTP Request’ node.\n\n- [**`$runIndex`**](root/#runindex)\n\n The index of the current run of the current node execution. Starts at 0.\n\n- [**`$secrets`**](root/#secrets)\n\n The secrets from an [external secrets vault](/external-secrets/), if configured. Secret values are never displayed to the user. Only available in credential fields.\n\n- [**`$today`**](root/#today)\n\n A DateTime representing midnight at the start of the current day.\n\nUses the instance’s time zone (unless overridden in the workflow’s settings).\n\n- [**`$vars`**](root/#vars)\n\n The [variables](/code/variables/) available to the workflow\n\n- [**`$workflow`**](root/#workflow)\n\n Information about the current workflow\n\n## String\n\n- [*`String`*.**`base64Encode()`**](string/#stringbase64decode)\n\n Converts plain text to a base64-encoded string\n\n- [*`String`*.**`base64Encode()`**](string/#stringbase64encode)\n\n Converts a base64-encoded string to plain text\n\n- [*`String`*.**`concat(string1, string2?, ..., stringN?)`**](string/#stringconcat)\n\n Joins one or more strings onto the end of the base string. Alternatively, use the `+` operator (see examples).\n\n- [*`String`*.**`extractDomain()`**](string/#stringextractdomain)\n\n If the string is an email address or URL, returns its domain (or `undefined` if nothing found).\n\nIf the string also contains other content, try using `extractEmail()` or `extractUrl()` first.\n\n- [*`String`*.**`extractEmail()`**](string/#stringextractemail)\n\n Extracts the first email found in the string. Returns `undefined` if none is found.\n\n- [*`String`*.**`extractUrl()`**](string/#stringextracturl)\n\n Extracts the first URL found in the string. Returns `undefined` if none is found. Only recognizes full URLs, e.g. those starting with `http`.\n\n- [*`String`*.**`extractUrlPath()`**](string/#stringextracturlpath)\n\n Returns the part of a URL after the domain, or `undefined` if no URL found.\n\nIf the string also contains other content, try using `extractUrl()` first.\n\n- [*`String`*.**`hash(algo?)`**](string/#stringhash)\n\n Returns the string hashed with the given algorithm. Defaults to md5 if not specified.\n\n- [*`String`*.**`includes(searchString, start?)`**](string/#stringincludes)\n\n Returns `true` if the string contains the `searchString`. Case-sensitive.\n\n- [*`String`*.**`indexOf(searchString, start?)`**](string/#stringindexof)\n\n Returns the index (position) of the first occurrence of `searchString` within the base string, or -1 if not found. Case-sensitive.\n\n- [*`String`*.**`isDomain()`**](string/#stringisdomain)\n\n Returns `true` if the string is a domain\n\n- [*`String`*.**`isEmail()`**](string/#stringisemail)\n\n Returns `true` if the string is an email\n\n- [*`String`*.**`isEmpty()`**](string/#stringisempty)\n\n Returns `true` if the string has no characters or is `null`\n\n- [*`String`*.**`isNotEmpty()`**](string/#stringisnotempty)\n\n Returns `true` if the string has at least one character\n\n- [*`String`*.**`isNumeric()`**](string/#stringisnumeric)\n\n Returns `true` if the string represents a number\n\n- [*`String`*.**`isUrl()`**](string/#stringisurl)\n\n Returns `true` if the string is a valid URL\n\n- [*`String`*.**`length`**](string/#stringlength)\n\n The number of characters in the string\n\n- [*`String`*.**`match(regexp)`**](string/#stringmatch)\n\n Matches the string against a [regular expression](%E2%80%9Dhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions%E2%80%9D). Returns an array containing the first match, or all matches if the `g` flag is set in the regular expression. Returns `null` if no matches are found.\n\nFor checking whether text is present, consider `includes()` instead.\n\n- [*`String`*.**`parseJson()`**](string/#stringparsejson)\n\n Returns the JavaScript Object or value represented by the string, or `undefined` if the string isn’t valid JSON. Single-quoted JSON is not supported.\n\n- [*`String`*.**`quote(mark?)`**](string/#stringquote)\n\n Wraps a string in quotation marks, and escapes any quotation marks already in the string. Useful when constructing JSON, SQL, etc.\n\n- [*`String`*.**`removeMarkdown()`**](string/#stringremovemarkdown)\n\n Removes any Markdown formatting from the string. Also removes HTML tags.\n\n- [*`String`*.**`removeTags()`**](string/#stringremovetags)\n\n Removes tags, such as HTML or XML, from the string\n\n- [*`String`*.**`replace(pattern, replacement)`**](string/#stringreplace)\n\n Returns a string with the first occurrence of `pattern` replaced by `replacement`.\n\nTo replace all occurrences, use `replaceAll()` instead.\n\n- [*`String`*.**`replaceAll(pattern, replacement)`**](string/#stringreplaceall)\n\n Returns a string with all occurrences of `pattern` replaced by `replacement`\n\n- [*`String`*.**`replaceSpecialChars()`**](string/#stringreplacespecialchars)\n\n Replaces special characters in the string with the closest ASCII character\n\n- [*`String`*.**`search(regexp)`**](string/#stringsearch)\n\n Returns the index (position) of the first occurrence of a pattern within the string, or -1 if not found. The pattern is specified using a [regular expression](%E2%80%9Dhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions%E2%80%9D). To use text instead, see `indexOf()`.\n\n- [*`String`*.**`slice(start, end?)`**](string/#stringslice)\n\n Extracts a fragment of the string at the given position. For more advanced extraction, see `match()`.\n\n- [*`String`*.**`split(separator?, limit?)`**](string/#stringsplit)\n\n Splits the string into an array of substrings. Each split is made at the `separator`, and the separator isn’t included in the output.\n\nThe opposite of using `join()` on an array.\n\n- [*`String`*.**`startsWith(searchString, start?)`**](string/#stringstartswith)\n\n Returns `true` if the string starts with `searchString`. Case-sensitive.\n\n- [*`String`*.**`substring(start, end?)`**](string/#stringsubstring)\n\n Extracts a fragment of the string at the given position. For more advanced extraction, see `match()`.\n\n- [*`String`*.**`toBoolean()`**](string/#stringtoboolean)\n\n Converts the string to a boolean value. `0`, `false` and `no` resolve to `false`, everything else to `true`. Case-insensitive.\n\n- [*`String`*.**`toDateTime()`**](string/#stringtodatetime)\n\n Converts the string to a DateTime. Useful for further transformation. Supported formats for the string are ISO 8601, HTTP, RFC2822, SQL and Unix timestamp in milliseconds.\n\nTo parse other formats, use [`DateTime.fromFormat()`](%E2%80%9Dhttps://moment.github.io/luxon/api-docs/index.html#datetimefromformat%E2%80%9D).\n\n- [*`String`*.**`toJsonString()`**](string/#stringtojsonstring)\n\n Prepares the string to be inserted into a JSON object. Escapes any quotes and special characters (e.g. new lines), and wraps the string in quotes.\n\nThe same as JavaScript’s `JSON.stringify()`.\n\n- [*`String`*.**`toLowerCase()`**](string/#stringtolowercase)\n\n Converts all letters in the string to lower case\n\n- [*`String`*.**`toNumber()`**](string/#stringtonumber)\n\n Converts a string representing a number to a number. Throws an error if the string doesn’t start with a valid number.\n\n- [*`String`*.**`toSentenceCase()`**](string/#stringtosentencecase)\n\n Changes the capitalization of the string to sentence case. The first letter of each sentence is capitalized and all others are lowercased.\n\n- [*`String`*.**`toSnakeCase()`**](string/#stringtosnakecase)\n\n Changes the format of the string to snake case. Spaces and dashes are replaced by `_`, symbols are removed and all letters are lowercased.\n\n- [*`String`*.**`toTitleCase()`**](string/#stringtotitlecase)\n\n Changes the capitalization of the string to title case. The first letter of each word is capitalized and the others left unchanged. Short prepositions and conjunctions aren’t capitalized (e.g. ‘a’, ‘the’).\n\n- [*`String`*.**`toUpperCase()`**](string/#stringtouppercase)\n\n Converts all letters in the string to upper case (capitals)\n\n- [*`String`*.**`trim()`**](string/#stringtrim)\n\n Removes whitespace from both ends of the string. Whitespace includes new lines, tabs, spaces, etc.\n\n- [*`String`*.**`urlDecode(allChars?)`**](string/#stringurldecode)\n\n Decodes a URL-encoded string. Replaces any character codes in the form of `%XX` with their corresponding characters.\n\n- [*`String`*.**`urlEncode(allChars?)`**](string/#stringurlencode)\n\n Encodes the string so that it can be used in a URL. Spaces and special characters are replaced with codes of the form `%XX`.\n\n## WorkflowData\n\n- [`$workflow`.**`active`**](workflowdata/#workflowactive)\n\n Whether the workflow is active\n\n- [`$workflow`.**`id`**](workflowdata/#workflowid)\n\n The workflow ID. Can also be found in the workflow’s URL.\n\n- [`$workflow`.**`name`**](workflowdata/#workflowname)\n\n The name of the workflow, as shown at the top of the editor\n",
10182
+ "markdown": "# Expression Reference\n\nThese are some commonly used expressions. A more exhaustive list appears below.\n\n| Category | Expression | Description |\n| ------------------------------ | --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Access current input item data | `$json` | JSON data of the current item |\n| | `$json.fieldName` | Field of the current item |\n| | `$binary` | Binary data of current item |\n| Access previous node data | `$(\"NodeName\").first()` | First item in a node |\n| | `$(\"NodeName\").item` | Linked item of a node. See [Item linking](../data-mapping/data-item-linking/) for more information. |\n| | `$(\"NodeName\").all()` | All items of a node |\n| | `$(\"NodeName\").last()` | Last item of a node |\n| Date/Time | `$now` | Current date and time |\n| | `$today` | Today's date |\n| | `$now.toFormat(\"yyyy-MM-dd\")` | Format current date as a string |\n| Conditionals | `$if(condition, \"true\", \"false\")` | Helper function that returns a value when a condition is true or false |\n| | `condition ? true : false` | Ternary operator: returns one value if a condition is true, another if false |\n| | `$ifEmpty(value, defaultValue)` | Helper function takes two parameters and tests the first to check if it's empty, then returns either the parameter (if not empty) or the second parameter (if the first is empty). The first parameter is empty if it's `undefined`, `null`, an empty string `''`, an array where `value.length` returns `false` , or an object where `Object.keys(value).length` returns `false` |\n| String Methods | `text.toUpperCase()` | Convert to uppercase |\n| | `text.toLowerCase()` | Convert to lowercase |\n| | `text.includes(\"foo\")` | Check if text contains search term |\n| | `text.extractEmail()` | Extract email from text |\n| Array Methods | `array.length` | Get array length |\n| | `array.join(\", \")` | Join array elements using a comma a separator |\n| | `array.filter(x => x <= 20)` | Filter items of array based on the filtering condition |\n| | `array.map(x => x.id)` | Transform items of an array |\n\nBrowse the tables below to find methods by the data type on which they act. Click a method name to read detailed documentation for it.\n\n## Array\n\n- [*`Array`*.**`append(elem1, elem2?, ..., elemN?)`**](array/#arrayappend)\n\n Adds new elements to the end of the array. Similar to `push()`, but returns the modified array. Consider using spread syntax instead (see examples).\n\n- [*`Array`*.**`average()`**](array/#arrayaverage)\n\n Returns the average of the numbers in the array. Throws an error if there are any non-numbers.\n\n- [*`Array`*.**`chunk(length)`**](array/#arraychunk)\n\n Splits the array into an array of sub-arrays, each with the given length\n\n- [*`Array`*.**`compact()`**](array/#arraycompact)\n\n Removes any empty values from the array. `null`, `\"\"` and `undefined` count as empty.\n\n- [*`Array`*.**`concat(array2, array3?, ... arrayN?)`**](array/#arrayconcat)\n\n Joins one or more arrays onto the end of the base array\n\n- [*`Array`*.**`difference(otherArray)`**](array/#arraydifference)\n\n Compares two arrays. Returns all elements in the base array that aren't present in `otherArray`.\n\n- [*`Array`*.**`filter(function(element, index?, array?), thisValue?)`**](array/#arrayfilter)\n\n Returns an array with only the elements satisfying a condition. The condition is a function that returns `true` or `false`.\n\n- [*`Array`*.**`find(function(element, index?, array?), thisValue?)`**](array/#arrayfind)\n\n Returns the first element from the array that satisfies the provided condition. The condition is a function that returns `true` or `false`. Returns `undefined` if no matches are found.\n\nIf you need all matching elements, use `filter()`.\n\n- [*`Array`*.**`first()`**](array/#arrayfirst)\n\n Returns the first element of the array\n\n- [*`Array`*.**`includes(element, start?)`**](array/#arrayincludes)\n\n Returns `true` if the array contains the specified element\n\n- [*`Array`*.**`indexOf(element, start?)`**](array/#arrayindexof)\n\n Returns the position of the first matching element in the array, or -1 if the element isn’t found. Positions start at 0.\n\n- [*`Array`*.**`intersection(otherArray)`**](array/#arrayintersection)\n\n Compares two arrays. Returns all elements in the base array that are also present in the other array.\n\n- [*`Array`*.**`isEmpty()`**](array/#arrayisempty)\n\n Returns `true` if the array has no elements or is `null`\n\n- [*`Array`*.**`isNotEmpty()`**](array/#arrayisnotempty)\n\n Returns `true` if the array has at least one element\n\n- [*`Array`*.**`join(separator?)`**](array/#arrayjoin)\n\n Merges all elements of the array into a single string, with an optional separator between each element.\n\nThe opposite of `split()`.\n\n- [*`Array`*.**`last()`**](array/#arraylast)\n\n Returns the last element of the array\n\n- [*`Array`*.**`length`**](array/#arraylength)\n\n The number of elements in the array\n\n- [*`Array`*.**`map(function(element, index?, array?), thisValue?)`**](array/#arraymap)\n\n Creates a new array by applying a function to each element of the original array\n\n- [*`Array`*.**`max()`**](array/#arraymax)\n\n Returns the largest number in the array. Throws an error if there are any non-numbers.\n\n- [*`Array`*.**`min()`**](array/#arraymin)\n\n Returns the smallest number in the array. Throws an error if there are any non-numbers.\n\n- [*`Array`*.**`pluck(fieldName1?, fieldName2?, …)`**](array/#arraypluck)\n\n Returns an array containing the values of the given field(s) in each Object of the array. Ignores any array elements that aren’t Objects or don’t have a key matching the field name(s) provided.\n\n- [*`Array`*.**`randomItem()`**](array/#arrayrandomitem)\n\n Returns a randomly-chosen element from the array\n\n- [*`Array`*.**`reduce(function(prevResult, currentElem, currentIndex?, array?), initResult)`**](array/#arrayreduce)\n\n Reduces an array to a single value by applying a function to each element. The function combines the current element with the result of reducing the previous elements, producing a new result.\n\n- [*`Array`*.**`removeDuplicates(keys?)`**](array/#arrayremoveduplicates)\n\n Removes any re-occurring elements from the array\n\n- [*`Array`*.**`renameKeys(from, to)`**](array/#arrayrenamekeys)\n\n Changes all matching keys (field names) of any Objects in the array. Rename more than one key by adding extra arguments, i.e. `from1, to1, from2, to2, ...`.\n\n- [*`Array`*.**`reverse()`**](array/#arrayreverse)\n\n Reverses the order of the elements in the array\n\n- [*`Array`*.**`slice(start, end)`**](array/#arrayslice)\n\n Returns a portion of the array, from the `start` index up to (but not including) the `end` index. Indexes start at 0.\n\n- [*`Array`*.**`smartJoin(keyField, nameField)`**](array/#arraysmartjoin)\n\n Creates a single Object from an array of Objects. Each Object in the array provides one field for the returned Object. Each Object in the array must contain a field with the key name and a field with the value.\n\n- [*`Array`*.**`sort(compareFunction(a, b)?)`**](array/#arraysort)\n\n Reorders the elements of the array. For sorting strings alphabetically, no parameter is required. For sorting numbers or Objects, see examples.\n\n- [*`Array`*.**`sum()`**](array/#arraysum)\n\n Returns the total of all the numbers in the array. Throws an error if there are any non-numbers.\n\n- [*`Array`*.**`toJsonString()`**](array/#arraytojsonstring)\n\n Converts the array to a JSON string. The same as JavaScript’s `JSON.stringify()`.\n\n- [*`Array`*.**`toSpliced(start, deleteCount, elem1, ....., elemN)`**](array/#arraytospliced)\n\n Adds and/or removes array elements at a given position.\n\nSee also `slice()` and `append()`.\n\n- [*`Array`*.**`toString()`**](array/#arraytostring)\n\n Converts the array to a string, with values separated by commas. To use a different separator, use `join()` instead.\n\n- [*`Array`*.**`union(otherArray)`**](array/#arrayunion)\n\n Concatenates two arrays and then removes any duplicates\n\n- [*`Array`*.**`unique()`**](array/#arrayunique)\n\n Removes any duplicate elements from the array\n\n## BinaryFile\n\n- [`binaryFile`.**`directory`**](binaryfile/#binaryfiledirectory)\n\n The path to the directory that the file is stored in. Useful for distinguishing between files with the same name in different directories. Not set if n8n is configured to store files in its database.\n\n- [`binaryFile`.**`fileExtension`**](binaryfile/#binaryfilefileextension)\n\n The suffix attached to the filename (e.g. `txt`)\n\n- [`binaryFile`.**`fileName`**](binaryfile/#binaryfilefilename)\n\n The name of the file, including extension\n\n- [`binaryFile`.**`fileSize`**](binaryfile/#binaryfilefilesize)\n\n A string representing the size of the file\n\n- [`binaryFile`.**`fileType`**](binaryfile/#binaryfilefiletype)\n\n A string representing the type of the file, e.g. `image`. Corresponds to the first part of the MIME type.\n\n- [`binaryFile`.**`id`**](binaryfile/#binaryfileid)\n\n The unique ID of the file. Used to identify the file when it is stored on disk or in a storage service such as S3.\n\n- [`binaryFile`.**`mimeType`**](binaryfile/#binaryfilemimetype)\n\n A string representing the format of the file’s contents, e.g. `image/jpeg`\n\n## Boolean\n\n- [*`Boolean`*.**`isEmpty()`**](boolean/#booleanisempty)\n\n Returns `false` for all booleans. Returns `true` for `null`.\n\n- [*`Boolean`*.**`toNumber()`**](boolean/#booleantonumber)\n\n Converts `true` to 1 and `false` to 0\n\n- [*`Boolean`*.**`toString()`**](boolean/#booleantostring)\n\n Converts `true` to the string ‘true’ and `false` to the string ‘false’\n\n## CustomData\n\n- [`$execution.customData`.**`get(key)`**](customdata/#executioncustomdataget)\n\n Returns the custom execution data stored under the given key. [More info](/workflows/executions/custom-executions-data/)\n\n- [`$execution.customData`.**`getAll()`**](customdata/#executioncustomdatagetall)\n\n Returns all the key-value pairs of custom data that have been set in the current execution. [More info](/workflows/executions/custom-executions-data/)\n\n- [`$execution.customData`.**`set(key, value)`**](customdata/#executioncustomdataset)\n\n Stores custom execution data under the key specified. Use this to easily filter executions by this data. [More info](/workflows/executions/custom-executions-data/)\n\n- [`$execution.customData`.**`setAll(obj)`**](customdata/#executioncustomdatasetall)\n\n Sets multiple key-value pairs of custom data for the execution. Use this to easily filter executions by this data. [More info](/workflows/executions/custom-executions-data/)\n\n## Date\n\n- [*`Date`*.**`toDateTime()`**](date/#datetodatetime)\n\n Converts a JavaScript Date to a Luxon DateTime. The DateTime contains the same information, but is easier to manipulate.\n\n## DateTime\n\n- [*`DateTime`*.**`day`**](datetime/#datetimeday)\n\n The day of the month (1-31)\n\n- [*`DateTime`*.**`diffTo(otherDateTime, unit)`**](datetime/#datetimediffto)\n\n Returns the difference between two DateTimes, in the given unit(s)\n\n- [*`DateTime`*.**`diffToNow(unit)`**](datetime/#datetimedifftonow)\n\n Returns the difference between the current moment and the DateTime, in the given unit(s). For a textual representation, use `toRelative()` instead.\n\n- [*`DateTime`*.**`endOf(unit, opts)`**](datetime/#datetimeendof)\n\n Rounds the DateTime up to the end of one of its units, e.g. the end of the month\n\n- [*`DateTime`*.**`equals(other)`**](datetime/#datetimeequals)\n\n Returns `true` if the two DateTimes represent exactly the same moment and are in the same time zone. For a less strict comparison, use `hasSame()`.\n\n- [*`DateTime`*.**`extract(unit?)`**](datetime/#datetimeextract)\n\n Extracts a part of the date or time, e.g. the month, as a number. To extract textual names instead, see `format()`.\n\n- [*`DateTime`*.**`format(fmt)`**](datetime/#datetimeformat)\n\n Converts the DateTime to a string, using the format specified. [Formatting guide](https://moment.github.io/luxon/#/formatting?id=table-of-tokens). For common formats, `toLocaleString()` may be easier.\n\n- [*`DateTime`*.**`hasSame(otherDateTime, unit)`**](datetime/#datetimehassame)\n\n Returns `true` if the two DateTimes are the same, down to the unit specified. Time zones are ignored (only local times are compared), so use `toUTC()` first if needed.\n\n- [*`DateTime`*.**`hour`**](datetime/#datetimehour)\n\n The hour of the day (0-23)\n\n- [*`DateTime`*.**`isBetween(date1, date2)`**](datetime/#datetimeisbetween)\n\n Returns `true` if the DateTime lies between the two moments specified\n\n- [*`DateTime`*.**`isInDST`**](datetime/#datetimeisindst)\n\n Whether the DateTime is in daylight saving time\n\n- [*`DateTime`*.**`locale`**](datetime/#datetimelocale)\n\n The locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime.\n\n- [*`DateTime`*.**`millisecond`**](datetime/#datetimemillisecond)\n\n The millisecond of the second (0-999)\n\n- [*`DateTime`*.**`minus(n, unit?)`**](datetime/#datetimeminus)\n\n Subtracts a given period of time from the DateTime\n\n- [*`DateTime`*.**`minute`**](datetime/#datetimeminute)\n\n The minute of the hour (0-59)\n\n- [*`DateTime`*.**`month`**](datetime/#datetimemonth)\n\n The month (1-12)\n\n- [*`DateTime`*.**`monthLong`**](datetime/#datetimemonthlong)\n\n The textual long month name, e.g. 'October'. Defaults to the system's locale if no locale has been specified.\n\n- [*`DateTime`*.**`monthShort`**](datetime/#datetimemonthshort)\n\n The textual abbreviated month name, e.g. 'Oct'. Defaults to the system's locale if no locale has been specified.\n\n- [*`DateTime`*.**`plus(n, unit?)`**](datetime/#datetimeplus)\n\n Adds a given period of time to the DateTime\n\n- [*`DateTime`*.**`quarter`**](datetime/#datetimequarter)\n\n The quarter of the year (1-4)\n\n- [*`DateTime`*.**`second`**](datetime/#datetimesecond)\n\n The second of the minute (0-59)\n\n- [*`DateTime`*.**`set(values)`**](datetime/#datetimeset)\n\n Assigns new values to specified units of the DateTime. To round a DateTime, see also `startOf()` and `endOf()`.\n\n- [*`DateTime`*.**`setLocale(locale)`**](datetime/#datetimesetlocale)\n\n Sets the locale, which determines the language and formatting for the DateTime. Useful when generating a textual representation of the DateTime, e.g. with `format()` or `toLocaleString()`.\n\n- [*`DateTime`*.**`setZone(zone, opts)`**](datetime/#datetimesetzone)\n\n Converts the DateTime to the given time zone. The DateTime still represents the same moment unless specified in the options. See also `toLocal()` and `toUTC()`.\n\n- [*`DateTime`*.**`startOf(unit, opts)`**](datetime/#datetimestartof)\n\n Rounds the DateTime down to the beginning of one of its units, e.g. the start of the month\n\n- [*`DateTime`*.**`toISO(opts)`**](datetime/#datetimetoiso)\n\n Returns an ISO 8601-compliant string representation of the DateTime\n\n- [*`DateTime`*.**`toLocal()`**](datetime/#datetimetolocal)\n\n Converts a DateTime to the workflow’s local time zone. The DateTime still represents the same moment unless specified in the parameters. The workflow’s time zone can be set in the workflow settings.\n\n- [*`DateTime`*.**`toLocaleString(formatOpts)`**](datetime/#datetimetolocalestring)\n\n Returns a localised string representing the DateTime, i.e. in the language and format corresponding to its locale. Defaults to the system's locale if none specified.\n\n- [*`DateTime`*.**`toMillis()`**](datetime/#datetimetomillis)\n\n Returns a Unix timestamp in milliseconds (the number elapsed since 1st Jan 1970)\n\n- [*`DateTime`*.**`toRelative(options)`**](datetime/#datetimetorelative)\n\n Returns a textual representation of the time relative to now, e.g. ‘in two days’. Rounds down by default.\n\n- [*`DateTime`*.**`toSeconds()`**](datetime/#datetimetoseconds)\n\n Returns a Unix timestamp in seconds (the number elapsed since 1st Jan 1970)\n\n- [*`DateTime`*.**`toString()`**](datetime/#datetimetostring)\n\n Returns a string representation of the DateTime. Similar to `toISO()`. For more formatting options, see `format()` or `toLocaleString()`.\n\n- [*`DateTime`*.**`toUTC(offset, opts)`**](datetime/#datetimetoutc)\n\n Converts a DateTime to the UTC time zone. The DateTime still represents the same moment unless specified in the parameters. Use `setZone()` to convert to other zones.\n\n- [*`DateTime`*.**`weekday`**](datetime/#datetimeweekday)\n\n The day of the week. 1 is Monday and 7 is Sunday.\n\n- [*`DateTime`*.**`weekdayLong`**](datetime/#datetimeweekdaylong)\n\n The textual long weekday name, e.g. 'Wednesday'. Defaults to the system's locale if no locale has been specified.\n\n- [*`DateTime`*.**`weekdayShort`**](datetime/#datetimeweekdayshort)\n\n The textual abbreviated weekday name, e.g. 'Wed'. Defaults to the system's locale if no locale has been specified.\n\n- [*`DateTime`*.**`weekNumber`**](datetime/#datetimeweeknumber)\n\n The week number of the year (1-52ish)\n\n- [*`DateTime`*.**`year`**](datetime/#datetimeyear)\n\n The year\n\n- [*`DateTime`*.**`zone`**](datetime/#datetimezone)\n\n The time zone associated with the DateTime\n\n## ExecData\n\n- [`$exec`.**`customData`**](execdata/#execcustomdata)\n\n Set and get custom execution data (e.g. to filter executions by). You can also do this with the ‘Execution Data’ node. [More info](/workflows/executions/custom-executions-data/)\n\n- [`$exec`.**`id`**](execdata/#execid)\n\n The ID of the current workflow execution\n\n- [`$exec`.**`mode`**](execdata/#execmode)\n\n Can be one of 3 values: either `test` (meaning the execution was triggered by clicking a button in n8n) or `production` (meaning the execution was triggered automatically). When running workflow tests, `evaluation` is used.\n\n- [`$exec`.**`resumeFormUrl`**](execdata/#execresumeformurl)\n\n The URL to access a form generated by the [’Wait’ node](/integrations/builtin/core-nodes/n8n-nodes-base.wait/).\n\n- [`$exec`.**`resumeUrl`**](execdata/#execresumeurl)\n\n The webhook URL to call to resume a workflow waiting at a [’Wait’ node](/integrations/builtin/core-nodes/n8n-nodes-base.wait/).\n\n## HTTPResponse\n\n- [`$response`.**`body`**](httpresponse/#responsebody)\n\n The body of the response object from the last HTTP call. Only available in the ‘HTTP Request’ node\n\n- [`$response`.**`headers`**](httpresponse/#responseheaders)\n\n The headers returned by the last HTTP call. Only available in the ‘HTTP Request’ node.\n\n- [`$response`.**`statusCode`**](httpresponse/#responsestatuscode)\n\n The HTTP status code returned by the last HTTP call. Only available in the ‘HTTP Request’ node.\n\n- [`$response`.**`statusMessage`**](httpresponse/#responsestatusmessage)\n\n An optional message regarding the request status. Only available in the ‘HTTP Request’ node.\n\n## Item\n\n- [`$item`.**`binary`**](item/#itembinary)\n\n Returns any binary data the item contains\n\n- [`$item`.**`json`**](item/#itemjson)\n\n Returns the JSON data the item contains. [More info](/data/data-structure/)\n\n## NodeInputData\n\n- [`$input`.**`all(branchIndex?, runIndex?)`**](nodeinputdata/#inputall)\n\n Returns an array of the current node’s input items\n\n- [`$input`.**`first(branchIndex?, runIndex?)`**](nodeinputdata/#inputfirst)\n\n Returns the current node’s first input item\n\n- [`$input`.**`item`**](nodeinputdata/#inputitem)\n\n Returns the input item currently being processed\n\n- [`$input`.**`last(branchIndex?, runIndex?)`**](nodeinputdata/#inputlast)\n\n Returns the current node’s last input item\n\n- [`$input`.**`params`**](nodeinputdata/#inputparams)\n\n The configuration settings of the current node. These are the parameters you fill out within the node when configuring it (e.g. its operation).\n\n## NodeOutputData\n\n- [`$()`.**`all(branchIndex?, runIndex?)`**](nodeoutputdata/#all)\n\n Returns an array of the node’s output items\n\n- [`$()`.**`first(branchIndex?, runIndex?)`**](nodeoutputdata/#first)\n\n Returns the first item output by the node\n\n- [`$()`.**`isExecuted`**](nodeoutputdata/#isexecuted)\n\n Is `true` if the node has executed, `false` otherwise\n\n- [`$()`.**`item`**](nodeoutputdata/#item)\n\n Returns the matching item, i.e. the one used to produce the current item in the current node. [More info](/data/data-mapping/data-item-linking/)\n\n- [`$()`.**`itemMatching(currentItemIndex?)`**](nodeoutputdata/#itemmatching)\n\n Returns the matching item, i.e. the one used to produce the item in the current node at the specified index. [More info](/data/data-mapping/data-item-linking/)\n\n- [`$()`.**`last(branchIndex?, runIndex?)`**](nodeoutputdata/#last)\n\n Returns the last item output by the node\n\n- [`$()`.**`params`**](nodeoutputdata/#params)\n\n The configuration settings of the given node. These are the parameters you fill out within the node’s UI (e.g. its operation).\n\n## Number\n\n- [*`Number`*.**`abs()`**](number/#numberabs)\n\n Returns the number’s absolute value, i.e. removes any minus sign\n\n- [*`Number`*.**`ceil()`**](number/#numberceil)\n\n Rounds the number up to the next whole number\n\n- [*`Number`*.**`floor()`**](number/#numberfloor)\n\n Rounds the number down to the nearest whole number\n\n- [*`Number`*.**`format(locale?, options?)`**](number/#numberformat)\n\n Returns a formatted string representing the number. Useful for formatting for a specific language or currency. The same as [`Intl.NumberFormat()`](%E2%80%9Dhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat%E2%80%9D).\n\n- [*`Number`*.**`isEmpty()`**](number/#numberisempty)\n\n Returns `false` for all numbers. Returns `true` for `null`.\n\n- [*`Number`*.**`isEven()`**](number/#numberiseven)\n\n Returns `true` if the number is even. Throws an error if the number isn’t a whole number.\n\n- [*`Number`*.**`isInteger()`**](number/#numberisinteger)\n\n Returns `true` if the number is a whole number\n\n- [*`Number`*.**`isOdd()`**](number/#numberisodd)\n\n Returns `true` if the number is odd. Throws an error if the number isn’t a whole number.\n\n- [*`Number`*.**`round(decimalPlaces?)`**](number/#numberround)\n\n Returns the number rounded to the nearest whole number (or specified number of decimal places)\n\n- [*`Number`*.**`toBoolean()`**](number/#numbertoboolean)\n\n Converts the number to a boolean value. `0` becomes `false`; everything else becomes `true`.\n\n- [*`Number`*.**`toDateTime(format?)`**](number/#numbertodatetime)\n\n Converts a numerical timestamp into a DateTime. The format of the timestamp must be specified if it’s not in milliseconds. Uses the time zone in n8n (or in the workflow’s settings).\n\n- [*`Number`*.**`toLocaleString(locales?, options?)`**](number/#numbertolocalestring)\n\n Returns a localised string representing the number, i.e. in the language and format corresponding to its locale. Defaults to the system's locale if none specified.\n\n- [*`Number`*.**`toString(radix?)`**](number/#numbertostring)\n\n Converts the number to a simple textual representation. For more formatting options, see `toLocaleString()`.\n\n## Object\n\n- [*`Object`*.**`compact()`**](object/#objectcompact)\n\n Removes all fields that have empty values, i.e. are `null` or `\"\"`\n\n- [*`Object`*.**`hasField(name)`**](object/#objecthasfield)\n\n Returns `true` if there is a field called `name`. Only checks top-level keys. Comparison is case-sensitive.\n\n- [*`Object`*.**`isEmpty()`**](object/#objectisempty)\n\n Returns `true` if the Object has no keys (fields) set or is `null`\n\n- [*`Object`*.**`isNotEmpty()`**](object/#objectisnotempty)\n\n Returns `true` if the Object has at least one key (field) set\n\n- [*`Object`*.**`keepFieldsContaining(value)`**](object/#objectkeepfieldscontaining)\n\n Removes any fields whose values don’t at least partly match the given `value`. Comparison is case-sensitive. Fields that aren’t strings will always be removed.\n\n- [*`Object`*.**`keys()`**](object/#objectkeys)\n\n Returns an array with all the field names (keys) the object contains. The same as JavaScript’s `Object.keys(obj)`.\n\n- [*`Object`*.**`merge(otherObject)`**](object/#objectmerge)\n\n Merges the two Objects into a single one. If a key (field name) exists in both Objects, the value from the first (base) Object is used.\n\n- [*`Object`*.**`removeField(key)`**](object/#objectremovefield)\n\n Removes a field from the Object. The same as JavaScript’s `delete`.\n\n- [*`Object`*.**`removeFieldsContaining(value)`**](object/#objectremovefieldscontaining)\n\n Removes keys (fields) whose values at least partly match the given `value`. Comparison is case-sensitive. Fields that aren’t strings are always kept.\n\n- [*`Object`*.**`toJsonString()`**](object/#objecttojsonstring)\n\n Converts the Object to a JSON string. Similar to JavaScript’s `JSON.stringify()`.\n\n- [*`Object`*.**`urlEncode()`**](object/#objecturlencode)\n\n Generates a URL parameter string from the Object’s keys and values. Only top-level keys are supported.\n\n- [*`Object`*.**`values()`**](object/#objectvalues)\n\n Returns an array with all the values of the fields the Object contains. The same as JavaScript’s `Object.values(obj)`.\n\n## PrevNodeData\n\n- [**`name`**](prevnodedata/#name)\n\n The name of the node that the current input came from.\n\nAlways uses the current node’s first input connector if there is more than one (e.g. in the ‘Merge’ node).\n\n- [**`outputIndex`**](prevnodedata/#outputindex)\n\n The index of the output connector that the current input came from. Use this when the previous node had multiple outputs (such as an ‘If’ or ‘Switch’ node).\n\nAlways uses the current node’s first input connector if there is more than one (e.g. in the ‘Merge’ node).\n\n- [**`runIndex`**](prevnodedata/#runindex)\n\n The run of the previous node that generated the current input.\n\nAlways uses the current node’s first input connector if there is more than one (e.g. in the ‘Merge’ node).\n\n## Root\n\n- [**`$(nodeName)`**](root/)\n\n Returns the data of the specified node\n\n- [**`$binary`**](root/#binary)\n\n Returns any binary input data to the current node, for the current item. Shorthand for `$input.item.binary`.\n\n- [**`$execution`**](root/#execution)\n\n Retrieve or set metadata for the current execution\n\n- [**`$fromAI(key, description?, type?, defaultValue?)`**](root/#fromai)\n\n Use when a large language model should provide the value of a node parameter. Consider providing a description for better results.\n\n- [**`$if(condition, valueIfTrue, valueIfFalse)`**](root/#if)\n\n Returns one of two values depending on the `condition`. Similar to the `?` operator in JavaScript.\n\n- [**`$ifEmpty(value, valueIfEmpty)`**](root/#ifempty)\n\n Returns the first parameter if it isn’t empty, otherwise returns the second parameter. The following count as empty: `””`, `[]`, `{}`, `null`, `undefined`\n\n- [**`$input`**](root/#input)\n\n The input data of the current node\n\n- [**`$itemIndex`**](root/#itemindex)\n\n The position of the item currently being processed in the list of input items\n\n- [**`$jmespath(obj, expression)`**](root/#jmespath)\n\n Extracts data from an object (or array of objects) using a [JMESPath](%E2%80%9D/code/cookbook/jmespath/%E2%80%9D) expression. Useful for querying complex, nested objects. Returns `undefined` if the expression is invalid.\n\n- [**`$json`**](root/#json)\n\n Returns the JSON input data to the current node, for the current item. Shorthand for `$input.item.json`. [More info](/data/data-structure/)\n\n- [**`$max(num1, num2, …, numN)`**](root/#max)\n\n Returns the highest of the given numbers\n\n- [**`$min(num1, num2, …, numN)`**](root/#min)\n\n Returns the lowest of the given numbers\n\n- [**`$nodeVersion`**](root/#nodeversion)\n\n The version of the current node (as displayed at the bottom of the nodes’s settings pane)\n\n- [**`$now`**](root/#now)\n\n A DateTime representing the current moment.\n\nUses the workflow’s time zone (which can be changed in the workflow settings).\n\n- [**`$pageCount`**](root/#pagecount)\n\n The number of results pages the node has fetched. Only available in the ‘HTTP Request’ node.\n\n- [**`$parameter`**](root/#parameter)\n\n The configuration settings of the current node. These are the parameters you fill out within the node’s UI (e.g. its operation).\n\n- [**`$prevNode`**](root/#prevnode)\n\n Information about the node that the current input came from.\n\nWhen in a ‘Merge’ node, always uses the first input connector.\n\n- [**`$request`**](root/#request)\n\n The request object sent during the last run of the node. Only available in the ‘HTTP Request’ node.\n\n- [**`$response`**](root/#response)\n\n The response returned by the last HTTP call. Only available in the ‘HTTP Request’ node.\n\n- [**`$runIndex`**](root/#runindex)\n\n The index of the current run of the current node execution. Starts at 0.\n\n- [**`$secrets`**](root/#secrets)\n\n The secrets from an [external secrets vault](/external-secrets/), if configured. Secret values are never displayed to the user. Only available in credential fields.\n\n- [**`$today`**](root/#today)\n\n A DateTime representing midnight at the start of the current day.\n\nUses the instance’s time zone (unless overridden in the workflow’s settings).\n\n- [**`$vars`**](root/#vars)\n\n The [variables](/code/variables/) available to the workflow\n\n- [**`$workflow`**](root/#workflow)\n\n Information about the current workflow\n\n## String\n\n- [*`String`*.**`base64Encode()`**](string/#stringbase64decode)\n\n Converts plain text to a base64-encoded string\n\n- [*`String`*.**`base64Encode()`**](string/#stringbase64encode)\n\n Converts a base64-encoded string to plain text\n\n- [*`String`*.**`concat(string1, string2?, ..., stringN?)`**](string/#stringconcat)\n\n Joins one or more strings onto the end of the base string. Alternatively, use the `+` operator (see examples).\n\n- [*`String`*.**`extractDomain()`**](string/#stringextractdomain)\n\n If the string is an email address or URL, returns its domain (or `undefined` if nothing found).\n\nIf the string also contains other content, try using `extractEmail()` or `extractUrl()` first.\n\n- [*`String`*.**`extractEmail()`**](string/#stringextractemail)\n\n Extracts the first email found in the string. Returns `undefined` if none is found.\n\n- [*`String`*.**`extractUrl()`**](string/#stringextracturl)\n\n Extracts the first URL found in the string. Returns `undefined` if none is found. Only recognizes full URLs, e.g. those starting with `http`.\n\n- [*`String`*.**`extractUrlPath()`**](string/#stringextracturlpath)\n\n Returns the part of a URL after the domain, or `undefined` if no URL found.\n\nIf the string also contains other content, try using `extractUrl()` first.\n\n- [*`String`*.**`hash(algo?)`**](string/#stringhash)\n\n Returns the string hashed with the given algorithm. Defaults to md5 if not specified.\n\n- [*`String`*.**`includes(searchString, start?)`**](string/#stringincludes)\n\n Returns `true` if the string contains the `searchString`. Case-sensitive.\n\n- [*`String`*.**`indexOf(searchString, start?)`**](string/#stringindexof)\n\n Returns the index (position) of the first occurrence of `searchString` within the base string, or -1 if not found. Case-sensitive.\n\n- [*`String`*.**`isDomain()`**](string/#stringisdomain)\n\n Returns `true` if the string is a domain\n\n- [*`String`*.**`isEmail()`**](string/#stringisemail)\n\n Returns `true` if the string is an email\n\n- [*`String`*.**`isEmpty()`**](string/#stringisempty)\n\n Returns `true` if the string has no characters or is `null`\n\n- [*`String`*.**`isNotEmpty()`**](string/#stringisnotempty)\n\n Returns `true` if the string has at least one character\n\n- [*`String`*.**`isNumeric()`**](string/#stringisnumeric)\n\n Returns `true` if the string represents a number\n\n- [*`String`*.**`isUrl()`**](string/#stringisurl)\n\n Returns `true` if the string is a valid URL\n\n- [*`String`*.**`length`**](string/#stringlength)\n\n The number of characters in the string\n\n- [*`String`*.**`match(regexp)`**](string/#stringmatch)\n\n Matches the string against a [regular expression](%E2%80%9Dhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions%E2%80%9D). Returns an array containing the first match, or all matches if the `g` flag is set in the regular expression. Returns `null` if no matches are found.\n\nFor checking whether text is present, consider `includes()` instead.\n\n- [*`String`*.**`parseJson()`**](string/#stringparsejson)\n\n Returns the JavaScript Object or value represented by the string, or `undefined` if the string isn’t valid JSON. Single-quoted JSON is not supported.\n\n- [*`String`*.**`quote(mark?)`**](string/#stringquote)\n\n Wraps a string in quotation marks, and escapes any quotation marks already in the string. Useful when constructing JSON, SQL, etc.\n\n- [*`String`*.**`removeMarkdown()`**](string/#stringremovemarkdown)\n\n Removes any Markdown formatting from the string. Also removes HTML tags.\n\n- [*`String`*.**`removeTags()`**](string/#stringremovetags)\n\n Removes tags, such as HTML or XML, from the string\n\n- [*`String`*.**`replace(pattern, replacement)`**](string/#stringreplace)\n\n Returns a string with the first occurrence of `pattern` replaced by `replacement`.\n\nTo replace all occurrences, use `replaceAll()` instead.\n\n- [*`String`*.**`replaceAll(pattern, replacement)`**](string/#stringreplaceall)\n\n Returns a string with all occurrences of `pattern` replaced by `replacement`\n\n- [*`String`*.**`replaceSpecialChars()`**](string/#stringreplacespecialchars)\n\n Replaces special characters in the string with the closest ASCII character\n\n- [*`String`*.**`search(regexp)`**](string/#stringsearch)\n\n Returns the index (position) of the first occurrence of a pattern within the string, or -1 if not found. The pattern is specified using a [regular expression](%E2%80%9Dhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions%E2%80%9D). To use text instead, see `indexOf()`.\n\n- [*`String`*.**`slice(start, end?)`**](string/#stringslice)\n\n Extracts a fragment of the string at the given position. For more advanced extraction, see `match()`.\n\n- [*`String`*.**`split(separator?, limit?)`**](string/#stringsplit)\n\n Splits the string into an array of substrings. Each split is made at the `separator`, and the separator isn’t included in the output.\n\nThe opposite of using `join()` on an array.\n\n- [*`String`*.**`startsWith(searchString, start?)`**](string/#stringstartswith)\n\n Returns `true` if the string starts with `searchString`. Case-sensitive.\n\n- [*`String`*.**`substring(start, end?)`**](string/#stringsubstring)\n\n Extracts a fragment of the string at the given position. For more advanced extraction, see `match()`.\n\n- [*`String`*.**`toBoolean()`**](string/#stringtoboolean)\n\n Converts the string to a boolean value. `0`, `false` and `no` resolve to `false`, everything else to `true`. Case-insensitive.\n\n- [*`String`*.**`toDateTime()`**](string/#stringtodatetime)\n\n Converts the string to a DateTime. Useful for further transformation. Supported formats for the string are ISO 8601, HTTP, RFC2822, SQL and Unix timestamp in milliseconds.\n\nTo parse other formats, use [`DateTime.fromFormat()`](%E2%80%9Dhttps://moment.github.io/luxon/api-docs/index.html#datetimefromformat%E2%80%9D).\n\n- [*`String`*.**`toJsonString()`**](string/#stringtojsonstring)\n\n Prepares the string to be inserted into a JSON object. Escapes any quotes and special characters (e.g. new lines), and wraps the string in quotes.\n\nThe same as JavaScript’s `JSON.stringify()`.\n\n- [*`String`*.**`toLowerCase()`**](string/#stringtolowercase)\n\n Converts all letters in the string to lower case\n\n- [*`String`*.**`toNumber()`**](string/#stringtonumber)\n\n Converts a string representing a number to a number. Throws an error if the string doesn’t start with a valid number.\n\n- [*`String`*.**`toSentenceCase()`**](string/#stringtosentencecase)\n\n Changes the capitalization of the string to sentence case. The first letter of each sentence is capitalized and all others are lowercased.\n\n- [*`String`*.**`toSnakeCase()`**](string/#stringtosnakecase)\n\n Changes the format of the string to snake case. Spaces and dashes are replaced by `_`, symbols are removed and all letters are lowercased.\n\n- [*`String`*.**`toTitleCase()`**](string/#stringtotitlecase)\n\n Changes the capitalization of the string to title case. The first letter of each word is capitalized and the others left unchanged. Short prepositions and conjunctions aren’t capitalized (e.g. ‘a’, ‘the’).\n\n- [*`String`*.**`toUpperCase()`**](string/#stringtouppercase)\n\n Converts all letters in the string to upper case (capitals)\n\n- [*`String`*.**`trim()`**](string/#stringtrim)\n\n Removes whitespace from both ends of the string. Whitespace includes new lines, tabs, spaces, etc.\n\n- [*`String`*.**`urlDecode(allChars?)`**](string/#stringurldecode)\n\n Decodes a URL-encoded string. Replaces any character codes in the form of `%XX` with their corresponding characters.\n\n- [*`String`*.**`urlEncode(allChars?)`**](string/#stringurlencode)\n\n Encodes the string so that it can be used in a URL. Spaces and special characters are replaced with codes of the form `%XX`.\n\n## WorkflowData\n\n- [`$workflow`.**`active`**](workflowdata/#workflowactive)\n\n Whether the workflow is active\n\n- [`$workflow`.**`id`**](workflowdata/#workflowid)\n\n The workflow ID. Can also be found in the workflow’s URL.\n\n- [`$workflow`.**`name`**](workflowdata/#workflowname)\n\n The name of the workflow, as shown at the top of the editor\n",
10183
10183
  "excerpt": "# Expression Reference These are some commonly used expressions. A more exhaustive list appears below. | Category | Expression | Description...",
10184
10184
  "sections": [
10185
10185
  {
@@ -10216,7 +10216,7 @@
10216
10216
  "codeExamples": 0,
10217
10217
  "complexity": "intermediate",
10218
10218
  "readingTime": "22 min",
10219
- "contentLength": 45288,
10219
+ "contentLength": 45286,
10220
10220
  "relatedPages": []
10221
10221
  },
10222
10222
  "searchIndex": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-02-28T19:03:29.498Z",
2
+ "generatedAt": "2026-03-01T16:48:37.638Z",
3
3
  "version": "2.0.0",
4
4
  "statistics": {
5
5
  "totalEntries": 1786,
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-02-28T19:03:26.765Z",
2
+ "generatedAt": "2026-03-01T16:48:34.810Z",
3
3
  "sourceFileCount": 644,
4
4
  "scanDirectories": [
5
5
  "/home/runner/work/n8n-as-code/n8n-as-code/.n8n-cache/packages/nodes-base/dist/nodes",
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-02-28T19:03:28.200Z",
2
+ "generatedAt": "2026-03-01T16:48:36.269Z",
3
3
  "sourceData": {
4
4
  "nodesIndexFile": "/home/runner/work/n8n-as-code/n8n-as-code/packages/skills/src/assets/n8n-nodes-index.json",
5
5
  "docsMetadataFile": "/home/runner/work/n8n-as-code/n8n-as-code/packages/skills/src/assets/n8n-docs-cache/metadata.json",
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-02-28T19:03:31.315Z",
2
+ "generatedAt": "2026-03-01T16:48:38.992Z",
3
3
  "repository": "https://github.com/nusquama/n8nworkflows.xyz.git",
4
4
  "totalWorkflows": 7702,
5
5
  "workflows": [
package/dist/cli.js CHANGED
@@ -1,8 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Thin CLI wrapper all command logic lives in skills-commander.ts.
4
- * This file is kept for backward compatibility (users who installed the
5
- * old n8nac-skills binary locally). New users should invoke skills via:
3
+ * This entry point is primarily for internal/dev or legacy setups that still
4
+ * invoke an `n8nac-skills` binary directly. New installs should invoke skills via:
6
5
  * npx n8nac@<version> skills <command>
7
6
  */
8
7
  import { Command } from 'commander';
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,8CAA8C;AAC9C,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG;IACnE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAChC,CAAC,CAAC,CAAC,OAAO,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAE5D,MAAM,QAAQ,GAAG,OAAO,SAAS,KAAK,WAAW;IAC7C,CAAC,CAAC,SAAS;IACX,CAAC,CAAC,OAAO,CAAC,SAAmB,CAAC,CAAC;AAEnC,MAAM,UAAU,GAAG,GAAG,EAAE;IACpB,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,OAAO,GAAG,CAAC,OAAO,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,OAAO,CAAC;IACnB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,GAAG,EAAE;IACtB,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IAC9C,CAAC;IAED,mHAAmH;IACnH,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,wFAAwF;IACxF,OAAO,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;AAEjC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACF,IAAI,CAAC,cAAc,CAAC;KACpB,WAAW,CAAC,iEAAiE,CAAC;KAC9E,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;AAE3B,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAE3C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,8CAA8C;AAC9C,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG;IACnE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAChC,CAAC,CAAC,CAAC,OAAO,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAE5D,MAAM,QAAQ,GAAG,OAAO,SAAS,KAAK,WAAW;IAC7C,CAAC,CAAC,SAAS;IACX,CAAC,CAAC,OAAO,CAAC,SAAmB,CAAC,CAAC;AAEnC,MAAM,UAAU,GAAG,GAAG,EAAE;IACpB,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,OAAO,GAAG,CAAC,OAAO,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,OAAO,CAAC;IACnB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,GAAG,EAAE;IACtB,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IAC9C,CAAC;IAED,mHAAmH;IACnH,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,wFAAwF;IACxF,OAAO,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;AAEjC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACF,IAAI,CAAC,cAAc,CAAC;KACpB,WAAW,CAAC,iEAAiE,CAAC;KAC9E,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;AAE3B,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAE3C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Registers all `n8nac skills` subcommands on a given Commander program.
5
5
  * Called directly by the standalone `n8nac-skills` binary (cli.ts) **and** by
6
- * the unified `n8nac` CLI via `packages/cli/src/commands/skills.ts`.
6
+ * the unified `n8nac` CLI via `packages/cli/src/index.ts`.
7
7
  */
8
8
  import { Command } from 'commander';
9
9
  export declare function registerSkillsCommands(program: Command, assetsDir: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"skills-commander.d.ts","sourceRoot":"","sources":["../../src/commands/skills-commander.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAydhF"}
1
+ {"version":3,"file":"skills-commander.d.ts","sourceRoot":"","sources":["../../src/commands/skills-commander.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAgehF"}
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Registers all `n8nac skills` subcommands on a given Commander program.
5
5
  * Called directly by the standalone `n8nac-skills` binary (cli.ts) **and** by
6
- * the unified `n8nac` CLI via `packages/cli/src/commands/skills.ts`.
6
+ * the unified `n8nac` CLI via `packages/cli/src/index.ts`.
7
7
  */
8
8
  import chalk from 'chalk';
9
9
  import { NodeSchemaProvider } from '../services/node-schema-provider.js';
@@ -22,7 +22,13 @@ export function registerSkillsCommands(program, assetsDir) {
22
22
  const provider = new NodeSchemaProvider(join(assetsDir, 'n8n-nodes-technical.json'));
23
23
  const docsProvider = new DocsProvider(join(assetsDir, 'n8n-docs-complete.json'));
24
24
  const knowledgeSearch = new KnowledgeSearch(join(assetsDir, 'n8n-knowledge-index.json'));
25
- const registry = new WorkflowRegistry();
25
+ let registry;
26
+ const getRegistry = () => {
27
+ if (!registry) {
28
+ registry = new WorkflowRegistry();
29
+ }
30
+ return registry;
31
+ };
26
32
  // ── search ────────────────────────────────────────────────────────────────
27
33
  program
28
34
  .command('search')
@@ -32,7 +38,6 @@ export function registerSkillsCommands(program, assetsDir) {
32
38
  .option('--type <type>', 'Filter by type (node or documentation)')
33
39
  .option('--limit <limit>', 'Limit results', '10')
34
40
  .option('--json', 'Output as JSON instead of TypeScript')
35
- .option('--typescript', 'Output TypeScript snippets for nodes (default)', true)
36
41
  .action((query, options) => {
37
42
  try {
38
43
  const results = knowledgeSearch.searchAll(query, {
@@ -357,14 +362,16 @@ export function registerSkillsCommands(program, assetsDir) {
357
362
  // ── update-ai ─────────────────────────────────────────────────────────────
358
363
  program
359
364
  .command('update-ai')
360
- .description('Update AI Context files (AGENTS.md, rule files, snippets)')
365
+ .description('Update AI Context files (AGENTS.md and snippets)')
361
366
  .option('--n8n-version <version>', 'n8n instance version', 'Unknown')
367
+ .option('--cli-version <version>', 'n8nac CLI version or dist-tag to use in generated AI context', 'latest')
362
368
  .action(async (options) => {
363
369
  try {
364
370
  console.error(chalk.blue('🤖 Updating AI Context...'));
365
371
  const projectRoot = process.cwd();
372
+ const distTag = options.cliVersion === 'latest' ? undefined : options.cliVersion;
366
373
  const aiContextGenerator = new AiContextGenerator();
367
- await aiContextGenerator.generate(projectRoot, options.n8nVersion);
374
+ await aiContextGenerator.generate(projectRoot, options.n8nVersion, distTag);
368
375
  const snippetGen = new SnippetGenerator();
369
376
  await snippetGen.generate(projectRoot);
370
377
  console.error(chalk.green('✅ AI Context updated successfully!'));
@@ -385,7 +392,7 @@ export function registerSkillsCommands(program, assetsDir) {
385
392
  .option('--json', 'Output results as JSON')
386
393
  .action((query, options) => {
387
394
  const limit = parseInt(options.limit, 10);
388
- const results = registry.search(query, limit);
395
+ const results = getRegistry().search(query, limit);
389
396
  if (options.json) {
390
397
  console.log(JSON.stringify(results, null, 2));
391
398
  return;
@@ -412,14 +419,14 @@ export function registerSkillsCommands(program, assetsDir) {
412
419
  .option('-l, --limit <number>', 'Limit number of results', '20')
413
420
  .action((options) => {
414
421
  const limit = parseInt(options.limit, 10);
415
- const results = registry.search('', limit);
422
+ const results = getRegistry().search('', limit);
416
423
  console.log(JSON.stringify(results, null, 2));
417
424
  });
418
425
  examples
419
426
  .command('info <id>')
420
427
  .description('Display detailed information about a community workflow')
421
428
  .action((id) => {
422
- const workflow = registry.getById(id);
429
+ const workflow = getRegistry().getById(id);
423
430
  if (!workflow) {
424
431
  console.error(chalk.red(`❌ Workflow with ID "${id}" not found.`));
425
432
  process.exit(1);
@@ -436,7 +443,7 @@ export function registerSkillsCommands(program, assetsDir) {
436
443
  console.log(chalk.dim(workflow.description));
437
444
  }
438
445
  console.log(chalk.cyan('\nRaw URL:'));
439
- console.log(chalk.blue(registry.getRawUrl(workflow)));
446
+ console.log(chalk.blue(getRegistry().getRawUrl(workflow)));
440
447
  console.log('');
441
448
  });
442
449
  examples
@@ -445,7 +452,7 @@ export function registerSkillsCommands(program, assetsDir) {
445
452
  .option('-o, --output <path>', 'Output file path')
446
453
  .option('-f, --force', 'Overwrite existing file')
447
454
  .action(async (id, options) => {
448
- const workflow = registry.getById(id);
455
+ const workflow = getRegistry().getById(id);
449
456
  if (!workflow) {
450
457
  console.error(chalk.red(`❌ Workflow with ID "${id}" not found.`));
451
458
  process.exit(1);
@@ -462,7 +469,7 @@ export function registerSkillsCommands(program, assetsDir) {
462
469
  console.error(chalk.dim('Use --force to overwrite.'));
463
470
  process.exit(1);
464
471
  }
465
- const url = registry.getRawUrl(workflow);
472
+ const url = getRegistry().getRawUrl(workflow);
466
473
  console.log(chalk.blue(`📥 Downloading from: ${url}`));
467
474
  try {
468
475
  const response = await fetch(url);
@@ -1 +1 @@
1
- {"version":3,"file":"skills-commander.js","sourceRoot":"","sources":["../../src/commands/skills-commander.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skills-commander.js","sourceRoot":"","sources":["../../src/commands/skills-commander.ts"],"names":[],"mappings":"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"}
@@ -3,10 +3,6 @@ export declare class AiContextGenerator {
3
3
  generate(projectRoot: string, n8nVersion?: string, distTag?: string): Promise<void>;
4
4
  private injectOrUpdate;
5
5
  private getAgentsContent;
6
- private getCursorRulesContent;
7
- private getClineRulesContent;
8
6
  getSkillContent(): string;
9
- private getWindsurfRulesContent;
10
- private getCommonRulesContent;
11
7
  }
12
8
  //# sourceMappingURL=ai-context-generator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-context-generator.d.ts","sourceRoot":"","sources":["../../src/services/ai-context-generator.ts"],"names":[],"mappings":"AAaA,qBAAa,kBAAkB;;IAGvB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,GAAE,MAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpG,OAAO,CAAC,cAAc;IA4BtB,OAAO,CAAC,gBAAgB;IA6UxB,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,oBAAoB;IAe5B,eAAe,IAAI,MAAM;IA0NzB,OAAO,CAAC,uBAAuB;IAQ/B,OAAO,CAAC,qBAAqB;CAQ9B"}
1
+ {"version":3,"file":"ai-context-generator.d.ts","sourceRoot":"","sources":["../../src/services/ai-context-generator.ts"],"names":[],"mappings":"AAaA,qBAAa,kBAAkB;;IAGvB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,GAAE,MAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpG,OAAO,CAAC,cAAc;IA4BtB,OAAO,CAAC,gBAAgB;IA4UxB,eAAe,IAAI,MAAM;CA0N1B"}
@@ -40,7 +40,8 @@ export class AiContextGenerator {
40
40
  }
41
41
  }
42
42
  getAgentsContent(n8nVersion, distTag) {
43
- const cmd = distTag ? `npx n8nac@${distTag} skills` : 'npx n8nac skills';
43
+ const cmd = distTag ? `npx --yes n8nac@${distTag} skills` : 'npx --yes n8nac skills';
44
+ const cliCmd = distTag ? `npx --yes n8nac@${distTag}` : 'npx --yes n8nac';
44
45
  return [
45
46
  `## 🎭 Role: Expert n8n Workflow Engineer`,
46
47
  ``,
@@ -49,13 +50,13 @@ export class AiContextGenerator {
49
50
  ``,
50
51
  `### 🌍 Context`,
51
52
  `- **n8n Version**: ${n8nVersion}`,
52
- `- **Source of Truth**: \`npx n8nac skills\` tools (Deep Search + Technical Schemas)`,
53
+ `- **Source of Truth**: \`${cmd}\` tools (Deep Search + Technical Schemas)`,
53
54
  ``,
54
55
  `---`,
55
56
  ``,
56
57
  `## 🧠 Knowledge Base Priority`,
57
58
  ``,
58
- `1. **PRIMARY SOURCE** (MANDATORY): Use \`npx n8nac skills\` tools for accuracy`,
59
+ `1. **PRIMARY SOURCE** (MANDATORY): Use \`${cmd}\` tools for accuracy`,
59
60
  `2. **Secondary**: Your trained knowledge (for general concepts only)`,
60
61
  `3. **Tertiary**: Code snippets (for quick scaffolding)`,
61
62
  ``,
@@ -69,38 +70,36 @@ export class AiContextGenerator {
69
70
  ``,
70
71
  `### Git-like Sync Workflow`,
71
72
  ``,
72
- `1. **LIST FIRST**: Check status with \`n8nac list\``,
73
- ` - \`n8nac list\`: List all workflows on the remote instance.`,
74
- ` - \`n8nac list --local\`: List only local \`.workflow.ts\` files.`,
75
- ` - \`n8nac list --remote\`: List only the remote state from cache.`,
73
+ `1. **LIST FIRST**: Check status with \`${cliCmd} list\``,
74
+ ` - \`${cliCmd} list\`: List all workflows with their sync status (lightweight — only reads metadata).`,
75
+ ` - \`${cliCmd} list --local\`: List only local \`.workflow.ts\` files.`,
76
+ ` - \`${cliCmd} list --remote\`: List only remote workflows.`,
76
77
  ` - Identify workflow IDs and their sync status.`,
77
78
  ``,
78
- `2. **FETCH REMOTE STATE**: Update your local cache of remote state`,
79
- ` - \`n8nac fetch --workflowsid <id>\`: Fetch specific workflow's remote state.`,
80
- ` - \`n8nac fetch --all\`: Fetch all remote workflows' metadata.`,
81
- ` - This updates internal comparison cache without downloading files.`,
82
- ``,
83
- `3. **PULL IF NEEDED**: Download remote changes before editing`,
84
- ` - \`n8nac pull --workflowsid <id>\`: Download workflow from n8n to local.`,
79
+ `2. **PULL IF NEEDED**: Download remote changes before editing`,
80
+ ` - \`${cliCmd} pull <id>\`: Download workflow from n8n to local.`,
85
81
  ` - Required if workflow exists remotely but not locally, or if remote has newer changes.`,
86
82
  ``,
87
- `4. **EDIT**: Apply your changes to the local \`.workflow.ts\` file.`,
83
+ `3. **EDIT**: Apply your changes to the local \`.workflow.ts\` file.`,
88
84
  ``,
89
- `5. **PUSH**: Upload your changes explicitly`,
90
- ` - \`n8nac push --workflowsid <id>\`: Upload local workflow to n8n (for existing workflows).`,
91
- ` - \`n8nac push --filename <name>\`: Push a brand new local file.`,
85
+ `4. **PUSH**: Upload your changes explicitly`,
86
+ ` - \`${cliCmd} push <id>\`: Upload local workflow to n8n (for existing workflows).`,
87
+ ` - \`${cliCmd} push --filename <name>\`: Push a brand new local file.`,
92
88
  ``,
93
- `6. **RESOLVE CONFLICTS**: If Push or Pull fails due to a conflict`,
94
- ` - \`n8nac resolve --workflowsid <id> --mode keep-current\`: Force-push local version.`,
95
- ` - \`n8nac resolve --workflowsid <id> --mode keep-incoming\`: Force-pull remote version.`,
89
+ `5. **RESOLVE CONFLICTS**: If Push or Pull fails due to a conflict`,
90
+ ` - \`${cliCmd} resolve <id> --mode keep-current\`: Force-push local version.`,
91
+ ` - \`${cliCmd} resolve <id> --mode keep-incoming\`: Force-pull remote version.`,
96
92
  ``,
97
93
  `### Key Principles`,
98
94
  `- **Explicit over automatic**: All operations are user-triggered or ai-agent-triggered.`,
99
- `- **Point-in-time status**: \`list\` shows current state, not continuously monitored.`,
100
- `- **Fetch updates cache**: \`fetch\` updates remote state reference for comparison.`,
95
+ `- **Point-in-time status**: \`list\` is lightweight and covers all workflows at once.`,
96
+ `- **Single-workflow operations**: \`fetch\`, \`pull\` and \`push\` always target a single workflow by ID.`,
101
97
  `- **Pull before edit**: Always ensure you have latest version before modifying.`,
102
98
  ``,
103
- `If you skip the Pull/Fetch steps, your Push will be REJECTED by the Optimistic Concurrency Control (OCC) if the user modified the UI in the meantime.`,
99
+ `> **Note on \`fetch\`**: \`push\` and \`pull\` call \`fetch\` internally you do not need to run \`${cliCmd} fetch <id>\` manually in your workflow.`,
100
+ `> \`fetch\`, \`pull\` and \`push\` always operate on **a single workflow** identified by its ID. \`list\` is the only command that covers all workflows at once.`,
101
+ ``,
102
+ `If you skip the Pull step, your Push will be REJECTED by the Optimistic Concurrency Control (OCC) if the user modified the UI in the meantime.`,
104
103
  ``,
105
104
  `---`,
106
105
  ``,
@@ -270,7 +269,7 @@ export class AiContextGenerator {
270
269
  ` position: [250, 300]`,
271
270
  ` })`,
272
271
  ` MyNode = {`,
273
- ` /* parameters from npx n8nac skills node-info */`,
272
+ ` /* parameters from npx --yes n8nac skills node-info */`,
274
273
  ` };`,
275
274
  ``,
276
275
  ` @node({`,
@@ -364,43 +363,13 @@ export class AiContextGenerator {
364
363
  ``,
365
364
  `## 🔑 Your Responsibilities`,
366
365
  ``,
367
- `**#1**: Use \`npx n8nac skills\` tools to prevent hallucinations`,
366
+ `**#1**: Use \`npx --yes n8nac skills\` tools to prevent hallucinations`,
368
367
  `**#2**: Follow the exact schema - no assumptions, no guessing`,
369
368
  `**#3**: Create workflows that work on the first try`,
370
369
  ``,
371
370
  `**When in doubt**: \`${cmd} node-info <nodeName>\``
372
371
  ].join('\n');
373
372
  }
374
- getCursorRulesContent() {
375
- return [
376
- `# n8n-as-code rules`,
377
- `- Refer to AGENTS.md for complete n8n workflow standards.`,
378
- `- MANDATORY: Use 'npx n8nac skills' tools before creating/editing nodes.`,
379
- `- REQUIRED: Use FULL node types (e.g., 'n8n-nodes-base.switch') and LATEST typeVersion.`,
380
- `- Search: 'npx n8nac skills search <query>' - Find nodes & docs (PRIMARY TOOL)`,
381
- `- Get: 'npx n8nac skills node-info <nodeName>' - Complete node info`,
382
- `- Schema: 'npx n8nac skills node-schema <nodeName>' - Quick parameters reference`,
383
- `- Docs: 'npx n8nac skills docs <title>' - Read a specific documentation page`,
384
- `- Guides: 'npx n8nac skills guides <query>' - Find tutorials and examples`,
385
- `- Workflows: 'npx n8nac skills examples search <query>' - Find community workflows (7000+)`,
386
- `- Related: 'npx n8nac skills related <nodeName>' - Discover ecosystem and related nodes`,
387
- `- Validate: 'npx n8nac skills validate workflow.workflow.ts' - Check your workflow for errors`
388
- ].join('\n');
389
- }
390
- getClineRulesContent() {
391
- return [
392
- `n8n_engineer_role:`,
393
- ` description: Expert in n8n-as-code`,
394
- ` instructions:`,
395
- ` - Read AGENTS.md for sync principles.`,
396
- ` - MANDATORY: Use FULL node types (e.g., 'n8n-nodes-base.switch') and LATEST typeVersion.`,
397
- ` - Use 'npx n8nac skills search' as your primary research tool.`,
398
- ` - Use 'npx n8nac skills examples search' to find community examples (7000+ workflows).`,
399
- ` - Use 'npx n8nac skills node-info' to fetch exact schema before editing workflow JSON.`,
400
- ` - Use 'npx n8nac skills validate workflow.workflow.ts' to verify your work.`,
401
- ` - Ensure connections are correctly indexed.`
402
- ].join('\n');
403
- }
404
373
  getSkillContent() {
405
374
  return `---
406
375
  name: n8n-architect
@@ -459,13 +428,13 @@ If the push fails with an OCC conflict (the remote was modified since your last
459
428
  When a user mentions a node type (e.g., "HTTP Request", "Google Sheets", "Code"), first search for it:
460
429
 
461
430
  \`\`\`bash
462
- npx n8nac skills search "<search term>"
431
+ npx --yes n8nac skills search "<search term>"
463
432
  \`\`\`
464
433
 
465
434
  **Examples:**
466
- - \`npx n8nac skills search "http request"\`
467
- - \`npx n8nac skills search "google sheets"\`
468
- - \`npx n8nac skills search "webhook"\`
435
+ - \`npx --yes n8nac skills search "http request"\`
436
+ - \`npx --yes n8nac skills search "google sheets"\`
437
+ - \`npx --yes n8nac skills search "webhook"\`
469
438
 
470
439
  This returns a list of matching nodes with their exact technical names.
471
440
 
@@ -474,13 +443,13 @@ This returns a list of matching nodes with their exact technical names.
474
443
  Once you have the exact node name, retrieve its complete schema:
475
444
 
476
445
  \`\`\`bash
477
- npx n8nac skills node-info "<nodeName>"
446
+ npx --yes n8nac skills node-info "<nodeName>"
478
447
  \`\`\`
479
448
 
480
449
  **Examples:**
481
- - \`npx n8nac skills node-info "httpRequest"\`
482
- - \`npx n8nac skills node-info "googleSheets"\`
483
- - \`npx n8nac skills node-info "code"\`
450
+ - \`npx --yes n8nac skills node-info "httpRequest"\`
451
+ - \`npx --yes n8nac skills node-info "googleSheets"\`
452
+ - \`npx --yes n8nac skills node-info "code"\`
484
453
 
485
454
  This returns the full JSON schema including all parameters, types, defaults, valid options, and input/output structure.
486
455
 
@@ -543,7 +512,7 @@ export class MyWorkflow {
543
512
  position: [250, 300]
544
513
  })
545
514
  MyNode = {
546
- /* parameters from npx n8nac skills node-info */
515
+ /* parameters from npx --yes n8nac skills node-info */
547
516
  };
548
517
 
549
518
  @links()
@@ -578,7 +547,7 @@ export class MyWorkflow {
578
547
  1. **Always verify node schemas** before generating configuration
579
548
  2. **Use descriptive node names** for clarity ("Get Customers", not "HTTP Request")
580
549
  3. **Add comments in Code nodes** to explain logic
581
- 4. **Validate node parameters** using \`npx n8nac skills node-info <nodeName>\`
550
+ 4. **Validate node parameters** using \`npx --yes n8nac skills node-info <nodeName>\`
582
551
  5. **Reference credentials** by name, never hardcode
583
552
  6. **Use error handling** nodes for production workflows
584
553
 
@@ -588,17 +557,17 @@ If you're unsure about any node:
588
557
 
589
558
  1. **List all available nodes:**
590
559
  \`\`\`bash
591
- npx n8nac skills list
560
+ npx --yes n8nac skills list
592
561
  \`\`\`
593
562
 
594
563
  2. **Search for similar nodes:**
595
564
  \`\`\`bash
596
- npx n8nac skills search "keyword"
565
+ npx --yes n8nac skills search "keyword"
597
566
  \`\`\`
598
567
 
599
568
  3. **Get detailed documentation:**
600
569
  \`\`\`bash
601
- npx n8nac skills node-info "nodeName"
570
+ npx --yes n8nac skills node-info "nodeName"
602
571
  \`\`\`
603
572
 
604
573
  ## 📝 Response Format
@@ -618,20 +587,5 @@ When helping users:
618
587
  **Remember**: Pull before you modify. Push after you modify. Never guess parameters — always verify against the schema.
619
588
  `;
620
589
  }
621
- getWindsurfRulesContent() {
622
- return [
623
- `### n8n Development Rules`,
624
- `- Follow the Research Protocol in AGENTS.md.`,
625
- `- Tooling: Use 'npx n8nac skills' to fetch node schemas and documentation.`,
626
- ].join('\n');
627
- }
628
- getCommonRulesContent() {
629
- return [
630
- `# Common Rules for All AI Agents (Claude, Mistral, etc.)`,
631
- `- Role: Expert n8n Automation Engineer.`,
632
- `- Workflow Source of Truth: 'npx n8nac skills' tools.`,
633
- `- Documentation: Read AGENTS.md for full syntax rules.`
634
- ].join('\n');
635
- }
636
590
  }
637
591
  //# sourceMappingURL=ai-context-generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-context-generator.js","sourceRoot":"","sources":["../../src/services/ai-context-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-context-generator.js","sourceRoot":"","sources":["../../src/services/ai-context-generator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@n8n-as-code/skills",
3
- "version": "0.16.9-next.8a0732e",
3
+ "version": "0.16.9-next.913644e",
4
4
  "description": "AI Agent skills library for n8nac (internal — use npx n8nac skills)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -14,7 +14,7 @@
14
14
  "build:adapters": "node scripts/build-claude-adapter.js"
15
15
  },
16
16
  "dependencies": {
17
- "@n8n-as-code/transformer": "0.2.2",
17
+ "@n8n-as-code/transformer": "0.2.3-next.913644e",
18
18
  "chalk": "^4.1.2",
19
19
  "commander": "^11.1.0",
20
20
  "flexsearch": "^0.8.212"
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-02-28T19:03:27.078Z",
2
+ "generatedAt": "2026-03-01T16:48:35.097Z",
3
3
  "sourceUrl": "https://docs.n8n.io/llms.txt",
4
4
  "totalPages": 1249,
5
5
  "errors": 0,
@@ -3062,7 +3062,7 @@
3062
3062
  "workflowdata"
3063
3063
  ],
3064
3064
  "useCases": [],
3065
- "contentLength": 45288,
3065
+ "contentLength": 45286,
3066
3066
  "filePath": "pages/data/page-0112.md"
3067
3067
  },
3068
3068
  "page-0113": {
@@ -548,7 +548,7 @@ See also `slice()` and `append()`.
548
548
 
549
549
  - [*`Number`*.**`toDateTime(format?)`**](number/#numbertodatetime)
550
550
 
551
- Converts a numerical timestamp into a DateTime. The format of the timestamp must be specified if it’s not in milliseconds. Uses the time zone in n8n (or in the workflow���s settings).
551
+ Converts a numerical timestamp into a DateTime. The format of the timestamp must be specified if it’s not in milliseconds. Uses the time zone in n8n (or in the workflows settings).
552
552
 
553
553
  - [*`Number`*.**`toLocaleString(locales?, options?)`**](number/#numbertolocalestring)
554
554
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-02-28T19:03:27.748Z",
2
+ "generatedAt": "2026-03-01T16:48:35.805Z",
3
3
  "version": "1.0.0",
4
4
  "sourceUrl": "https://docs.n8n.io/llms.txt",
5
5
  "totalPages": 1249,
@@ -10179,7 +10179,7 @@
10179
10179
  "nodeName": null,
10180
10180
  "nodeType": null,
10181
10181
  "content": {
10182
- "markdown": "# Expression Reference\n\nThese are some commonly used expressions. A more exhaustive list appears below.\n\n| Category | Expression | Description |\n| ------------------------------ | --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Access current input item data | `$json` | JSON data of the current item |\n| | `$json.fieldName` | Field of the current item |\n| | `$binary` | Binary data of current item |\n| Access previous node data | `$(\"NodeName\").first()` | First item in a node |\n| | `$(\"NodeName\").item` | Linked item of a node. See [Item linking](../data-mapping/data-item-linking/) for more information. |\n| | `$(\"NodeName\").all()` | All items of a node |\n| | `$(\"NodeName\").last()` | Last item of a node |\n| Date/Time | `$now` | Current date and time |\n| | `$today` | Today's date |\n| | `$now.toFormat(\"yyyy-MM-dd\")` | Format current date as a string |\n| Conditionals | `$if(condition, \"true\", \"false\")` | Helper function that returns a value when a condition is true or false |\n| | `condition ? true : false` | Ternary operator: returns one value if a condition is true, another if false |\n| | `$ifEmpty(value, defaultValue)` | Helper function takes two parameters and tests the first to check if it's empty, then returns either the parameter (if not empty) or the second parameter (if the first is empty). The first parameter is empty if it's `undefined`, `null`, an empty string `''`, an array where `value.length` returns `false` , or an object where `Object.keys(value).length` returns `false` |\n| String Methods | `text.toUpperCase()` | Convert to uppercase |\n| | `text.toLowerCase()` | Convert to lowercase |\n| | `text.includes(\"foo\")` | Check if text contains search term |\n| | `text.extractEmail()` | Extract email from text |\n| Array Methods | `array.length` | Get array length |\n| | `array.join(\", \")` | Join array elements using a comma a separator |\n| | `array.filter(x => x <= 20)` | Filter items of array based on the filtering condition |\n| | `array.map(x => x.id)` | Transform items of an array |\n\nBrowse the tables below to find methods by the data type on which they act. Click a method name to read detailed documentation for it.\n\n## Array\n\n- [*`Array`*.**`append(elem1, elem2?, ..., elemN?)`**](array/#arrayappend)\n\n Adds new elements to the end of the array. Similar to `push()`, but returns the modified array. Consider using spread syntax instead (see examples).\n\n- [*`Array`*.**`average()`**](array/#arrayaverage)\n\n Returns the average of the numbers in the array. Throws an error if there are any non-numbers.\n\n- [*`Array`*.**`chunk(length)`**](array/#arraychunk)\n\n Splits the array into an array of sub-arrays, each with the given length\n\n- [*`Array`*.**`compact()`**](array/#arraycompact)\n\n Removes any empty values from the array. `null`, `\"\"` and `undefined` count as empty.\n\n- [*`Array`*.**`concat(array2, array3?, ... arrayN?)`**](array/#arrayconcat)\n\n Joins one or more arrays onto the end of the base array\n\n- [*`Array`*.**`difference(otherArray)`**](array/#arraydifference)\n\n Compares two arrays. Returns all elements in the base array that aren't present in `otherArray`.\n\n- [*`Array`*.**`filter(function(element, index?, array?), thisValue?)`**](array/#arrayfilter)\n\n Returns an array with only the elements satisfying a condition. The condition is a function that returns `true` or `false`.\n\n- [*`Array`*.**`find(function(element, index?, array?), thisValue?)`**](array/#arrayfind)\n\n Returns the first element from the array that satisfies the provided condition. The condition is a function that returns `true` or `false`. Returns `undefined` if no matches are found.\n\nIf you need all matching elements, use `filter()`.\n\n- [*`Array`*.**`first()`**](array/#arrayfirst)\n\n Returns the first element of the array\n\n- [*`Array`*.**`includes(element, start?)`**](array/#arrayincludes)\n\n Returns `true` if the array contains the specified element\n\n- [*`Array`*.**`indexOf(element, start?)`**](array/#arrayindexof)\n\n Returns the position of the first matching element in the array, or -1 if the element isn’t found. Positions start at 0.\n\n- [*`Array`*.**`intersection(otherArray)`**](array/#arrayintersection)\n\n Compares two arrays. Returns all elements in the base array that are also present in the other array.\n\n- [*`Array`*.**`isEmpty()`**](array/#arrayisempty)\n\n Returns `true` if the array has no elements or is `null`\n\n- [*`Array`*.**`isNotEmpty()`**](array/#arrayisnotempty)\n\n Returns `true` if the array has at least one element\n\n- [*`Array`*.**`join(separator?)`**](array/#arrayjoin)\n\n Merges all elements of the array into a single string, with an optional separator between each element.\n\nThe opposite of `split()`.\n\n- [*`Array`*.**`last()`**](array/#arraylast)\n\n Returns the last element of the array\n\n- [*`Array`*.**`length`**](array/#arraylength)\n\n The number of elements in the array\n\n- [*`Array`*.**`map(function(element, index?, array?), thisValue?)`**](array/#arraymap)\n\n Creates a new array by applying a function to each element of the original array\n\n- [*`Array`*.**`max()`**](array/#arraymax)\n\n Returns the largest number in the array. Throws an error if there are any non-numbers.\n\n- [*`Array`*.**`min()`**](array/#arraymin)\n\n Returns the smallest number in the array. Throws an error if there are any non-numbers.\n\n- [*`Array`*.**`pluck(fieldName1?, fieldName2?, …)`**](array/#arraypluck)\n\n Returns an array containing the values of the given field(s) in each Object of the array. Ignores any array elements that aren’t Objects or don’t have a key matching the field name(s) provided.\n\n- [*`Array`*.**`randomItem()`**](array/#arrayrandomitem)\n\n Returns a randomly-chosen element from the array\n\n- [*`Array`*.**`reduce(function(prevResult, currentElem, currentIndex?, array?), initResult)`**](array/#arrayreduce)\n\n Reduces an array to a single value by applying a function to each element. The function combines the current element with the result of reducing the previous elements, producing a new result.\n\n- [*`Array`*.**`removeDuplicates(keys?)`**](array/#arrayremoveduplicates)\n\n Removes any re-occurring elements from the array\n\n- [*`Array`*.**`renameKeys(from, to)`**](array/#arrayrenamekeys)\n\n Changes all matching keys (field names) of any Objects in the array. Rename more than one key by adding extra arguments, i.e. `from1, to1, from2, to2, ...`.\n\n- [*`Array`*.**`reverse()`**](array/#arrayreverse)\n\n Reverses the order of the elements in the array\n\n- [*`Array`*.**`slice(start, end)`**](array/#arrayslice)\n\n Returns a portion of the array, from the `start` index up to (but not including) the `end` index. Indexes start at 0.\n\n- [*`Array`*.**`smartJoin(keyField, nameField)`**](array/#arraysmartjoin)\n\n Creates a single Object from an array of Objects. Each Object in the array provides one field for the returned Object. Each Object in the array must contain a field with the key name and a field with the value.\n\n- [*`Array`*.**`sort(compareFunction(a, b)?)`**](array/#arraysort)\n\n Reorders the elements of the array. For sorting strings alphabetically, no parameter is required. For sorting numbers or Objects, see examples.\n\n- [*`Array`*.**`sum()`**](array/#arraysum)\n\n Returns the total of all the numbers in the array. Throws an error if there are any non-numbers.\n\n- [*`Array`*.**`toJsonString()`**](array/#arraytojsonstring)\n\n Converts the array to a JSON string. The same as JavaScript’s `JSON.stringify()`.\n\n- [*`Array`*.**`toSpliced(start, deleteCount, elem1, ....., elemN)`**](array/#arraytospliced)\n\n Adds and/or removes array elements at a given position.\n\nSee also `slice()` and `append()`.\n\n- [*`Array`*.**`toString()`**](array/#arraytostring)\n\n Converts the array to a string, with values separated by commas. To use a different separator, use `join()` instead.\n\n- [*`Array`*.**`union(otherArray)`**](array/#arrayunion)\n\n Concatenates two arrays and then removes any duplicates\n\n- [*`Array`*.**`unique()`**](array/#arrayunique)\n\n Removes any duplicate elements from the array\n\n## BinaryFile\n\n- [`binaryFile`.**`directory`**](binaryfile/#binaryfiledirectory)\n\n The path to the directory that the file is stored in. Useful for distinguishing between files with the same name in different directories. Not set if n8n is configured to store files in its database.\n\n- [`binaryFile`.**`fileExtension`**](binaryfile/#binaryfilefileextension)\n\n The suffix attached to the filename (e.g. `txt`)\n\n- [`binaryFile`.**`fileName`**](binaryfile/#binaryfilefilename)\n\n The name of the file, including extension\n\n- [`binaryFile`.**`fileSize`**](binaryfile/#binaryfilefilesize)\n\n A string representing the size of the file\n\n- [`binaryFile`.**`fileType`**](binaryfile/#binaryfilefiletype)\n\n A string representing the type of the file, e.g. `image`. Corresponds to the first part of the MIME type.\n\n- [`binaryFile`.**`id`**](binaryfile/#binaryfileid)\n\n The unique ID of the file. Used to identify the file when it is stored on disk or in a storage service such as S3.\n\n- [`binaryFile`.**`mimeType`**](binaryfile/#binaryfilemimetype)\n\n A string representing the format of the file’s contents, e.g. `image/jpeg`\n\n## Boolean\n\n- [*`Boolean`*.**`isEmpty()`**](boolean/#booleanisempty)\n\n Returns `false` for all booleans. Returns `true` for `null`.\n\n- [*`Boolean`*.**`toNumber()`**](boolean/#booleantonumber)\n\n Converts `true` to 1 and `false` to 0\n\n- [*`Boolean`*.**`toString()`**](boolean/#booleantostring)\n\n Converts `true` to the string ‘true’ and `false` to the string ‘false’\n\n## CustomData\n\n- [`$execution.customData`.**`get(key)`**](customdata/#executioncustomdataget)\n\n Returns the custom execution data stored under the given key. [More info](/workflows/executions/custom-executions-data/)\n\n- [`$execution.customData`.**`getAll()`**](customdata/#executioncustomdatagetall)\n\n Returns all the key-value pairs of custom data that have been set in the current execution. [More info](/workflows/executions/custom-executions-data/)\n\n- [`$execution.customData`.**`set(key, value)`**](customdata/#executioncustomdataset)\n\n Stores custom execution data under the key specified. Use this to easily filter executions by this data. [More info](/workflows/executions/custom-executions-data/)\n\n- [`$execution.customData`.**`setAll(obj)`**](customdata/#executioncustomdatasetall)\n\n Sets multiple key-value pairs of custom data for the execution. Use this to easily filter executions by this data. [More info](/workflows/executions/custom-executions-data/)\n\n## Date\n\n- [*`Date`*.**`toDateTime()`**](date/#datetodatetime)\n\n Converts a JavaScript Date to a Luxon DateTime. The DateTime contains the same information, but is easier to manipulate.\n\n## DateTime\n\n- [*`DateTime`*.**`day`**](datetime/#datetimeday)\n\n The day of the month (1-31)\n\n- [*`DateTime`*.**`diffTo(otherDateTime, unit)`**](datetime/#datetimediffto)\n\n Returns the difference between two DateTimes, in the given unit(s)\n\n- [*`DateTime`*.**`diffToNow(unit)`**](datetime/#datetimedifftonow)\n\n Returns the difference between the current moment and the DateTime, in the given unit(s). For a textual representation, use `toRelative()` instead.\n\n- [*`DateTime`*.**`endOf(unit, opts)`**](datetime/#datetimeendof)\n\n Rounds the DateTime up to the end of one of its units, e.g. the end of the month\n\n- [*`DateTime`*.**`equals(other)`**](datetime/#datetimeequals)\n\n Returns `true` if the two DateTimes represent exactly the same moment and are in the same time zone. For a less strict comparison, use `hasSame()`.\n\n- [*`DateTime`*.**`extract(unit?)`**](datetime/#datetimeextract)\n\n Extracts a part of the date or time, e.g. the month, as a number. To extract textual names instead, see `format()`.\n\n- [*`DateTime`*.**`format(fmt)`**](datetime/#datetimeformat)\n\n Converts the DateTime to a string, using the format specified. [Formatting guide](https://moment.github.io/luxon/#/formatting?id=table-of-tokens). For common formats, `toLocaleString()` may be easier.\n\n- [*`DateTime`*.**`hasSame(otherDateTime, unit)`**](datetime/#datetimehassame)\n\n Returns `true` if the two DateTimes are the same, down to the unit specified. Time zones are ignored (only local times are compared), so use `toUTC()` first if needed.\n\n- [*`DateTime`*.**`hour`**](datetime/#datetimehour)\n\n The hour of the day (0-23)\n\n- [*`DateTime`*.**`isBetween(date1, date2)`**](datetime/#datetimeisbetween)\n\n Returns `true` if the DateTime lies between the two moments specified\n\n- [*`DateTime`*.**`isInDST`**](datetime/#datetimeisindst)\n\n Whether the DateTime is in daylight saving time\n\n- [*`DateTime`*.**`locale`**](datetime/#datetimelocale)\n\n The locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime.\n\n- [*`DateTime`*.**`millisecond`**](datetime/#datetimemillisecond)\n\n The millisecond of the second (0-999)\n\n- [*`DateTime`*.**`minus(n, unit?)`**](datetime/#datetimeminus)\n\n Subtracts a given period of time from the DateTime\n\n- [*`DateTime`*.**`minute`**](datetime/#datetimeminute)\n\n The minute of the hour (0-59)\n\n- [*`DateTime`*.**`month`**](datetime/#datetimemonth)\n\n The month (1-12)\n\n- [*`DateTime`*.**`monthLong`**](datetime/#datetimemonthlong)\n\n The textual long month name, e.g. 'October'. Defaults to the system's locale if no locale has been specified.\n\n- [*`DateTime`*.**`monthShort`**](datetime/#datetimemonthshort)\n\n The textual abbreviated month name, e.g. 'Oct'. Defaults to the system's locale if no locale has been specified.\n\n- [*`DateTime`*.**`plus(n, unit?)`**](datetime/#datetimeplus)\n\n Adds a given period of time to the DateTime\n\n- [*`DateTime`*.**`quarter`**](datetime/#datetimequarter)\n\n The quarter of the year (1-4)\n\n- [*`DateTime`*.**`second`**](datetime/#datetimesecond)\n\n The second of the minute (0-59)\n\n- [*`DateTime`*.**`set(values)`**](datetime/#datetimeset)\n\n Assigns new values to specified units of the DateTime. To round a DateTime, see also `startOf()` and `endOf()`.\n\n- [*`DateTime`*.**`setLocale(locale)`**](datetime/#datetimesetlocale)\n\n Sets the locale, which determines the language and formatting for the DateTime. Useful when generating a textual representation of the DateTime, e.g. with `format()` or `toLocaleString()`.\n\n- [*`DateTime`*.**`setZone(zone, opts)`**](datetime/#datetimesetzone)\n\n Converts the DateTime to the given time zone. The DateTime still represents the same moment unless specified in the options. See also `toLocal()` and `toUTC()`.\n\n- [*`DateTime`*.**`startOf(unit, opts)`**](datetime/#datetimestartof)\n\n Rounds the DateTime down to the beginning of one of its units, e.g. the start of the month\n\n- [*`DateTime`*.**`toISO(opts)`**](datetime/#datetimetoiso)\n\n Returns an ISO 8601-compliant string representation of the DateTime\n\n- [*`DateTime`*.**`toLocal()`**](datetime/#datetimetolocal)\n\n Converts a DateTime to the workflow’s local time zone. The DateTime still represents the same moment unless specified in the parameters. The workflow’s time zone can be set in the workflow settings.\n\n- [*`DateTime`*.**`toLocaleString(formatOpts)`**](datetime/#datetimetolocalestring)\n\n Returns a localised string representing the DateTime, i.e. in the language and format corresponding to its locale. Defaults to the system's locale if none specified.\n\n- [*`DateTime`*.**`toMillis()`**](datetime/#datetimetomillis)\n\n Returns a Unix timestamp in milliseconds (the number elapsed since 1st Jan 1970)\n\n- [*`DateTime`*.**`toRelative(options)`**](datetime/#datetimetorelative)\n\n Returns a textual representation of the time relative to now, e.g. ‘in two days’. Rounds down by default.\n\n- [*`DateTime`*.**`toSeconds()`**](datetime/#datetimetoseconds)\n\n Returns a Unix timestamp in seconds (the number elapsed since 1st Jan 1970)\n\n- [*`DateTime`*.**`toString()`**](datetime/#datetimetostring)\n\n Returns a string representation of the DateTime. Similar to `toISO()`. For more formatting options, see `format()` or `toLocaleString()`.\n\n- [*`DateTime`*.**`toUTC(offset, opts)`**](datetime/#datetimetoutc)\n\n Converts a DateTime to the UTC time zone. The DateTime still represents the same moment unless specified in the parameters. Use `setZone()` to convert to other zones.\n\n- [*`DateTime`*.**`weekday`**](datetime/#datetimeweekday)\n\n The day of the week. 1 is Monday and 7 is Sunday.\n\n- [*`DateTime`*.**`weekdayLong`**](datetime/#datetimeweekdaylong)\n\n The textual long weekday name, e.g. 'Wednesday'. Defaults to the system's locale if no locale has been specified.\n\n- [*`DateTime`*.**`weekdayShort`**](datetime/#datetimeweekdayshort)\n\n The textual abbreviated weekday name, e.g. 'Wed'. Defaults to the system's locale if no locale has been specified.\n\n- [*`DateTime`*.**`weekNumber`**](datetime/#datetimeweeknumber)\n\n The week number of the year (1-52ish)\n\n- [*`DateTime`*.**`year`**](datetime/#datetimeyear)\n\n The year\n\n- [*`DateTime`*.**`zone`**](datetime/#datetimezone)\n\n The time zone associated with the DateTime\n\n## ExecData\n\n- [`$exec`.**`customData`**](execdata/#execcustomdata)\n\n Set and get custom execution data (e.g. to filter executions by). You can also do this with the ‘Execution Data’ node. [More info](/workflows/executions/custom-executions-data/)\n\n- [`$exec`.**`id`**](execdata/#execid)\n\n The ID of the current workflow execution\n\n- [`$exec`.**`mode`**](execdata/#execmode)\n\n Can be one of 3 values: either `test` (meaning the execution was triggered by clicking a button in n8n) or `production` (meaning the execution was triggered automatically). When running workflow tests, `evaluation` is used.\n\n- [`$exec`.**`resumeFormUrl`**](execdata/#execresumeformurl)\n\n The URL to access a form generated by the [’Wait’ node](/integrations/builtin/core-nodes/n8n-nodes-base.wait/).\n\n- [`$exec`.**`resumeUrl`**](execdata/#execresumeurl)\n\n The webhook URL to call to resume a workflow waiting at a [’Wait’ node](/integrations/builtin/core-nodes/n8n-nodes-base.wait/).\n\n## HTTPResponse\n\n- [`$response`.**`body`**](httpresponse/#responsebody)\n\n The body of the response object from the last HTTP call. Only available in the ‘HTTP Request’ node\n\n- [`$response`.**`headers`**](httpresponse/#responseheaders)\n\n The headers returned by the last HTTP call. Only available in the ‘HTTP Request’ node.\n\n- [`$response`.**`statusCode`**](httpresponse/#responsestatuscode)\n\n The HTTP status code returned by the last HTTP call. Only available in the ‘HTTP Request’ node.\n\n- [`$response`.**`statusMessage`**](httpresponse/#responsestatusmessage)\n\n An optional message regarding the request status. Only available in the ‘HTTP Request’ node.\n\n## Item\n\n- [`$item`.**`binary`**](item/#itembinary)\n\n Returns any binary data the item contains\n\n- [`$item`.**`json`**](item/#itemjson)\n\n Returns the JSON data the item contains. [More info](/data/data-structure/)\n\n## NodeInputData\n\n- [`$input`.**`all(branchIndex?, runIndex?)`**](nodeinputdata/#inputall)\n\n Returns an array of the current node’s input items\n\n- [`$input`.**`first(branchIndex?, runIndex?)`**](nodeinputdata/#inputfirst)\n\n Returns the current node’s first input item\n\n- [`$input`.**`item`**](nodeinputdata/#inputitem)\n\n Returns the input item currently being processed\n\n- [`$input`.**`last(branchIndex?, runIndex?)`**](nodeinputdata/#inputlast)\n\n Returns the current node’s last input item\n\n- [`$input`.**`params`**](nodeinputdata/#inputparams)\n\n The configuration settings of the current node. These are the parameters you fill out within the node when configuring it (e.g. its operation).\n\n## NodeOutputData\n\n- [`$()`.**`all(branchIndex?, runIndex?)`**](nodeoutputdata/#all)\n\n Returns an array of the node’s output items\n\n- [`$()`.**`first(branchIndex?, runIndex?)`**](nodeoutputdata/#first)\n\n Returns the first item output by the node\n\n- [`$()`.**`isExecuted`**](nodeoutputdata/#isexecuted)\n\n Is `true` if the node has executed, `false` otherwise\n\n- [`$()`.**`item`**](nodeoutputdata/#item)\n\n Returns the matching item, i.e. the one used to produce the current item in the current node. [More info](/data/data-mapping/data-item-linking/)\n\n- [`$()`.**`itemMatching(currentItemIndex?)`**](nodeoutputdata/#itemmatching)\n\n Returns the matching item, i.e. the one used to produce the item in the current node at the specified index. [More info](/data/data-mapping/data-item-linking/)\n\n- [`$()`.**`last(branchIndex?, runIndex?)`**](nodeoutputdata/#last)\n\n Returns the last item output by the node\n\n- [`$()`.**`params`**](nodeoutputdata/#params)\n\n The configuration settings of the given node. These are the parameters you fill out within the node’s UI (e.g. its operation).\n\n## Number\n\n- [*`Number`*.**`abs()`**](number/#numberabs)\n\n Returns the number’s absolute value, i.e. removes any minus sign\n\n- [*`Number`*.**`ceil()`**](number/#numberceil)\n\n Rounds the number up to the next whole number\n\n- [*`Number`*.**`floor()`**](number/#numberfloor)\n\n Rounds the number down to the nearest whole number\n\n- [*`Number`*.**`format(locale?, options?)`**](number/#numberformat)\n\n Returns a formatted string representing the number. Useful for formatting for a specific language or currency. The same as [`Intl.NumberFormat()`](%E2%80%9Dhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat%E2%80%9D).\n\n- [*`Number`*.**`isEmpty()`**](number/#numberisempty)\n\n Returns `false` for all numbers. Returns `true` for `null`.\n\n- [*`Number`*.**`isEven()`**](number/#numberiseven)\n\n Returns `true` if the number is even. Throws an error if the number isn’t a whole number.\n\n- [*`Number`*.**`isInteger()`**](number/#numberisinteger)\n\n Returns `true` if the number is a whole number\n\n- [*`Number`*.**`isOdd()`**](number/#numberisodd)\n\n Returns `true` if the number is odd. Throws an error if the number isn’t a whole number.\n\n- [*`Number`*.**`round(decimalPlaces?)`**](number/#numberround)\n\n Returns the number rounded to the nearest whole number (or specified number of decimal places)\n\n- [*`Number`*.**`toBoolean()`**](number/#numbertoboolean)\n\n Converts the number to a boolean value. `0` becomes `false`; everything else becomes `true`.\n\n- [*`Number`*.**`toDateTime(format?)`**](number/#numbertodatetime)\n\n Converts a numerical timestamp into a DateTime. The format of the timestamp must be specified if it’s not in milliseconds. Uses the time zone in n8n (or in the workflow���s settings).\n\n- [*`Number`*.**`toLocaleString(locales?, options?)`**](number/#numbertolocalestring)\n\n Returns a localised string representing the number, i.e. in the language and format corresponding to its locale. Defaults to the system's locale if none specified.\n\n- [*`Number`*.**`toString(radix?)`**](number/#numbertostring)\n\n Converts the number to a simple textual representation. For more formatting options, see `toLocaleString()`.\n\n## Object\n\n- [*`Object`*.**`compact()`**](object/#objectcompact)\n\n Removes all fields that have empty values, i.e. are `null` or `\"\"`\n\n- [*`Object`*.**`hasField(name)`**](object/#objecthasfield)\n\n Returns `true` if there is a field called `name`. Only checks top-level keys. Comparison is case-sensitive.\n\n- [*`Object`*.**`isEmpty()`**](object/#objectisempty)\n\n Returns `true` if the Object has no keys (fields) set or is `null`\n\n- [*`Object`*.**`isNotEmpty()`**](object/#objectisnotempty)\n\n Returns `true` if the Object has at least one key (field) set\n\n- [*`Object`*.**`keepFieldsContaining(value)`**](object/#objectkeepfieldscontaining)\n\n Removes any fields whose values don’t at least partly match the given `value`. Comparison is case-sensitive. Fields that aren’t strings will always be removed.\n\n- [*`Object`*.**`keys()`**](object/#objectkeys)\n\n Returns an array with all the field names (keys) the object contains. The same as JavaScript’s `Object.keys(obj)`.\n\n- [*`Object`*.**`merge(otherObject)`**](object/#objectmerge)\n\n Merges the two Objects into a single one. If a key (field name) exists in both Objects, the value from the first (base) Object is used.\n\n- [*`Object`*.**`removeField(key)`**](object/#objectremovefield)\n\n Removes a field from the Object. The same as JavaScript’s `delete`.\n\n- [*`Object`*.**`removeFieldsContaining(value)`**](object/#objectremovefieldscontaining)\n\n Removes keys (fields) whose values at least partly match the given `value`. Comparison is case-sensitive. Fields that aren’t strings are always kept.\n\n- [*`Object`*.**`toJsonString()`**](object/#objecttojsonstring)\n\n Converts the Object to a JSON string. Similar to JavaScript’s `JSON.stringify()`.\n\n- [*`Object`*.**`urlEncode()`**](object/#objecturlencode)\n\n Generates a URL parameter string from the Object’s keys and values. Only top-level keys are supported.\n\n- [*`Object`*.**`values()`**](object/#objectvalues)\n\n Returns an array with all the values of the fields the Object contains. The same as JavaScript’s `Object.values(obj)`.\n\n## PrevNodeData\n\n- [**`name`**](prevnodedata/#name)\n\n The name of the node that the current input came from.\n\nAlways uses the current node’s first input connector if there is more than one (e.g. in the ‘Merge’ node).\n\n- [**`outputIndex`**](prevnodedata/#outputindex)\n\n The index of the output connector that the current input came from. Use this when the previous node had multiple outputs (such as an ‘If’ or ‘Switch’ node).\n\nAlways uses the current node’s first input connector if there is more than one (e.g. in the ‘Merge’ node).\n\n- [**`runIndex`**](prevnodedata/#runindex)\n\n The run of the previous node that generated the current input.\n\nAlways uses the current node’s first input connector if there is more than one (e.g. in the ‘Merge’ node).\n\n## Root\n\n- [**`$(nodeName)`**](root/)\n\n Returns the data of the specified node\n\n- [**`$binary`**](root/#binary)\n\n Returns any binary input data to the current node, for the current item. Shorthand for `$input.item.binary`.\n\n- [**`$execution`**](root/#execution)\n\n Retrieve or set metadata for the current execution\n\n- [**`$fromAI(key, description?, type?, defaultValue?)`**](root/#fromai)\n\n Use when a large language model should provide the value of a node parameter. Consider providing a description for better results.\n\n- [**`$if(condition, valueIfTrue, valueIfFalse)`**](root/#if)\n\n Returns one of two values depending on the `condition`. Similar to the `?` operator in JavaScript.\n\n- [**`$ifEmpty(value, valueIfEmpty)`**](root/#ifempty)\n\n Returns the first parameter if it isn’t empty, otherwise returns the second parameter. The following count as empty: `””`, `[]`, `{}`, `null`, `undefined`\n\n- [**`$input`**](root/#input)\n\n The input data of the current node\n\n- [**`$itemIndex`**](root/#itemindex)\n\n The position of the item currently being processed in the list of input items\n\n- [**`$jmespath(obj, expression)`**](root/#jmespath)\n\n Extracts data from an object (or array of objects) using a [JMESPath](%E2%80%9D/code/cookbook/jmespath/%E2%80%9D) expression. Useful for querying complex, nested objects. Returns `undefined` if the expression is invalid.\n\n- [**`$json`**](root/#json)\n\n Returns the JSON input data to the current node, for the current item. Shorthand for `$input.item.json`. [More info](/data/data-structure/)\n\n- [**`$max(num1, num2, …, numN)`**](root/#max)\n\n Returns the highest of the given numbers\n\n- [**`$min(num1, num2, …, numN)`**](root/#min)\n\n Returns the lowest of the given numbers\n\n- [**`$nodeVersion`**](root/#nodeversion)\n\n The version of the current node (as displayed at the bottom of the nodes’s settings pane)\n\n- [**`$now`**](root/#now)\n\n A DateTime representing the current moment.\n\nUses the workflow’s time zone (which can be changed in the workflow settings).\n\n- [**`$pageCount`**](root/#pagecount)\n\n The number of results pages the node has fetched. Only available in the ‘HTTP Request’ node.\n\n- [**`$parameter`**](root/#parameter)\n\n The configuration settings of the current node. These are the parameters you fill out within the node’s UI (e.g. its operation).\n\n- [**`$prevNode`**](root/#prevnode)\n\n Information about the node that the current input came from.\n\nWhen in a ‘Merge’ node, always uses the first input connector.\n\n- [**`$request`**](root/#request)\n\n The request object sent during the last run of the node. Only available in the ‘HTTP Request’ node.\n\n- [**`$response`**](root/#response)\n\n The response returned by the last HTTP call. Only available in the ‘HTTP Request’ node.\n\n- [**`$runIndex`**](root/#runindex)\n\n The index of the current run of the current node execution. Starts at 0.\n\n- [**`$secrets`**](root/#secrets)\n\n The secrets from an [external secrets vault](/external-secrets/), if configured. Secret values are never displayed to the user. Only available in credential fields.\n\n- [**`$today`**](root/#today)\n\n A DateTime representing midnight at the start of the current day.\n\nUses the instance’s time zone (unless overridden in the workflow’s settings).\n\n- [**`$vars`**](root/#vars)\n\n The [variables](/code/variables/) available to the workflow\n\n- [**`$workflow`**](root/#workflow)\n\n Information about the current workflow\n\n## String\n\n- [*`String`*.**`base64Encode()`**](string/#stringbase64decode)\n\n Converts plain text to a base64-encoded string\n\n- [*`String`*.**`base64Encode()`**](string/#stringbase64encode)\n\n Converts a base64-encoded string to plain text\n\n- [*`String`*.**`concat(string1, string2?, ..., stringN?)`**](string/#stringconcat)\n\n Joins one or more strings onto the end of the base string. Alternatively, use the `+` operator (see examples).\n\n- [*`String`*.**`extractDomain()`**](string/#stringextractdomain)\n\n If the string is an email address or URL, returns its domain (or `undefined` if nothing found).\n\nIf the string also contains other content, try using `extractEmail()` or `extractUrl()` first.\n\n- [*`String`*.**`extractEmail()`**](string/#stringextractemail)\n\n Extracts the first email found in the string. Returns `undefined` if none is found.\n\n- [*`String`*.**`extractUrl()`**](string/#stringextracturl)\n\n Extracts the first URL found in the string. Returns `undefined` if none is found. Only recognizes full URLs, e.g. those starting with `http`.\n\n- [*`String`*.**`extractUrlPath()`**](string/#stringextracturlpath)\n\n Returns the part of a URL after the domain, or `undefined` if no URL found.\n\nIf the string also contains other content, try using `extractUrl()` first.\n\n- [*`String`*.**`hash(algo?)`**](string/#stringhash)\n\n Returns the string hashed with the given algorithm. Defaults to md5 if not specified.\n\n- [*`String`*.**`includes(searchString, start?)`**](string/#stringincludes)\n\n Returns `true` if the string contains the `searchString`. Case-sensitive.\n\n- [*`String`*.**`indexOf(searchString, start?)`**](string/#stringindexof)\n\n Returns the index (position) of the first occurrence of `searchString` within the base string, or -1 if not found. Case-sensitive.\n\n- [*`String`*.**`isDomain()`**](string/#stringisdomain)\n\n Returns `true` if the string is a domain\n\n- [*`String`*.**`isEmail()`**](string/#stringisemail)\n\n Returns `true` if the string is an email\n\n- [*`String`*.**`isEmpty()`**](string/#stringisempty)\n\n Returns `true` if the string has no characters or is `null`\n\n- [*`String`*.**`isNotEmpty()`**](string/#stringisnotempty)\n\n Returns `true` if the string has at least one character\n\n- [*`String`*.**`isNumeric()`**](string/#stringisnumeric)\n\n Returns `true` if the string represents a number\n\n- [*`String`*.**`isUrl()`**](string/#stringisurl)\n\n Returns `true` if the string is a valid URL\n\n- [*`String`*.**`length`**](string/#stringlength)\n\n The number of characters in the string\n\n- [*`String`*.**`match(regexp)`**](string/#stringmatch)\n\n Matches the string against a [regular expression](%E2%80%9Dhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions%E2%80%9D). Returns an array containing the first match, or all matches if the `g` flag is set in the regular expression. Returns `null` if no matches are found.\n\nFor checking whether text is present, consider `includes()` instead.\n\n- [*`String`*.**`parseJson()`**](string/#stringparsejson)\n\n Returns the JavaScript Object or value represented by the string, or `undefined` if the string isn’t valid JSON. Single-quoted JSON is not supported.\n\n- [*`String`*.**`quote(mark?)`**](string/#stringquote)\n\n Wraps a string in quotation marks, and escapes any quotation marks already in the string. Useful when constructing JSON, SQL, etc.\n\n- [*`String`*.**`removeMarkdown()`**](string/#stringremovemarkdown)\n\n Removes any Markdown formatting from the string. Also removes HTML tags.\n\n- [*`String`*.**`removeTags()`**](string/#stringremovetags)\n\n Removes tags, such as HTML or XML, from the string\n\n- [*`String`*.**`replace(pattern, replacement)`**](string/#stringreplace)\n\n Returns a string with the first occurrence of `pattern` replaced by `replacement`.\n\nTo replace all occurrences, use `replaceAll()` instead.\n\n- [*`String`*.**`replaceAll(pattern, replacement)`**](string/#stringreplaceall)\n\n Returns a string with all occurrences of `pattern` replaced by `replacement`\n\n- [*`String`*.**`replaceSpecialChars()`**](string/#stringreplacespecialchars)\n\n Replaces special characters in the string with the closest ASCII character\n\n- [*`String`*.**`search(regexp)`**](string/#stringsearch)\n\n Returns the index (position) of the first occurrence of a pattern within the string, or -1 if not found. The pattern is specified using a [regular expression](%E2%80%9Dhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions%E2%80%9D). To use text instead, see `indexOf()`.\n\n- [*`String`*.**`slice(start, end?)`**](string/#stringslice)\n\n Extracts a fragment of the string at the given position. For more advanced extraction, see `match()`.\n\n- [*`String`*.**`split(separator?, limit?)`**](string/#stringsplit)\n\n Splits the string into an array of substrings. Each split is made at the `separator`, and the separator isn’t included in the output.\n\nThe opposite of using `join()` on an array.\n\n- [*`String`*.**`startsWith(searchString, start?)`**](string/#stringstartswith)\n\n Returns `true` if the string starts with `searchString`. Case-sensitive.\n\n- [*`String`*.**`substring(start, end?)`**](string/#stringsubstring)\n\n Extracts a fragment of the string at the given position. For more advanced extraction, see `match()`.\n\n- [*`String`*.**`toBoolean()`**](string/#stringtoboolean)\n\n Converts the string to a boolean value. `0`, `false` and `no` resolve to `false`, everything else to `true`. Case-insensitive.\n\n- [*`String`*.**`toDateTime()`**](string/#stringtodatetime)\n\n Converts the string to a DateTime. Useful for further transformation. Supported formats for the string are ISO 8601, HTTP, RFC2822, SQL and Unix timestamp in milliseconds.\n\nTo parse other formats, use [`DateTime.fromFormat()`](%E2%80%9Dhttps://moment.github.io/luxon/api-docs/index.html#datetimefromformat%E2%80%9D).\n\n- [*`String`*.**`toJsonString()`**](string/#stringtojsonstring)\n\n Prepares the string to be inserted into a JSON object. Escapes any quotes and special characters (e.g. new lines), and wraps the string in quotes.\n\nThe same as JavaScript’s `JSON.stringify()`.\n\n- [*`String`*.**`toLowerCase()`**](string/#stringtolowercase)\n\n Converts all letters in the string to lower case\n\n- [*`String`*.**`toNumber()`**](string/#stringtonumber)\n\n Converts a string representing a number to a number. Throws an error if the string doesn’t start with a valid number.\n\n- [*`String`*.**`toSentenceCase()`**](string/#stringtosentencecase)\n\n Changes the capitalization of the string to sentence case. The first letter of each sentence is capitalized and all others are lowercased.\n\n- [*`String`*.**`toSnakeCase()`**](string/#stringtosnakecase)\n\n Changes the format of the string to snake case. Spaces and dashes are replaced by `_`, symbols are removed and all letters are lowercased.\n\n- [*`String`*.**`toTitleCase()`**](string/#stringtotitlecase)\n\n Changes the capitalization of the string to title case. The first letter of each word is capitalized and the others left unchanged. Short prepositions and conjunctions aren’t capitalized (e.g. ‘a’, ‘the’).\n\n- [*`String`*.**`toUpperCase()`**](string/#stringtouppercase)\n\n Converts all letters in the string to upper case (capitals)\n\n- [*`String`*.**`trim()`**](string/#stringtrim)\n\n Removes whitespace from both ends of the string. Whitespace includes new lines, tabs, spaces, etc.\n\n- [*`String`*.**`urlDecode(allChars?)`**](string/#stringurldecode)\n\n Decodes a URL-encoded string. Replaces any character codes in the form of `%XX` with their corresponding characters.\n\n- [*`String`*.**`urlEncode(allChars?)`**](string/#stringurlencode)\n\n Encodes the string so that it can be used in a URL. Spaces and special characters are replaced with codes of the form `%XX`.\n\n## WorkflowData\n\n- [`$workflow`.**`active`**](workflowdata/#workflowactive)\n\n Whether the workflow is active\n\n- [`$workflow`.**`id`**](workflowdata/#workflowid)\n\n The workflow ID. Can also be found in the workflow’s URL.\n\n- [`$workflow`.**`name`**](workflowdata/#workflowname)\n\n The name of the workflow, as shown at the top of the editor\n",
10182
+ "markdown": "# Expression Reference\n\nThese are some commonly used expressions. A more exhaustive list appears below.\n\n| Category | Expression | Description |\n| ------------------------------ | --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Access current input item data | `$json` | JSON data of the current item |\n| | `$json.fieldName` | Field of the current item |\n| | `$binary` | Binary data of current item |\n| Access previous node data | `$(\"NodeName\").first()` | First item in a node |\n| | `$(\"NodeName\").item` | Linked item of a node. See [Item linking](../data-mapping/data-item-linking/) for more information. |\n| | `$(\"NodeName\").all()` | All items of a node |\n| | `$(\"NodeName\").last()` | Last item of a node |\n| Date/Time | `$now` | Current date and time |\n| | `$today` | Today's date |\n| | `$now.toFormat(\"yyyy-MM-dd\")` | Format current date as a string |\n| Conditionals | `$if(condition, \"true\", \"false\")` | Helper function that returns a value when a condition is true or false |\n| | `condition ? true : false` | Ternary operator: returns one value if a condition is true, another if false |\n| | `$ifEmpty(value, defaultValue)` | Helper function takes two parameters and tests the first to check if it's empty, then returns either the parameter (if not empty) or the second parameter (if the first is empty). The first parameter is empty if it's `undefined`, `null`, an empty string `''`, an array where `value.length` returns `false` , or an object where `Object.keys(value).length` returns `false` |\n| String Methods | `text.toUpperCase()` | Convert to uppercase |\n| | `text.toLowerCase()` | Convert to lowercase |\n| | `text.includes(\"foo\")` | Check if text contains search term |\n| | `text.extractEmail()` | Extract email from text |\n| Array Methods | `array.length` | Get array length |\n| | `array.join(\", \")` | Join array elements using a comma a separator |\n| | `array.filter(x => x <= 20)` | Filter items of array based on the filtering condition |\n| | `array.map(x => x.id)` | Transform items of an array |\n\nBrowse the tables below to find methods by the data type on which they act. Click a method name to read detailed documentation for it.\n\n## Array\n\n- [*`Array`*.**`append(elem1, elem2?, ..., elemN?)`**](array/#arrayappend)\n\n Adds new elements to the end of the array. Similar to `push()`, but returns the modified array. Consider using spread syntax instead (see examples).\n\n- [*`Array`*.**`average()`**](array/#arrayaverage)\n\n Returns the average of the numbers in the array. Throws an error if there are any non-numbers.\n\n- [*`Array`*.**`chunk(length)`**](array/#arraychunk)\n\n Splits the array into an array of sub-arrays, each with the given length\n\n- [*`Array`*.**`compact()`**](array/#arraycompact)\n\n Removes any empty values from the array. `null`, `\"\"` and `undefined` count as empty.\n\n- [*`Array`*.**`concat(array2, array3?, ... arrayN?)`**](array/#arrayconcat)\n\n Joins one or more arrays onto the end of the base array\n\n- [*`Array`*.**`difference(otherArray)`**](array/#arraydifference)\n\n Compares two arrays. Returns all elements in the base array that aren't present in `otherArray`.\n\n- [*`Array`*.**`filter(function(element, index?, array?), thisValue?)`**](array/#arrayfilter)\n\n Returns an array with only the elements satisfying a condition. The condition is a function that returns `true` or `false`.\n\n- [*`Array`*.**`find(function(element, index?, array?), thisValue?)`**](array/#arrayfind)\n\n Returns the first element from the array that satisfies the provided condition. The condition is a function that returns `true` or `false`. Returns `undefined` if no matches are found.\n\nIf you need all matching elements, use `filter()`.\n\n- [*`Array`*.**`first()`**](array/#arrayfirst)\n\n Returns the first element of the array\n\n- [*`Array`*.**`includes(element, start?)`**](array/#arrayincludes)\n\n Returns `true` if the array contains the specified element\n\n- [*`Array`*.**`indexOf(element, start?)`**](array/#arrayindexof)\n\n Returns the position of the first matching element in the array, or -1 if the element isn’t found. Positions start at 0.\n\n- [*`Array`*.**`intersection(otherArray)`**](array/#arrayintersection)\n\n Compares two arrays. Returns all elements in the base array that are also present in the other array.\n\n- [*`Array`*.**`isEmpty()`**](array/#arrayisempty)\n\n Returns `true` if the array has no elements or is `null`\n\n- [*`Array`*.**`isNotEmpty()`**](array/#arrayisnotempty)\n\n Returns `true` if the array has at least one element\n\n- [*`Array`*.**`join(separator?)`**](array/#arrayjoin)\n\n Merges all elements of the array into a single string, with an optional separator between each element.\n\nThe opposite of `split()`.\n\n- [*`Array`*.**`last()`**](array/#arraylast)\n\n Returns the last element of the array\n\n- [*`Array`*.**`length`**](array/#arraylength)\n\n The number of elements in the array\n\n- [*`Array`*.**`map(function(element, index?, array?), thisValue?)`**](array/#arraymap)\n\n Creates a new array by applying a function to each element of the original array\n\n- [*`Array`*.**`max()`**](array/#arraymax)\n\n Returns the largest number in the array. Throws an error if there are any non-numbers.\n\n- [*`Array`*.**`min()`**](array/#arraymin)\n\n Returns the smallest number in the array. Throws an error if there are any non-numbers.\n\n- [*`Array`*.**`pluck(fieldName1?, fieldName2?, …)`**](array/#arraypluck)\n\n Returns an array containing the values of the given field(s) in each Object of the array. Ignores any array elements that aren’t Objects or don’t have a key matching the field name(s) provided.\n\n- [*`Array`*.**`randomItem()`**](array/#arrayrandomitem)\n\n Returns a randomly-chosen element from the array\n\n- [*`Array`*.**`reduce(function(prevResult, currentElem, currentIndex?, array?), initResult)`**](array/#arrayreduce)\n\n Reduces an array to a single value by applying a function to each element. The function combines the current element with the result of reducing the previous elements, producing a new result.\n\n- [*`Array`*.**`removeDuplicates(keys?)`**](array/#arrayremoveduplicates)\n\n Removes any re-occurring elements from the array\n\n- [*`Array`*.**`renameKeys(from, to)`**](array/#arrayrenamekeys)\n\n Changes all matching keys (field names) of any Objects in the array. Rename more than one key by adding extra arguments, i.e. `from1, to1, from2, to2, ...`.\n\n- [*`Array`*.**`reverse()`**](array/#arrayreverse)\n\n Reverses the order of the elements in the array\n\n- [*`Array`*.**`slice(start, end)`**](array/#arrayslice)\n\n Returns a portion of the array, from the `start` index up to (but not including) the `end` index. Indexes start at 0.\n\n- [*`Array`*.**`smartJoin(keyField, nameField)`**](array/#arraysmartjoin)\n\n Creates a single Object from an array of Objects. Each Object in the array provides one field for the returned Object. Each Object in the array must contain a field with the key name and a field with the value.\n\n- [*`Array`*.**`sort(compareFunction(a, b)?)`**](array/#arraysort)\n\n Reorders the elements of the array. For sorting strings alphabetically, no parameter is required. For sorting numbers or Objects, see examples.\n\n- [*`Array`*.**`sum()`**](array/#arraysum)\n\n Returns the total of all the numbers in the array. Throws an error if there are any non-numbers.\n\n- [*`Array`*.**`toJsonString()`**](array/#arraytojsonstring)\n\n Converts the array to a JSON string. The same as JavaScript’s `JSON.stringify()`.\n\n- [*`Array`*.**`toSpliced(start, deleteCount, elem1, ....., elemN)`**](array/#arraytospliced)\n\n Adds and/or removes array elements at a given position.\n\nSee also `slice()` and `append()`.\n\n- [*`Array`*.**`toString()`**](array/#arraytostring)\n\n Converts the array to a string, with values separated by commas. To use a different separator, use `join()` instead.\n\n- [*`Array`*.**`union(otherArray)`**](array/#arrayunion)\n\n Concatenates two arrays and then removes any duplicates\n\n- [*`Array`*.**`unique()`**](array/#arrayunique)\n\n Removes any duplicate elements from the array\n\n## BinaryFile\n\n- [`binaryFile`.**`directory`**](binaryfile/#binaryfiledirectory)\n\n The path to the directory that the file is stored in. Useful for distinguishing between files with the same name in different directories. Not set if n8n is configured to store files in its database.\n\n- [`binaryFile`.**`fileExtension`**](binaryfile/#binaryfilefileextension)\n\n The suffix attached to the filename (e.g. `txt`)\n\n- [`binaryFile`.**`fileName`**](binaryfile/#binaryfilefilename)\n\n The name of the file, including extension\n\n- [`binaryFile`.**`fileSize`**](binaryfile/#binaryfilefilesize)\n\n A string representing the size of the file\n\n- [`binaryFile`.**`fileType`**](binaryfile/#binaryfilefiletype)\n\n A string representing the type of the file, e.g. `image`. Corresponds to the first part of the MIME type.\n\n- [`binaryFile`.**`id`**](binaryfile/#binaryfileid)\n\n The unique ID of the file. Used to identify the file when it is stored on disk or in a storage service such as S3.\n\n- [`binaryFile`.**`mimeType`**](binaryfile/#binaryfilemimetype)\n\n A string representing the format of the file’s contents, e.g. `image/jpeg`\n\n## Boolean\n\n- [*`Boolean`*.**`isEmpty()`**](boolean/#booleanisempty)\n\n Returns `false` for all booleans. Returns `true` for `null`.\n\n- [*`Boolean`*.**`toNumber()`**](boolean/#booleantonumber)\n\n Converts `true` to 1 and `false` to 0\n\n- [*`Boolean`*.**`toString()`**](boolean/#booleantostring)\n\n Converts `true` to the string ‘true’ and `false` to the string ‘false’\n\n## CustomData\n\n- [`$execution.customData`.**`get(key)`**](customdata/#executioncustomdataget)\n\n Returns the custom execution data stored under the given key. [More info](/workflows/executions/custom-executions-data/)\n\n- [`$execution.customData`.**`getAll()`**](customdata/#executioncustomdatagetall)\n\n Returns all the key-value pairs of custom data that have been set in the current execution. [More info](/workflows/executions/custom-executions-data/)\n\n- [`$execution.customData`.**`set(key, value)`**](customdata/#executioncustomdataset)\n\n Stores custom execution data under the key specified. Use this to easily filter executions by this data. [More info](/workflows/executions/custom-executions-data/)\n\n- [`$execution.customData`.**`setAll(obj)`**](customdata/#executioncustomdatasetall)\n\n Sets multiple key-value pairs of custom data for the execution. Use this to easily filter executions by this data. [More info](/workflows/executions/custom-executions-data/)\n\n## Date\n\n- [*`Date`*.**`toDateTime()`**](date/#datetodatetime)\n\n Converts a JavaScript Date to a Luxon DateTime. The DateTime contains the same information, but is easier to manipulate.\n\n## DateTime\n\n- [*`DateTime`*.**`day`**](datetime/#datetimeday)\n\n The day of the month (1-31)\n\n- [*`DateTime`*.**`diffTo(otherDateTime, unit)`**](datetime/#datetimediffto)\n\n Returns the difference between two DateTimes, in the given unit(s)\n\n- [*`DateTime`*.**`diffToNow(unit)`**](datetime/#datetimedifftonow)\n\n Returns the difference between the current moment and the DateTime, in the given unit(s). For a textual representation, use `toRelative()` instead.\n\n- [*`DateTime`*.**`endOf(unit, opts)`**](datetime/#datetimeendof)\n\n Rounds the DateTime up to the end of one of its units, e.g. the end of the month\n\n- [*`DateTime`*.**`equals(other)`**](datetime/#datetimeequals)\n\n Returns `true` if the two DateTimes represent exactly the same moment and are in the same time zone. For a less strict comparison, use `hasSame()`.\n\n- [*`DateTime`*.**`extract(unit?)`**](datetime/#datetimeextract)\n\n Extracts a part of the date or time, e.g. the month, as a number. To extract textual names instead, see `format()`.\n\n- [*`DateTime`*.**`format(fmt)`**](datetime/#datetimeformat)\n\n Converts the DateTime to a string, using the format specified. [Formatting guide](https://moment.github.io/luxon/#/formatting?id=table-of-tokens). For common formats, `toLocaleString()` may be easier.\n\n- [*`DateTime`*.**`hasSame(otherDateTime, unit)`**](datetime/#datetimehassame)\n\n Returns `true` if the two DateTimes are the same, down to the unit specified. Time zones are ignored (only local times are compared), so use `toUTC()` first if needed.\n\n- [*`DateTime`*.**`hour`**](datetime/#datetimehour)\n\n The hour of the day (0-23)\n\n- [*`DateTime`*.**`isBetween(date1, date2)`**](datetime/#datetimeisbetween)\n\n Returns `true` if the DateTime lies between the two moments specified\n\n- [*`DateTime`*.**`isInDST`**](datetime/#datetimeisindst)\n\n Whether the DateTime is in daylight saving time\n\n- [*`DateTime`*.**`locale`**](datetime/#datetimelocale)\n\n The locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime.\n\n- [*`DateTime`*.**`millisecond`**](datetime/#datetimemillisecond)\n\n The millisecond of the second (0-999)\n\n- [*`DateTime`*.**`minus(n, unit?)`**](datetime/#datetimeminus)\n\n Subtracts a given period of time from the DateTime\n\n- [*`DateTime`*.**`minute`**](datetime/#datetimeminute)\n\n The minute of the hour (0-59)\n\n- [*`DateTime`*.**`month`**](datetime/#datetimemonth)\n\n The month (1-12)\n\n- [*`DateTime`*.**`monthLong`**](datetime/#datetimemonthlong)\n\n The textual long month name, e.g. 'October'. Defaults to the system's locale if no locale has been specified.\n\n- [*`DateTime`*.**`monthShort`**](datetime/#datetimemonthshort)\n\n The textual abbreviated month name, e.g. 'Oct'. Defaults to the system's locale if no locale has been specified.\n\n- [*`DateTime`*.**`plus(n, unit?)`**](datetime/#datetimeplus)\n\n Adds a given period of time to the DateTime\n\n- [*`DateTime`*.**`quarter`**](datetime/#datetimequarter)\n\n The quarter of the year (1-4)\n\n- [*`DateTime`*.**`second`**](datetime/#datetimesecond)\n\n The second of the minute (0-59)\n\n- [*`DateTime`*.**`set(values)`**](datetime/#datetimeset)\n\n Assigns new values to specified units of the DateTime. To round a DateTime, see also `startOf()` and `endOf()`.\n\n- [*`DateTime`*.**`setLocale(locale)`**](datetime/#datetimesetlocale)\n\n Sets the locale, which determines the language and formatting for the DateTime. Useful when generating a textual representation of the DateTime, e.g. with `format()` or `toLocaleString()`.\n\n- [*`DateTime`*.**`setZone(zone, opts)`**](datetime/#datetimesetzone)\n\n Converts the DateTime to the given time zone. The DateTime still represents the same moment unless specified in the options. See also `toLocal()` and `toUTC()`.\n\n- [*`DateTime`*.**`startOf(unit, opts)`**](datetime/#datetimestartof)\n\n Rounds the DateTime down to the beginning of one of its units, e.g. the start of the month\n\n- [*`DateTime`*.**`toISO(opts)`**](datetime/#datetimetoiso)\n\n Returns an ISO 8601-compliant string representation of the DateTime\n\n- [*`DateTime`*.**`toLocal()`**](datetime/#datetimetolocal)\n\n Converts a DateTime to the workflow’s local time zone. The DateTime still represents the same moment unless specified in the parameters. The workflow’s time zone can be set in the workflow settings.\n\n- [*`DateTime`*.**`toLocaleString(formatOpts)`**](datetime/#datetimetolocalestring)\n\n Returns a localised string representing the DateTime, i.e. in the language and format corresponding to its locale. Defaults to the system's locale if none specified.\n\n- [*`DateTime`*.**`toMillis()`**](datetime/#datetimetomillis)\n\n Returns a Unix timestamp in milliseconds (the number elapsed since 1st Jan 1970)\n\n- [*`DateTime`*.**`toRelative(options)`**](datetime/#datetimetorelative)\n\n Returns a textual representation of the time relative to now, e.g. ‘in two days’. Rounds down by default.\n\n- [*`DateTime`*.**`toSeconds()`**](datetime/#datetimetoseconds)\n\n Returns a Unix timestamp in seconds (the number elapsed since 1st Jan 1970)\n\n- [*`DateTime`*.**`toString()`**](datetime/#datetimetostring)\n\n Returns a string representation of the DateTime. Similar to `toISO()`. For more formatting options, see `format()` or `toLocaleString()`.\n\n- [*`DateTime`*.**`toUTC(offset, opts)`**](datetime/#datetimetoutc)\n\n Converts a DateTime to the UTC time zone. The DateTime still represents the same moment unless specified in the parameters. Use `setZone()` to convert to other zones.\n\n- [*`DateTime`*.**`weekday`**](datetime/#datetimeweekday)\n\n The day of the week. 1 is Monday and 7 is Sunday.\n\n- [*`DateTime`*.**`weekdayLong`**](datetime/#datetimeweekdaylong)\n\n The textual long weekday name, e.g. 'Wednesday'. Defaults to the system's locale if no locale has been specified.\n\n- [*`DateTime`*.**`weekdayShort`**](datetime/#datetimeweekdayshort)\n\n The textual abbreviated weekday name, e.g. 'Wed'. Defaults to the system's locale if no locale has been specified.\n\n- [*`DateTime`*.**`weekNumber`**](datetime/#datetimeweeknumber)\n\n The week number of the year (1-52ish)\n\n- [*`DateTime`*.**`year`**](datetime/#datetimeyear)\n\n The year\n\n- [*`DateTime`*.**`zone`**](datetime/#datetimezone)\n\n The time zone associated with the DateTime\n\n## ExecData\n\n- [`$exec`.**`customData`**](execdata/#execcustomdata)\n\n Set and get custom execution data (e.g. to filter executions by). You can also do this with the ‘Execution Data’ node. [More info](/workflows/executions/custom-executions-data/)\n\n- [`$exec`.**`id`**](execdata/#execid)\n\n The ID of the current workflow execution\n\n- [`$exec`.**`mode`**](execdata/#execmode)\n\n Can be one of 3 values: either `test` (meaning the execution was triggered by clicking a button in n8n) or `production` (meaning the execution was triggered automatically). When running workflow tests, `evaluation` is used.\n\n- [`$exec`.**`resumeFormUrl`**](execdata/#execresumeformurl)\n\n The URL to access a form generated by the [’Wait’ node](/integrations/builtin/core-nodes/n8n-nodes-base.wait/).\n\n- [`$exec`.**`resumeUrl`**](execdata/#execresumeurl)\n\n The webhook URL to call to resume a workflow waiting at a [’Wait’ node](/integrations/builtin/core-nodes/n8n-nodes-base.wait/).\n\n## HTTPResponse\n\n- [`$response`.**`body`**](httpresponse/#responsebody)\n\n The body of the response object from the last HTTP call. Only available in the ‘HTTP Request’ node\n\n- [`$response`.**`headers`**](httpresponse/#responseheaders)\n\n The headers returned by the last HTTP call. Only available in the ‘HTTP Request’ node.\n\n- [`$response`.**`statusCode`**](httpresponse/#responsestatuscode)\n\n The HTTP status code returned by the last HTTP call. Only available in the ‘HTTP Request’ node.\n\n- [`$response`.**`statusMessage`**](httpresponse/#responsestatusmessage)\n\n An optional message regarding the request status. Only available in the ‘HTTP Request’ node.\n\n## Item\n\n- [`$item`.**`binary`**](item/#itembinary)\n\n Returns any binary data the item contains\n\n- [`$item`.**`json`**](item/#itemjson)\n\n Returns the JSON data the item contains. [More info](/data/data-structure/)\n\n## NodeInputData\n\n- [`$input`.**`all(branchIndex?, runIndex?)`**](nodeinputdata/#inputall)\n\n Returns an array of the current node’s input items\n\n- [`$input`.**`first(branchIndex?, runIndex?)`**](nodeinputdata/#inputfirst)\n\n Returns the current node’s first input item\n\n- [`$input`.**`item`**](nodeinputdata/#inputitem)\n\n Returns the input item currently being processed\n\n- [`$input`.**`last(branchIndex?, runIndex?)`**](nodeinputdata/#inputlast)\n\n Returns the current node’s last input item\n\n- [`$input`.**`params`**](nodeinputdata/#inputparams)\n\n The configuration settings of the current node. These are the parameters you fill out within the node when configuring it (e.g. its operation).\n\n## NodeOutputData\n\n- [`$()`.**`all(branchIndex?, runIndex?)`**](nodeoutputdata/#all)\n\n Returns an array of the node’s output items\n\n- [`$()`.**`first(branchIndex?, runIndex?)`**](nodeoutputdata/#first)\n\n Returns the first item output by the node\n\n- [`$()`.**`isExecuted`**](nodeoutputdata/#isexecuted)\n\n Is `true` if the node has executed, `false` otherwise\n\n- [`$()`.**`item`**](nodeoutputdata/#item)\n\n Returns the matching item, i.e. the one used to produce the current item in the current node. [More info](/data/data-mapping/data-item-linking/)\n\n- [`$()`.**`itemMatching(currentItemIndex?)`**](nodeoutputdata/#itemmatching)\n\n Returns the matching item, i.e. the one used to produce the item in the current node at the specified index. [More info](/data/data-mapping/data-item-linking/)\n\n- [`$()`.**`last(branchIndex?, runIndex?)`**](nodeoutputdata/#last)\n\n Returns the last item output by the node\n\n- [`$()`.**`params`**](nodeoutputdata/#params)\n\n The configuration settings of the given node. These are the parameters you fill out within the node’s UI (e.g. its operation).\n\n## Number\n\n- [*`Number`*.**`abs()`**](number/#numberabs)\n\n Returns the number’s absolute value, i.e. removes any minus sign\n\n- [*`Number`*.**`ceil()`**](number/#numberceil)\n\n Rounds the number up to the next whole number\n\n- [*`Number`*.**`floor()`**](number/#numberfloor)\n\n Rounds the number down to the nearest whole number\n\n- [*`Number`*.**`format(locale?, options?)`**](number/#numberformat)\n\n Returns a formatted string representing the number. Useful for formatting for a specific language or currency. The same as [`Intl.NumberFormat()`](%E2%80%9Dhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat%E2%80%9D).\n\n- [*`Number`*.**`isEmpty()`**](number/#numberisempty)\n\n Returns `false` for all numbers. Returns `true` for `null`.\n\n- [*`Number`*.**`isEven()`**](number/#numberiseven)\n\n Returns `true` if the number is even. Throws an error if the number isn’t a whole number.\n\n- [*`Number`*.**`isInteger()`**](number/#numberisinteger)\n\n Returns `true` if the number is a whole number\n\n- [*`Number`*.**`isOdd()`**](number/#numberisodd)\n\n Returns `true` if the number is odd. Throws an error if the number isn’t a whole number.\n\n- [*`Number`*.**`round(decimalPlaces?)`**](number/#numberround)\n\n Returns the number rounded to the nearest whole number (or specified number of decimal places)\n\n- [*`Number`*.**`toBoolean()`**](number/#numbertoboolean)\n\n Converts the number to a boolean value. `0` becomes `false`; everything else becomes `true`.\n\n- [*`Number`*.**`toDateTime(format?)`**](number/#numbertodatetime)\n\n Converts a numerical timestamp into a DateTime. The format of the timestamp must be specified if it’s not in milliseconds. Uses the time zone in n8n (or in the workflow’s settings).\n\n- [*`Number`*.**`toLocaleString(locales?, options?)`**](number/#numbertolocalestring)\n\n Returns a localised string representing the number, i.e. in the language and format corresponding to its locale. Defaults to the system's locale if none specified.\n\n- [*`Number`*.**`toString(radix?)`**](number/#numbertostring)\n\n Converts the number to a simple textual representation. For more formatting options, see `toLocaleString()`.\n\n## Object\n\n- [*`Object`*.**`compact()`**](object/#objectcompact)\n\n Removes all fields that have empty values, i.e. are `null` or `\"\"`\n\n- [*`Object`*.**`hasField(name)`**](object/#objecthasfield)\n\n Returns `true` if there is a field called `name`. Only checks top-level keys. Comparison is case-sensitive.\n\n- [*`Object`*.**`isEmpty()`**](object/#objectisempty)\n\n Returns `true` if the Object has no keys (fields) set or is `null`\n\n- [*`Object`*.**`isNotEmpty()`**](object/#objectisnotempty)\n\n Returns `true` if the Object has at least one key (field) set\n\n- [*`Object`*.**`keepFieldsContaining(value)`**](object/#objectkeepfieldscontaining)\n\n Removes any fields whose values don’t at least partly match the given `value`. Comparison is case-sensitive. Fields that aren’t strings will always be removed.\n\n- [*`Object`*.**`keys()`**](object/#objectkeys)\n\n Returns an array with all the field names (keys) the object contains. The same as JavaScript’s `Object.keys(obj)`.\n\n- [*`Object`*.**`merge(otherObject)`**](object/#objectmerge)\n\n Merges the two Objects into a single one. If a key (field name) exists in both Objects, the value from the first (base) Object is used.\n\n- [*`Object`*.**`removeField(key)`**](object/#objectremovefield)\n\n Removes a field from the Object. The same as JavaScript’s `delete`.\n\n- [*`Object`*.**`removeFieldsContaining(value)`**](object/#objectremovefieldscontaining)\n\n Removes keys (fields) whose values at least partly match the given `value`. Comparison is case-sensitive. Fields that aren’t strings are always kept.\n\n- [*`Object`*.**`toJsonString()`**](object/#objecttojsonstring)\n\n Converts the Object to a JSON string. Similar to JavaScript’s `JSON.stringify()`.\n\n- [*`Object`*.**`urlEncode()`**](object/#objecturlencode)\n\n Generates a URL parameter string from the Object’s keys and values. Only top-level keys are supported.\n\n- [*`Object`*.**`values()`**](object/#objectvalues)\n\n Returns an array with all the values of the fields the Object contains. The same as JavaScript’s `Object.values(obj)`.\n\n## PrevNodeData\n\n- [**`name`**](prevnodedata/#name)\n\n The name of the node that the current input came from.\n\nAlways uses the current node’s first input connector if there is more than one (e.g. in the ‘Merge’ node).\n\n- [**`outputIndex`**](prevnodedata/#outputindex)\n\n The index of the output connector that the current input came from. Use this when the previous node had multiple outputs (such as an ‘If’ or ‘Switch’ node).\n\nAlways uses the current node’s first input connector if there is more than one (e.g. in the ‘Merge’ node).\n\n- [**`runIndex`**](prevnodedata/#runindex)\n\n The run of the previous node that generated the current input.\n\nAlways uses the current node’s first input connector if there is more than one (e.g. in the ‘Merge’ node).\n\n## Root\n\n- [**`$(nodeName)`**](root/)\n\n Returns the data of the specified node\n\n- [**`$binary`**](root/#binary)\n\n Returns any binary input data to the current node, for the current item. Shorthand for `$input.item.binary`.\n\n- [**`$execution`**](root/#execution)\n\n Retrieve or set metadata for the current execution\n\n- [**`$fromAI(key, description?, type?, defaultValue?)`**](root/#fromai)\n\n Use when a large language model should provide the value of a node parameter. Consider providing a description for better results.\n\n- [**`$if(condition, valueIfTrue, valueIfFalse)`**](root/#if)\n\n Returns one of two values depending on the `condition`. Similar to the `?` operator in JavaScript.\n\n- [**`$ifEmpty(value, valueIfEmpty)`**](root/#ifempty)\n\n Returns the first parameter if it isn’t empty, otherwise returns the second parameter. The following count as empty: `””`, `[]`, `{}`, `null`, `undefined`\n\n- [**`$input`**](root/#input)\n\n The input data of the current node\n\n- [**`$itemIndex`**](root/#itemindex)\n\n The position of the item currently being processed in the list of input items\n\n- [**`$jmespath(obj, expression)`**](root/#jmespath)\n\n Extracts data from an object (or array of objects) using a [JMESPath](%E2%80%9D/code/cookbook/jmespath/%E2%80%9D) expression. Useful for querying complex, nested objects. Returns `undefined` if the expression is invalid.\n\n- [**`$json`**](root/#json)\n\n Returns the JSON input data to the current node, for the current item. Shorthand for `$input.item.json`. [More info](/data/data-structure/)\n\n- [**`$max(num1, num2, …, numN)`**](root/#max)\n\n Returns the highest of the given numbers\n\n- [**`$min(num1, num2, …, numN)`**](root/#min)\n\n Returns the lowest of the given numbers\n\n- [**`$nodeVersion`**](root/#nodeversion)\n\n The version of the current node (as displayed at the bottom of the nodes’s settings pane)\n\n- [**`$now`**](root/#now)\n\n A DateTime representing the current moment.\n\nUses the workflow’s time zone (which can be changed in the workflow settings).\n\n- [**`$pageCount`**](root/#pagecount)\n\n The number of results pages the node has fetched. Only available in the ‘HTTP Request’ node.\n\n- [**`$parameter`**](root/#parameter)\n\n The configuration settings of the current node. These are the parameters you fill out within the node’s UI (e.g. its operation).\n\n- [**`$prevNode`**](root/#prevnode)\n\n Information about the node that the current input came from.\n\nWhen in a ‘Merge’ node, always uses the first input connector.\n\n- [**`$request`**](root/#request)\n\n The request object sent during the last run of the node. Only available in the ‘HTTP Request’ node.\n\n- [**`$response`**](root/#response)\n\n The response returned by the last HTTP call. Only available in the ‘HTTP Request’ node.\n\n- [**`$runIndex`**](root/#runindex)\n\n The index of the current run of the current node execution. Starts at 0.\n\n- [**`$secrets`**](root/#secrets)\n\n The secrets from an [external secrets vault](/external-secrets/), if configured. Secret values are never displayed to the user. Only available in credential fields.\n\n- [**`$today`**](root/#today)\n\n A DateTime representing midnight at the start of the current day.\n\nUses the instance’s time zone (unless overridden in the workflow’s settings).\n\n- [**`$vars`**](root/#vars)\n\n The [variables](/code/variables/) available to the workflow\n\n- [**`$workflow`**](root/#workflow)\n\n Information about the current workflow\n\n## String\n\n- [*`String`*.**`base64Encode()`**](string/#stringbase64decode)\n\n Converts plain text to a base64-encoded string\n\n- [*`String`*.**`base64Encode()`**](string/#stringbase64encode)\n\n Converts a base64-encoded string to plain text\n\n- [*`String`*.**`concat(string1, string2?, ..., stringN?)`**](string/#stringconcat)\n\n Joins one or more strings onto the end of the base string. Alternatively, use the `+` operator (see examples).\n\n- [*`String`*.**`extractDomain()`**](string/#stringextractdomain)\n\n If the string is an email address or URL, returns its domain (or `undefined` if nothing found).\n\nIf the string also contains other content, try using `extractEmail()` or `extractUrl()` first.\n\n- [*`String`*.**`extractEmail()`**](string/#stringextractemail)\n\n Extracts the first email found in the string. Returns `undefined` if none is found.\n\n- [*`String`*.**`extractUrl()`**](string/#stringextracturl)\n\n Extracts the first URL found in the string. Returns `undefined` if none is found. Only recognizes full URLs, e.g. those starting with `http`.\n\n- [*`String`*.**`extractUrlPath()`**](string/#stringextracturlpath)\n\n Returns the part of a URL after the domain, or `undefined` if no URL found.\n\nIf the string also contains other content, try using `extractUrl()` first.\n\n- [*`String`*.**`hash(algo?)`**](string/#stringhash)\n\n Returns the string hashed with the given algorithm. Defaults to md5 if not specified.\n\n- [*`String`*.**`includes(searchString, start?)`**](string/#stringincludes)\n\n Returns `true` if the string contains the `searchString`. Case-sensitive.\n\n- [*`String`*.**`indexOf(searchString, start?)`**](string/#stringindexof)\n\n Returns the index (position) of the first occurrence of `searchString` within the base string, or -1 if not found. Case-sensitive.\n\n- [*`String`*.**`isDomain()`**](string/#stringisdomain)\n\n Returns `true` if the string is a domain\n\n- [*`String`*.**`isEmail()`**](string/#stringisemail)\n\n Returns `true` if the string is an email\n\n- [*`String`*.**`isEmpty()`**](string/#stringisempty)\n\n Returns `true` if the string has no characters or is `null`\n\n- [*`String`*.**`isNotEmpty()`**](string/#stringisnotempty)\n\n Returns `true` if the string has at least one character\n\n- [*`String`*.**`isNumeric()`**](string/#stringisnumeric)\n\n Returns `true` if the string represents a number\n\n- [*`String`*.**`isUrl()`**](string/#stringisurl)\n\n Returns `true` if the string is a valid URL\n\n- [*`String`*.**`length`**](string/#stringlength)\n\n The number of characters in the string\n\n- [*`String`*.**`match(regexp)`**](string/#stringmatch)\n\n Matches the string against a [regular expression](%E2%80%9Dhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions%E2%80%9D). Returns an array containing the first match, or all matches if the `g` flag is set in the regular expression. Returns `null` if no matches are found.\n\nFor checking whether text is present, consider `includes()` instead.\n\n- [*`String`*.**`parseJson()`**](string/#stringparsejson)\n\n Returns the JavaScript Object or value represented by the string, or `undefined` if the string isn’t valid JSON. Single-quoted JSON is not supported.\n\n- [*`String`*.**`quote(mark?)`**](string/#stringquote)\n\n Wraps a string in quotation marks, and escapes any quotation marks already in the string. Useful when constructing JSON, SQL, etc.\n\n- [*`String`*.**`removeMarkdown()`**](string/#stringremovemarkdown)\n\n Removes any Markdown formatting from the string. Also removes HTML tags.\n\n- [*`String`*.**`removeTags()`**](string/#stringremovetags)\n\n Removes tags, such as HTML or XML, from the string\n\n- [*`String`*.**`replace(pattern, replacement)`**](string/#stringreplace)\n\n Returns a string with the first occurrence of `pattern` replaced by `replacement`.\n\nTo replace all occurrences, use `replaceAll()` instead.\n\n- [*`String`*.**`replaceAll(pattern, replacement)`**](string/#stringreplaceall)\n\n Returns a string with all occurrences of `pattern` replaced by `replacement`\n\n- [*`String`*.**`replaceSpecialChars()`**](string/#stringreplacespecialchars)\n\n Replaces special characters in the string with the closest ASCII character\n\n- [*`String`*.**`search(regexp)`**](string/#stringsearch)\n\n Returns the index (position) of the first occurrence of a pattern within the string, or -1 if not found. The pattern is specified using a [regular expression](%E2%80%9Dhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions%E2%80%9D). To use text instead, see `indexOf()`.\n\n- [*`String`*.**`slice(start, end?)`**](string/#stringslice)\n\n Extracts a fragment of the string at the given position. For more advanced extraction, see `match()`.\n\n- [*`String`*.**`split(separator?, limit?)`**](string/#stringsplit)\n\n Splits the string into an array of substrings. Each split is made at the `separator`, and the separator isn’t included in the output.\n\nThe opposite of using `join()` on an array.\n\n- [*`String`*.**`startsWith(searchString, start?)`**](string/#stringstartswith)\n\n Returns `true` if the string starts with `searchString`. Case-sensitive.\n\n- [*`String`*.**`substring(start, end?)`**](string/#stringsubstring)\n\n Extracts a fragment of the string at the given position. For more advanced extraction, see `match()`.\n\n- [*`String`*.**`toBoolean()`**](string/#stringtoboolean)\n\n Converts the string to a boolean value. `0`, `false` and `no` resolve to `false`, everything else to `true`. Case-insensitive.\n\n- [*`String`*.**`toDateTime()`**](string/#stringtodatetime)\n\n Converts the string to a DateTime. Useful for further transformation. Supported formats for the string are ISO 8601, HTTP, RFC2822, SQL and Unix timestamp in milliseconds.\n\nTo parse other formats, use [`DateTime.fromFormat()`](%E2%80%9Dhttps://moment.github.io/luxon/api-docs/index.html#datetimefromformat%E2%80%9D).\n\n- [*`String`*.**`toJsonString()`**](string/#stringtojsonstring)\n\n Prepares the string to be inserted into a JSON object. Escapes any quotes and special characters (e.g. new lines), and wraps the string in quotes.\n\nThe same as JavaScript’s `JSON.stringify()`.\n\n- [*`String`*.**`toLowerCase()`**](string/#stringtolowercase)\n\n Converts all letters in the string to lower case\n\n- [*`String`*.**`toNumber()`**](string/#stringtonumber)\n\n Converts a string representing a number to a number. Throws an error if the string doesn’t start with a valid number.\n\n- [*`String`*.**`toSentenceCase()`**](string/#stringtosentencecase)\n\n Changes the capitalization of the string to sentence case. The first letter of each sentence is capitalized and all others are lowercased.\n\n- [*`String`*.**`toSnakeCase()`**](string/#stringtosnakecase)\n\n Changes the format of the string to snake case. Spaces and dashes are replaced by `_`, symbols are removed and all letters are lowercased.\n\n- [*`String`*.**`toTitleCase()`**](string/#stringtotitlecase)\n\n Changes the capitalization of the string to title case. The first letter of each word is capitalized and the others left unchanged. Short prepositions and conjunctions aren’t capitalized (e.g. ‘a’, ‘the’).\n\n- [*`String`*.**`toUpperCase()`**](string/#stringtouppercase)\n\n Converts all letters in the string to upper case (capitals)\n\n- [*`String`*.**`trim()`**](string/#stringtrim)\n\n Removes whitespace from both ends of the string. Whitespace includes new lines, tabs, spaces, etc.\n\n- [*`String`*.**`urlDecode(allChars?)`**](string/#stringurldecode)\n\n Decodes a URL-encoded string. Replaces any character codes in the form of `%XX` with their corresponding characters.\n\n- [*`String`*.**`urlEncode(allChars?)`**](string/#stringurlencode)\n\n Encodes the string so that it can be used in a URL. Spaces and special characters are replaced with codes of the form `%XX`.\n\n## WorkflowData\n\n- [`$workflow`.**`active`**](workflowdata/#workflowactive)\n\n Whether the workflow is active\n\n- [`$workflow`.**`id`**](workflowdata/#workflowid)\n\n The workflow ID. Can also be found in the workflow’s URL.\n\n- [`$workflow`.**`name`**](workflowdata/#workflowname)\n\n The name of the workflow, as shown at the top of the editor\n",
10183
10183
  "excerpt": "# Expression Reference These are some commonly used expressions. A more exhaustive list appears below. | Category | Expression | Description...",
10184
10184
  "sections": [
10185
10185
  {
@@ -10216,7 +10216,7 @@
10216
10216
  "codeExamples": 0,
10217
10217
  "complexity": "intermediate",
10218
10218
  "readingTime": "22 min",
10219
- "contentLength": 45288,
10219
+ "contentLength": 45286,
10220
10220
  "relatedPages": []
10221
10221
  },
10222
10222
  "searchIndex": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-02-28T19:03:29.498Z",
2
+ "generatedAt": "2026-03-01T16:48:37.638Z",
3
3
  "version": "2.0.0",
4
4
  "statistics": {
5
5
  "totalEntries": 1786,
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-02-28T19:03:26.765Z",
2
+ "generatedAt": "2026-03-01T16:48:34.810Z",
3
3
  "sourceFileCount": 644,
4
4
  "scanDirectories": [
5
5
  "/home/runner/work/n8n-as-code/n8n-as-code/.n8n-cache/packages/nodes-base/dist/nodes",
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-02-28T19:03:28.200Z",
2
+ "generatedAt": "2026-03-01T16:48:36.269Z",
3
3
  "sourceData": {
4
4
  "nodesIndexFile": "/home/runner/work/n8n-as-code/n8n-as-code/packages/skills/src/assets/n8n-nodes-index.json",
5
5
  "docsMetadataFile": "/home/runner/work/n8n-as-code/n8n-as-code/packages/skills/src/assets/n8n-docs-cache/metadata.json",
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-02-28T19:03:31.315Z",
2
+ "generatedAt": "2026-03-01T16:48:38.992Z",
3
3
  "repository": "https://github.com/nusquama/n8nworkflows.xyz.git",
4
4
  "totalWorkflows": 7702,
5
5
  "workflows": [