Skip to content

Commit 06d3580

Browse files
authored
fix: add precompile error for renderString (#322)
1 parent 615f7d4 commit 06d3580

3 files changed

Lines changed: 14 additions & 7 deletions

File tree

index.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const HandlebarsV4 = require('@bigcommerce/handlebars-v4');
44
const helpers = require('./helpers');
55

66
const AppError = require('./lib/appError');
7-
const { CompileError, FormatError, RenderError, DecoratorError, TemplateNotFoundError, ValidationError } = require('./lib/errors');
7+
const { CompileError, FormatError, RenderError, DecoratorError, TemplateNotFoundError, ValidationError, PrecompileError } = require('./lib/errors');
88

99
const handlebarsOptions = {
1010
preventIndent: true
@@ -23,6 +23,7 @@ class HandlebarsRenderer {
2323
DecoratorError,
2424
TemplateNotFoundError,
2525
ValidationError,
26+
PrecompileError,
2627
};
2728
}
2829

@@ -335,17 +336,21 @@ class HandlebarsRenderer {
335336
*/
336337
renderString(template, context) {
337338
return new Promise((resolve, reject) => {
338-
let precompiledTemplate;
339+
let precompiled, precompiledTemplate;
339340
context = context || {};
340341

341342
if (typeof template !== 'string') {
342343
return reject(new CompileError('Template must be a string'));
343344
}
344345

345-
// Compile the template
346346
try {
347347
delete this.handlebars.compile;
348-
const precompiled = this.handlebars.precompile(template, handlebarsOptions);
348+
precompiled = this.handlebars.precompile(template, handlebarsOptions);
349+
} catch (e) {
350+
return reject(new PrecompileError(e.message));
351+
}
352+
353+
try {
349354
eval(`precompiledTemplate = ${precompiled}`);
350355
template = this.handlebars.template(precompiledTemplate);
351356
} catch(e) {

lib/errors.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ class RenderError extends AppError {}; // Error rendering template
66
class DecoratorError extends AppError {}; // Error applying decorator
77
class TemplateNotFoundError extends AppError {}; // Template not registered
88
class ValidationError extends Error {};
9+
class PrecompileError extends Error {};
910

1011
module.exports = {
1112
CompileError,
1213
FormatError,
1314
RenderError,
1415
DecoratorError,
1516
TemplateNotFoundError,
16-
ValidationError
17+
ValidationError,
18+
PrecompileError
1719
};

spec/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -372,9 +372,9 @@ describe('renderString', () => {
372372
});
373373
});
374374

375-
it('throws RenderError if given malformed template', done => {
375+
it('throws PrecompileError if given malformed template', done => {
376376
renderer.renderString('{{', context).catch(e => {
377-
expect(e instanceof HandlebarsRenderer.errors.CompileError).to.be.true();
377+
expect(e instanceof HandlebarsRenderer.errors.PrecompileError).to.be.true();
378378
done();
379379
});
380380
});

0 commit comments

Comments
 (0)