{"version":3,"file":"babel.cjs","sources":["../../src/babel.ts"],"sourcesContent":["// this is small alteration of original transform to do not transform hooks\n// https://github.com/preactjs/signals/blob/76babcb520594bb200fd69ac4840a7df5f259752/packages/react-transform/src/index.ts\nimport {\n  types as BabelTypes,\n  template as BabelTemplate,\n  PluginObj,\n  PluginPass,\n  NodePath,\n  template,\n} from \"@babel/core\";\nimport { isModule, addNamed } from \"@babel/helper-module-imports\";\nimport type { VisitNodeObject } from \"@babel/traverse\";\nimport debug from \"debug\";\n\ninterface PluginArgs {\n  types: typeof BabelTypes;\n  template: typeof BabelTemplate;\n}\n\nconst optOutCommentIdentifier = /(^|\\s)@noUseSignals(\\s|$)/;\nconst optInCommentIdentifier = /(^|\\s)@useSignals(\\s|$)/;\nconst dataNamespace = \"@preact-signals/safe-react/babel\";\nconst defaultImportSource = \"@preact-signals/safe-react/tracking\";\nconst importName = \"useSignals\";\nconst getHookIdentifier = \"getHookIdentifier\";\nconst maybeUsesSignal = \"maybeUsesSignal\";\nconst containsJSX = \"containsJSX\";\nconst alreadyTransformed = \"alreadyTransformed\";\n\nconst logger = {\n  transformed: debug(\"signals:react-transform:transformed\"),\n  skipped: debug(\"signals:react-transform:skipped\"),\n};\n\nconst get = (pass: PluginPass, name: any) =>\n  pass.get(`${dataNamespace}/${name}`);\nconst set = (pass: PluginPass, name: string, v: any) =>\n  pass.set(`${dataNamespace}/${name}`, v);\n\ninterface DataContainer {\n  getData(name: string): any;\n  setData(name: string, value: any): void;\n}\nconst setData = (node: DataContainer, name: string, value: any) =>\n  node.setData(`${dataNamespace}/${name}`, value);\nconst getData = (node: DataContainer, name: string) =>\n  node.getData(`${dataNamespace}/${name}`);\n\nfunction setOnFunctionScope(path: NodePath, key: string, value: any) {\n  const functionScope = path.scope.getFunctionParent();\n  if (functionScope) {\n    setData(functionScope, key, value);\n  }\n}\n\ntype FunctionLike =\n  | BabelTypes.ArrowFunctionExpression\n  | BabelTypes.FunctionExpression\n  | BabelTypes.FunctionDeclaration\n  | BabelTypes.ObjectMethod;\n\n/**\n * Simple \"best effort\" to get the base name of a file path. Not fool proof but\n * works in browsers and servers. Good enough for our purposes.\n */\nfunction basename(filename: string | undefined): string | undefined {\n  return filename?.split(/[\\\\/]/).pop();\n}\n\nconst DefaultExportSymbol = Symbol(\"DefaultExportSymbol\");\n\nfunction getObjectPropertyKey(\n  node: BabelTypes.ObjectProperty | BabelTypes.ObjectMethod\n): string | null {\n  if (node.key.type === \"Identifier\") {\n    return node.key.name;\n  } else if (node.key.type === \"StringLiteral\") {\n    return node.key.value;\n  }\n\n  return null;\n}\n/**\n * If the function node has a name (i.e. is a function declaration with a\n * name), return that. Else return null.\n */\nfunction getFunctionNodeName(path: NodePath<FunctionLike>): string | null {\n  if (\n    (path.node.type === \"FunctionDeclaration\" ||\n      path.node.type === \"FunctionExpression\") &&\n    path.node.id\n  ) {\n    return path.node.id.name;\n  } else if (path.node.type === \"ObjectMethod\") {\n    return getObjectPropertyKey(path.node);\n  }\n\n  return null;\n}\n\n/**\n * Given a function path's parent path, determine the \"name\" associated with the\n * function. If the function is an inline default export (e.g. `export default\n * () => {}`), returns a symbol indicating it is a default export. If the\n * function is an anonymous function wrapped in higher order functions (e.g.\n * memo(() => {})) we'll climb through the higher order functions to find the\n * name of the variable that the function is assigned to, if any. Other cases\n * handled too (see implementation). Else returns null.\n */\nfunction getFunctionNameFromParent(\n  parentPath: NodePath<BabelTypes.Node>\n): string | null | typeof DefaultExportSymbol {\n  if (\n    parentPath.node.type === \"VariableDeclarator\" &&\n    parentPath.node.id.type === \"Identifier\"\n  ) {\n    return parentPath.node.id.name;\n  } else if (parentPath.node.type === \"AssignmentExpression\") {\n    const left = parentPath.node.left;\n    if (left.type === \"Identifier\") {\n      return left.name;\n    } else if (left.type === \"MemberExpression\") {\n      let property = left.property;\n      while (property.type === \"MemberExpression\") {\n        property = property.property;\n      }\n\n      if (property.type === \"Identifier\") {\n        return property.name;\n      } else if (property.type === \"StringLiteral\") {\n        return property.value;\n      }\n\n      return null;\n    } else {\n      return null;\n    }\n  } else if (parentPath.node.type === \"ObjectProperty\") {\n    return getObjectPropertyKey(parentPath.node);\n  } else if (parentPath.node.type === \"ExportDefaultDeclaration\") {\n    return DefaultExportSymbol;\n  } else if (\n    parentPath.node.type === \"CallExpression\" &&\n    parentPath.parentPath != null\n  ) {\n    // If our parent is a Call Expression, then this function expression is\n    // wrapped in some higher order functions. Recurse through the higher order\n    // functions to determine if this expression is assigned to a name we can\n    // use as the function name\n    return getFunctionNameFromParent(parentPath.parentPath);\n  } else {\n    return null;\n  }\n}\n\n/* Determine the name of a function */\nfunction getFunctionName(\n  path: NodePath<FunctionLike>\n): string | typeof DefaultExportSymbol | null {\n  let nodeName = getFunctionNodeName(path);\n  if (nodeName) {\n    return nodeName;\n  }\n\n  return getFunctionNameFromParent(path.parentPath);\n}\n\nfunction isComponentName(name: string | null): boolean {\n  return name?.match(/^[A-Z]/) != null;\n}\n\nfunction hasLeadingComment(path: NodePath, comment: RegExp): boolean {\n  const comments = path.node.leadingComments;\n  return comments?.some((c) => c.value.match(comment) !== null) ?? false;\n}\n\nfunction hasLeadingOptInComment(path: NodePath) {\n  return hasLeadingComment(path, optInCommentIdentifier);\n}\n\nfunction hasLeadingOptOutComment(path: NodePath) {\n  return hasLeadingComment(path, optOutCommentIdentifier);\n}\n\nfunction isOptedIntoSignalTracking(path: NodePath | null): boolean {\n  if (!path) return false;\n\n  switch (path.node.type) {\n    case \"ArrowFunctionExpression\":\n    case \"FunctionExpression\":\n    case \"FunctionDeclaration\":\n    case \"ObjectMethod\":\n    case \"ObjectExpression\":\n    case \"VariableDeclarator\":\n    case \"VariableDeclaration\":\n    case \"AssignmentExpression\":\n    case \"CallExpression\":\n      return (\n        hasLeadingOptInComment(path) ||\n        isOptedIntoSignalTracking(path.parentPath)\n      );\n    case \"ExportDefaultDeclaration\":\n    case \"ExportNamedDeclaration\":\n    case \"ObjectProperty\":\n    case \"ExpressionStatement\":\n      return hasLeadingOptInComment(path);\n    default:\n      return false;\n  }\n}\n\nfunction isOptedOutOfSignalTracking(path: NodePath | null): boolean {\n  if (!path) return false;\n\n  switch (path.node.type) {\n    case \"ArrowFunctionExpression\":\n    case \"FunctionExpression\":\n    case \"FunctionDeclaration\":\n    case \"ObjectMethod\":\n    case \"ObjectExpression\":\n    case \"VariableDeclarator\":\n    case \"VariableDeclaration\":\n    case \"AssignmentExpression\":\n    case \"CallExpression\":\n      return (\n        hasLeadingOptOutComment(path) ||\n        isOptedOutOfSignalTracking(path.parentPath)\n      );\n    case \"ExportDefaultDeclaration\":\n    case \"ExportNamedDeclaration\":\n    case \"ObjectProperty\":\n    case \"ExpressionStatement\":\n      return hasLeadingOptOutComment(path);\n    default:\n      return false;\n  }\n}\n\nfunction isComponentFunction(\n  path: NodePath<FunctionLike>,\n  functionName: string | null\n): boolean {\n  return (\n    getData(path.scope, containsJSX) === true && // Function contains JSX\n    isComponentName(functionName) // Function name indicates it's a component\n  );\n}\n\nfunction shouldTransform(\n  path: NodePath<FunctionLike>,\n  functionName: string | null,\n  options: PluginOptions\n): boolean {\n  // Opt-out takes first precedence\n  if (isOptedOutOfSignalTracking(path)) return false;\n  // Opt-in opts in to transformation regardless of mode\n  if (isOptedIntoSignalTracking(path)) return true;\n\n  if (options.mode === \"all\") {\n    return isComponentFunction(path, functionName);\n  }\n\n  if (options.mode == null || options.mode === \"auto\") {\n    return (\n      getData(path.scope, maybeUsesSignal) === true && // Function appears to use signals;\n      isComponentFunction(path, functionName)\n    );\n  }\n\n  return false;\n}\n\nfunction isValueMemberExpression(\n  path: NodePath<BabelTypes.MemberExpression>\n): boolean {\n  return (\n    (path.node.property.type === \"Identifier\" &&\n      path.node.property.name === \"value\") ||\n    (path.node.property.type === \"StringLiteral\" &&\n      path.node.property.value === \"value\")\n  );\n}\n\nconst tryCatchTemplate = template.statements`var STORE_IDENTIFIER = HOOK_IDENTIFIER();\ntry {\n\tBODY\n} finally {\n\tSTORE_IDENTIFIER.f();\n}`;\n\nfunction wrapInTryFinally(\n  t: typeof BabelTypes,\n  path: NodePath<FunctionLike>,\n  state: PluginPass\n): FunctionLike {\n  const stopTrackingIdentifier = path.scope.generateUidIdentifier(\"effect\");\n\n  const newFunction = t.cloneNode(path.node);\n  newFunction.body = t.blockStatement(\n    tryCatchTemplate({\n      STORE_IDENTIFIER: stopTrackingIdentifier,\n      HOOK_IDENTIFIER: get(state, getHookIdentifier)(),\n      BODY: t.isBlockStatement(path.node.body)\n        ? path.node.body.body // TODO: Is it okay to elide the block statement here?\n        : t.returnStatement(path.node.body),\n    })\n  );\n\n  return newFunction;\n}\n\nfunction transformFunction(\n  t: typeof BabelTypes,\n  options: PluginOptions,\n  path: NodePath<FunctionLike>,\n  functionName: string | null,\n  state: PluginPass\n) {\n  const newFunction: FunctionLike = wrapInTryFinally(t, path, state);\n  // if (isCustomHook(functionName) || options.experimental?.noTryFinally) {\n  //   // For custom hooks, we don't need to wrap the function body in a\n  //   // try/finally block because later code in the function's render body could\n  //   // read signals and we want to track and associate those signals with this\n  //   // component. The try/finally in the component's body will stop tracking\n  //   // signals for us instead.\n  //   newFunction = prependUseSignals(t, path, state);\n  // } else {\n  // }\n\n  // Using replaceWith keeps the existing leading comments already so\n  // we'll clear our cloned node's leading comments to ensure they\n  // aren't duplicated in the output.\n  newFunction.leadingComments = newFunction.leadingComments?.filter(\n    (c) =>\n      !c.value.match(optOutCommentIdentifier) &&\n      !c.value.match(optInCommentIdentifier)\n  );\n\n  setData(path, alreadyTransformed, true);\n  path.replaceWith(newFunction);\n}\n\nfunction createImportLazily(\n  t: typeof BabelTypes,\n  pass: PluginPass,\n  path: NodePath<BabelTypes.Program>,\n  importName: string,\n  source: string\n): () => BabelTypes.Identifier | BabelTypes.MemberExpression {\n  return () => {\n    if (isModule(path)) {\n      let reference: BabelTypes.Identifier = get(pass, `imports/${importName}`);\n      if (reference) return t.cloneNode(reference);\n      /* const direcitves: BabelTypes.Statement[] = [];\n      for (let statement of path.get(\"body\")) {\n        if (statement.isStringLiteral()) {\n          direcitves.push(statement.node);\n        }\n      } */\n      reference = addNamed(path, importName, source, {\n        importedInterop: \"uncompiled\",\n        importPosition: \"after\",\n      });\n      set(pass, `imports/${importName}`, reference);\n\n      const matchesImportName = (\n        s: BabelTypes.ImportDeclaration[\"specifiers\"][0]\n      ) => {\n        if (s.type !== \"ImportSpecifier\") return false;\n        return (\n          (s.imported.type === \"Identifier\" &&\n            s.imported.name === importName) ||\n          (s.imported.type === \"StringLiteral\" &&\n            s.imported.value === importName)\n        );\n      };\n\n      for (let statement of path.get(\"body\")) {\n        if (\n          statement.isImportDeclaration() &&\n          statement.node.source.value === source &&\n          statement.node.specifiers.some(matchesImportName)\n        ) {\n          path.scope.registerDeclaration(statement);\n          break;\n        }\n      }\n      return reference;\n    } else {\n      let reference = get(pass, `requires/${importName}`);\n      if (reference) {\n        reference = t.cloneNode(reference);\n      } else {\n        reference = addNamed(path, importName, source, {\n          importedInterop: \"uncompiled\",\n        });\n        set(pass, `requires/${importName}`, reference);\n      }\n\n      return reference;\n    }\n  };\n}\n\nexport interface PluginOptions {\n  /**\n   * Specify the mode to use:\n   * - `auto`: Automatically wrap all components that use signals.\n   * - `manual`: Only wrap components that are annotated with `@useSignals` in a JSX comment.\n   * - `all`: Makes all components reactive to signals.\n   *   @default \"all\"\n   */\n  mode?: \"auto\" | \"manual\" | \"all\";\n  /** Specify a custom package to import the `useSignals` hook from.\n   * @default \"@preact-signals/safe-react/tracking\"\n   */\n  importSource?: string;\n  experimental?: {\n    // apliable only to swc plugin\n    addHookUsageFlag?: boolean;\n  };\n}\n\nfunction log(\n  transformed: boolean,\n  path: NodePath<FunctionLike>,\n  functionName: string | null,\n  currentFile: string | undefined\n) {\n  if (!logger.transformed.enabled && !logger.skipped.enabled) return;\n\n  let cwd = \"\";\n  if (typeof process !== undefined && typeof process.cwd == \"function\") {\n    cwd = process.cwd().replace(/\\\\([^ ])/g, \"/$1\");\n    cwd = cwd.endsWith(\"/\") ? cwd : cwd + \"/\";\n  }\n\n  const relativePath = currentFile?.replace(cwd, \"\") ?? \"\";\n  const lineNum = path.node.loc?.start.line;\n  functionName = functionName ?? \"<anonymous>\";\n\n  if (transformed) {\n    logger.transformed(`${functionName} (${relativePath}:${lineNum})`);\n  } else {\n    logger.skipped(`${functionName} (${relativePath}:${lineNum}) %o`, {\n      hasSignals: getData(path.scope, maybeUsesSignal) ?? false,\n      hasJSX: getData(path.scope, containsJSX) ?? false,\n    });\n  }\n}\n\nfunction isComponentLike(\n  path: NodePath<FunctionLike>,\n  functionName: string | null\n): boolean {\n  return !getData(path, alreadyTransformed) && isComponentName(functionName);\n}\n\nexport default function signalsTransform(\n  { types: t }: PluginArgs,\n  options: PluginOptions\n): PluginObj {\n  options.mode ??= \"all\";\n  // TODO: Consider alternate implementation, where on enter of a function\n  // expression, we run our own manual scan the AST to determine if the\n  // function uses signals and is a component. This manual scan once upon\n  // seeing a function would probably be faster than running an entire\n  // babel pass with plugins on components twice.\n  const visitFunction: VisitNodeObject<PluginPass, FunctionLike> = {\n    exit(path, state) {\n      if (getData(path, alreadyTransformed) === true) return false;\n\n      let functionName = getFunctionName(path);\n      if (functionName === DefaultExportSymbol) {\n        functionName = basename(this.filename) ?? null;\n      }\n\n      if (shouldTransform(path, functionName, state.opts)) {\n        transformFunction(t, state.opts, path, functionName, state);\n        log(true, path, functionName, this.filename);\n      } else if (isComponentLike(path, functionName)) {\n        log(false, path, functionName, this.filename);\n      }\n    },\n  };\n\n  return {\n    name: dataNamespace,\n    visitor: {\n      Program: {\n        enter(path, state) {\n          // Following the pattern of babel-plugin-transform-react-jsx, we\n          // lazily create the import statement for the useSignalTracking hook.\n          // We create a function and store it in the PluginPass object, so that\n          // on the first usage of the hook, we can create the import statement.\n          set(\n            state,\n            getHookIdentifier,\n            createImportLazily(\n              t,\n              state,\n              path,\n              importName,\n              options.importSource ?? defaultImportSource\n            )\n          );\n        },\n      },\n\n      ArrowFunctionExpression: visitFunction,\n      FunctionExpression: visitFunction,\n      FunctionDeclaration: visitFunction,\n      ObjectMethod: visitFunction,\n\n      MemberExpression(path) {\n        if (isValueMemberExpression(path)) {\n          setOnFunctionScope(path, maybeUsesSignal, true);\n        }\n      },\n\n      JSXElement(path) {\n        setOnFunctionScope(path, containsJSX, true);\n      },\n      JSXFragment(path) {\n        setOnFunctionScope(path, containsJSX, true);\n      },\n    },\n  };\n}\n"],"names":["template","importName","isModule","addNamed"],"mappings":"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"}