繁体   English   中英

将玩笑与带有 glob 导入的文件一起使用

[英]Using jest with files with glob imports

我使用 webpack 和webpack-import-glob-loader来使用glob pattern导入文件。 所以在我的一个文件( src/store/resources/module.ts )中有一行:

import '../../modules/resources/providers/**/*.resource.ts';

当我使用ts-jest运行测试时,它失败并报告以下消息:

无法从“src/store/resources/module.ts”中找到模块“../../modules/resources/providers/**/*.resource.ts”

我假设它抱怨是因为它无法识别这种导入语法。

如何让 jest 为具有 glob 导入的项目工作?

我通过在 jest 预处理器中手动处理 glob 解决了这个问题。 由于您需要控制文件的处理以在这种方法中处理 glob,因此您必须手动初始化处理器。

// config.js
module.exports = {
  transform: {
    '.': `./path/to/your/processor.js`

// processor.js
const path = require(`path`);
const glob = require(`glob`).sync;
const yourProcessor = // require your processor code - ts-jest, babel-jest, esbuild-jest, etc

module.exports = {
  process(src, filename, config, opts) {
    const dir = path.dirname(filename);
    src = processGlob(src, dir);
    return yourProcessor(src, filename, config, opts);
  },
};

function processGlob(src, dir) {
  // This will match things like
  //   import './**/*';
  //   import '../../modules/resources/providers/**/*.resource.ts';
  // Takes inspiration from https://github.com/excid3/esbuild-rails/blob/main/src/index.js
  return src.replace(/^import\s'(.*\*.*)';$/m, (_match, pathCapture) => {
    const matcher = /.+\..+/; // Handles '.' results
    const files = glob(pathCapture, {
      cwd: dir,
    })
      .sort()
      .filter((path) => matcher.test(path));

    return `${files.map((module, index) => `import * as module${index} from '${module}'`).join(`;`)}`;
  });
}

在这种方法中,每个文件只能 glob 一次(因为它使用.map索引为每个导入模块名称添加数字)。 如果你想在一个文件中有多个 glob 导入,你可以跟踪一个全局计数变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM