{"version":3,"file":"scope.js","names":[],"sources":["esm/worklets/scope.js"],"sourcesContent":["function getClosureVariables(fnNode, globals) {\n  const rootScope = {\n    parent: null,\n    isFunction: true,\n    bindings: /* @__PURE__ */ new Set(),\n    varBindings: /* @__PURE__ */ new Set()\n  };\n  let currentScope = rootScope;\n  const freeVariables = /* @__PURE__ */ new Set();\n  if (fnNode.id && fnNode.id.name) {\n    rootScope.bindings.add(fnNode.id.name);\n  }\n  function pushScope(isFunction) {\n    const newScope = {\n      parent: currentScope,\n      isFunction,\n      bindings: /* @__PURE__ */ new Set(),\n      varBindings: isFunction ? /* @__PURE__ */ new Set() : currentScope.varBindings\n    };\n    currentScope = newScope;\n    return newScope;\n  }\n  function popScope() {\n    if (currentScope.parent) {\n      currentScope = currentScope.parent;\n    }\n  }\n  function addBindings(pattern, targetSet) {\n    if (!pattern) return;\n    switch (pattern.type) {\n      case \"Identifier\":\n        targetSet.add(pattern.name);\n        break;\n      case \"AssignmentPattern\":\n        addBindings(pattern.left, targetSet);\n        walk(pattern.right);\n        break;\n      case \"RestElement\":\n        addBindings(pattern.argument, targetSet);\n        break;\n      case \"ArrayPattern\":\n        for (const el of pattern.elements) {\n          if (el) addBindings(el, targetSet);\n        }\n        break;\n      case \"ObjectPattern\":\n        for (const prop of pattern.properties) {\n          if (prop.type === \"Property\") {\n            if (prop.computed) walk(prop.key);\n            addBindings(prop.value, targetSet);\n          } else if (prop.type === \"RestElement\") {\n            addBindings(prop.argument, targetSet);\n          }\n        }\n        break;\n    }\n  }\n  function addBindingsOnly(pattern, targetSet) {\n    if (!pattern) return;\n    switch (pattern.type) {\n      case \"Identifier\":\n        targetSet.add(pattern.name);\n        break;\n      case \"AssignmentPattern\":\n        addBindingsOnly(pattern.left, targetSet);\n        break;\n      case \"RestElement\":\n        addBindingsOnly(pattern.argument, targetSet);\n        break;\n      case \"ArrayPattern\":\n        for (const el of pattern.elements) {\n          if (el) addBindingsOnly(el, targetSet);\n        }\n        break;\n      case \"ObjectPattern\":\n        for (const prop of pattern.properties) {\n          if (prop.type === \"Property\") {\n            addBindingsOnly(prop.value, targetSet);\n          } else if (prop.type === \"RestElement\") {\n            addBindingsOnly(prop.argument, targetSet);\n          }\n        }\n        break;\n    }\n  }\n  function hoistDeclarations(node, direct) {\n    if (!node || typeof node !== \"object\" || typeof node.type !== \"string\") return;\n    switch (node.type) {\n      case \"FunctionDeclaration\":\n        if (node.id?.name) {\n          currentScope.bindings.add(node.id.name);\n          currentScope.varBindings.add(node.id.name);\n        }\n        return;\n      case \"FunctionExpression\":\n      case \"ArrowFunctionExpression\":\n        return;\n      case \"ClassDeclaration\":\n        if (direct && node.id?.name) currentScope.bindings.add(node.id.name);\n        return;\n      case \"VariableDeclaration\":\n        if (node.kind === \"var\") {\n          for (const d of node.declarations)\n            addBindingsOnly(d.id, currentScope.varBindings);\n        } else if (direct) {\n          for (const d of node.declarations) addBindingsOnly(d.id, currentScope.bindings);\n        }\n        return;\n      case \"ExportNamedDeclaration\":\n      case \"ExportDefaultDeclaration\":\n        hoistDeclarations(node.declaration, direct);\n        return;\n    }\n    for (const key of Object.keys(node)) {\n      if (key === \"start\" || key === \"end\" || key === \"loc\" || key === \"range\") continue;\n      const child = node[key];\n      if (Array.isArray(child)) {\n        for (const item of child) hoistDeclarations(item, false);\n      } else if (child && typeof child === \"object\") {\n        hoistDeclarations(child, false);\n      }\n    }\n  }\n  if (fnNode.params) {\n    for (const param of fnNode.params) {\n      addBindings(param, rootScope.bindings);\n    }\n  }\n  function isDeclaredInScopes(name, fromScope) {\n    let s = fromScope;\n    while (s) {\n      if (s.bindings.has(name) || s.varBindings.has(name)) {\n        return true;\n      }\n      s = s.parent;\n    }\n    return false;\n  }\n  function resolveIdentifier(name) {\n    if (!isDeclaredInScopes(name, currentScope) && !globals.has(name)) {\n      freeVariables.add(name);\n    }\n  }\n  function walk(node) {\n    if (!node || typeof node !== \"object\") return;\n    if (node.type === \"TSTypeAnnotation\" || node.type === \"TSTypeReference\" || node.type === \"TSTypeAliasDeclaration\" || node.type === \"TSInterfaceDeclaration\" || node.type === \"TSTypeParameterDeclaration\" || node.type === \"TSTypeParameterInstantiation\" || node.type === \"TSTypeQuery\" || node.type === \"TSQualifiedName\") {\n      return;\n    }\n    if (node.type === \"TSAsExpression\" || node.type === \"TSSatisfiesExpression\" || node.type === \"TSTypeAssertion\" || node.type === \"TSNonNullExpression\" || node.type === \"TSInstantiationExpression\") {\n      walk(node.expression);\n      return;\n    }\n    switch (node.type) {\n      case \"BlockStatement\": {\n        const isRootBody = node === fnNode.body;\n        if (!isRootBody) {\n          pushScope(false);\n        }\n        for (const stmt of node.body) {\n          hoistDeclarations(stmt, true);\n        }\n        for (const stmt of node.body) {\n          walk(stmt);\n        }\n        if (!isRootBody) {\n          popScope();\n        }\n        return;\n      }\n      case \"VariableDeclaration\": {\n        const isVar = node.kind === \"var\";\n        const targetSet = isVar ? currentScope.varBindings : currentScope.bindings;\n        for (const decl of node.declarations) {\n          addBindings(decl.id, targetSet);\n          if (decl.init) walk(decl.init);\n        }\n        return;\n      }\n      case \"FunctionDeclaration\":\n      case \"FunctionExpression\": {\n        if (node.id && node.id.name) {\n          currentScope.bindings.add(node.id.name);\n        }\n        pushScope(true);\n        if (node.params) {\n          for (const param of node.params) {\n            addBindings(param, currentScope.bindings);\n          }\n        }\n        walk(node.body);\n        popScope();\n        return;\n      }\n      case \"ArrowFunctionExpression\": {\n        pushScope(true);\n        if (node.params) {\n          for (const param of node.params) {\n            addBindings(param, currentScope.bindings);\n          }\n        }\n        walk(node.body);\n        popScope();\n        return;\n      }\n      case \"CatchClause\": {\n        pushScope(false);\n        if (node.param) {\n          addBindings(node.param, currentScope.bindings);\n        }\n        walk(node.body);\n        popScope();\n        return;\n      }\n      case \"ForStatement\": {\n        pushScope(false);\n        if (node.init) walk(node.init);\n        if (node.test) walk(node.test);\n        if (node.update) walk(node.update);\n        walk(node.body);\n        popScope();\n        return;\n      }\n      case \"ForInStatement\":\n      case \"ForOfStatement\": {\n        pushScope(false);\n        walk(node.left);\n        walk(node.right);\n        walk(node.body);\n        popScope();\n        return;\n      }\n      case \"ClassDeclaration\":\n      case \"ClassExpression\": {\n        if (node.id && node.id.name) {\n          currentScope.bindings.add(node.id.name);\n        }\n        if (node.superClass) walk(node.superClass);\n        pushScope(false);\n        walk(node.body);\n        popScope();\n        return;\n      }\n      case \"MemberExpression\": {\n        walk(node.object);\n        if (node.computed) {\n          walk(node.property);\n        }\n        return;\n      }\n      case \"Property\": {\n        if (node.computed) {\n          walk(node.key);\n        }\n        walk(node.value);\n        return;\n      }\n      case \"MethodDefinition\": {\n        if (node.computed) {\n          walk(node.key);\n        }\n        walk(node.value);\n        return;\n      }\n      case \"Identifier\": {\n        resolveIdentifier(node.name);\n        return;\n      }\n      case \"JSXElement\": {\n        if (node.openingElement) {\n          const nameNode = node.openingElement.name;\n          if (nameNode.type === \"JSXIdentifier\") {\n            if (/^[A-Z]/.test(nameNode.name)) {\n              resolveIdentifier(nameNode.name);\n            }\n          } else if (nameNode.type === \"JSXMemberExpression\") {\n            let root = nameNode.object;\n            while (root.type === \"JSXMemberExpression\") {\n              root = root.object;\n            }\n            if (root.type === \"JSXIdentifier\") {\n              resolveIdentifier(root.name);\n            }\n          }\n          if (node.openingElement.attributes) {\n            for (const attr of node.openingElement.attributes) {\n              walk(attr);\n            }\n          }\n        }\n        if (node.children) {\n          for (const child of node.children) {\n            walk(child);\n          }\n        }\n        return;\n      }\n      case \"JSXAttribute\": {\n        if (node.value) {\n          walk(node.value);\n        }\n        return;\n      }\n      case \"JSXExpressionContainer\": {\n        walk(node.expression);\n        return;\n      }\n      case \"BreakStatement\":\n      case \"ContinueStatement\":\n      case \"LabeledStatement\": {\n        if (node.body) walk(node.body);\n        return;\n      }\n    }\n    for (const key of Object.keys(node)) {\n      if (key === \"start\" || key === \"end\" || key === \"loc\" || key === \"range\") continue;\n      const child = node[key];\n      if (Array.isArray(child)) {\n        for (const item of child) {\n          walk(item);\n        }\n      } else if (child && typeof child === \"object\") {\n        walk(child);\n      }\n    }\n  }\n  walk(fnNode.body);\n  return Array.from(freeVariables).sort();\n}\nexport {\n  getClosureVariables\n};\n//# sourceMappingURL=scope.js.map\n"],"mappings":"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"}