[AST Tools] Babel template: replace JQuery

For example we have following code:

$(el).hide() // el.style.display = 'none'
$(el).forEach(() => {})
foo.hide()

We want

$(el).hide()

replace with:

el.style.display = 'none'

 

Plugin:

复制代码
export default function (babel) {
  const { types: t, template } = babel;
  
  return {
    name: "ast-transform", // not required
    visitor: {
      CallExpression(path) {

          const isJqueryCallExpression = looksLike(path, {
            node: {
                callee: {
                    name: '$'
                }
            },
            parent: {
                type: "MemberExpression",
                property: {
                    name: 'hide'
                }
            }
        });
        
        if (!isJqueryCallExpression) {
            return 
        }
        const overallPath = path.parentPath.parentPath;
        const templateString = `EL.style.display = 'none';`
        const assignmentBuilder = template(templateString)
        const assignment = assignmentBuilder({
            EL: t.identifier(path.node.arguments[0].name)
        })
        overallPath.replaceWith(assignment)
      }
    }
  };
}


function looksLike(a, b) {
  return (
    a &&
    b &&
    Object.keys(b).every(bKey => {
      const bVal = b[bKey]
      const aVal = a[bKey]
      if (typeof bVal === 'function') {
        return bVal(aVal)
      }
      return isPrimitive(bVal) ? bVal === aVal : looksLike(aVal, bVal)
    })
  )
}

function isPrimitive(val) {
  return val == null || /^[sbn]/.test(typeof val)
}
复制代码

 

posted @   Zhentiw  阅读(131)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2019-03-05 [Algorithm] How to use Max Heap to maintain K smallest items
2019-03-05 [HTML5] Avoiding CSS Conflicts via Shadow DOM CSS encapsulation
2019-03-05 [React] Simplify and Convert a Traditional React Form to Formik
2019-03-05 [Javascript Crocks] Make your own functions safer by lifting them into a Maybe context
2019-03-05 [Javascript Crocks] Compose Functions for Reusability with the Maybe Type
2019-03-05 [Algorithm] Array production problem
2019-03-05 [Algorithm -- Dynamic Programming] Recursive Staircase Problem
点击右上角即可分享
微信分享提示