{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-drawio/src/external/babel-plugin-var-recorder.js"],"names":["moduleNameToVarRecorderName","Map","getScopeIdForModule","moduleName","has","set","replace","lively4url","get","types","t","template","traverse","GENERATED","Symbol","isMarked","node","mark","isVariable","path","isLabeledStatement","parent","parentKey","isBreakStatement","isForInStatement","isFunctionExpression","isImportDefaultSpecifier","isCatchClause","isObjectProperty","isClassDeclaration","isClassMethod","isImportSpecifier","isMemberExpression","computed","isObjectMethod","isFunctionDeclaration","isArrowFunctionExpression","isRestElement","bubbleThroughPattern","parentPath","isArrayPattern","isObjectPattern","isRestProperty","log","pre","console","type","logIdentifier","name","key","logBinding","binding","identifier","args","post","visitor","Program","exit","state","VAR_RECORDER_NAME","var_recorder_info","MODULE_IDENTIFIER","lazyInitializeModuleScopeTemplate","lazyInitializeModuleScope","unshiftContainer","enter","program","file","DOIT_MATCHER","MODULE_MATCHER","filename","MODULE_NAME","window","__topLevelVarRecorder_ModuleNames__","test","codeId","Error","varToRecordTemplate","recordToVarTemplate","referenceTemplate","replaceReference","ref","replaceWith","reference","expression","skip","moduleBoundGlobals","Object","keys","bindings","scope","getAllBindings","values","forEach","partOfForStatement","shouldSortOut","isVariableDeclarator","isVariableDeclaration","kind","isForAwaitStatement","isForOfStatement","isForStatement","__ignoreRecorder__","referencePaths","filter","isExportNamedDeclaration","isExportDefaultDeclaration","isExportSpecifier","find","isProgram","insertBefore","newPath","findParent","p","isPattern","isDeclaration","pattern","varToRecord","init","getStatementParent","insertAfter","Identifier","isAssignmentExpression","par","hasOwnBinding","getOwnBinding","hasGlobal","includes"],"mappings":"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","file":"babel-plugin-var-recorder.js","sourcesContent":["const moduleNameToVarRecorderName = new Map();\n\n\nexport function getScopeIdForModule(moduleName) {\n  // console.log(\"[babel-plugin-var-recorder] getScopeIdForModule\", moduleName);\n  if(!moduleNameToVarRecorderName.has(moduleName)) {\n    moduleNameToVarRecorderName.set(moduleName, \n      (moduleName || \"undefined\").replace(lively4url, \"\").replace(/[^a-zA-Z0-9]/g,\"_\"));\n  }\n\n  return moduleNameToVarRecorderName.get(moduleName);\n}\n\nexport default function({ types: t, template, traverse, }) {\n  \n  const GENERATED = Symbol('generated');\n  function isMarked(node) {\n    return node[GENERATED];\n  }\n  function mark(node) {\n    node[GENERATED] = true;\n    return node;\n  }\n  \n  // TODO: is there a general way to exclude non-variables?\n  function isVariable(path) {    \n    // - filter out with negative conditions\n    if(t.isLabeledStatement(path.parent) && path.parentKey === 'label') return false;\n    if(t.isBreakStatement(path.parent) && path.parentKey === 'label') return false;\n    if(t.isForInStatement(path.parent) && path.parentKey === 'left') return false;\n    if(t.isFunctionExpression(path.parent) && path.parentKey === 'id') return false;\n    if(t.isImportDefaultSpecifier(path.parent) && path.parentKey === 'local') return false;\n    if(t.isCatchClause(path.parent) && path.parentKey === 'param') return false;\n    if(t.isObjectProperty(path.parent) && path.parentKey === 'key') return false;\n    if(t.isClassDeclaration(path.parent)) return false;\n    if(t.isClassMethod(path.parent)) return false;\n    if(t.isImportSpecifier(path.parent)) return false; // correct?\n    if(t.isMemberExpression(path.parent) && path.parentKey === 'property' && !path.parent.computed) return false; // TODO: correct?\n    if(t.isObjectMethod(path.parent)) return false;\n    if(t.isFunctionDeclaration(path.parent)) return false;\n    if((t.isArrowFunctionExpression(path.parent) && path.parentKey === 'params')) return false;\n    if((t.isFunctionExpression(path.parent) && path.parentKey === 'params')) return false;\n    if(t.isRestElement(path.parent)) return false;\n    \n    // TODO: 2nd stage:\n    // - return true on known conditions\n    return true;\n    \n    // - throw error at others\n  }\n  \n  function bubbleThroughPattern(path) {\n    if(path.parentPath.isArrayPattern() && path.parentKey === 'elements') return bubbleThroughPattern(path.parentPath);\n    if(path.parentPath.isRestElement() && path.parentKey === 'argument') return bubbleThroughPattern(path.parentPath);\n    if(path.parentPath.isObjectPattern() && path.parentKey === 'properties') return bubbleThroughPattern(path.parentPath);\n    if(path.parentPath.isObjectProperty() && path.parentKey === 'value') return bubbleThroughPattern(path.parentPath);\n    if(path.parentPath.isRestProperty() && path.parentKey === 'argument') return bubbleThroughPattern(path.parentPath);\n    return path;\n  }\n\n  function log(path, pre) {\n    return console.log(`path of type ${path.type}`, pre);\n  }\n  \n  function logIdentifier(path, pre = '') {\n    console.log(pre + `${path.node.name} in ${path.parentPath.node.type} as ${path.key}`);\n  }\n  \n  function logBinding(binding, pre = '') {\n    console.log(pre + `${binding.identifier.name}`);\n  }\n  \n  return {\n    name: \"top-level-var-recorder\",\n    pre(...args) {\n      // console.log('XXXX', ...args);\n      //console.clear();\n    },\n    post(...args) {\n      // console.log('YYYY', ...args);\n    },\n    visitor: {\n      Program: {\n        exit(path, state) {\n          const VAR_RECORDER_NAME = state.var_recorder_info.VAR_RECORDER_NAME;\n          const MODULE_IDENTIFIER = state.var_recorder_info.MODULE_IDENTIFIER;\n          const lazyInitializeModuleScopeTemplate = template(`${VAR_RECORDER_NAME}.${MODULE_IDENTIFIER} = ${VAR_RECORDER_NAME}.${MODULE_IDENTIFIER} || {}`);\n          const lazyInitializeModuleScope = lazyInitializeModuleScopeTemplate();\n          path.unshiftContainer('body', lazyInitializeModuleScope);\n        },\n        enter(program, state) {\n          const file = state.file;\n          state.var_recorder_info = {};\n          const DOIT_MATCHER = /^workspace(async)?(js)?:/;\n          const MODULE_MATCHER = /.js$/;\n\n          let filename = file.log.filename;\n          // console.log('visitor!', program, filename);\n\n          const VAR_RECORDER_NAME = '_recorder_' || '__varRecorder__';\n          let MODULE_NAME;\n          if(window.__topLevelVarRecorder_ModuleNames__ && DOIT_MATCHER.test(filename) && !MODULE_MATCHER.test(filename)) {\n            var codeId = filename.replace(DOIT_MATCHER,\"\") // workspace: becomes workspacejs... e.g. and we are only interested in the id ...\n            MODULE_NAME = window.__topLevelVarRecorder_ModuleNames__[codeId];\n            // console.log(\"boundEval MODULE_NAME: \" + MODULE_NAME + \" codeId: \" + codeId)\n          } else if (!DOIT_MATCHER.test(filename) && MODULE_MATCHER.test(filename)) {\n            // eval a .js file\n            MODULE_NAME = filename;\n          } else {\n            throw new Error('Transpiling neither a .js module nor workspace code');\n          }\n          let MODULE_IDENTIFIER = getScopeIdForModule(MODULE_NAME);\n          state.var_recorder_info.VAR_RECORDER_NAME = VAR_RECORDER_NAME;\n          state.var_recorder_info.MODULE_IDENTIFIER = MODULE_IDENTIFIER;\n          \n          const varToRecordTemplate = template(`${VAR_RECORDER_NAME}.${MODULE_IDENTIFIER}.reference = reference`),\n                recordToVarTemplate = template(`reference = ${VAR_RECORDER_NAME}.${MODULE_IDENTIFIER}.reference`),\n                referenceTemplate = template(`${VAR_RECORDER_NAME}.${MODULE_IDENTIFIER}.reference`);\n          function replaceReference(ref) {\n            ref.replaceWith(referenceTemplate({ reference: ref.node }).expression);\n            ref.skip();\n          }\n\n\n          window[VAR_RECORDER_NAME] = window[VAR_RECORDER_NAME] || {};\n          window[VAR_RECORDER_NAME][MODULE_IDENTIFIER] = window[VAR_RECORDER_NAME][MODULE_IDENTIFIER] || {};\n          let moduleBoundGlobals = Object.keys(window[VAR_RECORDER_NAME][MODULE_IDENTIFIER]);\n          // console.log('bound names:', ...moduleBoundGlobals);\n\n\n          let bindings = program.scope.getAllBindings();\n\n          // iterate all module wide bindings\n          Object.values(bindings).forEach(binding => {\n\n\n            function partOfForStatement(binding) {\n              const parentPath = binding.path.parentPath; \n              const shouldSortOut = binding.path.isVariableDeclarator() &&\n                parentPath.isVariableDeclaration() &&\n                parentPath.node.kind === \"var\" && ((\n                  (\n                  parentPath.parentPath.isForAwaitStatement() ||\n                  parentPath.parentPath.isForInStatement() ||\n                  parentPath.parentPath.isForOfStatement()\n                  ) && parentPath.parentKey === \"left\"\n                ) || (\n                  parentPath.parentPath.isForStatement()\n                  && parentPath.parentKey ===  \"init\"\n                )\n                );\n              return shouldSortOut;\n            }\n\n            if(partOfForStatement(binding)) {\n              // console.error(\"sort out\", binding.identifier.name)\n              // console.warn(binding)\n              binding.__ignoreRecorder__ = true;\n              return;\n\n            } else {\n              // console.error(\"not matching\", binding.identifier.name)\n              // console.warn(binding)\n            }\n\n            binding.referencePaths\n              .filter(ref => {\n                // ExportNamedDeclarations should not be rewritten as reference\n                // they are already rewritten as binding\n\n                if(ref.isExportNamedDeclaration()) {\n                  return false;\n                }\n                // Same for declaring the default export\n                if(ref.isExportDefaultDeclaration()) {\n                  return false;\n                }\n\n                // handle named exports special\n                if(ref.parentPath.isExportSpecifier() && ref.parentKey === 'local') {\n                  ref\n                    .find(path => path.parentPath.isProgram())\n                    .insertBefore(recordToVarTemplate({ reference: mark(t.identifier(binding.identifier.name)) }))\n                    .forEach(newPath => newPath.skip());\n                  ref.skip();\n                  return false;\n                }\n\n                // ObjectPatterns and ArrayPatterns in VariableDeclarations do not accept MemberExpressions.\n                // Thus, we have to filter out these cases explicitly.\n                if(ref.findParent(p=>p.isPattern()) && ref.findParent(p=>p.isDeclaration())) {\n                  let pattern = bubbleThroughPattern(ref);\n                  if(pattern.parentPath.isVariableDeclarator() && pattern.parentKey === 'id') return false;\n                }\n                return true;\n              })\n              .forEach(replaceReference);\n\n            // dealing with the declaration of the binding\n            let varToRecord = varToRecordTemplate({ reference: t.identifier(binding.identifier.name) });\n            if(binding.kind === 'hoisted'/* || binding.kind === 'module'*/) {\n              binding.path\n                .find(path => path.isProgram())\n                .unshiftContainer('body', varToRecord);\n            } else {\n              // #DesignQuestion\n              // a) should we add a guard here and check if the variable was recorded and we are reloaded\n              // b) change the semantics of variable declarations to be assigned with \"undefined\" if first time loaded [as implemented below]\n              if (!binding.path.node.init)\n                binding.path.node.init = referenceTemplate({\n                  reference: t.identifier(binding.identifier.name)}).expression;\n              binding.path\n                .getStatementParent()\n                .insertAfter(varToRecord)\n                .forEach(newPath => newPath.skip());\n            }\n          });\n\n          program.traverse({\n            Identifier(path) {            \n\n              if(isMarked(path.node)) return;\n              if(!isVariable(path)) return;\n\n              // special case of assigning to a reference\n              let pattern = bubbleThroughPattern(path);\n              if(pattern.parentPath.isAssignmentExpression() && pattern.parentKey === 'left') {\n                let par = path.find(parent => parent.scope.hasOwnBinding(path.node.name));\n                // is our binding scope the module-wide scope?\n                if(par && par.scope === program.scope) {\n\n                  // is it part of a for in declaration\n                  const binding = par.scope.getOwnBinding(path.node.name)\n                  if(binding && binding.__ignoreRecorder__) { return; }\n                  replaceReference(path);\n                  return path.skip();\n                }\n              }\n\n              // Distinguish between module-bound variables and real globals\n              if(\n                path.scope.hasGlobal(path.node.name) &&\n                  moduleBoundGlobals.includes(path.node.name)\n              ) {\n                replaceReference(path);\n                return path.skip();\n              }\n            }\n          });\n        }\n      },\n    }\n  };\n\n}\n"]}