Skip to content

Compile time errors being suppressed when using esm #2129

Open
@Stono

Description

I really struggled to think of the correct title for this, so please edit it as required. I went down a rabbithole today whilst moving one of our apps to esm, as it was failing to start (with ts-node) due to the following node error:

❯ node --experimental-specifier-resolution=node --loader ts-node/esm lib/index.ts
node:internal/modules/run_main:115
    triggerUncaughtException(
    ^
[Object: null prototype] {
  [Symbol(nodejs.util.inspect.custom)]: [Function: [nodejs.util.inspect.custom]]
}

Node.js v22.5.1

Doesn't really give away much. It turned out however that the root caused we missed a return type on a promise eg Promise needed to be Promise<void>. This error was visible if you did a tsc, but ts-node was giving this output.

After gradually chipping away at the code to make a minimal example; i managed to reproduce it with a really simple bit of code that doesn't even technically have an error in it.

Assuming your code is in ./lib, create ./lib/index.ts:

import { SomeServer } from './server.js'

const webServer = new SomeServer()

and ./lib/server.ts:

export class SomeServer {}

If you try and start this; you'll get the error. The only thing "wrong" with this code is the fact that webServer is an unused variable. If i add console.log(webServer), eg:

import { SomeServer } from './server.js'

const webServer = new SomeServer()
console.log(webServer)

Then all is well:

❯ node --experimental-specifier-resolution=node --loader ts-node/esm lib/index.ts

SomeServer {}

Specifications

  • versions:
❯ ./node_modules/.bin/ts-node -vv
ts-node v10.9.2
node v22.5.1
compiler v5.3.3
  • tsconfig.json:
{
  "compilerOptions": {
    "lib": ["ES2022", "DOM"],
    "module": "ES2022",
    "target": "ES2022",
    "rootDir": "./",
    "outDir": "./built",
    "baseUrl": "./",
    "allowJs": false,
    "checkJs": false,
    "alwaysStrict": true,
    "noImplicitAny": true,
    "noImplicitThis": true,
    "strictNullChecks": true,
    "strictFunctionTypes": true,
    "strictPropertyInitialization": true,
    "noEmitOnError": false,
    "sourceMap": false,
    "declaration": false,
    "strictBindCallApply": true,
    "noImplicitOverride": true,
    "noUncheckedIndexedAccess": true,
    "incremental": false,
    "skipDefaultLibCheck": true,
    "experimentalDecorators": true,
    "noUnusedLocals": true,
    "esModuleInterop": true,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "allowSyntheticDefaultImports": true,
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true
  },
  "include": ["lib/**/*.ts", "test/**/*.ts"],
  "exclude": ["node_modules/**/*"]
}
  • Operating system and version: Mac

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions