UNPKG

docxtemplater

Version:

Generate docx, pptx, and xlsx from templates (Word, Powerpoint and Excel documents), from Node.js, the Browser and the command line

353 lines (352 loc) 11.5 kB
"use strict"; var _require = require("../utils.js"), expect = _require.expect, expectToThrow = _require.expectToThrow, captureLogs = _require.captureLogs, makeDocxV4 = _require.makeDocxV4, wrapMultiError = _require.wrapMultiError, expectToThrowSnapshot = _require.expectToThrowSnapshot; var Docxtemplater = require("../../docxtemplater.js"); var _Docxtemplater$DocUti = Docxtemplater.DocUtils, traits = _Docxtemplater$DocUti.traits, isContent = _Docxtemplater$DocUti.isContent; var Errors = Docxtemplater.Errors; var XTTemplateError = Errors.XTTemplateError; describe("Traits", function () { it("should work with expandToOne and call onError if multiple tags in same paragraph", function () { var moduleName = "foo_module/foo"; var ignoredErrors = []; var module = { name: "FooModule", requiredAPIVersion: "3.0.0", matchers: function matchers() { return [["__", moduleName]]; }, postparse: function postparse(parsed) { parsed = traits.expandToOne(parsed, { moduleName: moduleName, getInner: function getInner(_ref) { var part = _ref.part, left = _ref.left, right = _ref.right, postparsed = _ref.postparsed, index = _ref.index; var paragraphParts = postparsed.slice(left + 1, right); var error = false; for (var i = 0, len = paragraphParts.length; i < len; i++) { var p = paragraphParts[i]; if (i === index - left - 1) { continue; } if (isContent(p)) { error = true; } } if (error === true) { // This error wil be catched by onError and then ignored (and put into ignoredErrs) var err = new XTTemplateError("Foo tag should be the only text in a paragraph"); throw err; } return part; }, expandTo: "w:p", onError: function onError(opts) { var part = opts.part; ignoredErrors.push("".concat(opts.rootError.name, " ").concat(opts.rootError.message)); if (part.module === moduleName) { return "ignore"; } } }); return parsed; }, render: function render(part) { if (part.module === moduleName) { return { value: "MYVAL" }; } } }; var doc = makeDocxV4("<w:p><w:t>Foo {__user} {__bar}</w:t></w:p>", { modules: [module] }).render(); expect(ignoredErrors).to.deep.equal(["TemplateError Foo tag should be the only text in a paragraph"]); expect(doc.getFullText()).to.be.equal("Foo MYVAL MYVAL"); }); it("should work with expandToOne and call onError if no surrounding paragraphs found", function () { var moduleName = "foo_module/foo"; var ignoredErrors = []; var module = { name: "FooModule", requiredAPIVersion: "3.0.0", matchers: function matchers() { return [["__", moduleName]]; }, postparse: function postparse(parsed) { parsed = traits.expandToOne(parsed, { moduleName: moduleName, expandTo: "w:p", onError: function onError(opts) { var part = opts.part; ignoredErrors.push("".concat(opts.name || opts.rootError.name, " ").concat(opts.message || opts.rootError.message)); if (part.module === moduleName) { return "ignore"; } }, error: { message: "FooModule tag should be the only text in a paragraph", id: "foo_tag_w_p_noexpand" } }); return parsed; }, render: function render(part) { if (part.module === moduleName) { return { value: "MYVAL" }; } } }; var doc = makeDocxV4("<w:t>Foo {__user} {__bar}</w:t></w:p>", { modules: [module] }).render(); expect(ignoredErrors).to.deep.equal(["TemplateError FooModule tag should be the only text in a paragraph", "TemplateError FooModule tag should be the only text in a paragraph"]); expect(doc.getFullText()).to.be.equal("Foo MYVAL MYVAL"); }); it("should just call onError but keep it if the return value is not a string", function () { var moduleName = "foo_module/foo"; var module = { name: "FooModule", requiredAPIVersion: "3.0.0", matchers: function matchers() { return [["__", moduleName]]; }, postparse: function postparse(parsed) { parsed = traits.expandToOne(parsed, { moduleName: moduleName, getInner: function getInner(_ref2) { var part = _ref2.part, left = _ref2.left, right = _ref2.right, postparsed = _ref2.postparsed, index = _ref2.index; var paragraphParts = postparsed.slice(left + 1, right); var error = false; for (var i = 0, len = paragraphParts.length; i < len; i++) { var p = paragraphParts[i]; if (i === index - left - 1) { continue; } if (isContent(p)) { error = true; } } if (error === true) { var err = new XTTemplateError("Foo tag should be the only text in a paragraph"); err.properties = { explanation: "Foo tag", id: "foo_id" }; throw err; } return part; }, expandTo: "w:p", onError: function onError() { // Do nothing with the error return; } }); return parsed; }, render: function render(part) { if (part.module === moduleName) { return { value: "MYVAL" }; } } }; var capture = captureLogs(); expectToThrow(function () { return makeDocxV4("<w:p><w:t>Foo {__user} {__bar}</w:t></w:p>", { modules: [module] }).render(); }, XTTemplateError, wrapMultiError({ name: "TemplateError", message: "Foo tag should be the only text in a paragraph", properties: { id: "foo_id", file: "word/document.xml" } })); capture.stop(); }); it("should just call onError but keep it if the return value is not a string", function () { var moduleName = "foo_module/foo"; var module = { name: "FooModule", requiredAPIVersion: "3.0.0", matchers: function matchers() { return [["__", moduleName]]; }, postparse: function postparse(parsed) { parsed = traits.expandToOne(parsed, { moduleName: moduleName, getInner: function getInner(_ref3) { var part = _ref3.part, left = _ref3.left, right = _ref3.right, postparsed = _ref3.postparsed, index = _ref3.index; var paragraphParts = postparsed.slice(left + 1, right); var error = false; for (var i = 0, len = paragraphParts.length; i < len; i++) { var p = paragraphParts[i]; if (i === index - left - 1) { continue; } if (isContent(p)) { error = true; } } if (error === true) { // This error wil be catched by onError and then ignored (and put into ignoredErrs) var err = new XTTemplateError("Foo tag should be the only text in a paragraph"); err.properties = { explanation: "Hello", id: "foo_id" }; throw err; } return part; }, expandTo: "w:p", onError: function onError() { return ""; } }); return parsed; }, render: function render(part) { if (part.module === moduleName) { return { value: "MYVAL" }; } } }; var capture = captureLogs(); expectToThrowSnapshot(function () { return makeDocxV4("<w:t>Foo {__user} {__bar}</w:t></w:p>", { modules: [module] }).render(); }); capture.stop(); }); it("should just work if onError throws an error", function () { var moduleName = "foo_module/foo"; var module = { name: "FooModule", requiredAPIVersion: "3.0.0", matchers: function matchers() { return [["__", moduleName]]; }, postparse: function postparse(parsed) { parsed = traits.expandToOne(parsed, { moduleName: moduleName, getInner: function getInner(_ref4) { var part = _ref4.part, left = _ref4.left, right = _ref4.right, postparsed = _ref4.postparsed, index = _ref4.index; var paragraphParts = postparsed.slice(left + 1, right); var error = false; for (var i = 0, len = paragraphParts.length; i < len; i++) { var p = paragraphParts[i]; if (i === index - left - 1) { continue; } if (isContent(p)) { error = true; } } if (error === true) { var err = new XTTemplateError("Foo tag should be the only text in a paragraph"); err.properties = { explanation: "Foo tag", id: "foo_id" }; throw err; } return part; }, expandTo: "w:p", onError: function onError() { throw new Error("Other error"); } }); return parsed; }, render: function render(part) { if (part.module === moduleName) { return { value: "MYVAL" }; } } }; var capture = captureLogs(); var expectedError; try { makeDocxV4("<w:p><w:t>Foo {__user} {__bar}</w:t></w:p>", { modules: [module] }).render(); } catch (e) { expectedError = e; } expect(expectedError.message).to.equal("Other error"); capture.stop(); }); it("should just work if getInner throws an error", function () { var moduleName = "foo_module/foo"; var module = { name: "FooModule", requiredAPIVersion: "3.0.0", matchers: function matchers() { return [["__", moduleName]]; }, postparse: function postparse(parsed) { parsed = traits.expandToOne(parsed, { moduleName: moduleName, getInner: function getInner() { throw new Error("Error from inner"); }, expandTo: "w:p" }); return parsed; }, render: function render(part) { if (part.module === moduleName) { return { value: "MYVAL" }; } } }; var capture = captureLogs(); var expectedError; try { makeDocxV4("<w:p><w:t>Foo {__user} {__bar}</w:t></w:p>", { modules: [module] }).render(); } catch (e) { expectedError = e; } expect(expectedError.message).to.equal("Error from inner"); capture.stop(); }); });