Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(config): improve emit skipped error message and ensure outDir always TS_JEST_OUT_DIR #2357

Merged
merged 1 commit into from Feb 13, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -2,6 +2,6 @@
"compilerOptions": {
"target": "es5",
"allowJs": true,
"outDir": "$$ts-jest$$"
"outDir": "./build"
}
}
10 changes: 0 additions & 10 deletions e2e/__cases__/allow-js/without-outDir/bar.spec.ts

This file was deleted.

1 change: 0 additions & 1 deletion e2e/__cases__/allow-js/without-outDir/bar.ts

This file was deleted.

5 changes: 0 additions & 5 deletions e2e/__cases__/allow-js/without-outDir/esm.spec.js

This file was deleted.

1 change: 0 additions & 1 deletion e2e/__cases__/allow-js/without-outDir/foo.js

This file was deleted.

10 changes: 0 additions & 10 deletions e2e/__cases__/allow-js/without-outDir/foo.spec.js

This file was deleted.

6 changes: 0 additions & 6 deletions e2e/__cases__/allow-js/without-outDir/tsconfig.json

This file was deleted.

154 changes: 0 additions & 154 deletions e2e/__tests__/__snapshots__/allow-js.test.ts.snap

This file was deleted.

26 changes: 3 additions & 23 deletions e2e/__tests__/allow-js.test.ts
Expand Up @@ -2,21 +2,20 @@ import { allPackageSetsWithPreset, allValidPackageSets } from '../__helpers__/te
import { configureTestCase } from '../__helpers__/test-case'

