{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-particles/src/client/reactive/rp19-jsx/rp19-jsx.js"],"names":["_","isExtending","classDeclarationPath","superClassIdentifierName","node","superClass","name","getClassMethodByName","path","get","filter","possibleClassMethod","isClassMethod","find","classMethod","isIdentifier","addBindInputFieldsMethodCall","t","attachedCallback","superCall","getSuperAttachedCallback","bindMethodCall","createBindMethodCall","replaceWith","unshiftContainer","expressionStatement","callExpression","memberExpression","super","identifier","arrowFunctionExpression","blockStatement","ifStatement","thisExpression","returnStatement","found","undefined","traverse","Super","parent","parentPath","isMemberExpression","isCallExpression","bindInputFields","inputFields","findInputFieldsInRenderReturn","bindingMethod","createBindingMethod","pushContainer","renderMethod","element","isReturnStatement","inputFieldFetchVisitor","JSXElement","openingElement","isJSXIdentifier","idAttribute","jsxAttribute","valueAttribute","formOpeningElement","findFormParent","formIdAttribute","isJSXExpressionContainer","valueExpression","push","id","formId","findParent","isJSXElement","map","type","Identifier","templateLiteral","templateElement","raw","cooked","assignmentExpression","stringLiteral","value","createAttachedCallback","ensureAttachedCallbackExistance","addRenderConsoleLog","logRenderToConsole","addDetachedConsoleLog","detachedCallbackMethod","logDetachedToConsole","reactiveMorphVisitor","ClassDeclaration"],"mappings":"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","file":"rp19-jsx.js","sourcesContent":["import _ from 'src/external/lodash/lodash.js'\n\n/* Generic */\n\nconst isExtending = (classDeclarationPath, superClassIdentifierName) =>\n  classDeclarationPath.node.superClass &&\n  classDeclarationPath.node.superClass.name === superClassIdentifierName;\n\nconst getClassMethodByName = (path, name) =>\n  _(path.get('body').get('body'))\n    .filter(possibleClassMethod => possibleClassMethod.isClassMethod())\n    .find(classMethod => classMethod.get('key').isIdentifier({ name }));\n\n/* Bind Input Fields */\n\nconst addBindInputFieldsMethodCall = (t, path) => {\n  const attachedCallback = getClassMethodByName(path, 'attachedCallback');\n  const superCall = getSuperAttachedCallback(attachedCallback);\n  const bindMethodCall = createBindMethodCall(t);\n  if (superCall)\n    superCall.replaceWith(bindMethodCall);\n  else\n    attachedCallback.get('body').unshiftContainer('body', bindMethodCall);\n}\n\nconst createBindMethodCall = t =>\n  t.expressionStatement(\n    t.callExpression(\n      t.memberExpression(\n        t.callExpression(\n          t.memberExpression(\n            t.super(),\n            t.identifier('attachedCallback')\n          ),\n          []\n        ),\n        t.identifier('then')\n      ),\n      [\n        t.arrowFunctionExpression(\n          [],\n          t.blockStatement(\n            [\n              t.ifStatement(\n                t.callExpression(\n                  t.memberExpression(\n                    t.thisExpression(),\n                    t.identifier('isDummy')\n                  ),\n                  []\n                ),\n                t.returnStatement()\n              ),\n              t.expressionStatement(\n                t.callExpression(\n                  t.memberExpression(\n                    t.thisExpression(),\n                    t.identifier('bindInputFields')\n                  ),\n                  []\n                )\n              )\n            ]\n          )\n        ) \n      ]\n    )\n  );\n\nconst getSuperAttachedCallback = path => {\n  let found = undefined;\n  path.traverse({\n    Super(path) {\n      const parent = path.parentPath;\n      found = found || \n        parent.isMemberExpression() && \n        parent.parentPath.isCallExpression() &&\n        parent.get('property').node.name === 'attachedCallback' \n      && parent.parentPath;\n    }\n  });\n  return found;\n}\n\nconst bindInputFields = (t, path) => {\n  const inputFields = findInputFieldsInRenderReturn(t, path);\n  const bindingMethod = createBindingMethod(t, inputFields);\n  path.get('body').pushContainer('body', bindingMethod);\n};\n\nconst findInputFieldsInRenderReturn = (t, path) => {\n  const inputFields = [];\n  const renderMethod = getClassMethodByName(path, 'render');\n  if (renderMethod) {\n    const returnStatement = _(renderMethod.get('body').get('body')).find(element =>\n                                                                         element.isReturnStatement());\n    if (returnStatement)\n      returnStatement.traverse(inputFieldFetchVisitor(), { inputFields });\n  }\n  return inputFields;\n};\n\nconst inputFieldFetchVisitor = () => ({\n  JSXElement(path) {\n    const openingElement = path.get('openingElement');    \n    if (!openingElement || \n        !openingElement.get('name').isJSXIdentifier({ name: 'input' }) &&\n        !openingElement.get('name').isJSXIdentifier({ name: 'textarea' }))\n      return;\n    const idAttribute = _(openingElement.get('attributes'))\n      .find(jsxAttribute => jsxAttribute.get('name').isJSXIdentifier({ name: 'id' }));\n    const valueAttribute = _(openingElement.get('attributes'))\n      .find(jsxAttribute => jsxAttribute.get('name').isJSXIdentifier({ name: 'value' }));\n    const formOpeningElement = findFormParent(path).get('openingElement');\n    const formIdAttribute = _(formOpeningElement.get('attributes'))\n      .find(jsxAttribute => jsxAttribute.get('name').isJSXIdentifier({ name: 'id' }));\n    if (!idAttribute || !formIdAttribute || !(valueAttribute && valueAttribute.get('value').isJSXExpressionContainer())) return;\n    const valueExpression = valueAttribute.get('value').get('expression').node;\n    this.inputFields.push({ \n      id: idAttribute.get('value').node, \n      valueExpression, \n      formId: formIdAttribute.get('value').node,\n    });\n  }\n});\n\nconst findFormParent = path =>\n  path.findParent((path) => \n    path.isJSXElement() &&\n    path.get('openingElement') &&\n    path.get('openingElement').get('name').isJSXIdentifier({ name: 'form' }));\n\nconst createBindingMethod = (t, inputFields) =>\n  t.classMethod(\n    'method',\n    t.identifier('bindInputFields'),\n    [],\n    t.blockStatement(\n      _(inputFields).map(({ id, valueExpression, formId, type }) =>\n        t.expressionStatement(\n          t.callExpression(\n            t.memberExpression(\n              t.thisExpression(),\n              t.identifier('addAExpr')\n            ),\n            [t.callExpression(\n              t.memberExpression(\n                t.callExpression(\n                  t.Identifier('aexpr'),\n                  [t.arrowFunctionExpression(\n                    [],\n                    t.memberExpression(\n                      t.callExpression(\n                        t.memberExpression(\n                          t.thisExpression(),\n                          t.identifier('get')\n                        ),\n                        [t.templateLiteral(\n                          [\n                            t.templateElement({ raw: '#', cooked: '#' }),\n                            t.templateElement({ raw: ' #', cooked: ' #' }),\n                            t.templateElement({ raw: '', cooked: '' })\n                          ],[\n                            formId,\n                            id\n                          ]\n                        )]\n                      ),\n                      t.identifier('value')\n                    )\n                  )]\n                ),\n                t.identifier('onChange')\n              ),\n              [t.arrowFunctionExpression(\n                [t.identifier('value')],\n                t.assignmentExpression(\n                  '=',\n                  valueExpression,\n                  t.identifier('value')\n                )\n              )]\n            ),\n            t.stringLiteral('inputFields')]\n          )\n        )\n      ).value()\n    )\n  );\n\n/* Ensure attached callback existance */\nconst createAttachedCallback = t =>\n  t.classMethod(\n    'method',\n    t.identifier('attachedCallback'),\n    [],\n    t.blockStatement([\n      t.expressionStatement(\n        t.callExpression(\n          t.memberExpression(\n            t.super(),\n            t.identifier('attachedCallback')\n          ),\n          []\n        )\n      )\n    ]),\n  );\n\nconst ensureAttachedCallbackExistance = (t, path) => {\n  if (!getClassMethodByName(path, 'attachedCallback')) {\n    path.get('body').unshiftContainer('body', createAttachedCallback(t));\n  }\n}\n\n/* Console log for tracing all render calls */\nconst addRenderConsoleLog = (t, path) => {\n  const renderMethod = getClassMethodByName(path, 'render');\n  if (!renderMethod) return;\n  renderMethod.get('body').unshiftContainer('body', logRenderToConsole(t));\n}\n\nconst logRenderToConsole = t => \n  t.expressionStatement(\n    t.callExpression(\n      t.memberExpression(\n        t.identifier('console'),\n        t.identifier('log')\n      ),\n      [t.templateLiteral(\n        [\n          t.templateElement({ raw: 'render ', cooked: 'render ' }),\n          t.templateElement({ raw: '', cooked: '' })\n        ],[\n          t.memberExpression(\n            t.thisExpression(),\n            t.identifier('localName')\n          )\n        ]\n      )]\n    )\n  );\n\n/* Console log for tracing all detached calls */\nconst addDetachedConsoleLog = (t, path) => {\n  const detachedCallbackMethod = getClassMethodByName(path, 'detachedCallback');\n  if (!detachedCallbackMethod) return;\n  detachedCallbackMethod.get('body').unshiftContainer('body', logDetachedToConsole(t));\n}\n\nconst logDetachedToConsole = t => \n  t.expressionStatement(\n    t.callExpression(\n      t.memberExpression(\n        t.identifier('console'),\n        t.identifier('log')\n      ),\n      [t.templateLiteral(\n        [\n          t.templateElement({ raw: 'detached ', cooked: 'detached ' }),\n          t.templateElement({ raw: '', cooked: '' })\n        ],[\n          t.memberExpression(\n            t.thisExpression(),\n            t.identifier('localName')\n          )\n        ]\n      )]\n    )\n  );\n\n/* Reactive Morph */\n\nexport const reactiveMorphVisitor = t => ({\n  ClassDeclaration(path) {\n    if (!isExtending(path, 'ReactiveMorph')) return;\n    ensureAttachedCallbackExistance(t, path);\n    bindInputFields(t, path);\n    addBindInputFieldsMethodCall(t, path);\n    // addRenderConsoleLog(t, path);\n    // addDetachedConsoleLog(t, path);\n  },\n});"]}