TypeStrong / ts-node

TypeScript execution and REPL for node.js
https://typestrong.org/ts-node
MIT License
12.92k stars 532 forks source link

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" #2122

Open luyifo opened 5 months ago

luyifo commented 5 months ago

Search Terms

When the node version is 18.20.0, running TS-node --esm **.ts displays TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts". Runs successfully after the Node version is reduced to 16.20.2.

PS D:\Testspace\ts-node-demo> pn dev

> ts-node-demo@1.0.0 dev D:\Testspace\ts-node-demo
> ts-node-esm src/index.ts

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for D:\Testspace\ts-node-demo\src\index.ts
    at new NodeError (node:internal/errors:405:5)
    at Object.getFileProtocolModuleFormat [as file:] (node:internal/modules/esm/get_format:136:11)
    at defaultGetFormat (node:internal/modules/esm/get_format:182:36)
    at defaultLoad (node:internal/modules/esm/load:101:20)
    at nextLoad (node:internal/modules/esm/hooks:864:28)
    at load (D:\Testspace\ts-node-demo\node_modules\.pnpm\ts-node@10.9.2_@types+node@20.14.2_typescript@5.4.5\node_modules\ts-node\dist\child\child-loader.js:19:122)
    at nextLoad (node:internal/modules/esm/hooks:864:28)
    at Hooks.load (node:internal/modules/esm/hooks:447:26)
    at MessagePort.handleMessage (node:internal/modules/esm/worker:196:24)
    at [nodejs.internal.kHybridDispatch] (node:internal/event_target:786:20) {
  code: 'ERR_UNKNOWN_FILE_EXTENSION'
}
 ELIFECYCLE  Command failed with exit code 1.
PS D:\Testspace\ts-node-demo> nvm list

  * 18.20.0 (Currently using 64-bit executable)
    16.20.2
PS D:\Testspace\ts-node-demo> nvm use 16.20.2
Now using node v16.20.2 (64-bit)
PS D:\Testspace\ts-node-demo> pn dev

> ts-node-demo@1.0.0 dev D:\Testspace\ts-node-demo
> ts-node-esm src/index.ts

hello world
PS D:\Testspace\ts-node-demo> 

Expected Behavior

Actual Behavior

Steps to reproduce the problem

Minimal reproduction

Specifications

etulikov commented 5 months ago

I had the same issue, downgrade Node to 18.18 help. My engines:

"engines": {
    "node": ">=18.18.0 <18.19.0"
  },
EvilCodeMorty commented 4 months ago

Have you solved this problem?I switched the versions of 22,18 and 16 with different problems, and the configuration file has been modified, but it still doesn't work

EvilCodeMorty commented 4 months ago

"module": "CommonJS", "esModuleInterop": true,

EvilCodeMorty commented 4 months ago

My code compilation is no problem, I specially configured a file for "ts-node", code compilation is another file, anyway just to see the state of writing code, so I specially configured a file for "ts-node", compilation is another file;"tsconfig.dev.json"and"tsconfig.json"

EvilCodeMorty commented 4 months ago
"dev": "cross-env TS_NODE_PROJECT=tsconfig.dev.json nodemon --exec ts-node src/main.ts",
EvilCodeMorty commented 4 months ago
"dev": "cross-env TS_NODE_PROJECT=tsconfig.dev.json nodemon --exec ts-node src/main.ts",
lhapaipai commented 4 months ago

seems to work for me with node and --loader flag

{
  "scripts": {
-    "not-work": "ts-node-esm src/main.ts",
+    "dev": "node --loader ts-node/esm --no-warnings=ExperimentalWarning src/main.ts"
  }
}

node: v20.5.0 ts-node: v10.9.2

kyledetella commented 4 months ago

seems to work for me with node and --loader flag

{
  "scripts": {
-    "not-work": "ts-node-esm src/main.ts",
+    "dev": "node --loader ts-node/esm --no-warnings=ExperimentalWarning src/main.ts"
  }
}

node: v20.5.0 ts-node: v10.9.2

This worked for me. Thanks @lhapaipai

meotimdihia commented 3 months ago

try to use tsx instead. It works flawlessly for me.

ranamaniz commented 3 months ago

seems to work for me with node and --loader flag

{
  "scripts": {
-    "not-work": "ts-node-esm src/main.ts",
+    "dev": "node --loader ts-node/esm --no-warnings=ExperimentalWarning src/main.ts"
  }
}

node: v20.5.0 ts-node: v10.9.2

worked for me too thanks

bekkazy-k commented 2 months ago

Change package.json type from "module" to "commonjs" helped to me. https://www.npmjs.com/package/ts-node#commonjs

douglascayers commented 2 months ago

seems to work for me with node and --loader flag

{
  "scripts": {
-    "not-work": "ts-node-esm src/main.ts",
+    "dev": "node --loader ts-node/esm --no-warnings=ExperimentalWarning src/main.ts"
  }
}

node: v20.5.0 ts-node: v10.9.2

Thanks @lhapaipai!

In my scenario, I had to also workaround the following error. I think it stems from my project does not have a top-level tsconfig.json, but rather sub-folders define different configs similar to a monorepo. So I either had to manually cd down into a sub-folder then run the command, or I could have node figure it out via the import command.

Object.defineProperty(exports, "__esModule", { value: true });
                      ^
ReferenceError: exports is not defined in ES module scope

My modified command is:

{
  "scripts": {
-   "dev": "node --loader ts-node/esm --no-warnings=ExperimentalWarning src/main.ts"
+   "dev": "node --loader ts-node/esm --no-warnings=ExperimentalWarning -e \"import('${0}');\""
  }
}

Example Usage:

yarn dev path/to/my/file.ts
lhymmEU commented 1 month ago

seems to work for me with node and --loader flag

{
  "scripts": {
-    "not-work": "ts-node-esm src/main.ts",
+    "dev": "node --loader ts-node/esm --no-warnings=ExperimentalWarning src/main.ts"
  }
}

node: v20.5.0 ts-node: v10.9.2

Thanks @lhapaipai!

In my scenario, I had to also workaround the following error. I think it stems from my project does not have a top-level tsconfig.json, but rather sub-folders define different configs similar to a monorepo. So I either had to manually cd down into a sub-folder then run the command, or I could have node figure it out via the import command.

Object.defineProperty(exports, "__esModule", { value: true });
                      ^
ReferenceError: exports is not defined in ES module scope

My modified command is:

{
  "scripts": {
-   "dev": "node --loader ts-node/esm --no-warnings=ExperimentalWarning src/main.ts"
+   "dev": "node --loader ts-node/esm --no-warnings=ExperimentalWarning -e \"import('${0}');\""
  }
}

Example Usage:

yarn dev path/to/my/file.ts

Awesome, that solved my problem. Thanks!

According to the warnings, I've also added a workaround for the "experimentalWarning" issue. I created a "loader.js" in my project root's folder:

import { register } from "node:module";
import { pathToFileURL } from "node:url";

// Register the TypeScript loader
register("ts-node/esm", pathToFileURL('./'));

Then I changed my package.json to:

{
  "scripts": {
      "dev": "node --import './loader.js' src/index.ts"
  }
}
AmosTmg commented 1 month ago

It runs when I change the type to commonjs in package.json.