# @transformation/ejs

A package for rendering [EJS](https://ejs.co/) templates.

## renderTemplate

Renders an EJS template for each item in the pipeline.

```js
const { renderTemplate } = require("@transformation/ejs");
```

Let say we want to render stock items with a custom template. Let's start out by defining the template in a file called `stocks.ejs`.

```ejs
<%-key%>
<% for(let { price } of items) { -%>
  <%-price%>
<% } -%>
```

Now we can render items with the template by using the `renderTemplate` transform.

```js
await expect(
  pipeline(
    emitItems(
      { symbol: "GOOG", price: 1349 },
      { symbol: "AAPL", price: 274 },
      { symbol: "AAPL", price: 275 },
      { symbol: "GOOG", price: 1351 },
      { symbol: "AAPL", price: 279 }
    ),
    groupBy("symbol"),
    renderTemplate("stocks.ejs")
  ),
  "to yield items",
  ["GOOG\n  1349\n  1351\n", "AAPL\n  274\n  275\n  279\n"]
);
```

## writeTemplate

Renders an EJS template for each item in the pipeline to a file.

```js
const { writeTemplate } = require("@transformation/ejs");
```

Let say we want to render stock items with a custom template. Let's start out by defining the template in a file called `stocks.ejs`.

```ejs
<%-key%>
<% for(let { price } of items) { -%>
  <%-price%>
<% } -%>
```

No we can render items with the template by using the `writeTemplate` transform.

```js
await program(
  emitItems(
    { symbol: "GOOG", price: 1349 },
    { symbol: "AAPL", price: 274 },
    { symbol: "AAPL", price: 275 },
    { symbol: "GOOG", price: 1351 },
    { symbol: "AAPL", price: 279 }
  ),
  groupBy("symbol"),
  writeTemplate("stocks.ejs", ({ key }) => `stocks-${key}.txt`)
);
```

This will create two files with the following content.

`stocks-APPL.txt`:

```
AAPL: 274
AAPL: 275
AAPL: 279
```

`stocks-GOOG.txt`:

```
GOOG: 1349
GOOG: 1351
```

You can of cause also just write items to one file, you just needs to make sure to aggregate the pipeline into one item first.

Here we define a template that will render a an array of stocks in a file called `stocksArray.ejs`.

```ejs
<% for(let { symbol, price } of items) { -%>
<%-symbol%>: <%-price%>
<% } -%>
```

```js
await program(
  emitItems(
    { symbol: "GOOG", price: 1349 },
    { symbol: "AAPL", price: 274 },
    { symbol: "AAPL", price: 275 },
    { symbol: "GOOG", price: 1351 },
    { symbol: "AAPL", price: 279 }
  ),
  sortBy("symbol"),
  toArray(),
  writeTemplate("stocksArray.ejs", "stocks.txt")
);
```

This produce the following result.

`stocks.txt`:

```
AAPL: 274
AAPL: 275
AAPL: 279
GOOG: 1349
GOOG: 1351
```
