From 0598c9705b4427728a33c136dd14802b4ae316ca Mon Sep 17 00:00:00 2001 From: Ayo Ayco Date: Fri, 27 Dec 2024 22:43:05 +0100 Subject: [PATCH] feat: improve evaluation of dynamic content inside {{ }} - evaluate js expressions - fix regex matching skips every other match --- packages/core/event-handler.js | 34 ++++++++++++++++++++++++++-------- site/src/pages/demo.html | 4 ++++ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/packages/core/event-handler.js b/packages/core/event-handler.js index 907f45f..d893aca 100644 --- a/packages/core/event-handler.js +++ b/packages/core/event-handler.js @@ -220,25 +220,43 @@ function evaluateServerScript(html) { Object.assign(setupMap, new evalStore()) }) - const regex = /{{(.*?)}}/g + const regex = /\{\{(.*?)\}\}/g let match while ((match = regex.exec(html))) { - let [key, value] = match - value = value.replace(/\s/g, '') - // nested objects + let [key, rawValue] = match + + const value = rawValue.replace(/\s/g, '') + console.log('>>> value', rawValue) const keys = value.split('.') let finalValue = '' let setupCopy = setupMap - keys.forEach((i) => { - finalValue = setupCopy[i] - setupCopy = finalValue + // if not in the server script, it could be a js expression + if (!(keys[0] in setupMap)) { + try { + console.log('>>> trying to evaluate', rawValue) + finalValue = eval(rawValue) + } catch (e) { + console.error('ERR! Failed to evaluate expression', e) + } + } + + // nested objects + keys.forEach((key) => { + if (key in setupCopy) { + finalValue = setupCopy[key] + setupCopy = finalValue + } }) - html = html.replace(key, finalValue) + html = html.replace(key, finalValue ?? '') + regex.lastIndex = -1 } + console.log('setupMap', setupMap) + console.log('________') + return html } diff --git a/site/src/pages/demo.html b/site/src/pages/demo.html index 49ac3a0..3c1a856 100644 --- a/site/src/pages/demo.html +++ b/site/src/pages/demo.html @@ -17,6 +17,9 @@ function sum(x, y) { return x + y; } + + const hey = 'hey' + const world = 'world' @@ -26,6 +29,7 @@

McFly Demo

+

{{ hey }}, {{ world }} {{1+1}} {{hey}} {{3-2}} {{hey}} {{new Date().toString()}}

This page is in-progress. See the