From 81fce4c090811a1cc071579a99dc193fb976b117 Mon Sep 17 00:00:00 2001 From: Ahn Date: Sat, 19 Sep 2020 11:20:27 +0200 Subject: [PATCH] fix(utils): `pathsToModuleNameMapper` resolve path mapping with `path.join` (#1969) Closes #1968 --- e2e/__cases__/utils/src/foo/bar.ts | 1 + e2e/__cases__/utils/ts-jest-utils.spec.ts | 5 +++ e2e/__cases__/utils/tsconfig.json | 14 +++++++ .../paths-to-module-name-mapper.spec.ts.snap | 39 +++++++++++++++++++ .../paths-to-module-name-mapper.spec.ts | 23 ++--------- src/config/paths-to-module-name-mapper.ts | 8 ++-- 6 files changed, 67 insertions(+), 23 deletions(-) create mode 100644 e2e/__cases__/utils/src/foo/bar.ts create mode 100644 e2e/__cases__/utils/tsconfig.json create mode 100644 src/config/__snapshots__/paths-to-module-name-mapper.spec.ts.snap diff --git a/e2e/__cases__/utils/src/foo/bar.ts b/e2e/__cases__/utils/src/foo/bar.ts new file mode 100644 index 0000000000..cc798ff50d --- /dev/null +++ b/e2e/__cases__/utils/src/foo/bar.ts @@ -0,0 +1 @@ +export const a = 1; diff --git a/e2e/__cases__/utils/ts-jest-utils.spec.ts b/e2e/__cases__/utils/ts-jest-utils.spec.ts index a70d33afb2..04a1987b8d 100644 --- a/e2e/__cases__/utils/ts-jest-utils.spec.ts +++ b/e2e/__cases__/utils/ts-jest-utils.spec.ts @@ -1,4 +1,5 @@ import * as utils from 'ts-jest/utils' +import { compilerOptions } from './tsconfig.json'; test('utils', () => { expect(Object.keys(utils)).toEqual(['mocked', 'createJestPreset', 'pathsToModuleNameMapper']) @@ -6,3 +7,7 @@ test('utils', () => { expect(typeof utils.createJestPreset).toBe('function') expect(typeof utils.pathsToModuleNameMapper).toBe('function') }) + +test('pathsToModuleNameMapper', () => { + expect(utils.pathsToModuleNameMapper(compilerOptions.paths, { prefix: compilerOptions.baseUrl } )).toEqual({'^foo/(.*)$': 'src/foo/$1'}) +}) diff --git a/e2e/__cases__/utils/tsconfig.json b/e2e/__cases__/utils/tsconfig.json new file mode 100644 index 0000000000..56df0e537d --- /dev/null +++ b/e2e/__cases__/utils/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "baseUrl": "src", + "target": "ES5", + "module": "CommonJS", + "resolveJsonModule": true, + "paths": { + "foo/*": ["foo/*"] + } + }, + "exclude": [ + "node_modules" + ] +} diff --git a/src/config/__snapshots__/paths-to-module-name-mapper.spec.ts.snap b/src/config/__snapshots__/paths-to-module-name-mapper.spec.ts.snap new file mode 100644 index 0000000000..265cfd0e3f --- /dev/null +++ b/src/config/__snapshots__/paths-to-module-name-mapper.spec.ts.snap @@ -0,0 +1,39 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`pathsToModuleNameMapper should convert tsconfig mapping with given prefix: / 1`] = ` +Object { + "^api/(.*)$": "/src/api/$1", + "^client$": Array [ + "/src/client", + "/src/client/index", + ], + "^log$": "/src/utils/log", + "^mocks/(.*)$": "/test/mocks/$1", + "^server$": "/src/server", + "^test/(.*)$": "/test/$1", + "^test/(.*)/mock$": Array [ + "/test/mocks/$1", + "/test/__mocks__/$1", + ], + "^util/(.*)$": "/src/utils/$1", +} +`; + +exports[`pathsToModuleNameMapper should convert tsconfig mapping with given prefix: foo 1`] = ` +Object { + "^api/(.*)$": "foo/src/api/$1", + "^client$": Array [ + "foo/src/client", + "foo/src/client/index", + ], + "^log$": "foo/src/utils/log", + "^mocks/(.*)$": "foo/test/mocks/$1", + "^server$": "foo/src/server", + "^test/(.*)$": "foo/test/$1", + "^test/(.*)/mock$": Array [ + "foo/test/mocks/$1", + "foo/test/__mocks__/$1", + ], + "^util/(.*)$": "foo/src/utils/$1", +} +`; diff --git a/src/config/paths-to-module-name-mapper.spec.ts b/src/config/paths-to-module-name-mapper.spec.ts index c4d7763dd8..80875a8b91 100644 --- a/src/config/paths-to-module-name-mapper.spec.ts +++ b/src/config/paths-to-module-name-mapper.spec.ts @@ -14,7 +14,7 @@ const tsconfigMap = { } describe('pathsToModuleNameMapper', () => { - it('should convert tsconfig mapping', () => { + it('should convert tsconfig mapping with no given prefix', () => { expect(pathsToModuleNameMapper(tsconfigMap)).toMatchInlineSnapshot(` Object { "^api/(.*)$": "src/api/$1", @@ -35,25 +35,8 @@ describe('pathsToModuleNameMapper', () => { `) }) - it('should use the given prefix', () => { - expect(pathsToModuleNameMapper(tsconfigMap, { prefix: '/' })).toMatchInlineSnapshot(` - Object { - "^api/(.*)$": "/src/api/$1", - "^client$": Array [ - "/src/client", - "/src/client/index", - ], - "^log$": "/src/utils/log", - "^mocks/(.*)$": "/test/mocks/$1", - "^server$": "/src/server", - "^test/(.*)$": "/test/$1", - "^test/(.*)/mock$": Array [ - "/test/mocks/$1", - "/test/__mocks__/$1", - ], - "^util/(.*)$": "/src/utils/$1", - } - `) + it.each(['/', 'foo'])('should convert tsconfig mapping with given prefix', (prefix) => { + expect(pathsToModuleNameMapper(tsconfigMap, { prefix })).toMatchSnapshot(prefix) }) it('should warn about mapping it cannot handle', () => { diff --git a/src/config/paths-to-module-name-mapper.ts b/src/config/paths-to-module-name-mapper.ts index 5774cae859..b35a7bd765 100644 --- a/src/config/paths-to-module-name-mapper.ts +++ b/src/config/paths-to-module-name-mapper.ts @@ -4,6 +4,8 @@ import type { CompilerOptions } from 'typescript' import { rootLogger } from '../utils/logger' import { Errors, interpolate } from '../utils/messages' +import { join } from 'path' +import { normalizeSlashes } from '../utils/normalize-slashes' type TsPathMapping = Exclude type JestPathMapping = Config.InitialOptions['moduleNameMapper'] @@ -25,22 +27,22 @@ export const pathsToModuleNameMapper = ( // check that we have only one target path if (toPaths.length === 0) { logger.warn(interpolate(Errors.NotMappingPathWithEmptyMap, { path: fromPath })) + continue } // split with '*' const segments = fromPath.split(/\*/g) if (segments.length === 1) { - const paths = toPaths.map((target) => `${prefix}${target}`) + const paths = toPaths.map((target) => normalizeSlashes(join(prefix, target))) pattern = `^${escapeRegex(fromPath)}$` jestMap[pattern] = paths.length === 1 ? paths[0] : paths } else if (segments.length === 2) { - const paths = toPaths.map((target) => `${prefix}${target.replace(/\*/g, '$1')}`) + const paths = toPaths.map((target) => normalizeSlashes(join(prefix, target.replace(/\*/g, '$1')))) pattern = `^${escapeRegex(segments[0])}(.*)${escapeRegex(segments[1])}$` jestMap[pattern] = paths.length === 1 ? paths[0] : paths } else { logger.warn(interpolate(Errors.NotMappingMultiStarPath, { path: fromPath })) - continue } }