docx-templates
Advanced tools
Comparing version 4.6.0 to 4.6.1
@@ -0,1 +1,5 @@ | ||
## 4.6.1 (2021-06-01) | ||
* Fix for issue [#213](https://github.com/guigrpa/docx-templates/issues/213): throw an error when user tries to iterate over a non-array in a template with a FOR loop. This used to create an infinite loop. | ||
* Throw `ObjectCommandResultError` when the result of an `INS` command is an Object. This ensures you don't accidentally put `'[object Object]'` in your report. | ||
## 4.6.0 (2021-03-27) | ||
@@ -2,0 +6,0 @@ * Add support for `.docm` (macro-enabled) templates (issue [#195](https://github.com/guigrpa/docx-templates/issues/195)). Thanks @brockfanning! |
@@ -0,1 +1,4 @@ | ||
/** | ||
* Thrown when `rejectNullish` is set to `true` and a command returns `null` or `undefined`. | ||
*/ | ||
export declare class NullishCommandResultError extends Error { | ||
@@ -5,2 +8,9 @@ command: string; | ||
} | ||
/** | ||
* Thrown when the result of an `INS` command is an `Object`. This ensures you don't accidentally put `'[object Object]'` in your report. | ||
*/ | ||
export declare class ObjectCommandResultError extends Error { | ||
command: string; | ||
constructor(command: string); | ||
} | ||
export declare class CommandSyntaxError extends Error { | ||
@@ -7,0 +17,0 @@ command: string; |
@@ -18,3 +18,6 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.TemplateParseError = exports.InternalError = exports.ImageError = exports.CommandExecutionError = exports.InvalidCommandError = exports.CommandSyntaxError = exports.NullishCommandResultError = void 0; | ||
exports.TemplateParseError = exports.InternalError = exports.ImageError = exports.CommandExecutionError = exports.InvalidCommandError = exports.CommandSyntaxError = exports.ObjectCommandResultError = exports.NullishCommandResultError = void 0; | ||
/** | ||
* Thrown when `rejectNullish` is set to `true` and a command returns `null` or `undefined`. | ||
*/ | ||
var NullishCommandResultError = /** @class */ (function (_super) { | ||
@@ -31,2 +34,16 @@ __extends(NullishCommandResultError, _super); | ||
exports.NullishCommandResultError = NullishCommandResultError; | ||
/** | ||
* Thrown when the result of an `INS` command is an `Object`. This ensures you don't accidentally put `'[object Object]'` in your report. | ||
*/ | ||
var ObjectCommandResultError = /** @class */ (function (_super) { | ||
__extends(ObjectCommandResultError, _super); | ||
function ObjectCommandResultError(command) { | ||
var _this = _super.call(this, "Result of command '" + command + "' is an object") || this; | ||
Object.setPrototypeOf(_this, ObjectCommandResultError.prototype); | ||
_this.command = command; | ||
return _this; | ||
} | ||
return ObjectCommandResultError; | ||
}(Error)); | ||
exports.ObjectCommandResultError = ObjectCommandResultError; | ||
var CommandSyntaxError = /** @class */ (function (_super) { | ||
@@ -33,0 +50,0 @@ __extends(CommandSyntaxError, _super); |
import createReport from './main'; | ||
export { listCommands, getMetadata } from './main'; | ||
export { NullishCommandResultError, CommandSyntaxError, InvalidCommandError, CommandExecutionError, ImageError, InternalError, TemplateParseError, } from './errors'; | ||
export { NullishCommandResultError, CommandSyntaxError, InvalidCommandError, CommandExecutionError, ImageError, InternalError, TemplateParseError, ObjectCommandResultError, } from './errors'; | ||
export { createReport }; | ||
export default createReport; |
@@ -6,3 +6,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.createReport = exports.TemplateParseError = exports.InternalError = exports.ImageError = exports.CommandExecutionError = exports.InvalidCommandError = exports.CommandSyntaxError = exports.NullishCommandResultError = exports.getMetadata = exports.listCommands = void 0; | ||
exports.createReport = exports.ObjectCommandResultError = exports.TemplateParseError = exports.InternalError = exports.ImageError = exports.CommandExecutionError = exports.InvalidCommandError = exports.CommandSyntaxError = exports.NullishCommandResultError = exports.getMetadata = exports.listCommands = void 0; | ||
var main_1 = __importDefault(require("./main")); | ||
@@ -21,2 +21,3 @@ exports.createReport = main_1.default; | ||
Object.defineProperty(exports, "TemplateParseError", { enumerable: true, get: function () { return errors_1.TemplateParseError; } }); | ||
Object.defineProperty(exports, "ObjectCommandResultError", { enumerable: true, get: function () { return errors_1.ObjectCommandResultError; } }); | ||
exports.default = main_1.default; |
@@ -436,3 +436,3 @@ "use strict"; | ||
var processCmd = function (data, node, ctx) { return __awaiter(void 0, void 0, void 0, function () { | ||
var cmd, _a, cmdName, cmdRest, aliasMatch, aliasName, fullCmd, result, str, literalXmlDelimiter, img, e_1, pars, html, err_1; | ||
var cmd, _a, cmdName, cmdRest, aliasMatch, aliasName, fullCmd, result, nerr, str, literalXmlDelimiter, img, e_1, pars, html, err_1; | ||
return __generator(this, function (_b) { | ||
@@ -446,3 +446,3 @@ switch (_b.label) { | ||
case 1: | ||
_b.trys.push([1, 28, , 29]); | ||
_b.trys.push([1, 31, , 32]); | ||
_a = splitCommand(cmd), cmdName = _a.cmdName, cmdRest = _a.cmdRest; | ||
@@ -456,3 +456,3 @@ // Seeking query? | ||
if (!(cmdName === 'QUERY' || cmdName === 'CMD_NODE')) return [3 /*break*/, 2]; | ||
return [3 /*break*/, 27]; | ||
return [3 /*break*/, 30]; | ||
case 2: | ||
@@ -467,3 +467,3 @@ if (!(cmdName === 'ALIAS')) return [3 /*break*/, 3]; | ||
debug_1.logger.debug("Defined alias '" + aliasName + "' for: " + fullCmd); | ||
return [3 /*break*/, 27]; | ||
return [3 /*break*/, 30]; | ||
case 3: | ||
@@ -474,10 +474,10 @@ if (!(cmdName === 'FOR' || cmdName === 'IF')) return [3 /*break*/, 5]; | ||
_b.sent(); | ||
return [3 /*break*/, 27]; | ||
return [3 /*break*/, 30]; | ||
case 5: | ||
if (!(cmdName === 'END-FOR' || cmdName === 'END-IF')) return [3 /*break*/, 6]; | ||
processEndForIf(node, ctx, cmd, cmdName, cmdRest); | ||
return [3 /*break*/, 27]; | ||
return [3 /*break*/, 30]; | ||
case 6: | ||
if (!(cmdName === 'INS')) return [3 /*break*/, 9]; | ||
if (!!reportUtils_1.isLoopExploring(ctx)) return [3 /*break*/, 8]; | ||
if (!(cmdName === 'INS')) return [3 /*break*/, 12]; | ||
if (!!reportUtils_1.isLoopExploring(ctx)) return [3 /*break*/, 11]; | ||
return [4 /*yield*/, jsSandbox_1.runUserJsAndGetRaw(data, cmdRest, ctx)]; | ||
@@ -489,2 +489,11 @@ case 7: | ||
} | ||
if (!(typeof result === 'object')) return [3 /*break*/, 10]; | ||
nerr = new errors_1.ObjectCommandResultError(cmdRest); | ||
if (!(ctx.options.errorHandler != null)) return [3 /*break*/, 9]; | ||
return [4 /*yield*/, ctx.options.errorHandler(nerr, cmdRest)]; | ||
case 8: | ||
result = _b.sent(); | ||
return [3 /*break*/, 10]; | ||
case 9: throw nerr; | ||
case 10: | ||
str = String(result); | ||
@@ -496,56 +505,56 @@ if (ctx.options.processLineBreaks) { | ||
return [2 /*return*/, str]; | ||
case 8: return [3 /*break*/, 27]; | ||
case 9: | ||
if (!(cmdName === 'EXEC')) return [3 /*break*/, 12]; | ||
if (!!reportUtils_1.isLoopExploring(ctx)) return [3 /*break*/, 11]; | ||
case 11: return [3 /*break*/, 30]; | ||
case 12: | ||
if (!(cmdName === 'EXEC')) return [3 /*break*/, 15]; | ||
if (!!reportUtils_1.isLoopExploring(ctx)) return [3 /*break*/, 14]; | ||
return [4 /*yield*/, jsSandbox_1.runUserJsAndGetRaw(data, cmdRest, ctx)]; | ||
case 10: | ||
case 13: | ||
_b.sent(); | ||
_b.label = 11; | ||
case 11: return [3 /*break*/, 27]; | ||
case 12: | ||
if (!(cmdName === 'IMAGE')) return [3 /*break*/, 18]; | ||
if (!!reportUtils_1.isLoopExploring(ctx)) return [3 /*break*/, 17]; | ||
_b.label = 14; | ||
case 14: return [3 /*break*/, 30]; | ||
case 15: | ||
if (!(cmdName === 'IMAGE')) return [3 /*break*/, 21]; | ||
if (!!reportUtils_1.isLoopExploring(ctx)) return [3 /*break*/, 20]; | ||
return [4 /*yield*/, jsSandbox_1.runUserJsAndGetRaw(data, cmdRest, ctx)]; | ||
case 13: | ||
case 16: | ||
img = _b.sent(); | ||
if (!(img != null)) return [3 /*break*/, 17]; | ||
_b.label = 14; | ||
case 14: | ||
_b.trys.push([14, 16, , 17]); | ||
if (!(img != null)) return [3 /*break*/, 20]; | ||
_b.label = 17; | ||
case 17: | ||
_b.trys.push([17, 19, , 20]); | ||
return [4 /*yield*/, processImage(ctx, img)]; | ||
case 15: | ||
case 18: | ||
_b.sent(); | ||
return [3 /*break*/, 17]; | ||
case 16: | ||
return [3 /*break*/, 20]; | ||
case 19: | ||
e_1 = _b.sent(); | ||
throw new errors_1.ImageError(e_1.message, cmd); | ||
case 17: return [3 /*break*/, 27]; | ||
case 18: | ||
if (!(cmdName === 'LINK')) return [3 /*break*/, 22]; | ||
if (!!reportUtils_1.isLoopExploring(ctx)) return [3 /*break*/, 21]; | ||
case 20: return [3 /*break*/, 30]; | ||
case 21: | ||
if (!(cmdName === 'LINK')) return [3 /*break*/, 25]; | ||
if (!!reportUtils_1.isLoopExploring(ctx)) return [3 /*break*/, 24]; | ||
return [4 /*yield*/, jsSandbox_1.runUserJsAndGetRaw(data, cmdRest, ctx)]; | ||
case 19: | ||
case 22: | ||
pars = _b.sent(); | ||
if (!(pars != null)) return [3 /*break*/, 21]; | ||
if (!(pars != null)) return [3 /*break*/, 24]; | ||
return [4 /*yield*/, processLink(ctx, pars)]; | ||
case 20: | ||
case 23: | ||
_b.sent(); | ||
_b.label = 21; | ||
case 21: return [3 /*break*/, 27]; | ||
case 22: | ||
if (!(cmdName === 'HTML')) return [3 /*break*/, 26]; | ||
if (!!reportUtils_1.isLoopExploring(ctx)) return [3 /*break*/, 25]; | ||
_b.label = 24; | ||
case 24: return [3 /*break*/, 30]; | ||
case 25: | ||
if (!(cmdName === 'HTML')) return [3 /*break*/, 29]; | ||
if (!!reportUtils_1.isLoopExploring(ctx)) return [3 /*break*/, 28]; | ||
return [4 /*yield*/, jsSandbox_1.runUserJsAndGetRaw(data, cmdRest, ctx)]; | ||
case 23: | ||
case 26: | ||
html = _b.sent(); | ||
if (!(html != null)) return [3 /*break*/, 25]; | ||
if (!(html != null)) return [3 /*break*/, 28]; | ||
return [4 /*yield*/, processHtml(ctx, html)]; | ||
case 24: | ||
case 27: | ||
_b.sent(); | ||
_b.label = 25; | ||
case 25: return [3 /*break*/, 27]; | ||
case 26: throw new errors_1.CommandSyntaxError(cmd); | ||
case 27: return [2 /*return*/]; | ||
case 28: | ||
_b.label = 28; | ||
case 28: return [3 /*break*/, 30]; | ||
case 29: throw new errors_1.CommandSyntaxError(cmd); | ||
case 30: return [2 /*return*/]; | ||
case 31: | ||
err_1 = _b.sent(); | ||
@@ -556,3 +565,3 @@ if (ctx.options.errorHandler != null) { | ||
return [2 /*return*/, err_1]; | ||
case 29: return [2 /*return*/]; | ||
case 32: return [2 /*return*/]; | ||
} | ||
@@ -648,2 +657,4 @@ }); | ||
loopOver = _a.sent(); | ||
if (!Array.isArray(loopOver)) | ||
throw new errors_1.InvalidCommandError('Invalid FOR command (can only iterate over Array)', cmd); | ||
_a.label = 5; | ||
@@ -650,0 +661,0 @@ case 5: |
{ | ||
"name": "docx-templates", | ||
"version": "4.6.0", | ||
"version": "4.6.1", | ||
"description": "Template-based docx report creation", | ||
@@ -5,0 +5,0 @@ "main": "lib/index.js", |
@@ -477,2 +477,3 @@ # Docx-templates [![Build Status](https://travis-ci.org/guigrpa/docx-templates.svg)](https://travis-ci.org/guigrpa/docx-templates) [![Coverage Status](https://coveralls.io/repos/github/guigrpa/docx-templates/badge.svg?branch=master)](https://coveralls.io/github/guigrpa/docx-templates?branch=master) [![npm version](https://img.shields.io/npm/v/docx-templates.svg)](https://www.npmjs.com/package/docx-templates) | ||
NullishCommandResultError // thrown when rejectNullish is set to true and a command returns null or undefined | ||
ObjectCommandResultError // thrown when the result of an `INS` command is an Object. This ensures you don't accidentally put `'[object Object]'` in your report. | ||
CommandSyntaxError | ||
@@ -479,0 +480,0 @@ InvalidCommandError |
151756
2536
578