0

我想在代码库中使用的约定是:

const a = 1;
const b = 2;

然而,代码中有很多地方是这样写的:

let a = 1,
b = 2;

我想写一个codemod,可能使用JSCodeshift,可以将变量声明的第二种样式更改为第一种。我一直在对 AST 进行一些研究,并一直在使用 AST explorer。但是,我无法访问抽象语法树中的变量声明符“kind”。

我尝试过的一个例子是:

module.exports = function(file, api) {
  const j = api.jscodeshift;
  const root = j(file.source);

  // Step 1: Find all instances of the code to change
  const instances = root.find(VariableDeclarator.value.kind = 'let');

  // Step 2: Apply a code transformation and replace the code
  instances.forEach(instance => {
    j(path).replaceWith(VariableDeclarator.value.kind = 'const');
  });
  return root.toSource();
}
}

任何帮助或方向将不胜感激!谢谢!

4

2 回答 2

0

您可以通过以下方式使用Putout我正在研究的代码转换器@putout/plugin-split-variable-declarations

import putout from 'putout';

const {code} = putout('let a = 1, b = 2;', {
    plugins: [
        'split-variable-declarations',
        ['let-to-const', {
            report: () => 'convert let to const',
            replace: () => ({
                'let __a = __b': 'const __a = __b',
            }),
        }]
    ]
});
console.log(code);
// output
const a = 1;
const b = 2;

以下是来自的示例Putout Editor将 let 转换为 const

于 2022-02-15T20:06:05.120 回答
0

看起来您遇到的主要问题是在使用 find 方法时使用了正确的语法。例如,改变你的

const instances = root.find(VariableDeclarator.value.kind = 'let');

const instances = root.find(j.VariableDeclaration, {kind: 'let'});

您必须使用来自 的类型定义api.jscodeshift

完成您所要求的完整示例如下所示:

export default function transformer(file, api) {
  const j = api.jscodeshift;
  const root = j(file.source);
  
  const letDeclarations = root.find(j.VariableDeclaration, {kind: 'let'});

  letDeclarations.replaceWith(({value: {declarations}}) => {
    return declarations.map(dec => 
      j.variableDeclaration(dec.init ? 'const' : 'let', [dec])
    );
  });
  
  return root.toSource();
}

这将使以下转换:

let a = 1,
    b = 2,
    c;
const d = 3;
let e = 4;
var f = 4;
c = 3;

至:

const a = 1;
const b = 2;
let c;
const d = 3;
const e = 4;
var f = 4;
c = 3;

此 codemod 将仅转换包含初始化程序的 let 声明,因为这是const声明所必需的。

请参阅AST Explorer 上的完整示例以使用它。

于 2022-02-18T01:48:32.913 回答