## Usage
```js
const renderLayouts = require('{%= name %}');
renderLayouts(file, layoutCollection, options);
```
- `file` - a file object (or [vinyl] file) with a `file.contents` property that must be a buffer
- `layoutCollection` - an object of file objects to use as layouts
- `options` - see [available options](#options)
## Heads up!
This library does not clone the file object. If you want to prevent `file.contents` from being mutated (after rendering layouts), clone the file first before passing it to this library.
## Example
```js
const renderLayouts = require('{%= name %}');
const file = {
contents: Buffer.from('
Wrap me with a layout!!!
'),
layout: 'one'
};
const layoutCollection = {
one: { contents: Buffer.from('one before\n{%% body %}\none after'), layout: 'two' },
two: { contents: Buffer.from('two before\n{%% body %}\ntwo after') }
};
const res = renderLayouts(file, layoutCollection);
console.log(res.contents.toString());
// two before
// one before
// Wrap me with a layout!!!
// one after
// two after
```
## Options
### options.disableHistory
**Type**: `boolean`
**Default**: `undefined`
By default, layouts are prevented from being applied multiple times to the same string. Disable this by setting `disableHistory` to true.
**Example**
```js
layouts(file, layoutCollection, { disableHistory: true });
```
### options.layoutDelims
Custom delimiters to use for injecting contents into layouts.
**Type**: `regex`
**Default**: `/{%% (body) %}/g`
### options.preserveWhitespace
Preserve leading whitespace when injecting a string into a layout.
**Type**: `boolean`
**Default**: `undefined`
## API
{%= apidocs("index.js") %}
## History
### 1.0.0
**Breaking changes**
- renames `layoutHistory` to `layoutStack`
- layouts in `layoutStack` are now the actual layout object, instead of the layout name
**Added**
- Adds support for a function as the last argument. If passed, the function is called on the file and each layout with this signature: `fn(file, layout)`.
### 0.13.0
**Breaking changes**
- The main `layouts()` function now expects a `file` object as the first argument. This can be an object with `path`, `layout` and `contents` properties, or a valid [vinyl][] file. See the [API docs](#api) for more details.
### 0.12.0
**Breaking changes**
- change `options.tag` to `options.contentTag`
**Housekeeping**
- update tests to use `assert` instead of `should`
### 0.11.0
- All view objects must now have a `path` property, following [vinyl][] conventions.