首页 > 其他 > 详细

[AST Babel] Create a simple babel plugin

时间:2020-02-19 21:05:14      阅读:35      评论:0      收藏:0      [点我收藏+]

For example, we have the source code:

getVersison(‘3.4.5‘)

function getVersion(versionString) {
    const versionRegex = /(\d)\.(\d)\.(\d+)/
    const [, major, minor, patch] = versionRegex.exec(versionString)
    return {major, minor, patch}
}

 

We want to transform it into:

const _versionRegex = /(\d)\.(\d)\.(\d+)/;
getVersison(‘3.4.5‘)

function getVersion(versionString) {
    const [, major, minor, patch] = _versionRegex.exec(versionString)
    return {major, minor, patch}
}

 

Babel plugin:

export default function (babel) {
  const { types: t } = babel;
  
  return {
    name: "ast-transform", // not required
    visitor: {
      RegExpLiteral(path) {
        const name = path.parent.id.name; //versionRege
        const newIdentifier = path.scope.generateUidIdentifier(name) // _versionRegex
        const variableDeclaration = t.variableDeclaration(‘const‘, [
            t.variableDeclarator(newIdentifier, path.node)
        ]) // const _versionRegex = /(\d)\.(\d)\.(\d+)/;
        
        console.log(variableDeclaration)
        
        
        /*
        - const [, major, minor, patch] = versionRegex.exec(versionString)
        + const [, major, minor, patch] = _versionRegex.exec(versionString)
        */
        path.scope.rename(name, newIdentifier.name)
        
        const program = path.findParent(
         t.isProgram
        )
        
        console.log(program.node.body)
        
        program.node.body.unshift(variableDeclaration) // + const _versionRegex = /(\d)\.(\d)\.(\d+)/;
        
        path.parentPath.remove() // - const versionRegex = /(\d)\.(\d)\.(\d+)/
      }
    }
  };
}

 

[AST Babel] Create a simple babel plugin

原文:https://www.cnblogs.com/Answer1215/p/12332952.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!