Search code examples
node.jsjsontypescript

Unknown file extension ".ts" with nodemon --exec ts-node


I created a project on the laptop and set it up. Everything worked fine. Now I'm working on PC, I cloned project and when I start server.ts an error occurs:

megaa@DESKTOP-OIQ46IB MINGW64 /d/Code/Pet-project/server (main)
$ npm run start

> [email protected] start
> nodemon --exec ts-node server.ts

[nodemon] 2.0.22
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: ts,json
[nodemon] starting `ts-node server.ts`
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for D:\Code\Pet-project\server\server.ts
    at new NodeError (node:internal/errors:405:5)
    at Object.getFileProtocolModuleFormat [as file:] (node:internal/modules/esm/get_format:99:9)
    at defaultGetFormat (node:internal/modules/esm/get_format:142:36)
    at defaultLoad (node:internal/modules/esm/load:91:20)
    at nextLoad (node:internal/modules/esm/hooks:733:28)
    at load (D:\Code\Pet-project\server\node_modules\ts-node\dist\child\child-loader.js:19:122)
    at nextLoad (node:internal/modules/esm/hooks:733:28)
    at Hooks.load (node:internal/modules/esm/hooks:377:26)
    at MessagePort.handleMessage (node:internal/modules/esm/worker:168:24)
    at [nodejs.internal.kHybridDispatch] (node:internal/event_target:778:20) {
  code: 'ERR_UNKNOWN_FILE_EXTENSION'
}
[nodemon] app crashed - waiting for file changes before starting...

I tried to solve it with removing "type": "module" from package.json - didn't help as well as starting as nodemon --exec ts-node-esm server.ts or nodemon --exec ts-node --esm server.ts. Moreover I have following rows in my tsconfig.json:

"ts-node": {
    "esm": true,
    "experimentalSpecifierResolution": "node"
}

I installed typescript, tsc, ts-node with -g flag as well as nodemon

tsconfig.json:

{
    "compilerOptions": {
        "target": "ES2021",
        "useDefineForClassFields": true,
        "module": "ESNext",
        "lib": [
            "ES2021",
            "DOM",
            "DOM.Iterable"
        ],
        "skipLibCheck": true,
        /* Bundler mode */
        "moduleResolution": "node",
        "allowImportingTsExtensions": true,
        "allowSyntheticDefaultImports": true,
        "resolveJsonModule": true,
        "esModuleInterop": true,
        "isolatedModules": true,
        "noEmit": true,
        /* Linting */
        "strict": true,
        "noUnusedLocals": true,
        "noUnusedParameters": true,
        "noFallthroughCasesInSwitch": true
    },
    "ts-node": {
        "esm": true,
        "experimentalSpecifierResolution": "node"
    }
}

package.json:

{
  "name": "server-side",
  "version": "1.0.0",
  "description": "",
  "main": "./server.ts",
  "scripts": {
    "start": "nodemon --exec ts-node server.ts"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@types/express": "^4.17.17",
    "chalk": "^5.2.0",
    "cors": "^2.8.5",
    "express": "^4.18.2",
    "mysql": "^2.18.1",
    "ts-node": "^10.9.1",
    "tsc": "^2.0.4"
  },
  "devDependencies": {
    "@types/cors": "^2.8.13",
    "@types/mysql": "^2.15.21",
    "nodemon": "^2.0.22",
    "typescript": "^5.1.6"
  }
}

Let me know if I need to provide any additional information


Solution

  • ts-node and ts-node+nodemon are known to be problematic in certain circuimstances (--inspect, cjs/esm interop, some configs), one of which you have encountered.

    Try using a more drop-in-and-it-just-works alternative tsx https://github.com/esbuild-kit/tsx
    tsx server.ts

    It has a builtin watcher, so nodemon is not needed
    tsx watch server.ts


    edit: it's 2024 you should try Bun https://bun.sh/ , which is a node/pnpm alternative with great UX. I now use it for all projects which do not explicitly require node, and even for those I use it as package manager