{"version":3,"names":["types","t","template","traverse","GENERATED_IMPORT_IDENTIFIER","Symbol","addCustomTemplate","file","name","path","declar","declarations","identifier","addNamed","nameHint","FLAG_SHOULD_NOT_REWRITE_IDENTIFIER","visitor","Program","enter","state","hasDirective","foundDirective","Directive","get","node","value","shouldTransform","proxyDirective","proxyPreference","Preferences","inWorkspace","opts","executedIn","inFile","replaceNode","wrapType","unwrap","__already_transformed__","transformed","callExpression","stringLiteral","replaceWith","ObjectExpression","parent","callee","property","e","CallExpression","arguments","type","__should_unwrap__","NewExpression","ArrayExpression","Identifier","isCallExpression","AEXPR_IDENTIFIER_NAME","scope","hasBinding","setters","_srcClientPreferencesJs","default","_srcExternalBabelBabel7HelpersJs","execute","__SystemJSRewritingHack","_recorder_","_src_client_reactive_babel_plugin_active_expression_proxies_index_js","Object","defineProperty","set","thisIsVererySecretVariableName","enumerable","configurable"],"sources":["index.js"],"sourcesContent":["import Preferences from 'src/client/preferences.js';\n\nimport {addNamed} from 'src/external/babel/babel7-helpers.js';\n\n\n\nconst AEXPR_IDENTIFIER_NAME = 'aexpr';\nconst FLAG_SHOULD_NOT_REWRITE_IDENTIFIER = Symbol('FLAG: should not rewrite identifier');\n\nexport default function({ types: t, template, traverse }) {\n  const GENERATED_IMPORT_IDENTIFIER = Symbol(\"generated import identifier\");\n  \n  function addCustomTemplate(file, name, path) {\n    let declar = file.declarations[name];\n    if (declar) return declar;\n\n    // let identifier = file.declarations[name] = file.addImport(\"active-expression-proxies\", name, name);\n    let identifier = file.declarations[name] = addNamed(path, name, \"active-expression-proxies\", {nameHint: name});\n        \n    identifier[GENERATED_IMPORT_IDENTIFIER] = true;\n    identifier[FLAG_SHOULD_NOT_REWRITE_IDENTIFIER] = true;\n    return identifier;\n  }\n  \n  return {\n    visitor: {\n      Program: {\n        enter(path, state) {\n          function hasDirective(path, name) {\n            let foundDirective = false;\n            path.traverse({\n              Directive(path) {\n                if(path.get(\"value\").node.value === name) {\n                  foundDirective = true;\n                }\n              }\n            });\n            return foundDirective;\n          }\n\n          function shouldTransform() {\n            const proxyDirective = hasDirective(path, 'use proxies for aexprs');\n            const proxyPreference = typeof Preferences == 'undefined' ? true : Preferences.get('UseProxiesForAExprs');\n            const inWorkspace = state.opts.executedIn === 'workspace';\n            const inFile = state.opts.executedIn === 'file';\n\n            if (inWorkspace) {\n              return proxyPreference;\n            } else if (inFile) {\n              return proxyDirective;\n            }\n            return true;\n            // throw new Error('This should not be possible');\n          }\n\n          if (!shouldTransform()) { return; }\n\n          function replaceNode(path, wrapType, unwrap = false) {\n            // do not wrap the same object twice\n            if (path.node.__already_transformed__) { return; }\n            path.node.__already_transformed__ = true;           \n            \n            let transformed;\n            if (unwrap){\n              transformed = t.callExpression(\n                addCustomTemplate(state.file, 'unwrap', path), [path.node])\n              \n            } else {\n              transformed = t.callExpression(\n                addCustomTemplate(state.file, 'wrap', path), [t.stringLiteral(wrapType),path.node]\n              );\n            }\n            path.replaceWith(transformed);   \n          }\n          \n          path.traverse({\n            ObjectExpression(path) {\n              // do not replace objects in calls to Object.defineProperty\n              try {\n                if(path.parent.callee.property.name === \"defineProperty\") { \n                  return;\n                }\n              } catch(e) {\n                // Once we can use the new ecma script2020 syntax this try-catch can be replaced by optional chaining\n                // https://iolap.com/2019/09/27/whats-next-for-javascript-top-5-new-features-for-2020/\n              }\n              replaceNode(path, 'Object')\n            },\n\n            CallExpression(path) {\n              // unwrap proxies in Object.defineProperty \n              try {\n                if(path.node.callee.property.name === \"defineProperty\" && path.node.arguments[2].type === \"Identifier\") { \n                  path.node.arguments[2].__should_unwrap__ = true;\n                }\n              } catch(e) {\n                // Once we can use the new ecma script2020 syntax this try-catch can be replaced by optional chaining\n                // https://iolap.com/2019/09/27/whats-next-for-javascript-top-5-new-features-for-2020/\n              }\n            },\n            \n            NewExpression(path) {\n              replaceNode(path, path.node.callee.name)\n\n            },\n\n            ArrayExpression(path) {\n              replaceNode(path, 'Array')\n            },\n            \n            Identifier(path) {\n              if (path.node[FLAG_SHOULD_NOT_REWRITE_IDENTIFIER]) {\n                return;\n              }\n\n              // Check for a call to undeclared aexpr:\n              if (\n                t.isCallExpression(path.parent) &&\n                path.node.name === AEXPR_IDENTIFIER_NAME &&\n                !path.scope.hasBinding(AEXPR_IDENTIFIER_NAME)\n              ) {\n                //logIdentifier(\"call to aexpr\", path);\n                path.replaceWith(\n                  addCustomTemplate(state.file, AEXPR_IDENTIFIER_NAME, path)\n                );\n                return;\n              }\n\n              try {\n                if(path.parent.callee.property.name === \"defineProperty\" && path.parent.arguments[2] === path.node) { \n                  replaceNode(path, 'Proxy', true);           \n                }\n              } catch(e) {\n                // Once we can use the new ecma script2020 syntax this try-catch can be replaced by optional chaining\n                // https://iolap.com/2019/09/27/whats-next-for-javascript-top-5-new-features-for-2020/\n              }\n            }\n          })\n        }\n      }\n    }\n  };\n}\n"],"mappings":";;;;qBASe,UAAS;IAAEA,KAAK,EAAEC,CAAC;IAAEC,QAAQ;IAAEC;EAAS,CAAC,EAAE;IACxD,MAAMC,2BAA2B,GAAGC,MAAM,CAAC,6BAA6B,CAAC;IAEzE,SAASC,iBAAiBA,CAACC,IAAI,EAAEC,IAAI,EAAEC,IAAI,EAAE;MAC3C,IAAIC,MAAM,GAAGH,IAAI,CAACI,YAAY,CAACH,IAAI,CAAC;MACpC,IAAIE,MAAM,EAAE,OAAOA,MAAM;;MAEzB;MACA,IAAIE,UAAU,GAAGL,IAAI,CAACI,YAAY,CAACH,IAAI,CAAC,GAAGK,QAAQ,CAACJ,IAAI,EAAED,IAAI,EAAE,2BAA2B,EAAE;QAACM,QAAQ,EAAEN;MAAI,CAAC,CAAC;MAE9GI,UAAU,CAACR,2BAA2B,CAAC,GAAG,IAAI;MAC9CQ,UAAU,CAACG,kCAAkC,CAAC,GAAG,IAAI;MACrD,OAAOH,UAAU;IACnB;IAEA,OAAO;MACLI,OAAO,EAAE;QACPC,OAAO,EAAE;UACPC,KAAKA,CAACT,IAAI,EAAEU,KAAK,EAAE;YACjB,SAASC,YAAYA,CAACX,IAAI,EAAED,IAAI,EAAE;cAChC,IAAIa,cAAc,GAAG,KAAK;cAC1BZ,IAAI,CAACN,QAAQ,CAAC;gBACZmB,SAASA,CAACb,IAAI,EAAE;kBACd,IAAGA,IAAI,CAACc,GAAG,CAAC,OAAO,CAAC,CAACC,IAAI,CAACC,KAAK,KAAKjB,IAAI,EAAE;oBACxCa,cAAc,GAAG,IAAI;kBACvB;gBACF;cACF,CAAC,CAAC;cACF,OAAOA,cAAc;YACvB;YAEA,SAASK,eAAeA,CAAA,EAAG;cACzB,MAAMC,cAAc,GAAGP,YAAY,CAACX,IAAI,EAAE,wBAAwB,CAAC;cACnE,MAAMmB,eAAe,GAAG,OAAOC,WAAW,IAAI,WAAW,GAAG,IAAI,GAAGA,WAAW,CAACN,GAAG,CAAC,qBAAqB,CAAC;cACzG,MAAMO,WAAW,GAAGX,KAAK,CAACY,IAAI,CAACC,UAAU,KAAK,WAAW;cACzD,MAAMC,MAAM,GAAGd,KAAK,CAACY,IAAI,CAACC,UAAU,KAAK,MAAM;cAE/C,IAAIF,WAAW,EAAE;gBACf,OAAOF,eAAe;cACxB,CAAC,MAAM,IAAIK,MAAM,EAAE;gBACjB,OAAON,cAAc;cACvB;cACA,OAAO,IAAI;cACX;YACF;;YAEA,IAAI,CAACD,eAAe,CAAC,CAAC,EAAE;cAAE;YAAQ;YAElC,SAASQ,WAAWA,CAACzB,IAAI,EAAE0B,QAAQ,EAAEC,MAAM,GAAG,KAAK,EAAE;cACnD;cACA,IAAI3B,IAAI,CAACe,IAAI,CAACa,uBAAuB,EAAE;gBAAE;cAAQ;cACjD5B,IAAI,CAACe,IAAI,CAACa,uBAAuB,GAAG,IAAI;cAExC,IAAIC,WAAW;cACf,IAAIF,MAAM,EAAC;gBACTE,WAAW,GAAGrC,CAAC,CAACsC,cAAc,CAC5BjC,iBAAiB,CAACa,KAAK,CAACZ,IAAI,EAAE,QAAQ,EAAEE,IAAI,CAAC,EAAE,CAACA,IAAI,CAACe,IAAI,CAAC,CAAC;cAE/D,CAAC,MAAM;gBACLc,WAAW,GAAGrC,CAAC,CAACsC,cAAc,CAC5BjC,iBAAiB,CAACa,KAAK,CAACZ,IAAI,EAAE,MAAM,EAAEE,IAAI,CAAC,EAAE,CAACR,CAAC,CAACuC,aAAa,CAACL,QAAQ,CAAC,EAAC1B,IAAI,CAACe,IAAI,CACnF,CAAC;cACH;cACAf,IAAI,CAACgC,WAAW,CAACH,WAAW,CAAC;YAC/B;YAEA7B,IAAI,CAACN,QAAQ,CAAC;cACZuC,gBAAgBA,CAACjC,IAAI,EAAE;gBACrB;gBACA,IAAI;kBACF,IAAGA,IAAI,CAACkC,MAAM,CAACC,MAAM,CAACC,QAAQ,CAACrC,IAAI,KAAK,gBAAgB,EAAE;oBACxD;kBACF;gBACF,CAAC,CAAC,OAAMsC,CAAC,EAAE;kBACT;kBACA;gBAAA;gBAEFZ,WAAW,CAACzB,IAAI,EAAE,QAAQ,CAAC;cAC7B,CAAC;cAEDsC,cAAcA,CAACtC,IAAI,EAAE;gBACnB;gBACA,IAAI;kBACF,IAAGA,IAAI,CAACe,IAAI,CAACoB,MAAM,CAACC,QAAQ,CAACrC,IAAI,KAAK,gBAAgB,IAAIC,IAAI,CAACe,IAAI,CAACwB,SAAS,CAAC,CAAC,CAAC,CAACC,IAAI,KAAK,YAAY,EAAE;oBACtGxC,IAAI,CAACe,IAAI,CAACwB,SAAS,CAAC,CAAC,CAAC,CAACE,iBAAiB,GAAG,IAAI;kBACjD;gBACF,CAAC,CAAC,OAAMJ,CAAC,EAAE;kBACT;kBACA;gBAAA;cAEJ,CAAC;cAEDK,aAAaA,CAAC1C,IAAI,EAAE;gBAClByB,WAAW,CAACzB,IAAI,EAAEA,IAAI,CAACe,IAAI,CAACoB,MAAM,CAACpC,IAAI,CAAC;cAE1C,CAAC;cAED4C,eAAeA,CAAC3C,IAAI,EAAE;gBACpByB,WAAW,CAACzB,IAAI,EAAE,OAAO,CAAC;cAC5B,CAAC;cAED4C,UAAUA,CAAC5C,IAAI,EAAE;gBACf,IAAIA,IAAI,CAACe,IAAI,CAACT,kCAAkC,CAAC,EAAE;kBACjD;gBACF;;gBAEA;gBACA,IACEd,CAAC,CAACqD,gBAAgB,CAAC7C,IAAI,CAACkC,MAAM,CAAC,IAC/BlC,IAAI,CAACe,IAAI,CAAChB,IAAI,KAAK+C,qBAAqB,IACxC,CAAC9C,IAAI,CAAC+C,KAAK,CAACC,UAAU,CAACF,qBAAqB,CAAC,EAC7C;kBACA;kBACA9C,IAAI,CAACgC,WAAW,CACdnC,iBAAiB,CAACa,KAAK,CAACZ,IAAI,EAAEgD,qBAAqB,EAAE9C,IAAI,CAC3D,CAAC;kBACD;gBACF;gBAEA,IAAI;kBACF,IAAGA,IAAI,CAACkC,MAAM,CAACC,MAAM,CAACC,QAAQ,CAACrC,IAAI,KAAK,gBAAgB,IAAIC,IAAI,CAACkC,MAAM,CAACK,SAAS,CAAC,CAAC,CAAC,KAAKvC,IAAI,CAACe,IAAI,EAAE;oBAClGU,WAAW,CAACzB,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC;kBAClC;gBACF,CAAC,CAAC,OAAMqC,CAAC,EAAE;kBACT;kBACA;gBAAA;cAEJ;YACF,CAAC,CAAC;UACJ;QACF;MACF;IACF,CAAC;EACH,CAAC;EAAA;IAAAY,OAAA,aAAAC,uBAAA;MA9IM9B,WAAW,GAAA8B,uBAAA,CAAAC,OAAA;IAAA,aAAAC,gCAAA;MAEVhD,QAAQ,GAAAgD,gCAAA,CAARhD,QAAQ;IAAA;IAAAiD,OAAA,WAAAA,CAAA;MAAAC,uBAAA;MAAAC,UAAA,CAAAC,oEAAA,GAAAD,UAAA,CAAAC,oEAAA;MAAAC,MAAA,CAAAC,cAAA,CAAAH,UAAA,CAAAC,oEAAA;QAAA1C,IAAA;UAAA,OAAAM,WAAA;QAAA;QAAAuC,IAAAC,8BAAA;UAFTxC,WAAA,CAAAA,CAAA,CAAAA,8BAAW;UAAA;QAAA;QAAAyC,UAAA;QAAAC,YAAA;MAAA;MAAAL,MAAA,CAAAC,cAAA,CAAAH,UAAA,CAAAC,oEAAA;QAAA1C,IAAA;UAAA,OAAAV,QAAA;QAAA;QAAAuD,IAAAC,8BAAA;UAEVxD,QAAA,CAAAA,CAAA,CAAAA,8BAAQ;UAAA;QAAA;QAAAyD,UAAA;QAAAC,YAAA;MAAA;MAIVhB,qBAAqB,GAAG,OAAO;MAAAW,MAAA,CAAAC,cAAA,CAAAH,UAAA,CAAAC,oEAAA;QAAA1C,IAAA;UAAA,OAAAgC,qBAAA;QAAA;QAAAa,IAAAC,8BAAA;UAA/Bd,qBAAA,CAAAA,CAAA,CAAAA,8BAAqB;UAAA;QAAA;QAAAe,UAAA;QAAAC,YAAA;MAAA;MACrBxD,kCAAkC,GAAGV,MAAM,CAAC,qCAAqC,CAAC;MAAA6D,MAAA,CAAAC,cAAA,CAAAH,UAAA,CAAAC,oEAAA;QAAA1C,IAAA;UAAA,OAAAR,kCAAA;QAAA;QAAAqD,IAAAC,8BAAA;UAAlFtD,kCAAA,CAAAA,CAAA,CAAAA,8BAAkC;UAAA;QAAA;QAAAuD,UAAA;QAAAC,YAAA;MAAA;IAAA;EAAA;AAAA"}