{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-synctool/src/client/reactive/babel-plugin-databindings/index.js"],"names":["babel","types","t","template","transformFromAst","traverse","generateDatabindingCode","lhs","expression","path","node","lhsString","AEIdentifier","identifier","loc","arrowFunction","arrowFunctionExpression","start","end","dataBindingInformation","push","objectProperty","booleanLiteral","isMemberExpression","object","property","stringLiteral","name","AECall","callExpression","objectExpression","assignment","assignmentExpression","assignmentFunction","body","onChangeCall","memberExpression","isDatabinding","uniqueAEIdentifier","scope","generateUid","AEVariableDeclaration","variableDeclaration","variableDeclarator","registerMemberExpression","thisExpression","registerIfStatement","ifStatement","logicalExpression","expressionStatement","buildSignal","kind","lively","warn","replaceWith","declarations","map","varDecl","id","reverse","init","insertAfter","buildDatabinding","statements","lvalue","left","uniqueObjectIdentifier","objectAssignmentStatement","uniquePropertyIdentifier","computedProperty","computed","propertyAssignmentStatement","isIdentifier","right","get","getSource","blockStatement","visitor","Program","enter","ppath","state","LabeledStatement","label","isVariableDeclaration","isExpressionStatement","isAssignmentExpression","operator","error"],"mappings":"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","file":"index.js","sourcesContent":["\n\nexport default function (babel) {\n  const { types: t, template, transformFromAst, traverse } = babel;\n\n  const generateDatabindingCode = (lhs, expression, path, node, lhsString) => {\n    const AEIdentifier = t.identifier(\"aexpr\");\n    // When registering the AE, we want to know the code that generated it, which is this entire LabeledStatement\n    AEIdentifier.loc = node.loc;\n    const arrowFunction = t.arrowFunctionExpression([], expression);\n    arrowFunction.loc = expression.loc;\n    arrowFunction.start = expression.start;\n    arrowFunction.end = expression.end;\n\n    let dataBindingInformation = [];\n    dataBindingInformation.push(t.objectProperty(t.identifier(\"isDataBinding\"), t.booleanLiteral(true)));\n    if (t.isMemberExpression(lhs)) {\n      dataBindingInformation.push(t.objectProperty(t.identifier(\"dataBindingContext\"), lhs.object));\n      dataBindingInformation.push(t.objectProperty(t.identifier(\"dataBindingIdentifier\"), lhs.property));\n    } else {\n      dataBindingInformation.push(t.objectProperty(t.identifier(\"dataBindingContext\"), t.stringLiteral(\"__localScopeObject__\")));\n      dataBindingInformation.push(t.objectProperty(t.identifier(\"dataBindingIdentifier\"), t.stringLiteral(lhs.name)));\n    }\n\n    const AECall = t.callExpression(AEIdentifier, [arrowFunction, t.objectExpression(dataBindingInformation)]);\n    const assignment = t.assignmentExpression(\"=\", lhs, t.identifier(\"value\"));\n    // Also add the location info for the assignment\n    assignment.loc = node.loc;\n    const assignmentFunction = t.arrowFunctionExpression([t.identifier(\"value\")], assignment);\n    assignmentFunction.start = node.body.start;\n    assignmentFunction.end = node.body.end;\n    const onChangeCall = t.callExpression(t.memberExpression(AECall, t.identifier(\"dataflow\")), [assignmentFunction]);\n    onChangeCall.isDatabinding = true;\n\n    const uniqueAEIdentifier = t.identifier(path.scope.generateUid(\"ae\"));\n    const AEVariableDeclaration = t.variableDeclaration(\"const\", [t.variableDeclarator(uniqueAEIdentifier, onChangeCall)]);\n\n    //Register the generated AE, if a registerDatabinding method exists\n    const registerMemberExpression = t.memberExpression(t.thisExpression(), t.identifier(\"registerDatabinding\"));\n    const registerIfStatement = t.ifStatement(t.logicalExpression(\"&&\", t.thisExpression(), registerMemberExpression), t.expressionStatement(t.callExpression(registerMemberExpression, [uniqueAEIdentifier, t.stringLiteral(lhsString)])));\n    return [registerIfStatement, AEVariableDeclaration];\n  };\n  \n  \n  const buildSignal = (path, node) => {\n    if (node.body.kind === \"const\") {\n      node.body.kind = \"let\";\n      lively.warn(\"Invalid const in databinding. Was automatically replaced with let\");\n    }\n\n    path.replaceWith(t.variableDeclaration(node.body.kind, node.body.declarations.map(varDecl => t.variableDeclarator(varDecl.id))));\n\n    for (const variableDeclaration of node.body.declarations.reverse()) {\n      const [registerIfStatement, AEVariableDeclaration] = generateDatabindingCode(variableDeclaration.id, variableDeclaration.init, path, node, variableDeclaration.id.name);\n\n      path.insertAfter(registerIfStatement);\n      path.insertAfter(AEVariableDeclaration);\n    }\n  }\n  \n  const buildDatabinding = (path, node) => {\n    const statements = [];\n    const expression = node.body.expression;\n    const lvalue = expression.left;\n    let lhs;\n    //There are only three lvalues\n    if (t.isMemberExpression(lvalue)) {\n      // object.property and object[\"property\"] are both memberExpressions. the latter is computed. \n      // object and property are both evaluated at the beginning and then stay constant.\n      const uniqueObjectIdentifier = t.identifier(path.scope.generateUid(\"object\"));\n      const objectAssignmentStatement = t.variableDeclaration(\"const\", [t.variableDeclarator(uniqueObjectIdentifier, lvalue.object)]);\n      statements.push(objectAssignmentStatement);\n\n      const uniquePropertyIdentifier = t.identifier(path.scope.generateUid(\"property\"));\n      const computedProperty = lvalue.computed ? lvalue.property : t.stringLiteral(lvalue.property.name);\n      const propertyAssignmentStatement = t.variableDeclaration(\"const\", [t.variableDeclarator(uniquePropertyIdentifier, computedProperty)]);\n      statements.push(propertyAssignmentStatement);\n\n      lhs = t.memberExpression(uniqueObjectIdentifier, uniquePropertyIdentifier, true);\n    } else if (t.isIdentifier(lvalue)) {\n      // local variable is also an lvalue. No evaluation required.\n      lhs = lvalue;\n    } else {\n      lively.warn(\"LHS of databinding assignment is not an lvalue. No databinding registered!\"); //This should not be valid code in the first place\n      path.replaceWith(expression);\n    }\n    const [registerIfStatement, AEVariableDeclaration] = generateDatabindingCode(lhs, expression.right, path, node, path.get(\"body.expression.left\").getSource());\n\n    statements.push(AEVariableDeclaration);\n    statements.push(registerIfStatement);\n    path.replaceWith(t.blockStatement(statements));\n  }\n\n  return {\n    name: \"data-binding\",\n    visitor: {\n      Program: {\n        enter(ppath, state) {\n          ppath.traverse({\n            LabeledStatement(path) {\n              const node = path.node;\n              if (node.label.name === \"always\") {\n                if (t.isVariableDeclaration(node.body)) {                  \n                  buildSignal(path, node);\n                } else if (t.isExpressionStatement(node.body) && t.isAssignmentExpression(node.body.expression, { operator: \"=\" })) {             \n                  buildDatabinding(path, node);                  \n                } else {\n                  lively.error(\"Unable to parse databinding\");\n                }\n              }\n              if (node.label.name === \"signal\") {\n                if (t.isVariableDeclaration(node.body)) {\n                  buildSignal(path, node);\n                } else if (t.isExpressionStatement(node.body) && t.isAssignmentExpression(node.body.expression, { operator: \"=\" })) {\n                  lively.warn(\"Use always: for databindings. Unlike Signals, they can also write to exising variables.\");\n                } else {\n                  lively.error(\"Unable to parse signal\");\n                }\n              }\n            }\n          });\n        }\n      }\n    }\n  };\n}"]}