diff --git a/CHANGELOG.md b/CHANGELOG.md index 7865b4c9..d82cb642 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.3.17 (WIP) + +* Fix optional chaining not working in EJS code + ## 2.3.16 (2024-02-15) * Trigger `HePlaceholder` render when made & inserted in the DOM manually diff --git a/lib/core/hawkejs.js b/lib/core/hawkejs.js index 5bd03283..039771ff 100644 --- a/lib/core/hawkejs.js +++ b/lib/core/hawkejs.js @@ -942,7 +942,8 @@ Main.setMethod(function parseTemplateSyntax(source, name, wrap_ejs) { */ Main.setMethod(function rewriteVariableReferences(code, scopes, level) { - var result = '', + let prev_value, + result = '', tokens = Fn.tokenize(code, true), token, next, @@ -975,7 +976,7 @@ Main.setMethod(function rewriteVariableReferences(code, scopes, level) { if (token.type == 'name') { // We don't modify property names - if (!prev || (prev && prev.value != '.')) { + if (prev_value != '.' && prev_value != '?.') { if (next && next.type == 'punct' && next.value == ':') { // Skip key names in object literals continue; @@ -1015,6 +1016,7 @@ Main.setMethod(function rewriteVariableReferences(code, scopes, level) { } prev = token; + prev_value = token.value; } for (i = 0; i < tokens.length; i++) { diff --git a/package.json b/package.json index bd0258b6..c5da6546 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "hawkejs", "description": "Asynchronous Embedded JavaScript templates", - "version": "2.3.16", + "version": "2.3.17-alpha", "author": "Jelle De Loecker ", "keywords": [ "template", diff --git a/test/10-expressions.js b/test/10-expressions.js index 82b6f878..6bb48d20 100644 --- a/test/10-expressions.js +++ b/test/10-expressions.js @@ -820,6 +820,30 @@ This should be a converted variable: }); + describe('EJS', function() { + + let tests = [ + [ + `<% if (bla?.bla?.bla) { %>BLA<% } else { %>NO BLA<% } %>`, + `NO BLA` + ], + [ + `<%= test?.two?.three?.four %>`, + `4` + ], + [ + `<%= test?.two?.doesnotexist ?? my_obj?.a %>`, + `a` + ], + [ + `<%= is_null ?? my_obj?.a %>`, + `a` + ], + ]; + + createTests(tests); + }); + return; describe('None existing method calls', function() { @@ -871,6 +895,7 @@ function createTests(tests) { __test : {nested: {value: 'test'}}, c : 'c', str_bla : 'bla', + is_null : null, empty_arr : [], full_arr : [0], single : [0],