Comparing version 0.1.1 to 0.4.2
export declare class BaseEngine { | ||
private __extensions; | ||
private __name; | ||
get name(): string; | ||
set name(val: string); | ||
get extensions(): string[]; | ||
addExtenstion(name: string): void; | ||
addExtenstions(extension: Array<string>): void; | ||
removeExtension(name: string): void; | ||
name: string; | ||
opts?: any; | ||
engine: any; | ||
getExtensions(): Array<string>; | ||
setExtensions(extensions: Array<string>): void; | ||
deleteExtension(name: string): void; | ||
} |
@@ -7,31 +7,19 @@ "use strict"; | ||
this.__extensions = Array(); | ||
this.__name = ""; | ||
this.name = ""; | ||
this.opts = undefined; | ||
this.engine = undefined; | ||
} | ||
get name() { | ||
return this.__name; | ||
} | ||
set name(val) { | ||
this.__name = val; | ||
} | ||
get extensions() { | ||
getExtensions() { | ||
return this.__extensions; | ||
} | ||
addExtenstion(name) { | ||
let newExt = name.toLowerCase().trim(); | ||
let exists = false; | ||
this.__extensions.forEach(ext => { | ||
if (newExt === ext) { | ||
exists = true; | ||
setExtensions(extensions) { | ||
this.__extensions = new Array(); | ||
extensions.forEach(ext => { | ||
let newExt = ext.trim().toLowerCase(); | ||
if (!this.__extensions.includes(newExt)) { | ||
this.__extensions.push(newExt); | ||
} | ||
}); | ||
if (!exists) { | ||
this.__extensions.push(newExt); | ||
} | ||
} | ||
addExtenstions(extension) { | ||
extension.forEach(ext => { | ||
this.addExtenstion(ext); | ||
}); | ||
} | ||
removeExtension(name) { | ||
deleteExtension(name) { | ||
this.__extensions.forEach((ext, index) => { | ||
@@ -38,0 +26,0 @@ if (name.toLowerCase().trim() === ext) { |
export declare class EngineMap { | ||
_name: string; | ||
_extensions: string[]; | ||
constructor(name: string, extensions: Array<string>); | ||
get name(): string; | ||
set name(val: string); | ||
get extensions(): Array<string>; | ||
set extensions(val: Array<string>); | ||
private _mappings; | ||
constructor(); | ||
set(name: string, extensions: Array<string>): void; | ||
delete(name: string): void; | ||
deleteExtension(name: string, extension: string): void; | ||
get(name: string): Array<string> | undefined; | ||
getName(extension: string): string | undefined; | ||
} |
@@ -5,25 +5,46 @@ "use strict"; | ||
class EngineMap { | ||
constructor(name, extensions) { | ||
this._name = ""; | ||
this._extensions = new Array(); | ||
if (name !== undefined) { | ||
this._name = name; | ||
constructor() { | ||
this._mappings = new Map(); | ||
} | ||
set(name, extensions) { | ||
let engineName = name.trim().toLowerCase(); | ||
let engineExtensions = new Array(); | ||
if (extensions.length !== 0 && name !== "") { | ||
//clean engine extensions | ||
extensions.forEach(ext => { | ||
ext = ext.trim().toLowerCase(); | ||
if (!engineExtensions.includes(ext)) { | ||
engineExtensions.push(ext); | ||
} | ||
}); | ||
this._mappings.set(engineName, engineExtensions); | ||
} | ||
if (extensions !== undefined) { | ||
this._extensions = extensions; | ||
} | ||
} | ||
get name() { | ||
return this._name; | ||
delete(name) { | ||
this._mappings.delete(name.trim().toLowerCase()); | ||
} | ||
set name(val) { | ||
this._name = val; | ||
deleteExtension(name, extension) { | ||
let engineName = name.trim().toLowerCase(); | ||
let extensions = this._mappings.get(engineName); | ||
if (extensions) { | ||
let engineExtensions = new Array(); | ||
extensions.forEach(ext => { | ||
if (ext !== extension.trim().toLowerCase()) { | ||
engineExtensions.push(ext); | ||
} | ||
}); | ||
this._mappings.set(engineName, engineExtensions); | ||
} | ||
} | ||
get extensions() { | ||
return this._extensions; | ||
get(name) { | ||
return this._mappings.get(name.trim().toLowerCase()); | ||
} | ||
set extensions(val) { | ||
if (val instanceof Array) { | ||
this._extensions = val; | ||
} | ||
getName(extension) { | ||
let engineName = undefined; | ||
this._mappings.forEach((extensions, name, map) => { | ||
if (extensions.includes(extension.trim().toLowerCase())) { | ||
engineName = name; | ||
} | ||
}); | ||
return engineName; | ||
} | ||
@@ -30,0 +51,0 @@ } |
import { BaseEngine } from "../baseEngine"; | ||
export declare class Handlebars extends BaseEngine { | ||
private __engine; | ||
constructor(); | ||
render(content: string): Promise<string>; | ||
registerPartials(config: any): boolean; | ||
export declare class Handlebars extends BaseEngine implements EngineInterface { | ||
private __templates; | ||
constructor(opts?: object); | ||
render(source: string, data?: object): Promise<string>; | ||
} |
@@ -6,33 +6,19 @@ "use strict"; | ||
const handlebars = require("handlebars"); | ||
const fs = require("fs-extra"); | ||
const helpers = require("handlebars-helpers"); | ||
class Handlebars extends baseEngine_1.BaseEngine { | ||
constructor() { | ||
constructor(opts) { | ||
super(); | ||
this.name = "Handlebars"; | ||
this.addExtenstions(["hbs", "hls", "handlebars"]); | ||
this.__templates = new Map(); | ||
this.name = "handlebars"; | ||
this.opts = opts; | ||
this.setExtensions(["hbs", "hjs", "handlebars"]); | ||
} | ||
async render(content) { | ||
let hjs = this.__engine; | ||
handlebars.registerHelper('formatDate', require('helper-date')); | ||
let template = handlebars.compile(content); | ||
return template(content); | ||
async render(source, data) { | ||
helpers({ handlebars: handlebars }); | ||
let template = handlebars.compile(source, this.opts); | ||
this.__templates.set(source, template); | ||
return template(data); | ||
} | ||
registerPartials(config) { | ||
let result = false; | ||
let path = config.path + "/templates/partials"; | ||
if (fs.pathExistsSync(path)) { | ||
let partials = fs.readdirSync(path); | ||
partials.forEach(p => { | ||
let source = fs.readFileSync(path + "/" + p).toString(); | ||
let name = p.split(".hjs")[0]; | ||
if (handlebars.partials[name] === undefined) { | ||
handlebars.registerPartial(name, handlebars.compile(source)); | ||
} | ||
}); | ||
result = true; | ||
} | ||
return result; | ||
} | ||
} | ||
exports.Handlebars = Handlebars; | ||
//# sourceMappingURL=handlebars.js.map |
import { BaseEngine } from "../baseEngine"; | ||
export declare class Markdown extends BaseEngine { | ||
private __markdown; | ||
constructor(); | ||
render(content: string): Promise<string>; | ||
export declare class Markdown extends BaseEngine implements EngineInterface { | ||
constructor(opts?: any); | ||
render(source: string, data?: object): Promise<string>; | ||
} |
@@ -6,17 +6,19 @@ "use strict"; | ||
class Markdown extends baseEngine_1.BaseEngine { | ||
constructor() { | ||
constructor(opts) { | ||
super(); | ||
this.name = "Markdown"; | ||
this.addExtenstions(["md", "markdown"]); | ||
this.name = "markdown"; | ||
if (opts) { | ||
this.opts = opts; | ||
} | ||
this.setExtensions(["md", "markdown"]); | ||
} | ||
async render(content) { | ||
let md = this.__markdown; | ||
async render(source, data) { | ||
let md = this.engine; | ||
if (md === undefined) { | ||
md = this.__markdown = require('markdown-it')({ | ||
html: true, | ||
linkify: true, | ||
typographer: true, | ||
}); | ||
if (!this.opts) { | ||
this.opts = { html: true, linkify: true, typographer: true }; | ||
} | ||
md = this.engine = require('markdown-it')(this.opts); | ||
} | ||
return md.render(content); | ||
return md.render(source); | ||
} | ||
@@ -23,0 +25,0 @@ } |
{ | ||
"name": "ecto", | ||
"version": "0.1.1", | ||
"version": "0.4.2", | ||
"description": "Modern Template Consolidation Engine for EJS, Markdown, Pug, Nunjucks, and Handlebars", | ||
"main": "./dist/index", | ||
"types": "./dist/index", | ||
"main": "./dist/ecto.js", | ||
"types": "./dist/ecto.d.ts", | ||
"repository": "https://github.com/jaredwray/ecto.git", | ||
@@ -19,3 +19,12 @@ "author": "Jared Wray <me@jaredwray.com>", | ||
"hjs", | ||
"ejs" | ||
"ejs", | ||
"consolidate", | ||
"consolidatejs", | ||
"pug", | ||
"jade", | ||
"nunjucks", | ||
"njk", | ||
"mustache", | ||
"liquid", | ||
"liquidjs" | ||
], | ||
@@ -30,9 +39,16 @@ "scripts": { | ||
"dependencies": { | ||
"@types/handlebars-helpers": "^0.5.2", | ||
"@types/keyv": "^3.1.0", | ||
"ejs": "^3.1.5", | ||
"@types/mustache": "^4.1.1", | ||
"@types/nunjucks": "^3.1.4", | ||
"ejs": "^3.1.6", | ||
"fs-extra": "^9.1.0", | ||
"handlebars": "^4.4.3", | ||
"handlebars-helpers": "^0.10.0", | ||
"helper-date": "^1.0.1", | ||
"keyv": "^4.0.3", | ||
"liquidjs": "^9.22.1", | ||
"markdown-it": "^12.0.4", | ||
"mustache": "^4.1.0", | ||
"nunjucks": "^3.2.2", | ||
"pug": "^3.0.0", | ||
@@ -39,0 +55,0 @@ "winston": "^3.3.3" |
223
README.md
@@ -8,30 +8,221 @@ ![Ecto](ecto_logo.png "Ecto") | ||
[![GitHub license](https://img.shields.io/github/license/jaredwray/ecto)](https://github.com/jaredwray/ecto/blob/master/LICENSE) | ||
[![codecov](https://codecov.io/gh/jaredwray/ecto/branch/master/graph/badge.svg)](https://codecov.io/gh/jaredwray/ecto) | ||
[![npm](https://img.shields.io/npm/dm/ecto)](https://npmjs.com/packages/ecto) | ||
[![codecov](https://codecov.io/gh/jaredwray/ecto/branch/main/graph/badge.svg?token=dpbFqSW5Kh)](https://codecov.io/gh/jaredwray/ecto) | ||
[![npm](https://img.shields.io/npm/dm/ecto)](https://npmjs.com/package/ecto) | ||
----- | ||
## Getting Started -- It's that Easy! | ||
Step 1: Add Ecto to your Project | ||
``` | ||
yarn add ecto | ||
``` | ||
Step 2: Declate and Initialize | ||
```javascript | ||
const Ecto = require("ecto"); | ||
let ecto = new Ecto(); | ||
``` | ||
Step 3: Render via String for EJS ([Default Engine](#)) | ||
```javascript | ||
let source = "<h1>Hello <%= firstName%> <%= lastName %>!</h1>"; | ||
let data = {firstName: "John", lastName: "Doe"} | ||
//async render(source:string, data?:object, engineName?:string, filePathOutput?:string): Promise<string> | ||
let output = await ecto.render(source, data); | ||
``` | ||
Here is how it looks all together after you have added it as a package via `yarn add ecto`! | ||
```javascript | ||
const Ecto = require("ecto"); | ||
let ecto = new Ecto(); | ||
let source = "<h1>Hello <%= firstName%> <%= lastName %>!</h1>"; | ||
let data = {firstName: "John", lastName: "Doe"}; | ||
//async render(source:string, data?:object, engineName?:string, filePathOutput?:string): Promise<string> | ||
let output = await ecto.render(source, data); | ||
console.log(output); | ||
``` | ||
Next Steps: | ||
* [More examples on Render via String](#render-via-string) | ||
* [More examples on Render via Template File](#render-via-template-file-with-automatic-engine-selection) | ||
* [Examples by Specific Engines](#examples-by-specific-engines) | ||
* [Check out the entire API / Functions](#api) | ||
----- | ||
## Features | ||
* Zero Config by default. | ||
* Async render function for ES6 and Typescript. | ||
* Automatic Engine Selection. No more selecting which engine to use as it does it for you based on file extension. | ||
* Support for the top Template Engines: EJS, Markdown, Pug, Nunjucks, Mustache, Liquid, and Handlebars | ||
* Async `render` and `renderFromTemplate` functions for ES6 and Typescript. | ||
* Render via Template File with Automatic Engine Selection. No more selecting which engine to use as it does it for you based on file extension. | ||
* Only the Top Template Engines: EJS, Markdown, Pug, Nunjucks, Mustache, Liquid, and Handlebars | ||
* Maintained with Monthly Updates! | ||
## Auto File Extension Selectors | ||
## Only the Top Template Engines and Their Extensions | ||
| Engine | Extensions | | ||
| :------------- | :---------- | | ||
| EJS | .ejs | | ||
| Markdown | .markdown, .md | | ||
| Pug | .pug | | ||
| Nunjucks | .njk | | ||
| Mustache | .mustache | | ||
| Handlebars | .hbs, .handlebars, .hjs | | ||
| Liquid | .liquid | | ||
While doing research for enabling other projects to handle multiple template engines we decided to not use other consolidation engines as they is all over the place. Some of the packages were unsupported and most likely hard to validate as working. Some had had limited types and ease of use. | ||
Our goal is to support the top engines which most likely handle the vast majority of use cases and just make it easy. Here are the top engines that we support and make easy: | ||
| Engine | Monthly Downloads | Extensions | | ||
| ---------- | ---------------------------------------------------------------------------------------------- | ----------------------- | | ||
| [EJS](https://www.npmjs.com/package/ejs) | [![npm](https://img.shields.io/npm/dm/ejs)](https://npmjs.com/package/ejs) | .ejs | | ||
| [Markdown](https://www.npmjs.com/package/markdown-it) | [![npm](https://img.shields.io/npm/dm/markdown-it)](https://npmjs.com/package/markdown-it) | .markdown, .md | | ||
| [Pug](https://www.npmjs.com/package/pug) | [![npm](https://img.shields.io/npm/dm/pug)](https://npmjs.com/package/pug) | .pug, .jade | | ||
| [Nunjucks](https://www.npmjs.com/package/nunjucks) | [![npm](https://img.shields.io/npm/dm/nunjucks)](https://npmjs.com/package/nunjucks) | .njk | | ||
| [Mustache](https://www.npmjs.com/package/mustache) | [![npm](https://img.shields.io/npm/dm/mustache)](https://npmjs.com/package/mustache) | .mustache | | ||
| [Handlebars](https://www.npmjs.com/package/handlebars) | [![npm](https://img.shields.io/npm/dm/handlebars)](https://npmjs.com/package/handlebars) | .handlebars, .hbs, .hls | | ||
| [Liquid](https://www.npmjs.com/package/liquidjs) | [![npm](https://img.shields.io/npm/dm/liquidjs)](https://npmjs.com/package/liquidjs) | .liquid | | | ||
_The `Extensions` are listed above for when we [Render via Template File](#render-via-template-file-with-automatic-engine-selection)._ | ||
----- | ||
## Render via String | ||
As we have shown in [Getting Started -- It's that Easy!](#getting-started----its-that-easy) you can do a render in only a couple lines of code: | ||
```javascript | ||
let ecto = new Ecto(); | ||
let source = "<h1>Hello <%= firstName%> <%= lastName %>!</h1>"; | ||
let data = {firstName: "John", lastName: "Doe"}; | ||
//render(source:string, data?:object, engineName?:string, filePathOutput?:string): Promise<string> | ||
let output = await ecto.render(source, data); | ||
console.log(output); | ||
``` | ||
Now lets say your engine is not [EJS](https://www.npmjs.com/package/ejs) so you want to specify it. You can either set the [defaultEngine](#parameter-defaultengine) parameter or simply pass it in the `render` function. Here we are doing [Handlebars](https://www.npmjs.com/package/handlebars): | ||
```javascript | ||
let ecto = new Ecto(); | ||
let source = "<h1>Hello {{firstName}} {{lastName}}!</h1>"; | ||
let data = {firstName: "John", lastName: "Doe"}; | ||
//render(source:string, data?:object, engineName?:string, filePathOutput?:string): Promise<string> | ||
let output = await ecto.render(source, data, "handlebars"); | ||
console.log(output); | ||
``` | ||
`render` also can write out the file for you by specifying the `filePathOutput` parameter like below. It will still return the output via `string`: | ||
```javascript | ||
let ecto = new Ecto(); | ||
let source = "<h1>Hello <%= firstName%> <%= lastName %>!</h1>"; | ||
let data = {firstName: "John", lastName: "Doe"}; | ||
//render(source:string, data?:object, engineName?:string, filePathOutput?:string): Promise<string> | ||
let output = await ecto.render(source, data, undefined, "./path/to/output/file.html"); | ||
console.log(output); | ||
``` | ||
Notice the `undefined` passed into the `engineName` parameter. This is done because we already have the [defaultEngine](#parameter-defaultengine) set to [EJS](https://www.npmjs.com/package/ejs). If you want you can easily add it in by specifying it. | ||
----- | ||
## Render via Template File with Automatic Engine Selection | ||
To render via a template file it is as simple as calling the `renderFromTemplate` function with a couple simple parameters to be passed in. In this example we are simply passing in the template and it will return a `string`. | ||
```javascript | ||
let ecto = new Ecto(); | ||
let data = { firstName: "John", lastName: "Doe"}; | ||
//renderFromTemplate(templatePath:string, data?:object, filePathOutput?:string, rootPath?:string, engineName?:string): Promise<string> | ||
let output = await ecto.renderFromTemplate("./path/to/template.ejs", data); | ||
``` | ||
In this example we are now asking it to write the output file for us and it will return the output still as a `string`: | ||
```javascript | ||
let ecto = new Ecto(); | ||
let data = { firstName: "John", lastName: "Doe"}; | ||
//renderFromTemplate(templatePath:string, data?:object, filePathOutput?:string, rootPath?:string, engineName?:string): Promise<string> | ||
let output = await ecto.renderFromTemplate("./path/to/template.ejs", data, "./path/to/output/yourname.html"); | ||
``` | ||
Notice that in these examples it is using the `./path/to/template.ejs` to use the engine [EJS](https://www.npmjs.com/package/ejs) for the rendering. | ||
You can override the auto selected engine by adding it on the function as a parameter by passing in `pug` in this example: | ||
```javascript | ||
let ecto = new Ecto(); | ||
let data = { firstName: "John", lastName: "Doe"}; | ||
//renderFromTemplate(templatePath:string, data?:object, filePathOutput?:string, rootPath?:string, engineName?:string): Promise<string> | ||
let output = await ecto.renderFromTemplate("./path/to/template.ejs", data, "./path/to/output/yourname.html", "pug"); | ||
``` | ||
This will override the auto selection process and render the template using the [Pug](https://www.npmjs.com/package/pug) engine. | ||
----- | ||
## Examples by Specific Engines | ||
### Markdown | ||
### Handlebars | ||
----- | ||
## API | ||
`Render(sourceDir:string, data:obj, fileOutput?:string): string (returns rendered output)` | ||
Ecto: | ||
* Constructor | ||
* Functions: | ||
* render | ||
* renderFromTemplate | ||
* Parameters: | ||
* defaultEngine | ||
* mappings | ||
* markdown | ||
* handlebars | ||
* ejs | ||
* pug | ||
* nunjucks | ||
* mustache | ||
* liquid | ||
### Constructor: | ||
```javascript | ||
(opts:object) | ||
``` | ||
The constructor can be initialized with the defaultEngine like so for options: | ||
``` | ||
let ecto = new Ecto({defaultEngine: "pug"}); | ||
``` | ||
### Parameter: `defaultEngine` | ||
``` | ||
defaultEngine: String | ||
``` | ||
By default the system is set to [EJS](https://www.npmjs.com/package/ejs) but if you are using a different engine no problem as you can easily change the default like so: | ||
```javascript | ||
let ecto = new Ecto(); | ||
ecto.defaultEngine = "pug" //we support ejs, markdown, pug, nunjucks, mustache, handlebars, and liquid | ||
``` | ||
From there you can do the default `render` and it just works! Now if you want to just pass it on the command line you can by doing the following on render which will overwrite the `defaultEngine`: | ||
```javascript | ||
let ecto = new Ecto(); | ||
let output = await ecto.render(source, data, "pug", "./path/to/output/file.html"); | ||
``` | ||
### Function: `render` | ||
``` | ||
render(source:string, data?:object, engineName?:string, filePathOutput?:string): Promise<string> | ||
``` | ||
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
84350
66
977
228
1
1
16
+ Added@types/mustache@^4.1.1
+ Added@types/nunjucks@^3.1.4
+ Addedhandlebars-helpers@^0.10.0
+ Addedliquidjs@^9.22.1
+ Addedmustache@^4.1.0
+ Addednunjucks@^3.2.2
+ Added@types/handlebars-helpers@0.5.6(transitive)
+ Added@types/mustache@4.2.5(transitive)
+ Added@types/nunjucks@3.2.6(transitive)
+ Addeda-sync-waterfall@1.0.1(transitive)
+ Addedansi-bgblack@0.1.1(transitive)
+ Addedansi-bgblue@0.1.1(transitive)
+ Addedansi-bgcyan@0.1.1(transitive)
+ Addedansi-bggreen@0.1.1(transitive)
+ Addedansi-bgmagenta@0.1.1(transitive)
+ Addedansi-bgred@0.1.1(transitive)
+ Addedansi-bgwhite@0.1.1(transitive)
+ Addedansi-bgyellow@0.1.1(transitive)
+ Addedansi-black@0.1.1(transitive)
+ Addedansi-blue@0.1.1(transitive)
+ Addedansi-bold@0.1.1(transitive)
+ Addedansi-colors@0.2.0(transitive)
+ Addedansi-cyan@0.1.1(transitive)
+ Addedansi-dim@0.1.1(transitive)
+ Addedansi-gray@0.1.1(transitive)
+ Addedansi-green@0.1.1(transitive)
+ Addedansi-grey@0.1.1(transitive)
+ Addedansi-hidden@0.1.1(transitive)
+ Addedansi-inverse@0.1.1(transitive)
+ Addedansi-italic@0.1.1(transitive)
+ Addedansi-magenta@0.1.1(transitive)
+ Addedansi-red@0.1.1(transitive)
+ Addedansi-reset@0.1.1(transitive)
+ Addedansi-strikethrough@0.1.1(transitive)
+ Addedansi-underline@0.1.1(transitive)
+ Addedansi-white@0.1.1(transitive)
+ Addedansi-wrap@0.1.0(transitive)
+ Addedansi-yellow@0.1.1(transitive)
+ Addedargparse@1.0.10(transitive)
+ Addedarr-diff@4.0.0(transitive)
+ Addedarr-flatten@1.1.0(transitive)
+ Addedarr-union@3.1.0(transitive)
+ Addedarray-sort@0.1.4(transitive)
+ Addedarray-unique@0.3.2(transitive)
+ Addedassign-symbols@1.0.0(transitive)
+ Addedatob@2.1.2(transitive)
+ Addedautolinker@0.28.1(transitive)
+ Addedbase@0.11.2(transitive)
+ Addedbraces@2.3.2(transitive)
+ Addedcache-base@1.0.1(transitive)
+ Addedclass-utils@0.3.6(transitive)
+ Addedcollection-visit@1.0.0(transitive)
+ Addedcommander@5.1.0(transitive)
+ Addedcomponent-emitter@1.3.1(transitive)
+ Addedconcat-with-sourcemaps@1.1.0(transitive)
+ Addedcopy-descriptor@0.1.1(transitive)
+ Addedcore-util-is@1.0.3(transitive)
+ Addedcreate-frame@1.0.0(transitive)
+ Addeddebug@2.6.9(transitive)
+ Addeddecode-uri-component@0.2.2(transitive)
+ Addeddefault-compare@1.0.0(transitive)
+ Addeddefine-property@0.2.51.0.02.0.2(transitive)
+ Addedent@2.2.1(transitive)
+ Addederror-symbol@0.1.0(transitive)
+ Addedexpand-brackets@2.1.4(transitive)
+ Addedextend-shallow@2.0.13.0.2(transitive)
+ Addedextglob@2.0.4(transitive)
+ Addedfalsey@0.3.2(transitive)
+ Addedfill-range@4.0.0(transitive)
+ Addedfor-in@1.0.2(transitive)
+ Addedfor-own@1.0.0(transitive)
+ Addedfragment-cache@0.2.1(transitive)
+ Addedfs-exists-sync@0.1.0(transitive)
+ Addedget-object@0.2.0(transitive)
+ Addedget-value@2.0.6(transitive)
+ Addedgulp-header@1.8.12(transitive)
+ Addedhandlebars-helper-create-frame@0.1.0(transitive)
+ Addedhandlebars-helpers@0.10.0(transitive)
+ Addedhas-value@0.3.11.0.0(transitive)
+ Addedhas-values@0.1.41.0.0(transitive)
+ Addedhelper-markdown@1.0.0(transitive)
+ Addedhelper-md@0.2.2(transitive)
+ Addedhighlight.js@9.18.5(transitive)
+ Addedhtml-tag@2.0.0(transitive)
+ Addedinfo-symbol@0.1.0(transitive)
+ Addedis-accessor-descriptor@1.0.1(transitive)
+ Addedis-data-descriptor@1.0.1(transitive)
+ Addedis-descriptor@0.1.71.0.3(transitive)
+ Addedis-even@1.0.0(transitive)
+ Addedis-extendable@0.1.11.0.1(transitive)
+ Addedis-extglob@2.1.1(transitive)
+ Addedis-glob@4.0.3(transitive)
+ Addedis-number@2.1.03.0.04.0.0(transitive)
+ Addedis-odd@0.1.2(transitive)
+ Addedis-plain-object@2.0.4(transitive)
+ Addedis-self-closing@1.0.1(transitive)
+ Addedis-windows@1.0.2(transitive)
+ Addedisarray@1.0.0(transitive)
+ Addedisobject@0.2.02.1.03.0.1(transitive)
+ Addedkind-of@4.0.05.1.0(transitive)
+ Addedlazy-cache@2.0.2(transitive)
+ Addedliquidjs@9.43.0(transitive)
+ Addedlodash._reinterpolate@3.0.0(transitive)
+ Addedlodash.template@4.5.0(transitive)
+ Addedlodash.templatesettings@4.2.0(transitive)
+ Addedlog-ok@0.1.1(transitive)
+ Addedlog-utils@0.2.1(transitive)
+ Addedlogging-helpers@1.0.0(transitive)
+ Addedmap-cache@0.2.2(transitive)
+ Addedmap-visit@1.0.0(transitive)
+ Addedmicromatch@3.1.10(transitive)
+ Addedmixin-deep@1.3.2(transitive)
+ Addedmustache@4.2.0(transitive)
+ Addednanomatch@1.2.13(transitive)
+ Addednunjucks@3.2.4(transitive)
+ Addedobject-copy@0.1.0(transitive)
+ Addedobject-visit@1.0.1(transitive)
+ Addedobject.pick@1.3.0(transitive)
+ Addedpascalcase@0.1.1(transitive)
+ Addedposix-character-classes@0.1.1(transitive)
+ Addedprocess-nextick-args@2.0.1(transitive)
+ Addedpunycode@1.4.1(transitive)
+ Addedreadable-stream@2.3.8(transitive)
+ Addedregex-not@1.0.2(transitive)
+ Addedrelative@3.0.2(transitive)
+ Addedremarkable@1.7.4(transitive)
+ Addedrepeat-element@1.1.4(transitive)
+ Addedrepeat-string@1.6.1(transitive)
+ Addedresolve-url@0.2.1(transitive)
+ Addedret@0.1.15(transitive)
+ Addedsafe-buffer@5.1.2(transitive)
+ Addedsafe-regex@1.1.0(transitive)
+ Addedself-closing-tags@1.0.1(transitive)
+ Addedset-getter@0.1.1(transitive)
+ Addedset-value@2.0.1(transitive)
+ Addedsnapdragon@0.8.2(transitive)
+ Addedsnapdragon-node@2.1.1(transitive)
+ Addedsnapdragon-util@3.0.1(transitive)
+ Addedsource-map@0.5.7(transitive)
+ Addedsource-map-resolve@0.5.3(transitive)
+ Addedsource-map-url@0.4.1(transitive)
+ Addedsplit-string@3.1.0(transitive)
+ Addedsprintf-js@1.0.3(transitive)
+ Addedstatic-extend@0.1.2(transitive)
+ Addedstring_decoder@1.1.1(transitive)
+ Addedstriptags@3.2.0(transitive)
+ Addedsuccess-symbol@0.1.0(transitive)
+ Addedthrough2@2.0.5(transitive)
+ Addedtime-stamp@1.1.0(transitive)
+ Addedto-gfm-code-block@0.1.1(transitive)
+ Addedto-object-path@0.3.0(transitive)
+ Addedto-regex@3.0.2(transitive)
+ Addedto-regex-range@2.1.1(transitive)
+ Addedunion-value@1.0.1(transitive)
+ Addedunset-value@1.0.0(transitive)
+ Addedurix@0.1.0(transitive)
+ Addeduse@3.1.1(transitive)
+ Addedwarning-symbol@0.1.0(transitive)
+ Addedxtend@4.0.2(transitive)
+ Addedyear@0.2.1(transitive)
- Removedsafe-buffer@5.2.1(transitive)
- Removedstring_decoder@1.3.0(transitive)
Updatedejs@^3.1.6