UNPKG

vtex-cms-sauce

Version:

Tool for handling VTEX CMS requests.

677 lines (561 loc) 21.5 kB
"use strict"; require("@babel/register"); require("@babel/polyfill"); var _readline = _interopRequireDefault(require("readline")); var _fs = require("fs"); var _crypto = require("crypto"); var _formData = _interopRequireDefault(require("form-data")); var _cheerio = _interopRequireDefault(require("cheerio")); var _apisauce = _interopRequireDefault(require("apisauce")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } var ask = function ask(question) { var r = _readline.default.createInterface({ input: process.stdin, output: process.stdout }); return new Promise(function (resolve, reject) { r.question(question + '\n', function (answer) { r.close(); if (answer) resolve(answer);else { reject('No answer!'); } }); }); }; var create = function create(baseURL) { // Create and configure an apisauce-based api object. var api = _apisauce.default.create({ baseURL: baseURL, headers: { 'Cache-Control': 'no-cache', 'Accept': '*/*', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, timeout: 10000 }); // Transforms JSON request data into x-www-form-urlencoded api.addRequestTransform(function (request) { var str = []; for (var p in request.data) { str.push(encodeURIComponent(p) + '=' + encodeURIComponent(request.data[p])); } request.data = str.join('&'); }); var _getAuthCookie = /*#__PURE__*/ function () { var _ref = _asyncToGenerator( /*#__PURE__*/ regeneratorRuntime.mark(function _callee() { var authCookie; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.prev = 0; _context.next = 3; return ask('Insert authentication cookie:'); case 3: authCookie = _context.sent; _getAuthCookie = function _getAuthCookie() { return authCookie; }; return _context.abrupt("return", authCookie); case 8: _context.prev = 8; _context.t0 = _context["catch"](0); console.error(_context.t0); case 11: case "end": return _context.stop(); } } }, _callee, null, [[0, 8]]); })); return function _getAuthCookie() { return _ref.apply(this, arguments); }; }(); var _getTemplateId = function _getTemplateId(templatename) { return (0, _crypto.createHash)('md5').update(templatename).digest('hex'); }; var _getRequestToken = /*#__PURE__*/ function () { var _ref2 = _asyncToGenerator( /*#__PURE__*/ regeneratorRuntime.mark(function _callee2() { var authCookie, _ref3, data, $, requestToken; return regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.prev = 0; _context2.next = 3; return _getAuthCookie(); case 3: authCookie = _context2.sent; api.setHeader('Cookie', "VtexIdclientAutCookie=".concat(authCookie, ";")); _context2.next = 7; return api.post('/admin/a/PortalManagement/AddFile?fileType=css'); case 7: _ref3 = _context2.sent; data = _ref3.data; $ = _cheerio.default.load(data); requestToken = $('#fileUploadRequestToken').val(); if (requestToken) { _context2.next = 13; break; } throw new Error('Couldn\'t get request token!'); case 13: return _context2.abrupt("return", requestToken); case 16: _context2.prev = 16; _context2.t0 = _context2["catch"](0); console.error("Couldn't get request token: ".concat(_context2.t0)); case 19: case "end": return _context2.stop(); } } }, _callee2, null, [[0, 16]]); })); return function _getRequestToken() { return _ref2.apply(this, arguments); }; }(); var _saveTemplate = /*#__PURE__*/ function () { var _ref4 = _asyncToGenerator( /*#__PURE__*/ regeneratorRuntime.mark(function _callee3() { var data, isSub, type, actionForm, authCookie, templateName, templatename, template, templateId, endpoint, _args3 = arguments; return regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: data = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : {}; isSub = _args3.length > 1 ? _args3[1] : undefined; type = _args3.length > 2 ? _args3[2] : undefined; actionForm = _args3.length > 3 && _args3[3] !== undefined ? _args3[3] : 'Save'; _context3.prev = 4; _context3.next = 7; return _getAuthCookie(); case 7: authCookie = _context3.sent; templateName = data.templateName, templatename = data.templatename, template = data.template, templateId = data.templateId; endpoint = type === 'shelf' || type === 'shelfTemplate' ? 'admin/a/PortalManagement/SaveShelfTemplate' : 'admin/a/PortalManagement/SaveTemplate'; if (authCookie) { _context3.next = 12; break; } throw new Error('You must provide a valid auth cookie!'); case 12: if (!(!templatename && !templateName)) { _context3.next = 14; break; } throw new Error('You must provide a name when saving a template!'); case 14: if (template) { _context3.next = 16; break; } throw new Error('You must provide content when saving a template!'); case 16: api.setHeader('Cookie', "VtexIdclientAutCookie=".concat(authCookie, ";")); api.setHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); return _context3.abrupt("return", api.post(endpoint, _objectSpread({}, data, { isSub: isSub, actionForm: actionForm, textConfirm: 'sim' }))); case 21: _context3.prev = 21; _context3.t0 = _context3["catch"](4); console.error(_context3.t0); case 24: case "end": return _context3.stop(); } } }, _callee3, null, [[4, 21]]); })); return function _saveTemplate() { return _ref4.apply(this, arguments); }; }(); var _parseErrorMessage = function _parseErrorMessage(data, templatename) { var x = data.indexOf('<applicationexceptionobject>') + 28; var y = data.indexOf('</applicationexceptionobject>'); var obj = JSON.parse(data.substr(x, y - x)); return "Couldn't save template (".concat(templatename, "): ").concat(obj.message); }; var _getTemplates = /*#__PURE__*/ function () { var _ref5 = _asyncToGenerator( /*#__PURE__*/ regeneratorRuntime.mark(function _callee4(type) { var isSub, key, endpoint, authCookie, _ref6, data, _args4 = arguments; return regeneratorRuntime.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: isSub = _args4.length > 1 && _args4[1] !== undefined ? _args4[1] : false; _context4.prev = 1; _getTemplates.cache = _getTemplates.cache || {}; key = "".concat(type, "-").concat(isSub); endpoint = "admin/a/PortalManagement/GetTemplateList?type=".concat(type, "&IsSub=").concat(isSub ? 1 : 0); _context4.next = 7; return _getAuthCookie(); case 7: authCookie = _context4.sent; api.setHeader('Cookie', "VtexIdclientAutCookie=".concat(authCookie, ";")); api.setHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); if (_getTemplates.cache[key]) { _context4.next = 16; break; } _context4.next = 13; return api.post(endpoint); case 13: _ref6 = _context4.sent; data = _ref6.data; _getTemplates.cache[key] = data; case 16: return _context4.abrupt("return", _getTemplates.cache[key]); case 19: _context4.prev = 19; _context4.t0 = _context4["catch"](1); console.error(_context4.t0); case 22: case "end": return _context4.stop(); } } }, _callee4, null, [[1, 19]]); })); return function _getTemplates(_x) { return _ref5.apply(this, arguments); }; }(); var _getLegacyTemplateId = /*#__PURE__*/ function () { var _ref7 = _asyncToGenerator( /*#__PURE__*/ regeneratorRuntime.mark(function _callee5(reqData, type) { var isSub, templatesList, name, regex, matches, templateId, _args5 = arguments; return regeneratorRuntime.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: isSub = _args5.length > 2 && _args5[2] !== undefined ? _args5[2] : false; _context5.prev = 1; _context5.next = 4; return _getTemplates(type, isSub); case 4: templatesList = _context5.sent; name = reqData.templateName || reqData.templatename; regex = new RegExp("(".concat(name, ")([\\s\\S]+?)(templateId=)([\\s\\S]+?(?=\"))")); matches = templatesList.match(regex); templateId = matches[4]; if (templateId) { _context5.next = 11; break; } throw new Error('template not found!'); case 11: return _context5.abrupt("return", templateId); case 14: _context5.prev = 14; _context5.t0 = _context5["catch"](1); console.error("Couldn't get legacy template id: ".concat(_context5.t0)); case 17: case "end": return _context5.stop(); } } }, _callee5, null, [[1, 14]]); })); return function _getLegacyTemplateId(_x2, _x3) { return _ref7.apply(this, arguments); }; }(); var _saveLegacyTemplate = /*#__PURE__*/ function () { var _ref8 = _asyncToGenerator( /*#__PURE__*/ regeneratorRuntime.mark(function _callee6(reqData) { var type, isSub, action, _args6 = arguments; return regeneratorRuntime.wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: type = _args6.length > 1 && _args6[1] !== undefined ? _args6[1] : 'viewTemplate'; isSub = _args6.length > 2 ? _args6[2] : undefined; _context6.prev = 2; action = type === 'shelfTemplate' ? 'Update' : 'Save'; _context6.next = 6; return _getLegacyTemplateId(reqData, type, isSub); case 6: reqData.templateId = _context6.sent; return _context6.abrupt("return", _saveTemplate(reqData, isSub, type, action)); case 10: _context6.prev = 10; _context6.t0 = _context6["catch"](2); console.error(_context6.t0); case 13: case "end": return _context6.stop(); } } }, _callee6, null, [[2, 10]]); })); return function _saveLegacyTemplate(_x4) { return _ref8.apply(this, arguments); }; }(); var saveShelfTemplate = /*#__PURE__*/ function () { var _ref9 = _asyncToGenerator( /*#__PURE__*/ regeneratorRuntime.mark(function _callee7(templateName, HTML, shelfClass) { var reqData, term, _ref10, status, data, res; return regeneratorRuntime.wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: _context7.prev = 0; reqData = { templateName: templateName, templateId: _getTemplateId(templateName), template: HTML, roundCorners: false, templateCssClass: shelfClass }; term = 'saved'; _context7.next = 5; return _saveTemplate(reqData, true, 'shelf'); case 5: _ref10 = _context7.sent; status = _ref10.status; data = _ref10.data; if (!~data.indexOf('already exists')) { _context7.next = 15; break; } term = 'updated'; _context7.next = 12; return _saveLegacyTemplate(reqData, 'shelfTemplate', true); case 12: res = _context7.sent; status = res.status; data = res.data; case 15: if (!(status.toString().substr(0, 1) !== '2')) { _context7.next = 19; break; } throw new Error("Couldn't save template (".concat(templateName, "). Status: ").concat(status)); case 19: if (!~data.indexOf('originalMessage')) { _context7.next = 21; break; } throw new Error(_parseErrorMessage(data, templateName)); case 21: return _context7.abrupt("return", "Shelf template (".concat(templateName, ") ").concat(term, "!")); case 24: _context7.prev = 24; _context7.t0 = _context7["catch"](0); console.error(_context7.t0); case 27: case "end": return _context7.stop(); } } }, _callee7, null, [[0, 24]]); })); return function saveShelfTemplate(_x5, _x6, _x7) { return _ref9.apply(this, arguments); }; }(); var saveTemplate = /*#__PURE__*/ function () { var _ref11 = _asyncToGenerator( /*#__PURE__*/ regeneratorRuntime.mark(function _callee8(templatename, HTML) { var isSub, reqData, _ref12, status, data, res, _args8 = arguments; return regeneratorRuntime.wrap(function _callee8$(_context8) { while (1) { switch (_context8.prev = _context8.next) { case 0: isSub = _args8.length > 2 && _args8[2] !== undefined ? _args8[2] : false; _context8.prev = 1; reqData = { templatename: templatename, templateId: _getTemplateId(templatename), template: HTML }; _context8.next = 5; return _saveTemplate(reqData, isSub); case 5: _ref12 = _context8.sent; status = _ref12.status; data = _ref12.data; if (!~data.indexOf('already exists')) { _context8.next = 14; break; } _context8.next = 11; return _saveLegacyTemplate(reqData, 'viewTemplate', isSub); case 11: res = _context8.sent; status = res.status; data = res.data; case 14: if (!(status.toString().substr(0, 1) !== '2')) { _context8.next = 18; break; } throw new Error("Couldn't save template (".concat(templatename, "). Status: ").concat(status)); case 18: if (!~data.indexOf('originalMessage')) { _context8.next = 20; break; } throw new Error(_parseErrorMessage(data, templatename)); case 20: return _context8.abrupt("return", "Template (".concat(templatename, ") saved!")); case 23: _context8.prev = 23; _context8.t0 = _context8["catch"](1); console.error(_context8.t0); case 26: case "end": return _context8.stop(); } } }, _callee8, null, [[1, 23]]); })); return function saveTemplate(_x8, _x9) { return _ref11.apply(this, arguments); }; }(); var saveFile = /*#__PURE__*/ function () { var _ref13 = _asyncToGenerator( /*#__PURE__*/ regeneratorRuntime.mark(function _callee9(filepath) { var authCookie, requestToken, host, form, _ref14, statusCode; return regeneratorRuntime.wrap(function _callee9$(_context9) { while (1) { switch (_context9.prev = _context9.next) { case 0: _context9.prev = 0; _context9.next = 3; return _getAuthCookie(); case 3: authCookie = _context9.sent; _context9.next = 6; return _getRequestToken(); case 6: requestToken = _context9.sent; host = baseURL.replace(/(http:|https:|\/)/g, ''); form = new _formData.default(); form.append('Filename', filepath); form.append('fileext', '*.jpg;*.png;*.gif;*.jpeg;*.ico;*.js;*.css'); form.append('folder', '/uploads'); form.append('Upload', 'Submit Query'); form.append('requestToken', requestToken); form.append('Filedata', (0, _fs.createReadStream)(filepath)); _context9.next = 17; return new Promise(function (resolve, reject) { form.submit({ host: host, 'path': '/admin/a/FilePicker/UploadFile', 'headers': { 'Cookie': "VtexIdclientAutCookie=".concat(authCookie, ";"), 'Content-Type': form.getHeaders()['content-type'] } }, function (err, res) { if (err) reject(err); resolve(res); }); }); case 17: _ref14 = _context9.sent; statusCode = _ref14.statusCode; if (!(statusCode.toString().substr(0, 1) !== '2')) { _context9.next = 21; break; } throw new Error("Couldn't save file: ".concat(filepath, " (Error: ").concat(statusCode, ")")); case 21: return _context9.abrupt("return", "File: ".concat(filepath, " saved!")); case 24: _context9.prev = 24; _context9.t0 = _context9["catch"](0); console.error(_context9.t0); case 27: case "end": return _context9.stop(); } } }, _callee9, null, [[0, 24]]); })); return function saveFile(_x10) { return _ref13.apply(this, arguments); }; }(); // The public API return { saveTemplate: saveTemplate, saveShelfTemplate: saveShelfTemplate, saveFile: saveFile }; }; module.exports = { create: create };