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

[Question]Const enum still not working #944

Closed
peterfiorito opened this issue Jan 10, 2019 · 8 comments
Closed

[Question]Const enum still not working #944

peterfiorito opened this issue Jan 10, 2019 · 8 comments

Comments

@peterfiorito
Copy link

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
Copy link

riston commented Jan 21, 2019

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
Copy link
Author

@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
Copy link

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

@Ringert
Copy link

Ringert commented May 3, 2019

@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
Copy link

arpi17 commented Jul 12, 2019

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
Copy link

zamiang commented Jul 30, 2019

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?)

yuqu added a commit to zeplin/cli-connect-react-plugin that referenced this issue Oct 23, 2019
yuqu added a commit to zeplin/cli-connect-react-plugin that referenced this issue Oct 23, 2019
yuqu added a commit to zeplin/cli-connect-react-plugin that referenced this issue Nov 3, 2019
@ahnpnl
Copy link
Collaborator

ahnpnl commented Dec 31, 2019

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
Copy link

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" },
}));

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants