diff --git a/.eslintrc b/.eslintrc index 45a0f3bf..a9617d03 100644 --- a/.eslintrc +++ b/.eslintrc @@ -6,6 +6,7 @@ "modules": true }, "env": { + "es6": true, "node": true }, "globals": { diff --git a/package-lock.json b/package-lock.json index bcd2e82d..964ae815 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,47 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@bigcommerce/handlebars-v4": { + "version": "github:bigcommerce/handlebars-v4#89c779943955795b4f6d40cdb71a6aeb4b5d312c", + "from": "github:bigcommerce/handlebars-v4#v4.0.14", + "requires": { + "handlebars": "4.0.14" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "optional": true + }, + "handlebars": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.14.tgz", + "integrity": "sha512-E7tDoyAA8ilZIV3xDJgl18sX3M8xB9/fMw8+mfW4msLW8jlX97bAnWgT3pmaNXuvzIEgSBMnAHfuXsB2hdzfow==", + "requires": { + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "optional": true, + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + } + } + } + }, "@bigcommerce/node-sass": { "version": "git://github.com/bigcommerce-labs/node-sass.git#4ea0b8d5f7c418d5bf20b07e395b2609e020bb8b", "from": "@bigcommerce/node-sass@git://github.com/bigcommerce-labs/node-sass.git#4ea0b8d5f7c418d5bf20b07e395b2609e020bb8b", @@ -39,26 +80,36 @@ } }, "@bigcommerce/stencil-paper": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@bigcommerce/stencil-paper/-/stencil-paper-2.0.18.tgz", - "integrity": "sha512-2k+4aBZYbpB69bXUziLAh1xYoevWvQr4YuDHKxNUM53InupvHnv3Y/FO7y28DTuV8wokud5bNG3vLGCyBlzzLg==", + "version": "3.0.0-rc.19", + "resolved": "https://registry.npmjs.org/@bigcommerce/stencil-paper/-/stencil-paper-3.0.0-rc.19.tgz", + "integrity": "sha512-AEeajaEMHFp+LGHEv0aqk4yvm0ufABTvgeSHP5TkmAP4l5naEtHDL2sUwYyfMm2vTOmbiA3AAh+svCh0alcnRw==", + "requires": { + "@bigcommerce/stencil-paper-handlebars": "~4.2.0", + "accept-language-parser": "~1.4.1", + "lodash": "~3.10.1", + "messageformat": "~0.2.2" + }, + "dependencies": { + "accept-language-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/accept-language-parser/-/accept-language-parser-1.4.1.tgz", + "integrity": "sha1-OHdPqbgtHzj3MVr0QxZaIZDMgnY=" + } + } + }, + "@bigcommerce/stencil-paper-handlebars": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@bigcommerce/stencil-paper-handlebars/-/stencil-paper-handlebars-4.2.0.tgz", + "integrity": "sha512-I5WPgPto+fFN+X6jI++sy6vB+k7COitcm3UfzuepCcH5Ibi9rXPrZB42xUsgTfkpX2ejgtPhu4fPgi8uua5Olg==", "requires": { - "accept-language-parser": "^1.0.2", - "async": "^1.4.2", + "@bigcommerce/handlebars-v4": "github:bigcommerce/handlebars-v4#89c779943955795b4f6d40cdb71a6aeb4b5d312c", "handlebars": "3.0.7", - "handlebars-helpers": "^0.8.0", + "handlebars-helpers": "0.8.4", "handlebars-utils": "^1.0.6", - "lodash": "^3.6.0", - "messageformat": "^0.2.2", - "stringz": "^0.1.1", - "tarjan-graph": "^0.3.0" + "lodash": "^4.17.13", + "stringz": "^0.1.1" }, "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, "handlebars": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-3.0.7.tgz", @@ -68,6 +119,11 @@ "source-map": "^0.1.40", "uglify-js": "^2.6" } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" } } }, @@ -9605,17 +9661,6 @@ "hoek": "2.x.x", "joi": "6.x.x", "wreck": "5.x.x" - }, - "dependencies": { - "wreck": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/wreck/-/wreck-5.6.1.tgz", - "integrity": "sha1-r/ADBAATiJ11YZtccYcN0qjdBpo=", - "requires": { - "boom": "2.x.x", - "hoek": "2.x.x" - } - } } }, "heavy": { @@ -9626,19 +9671,6 @@ "boom": "2.x.x", "hoek": "2.x.x", "joi": "5.x.x" - }, - "dependencies": { - "joi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-5.1.0.tgz", - "integrity": "sha1-FSrQfbjunGQBmX/1/SwSiWBwv1g=", - "requires": { - "hoek": "^2.2.x", - "isemail": "1.x.x", - "moment": "2.x.x", - "topo": "1.x.x" - } - } } }, "hoek": { diff --git a/package.json b/package.json index 2e8c05c6..0a0c460b 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ }, "homepage": "https://github.com/bigcommerce/stencil-cli", "dependencies": { - "@bigcommerce/stencil-paper": "^2.0.18", + "@bigcommerce/stencil-paper": "3.0.0-rc.19", "@bigcommerce/stencil-styles": "1.1.0", "accept-language-parser": "^1.0.2", "archiver": "^0.14.4", diff --git a/server/plugins/renderer/renderer.module.js b/server/plugins/renderer/renderer.module.js index 5a6381e7..239d3259 100644 --- a/server/plugins/renderer/renderer.module.js +++ b/server/plugins/renderer/renderer.module.js @@ -458,24 +458,33 @@ internals.getHeaders = function (request, options, config) { * @type {Object} */ internals.themeAssembler = { - getTemplates: (path, processor, callback) => { - TemplateAssembler.assemble(internals.getThemeTemplatesPath(), path, (err, templates) => { - if (templates[path]) { - // Check if the string includes frontmatter configuration and remove it - var match = templates[path].match(/---\r?\n[\S\s]*\r?\n---\r?\n([\S\s]*)$/); - - if (_.isObject(match) && match[1]) { - templates[path] = match[1]; + getTemplates: (path, processor) => { + return new Promise((resolve, reject) => { + TemplateAssembler.assemble(internals.getThemeTemplatesPath(), path, (err, templates) => { + if (err) { + return reject(err); } - } + if (templates[path]) { + // Check if the string includes frontmatter configuration and remove it + const match = templates[path].match(/---\r?\n[\S\s]*\r?\n---\r?\n([\S\s]*)$/); - callback(null, processor(templates)); - }); + if (_.isObject(match) && match[1]) { + templates[path] = match[1]; + } + } + return resolve(processor(templates)); + }); + }) }, - getTranslations: (callback) => { - LangAssembler.assemble((err, translations) => { - callback(null, _.mapValues(translations, locales => JSON.parse(locales))); - }); + getTranslations: () => { + return new Promise((resolve, reject) => { + LangAssembler.assemble((err, translations) => { + if (err) { + return reject(err); + } + return resolve(_.mapValues(translations, locales => JSON.parse(locales))); + }); + }) }, }; diff --git a/server/plugins/renderer/responses/pencil-response.js b/server/plugins/renderer/responses/pencil-response.js index ea6260db..28b8a84c 100644 --- a/server/plugins/renderer/responses/pencil-response.js +++ b/server/plugins/renderer/responses/pencil-response.js @@ -4,12 +4,7 @@ const internals = {}; module.exports = function (data, assembler) { this.respond = function (request, reply) { - var response, - output, - paper, - templatePath; - - var paper = new Paper(data.context.settings, data.context.theme_settings, assembler); + const paper = new Paper(data.context.settings, data.context.theme_settings, assembler, "handlebars-v3"); // Set the environment to dev data.context.in_development = true; @@ -22,21 +17,21 @@ module.exports = function (data, assembler) { paper.addDecorator(decorator); }) - templatePath = internals.getTemplatePath(request, data); + const templatePath = internals.getTemplatePath(request, data); - paper.loadTheme(templatePath, data.acceptLanguage, function () { + paper.loadTheme(templatePath, data.acceptLanguage).then(() => { if (request.query.debug === 'context') { return reply(data.context); } - output = paper.renderTheme(templatePath, data); - response = reply(output); + const output = paper.renderTheme(templatePath, data); + const response = reply(output); response.code(data.statusCode); if (data.headers['set-cookie']) { response.header('set-cookie', data.headers['set-cookie']); } - }); + }).catch(err => console.error(err.message.red)); }; };