> For the complete documentation index, see [llms.txt](https://docs.garden.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.garden.io/docs-edge/reference/template-strings/functions.md).

# Template Helper Functions

These are all the helper functions available in template strings, and some usage examples for each.

## base64Decode

Decodes the given base64-encoded string.

Usage: `base64Decode(string)`

Examples:

* `${base64Decode("bXkgdmFsdWU=")}` -> `"my value"`

## base64Encode

Encodes the given string as base64.

Usage: `base64Encode(string)`

Examples:

* `${base64Encode("my value")}` -> `"bXkgdmFsdWU="`

## camelCase

Converts the given string to a valid camelCase identifier, changing the casing and removing characters as necessary.

Usage: `camelCase(string)`

Examples:

* `${camelCase("Foo Bar")}` -> `"fooBar"`
* `${camelCase("--foo-bar--")}` -> `"fooBar"`
* `${camelCase("__FOO_BAR__")}` -> `"fooBar"`

## concat

Concatenates two arrays or strings.

Usage: `concat(arg1, arg2)`

Examples:

* `${concat(["first","two"], ["second","list"])}` -> `["first","two","second","list"]`
* `${concat([1,2,3], [4,5])}` -> `[1,2,3,4,5]`
* `${concat("string1", "string2")}` -> `"string1string2"`

## formatDateUtc

Formats the given date using the specified format. The input date is always converted to the UTC time zone before the modification. If no explicit timezone is specified on the input date, then the system default one will be used. The output date is always returned in the UTC time zone too.

Usage: `formatDateUtc(date, format)`

Examples:

* `${formatDateUtc("2021-01-01T00:00:00Z", "yyyy-MM-dd")}` -> `"2021-01-01"`
* `${formatDateUtc("2021-01-01T00:00:00+0200", "yyyy-MM-dd")}` -> `"2020-12-31"`
* `${formatDateUtc("2021-01-01T00:00:00Z", "yyyy-MM-dd HH:mm:ss")}` -> `"2021-01-01 00:00:00"`
* `${formatDateUtc("2021-01-01T00:00:00+0200", "yyyy-MM-dd HH:mm:ss")}` -> `"2020-12-31 22:00:00"`

## indent

Indents each line in the given string with the specified number of spaces.

Usage: `indent(string, spaces)`

Examples:

* `${indent("some: multiline\nyaml: document", 2)}` -> `" some: multiline\n yaml: document"`
* `${indent("My\nblock\nof\ntext", 4)}` -> `" My\n block\n of\n text"`

## isEmpty

Returns true if the given value is an empty string, object, array, null or undefined.

Usage: `isEmpty([value])`

Examples:

* `${isEmpty({})}` -> `true`
* `${isEmpty({"not":"empty"})}` -> `false`
* `${isEmpty([])}` -> `true`
* `${isEmpty([1,2,3])}` -> `false`
* `${isEmpty("")}` -> `true`
* `${isEmpty("not empty")}` -> `false`
* `${isEmpty(null)}` -> `true`

## join

Takes an array of strings (or other primitives) and concatenates them into a string, with the given separator

Usage: `join(input, separator)`

Examples:

* `${join(["some","list","of","strings"], " ")}` -> `"some list of strings"`
* `${join(["some","list","of","strings"], ".")}` -> `"some.list.of.strings"`

## jsonDecode

Decodes the given JSON-encoded string.

Usage: `jsonDecode(string)`

Examples:

* `${jsonDecode("{\"foo\": \"bar\"}")}` -> `{"foo":"bar"}`
* `${jsonDecode("\"JSON encoded string\"")}` -> `"JSON encoded string"`
* `${jsonDecode("[\"my\", \"json\", \"array\"]")}` -> `["my","json","array"]`

## jsonEncode

Encodes the given value as JSON.

Usage: `jsonEncode(value)`

Examples:

* `${jsonEncode(["some","array"])}` -> `"[\"some\",\"array\"]"`
* `${jsonEncode({"some":"object"})}` -> `"{\"some\":\"object\"}"`

## kebabCase

Converts the given string to a valid kebab-case identifier, changing to all lowercase and removing characters as necessary.

Usage: `kebabCase(string)`

Examples:

* `${kebabCase("Foo Bar")}` -> `"foo-bar"`
* `${kebabCase("fooBar")}` -> `"foo-bar"`
* `${kebabCase("__FOO_BAR__")}` -> `"foo-bar"`

## lower

Convert the given string to all lowercase.

Usage: `lower(string)`

Examples:

* `${lower("Some String")}` -> `"some string"`

## modifyDateUtc

Modifies the date by setting the specified amount of time units. The input date is always converted to the UTC time zone before the modification. If no explicit timezone is specified on the input date, then the system default one will be used. The output date is always returned in the UTC time zone too.

Usage: `modifyDateUtc(date, amount, unit)`

Examples:

* `${modifyDateUtc("2021-01-01T00:00:00.234Z", 345, "milliseconds")}` -> `"2021-01-01T00:00:00.345Z"`
* `${modifyDateUtc("2021-01-01T00:00:05Z", 30, "seconds")}` -> `"2021-01-01T00:00:30.000Z"`
* `${modifyDateUtc("2021-01-01T00:01:00Z", 15, "minutes")}` -> `"2021-01-01T00:15:00.000Z"`
* `${modifyDateUtc("2021-01-01T12:00:00Z", 11, "hours")}` -> `"2021-01-01T11:00:00.000Z"`
* `${modifyDateUtc("2021-01-01T10:00:00+0200", 11, "hours")}` -> `"2021-01-01T11:00:00.000Z"`
* `${modifyDateUtc("2021-01-31T00:00:00Z", 1, "days")}` -> `"2021-01-01T00:00:00.000Z"`
* `${modifyDateUtc("2021-03-01T00:00:00Z", 0, "months")}` -> `"2021-01-01T00:00:00.000Z"`
* `${modifyDateUtc("2021-01-01T00:00:00Z", 2024, "years")}` -> `"2024-01-01T00:00:00.000Z"`

## replace

Replaces all occurrences of a given substring in a string.

Usage: `replace(string, substring, replacement)`

Examples:

* `${replace("string_with_underscores", "_", "-")}` -> `"string-with-underscores"`
* `${replace("remove.these.dots", ".", "")}` -> `"removethesedots"`

## sha256

Creates a SHA256 hash of the provided string.

Usage: `sha256(string)`

Examples:

* `${sha256("Some String")}` -> `"7f0fd64653ba0bb1a579ced2b6bf375e916cc60662109ee0c0b24f0a750c3a6c"`

## shiftDateUtc

Shifts the date by the specified amount of time units. The input date is always converted to the UTC time zone before the modification. If no explicit timezone is specified on the input date, then the system default one will be used. The output date is always returned in the UTC time zone too.

Usage: `shiftDateUtc(date, amount, unit)`

Examples:

* `${shiftDateUtc("2021-01-01T00:00:00Z", 1, "seconds")}` -> `"2021-01-01T00:00:01.000Z"`
* `${shiftDateUtc("2021-01-01T00:00:00Z", -1, "seconds")}` -> `"2020-12-31T23:59:59.000Z"`
* `${shiftDateUtc("2021-01-01T00:00:00Z", 1, "minutes")}` -> `"2021-01-01T00:01:00.000Z"`
* `${shiftDateUtc("2021-01-01T00:00:00Z", -1, "minutes")}` -> `"2020-12-31T23:59:00.000Z"`
* `${shiftDateUtc("2021-01-01T00:00:00Z", 1, "hours")}` -> `"2021-01-01T01:00:00.000Z"`
* `${shiftDateUtc("2021-01-01T00:00:00Z", -1, "hours")}` -> `"2020-12-31T23:00:00.000Z"`
* `${shiftDateUtc("2021-01-01T10:00:00+0200", 1, "hours")}` -> `"2021-01-01T09:00:00.000Z"`
* `${shiftDateUtc("2021-01-01T00:00:00Z", 1, "days")}` -> `"2021-01-02T00:00:00.000Z"`
* `${shiftDateUtc("2021-01-01T00:00:00Z", -1, "days")}` -> `"2020-12-31T00:00:00.000Z"`
* `${shiftDateUtc("2021-01-01T00:00:00Z", 1, "months")}` -> `"2021-02-01T00:00:00.000Z"`
* `${shiftDateUtc("2021-01-01T00:00:00Z", -1, "months")}` -> `"2020-12-01T00:00:00.000Z"`
* `${shiftDateUtc("2021-01-01T00:00:00Z", 1, "years")}` -> `"2022-01-01T00:00:00.000Z"`
* `${shiftDateUtc("2021-01-01T00:00:00Z", -1, "years")}` -> `"2020-01-01T00:00:00.000Z"`

## slice

Slices a string or array at the specified start/end offsets. Note that you can use a negative number for the end offset to count backwards from the end.

Usage: `slice(input, start, [end])`

Examples:

* `${slice("ThisIsALongStringThatINeedAPartOf", 11, -7)}` -> `"StringThatINeed"`
* `${slice(".foo", 1)}` -> `"foo"`

## split

Splits the given string by a substring (e.g. a comma, colon etc.).

Usage: `split(string, separator)`

Examples:

* `${split("a,b,c", ",")}` -> `["a","b","c"]`
* `${split("1:2:3:4", ":")}` -> `["1","2","3","4"]`

## string

Converts the given value to a string.

Usage: `string(value)`

Examples:

* `${string(1)}` -> `"1"`
* `${string(true)}` -> `"true"`

## trim

Trims whitespace (or other specified characters) off the ends of the given string.

Usage: `trim(string, [characters])`

Examples:

* `${trim(" some string with surrounding whitespace ")}` -> `"some string with surrounding whitespace"`

## upper

Converts the given string to all uppercase.

Usage: `upper(string)`

Examples:

* `${upper("Some String")}` -> `"SOME STRING"`

## uuidv4

Generates a random v4 UUID.

Usage: `uuidv4()`

Examples:

* `${uuidv4()}` -> `"1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed"`

## yamlDecode

Decodes the given YAML-encoded string. Note that for multi-document YAML strings, you need to set the 2nd argument to true (see below).

Usage: `yamlDecode(string, [multiDocument])`

Examples:

* `${yamlDecode("a: 1\nb: 2\n")}` -> `{"a":1,"b":2}`
* `${yamlDecode("a: 1\nb: 2\n---\na: 3\nb: 4\n", true)}` -> `[{"a":1,"b":2},{"a":3,"b":4}]`

## yamlEncode

Encodes the given value as YAML.

Usage: `yamlEncode(value, [multiDocument])`

Examples:

* `${yamlEncode({"my":"simple document"})}` -> `"my: simple document\n"`
* `${yamlEncode([{"a":1,"b":2},{"a":3,"b":4}], true)}` -> `"---a: 1\nb: 2\n---a: 3\nb: 4\n"`


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.garden.io/docs-edge/reference/template-strings/functions.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
