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}}!

+ +
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}} + + + +{{description}} + + + + +
+
+ {{!-- 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",