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

UnhandledPromiseRejection: ts-node-esm does not display type checking results #2085

Open
jahirvidrio opened this issue Nov 14, 2023 · 6 comments

Comments

@jahirvidrio
Copy link

jahirvidrio commented Nov 14, 2023

Search Terms

esm, node 20, UnhandledPromiseRejection

Expected Behavior

I expect to see the type checking errors displayed in the console when using ts-node with esm support, providing information about what went wrong during TypeScript compilation.

Actual Behavior

The console output from ts-node-esm does not include information about type checking errors, making it challenging to identify and resolve issues during development. Additionally, Node.js reports the following error:

[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "[object Object]".] {
  code: 'ERR_UNHANDLED_REJECTION'
}

I tried using it with ts-node-esm and also with the --loader ts-node/esm option.

If I remove ESM support, everything works correctly, and I can see the type checking report from tsc.

Steps to reproduce the problem

const str: number = 'hello world';

console.log(str);

Minimal reproduction

Just run ts-node with esm support

$ NODE_OPTIONS="--no-warnings=ExperimentalWarning --experimental-loader=ts-node/esm" ts-node main.ts

[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "[object Object]".] {
  code: 'ERR_UNHANDLED_REJECTION'
}

Specifications

  • ts-node version: 10.9.1
  • node version: 20.9.0
  • TypeScript version: 5.2.2
  • tsconfig.json
{
    "compilerOptions": {
        "target": "es2022",
        "module": "es2022"
    },
    "ts-node": {
        "esm": true,
        "experimentalSpecifierResolution": "node"
    }
}
  • package.json:
{
    "type": "module",
    "scripts": {
        "start": "NODE_OPTIONS=\"--no-warnings=ExperimentalWarning --experimental-loader=ts-node/esm\" ts-node main.ts"
    },
    "devDependencies": {
        "ts-node": "^10.9.1",
        "tslib": "^2.6.2",
        "typescript": "^5.2.2"
    }
}
  • Operating system and version: Linux Debian in docker dev container node:20.9.0-bookworm
@TarSzator
Copy link

TarSzator commented Nov 16, 2023

I feel my issue fits into this.

ts-node v10.9.1

When I have simple code like

import http from 'http';

And I run it via

node --loader ts-node/esm bin/test.ts

in Node 20. I get the output

node:internal/process/esm_loader:40
      internalBinding('errors').triggerUncaughtException(
                                ^
[Object: null prototype] {
  [Symbol(nodejs.util.inspect.custom)]: [Function: [nodejs.util.inspect.custom]]
}

Node.js v20.9.0

When I execute it in Node 18.18.2 I get the output

/[...]/node_modules/ts-node/src/index.ts:859
    return new TSError(diagnosticText, diagnosticCodes, diagnostics);
           ^
TSError: ⨯ Unable to compile TypeScript:
bin/test.ts:1:1 - error TS6133: 'http' is declared but its value is never read.

1 import http from 'http';
  ~~~~~~~~~~~~~~~~~~~~~~~~

    at createTSError
    [...]

This is of corse an academic example but also applies for way more complex projects

I tried multiple ways of executing node with ts-node all yield the same result.

@jahirvidrio
Copy link
Author

@TarSzator Your issue is not actually an error; it's a configuration in your tsconfig.json file that instructs the compiler to throw an error when a variable is not used. Simply modify the compilerOptions.noUnusedLocals and compilerOptions.noUnusedParameters properties to false.

@TarSzator
Copy link

TarSzator commented Nov 17, 2023

@jahirvidrio The issue is not that I see an error. The issue is that I not see it when I use Node v20.

Meaning that I do not see a proper error message when I use Node v20

@cj-christoph-gysin
Copy link

cj-christoph-gysin commented Dec 5, 2023

I'm seeing the same issue as @TarSzator. It seems the problem now also exists in node-18.19.0:

$ node --version
v18.18.2
$ NODE_OPTIONS="--no-warnings=ExperimentalWarning --experimental-loader=ts-node/esm" npx ts-node main.ts
/node_modules/ts-node/src/index.ts:859
    return new TSError(diagnosticText, diagnosticCodes, diagnostics);
           ^
TSError: ⨯ Unable to compile TypeScript:
main.ts:1:7 - error TS2322: Type 'string' is not assignable to type 'number'.
$ node --version
v18.19.0
$ NODE_OPTIONS="--no-warnings=ExperimentalWarning --experimental-loader=ts-node/esm" npx ts-node main.ts
[Object: null prototype] {
  [Symbol(nodejs.util.inspect.custom)]: [Function: [nodejs.util.inspect.custom]]
}
$ node --version
v20.10.0
$ NODE_OPTIONS="--no-warnings=ExperimentalWarning --experimental-loader=ts-node/esm" npx ts-node main.ts
[Object: null prototype] {
  [Symbol(nodejs.util.inspect.custom)]: [Function: [nodejs.util.inspect.custom]]
}

@davidthornton
Copy link

Hello TypeScript team!

I appear to also be experiencing this with my loader command:

api-1  | > node --no-warnings --watch --loader ts-node/esm index.ts
api-1  | 
api-1  | 
api-1  | node:internal/process/esm_loader:40
api-1  |       internalBinding('errors').triggerUncaughtException(
api-1  |                                 ^
api-1  | [Object: null prototype] {
api-1  |   [Symbol(nodejs.util.inspect.custom)]: [Function: [nodejs.util.inspect.custom]]
api-1  | }
api-1  | 
api-1  | Node.js v18.19.0
api-1  | Failed running 'index.ts'

Any help would be appreciated!

@davidthornton
Copy link

Apologies, team I misinterpreted @cj-christoph-gysin's answer as a confirmation that (all) node 18 minor versions worked and that it was just node 20 -- but didn't know I could simply downgrade from my existing 18.19.0 Docker image to the 18.18.2 image build... Which I can now happily confirm a second time - works!

I'm not terribly familiar with node/ts/es6 internals but does that mean it's a problem with the ts-node loader, or could it still be a weird minor version node runtime change?

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

4 participants