kulshekhar / ts-jest

A Jest transformer with source map support that lets you use Jest to test projects written in TypeScript.
https://kulshekhar.github.io/ts-jest
MIT License
6.97k stars 454 forks source link

[Question]Const enum still not working #944

Closed peterfiorito closed 4 years ago

peterfiorito commented 5 years ago

Issue :

Const enum still not working As stated on the documentation: https://kulshekhar.github.io/ts-jest/user/babel7-or-ts#no-const-enum, there is still some problems with const enum in TS. In issue #281 there was a reference to PR #505 as a possible solution and #697 as a release that featured those changes. I tried setting the useExperimentalLanguageServer flag to true in globals, and though it seems to not fail in the enums, it has problems resolving imported modules, both in relative and in aliased paths, throwing: TSC language server encountered errors while transpiling. Errors: Cannot find module If I set the flag to false, it just fails on const enums, which of course I can work around with the suggested let Enum: Enum = 1 as Enum or similar approaches and everything works fine, but I was really hoping to give full support to the code without working around them. So, my main question or reason for reporting this, is that I am not sure of how the TSC language server works and why is it messing with module resolution when turned on.

My settings:

jest.conf.js

module.exports = {
    moduleFileExtensions: ["ts", "js", "json", "vue"],
    testMatch: ['**/__tests__/**/*.js?(x)', '**/?(*.)+(spec|test).(ts|tsx|js)'],
    transform: {
        "^.+\\.(ts)$": "<rootDir>/node_modules/ts-jest/preprocessor",
        ".*\\.(vue)$": "<rootDir>/node_modules/vue-jest",
        "^.+\\.(js)$": "<rootDir>/node_modules/babel-jest"
    },
    verbose: true,
    moduleDirectories: [
        ".",
        "src",
        "node_modules"
    ],
    moduleNameMapper: {
        "^@/(.*)$": "<rootDir>/src/$1"
    },
    globals: {
        'ts-jest': {
            // to give support to const enum. Not working, conflicting with module resolution
            useExperimentalLanguageServer: false
        }
    }
}; 

tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "dom",
      "es2015"
    ],
    "module": "es2015",
    "moduleResolution": "node",
    "isolatedModules": false,
    "experimentalDecorators": true,
    "noImplicitAny": true,
    "noImplicitThis": true,
    "strictNullChecks": true,
    "suppressImplicitAnyIndexErrors": true,
    "allowSyntheticDefaultImports": true,
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  },
  "include": [
    "./src/**/*.ts"
  ],
  "compileOnSave": false
}

babelrc

{
  "presets": [
    ["env", {
      "modules": false,
      "targets": {
        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
      }
    }],
    "stage-2"
  ],
  "plugins": ["transform-runtime"],
  "env": {
    "test": {
      "presets": ["env", {  
        "targets": {  
           "node":"current"
        }
     }, "stage-2"],
      "plugins": ["istanbul"]
    }
  }
}

And just in case, error with routes using aliases: TSC language server encountered errors while transpiling. Errors: Cannot find module '@/components/player/player.vue'.

Without aliases: TSC language server encountered errors while transpiling. Errors: Cannot find module './player/player.vue'.

Everything working with the flag set to false and work around for const enum:

  PASS  src/components/player/player.spec.ts
  Component: Player - unit tests
    ✓ Should update skipAds property (21ms)

Expected behavior :

As stated in the title and description, I am pretty sure this is not an issue, since the repo specifically says this is a TS issue that they are not willing to fix/address, but just to be sure, I wanted to see if there was anything else at play. You can contact me in the ts-jest slack, I sent this same inquire in the general channel (Pedro/Peter is my handle and show name).

Thanks for your time. Have a great day.

Debug log:

log file content
# content of ts-jest.log :

Minimal repo :

riston commented 5 years ago

Encountered exact same issue with enums, also with the latest "ts-jest" package. The work around for this was to put enum in separate file after that it was correctly transpiled.

peterfiorito commented 5 years ago

@riston I just went for the workaround of let enum: enum.propertyOfEnum = numberOfEnum as enum.propertyOfEnum; I will try exporting/importing the enums as you suggest, as it seems like a better patch/workaround.

diegoddox commented 5 years ago

Thanks for the awesome repo, I'm facing the same issue and not even the workaround mentioned by @riston is working for me.

Ringert commented 5 years ago

@riston I've tried your workaround, but it's only work as a default export. The enum is correctly transpiled if it is in the same file. It looks like the enum will be loaded only after interpreting the file, when a named import is used.

Examples:

file1.ts

enum langauges {
    DE = "de-DE",
    EN = "en-EN"
}
console.log(langauges);
export {langauges}

file2.ts

import {languages} from './file1'

const translations = {
   [languages.DE]: { }
}

Error: Cannot read property "DE" of undefined no console.log output


file1.ts

enum langauges {
    DE = "de-DE",
    EN = "en-EN"
}
console.log(langauges);
export default langauges

file2.ts

import languages from './file1'

const translations = {
   [languages.DE]: { }
}

no errors console.log outputs { DE: 'de-DE', EN: 'en-EN' }

arpi17 commented 5 years ago

I also had to research a lot why my test files were throwing a type error when importing and using a constant enum. While removing the const solved the problem I'd like to ask if there is any progress regarding this?

zamiang commented 5 years ago

Tried using the plugin https://github.com/dosentmatter/babel-plugin-const-enum but haven't had any luck there either (though I may be missing something in setting it up?)

ahnpnl commented 4 years ago

ts-jest has e2e test on const enum as well as enum, the tests are successful. If you encounter any issues with const enum or enum, please create another issue. I will close this.

victors1681 commented 2 years ago

My solution was to mock the Enum. in jest.config => setupFilesAfterEnv: ['<rootDir>/jest-setup.js'], then in this file mock the enum jest-setup.js

enum example in src/types.d

export enum langauges {
    DE = "de-DE",
    EN = "en-EN"
}
const types = require('./src/types.d');
jest.mock('./src/types.d', () => ({
  ...types,
  langauges: { DE : "de-DE",   EN : "en-EN" },
}));