@babel/plugin-proposal-function-bind
Version:
Compile function bind operator to ES5
1 lines • 5.46 kB
Source Map (JSON)
{"version":3,"names":["_helperPluginUtils","require","_core","_default","exports","default","declare","api","assertVersion","getTempId","scope","id","path","getData","t","cloneNode","generateDeclaredUidIdentifier","setData","getObject","bind","isExpression","object","callee","getStaticContext","isStatic","isSuper","thisExpression","inferBindContext","staticContext","tempId","sequenceExpression","assignmentExpression","isMemberExpression","name","manipulateOptions","_","parser","plugins","push","visitor","CallExpression","node","isBindExpression","context","memberExpression","identifier","arguments","unshift","BindExpression","replaceWith","callExpression"],"sources":["../src/index.ts"],"sourcesContent":["import { declare } from \"@babel/helper-plugin-utils\";\nimport { types as t, type Scope } from \"@babel/core\";\n\nexport default declare(api => {\n api.assertVersion(REQUIRED_VERSION(7));\n\n function getTempId(scope: Scope) {\n let id = scope.path.getData(\"functionBind\");\n if (id) return t.cloneNode(id);\n\n id = scope.generateDeclaredUidIdentifier(\"context\");\n return scope.path.setData(\"functionBind\", id);\n }\n\n function getObject(bind: t.BindExpression) {\n if (t.isExpression(bind.object)) {\n return bind.object;\n }\n\n return (bind.callee as t.MemberExpression).object;\n }\n\n function getStaticContext(bind: t.BindExpression, scope: Scope) {\n const object = getObject(bind);\n return (\n scope.isStatic(object) &&\n (t.isSuper(object) ? t.thisExpression() : object)\n );\n }\n\n function inferBindContext(bind: t.BindExpression, scope: Scope) {\n const staticContext = getStaticContext(bind, scope);\n if (staticContext) return t.cloneNode(staticContext);\n\n const tempId = getTempId(scope);\n if (bind.object) {\n bind.callee = t.sequenceExpression([\n t.assignmentExpression(\"=\", tempId, bind.object),\n bind.callee,\n ]);\n } else if (t.isMemberExpression(bind.callee)) {\n bind.callee.object = t.assignmentExpression(\n \"=\",\n tempId,\n // @ts-ignore(Babel 7 vs Babel 8) Fixme: support `super.foo(?)`\n bind.callee.object,\n );\n }\n return t.cloneNode(tempId);\n }\n\n return {\n name: \"proposal-function-bind\",\n manipulateOptions: (_, parser) => parser.plugins.push(\"functionBind\"),\n\n visitor: {\n CallExpression({ node, scope }) {\n const bind = node.callee;\n if (!t.isBindExpression(bind)) return;\n\n const context = inferBindContext(bind, scope);\n node.callee = t.memberExpression(bind.callee, t.identifier(\"call\"));\n node.arguments.unshift(context);\n },\n\n BindExpression(path) {\n const { node, scope } = path;\n const context = inferBindContext(node, scope);\n path.replaceWith(\n t.callExpression(\n t.memberExpression(node.callee, t.identifier(\"bind\")),\n [context],\n ),\n );\n },\n },\n };\n});\n"],"mappings":"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","ignoreList":[]}