olova 2.0.70 → 2.0.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/compiler.js CHANGED
@@ -1026,14 +1026,20 @@ function collectScriptInfo(script) {
1026
1026
  return false;
1027
1027
  }
1028
1028
  let found = false;
1029
- traverse(parseModule(`(${generate2(node).code})`), {
1030
- JSXElement() {
1031
- found = true;
1032
- },
1033
- JSXFragment() {
1034
- found = true;
1035
- }
1036
- });
1029
+ try {
1030
+ const generated = generate2(node).code;
1031
+ const code = t.isBlockStatement(node) ? `(() => ${generated})` : `(${generated})`;
1032
+ traverse(parseModule(code), {
1033
+ JSXElement() {
1034
+ found = true;
1035
+ },
1036
+ JSXFragment() {
1037
+ found = true;
1038
+ }
1039
+ });
1040
+ } catch {
1041
+ found = false;
1042
+ }
1037
1043
  return found;
1038
1044
  };
1039
1045
  traverse(ast, {
@@ -1434,6 +1440,31 @@ function transformExpression(expr, stateNames, allSignalNames, jsxFunctionNames
1434
1440
  containsJsx = containsJsx || expressionProducesHtml(statement.expression);
1435
1441
  return { code: generate2(statement.expression).code, containsJsx };
1436
1442
  }
1443
+ function parseExpressionNode(expr) {
1444
+ try {
1445
+ const ast = parseModule(`(${expr})`);
1446
+ const statement = ast.program.body[0];
1447
+ return statement && t.isExpressionStatement(statement) ? statement.expression : null;
1448
+ } catch {
1449
+ return null;
1450
+ }
1451
+ }
1452
+ function isDirectEventHandlerExpression(node) {
1453
+ return !!(node && (t.isIdentifier(node) || t.isMemberExpression(node) || t.isOptionalMemberExpression(node) || t.isArrowFunctionExpression(node) || t.isFunctionExpression(node)));
1454
+ }
1455
+ function transformEventHandlerExpression(expr, stateNames, allSignalNames, jsxFunctionNames) {
1456
+ const expressionNode = parseExpressionNode(expr);
1457
+ const transformed = transformExpression(
1458
+ expr,
1459
+ stateNames,
1460
+ allSignalNames,
1461
+ jsxFunctionNames
1462
+ ).code;
1463
+ if (isDirectEventHandlerExpression(expressionNode)) {
1464
+ return transformed;
1465
+ }
1466
+ return `($event) => (${transformed})`;
1467
+ }
1437
1468
  function jsxToTemplateHtml(node) {
1438
1469
  if (t.isJSXElement(node)) {
1439
1470
  const opening = node.openingElement;
@@ -1749,12 +1780,12 @@ function transformTemplate(template, stateNames, allSignalNames, jsxFunctionName
1749
1780
  eventBindings.push({
1750
1781
  id: id2,
1751
1782
  event,
1752
- expr: transformExpression(
1783
+ expr: transformEventHandlerExpression(
1753
1784
  expr,
1754
1785
  stateNames,
1755
1786
  allSignalNames,
1756
1787
  jsxFunctionNames
1757
- ).code
1788
+ )
1758
1789
  });
1759
1790
  output += ` data-o-on-${event}="${id2}"`;
1760
1791
  continue;