import { dirname } from 'path'; import * as ts from 'typescript'; import defaultResolver from 'jest-resolve/build/default_resolver'; interface ResolveOptions { rootDir: string; basedir: string; paths: string[]; moduleDirectory: string[]; browser: boolean; extensions: string[]; } function getCompilerSetup(rootDir: string) { const tsConfigPath = ts.findConfigFile(rootDir, ts.sys.fileExists, 'tsconfig.spec.json') || ts.findConfigFile(rootDir, ts.sys.fileExists, 'tsconfig.test.json') || ts.findConfigFile(rootDir, ts.sys.fileExists, 'tsconfig.jest.json'); if (!tsConfigPath) { console.error( `Cannot locate a tsconfig.spec.json. Please create one at ${rootDir}/tsconfig.spec.json` ); } const readResult = ts.readConfigFile(tsConfigPath, ts.sys.readFile); const config = ts.parseJsonConfigFileContent( readResult.config, ts.sys, dirname(tsConfigPath) ); const compilerOptions = config.options; const host = ts.createCompilerHost(compilerOptions, true); return { compilerOptions, host }; } let compilerSetup; module.exports = function(path: string, options: ResolveOptions) { // Try to use the defaultResolver try { return defaultResolver(path, options); } catch (e) { // Fallback to using typescript compilerSetup = compilerSetup || getCompilerSetup(options.rootDir); const { compilerOptions, host } = compilerSetup; return ts.resolveModuleName(path, options.basedir, compilerOptions, host) .resolvedModule.resolvedFileName; } };