diff --git a/lib/__tests__/effe.test.js b/lib/__tests__/effe.test.js
new file mode 100644
index 0000000..9f31bed
--- /dev/null
+++ b/lib/__tests__/effe.test.js
@@ -0,0 +1,207 @@
+const Email = require('email-templates');
+const path = require('path');
+const cheerio = require('cheerio');
+const _ = require('lodash');
+
+const engine = require('../index');
+
+const email = new Email({
+ views: {
+ root: path.join(__dirname, 'fixtures/effe'),
+ options: {
+ extension: 'hbs',
+ engineSource: engine({
+ layouts: path.join(__dirname, 'fixtures/handlebars/layouts'),
+ partials: path.join(__dirname, 'fixtures/handlebars/partials'),
+ helpers: path.join(__dirname, 'fixtures/handlebars/helpers')
+ })
+ }
+ }
+});
+
+describe('Effe', () => {
+ it('should be render a single file', () => {
+ expect(
+ email.render('hbs', { name: 'John' }).then(html => {
+ const $ = cheerio.load(html, { xmlMode: true });
+ return $('html').length;
+ })
+ ).resolves.toEqual(0);
+
+ return expect(
+ email.render('hbs', { name: 'John' }).then(html => {
+ return _.trim(html);
+ })
+ ).resolves.toEqual('Hello John!');
+ });
+
+ it('should be render all', () => {
+ const _renderAll = email.renderAll('all', { name: 'John' });
+
+ expect(_renderAll.then(o => _.isObject(o))).resolves.toBe(true);
+ expect(_renderAll.then(o => Object.keys(o))).resolves.toEqual(
+ expect.arrayContaining(['subject', 'html', 'text'])
+ );
+ expect(_renderAll.then(o => _.trim(o.subject))).resolves.toBe('Hello John!');
+ expect(
+ _renderAll.then(o => {
+ const $ = cheerio.load(o.html, { xmlMode: true });
+ return $('html').length;
+ })
+ ).resolves.toBe(1);
+ expect(
+ _renderAll.then(o => {
+ const $ = cheerio.load(o.html, { xmlMode: true });
+ return $('body p').html();
+ })
+ ).resolves.toBe('Hello John!');
+ return expect(_renderAll.then(o => _.trim(o.text))).resolves.toBe('Hello John!');
+ });
+
+ it('should be render with Inky html tag', () => {
+ const _renderAll = email.renderAll('inky', { name: 'John' });
+
+ expect(_renderAll.then(o => _.isObject(o))).resolves.toBe(true);
+ expect(_renderAll.then(o => Object.keys(o))).resolves.toEqual(
+ expect.arrayContaining(['subject', 'html', 'text'])
+ );
+ expect(_renderAll.then(o => _.trim(o.subject))).resolves.toBe('Hello John!');
+ expect(
+ _renderAll.then(o => {
+ const $ = cheerio.load(o.html, { xmlMode: true });
+ return $('body table.wrapper').length;
+ })
+ ).resolves.toBe(1);
+ expect(
+ _renderAll.then(o => {
+ const $ = cheerio.load(o.html, { xmlMode: true });
+ return $('table.button').text();
+ })
+ ).resolves.toBe('Click Me!');
+ return expect(_renderAll.then(o => _.trim(o.text))).resolves.toBe('Hello John!');
+ });
+
+ it('should be render with header data options', () => {
+ const _renderAll = email.renderAll('withHeaderData', { name: 'John' });
+
+ expect(_renderAll.then(o => _.isObject(o))).resolves.toBe(true);
+ expect(_renderAll.then(o => Object.keys(o))).resolves.toEqual(
+ expect.arrayContaining(['subject', 'html', 'text'])
+ );
+ expect(_renderAll.then(o => _.trim(o.subject))).resolves.toBe('Hello John!');
+ expect(
+ _renderAll.then(o => {
+ const $ = cheerio.load(o.html, { xmlMode: true });
+ return $('body table.wrapper').length;
+ })
+ ).resolves.toBe(1);
+ expect(
+ _renderAll.then(o => {
+ const $ = cheerio.load(o.html, { xmlMode: true });
+ return $('body table.wrapper p').text();
+ })
+ ).resolves.toBe('Hello Tim!');
+ return expect(_renderAll.then(o => _.trim(o.text))).resolves.toBe('Hello John!');
+ });
+
+ it('should be render with helper', () => {
+ const _renderAll = email.renderAll('withHelpers', { name: 'John' });
+
+ expect(_renderAll.then(o => _.isObject(o))).resolves.toBe(true);
+ expect(_renderAll.then(o => Object.keys(o))).resolves.toEqual(
+ expect.arrayContaining(['subject', 'html', 'text'])
+ );
+ expect(_renderAll.then(o => _.trim(o.subject))).resolves.toBe('Hello John!');
+ expect(
+ _renderAll.then(o => {
+ const $ = cheerio.load(o.html, { xmlMode: true });
+ return $('body').length;
+ })
+ ).resolves.toBe(1);
+ expect(
+ _renderAll.then(o => {
+ const $ = cheerio.load(o.html, { xmlMode: true });
+ return $('body p').html();
+ })
+ ).resolves.toBe('Hello JOHN!');
+ return expect(_renderAll.then(o => _.trim(o.text))).resolves.toBe('Hello John!');
+ });
+
+ it('should be render with other layout', () => {
+ const _renderAll = email.renderAll('withOtherLayout', {
+ layout: 'test',
+ name: 'John'
+ });
+
+ expect(_renderAll.then(o => _.isObject(o))).resolves.toBe(true);
+ expect(_renderAll.then(o => Object.keys(o))).resolves.toEqual(
+ expect.arrayContaining(['subject', 'html', 'text'])
+ );
+ expect(_renderAll.then(o => _.trim(o.subject))).resolves.toBe('Hello John!');
+ expect(
+ _renderAll.then(o => {
+ const $ = cheerio.load(o.html, { xmlMode: true });
+ return $('body').length;
+ })
+ ).resolves.toBe(0);
+ expect(
+ _renderAll.then(o => {
+ const $ = cheerio.load(o.html, { xmlMode: true });
+ return $('div h1').html();
+ })
+ ).resolves.toBe('This is a other layout');
+ expect(
+ _renderAll.then(o => {
+ const $ = cheerio.load(o.html, { xmlMode: true });
+ return $('div p').html();
+ })
+ ).resolves.toBe('Hello John!');
+ return expect(_renderAll.then(o => _.trim(o.text))).resolves.toBe('Hello John!');
+ });
+
+ it('should be render with other partial', () => {
+ const _renderAll = email.renderAll('withPartials', { name: 'John' });
+
+ expect(_renderAll.then(o => _.isObject(o))).resolves.toBe(true);
+ expect(_renderAll.then(o => Object.keys(o))).resolves.toEqual(
+ expect.arrayContaining(['subject', 'html', 'text'])
+ );
+ expect(_renderAll.then(o => _.trim(o.subject))).resolves.toBe('Hello John!');
+ expect(
+ _renderAll.then(o => {
+ const $ = cheerio.load(o.html, { xmlMode: true });
+ return $('body').length;
+ })
+ ).resolves.toBe(1);
+ expect(
+ _renderAll.then(o => {
+ const $ = cheerio.load(o.html, { xmlMode: true });
+ return $('p').html();
+ })
+ ).resolves.toBe('This is a hbs partial');
+ return expect(_renderAll.then(o => _.trim(o.text))).resolves.toBe('Hello John!');
+ });
+
+ it('should be have no engine options', function() {
+ const email = new Email({
+ views: {
+ root: path.join(__dirname, 'fixtures/effe'),
+ options: {
+ extension: 'hbs',
+ engineSource: engine()
+ }
+ }
+ });
+
+ expect(
+ email.render('hbs', { name: 'John' }).then(html => {
+ const $ = cheerio.load(html, { xmlMode: true });
+ return $('html').length;
+ })
+ ).resolves.toEqual(0);
+
+ return expect(
+ email.render('hbs', { name: 'John' }).then(html => _.trim(html))
+ ).resolves.toEqual('Hello John!');
+ });
+});
diff --git a/lib/__tests__/fixtures/effe/all/html.hbs b/lib/__tests__/fixtures/effe/all/html.hbs
new file mode 100644
index 0000000..16b8095
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/all/html.hbs
@@ -0,0 +1 @@
+
Hello {{name}}!
diff --git a/lib/__tests__/fixtures/effe/all/subject.hbs b/lib/__tests__/fixtures/effe/all/subject.hbs
new file mode 100644
index 0000000..6cb905f
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/all/subject.hbs
@@ -0,0 +1 @@
+Hello {{name}}!
diff --git a/lib/__tests__/fixtures/effe/all/text.hbs b/lib/__tests__/fixtures/effe/all/text.hbs
new file mode 100644
index 0000000..6cb905f
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/all/text.hbs
@@ -0,0 +1 @@
+Hello {{name}}!
diff --git a/lib/__tests__/fixtures/effe/hbs/index.hbs b/lib/__tests__/fixtures/effe/hbs/index.hbs
new file mode 100644
index 0000000..6cb905f
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/hbs/index.hbs
@@ -0,0 +1 @@
+Hello {{name}}!
diff --git a/lib/__tests__/fixtures/effe/inky/html.hbs b/lib/__tests__/fixtures/effe/inky/html.hbs
new file mode 100644
index 0000000..3d89edf
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/inky/html.hbs
@@ -0,0 +1,4 @@
+
+ Hello {{name}}!
+ Click Me!
+
diff --git a/lib/__tests__/fixtures/effe/inky/subject.hbs b/lib/__tests__/fixtures/effe/inky/subject.hbs
new file mode 100644
index 0000000..6cb905f
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/inky/subject.hbs
@@ -0,0 +1 @@
+Hello {{name}}!
diff --git a/lib/__tests__/fixtures/effe/inky/text.hbs b/lib/__tests__/fixtures/effe/inky/text.hbs
new file mode 100644
index 0000000..6cb905f
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/inky/text.hbs
@@ -0,0 +1 @@
+Hello {{name}}!
diff --git a/lib/__tests__/fixtures/effe/withHeaderData/html.hbs b/lib/__tests__/fixtures/effe/withHeaderData/html.hbs
new file mode 100644
index 0000000..c0c3676
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/withHeaderData/html.hbs
@@ -0,0 +1,7 @@
+---
+name: Tim
+---
+
+
+ Hello {{name}}!
+
diff --git a/lib/__tests__/fixtures/effe/withHeaderData/subject.hbs b/lib/__tests__/fixtures/effe/withHeaderData/subject.hbs
new file mode 100644
index 0000000..6cb905f
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/withHeaderData/subject.hbs
@@ -0,0 +1 @@
+Hello {{name}}!
diff --git a/lib/__tests__/fixtures/effe/withHeaderData/text.hbs b/lib/__tests__/fixtures/effe/withHeaderData/text.hbs
new file mode 100644
index 0000000..6cb905f
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/withHeaderData/text.hbs
@@ -0,0 +1 @@
+Hello {{name}}!
diff --git a/lib/__tests__/fixtures/effe/withHelpers/html.hbs b/lib/__tests__/fixtures/effe/withHelpers/html.hbs
new file mode 100644
index 0000000..651c0ba
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/withHelpers/html.hbs
@@ -0,0 +1 @@
+Hello {{upcase name}}!
diff --git a/lib/__tests__/fixtures/effe/withHelpers/subject.hbs b/lib/__tests__/fixtures/effe/withHelpers/subject.hbs
new file mode 100644
index 0000000..6cb905f
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/withHelpers/subject.hbs
@@ -0,0 +1 @@
+Hello {{name}}!
diff --git a/lib/__tests__/fixtures/effe/withHelpers/text.hbs b/lib/__tests__/fixtures/effe/withHelpers/text.hbs
new file mode 100644
index 0000000..6cb905f
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/withHelpers/text.hbs
@@ -0,0 +1 @@
+Hello {{name}}!
diff --git a/lib/__tests__/fixtures/effe/withOtherLayout/html.hbs b/lib/__tests__/fixtures/effe/withOtherLayout/html.hbs
new file mode 100644
index 0000000..16b8095
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/withOtherLayout/html.hbs
@@ -0,0 +1 @@
+Hello {{name}}!
diff --git a/lib/__tests__/fixtures/effe/withOtherLayout/subject.hbs b/lib/__tests__/fixtures/effe/withOtherLayout/subject.hbs
new file mode 100644
index 0000000..6cb905f
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/withOtherLayout/subject.hbs
@@ -0,0 +1 @@
+Hello {{name}}!
diff --git a/lib/__tests__/fixtures/effe/withOtherLayout/text.hbs b/lib/__tests__/fixtures/effe/withOtherLayout/text.hbs
new file mode 100644
index 0000000..6cb905f
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/withOtherLayout/text.hbs
@@ -0,0 +1 @@
+Hello {{name}}!
diff --git a/lib/__tests__/fixtures/effe/withPartials/html.hbs b/lib/__tests__/fixtures/effe/withPartials/html.hbs
new file mode 100644
index 0000000..ac7b6df
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/withPartials/html.hbs
@@ -0,0 +1,3 @@
+
+ {{> test}}
+
diff --git a/lib/__tests__/fixtures/effe/withPartials/subject.hbs b/lib/__tests__/fixtures/effe/withPartials/subject.hbs
new file mode 100644
index 0000000..6cb905f
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/withPartials/subject.hbs
@@ -0,0 +1 @@
+Hello {{name}}!
diff --git a/lib/__tests__/fixtures/effe/withPartials/text.hbs b/lib/__tests__/fixtures/effe/withPartials/text.hbs
new file mode 100644
index 0000000..6cb905f
--- /dev/null
+++ b/lib/__tests__/fixtures/effe/withPartials/text.hbs
@@ -0,0 +1 @@
+Hello {{name}}!
diff --git a/lib/__tests__/fixtures/handlebars/helpers/upcase.js b/lib/__tests__/fixtures/handlebars/helpers/upcase.js
new file mode 100644
index 0000000..9a3281d
--- /dev/null
+++ b/lib/__tests__/fixtures/handlebars/helpers/upcase.js
@@ -0,0 +1,14 @@
+const _ = require('lodash');
+const helpers = module.exports;
+
+helpers.uppercase = function(str) {
+ if (_.isObject(str) && str.fn) {
+ return str.fn(this).toUpperCase();
+ }
+ if (!_.isString(str)) return '';
+ return str.toUpperCase();
+};
+
+helpers.upcase = function() {
+ return helpers.uppercase.apply(this, arguments);
+};
diff --git a/lib/__tests__/fixtures/handlebars/layouts/test.hbs b/lib/__tests__/fixtures/handlebars/layouts/test.hbs
new file mode 100644
index 0000000..f63571a
--- /dev/null
+++ b/lib/__tests__/fixtures/handlebars/layouts/test.hbs
@@ -0,0 +1,5 @@
+
+
This is a other layout
+
+ {{> body}}
+
diff --git a/lib/__tests__/fixtures/handlebars/partials/test.hbs b/lib/__tests__/fixtures/handlebars/partials/test.hbs
new file mode 100644
index 0000000..cd18efc
--- /dev/null
+++ b/lib/__tests__/fixtures/handlebars/partials/test.hbs
@@ -0,0 +1 @@
+This is a hbs partial
diff --git a/lib/hbs/layouts/default.html b/lib/hbs/layouts/default.html
new file mode 100644
index 0000000..da721a5
--- /dev/null
+++ b/lib/hbs/layouts/default.html
@@ -0,0 +1,29 @@
+{{!-- This is the base layout for your project, and will be used on every page. --}}
+
+
+
+
+
+
+
+
+ {{subject}}
+
+
+
+
+
+
+
+
+ {{!-- Pages you create in the src/pages/ folder are inserted here when the flattened emails are created. --}}
+ {{> body}}
+
+
+
+
+
+
+
+
diff --git a/lib/index.js b/lib/index.js
index 8b46fbb..769c2c5 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -1,3 +1,54 @@
'use strict';
-module.exports = {};
+const path = require('path');
+const _ = require('lodash');
+const fs = require('fs');
+
+/**
+ * Initializes an instance of Effe.
+ * @constructor
+ * @param {object} options - Configuration options to use.
+ */
+function Effe(options = {}) {
+ this.options = options;
+ this.Handlebars = require('handlebars');
+ this.layouts = {};
+
+ if (this.options.layouts) {
+ this._loadLayouts([path.join(__dirname, 'hbs/layouts'), this.options.layouts]);
+ } else {
+ this._loadLayouts(path.join(__dirname, 'hbs/layouts'));
+ }
+ if (this.options.partials) this._loadPartials(this.options.partials);
+ if (this.options.helpers) this._loadHelpers(this.options.helpers);
+}
+
+Effe.prototype._loadLayouts = require('./loadLayouts');
+Effe.prototype._loadPartials = require('./loadPartials');
+Effe.prototype._loadHelpers = require('./loadHelpers');
+Effe.prototype._render = require('./render').render;
+
+/**
+ * Make the object with the engines
+ * @param {Object} effe
+ * @return {Function}
+ */
+function makeRenderer(effe) {
+ return function(path, options, cb) {
+ options.filename = path;
+ exports.handlebars = {};
+
+ fs.readFile(path, function() {
+ exports.handlebars.render = effe
+ ._render(_.toString(arguments[1]), options)
+ .then(html => cb(null, html));
+ });
+ };
+}
+
+module.exports = function(options) {
+ const effe = new Effe(options);
+ const handlebars = makeRenderer(effe);
+
+ return { handlebars };
+};
diff --git a/lib/render.js b/lib/render.js
index 856447a..6c94e02 100644
--- a/lib/render.js
+++ b/lib/render.js
@@ -34,20 +34,30 @@ const _renderInky = function(htmlContent) {
const render = function(html, options = {}) {
const engine = this.Handlebars;
const page = fm(stripBom(_.toString(html)));
- const layout = page.attributes.layout || 'default';
- const layoutTemplate = this.layouts[layout];
- const date = _.merge(options, page.attributes);
+ let layout = page.attributes.layout || options.layout || 'default';
+ const date = _.merge({}, options, page.attributes);
- return Promise.resolve()
- .then(() => _renderInky(page.body))
+ if (
+ !_.isUndefined(date.filename) &&
+ !_.isNull(date.filename.match(/(text|subject).(hbs|handlebars)/gi))
+ ) {
+ layout = false;
+ }
+
+ return Promise.resolve(page.body)
.then(content => {
+ if (_.isNull(content.match(/<\s*\/?\s*\s*.*?>/g))) {
+ layout = false;
+ }
+ const layoutTemplate = this.layouts[layout];
const pageTemplate = engine.compile(content + '\n');
- if (!_.isUndefined(layoutTemplate)) {
+ if (_.isFunction(layoutTemplate) && layout !== false) {
engine.registerPartial('body', pageTemplate);
return layoutTemplate(date);
}
return pageTemplate(date);
- });
+ })
+ .then(html => _renderInky(html));
};
module.exports = {
diff --git a/package-lock.json b/package-lock.json
index 404178e..b4a9dd9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -28,6 +28,54 @@
"js-tokens": "^3.0.0"
}
},
+ "@ladjs/i18n": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@ladjs/i18n/-/i18n-0.2.0.tgz",
+ "integrity":
+ "sha512-e9gkXFmpoAJfX4louxiX07Yawv8vNEoxvekK0AYWK2HKOFNSNxeJKjNJ80B6CKt1z42P7AESFw17TIsMUMwSqg==",
+ "dev": true,
+ "requires": {
+ "auto-bind": "^1.1.0",
+ "boolean": "^0.1.3",
+ "boom": "5.2.0",
+ "country-language": "^0.1.7",
+ "i18n": "^0.8.3",
+ "i18n-locales": "^0.0.2",
+ "lodash": "^4.17.4",
+ "moment": "^2.18.1",
+ "qs": "^6.5.1",
+ "underscore.string": "^3.3.4"
+ },
+ "dependencies": {
+ "boom": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
+ "integrity":
+ "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
+ "dev": true,
+ "requires": {
+ "hoek": "4.x.x"
+ }
+ }
+ }
+ },
+ "@types/babel-types": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.2.tgz",
+ "integrity":
+ "sha512-ylggu8DwwxT6mk3jVoJeohWAePWMNWEYm06MSoJ19kwp3hT9eY2Z4NNZn3oevzgFmClgNQ2GQF500hPDvNsGHg==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity":
+ "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "*"
+ }
+ },
"@types/node": {
"version": "10.1.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.1.2.tgz",
@@ -39,6 +87,13 @@
"resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
"integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4="
},
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity":
+ "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
"acorn": {
"version": "5.5.3",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
@@ -100,6 +155,28 @@
"repeat-string": "^1.5.2"
}
},
+ "ambi": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ambi/-/ambi-2.5.0.tgz",
+ "integrity": "sha1-fI43K+SIkRV+fOoBy2+RQ9H3QiA=",
+ "dev": true,
+ "requires": {
+ "editions": "^1.1.1",
+ "typechecker": "^4.3.0"
+ },
+ "dependencies": {
+ "typechecker": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-4.5.0.tgz",
+ "integrity":
+ "sha512-bqPE/ck3bVIaXP7gMKTKSHrypT32lpYTpiqzPYeYzdSQnmaGvaGhy7TnN/M/+5R+2rs/kKcp9ZLPRp/Q9Yj+4w==",
+ "dev": true,
+ "requires": {
+ "editions": "^1.3.4"
+ }
+ }
+ }
+ },
"amdefine": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
@@ -536,6 +613,12 @@
"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
"dev": true
},
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+ "dev": true
+ },
"asn1": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
@@ -587,6 +670,13 @@
"integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=",
"dev": true
},
+ "auto-bind": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-1.2.0.tgz",
+ "integrity":
+ "sha512-Zw7pZp7tztvKnWWtoII4AmqH5a2PV3ZN5F0BPRTGcc1kpRm4b6QXQnPU7Znbl6BfPfqOVOV29g4JeMqZQaqqOA==",
+ "dev": true
+ },
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
@@ -969,6 +1059,13 @@
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
"integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
},
+ "boolean": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/boolean/-/boolean-0.1.3.tgz",
+ "integrity":
+ "sha512-G6TadQPFofmOhzkzgtVSOYaosjpnPyVCDeZ4J7oPF74OmhM2++fXUdwu7NULTwgntK5KIMcls1UslwAY2btL6g==",
+ "dev": true
+ },
"boom": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
@@ -1082,8 +1179,7 @@
"camelcase": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
- "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
- "optional": true
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
},
"caseless": {
"version": "0.12.0",
@@ -1094,7 +1190,6 @@
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
"integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
- "optional": true,
"requires": {
"align-text": "^0.1.3",
"lazy-cache": "^1.0.3"
@@ -1135,6 +1230,16 @@
}
}
},
+ "character-parser": {
+ "version": "2.2.0",
+ "resolved":
+ "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
+ "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=",
+ "dev": true,
+ "requires": {
+ "is-regex": "^1.0.3"
+ }
+ },
"chardet": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
@@ -1210,6 +1315,15 @@
}
}
},
+ "clean-css": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz",
+ "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.x"
+ }
+ },
"cli-cursor": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
@@ -1283,7 +1397,6 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
"integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
- "optional": true,
"requires": {
"center-align": "^0.1.1",
"right-align": "^0.1.1",
@@ -1293,8 +1406,7 @@
"wordwrap": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
- "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
- "optional": true
+ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
}
}
},
@@ -1395,6 +1507,29 @@
"typedarray": "^0.0.6"
}
},
+ "consolidate": {
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz",
+ "integrity":
+ "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.1.1"
+ }
+ },
+ "constantinople": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz",
+ "integrity":
+ "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "^7.0.0",
+ "@types/babylon": "^6.16.2",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0"
+ }
+ },
"convert-source-map": {
"version": "1.5.1",
"resolved":
@@ -1444,6 +1579,17 @@
}
}
},
+ "country-language": {
+ "version": "0.1.7",
+ "resolved":
+ "https://registry.npmjs.org/country-language/-/country-language-0.1.7.tgz",
+ "integrity": "sha1-eHD0uhJduaYHHxlze9nvk0OuNds=",
+ "dev": true,
+ "requires": {
+ "underscore": "~1.7.0",
+ "underscore.deep": "~0.5.1"
+ }
+ },
"coveralls": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.0.tgz",
@@ -1488,6 +1634,13 @@
}
}
},
+ "csextends": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/csextends/-/csextends-1.2.0.tgz",
+ "integrity":
+ "sha512-S/8k1bDTJIwuGgQYmsRoE+8P+ohV32WhQ0l4zqrc0XDdxOhjQQD7/wTZwCzoZX53jSX3V/qwjT+OkPTxWQcmjg==",
+ "dev": true
+ },
"css-select": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
@@ -1537,6 +1690,18 @@
"whatwg-url": "^6.4.0"
}
},
+ "datauri": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/datauri/-/datauri-1.1.0.tgz",
+ "integrity":
+ "sha512-0q+cTTKx7q8eDteZRIQLTFJuiIsVing17UbWTPssY4JLSMaYsk/VKpNulBDo9NSgQWcvlPrkEHW8kUO67T/7mQ==",
+ "dev": true,
+ "requires": {
+ "image-size": "^0.6.2",
+ "mimer": "^0.3.2",
+ "semver": "^5.5.0"
+ }
+ },
"date-fns": {
"version": "1.29.0",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz",
@@ -1572,6 +1737,13 @@
"integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
"dev": true
},
+ "deep-extend": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity":
+ "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==",
+ "dev": true
+ },
"deep-is": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
@@ -1723,6 +1895,12 @@
"esutils": "^2.0.2"
}
},
+ "doctypes": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
+ "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=",
+ "dev": true
+ },
"dom-serializer": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
@@ -1785,6 +1963,15 @@
"stream-shift": "^1.0.0"
}
},
+ "eachr": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/eachr/-/eachr-2.0.4.tgz",
+ "integrity": "sha1-Rm98qhBwj2EFCeMsgHqv5X/BIr8=",
+ "dev": true,
+ "requires": {
+ "typechecker": "^2.0.8"
+ }
+ },
"ecc-jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
@@ -1794,6 +1981,13 @@
"jsbn": "~0.1.0"
}
},
+ "editions": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz",
+ "integrity":
+ "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==",
+ "dev": true
+ },
"elegant-spinner": {
"version": "1.0.1",
"resolved":
@@ -1801,6 +1995,29 @@
"integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=",
"dev": true
},
+ "email-templates": {
+ "version": "4.0.1",
+ "resolved":
+ "https://registry.npmjs.org/email-templates/-/email-templates-4.0.1.tgz",
+ "integrity":
+ "sha512-36C0w0ZznmdxC1/67OZpemdyMvmlWTcXkpCrt8ALcDSPKxrWGjHhBmXbVEBBBtwhcIHqrnGgEWPgYwVB2z/vew==",
+ "dev": true,
+ "requires": {
+ "@ladjs/i18n": "^0.2.0",
+ "auto-bind": "^1.2.0",
+ "bluebird": "^3.5.1",
+ "consolidate": "^0.15.1",
+ "debug": "^3.1.0",
+ "fs-extra": "^6.0.1",
+ "get-paths": "^0.0.2",
+ "html-to-text": "^4.0.0",
+ "juice": "^4.2.3",
+ "juice-resources-promise": "^0.0.2",
+ "lodash": "^4.17.10",
+ "nodemailer": "^4.6.4",
+ "preview-email": "^0.0.7"
+ }
+ },
"end-of-stream": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
@@ -2162,6 +2379,23 @@
}
}
},
+ "extendr": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/extendr/-/extendr-2.1.0.tgz",
+ "integrity": "sha1-MBqgu+pWX00tyPVw8qImEahSe1Y=",
+ "dev": true,
+ "requires": {
+ "typechecker": "~2.0.1"
+ },
+ "dependencies": {
+ "typechecker": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-2.0.8.tgz",
+ "integrity": "sha1-6D2oS7ZMWEzLNFg4V2xAsDN9uC4=",
+ "dev": true
+ }
+ }
+ },
"external-editor": {
"version": "2.2.0",
"resolved":
@@ -2183,6 +2417,23 @@
"is-extglob": "^1.0.0"
}
},
+ "extract-opts": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/extract-opts/-/extract-opts-2.2.0.tgz",
+ "integrity": "sha1-H6KOunNSxttID4hc63GkaBC+bX0=",
+ "dev": true,
+ "requires": {
+ "typechecker": "~2.0.1"
+ },
+ "dependencies": {
+ "typechecker": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-2.0.8.tgz",
+ "integrity": "sha1-6D2oS7ZMWEzLNFg4V2xAsDN9uC4=",
+ "dev": true
+ }
+ }
+ },
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
@@ -2360,6 +2611,18 @@
"js-yaml": "^3.10.0"
}
},
+ "fs-extra": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
+ "integrity":
+ "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -2924,6 +3187,30 @@
"sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug==",
"dev": true
},
+ "get-paths": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/get-paths/-/get-paths-0.0.2.tgz",
+ "integrity":
+ "sha512-cB/Yr1D8Ug9IzBqor1maxVCOtcaQgUBZpZtq6Mf9RKkyRe6ohEdgx/zMLcPcOaXaegxNIt2vSij8YcuZGF3tXA==",
+ "dev": true,
+ "requires": {
+ "fs-extra": "^4.0.2"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
+ "integrity":
+ "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ }
+ }
+ },
"get-stdin": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz",
@@ -3090,6 +3377,13 @@
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
},
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "resolved":
+ "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+ "dev": true
+ },
"growly": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
@@ -3255,6 +3549,12 @@
"sntp": "2.x.x"
}
},
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "dev": true
+ },
"hoek": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
@@ -3290,6 +3590,19 @@
"whatwg-encoding": "^1.0.1"
}
},
+ "html-to-text": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-4.0.0.tgz",
+ "integrity":
+ "sha512-QQl5EEd97h6+3crtgBhkEAO6sQnZyDff8DAeJzoSkOc1Dqe1UvTUZER0B+KjBe6fPZqq549l2VUhtracus3ndA==",
+ "dev": true,
+ "requires": {
+ "he": "^1.0.0",
+ "htmlparser2": "^3.9.2",
+ "lodash": "^4.17.4",
+ "optimist": "^0.6.1"
+ }
+ },
"htmlparser2": {
"version": "3.9.2",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
@@ -3325,6 +3638,27 @@
"strip-indent": "^2.0.0"
}
},
+ "i18n": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.8.3.tgz",
+ "integrity": "sha1-LYzxwkciYCwgQdAbpq5eqlE4jw4=",
+ "dev": true,
+ "requires": {
+ "debug": "*",
+ "make-plural": "^3.0.3",
+ "math-interval-parser": "^1.1.0",
+ "messageformat": "^0.3.1",
+ "mustache": "*",
+ "sprintf-js": ">=1.0.3"
+ }
+ },
+ "i18n-locales": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/i18n-locales/-/i18n-locales-0.0.2.tgz",
+ "integrity":
+ "sha512-WCaJVIfU10v0/ZNy+mG7fCUQb1o2PsM7tNf1dUg0uU9OxtygDkWRqLT9Q/X30V2XsUb6XUEPbSsdUiORfDPVQA==",
+ "dev": true
+ },
"iconv-lite": {
"version": "0.4.23",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
@@ -3342,6 +3676,29 @@
"sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==",
"dev": true
},
+ "ignorefs": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/ignorefs/-/ignorefs-1.2.0.tgz",
+ "integrity": "sha1-2ln7hYl25KXkNwLM0fKC/byeV1Y=",
+ "dev": true,
+ "requires": {
+ "editions": "^1.3.3",
+ "ignorepatterns": "^1.1.0"
+ }
+ },
+ "ignorepatterns": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ignorepatterns/-/ignorepatterns-1.1.0.tgz",
+ "integrity": "sha1-rI9DbyI5td+2bV8NOpBKh6xnzF4=",
+ "dev": true
+ },
+ "image-size": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.2.tgz",
+ "integrity":
+ "sha512-pH3vDzpczdsKHdZ9xxR3O46unSjisgVx0IImay7Zz2EdhRVbCkj+nthx9OuuWEhakx9FAO+fNVGrF0rZ2oMOvw==",
+ "dev": true
+ },
"import-local": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz",
@@ -3662,6 +4019,24 @@
"is-primitive": "^2.0.0"
}
},
+ "is-expression": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz",
+ "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=",
+ "dev": true,
+ "requires": {
+ "acorn": "~4.0.2",
+ "object-assign": "^4.0.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+ "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
+ "dev": true
+ }
+ }
+ },
"is-extendable": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
@@ -3861,6 +4236,12 @@
"sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
"dev": true
},
+ "is-wsl": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+ "dev": true
+ },
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -4429,6 +4810,12 @@
"merge-stream": "^1.0.1"
}
},
+ "js-stringify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
+ "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=",
+ "dev": true
+ },
"js-tokens": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
@@ -4539,6 +4926,15 @@
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
"dev": true
},
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
"jsonify": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
@@ -4555,6 +4951,75 @@
"verror": "1.10.0"
}
},
+ "jstransformer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
+ "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=",
+ "dev": true,
+ "requires": {
+ "is-promise": "^2.0.0",
+ "promise": "^7.0.1"
+ }
+ },
+ "juice": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/juice/-/juice-4.2.3.tgz",
+ "integrity":
+ "sha512-Jisv2A20k7y/aqLpEevSm0E+1JfWmd13jY2s5aST54cHJQKHkKES2RlDtkdOM/ecGnvUKAjG/j+KcDbkzoGjKg==",
+ "dev": true,
+ "requires": {
+ "cheerio": "^0.22.0",
+ "commander": "2.9.0",
+ "cross-spawn": "^5.0.1",
+ "deep-extend": "^0.5.0",
+ "mensch": "^0.3.3",
+ "slick": "1.12.2",
+ "web-resource-inliner": "^4.2.0"
+ },
+ "dependencies": {
+ "cheerio": {
+ "version": "0.22.0",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz",
+ "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=",
+ "dev": true,
+ "requires": {
+ "css-select": "~1.2.0",
+ "dom-serializer": "~0.1.0",
+ "entities": "~1.1.1",
+ "htmlparser2": "^3.9.1",
+ "lodash.assignin": "^4.0.9",
+ "lodash.bind": "^4.1.4",
+ "lodash.defaults": "^4.0.1",
+ "lodash.filter": "^4.4.0",
+ "lodash.flatten": "^4.2.0",
+ "lodash.foreach": "^4.3.0",
+ "lodash.map": "^4.4.0",
+ "lodash.merge": "^4.4.0",
+ "lodash.pick": "^4.2.1",
+ "lodash.reduce": "^4.4.0",
+ "lodash.reject": "^4.4.0",
+ "lodash.some": "^4.4.0"
+ }
+ },
+ "commander": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+ "dev": true,
+ "requires": {
+ "graceful-readlink": ">= 1.0.0"
+ }
+ }
+ }
+ },
+ "juice-resources-promise": {
+ "version": "0.0.2",
+ "resolved":
+ "https://registry.npmjs.org/juice-resources-promise/-/juice-resources-promise-0.0.2.tgz",
+ "integrity":
+ "sha512-uR4TbzKwK4bHm8bfhdFVbhcJBwdyG0aHZ4YF4WOW4VO0DRMPaFeI1Z67X+w8FRt7fdN45mbhDberlHd+6tJ6uA==",
+ "dev": true
+ },
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
@@ -4566,8 +5031,7 @@
"lazy-cache": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
- "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
- "optional": true
+ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
},
"lazystream": {
"version": "1.0.0",
@@ -4986,20 +5450,102 @@
"integrity":
"sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
},
- "lodash.isequal": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
- "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
+ "lodash.assignin": {
+ "version": "4.2.0",
+ "resolved":
+ "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz",
+ "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=",
+ "dev": true
},
- "lodash.sortby": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
- "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "lodash.bind": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz",
+ "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=",
"dev": true
},
- "log-driver": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz",
+ "lodash.defaults": {
+ "version": "4.2.0",
+ "resolved":
+ "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+ "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
+ "dev": true
+ },
+ "lodash.filter": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz",
+ "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=",
+ "dev": true
+ },
+ "lodash.flatten": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+ "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
+ "dev": true
+ },
+ "lodash.foreach": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
+ "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=",
+ "dev": true
+ },
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
+ },
+ "lodash.map": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz",
+ "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=",
+ "dev": true
+ },
+ "lodash.merge": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz",
+ "integrity":
+ "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==",
+ "dev": true
+ },
+ "lodash.pick": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
+ "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=",
+ "dev": true
+ },
+ "lodash.reduce": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz",
+ "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=",
+ "dev": true
+ },
+ "lodash.reject": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz",
+ "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=",
+ "dev": true
+ },
+ "lodash.some": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
+ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "lodash.unescape": {
+ "version": "4.0.1",
+ "resolved":
+ "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz",
+ "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=",
+ "dev": true
+ },
+ "log-driver": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz",
"integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=",
"dev": true
},
@@ -5082,6 +5628,15 @@
"yallist": "^2.1.2"
}
},
+ "make-plural": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-3.0.6.tgz",
+ "integrity": "sha1-IDOgO6wpC487uRJY9lud9+iwHKc=",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
"makeerror": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
@@ -5106,6 +5661,16 @@
"object-visit": "^1.0.0"
}
},
+ "math-interval-parser": {
+ "version": "1.1.0",
+ "resolved":
+ "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-1.1.0.tgz",
+ "integrity": "sha1-2+2lsGsySZc8bfYXD94jhvCv2JM=",
+ "dev": true,
+ "requires": {
+ "xregexp": "^2.0.0"
+ }
+ },
"mem": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
@@ -5115,6 +5680,12 @@
"mimic-fn": "^1.0.0"
}
},
+ "mensch": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.3.tgz",
+ "integrity": "sha1-4gD/TdgjcX+OBWOzLj9UgfyiYrI=",
+ "dev": true
+ },
"merge": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz",
@@ -5129,6 +5700,40 @@
"readable-stream": "^2.0.1"
}
},
+ "messageformat": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-0.3.1.tgz",
+ "integrity": "sha1-5Y//gkXps5cXmeW0PbWLPpQX9aI=",
+ "dev": true,
+ "requires": {
+ "async": "~1.5.2",
+ "glob": "~6.0.4",
+ "make-plural": "~3.0.3",
+ "nopt": "~3.0.6",
+ "watchr": "~2.4.13"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ },
+ "glob": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
+ "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
+ "dev": true,
+ "requires": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
+ }
+ },
"micromatch": {
"version": "2.3.11",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
@@ -5175,6 +5780,13 @@
"mime-db": "~1.33.0"
}
},
+ "mimer": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/mimer/-/mimer-0.3.2.tgz",
+ "integrity":
+ "sha512-N6NcgDQAevhP/02DQ/epK6daLy4NKrIHyTlJcO6qBiYn98q+Y4a/knNsAATCe1xLS2F0nEmJp+QYli2s8vKwyQ==",
+ "dev": true
+ },
"mimic-fn": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
@@ -5236,12 +5848,25 @@
}
}
},
+ "moment": {
+ "version": "2.22.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz",
+ "integrity":
+ "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==",
+ "dev": true
+ },
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
+ "mustache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz",
+ "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=",
+ "dev": true
+ },
"mute-stream": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
@@ -5324,6 +5949,22 @@
"which": "^1.3.0"
}
},
+ "nodemailer": {
+ "version": "4.6.5",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.6.5.tgz",
+ "integrity":
+ "sha512-+bt+BgmnOXDz1uIaWXfXuTESth8UHkhtu7+X8+X2W+CHAn0AuuCyCk854qnathYQLWEC2jkpx7/pkVHcfmLKDw==",
+ "dev": true
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1"
+ }
+ },
"normalize-package-data": {
"version": "2.4.0",
"resolved":
@@ -5801,6 +6442,16 @@
"mimic-fn": "^1.0.0"
}
},
+ "opn": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
+ "integrity":
+ "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==",
+ "dev": true,
+ "requires": {
+ "is-wsl": "^1.1.0"
+ }
+ },
"optimist": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
@@ -6150,6 +6801,35 @@
}
}
},
+ "preview-email": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/preview-email/-/preview-email-0.0.7.tgz",
+ "integrity":
+ "sha512-VBXartEr84WVw5kWTe6y1gDzF1+HWX+GDZ0NGOyGjRq2V5tZr1o8gMLa5lxc7da3IQ7Xy4yd0a8o4zgpb+uisA==",
+ "dev": true,
+ "requires": {
+ "fs-extra": "^4.0.2",
+ "moment": "^2.18.1",
+ "nodemailer": "^4.2.0",
+ "opn": "^5.1.0",
+ "pug": "^2.0.0-rc.4",
+ "uuid": "^3.1.0"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
+ "integrity":
+ "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ }
+ }
+ },
"private": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
@@ -6170,12 +6850,149 @@
"integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
"dev": true
},
+ "promise": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+ "integrity":
+ "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+ "dev": true,
+ "requires": {
+ "asap": "~2.0.3"
+ }
+ },
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
"dev": true
},
+ "pug": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.3.tgz",
+ "integrity": "sha1-ccuoJTfJWl6rftBGluQiH1Oqh44=",
+ "dev": true,
+ "requires": {
+ "pug-code-gen": "^2.0.1",
+ "pug-filters": "^3.1.0",
+ "pug-lexer": "^4.0.0",
+ "pug-linker": "^3.0.5",
+ "pug-load": "^2.0.11",
+ "pug-parser": "^5.0.0",
+ "pug-runtime": "^2.0.4",
+ "pug-strip-comments": "^1.0.3"
+ }
+ },
+ "pug-attrs": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.3.tgz",
+ "integrity": "sha1-owlflw5kFR972tlX7vVftdeQXRU=",
+ "dev": true,
+ "requires": {
+ "constantinople": "^3.0.1",
+ "js-stringify": "^1.0.1",
+ "pug-runtime": "^2.0.4"
+ }
+ },
+ "pug-code-gen": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.1.tgz",
+ "integrity": "sha1-CVHsgyJddNjPxHan+Zolm199BQw=",
+ "dev": true,
+ "requires": {
+ "constantinople": "^3.0.1",
+ "doctypes": "^1.1.0",
+ "js-stringify": "^1.0.1",
+ "pug-attrs": "^2.0.3",
+ "pug-error": "^1.3.2",
+ "pug-runtime": "^2.0.4",
+ "void-elements": "^2.0.1",
+ "with": "^5.0.0"
+ }
+ },
+ "pug-error": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.2.tgz",
+ "integrity": "sha1-U659nSm7A89WRJOgJhCfVMR/XyY=",
+ "dev": true
+ },
+ "pug-filters": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.0.tgz",
+ "integrity": "sha1-JxZVVbwEwjbkqisDZiRt+gIbYm4=",
+ "dev": true,
+ "requires": {
+ "clean-css": "^4.1.11",
+ "constantinople": "^3.0.1",
+ "jstransformer": "1.0.0",
+ "pug-error": "^1.3.2",
+ "pug-walk": "^1.1.7",
+ "resolve": "^1.1.6",
+ "uglify-js": "^2.6.1"
+ }
+ },
+ "pug-lexer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.0.0.tgz",
+ "integrity": "sha1-IQwYRX7y4XYCQnQMXmR715TOwng=",
+ "dev": true,
+ "requires": {
+ "character-parser": "^2.1.1",
+ "is-expression": "^3.0.0",
+ "pug-error": "^1.3.2"
+ }
+ },
+ "pug-linker": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.5.tgz",
+ "integrity": "sha1-npp65ABWgtAn3uuWsAD4juuDoC8=",
+ "dev": true,
+ "requires": {
+ "pug-error": "^1.3.2",
+ "pug-walk": "^1.1.7"
+ }
+ },
+ "pug-load": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.11.tgz",
+ "integrity": "sha1-5kjlftET/iwfRdV4WOorrWvAFSc=",
+ "dev": true,
+ "requires": {
+ "object-assign": "^4.1.0",
+ "pug-walk": "^1.1.7"
+ }
+ },
+ "pug-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.0.tgz",
+ "integrity": "sha1-45Stmz/KkxI5QK/4hcBuRKt+aOQ=",
+ "dev": true,
+ "requires": {
+ "pug-error": "^1.3.2",
+ "token-stream": "0.0.1"
+ }
+ },
+ "pug-runtime": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.4.tgz",
+ "integrity": "sha1-4XjhvaaKsujArPybztLFT9iM61g=",
+ "dev": true
+ },
+ "pug-strip-comments": {
+ "version": "1.0.3",
+ "resolved":
+ "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz",
+ "integrity": "sha1-8VWVkiBu3G+FMQ2s9K+0igJa9Z8=",
+ "dev": true,
+ "requires": {
+ "pug-error": "^1.3.2"
+ }
+ },
+ "pug-walk": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.7.tgz",
+ "integrity": "sha1-wA1cUSi6xYBr7BXSt+fNq+QlMfM=",
+ "dev": true
+ },
"punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
@@ -6500,7 +7317,6 @@
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
"integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
- "optional": true,
"requires": {
"align-text": "^0.1.1"
}
@@ -6541,10 +7357,10 @@
}
},
"rxjs": {
- "version": "5.5.10",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz",
+ "version": "5.5.11",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz",
"integrity":
- "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==",
+ "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==",
"dev": true,
"requires": {
"symbol-observable": "1.0.1"
@@ -6574,6 +7390,15 @@
"ret": "~0.1.10"
}
},
+ "safefs": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/safefs/-/safefs-3.2.2.tgz",
+ "integrity": "sha1-gXDBRE1wOOCMrqBaN0+uL6NJ4Vw=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "*"
+ }
+ },
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -6912,6 +7737,17 @@
"integrity":
"sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
+ "scandirectory": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/scandirectory/-/scandirectory-2.5.0.tgz",
+ "integrity": "sha1-bOA/VKCQtmjjy+2/IO354xBZPnI=",
+ "dev": true,
+ "requires": {
+ "ignorefs": "^1.0.0",
+ "safefs": "^3.1.2",
+ "taskgroup": "^4.0.5"
+ }
+ },
"semver": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
@@ -6995,6 +7831,12 @@
"is-fullwidth-code-point": "^2.0.0"
}
},
+ "slick": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz",
+ "integrity": "sha1-vQSN23TefRymkV+qSldXCzVQwtc=",
+ "dev": true
+ },
"snapdragon": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
@@ -7341,11 +8183,11 @@
}
},
"stringify-object": {
- "version": "3.2.1",
+ "version": "3.2.2",
"resolved":
- "https://registry.npmjs.org/stringify-object/-/stringify-object-3.2.1.tgz",
+ "https://registry.npmjs.org/stringify-object/-/stringify-object-3.2.2.tgz",
"integrity":
- "sha512-jPcQYw/52HUPP8uOE4kkjxl5bB9LfHkKCTptIk3qw7ozP5XMIMlHMLjt00GGSwW6DJAf/njY5EU6Vpwl4LlBKQ==",
+ "sha512-O696NF21oLiDy8PhpWu8AEqoZHw++QW6mUv0UvKZe8gWSdSvMXkiLufK7OmnP27Dro4GU5kb9U7JIO0mBuCRQg==",
"dev": true,
"requires": {
"get-own-enumerable-property-symbols": "^2.0.1",
@@ -7452,6 +8294,16 @@
"string-width": "^2.1.1"
}
},
+ "taskgroup": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/taskgroup/-/taskgroup-4.3.1.tgz",
+ "integrity": "sha1-feGT/r12gnPEV3MElwJNUSwnkVo=",
+ "dev": true,
+ "requires": {
+ "ambi": "^2.2.0",
+ "csextends": "^1.0.3"
+ }
+ },
"test-exclude": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz",
@@ -7897,6 +8749,12 @@
}
}
},
+ "token-stream": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz",
+ "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=",
+ "dev": true
+ },
"tough-cookie": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
@@ -7951,6 +8809,12 @@
"prelude-ls": "~1.1.2"
}
},
+ "typechecker": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-2.1.0.tgz",
+ "integrity": "sha1-0cIJOlT/ihn1jP+HfuqlTyJC04M=",
+ "dev": true
+ },
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
@@ -7961,7 +8825,6 @@
"version": "2.8.29",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
"integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
- "optional": true,
"requires": {
"source-map": "~0.5.1",
"uglify-to-browserify": "~1.0.0",
@@ -7972,7 +8835,6 @@
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
- "optional": true,
"requires": {
"camelcase": "^1.0.2",
"cliui": "^2.1.0",
@@ -7989,6 +8851,30 @@
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
"optional": true
},
+ "underscore": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
+ "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=",
+ "dev": true
+ },
+ "underscore.deep": {
+ "version": "0.5.1",
+ "resolved":
+ "https://registry.npmjs.org/underscore.deep/-/underscore.deep-0.5.1.tgz",
+ "integrity": "sha1-ByZx9I1oc1w0Ij/P72PmnlJ2zCs=",
+ "dev": true
+ },
+ "underscore.string": {
+ "version": "3.3.4",
+ "resolved":
+ "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz",
+ "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "^1.0.3",
+ "util-deprecate": "^1.0.2"
+ }
+ },
"union-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
@@ -8034,6 +8920,12 @@
"through2-filter": "^2.0.0"
}
},
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
"unset-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
@@ -8132,6 +9024,13 @@
"resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
"integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY="
},
+ "valid-data-url": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-0.1.6.tgz",
+ "integrity":
+ "sha512-FXg2qXMzfAhZc0y2HzELNfUeiOjPr+52hU1DNBWiJJ2luXD+dD1R9NA48Ug5aj0ibbxroeGDc/RJv6ThiGgkDw==",
+ "dev": true
+ },
"validate-npm-package-license": {
"version": "3.0.3",
"resolved":
@@ -8198,6 +9097,12 @@
}
}
},
+ "void-elements": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
+ "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=",
+ "dev": true
+ },
"w3c-hr-time": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz",
@@ -8226,6 +9131,64 @@
"minimist": "^1.2.0"
}
},
+ "watchr": {
+ "version": "2.4.13",
+ "resolved": "https://registry.npmjs.org/watchr/-/watchr-2.4.13.tgz",
+ "integrity": "sha1-10hHu01vkPYf4sdPn2hmKqDgdgE=",
+ "dev": true,
+ "requires": {
+ "eachr": "^2.0.2",
+ "extendr": "^2.1.0",
+ "extract-opts": "^2.2.0",
+ "ignorefs": "^1.0.0",
+ "safefs": "^3.1.2",
+ "scandirectory": "^2.5.0",
+ "taskgroup": "^4.2.0",
+ "typechecker": "^2.0.8"
+ }
+ },
+ "web-resource-inliner": {
+ "version": "4.2.1",
+ "resolved":
+ "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-4.2.1.tgz",
+ "integrity":
+ "sha512-fOWnBQHVX8zHvEbECDTxtYL0FXIIZZ5H3LWoez8mGopYJK7inEru1kVMDzM1lVdeJBNEqUnNP5FBGxvzuMcwwQ==",
+ "dev": true,
+ "requires": {
+ "async": "^2.1.2",
+ "chalk": "^1.1.3",
+ "datauri": "^1.0.4",
+ "htmlparser2": "^3.9.2",
+ "lodash.unescape": "^4.0.1",
+ "request": "^2.78.0",
+ "valid-data-url": "^0.1.4",
+ "xtend": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ }
+ }
+ },
"webidl-conversions": {
"version": "4.0.2",
"resolved":
@@ -8311,8 +9274,43 @@
"window-size": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
- "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
- "optional": true
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
+ },
+ "with": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz",
+ "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=",
+ "dev": true,
+ "requires": {
+ "acorn": "^3.1.0",
+ "acorn-globals": "^3.0.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+ "dev": true
+ },
+ "acorn-globals": {
+ "version": "3.1.0",
+ "resolved":
+ "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
+ "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=",
+ "dev": true,
+ "requires": {
+ "acorn": "^4.0.4"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+ "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
+ "dev": true
+ }
+ }
+ }
+ }
},
"wordwrap": {
"version": "1.0.0",
@@ -8407,6 +9405,12 @@
"sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
"dev": true
},
+ "xregexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz",
+ "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=",
+ "dev": true
+ },
"xtend": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
diff --git a/package.json b/package.json
index b1118cf..afe1e5e 100644
--- a/package.json
+++ b/package.json
@@ -37,6 +37,7 @@
},
"devDependencies": {
"coveralls": "^3.0.0",
+ "email-templates": "^4.0.1",
"eslint": "^4.19.1",
"eslint-config-prettier": "^2.9.0",
"eslint-config-xo": "^0.20.1",