describe('using babel-jest for js files', () => {
const testCase = configureTestCase('allow-js/with-outDir', {
const testCase = configureTestCase('allow-js', {
jestConfig: { testMatch: null, testRegex: '(foo|bar)\\.spec\\.[jt]s$' },
})

testCase.runWithTemplates(allValidPackageSets, 0, (runTest, { testLabel }) => {
it(testLabel, () => {
const result = runTest()
expect(result.status).toBe(0)
expect(result).toMatchSnapshot()
})
})
})

describe('using ts-jest for js files with outDir', () => {
const testCase = configureTestCase('allow-js/with-outDir', {
describe('using ts-jest for js files', () => {
const testCase = configureTestCase('allow-js', {
jestConfig: {
preset: 'ts-jest/presets/js-with-ts',
testMatch: null,
Expand All @@ -28,25 +27,6 @@ describe('using ts-jest for js files with outDir', () => {
it(testLabel, () => {
const result = runTest()
expect(result.status).toBe(0)
expect(result).toMatchSnapshot()
})
})
})

describe('using ts-jest for js files without outDir', () => {
const testCase = configureTestCase('allow-js/without-outDir', {
jestConfig: {
preset: 'ts-jest/presets/js-with-ts',
testMatch: null,
testRegex: 'esm\\.spec\\.[jt]s$',
},
})

testCase.runWithTemplates(allPackageSetsWithPreset, 0, (runTest, { testLabel }) => {
it(testLabel, () => {
const result = runTest()
expect(result.status).toBe(0)
expect(result).toMatchSnapshot()
})
})
})
20 changes: 1 addition & 19 deletions src/compiler/__snapshots__/language-service.spec.ts.snap
@@ -1,24 +1,6 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`Language service allowJs option should compile js file for allowJs true with outDir 1`] = `
===[ FILE: test-allow-js.js ]===================================================
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = 42;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoidGVzdC1hbGxvdy1qcy5qcyIsIm1hcHBpbmdzIjoiOztBQUFBLGtCQUFlLEVBQUUsQ0FBQSIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJ0ZXN0LWFsbG93LWpzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IDQyIl0sInZlcnNpb24iOjN9
===[ INLINE SOURCE MAPS ]=======================================================
file: test-allow-js.js
mappings: ;;AAAA,kBAAe,EAAE,CAAA
names: []
sources:
- test-allow-js.js
sourcesContent:
- export default 42
version: 3
================================================================================
`;

exports[`Language service allowJs option should compile js file for allowJs true without outDir 1`] = `
exports[`Language service allowJs option should compile js file for allowJs true 1`] = `
===[ FILE: test-allow-js.js ]===================================================
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
Expand Down
13 changes: 2 additions & 11 deletions src/compiler/language-service.spec.ts
Expand Up @@ -20,20 +20,11 @@ describe('Language service', () => {
const fileName = 'test-allow-js.js'
const source = 'export default 42'

it('should compile js file for allowJs true with outDir', () => {
const compiler = makeCompiler({
tsJestConfig: { tsconfig: { allowJs: true, outDir: '$$foo$$' } },
})

const compiled = compiler.compile(source, fileName)

expect(new ProcessedSource(compiled, fileName)).toMatchSnapshot()
})

it('should compile js file for allowJs true without outDir', () => {
it('should compile js file for allowJs true', () => {
const compiler = makeCompiler({
tsJestConfig: { tsconfig: { allowJs: true } },
})

const compiled = compiler.compile(source, fileName)

expect(new ProcessedSource(compiled, fileName)).toMatchSnapshot()
Expand Down
4 changes: 2 additions & 2 deletions src/compiler/language-service.ts
@@ -1,6 +1,6 @@
import { LogContexts, Logger, LogLevels } from 'bs-logger'
import { existsSync, readFileSync, writeFile } from 'fs'
import { basename, normalize, relative, join } from 'path'
import { basename, normalize, join } from 'path'
import memoize = require('lodash/memoize')
import mkdirp = require('mkdirp')
import type * as _ts from 'typescript'
Expand Down Expand Up @@ -260,7 +260,7 @@ export const initializeLanguageServiceInstance = (configs: ConfigSet, logger: Lo
}
/* istanbul ignore next (this should never happen but is kept for security) */
if (output.emitSkipped) {
throw new TypeError(`${relative(cwd, fileName)}: Emit skipped for language service`)
throw new Error(interpolate(Errors.CannotCompile, { file: fileName }))
}
// Throw an error when requiring `.d.ts` files.
if (!output.outputFiles.length) {
Expand Down
3 changes: 1 addition & 2 deletions src/compiler/transpiler.spec.ts
@@ -1,6 +1,5 @@
import { makeCompiler } from '../__helpers__/fakers'
import ProcessedSource from '../__helpers__/processed-source'
import { TS_JEST_OUT_DIR } from '../config/config-set'

describe('Transpiler', () => {
const baseTsJestConfig = {
Expand All @@ -10,7 +9,7 @@ describe('Transpiler', () => {
it('should compile js file for allowJs true', () => {
const fileName = 'foo.js'
const compiler = makeCompiler({
tsJestConfig: { ...baseTsJestConfig, tsconfig: { allowJs: true, outDir: TS_JEST_OUT_DIR } },
tsJestConfig: { ...baseTsJestConfig, tsconfig: { allowJs: true } },
})
const source = 'export default 42'

Expand Down
15 changes: 7 additions & 8 deletions src/config/config-set.spec.ts
Expand Up @@ -69,14 +69,13 @@ describe('parsedTsConfig', () => {
})

it('should override some options', () => {
expect(get({ tsconfig: { module: 'esnext' as any, inlineSources: false } }).options).toMatchObject({
module: ts.ModuleKind.CommonJS,
inlineSources: true,
})
})

it('should include default outDir $$ts-jest$$ when allowJs is enabled and no outDir from config', () => {
expect(get({ tsconfig: { allowJs: true } }).options.outDir).toBe(TS_JEST_OUT_DIR)
expect(get({ tsconfig: { module: 'esnext' as any, inlineSources: false, outDir: 'build' } }).options).toMatchObject(
{
module: ts.ModuleKind.CommonJS,
inlineSources: true,
outDir: TS_JEST_OUT_DIR,
},
)
})

it('should be able to read extends', () => {
Expand Down
6 changes: 2 additions & 4 deletions src/config/config-set.ts
Expand Up @@ -164,6 +164,8 @@ export class ConfigSet {
// to clear out else it's buggy
out: undefined,
outFile: undefined,
// ensure that `LanguageService` won't pick up things from `build` folder which can lead to emit skipped error
outDir: TS_JEST_OUT_DIR,
composite: undefined, // see https://github.com/TypeStrong/ts-node/pull/657/files
declarationDir: undefined,
declarationMap: undefined,
Expand Down Expand Up @@ -483,10 +485,6 @@ export class ConfigSet {
finalOptions.allowSyntheticDefaultImports = true
}
}
// Make sure when allowJs is enabled, outDir is required to have when using allowJs: true
if (finalOptions.allowJs && !finalOptions.outDir) {
finalOptions.outDir = TS_JEST_OUT_DIR
}

// ensure undefined are removed and other values are overridden
for (const key of Object.keys(forcedOptions)) {
Expand Down
2 changes: 1 addition & 1 deletion src/utils/messages.ts
Expand Up @@ -16,8 +16,8 @@ export const enum Errors {
GotUnknownFileTypeWithoutBabel = 'Got a unknown file type to compile (file: {{path}}). To fix this, in your Jest config change the `transform` key which value is `ts-jest` so that it does not match this kind of files anymore.',
GotUnknownFileTypeWithBabel = 'Got a unknown file type to compile (file: {{path}}). To fix this, in your Jest config change the `transform` key which value is `ts-jest` so that it does not match this kind of files anymore. If you still want Babel to process it, add another entry to the `transform` option with value `babel-jest` which key matches this type of files.',
ConfigNoModuleInterop = 'If you have issues related to imports, you should consider setting `esModuleInterop` to `true` in your TypeScript configuration file (usually `tsconfig.json`). See https://blogs.msdn.microsoft.com/typescript/2018/01/31/announcing-typescript-2-7/#easier-ecmascript-module-interoperability for more information.',
UnableToFindProjectRoot = 'Unable to find the root of the project where ts-jest has been installed.',
MismatchNodeTargetMapping = 'There is a mismatch between your NodeJs version {{nodeJsVer}} and your TypeScript target {{compilationTarget}}. This might lead to some unexpected errors when running tests with `ts-jest`. To fix this, you can check https://github.com/microsoft/TypeScript/wiki/Node-Target-Mapping',
CannotCompile = "Unable to process '{{file}}'. Please check your tsconfig.",
}

/**
Expand Down