UNPKG

dtl-js

Version:

Data Transformation Language - JSON templates and data transformation

123 lines (90 loc) 4.81 kB
# DTL Quick Start ## What DTL is for DTL, or *Data Transformation Language*, is built for transforming and manipulating data structures. At its most basic level, **DTL can act as a templating tool for JSON**, enabling straightforward data reformatting and restructuring. However, **DTL's capabilities extend far beyond simple templating**. DTL is ideal for complex tasks such as data **extraction, conversion, and preparation for analysis or reporting**. Its simple syntax and robust functions facilitate the clear and concise expression of complex data transformations, making DTL an **extremely useful tool** for a wide range of data processing needs. ## Basic Structure In DTL, transforms are generally defined within a **JSON object**, which forms the transform library. Each key in this JSON object is a distinct transform, functioning like a template or function for how input data should be outputted. The `out` key is special as it's the default transform used by `DTL.apply()`, akin to the `main` function in other languages. In most cases, the value of `out` will be an object that mirrors your desired output structure, guiding the transformation of input data to this format. This library can have multiple transforms, each capable of referencing and calling one another. When a transform is executed through `DTL.apply()`, the provided data is represented as `$.` within the transform. ## Syntax Essentials ### 1. Happy Tags Every **DTL expression must be enclosed in happy tags**: `(: :)`. Happy tags tell DTL to do something. Anything not in Happy tags is passed through untouched. Happy tags are called that because they resemble happy emoji. ### 2. Accessing data Reference data using **dot notation**, with the root represented as `$.` For nested data access, use dot notation, e.g., `$user.address.street` Data can be referenced with or without a leading `.`, in other words, `$.user` and `$user` are equivalent. ### 3. No Commas In DTL expressions, **commas are treated like whitespace** and are not necessary. ### 4. Helper Functions and Transform Calls Use **built-in helper functions** for complex operations, e.g., `math.round($number)`. To **call another transform** in the library, use `($input_data -> transform_name)`. In this example, `$input_data` would be sent to `transform_name` and the result would be the new data. **Operations look like this**: `$data op $otherdata`, e.g., `$number1 + $number2`. ### 5. Parentheses for Order Use **parentheses** to control the order that things should be done, e.g., `($number1 + $number2) * $number3`. DTL understands mathematical order of operations, but parenthesis make it clearer. ### 6. Conditional Syntax For conditionals, use `?(: $condition $truevalue $falsevalue)`. ### 7. Static and Dynamic Values A mix of **static (literal values) and dynamic (DTL expressions)** is common in transforms. Only dynamic expressions use happy tags. ### 8. Iteration You can loop or iterate over lists of data. In all helpers that iterate, like `map` or `grep`, use **`$item`, `$index`, and `$all`** for referencing. `$item` is the current item. `$index` is the index of the current item and `$all` is the entire list or object. ### 9. Scope Transforms only have access to what was given to them (from `DTL.apply()` or another transform in the library) and have no way to access information other than that. Within a transform, `$.` refers to the input data of that transform. ### 10. The concept of empty In DTL, the concept of **empty** is key. Empty in DTL means the data has no meaningful value, e.g. undefined, null, an empty string, array, or object. The `empty()` function returns true if a value is 'empty' Complementing this, the `fne()` (**First Non-Empty**) function scans a list of values and returns the first one that is not considered empty, streamlining the selection of valid data from multiple sources. It looks like this: `fne($first_place_to_look $second_place_to_look defaultvalue)` ## Example in JSON ```json { "out": { "name": "(: fne( $display_name $first_name 'unknown user' ) :)", "calculatedValue": "(: $value1 + $value2 :)", "staticValue": "This is a static string", "address": "(: $. -> formatAddress :)" }, "formatAddress": { "street": "(: $address1 :)", "unit": "(: $address2 :)", "city": "(: $addr_city :)", "state": "(: $addr_state :)", "postal": "(: $addr_zip :)" } } ``` In this JSON example, `name` and `calculatedValue` are defined with DTL expressions enclosed in happy tags, while `staticValue` is a static value. The primary `out` transform delegates to the `formatAddress` transform for structuring the `address` field, demonstrating how transforms can be used to compose and define the desired output structure in DTL.