尝试为ts-jest编写打字稿转换器

时间:2020-06-03 00:50:48

标签: typescript jestjs next.js ts-jest

我正在开发一个使用nextJS的项目。 NextJs将把react import语句注入忽略它的react组件中。该项目还使用jest和ts-jest进行测试。测试失败是由于缺少被测模块中的反应导入以及该模块导入的模块。我的解决方案是编写一个Typescript转换器以注入react导入,您可以在jest.config.js文件中提供它。这是我的变压器,

const {
 createImportDeclaration,
 createImportClause,
 createIdentifier,
 createLiteral,
 isImportDeclaration,
 updateSourceFileNode,
 visitNode,
} = require('typescript');

function createVisitor(sf, _) {
 // console.log('********pre transform******\n', sf);
 const hasReactImport = (node) => {
   const nodeText = node.getText(sf);
   const isReactImport = isImportDeclaration(node) && nodeText.includes('react');

   let result = isReactImport;

   node.forEachChild((child) => {
     result = result || hasReactImport(child);
   });

   return result;
 };

 const injectReactImport = () => {
   return updateSourceFileNode(sf, [
     createImportDeclaration(
       /*decorators*/ undefined,
       /*modifiers*/ undefined,
       createImportClause(createIdentifier('React'), undefined),
       createLiteral('react')
     ),
     ...sf.statements,
   ]);
 };

 return (node) => {
   if (hasReactImport(node)) return sf;

   const file = injectReactImport();

   console.log('********post transform******\n', file.imports);

   return file;
 };
}

function factory() {
 return (ctx) => (sf) => visitNode(sf, createVisitor(sf, ctx));
}

module.exports = { factory };

此行具有

console.log('********post transform******\n', file.imports);

打印出文件的导入,但它打印出转换之前已经存在的相同导入。我没有任何错误。不知道我在做什么错。

0 个答案:

没有答案