Can't run my Node.js Typescript project TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /app/src/App.ts
Asked Answered
E

32

480

When I try to start my app on Heroku I got the following stack trace. It is just a basic ts.app like you see with ts-node and nodemon.

I am really interested in what the answer is going to be.

2020-05-30T00:03:12.201106+00:00 heroku[web.1]: Starting process with command `npm start`
2020-05-30T00:03:14.405285+00:00 app[web.1]: 
2020-05-30T00:03:14.405303+00:00 app[web.1]: > [email protected] start /app
2020-05-30T00:03:14.405303+00:00 app[web.1]: > ts-node src/App.ts
2020-05-30T00:03:14.405304+00:00 app[web.1]: 
2020-05-30T00:03:14.833655+00:00 app[web.1]: (node:23) ExperimentalWarning: The ESM module loader is experimental.
2020-05-30T00:03:14.839311+00:00 app[web.1]: TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /app/src/App.ts
2020-05-30T00:03:14.839312+00:00 app[web.1]:     at Loader.defaultGetFormat [as _getFormat] (internal/modules/esm/get_format.js:65:15)
2020-05-30T00:03:14.839314+00:00 app[web.1]:     at Loader.getFormat (internal/modules/esm/loader.js:113:42)
2020-05-30T00:03:14.839315+00:00 app[web.1]:     at Loader.getModuleJob (internal/modules/esm/loader.js:244:31)
2020-05-30T00:03:14.839315+00:00 app[web.1]:     at processTicksAndRejections (internal/process/task_queues.js:97:5)
2020-05-30T00:03:14.839316+00:00 app[web.1]:     at Loader.import (internal/modules/esm/loader.js:178:17)
2020-05-30T00:03:14.847801+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2020-05-30T00:03:14.847998+00:00 app[web.1]: npm ERR! errno 1
2020-05-30T00:03:14.848957+00:00 app[web.1]: npm ERR! [email protected] start: `ts-node src/App.ts`
2020-05-30T00:03:14.849050+00:00 app[web.1]: npm ERR! Exit status 1
2020-05-30T00:03:14.849172+00:00 app[web.1]: npm ERR! 
2020-05-30T00:03:14.849254+00:00 app[web.1]: npm ERR! Failed at the [email protected] start script.
2020-05-30T00:03:14.849337+00:00 app[web.1]: npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
2020-05-30T00:03:14.854859+00:00 app[web.1]: 
2020-05-30T00:03:14.854998+00:00 app[web.1]: npm ERR! A complete log of this run can be found in:
2020-05-30T00:03:14.855069+00:00 app[web.1]: npm ERR!     /app/.npm/_logs/2020-05-30T00_03_14_850Z-debug.log
2020-05-30T00:03:14.907689+00:00 heroku[web.1]: Process exited with status 1
2020-05-30T00:03:14.943718+00:00 heroku[web.1]: State changed from starting to crashed

This is my package.json:

{
   "name": "discordtoornamentmanager",
   "version": "1.0.0",
   "description": "",
   "main": "dist/app.js",
   "type": "module",
   "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1",
      "dev": "nodemon -x ts-node src/App.ts",
      "start": "ts-node src/App.ts"
   },
   "keywords": [],
   "author": "",
   "license": "ISC",
   "dependencies": {
      "@types/node": "^14.0.5",
      "axios": "^0.19.2",
      "discord.js": "^12.2.0",
      "pg": "^8.2.1",
      "reflect-metadata": "^0.1.10",
      "typeorm": "0.2.25",
      "typescript": "^3.9.3",
      "nodemon": "^2.0.4",
      "ts-node": "8.10.1"

   }
}

And this is my tsconfig:

{
   "compilerOptions": {
      "lib": [
         "es6"
      ],
      "target": "es6",
      "module": "commonjs",
      "moduleResolution": "node",
      "outDir": "dist",
      "resolveJsonModule": true,
      "emitDecoratorMetadata": true,
      "esModuleInterop": true,
      "experimentalDecorators": true,
      "sourceMap": true
   },
   "include": ["src/**/*.ts"],
   "exclude": ["node_modules", "**/*.spec.ts"]
}
Eugenieeugenio answered 30/5, 2020 at 0:7 Comment(3)
Lots of people are facing this issue #65098194Coact
It is way way down in the answers list but in 2023 tsx seems to just work whereas ts-node gets bogged down in experimental features and even then often won't work.Offensive
@Elizar Pongracz Would you consider accepting my answer below to use tsx since this is the only option that works well in 2023. Helpful for other developers to save a ton of time with just this small actionWexford
U
524

Remove "type": "module" from package.json


https://github.com/TypeStrong/ts-node/issues/935

https://github.com/TypeStrong/ts-node/issues/1007#issuecomment-1163471306


If you don't want to remove "type": "module" (for example if you're using import statements in your .ts which allows the inference of types from modules), then you can use the following option in tsconfig.json:

{
  "compilerOptions": {
    "esModuleInterop": true,
  }
}

And then you can start the server with the config using ts-node.

Install:

npm install -g ts-node

Run:

ts-node-esm my_server.ts
Untread answered 30/5, 2020 at 8:35 Comment(30)
It seems here is a problem with es modules and ts-node. Here is another issue github.com/TypeStrong/ts-node/issues/1007 for esm supports feedback. You can try workaround from usage part. Also, The ESM module loader is experimental so of course it's unstable approach.Untread
Removing "type": "module" gives me To load an ES module, set "type": "module" in the package.json for a script I use import { ... } form '../' in.Batiste
@DanDascalescu, you are right. Unfortunately, it's not possible to use ESM without "type": "module". The described solution works because the author mentioned: "module": "commonjs" in his tsconfig.json :) otherwise, you can try hop into 1007Untread
@wormsparty exactly! I'm still in itHiram
@wormsparty, did you find a solution in the end?Stagey
Yes. What I was doing was try and run a Typescript file with something like ts-node myfile.ts, and that made these errors. What I did is put my script in an existing Angular project and execute it when I press some button, and everything worked OKRhody
Well, I dont have an angular project. Just a regular folder with ts files and trying to use VSCode with itCoact
@Rhody Escape the loopVinia
this solution did not work for me....still unknown file extensionNotification
"esModuleInterop": true is already there in tsconfig file, still getting this error.Weapon
I added "esModuleInterop": true to my tsconfig.json, now my terminal explodes with errors error TS2349: This expression is not callable. Type 'typeof e' has no call signatures. A namespace-style import cannot be called or constructed, and will cause a failure at runtime. Type 'typeof serveStatic' has no call signatures. etc.Richy
using ts-node the .ts file ran without the "esModuleInterop": true in tsconfigPritchett
however, how could I make vscode run ts-node my_server.ts after hitting the "run" UI button ?Hygrothermograph
I can't remove it because I'm using top-level awaitMoriyama
Any update, using es interop didn't work when running npx ts-node src/index.tsLevi
Try running ts-node with the --esm flag. That fixed the ERR_UNKNOWN_FILE_EXTENSION error for me. I'm using Node 16.15.1 btw. ex: ts-node --esm myfile.tsUnhelm
Can be solved by ts-node and base configuration as described blog.appsignal.com/2022/01/19/… , here is my answer based on it https://mcmap.net/q/79880/-can-39-t-run-my-node-js-typescript-project-typeerror-err_unknown_file_extension-unknown-file-extension-quot-ts-quot-for-app-src-app-tsExperimental
The ts-node config options defined in this answer solved for me. In tsconfig.json add: "ts-node": { "esm": true, "experimentalSpecifierResolution": true }Liverwort
The module option is there for a reason and some of us want to use it. Here's something that worked for me on 2022. Just compiled my ts with "module": "ES2020" and "sourceMap": true, then focused my index.ts file and pressed F5 with a break point in it. No launch.json was needed.Girhiny
I had to restore the "type": "module" from package.json while using the --esm flag.Mattoid
@MatthewHerbst 's answer works for me, except I have to set "experimentalSpecifierResolution" to "node" instead of true.Vibrator
Wild that this answer has 400 upvote but doesn't actually work. Maybe it did once but as of May 2023 it doesn't.Cissy
Yep, I've gone through every suggestion here and ts-node-esm is still giving me 'unknown file extension: .ts'.Iddo
The solution that does work in 2023 is adding: ``` "ts-node": { "esm": true, "experimentalSpecifierResolution": "node" } ``` to tsconfig.json (instead of running by ts-node-esm)Gamesmanship
freaking golly.Opsonin
If after trying @vadimk7's answer, you face an "ESM resolve" error (i.e. ..\..\node-internal-modules-esm-resolve.js:366), you may resolve this by including the extension of the soon-to-be compiled files in the .ts file that needs them. For example, inside your App.ts you may import like so: import { typeDefs } from "./schema.js"; and import { users } from "./db.js"; Notice that the import statements include the extensions of schema and db. Their extensions are '.js' even though we are in a .ts file and the files we are importing from are also '.ts' files.Duenna
For anyone struggling, just use tsx as per my answer below. It's the modern way to do it with 900K+ weekly downloads at the time of writing - Nov 2023. Please upvote my answer below so less people waste time trying to make ts-node work and realizing it simply doesn't work. tldr; Just use tsx because it works out of the box and don't waste any more time - $ tsx my-script.tsWexford
I tried everything above and nothing worked, until this final comment -- replacing ts-node with tsx fixed my issues almost immediately. Thank you so much, @wongz!Bivouac
I can't believe I am here in 2024. For me BunJS is a relief for such headache with NodeJS. Bun is not without flaws, but running typescript modules - NO PAINProcessional
tsx just worked out of the boxShadshadberry
W
349

In my opinion, this answer is best. https://mcmap.net/q/81068/-unable-to-import-esm-ts-module-in-node

tldr; After years of trying to make ts-node work, just use tsx which works out of the box.

npm i -D tsx
npx tsx src/index.ts

npm: https://www.npmjs.com/package/tsx

  • Has 400k weekly downloads at the time of writing and rising.
Wexford answered 26/5, 2023 at 18:23 Comment(21)
I was literally about to cry because I couldn't get my stuff to build during an all-nighter before a major deadline. This saved my day big time!! Thanks!Brume
easily the best answer here. I tried them all and imo tsx is just as supported as a community package than anything else and works right out of the box. this is what OP wanted and this provides that. ts-node will always require mucking around with your package type and ESM related stuff.Lavettelavigne
Only answer that worked for me, no other solution made any difference (remove/add "type":"mode" or whatever, use ts-node config or config nodemon execMap, etc, etc, etc). It's just pathetic a thing made to read typescript files emits an error message saying .ts is an unknown file extension!Skiing
This is the best and simplest solution. Thanks.Vhf
2023 way to go.Concuss
"This is the way"Connection
"Just works" is my favorite kind of works. Thanks!Avignon
Saved the day, thank you!Creight
Thank the authors of tsx as well as thank you for pointing me to this. So happy to toss ts-node aside for good.Poona
And 2024 still the way to go. My execution times also improved by a lot!Whitethroat
Yup, that is the way! thanksBennie
2024, this is the way !Medrek
I tried literally every other suggestion in the thread. This is the only one that worked. Genius.Prediction
It does not support decorators so if you're using nestjs this won't workDoubleheader
You're an Absoute LegendPrelature
Thank you! This should really be the top answer. 2024, this is the way!Koslo
Goodbye ts-node, hi TSX 👋Zepeda
Faaaaakk ts-node, thank you sir, this worked. Love you.Besant
I have dozens of TS project and ts-node bugs me everytime. F you, thanks tsxMancunian
TSX is cool but buggy. I found out it sets properties to undefined for child classes that have a parent constructor assign properties to them.Jung
Works in 2024. 🔥Lamasery
F
249

use

node --loader ts-node/esm ./my-script.ts

// OR

ts-node --esm ./my-script.ts

instead of

ts-node ./my-script.ts
Flatfoot answered 14/3, 2021 at 15:35 Comment(14)
what is ts-node/esm? No description at github.com/bluelovers/ws-esm-ts-nodeCoact
more info is here https://github.com/TypeStrong/ts-node/issues/1007Flatfoot
For me this is the right answer. If I want to work with modules, removing the types = module is no solution. A workaround is the tsconfig module option in the script call to be overwritten with commonjs. But that is also unpleasant.Trucking
To run it with nodemon we can use environment variables. The call could then look something like this : NODE_OPTIONS='--no-warnings --loader ts-node/esm' nodemon --watch 'src/**/*' -e ts,tsx --exec ts-node ./server.tsTrucking
This worked, now I can run individual typescript files!Gridiron
@AlexanderVu's suggestion was exactly what I needed. Thanks.Boettcher
This answer MAY stop working later this month... beware of node 16.10 github.com/TypeStrong/ts-node/issues/1372Barsac
This is working for me. I want to add that: 1. need to install the ts-node package, can't do npx ts-node as I used to do 2. need to have a ts-config.json, even though all my files are js filesDendrology
Why does this work?Ppm
You can also use ts-node --esm ./my-script.tsCrosier
This worked for me, but I needed to make sure to import modules with a .js extension e.g. `import { StoreLibrary } from './src/StoreServer.js' even though they were .ts files. Hope this helps anyone who still can't resolve files.Rolan
Also for those using nodemon, adding a nodemon.json file with { "execMap": { "ts": "node --loader ts-node/esm" }} will make nodemon use ts-node with esm.Rolan
I've noticed something worth sharing. When I used node v. 18.19.0 ts-node --esm ./my-script.ts did not work. It only worked with node --loader ts-node/esm ./my-script.ts. After downgrading to node v.18.18.2 it worked both solutions.Appointee
Thank you! Worked for me as a shebang: #!/usr/bin/env node --loader ts-node/esmLegerdemain
D
130

MARCH 2022

USING: Node 16.6.2, ts-node v 10.7.0

What worked for me was having "type": "module" in package.json, and adding:

node --experimental-specifier-resolution=node --loader ts-node/esm ./src/app.ts

tsconfig.json:

{
    "compilerOptions": {
      "module": "ESNext",
      "esModuleInterop": true,
      "target": "ESNext",
      "moduleResolution": "Node",
      "outDir": "dist",
      "forceConsistentCasingInFileNames": true,
      "noFallthroughCasesInSwitch": true,
      "isolatedModules": false,
      "strict": true,
      "noImplicitAny": true,
      "useUnknownInCatchVariables": false,
      "inlineSourceMap": true
    },
    "ts-node": {
        "esm": true
    },
    "lib": ["esnext"]
}

Credits to @FelipePlets for the useful answer here

EDIT You may want to use a non-esnext option, as per the ts docs:

The special ESNext value refers to the highest version your version of TypeScript supports. This setting should be used with caution, since it doesn’t mean the same thing between different TypeScript versions and can make upgrades less predictable.

Danczyk answered 10/3, 2022 at 14:54 Comment(2)
Thes ts-node: esm: true did it for me 👍 thanks.Zoosperm
thanks for the tsconfig. however I did not need to use any experimental option. I used npmjs.com/package/ts-init however.Kristakristal
P
93

Removing "type": "module" from package.json and adding:

  "compilerOptions": {
    "module": "CommonJS"
  },

In tsconfig.json fixed this for me.

Policyholder answered 18/8, 2021 at 9:29 Comment(6)
This solved my issue. I use Next.js + Express with TypeScript. Changed the "esnext" to "commonJS" from the "module" in tsconfig.json. Everything still works fine, I don't know whether there will be any break or not.Millda
SyntaxError: Cannot use import statement outside a moduleIneptitude
While it would seem to make no sense, in my particular case with this settings I can successfully run code with ES6 Import statements without any issue using ts-node.Popgun
so what's the benefit of using module = es2020? or how would it work? I can't seem to find a way to make it workLdopa
I'm on a similar situation as "Sena", i'm also using Next.js and had to do that in order to run scripts locally and leverage the other .ts files in my repo.Someone
This solved my issue initially but now I can not use "nanoid@5". The error says "Error [ERR_REQUIRE_ESM]: require() of ES Module".Griffen
V
82

Solution One

  1. Remove "type": "module" from package.json if it's added
  2. In tsconfig.json under the compilerOptions Set module property to CommonJS module: "CommonJS" and moduleResolution: "Node"

Solution Two

if the first one didn't work, or you have for some reason to keep module: "ESNext"

1- Add "type": "module" to package.json

2- Install ts-node npm i -g ts-node

3- Go to tsconfig.json and add the following:

{
    "compilerOptions": {
        "module": "ESNext",
        "moduleResolution": "Node",
        /* ... your props ... */
    },
    "ts-node": {
        "esm": true
    }
}

4- Run ts-node fileName.ts

Vesta answered 8/3, 2022 at 2:27 Comment(7)
2- Install ts-node npm i -g ts-node OR: use npx ts-node path/to/file.ts for locally installed ts-nodeGlycolysis
Thank you. Solution 2 worked for me. Missing point in the other answers is that installing "ts-node" step.Leclaire
Solution 2 works as of June 2022Wotan
Solution 2 is the bestAircraftman
Still seeing unknown filename .ts after these (soln 2) steps. Everything is installed.Iddo
Don't use CommonJS modules in 2024, please.Prelature
How? I get this error ^ TSError: ⨯ Unable to compile TypeScript: error TS5023: Unknown compiler option 'ts-node'.Topology
C
45

Try adding this to your tsconfig.json

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

I was able to fix with a tsconfig.json that looked something like:

{
  "compilerOptions": {
    "target": "es2022",
    "lib": ["ES2022"],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true,
    "module": "ES2022",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
  },
  "exclude": [
    "node_modules",
  ],
  "ts-node": {
    "esm": true,
    "experimentalSpecifierResolution": "node",
  }
}
Cotopaxi answered 28/7, 2022 at 0:15 Comment(2)
Adding "experimentalSpecifierResolution": "node" fixed it for me. Thanks.Underlet
Adding "module": "ES2022" (instead of "module": "commonjs") worked for me, thanks!Serafina
C
25

I first came across this problem probably over a year ago, and ts-node has yet to fix it. None of the above solutions worked for me, and I have seemingly tried everything.

I just resorted to using tsc --outDir out file.ts and then running the file normally with node out/file.js, and then adding out to the .gitignore.

The thought behind ts-node is wonderful, just really sucks when it can't handle seemingly straightforward examples like this. Apologies the solution doesn't use ts-node, but I couldn't get it to work.

Capitulation answered 10/8, 2021 at 6:39 Comment(2)
This I think would be the better "manual" solution, compiling the file to js and then run itLanoralanose
Of course make sure not to have "type": "module" in package.jsonLanoralanose
G
19

I made some changes on my package.json & tsconfig.json.Finally, it worked for me!

  1. Add "type": "module" to package.json
  2. Uncomment "moduleResolution": "node" section in your tsconfig.json
  3. Change "module" section to "ESNEXT" in your tsconfig.json
  4. Then Just Run the main script with this node --loader ts-node/esm .\index.ts

tsconfig.json

{
"compilerOptions": {
/* Visit https://aka.ms/tsconfig.json to read more about this file */

/* Projects */
// "incremental": true,                              /* Enable incremental compilation */
// "composite": true,                                /* Enable constraints that allow a TypeScript project to be used with project references. */
// "tsBuildInfoFile": "./",                          /* Specify the folder for .tsbuildinfo incremental compilation files. */
// "disableSourceOfProjectReferenceRedirect": true,  /* Disable preferring source files instead of declaration files when referencing composite projects */
// "disableSolutionSearching": true,                 /* Opt a project out of multi-project reference checking when editing. */
// "disableReferencedProjectLoad": true,             /* Reduce the number of projects loaded automatically by TypeScript. */

/* Language and Environment */
"target": "es5",                                     /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
// "lib": [],                                        /* Specify a set of bundled library declaration files that describe the target runtime environment. */
// "jsx": "preserve",                                /* Specify what JSX code is generated. */
// "experimentalDecorators": true,                   /* Enable experimental support for TC39 stage 2 draft decorators. */
// "emitDecoratorMetadata": true,                    /* Emit design-type metadata for decorated declarations in source files. */
// "jsxFactory": "",                                 /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */
// "jsxFragmentFactory": "",                         /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
// "jsxImportSource": "",                            /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */
// "reactNamespace": "",                             /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */
// "noLib": true,                                    /* Disable including any library files, including the default lib.d.ts. */
// "useDefineForClassFields": true,                  /* Emit ECMAScript-standard-compliant class fields. */

/* Modules */
"module": "ESNEXT",  // ****HERE                          /* Specify what module code is generated. */
// "rootDir": "./",                                  /* Specify the root folder within your source files. */
"moduleResolution": "node",   // ****HERE                     /* Specify how TypeScript looks up a file from a given module specifier. */
// "baseUrl": "./",                                  /* Specify the base directory to resolve non-relative module names. */
// "paths": {},                                      /* Specify a set of entries that re-map imports to additional lookup locations. */
// "rootDirs": [],                                   /* Allow multiple folders to be treated as one when resolving modules. */
// "typeRoots": [],                                  /* Specify multiple folders that act like `./node_modules/@types`. */
// "types": [],                                      /* Specify type package names to be included without being referenced in a source file. */
// "allowUmdGlobalAccess": true,                     /* Allow accessing UMD globals from modules. */
// "resolveJsonModule": true,                        /* Enable importing .json files */
// "noResolve": true,                                /* Disallow `import`s, `require`s or `<reference>`s from expanding the number of files TypeScript should add to a project. */

/* JavaScript Support */
// "allowJs": true,                                  /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */
// "checkJs": true,                                  /* Enable error reporting in type-checked JavaScript files. */
// "maxNodeModuleJsDepth": 1,                        /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */

/* Emit */
// "declaration": true,                              /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
// "declarationMap": true,                           /* Create sourcemaps for d.ts files. */
// "emitDeclarationOnly": true,                      /* Only output d.ts files and not JavaScript files. */
// "sourceMap": true,                                /* Create source map files for emitted JavaScript files. */
// "outFile": "./",                                  /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */
// "outDir": "./",                                   /* Specify an output folder for all emitted files. */
// "removeComments": true,                           /* Disable emitting comments. */
// "noEmit": true,                                   /* Disable emitting files from a compilation. */
// "importHelpers": true,                            /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
// "importsNotUsedAsValues": "remove",               /* Specify emit/checking behavior for imports that are only used for types */
// "downlevelIteration": true,                       /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
// "sourceRoot": "",                                 /* Specify the root path for debuggers to find the reference source code. */
// "mapRoot": "",                                    /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true,                          /* Include sourcemap files inside the emitted JavaScript. */
// "inlineSources": true,                            /* Include source code in the sourcemaps inside the emitted JavaScript. */
// "emitBOM": true,                                  /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
// "newLine": "crlf",                                /* Set the newline character for emitting files. */
// "stripInternal": true,                            /* Disable emitting declarations that have `@internal` in their JSDoc comments. */
// "noEmitHelpers": true,                            /* Disable generating custom helper functions like `__extends` in compiled output. */
// "noEmitOnError": true,                            /* Disable emitting files if any type checking errors are reported. */
// "preserveConstEnums": true,                       /* Disable erasing `const enum` declarations in generated code. */
// "declarationDir": "./",                           /* Specify the output directory for generated declaration files. */

/* Interop Constraints */
// "isolatedModules": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */
// "allowSyntheticDefaultImports": true,             /* Allow 'import x from y' when a module doesn't have a default export. */
"esModuleInterop": true,                             /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */
// "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
"forceConsistentCasingInFileNames": true,            /* Ensure that casing is correct in imports. */

/* Type Checking */
"strict": true,                                      /* Enable all strict type-checking options. */
// "noImplicitAny": true,                            /* Enable error reporting for expressions and declarations with an implied `any` type.. */
// "strictNullChecks": true,                         /* When type checking, take into account `null` and `undefined`. */
// "strictFunctionTypes": true,                      /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
// "strictBindCallApply": true,                      /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */
// "strictPropertyInitialization": true,             /* Check for class properties that are declared but not set in the constructor. */
// "noImplicitThis": true,                           /* Enable error reporting when `this` is given the type `any`. */
// "useUnknownInCatchVariables": true,               /* Type catch clause variables as 'unknown' instead of 'any'. */
// "alwaysStrict": true,                             /* Ensure 'use strict' is always emitted. */
// "noUnusedLocals": true,                           /* Enable error reporting when a local variables aren't read. */
// "noUnusedParameters": true,                       /* Raise an error when a function parameter isn't read */
// "exactOptionalPropertyTypes": true,               /* Interpret optional property types as written, rather than adding 'undefined'. */
// "noImplicitReturns": true,                        /* Enable error reporting for codepaths that do not explicitly return in a function. */
// "noFallthroughCasesInSwitch": true,               /* Enable error reporting for fallthrough cases in switch statements. */
// "noUncheckedIndexedAccess": true,                 /* Include 'undefined' in index signature results */
// "noImplicitOverride": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */
// "noPropertyAccessFromIndexSignature": true,       /* Enforces using indexed accessors for keys declared using an indexed type */
// "allowUnusedLabels": true,                        /* Disable error reporting for unused labels. */
// "allowUnreachableCode": true,                     /* Disable error reporting for unreachable code. */

/* Completeness */
// "skipDefaultLibCheck": true,                      /* Skip type checking .d.ts files that are included with TypeScript. */
"skipLibCheck": true                                 /* Skip type checking all .d.ts files. */
}}

package.json

{
"name": "async-with-ts",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"type": "module", // ****HERE
"devDependencies": {
"@types/node-fetch": "^3.0.3",
"ts-node": "^10.2.1",
"typescript": "^4.4.2"
},
"dependencies": {
"node-fetch": "^3.0.0"
  }
}

You should be aware of using this command

node --loader ts-node/esm .\index.ts
Ghiselin answered 4/9, 2021 at 13:48 Comment(5)
Please provide additional details in your answer. As it's currently written, it's hard to understand your solution.Scarper
The above was a canned comment from the review of your answer - Community is a bot, you cannot reply to it. That said, the information and explanations should be added into the answer, not in the comments. Thanks.Nympha
OK.I FIXED THE POSTGhiselin
It's recommeded to read the reference from ts-node: github.com/TypeStrong/ts-node/issues/1007Ilene
Point 3. lead to "The file is in the program because: Part of 'files' list in tsconfig.json"Lanoralanose
S
12

After some experimentation with my ts-node/puppeteer configuration I came up with this:

package.json

{
    "type": "module",
    "scripts": {
        "start": "npx ts-node main.ts"
    },
    ...
}

tsconfig.json

{
    "ts-node": { "esm": true, "experimentalSpecifierResolution": "node" },
    "compilerOptions": {
        "esModuleInterop": true,
        "moduleResolution": "node",
        "module": "ESNext",
        ...
    },
    ...
}

Works great for running puppeteer in a TypeScript environment.
(Running NodeJS 19.0.0 with TypeScript 4.9.4 and ts-node 10.9.1)

Slipnoose answered 9/2, 2023 at 8:58 Comment(1)
2023 May, on Node.js 20, it does not work.Hygrothermograph
L
8

I tried to remove this error by following methods but FAILED :

  1. Using .mts extension.
  2. Using type:commonjs instead of type:module in package.json (this will not let you use 'import' in your TS file, However i wanted that, therefore i consider this try to be failed).
  3. Restarting the VS-Code

Then I tried the following and SUCCEEDED (one of them is enough):

  1. Using --esm flag with ts-node command. e.g => npx ts-node --esm ./src/index.ts
  2. Inside tsConfig.json, add another option after Compiler options' closing bracket named "ts-node" and set its "esm" option to "true", same as below :
{
  "compilerOptions": {
    "module": "ESNext",
    "moduleResolution": "Node",
    /* ... other props ... */
  },
  "ts-node": {
    "esm": true, /* ... Line to be added ... */
  } 
}
Lorenalorene answered 19/12, 2022 at 16:18 Comment(1)
This is what worked for me. I like the suggestion of modifying tsconfig so you don't have to remember to type --esm on command lineSamos
K
6

You can use ts-node-esm instead of ts-node, keeping "type":"module" in package.json, and using import './module.js' in your .ts files.

Related: https://github.com/TypeStrong/ts-node/issues/1007

UPDATE:

This answer has an even better solution as allows to import modules without .js extension:

https://mcmap.net/q/81068/-unable-to-import-esm-ts-module-in-node

Kurdish answered 11/4, 2022 at 2:46 Comment(1)
Yes, we're just trying to run ts-node with modules, thanks!Ovation
E
5

Running ts-node with --esm worked for me.

For example:

ts-node --esm src/App.ts

That error is caused by trying to import modules, which without the ES Modules flag, ts-node doesn't support.

Emunctory answered 18/1, 2023 at 17:4 Comment(0)
B
5

This bug is rather amusing. I found that it is specific to Node.js version 18. To resolve it, I downgraded to Node.js version 16 using NVM. Surprisingly, the issue disappeared without requiring any modifications to my code or configuration. For those utilizing ts-node and nodemon in their development environment, I recommend downgrading to Node.js version 16 instead of using version 18.

Bortman answered 5/12, 2023 at 17:52 Comment(4)
The problem seems to be specifically with Node 18.19.0. Node versions prior to that should continue to work, so rolling back to 18.18.2 might be the best option rather than going all the way down to 16. I suspect the problem was introduced in: nodejs.org/en/blog/release/…Papa
I totally agree on thatBortman
I have version 20.5.1 and still the same bugKipkipling
This is a feature of stupid typescript and node having weird format and standardBugle
B
2

I followed advice given herein. I also had to uninstall lodash-es and install lodash instead to make it work.

Boniface answered 15/10, 2021 at 15:56 Comment(0)
F
1

if your tsconfig.json contains "module": "ESNext". I have used the below script in my package.json. It worked.

 "start": "nodemon -e ts -w ./src -x npm run watch:serve",
 "watch:serve": "node --loader ts-node/esm src/server.ts",
Flavor answered 1/8, 2022 at 16:1 Comment(1)
It solved the issue for me without having to remove "type": "module" or simply avoiding the use of nodemon. Can you please explain what are the paramenters passed in these 2 commands?Lekishalela
A
1

Some packages needs ES Modules. In my case I was using @Auth/core library which was internally using ES modules instead of CommonJS. So, to resolve this error. I follwed these steps.

Step#1

Upgraded Node to v19 or greater. (In my case node18 was causing error. So, I upgraded to node19)

NODE --> v19.9.0
NPM -->  v9.6.3

Step#2

In package.json add "type"= "module" e.g

{
  ...
  "author": "",
  "type": "module",    <--- * Add this
  "license": "ISC",
  ...
}

Step#3

In tsconfig.json file add ts-node property. e.g

{
  "compileOnSave": true,
  "compilerOptions": {
    ...
    "target": "ESNext",
    "lib": ["ESNext", "esnext.asynciterable"],
    "emitDecoratorMetadata": true,
    "moduleResolution": "node",
    "module": "ESNext",
    ...
  },
  "ts-node": {
    // 
    "esm": true,  <--- Tell ts-node CLI to install the --loader automatically
  },
  "include": ["src/**/*.ts", "src/**/*.json", ".env"],
  "exclude": ["node_modules", "src/http", "src/logs"]
}

Step#4 Update All imports (Or you can try to solve it in a better way)

Import files with exact path and extension(e.g file_name.ts). e.g

import { UserController } from '../controllers/user.controller.ts';

.

Note:- I was getting error with nodemon for development. For that my exec command was

"exec": "ts-node -r tsconfig-paths/register --transpile-only src/server.ts"
Apthorp answered 23/12, 2023 at 14:23 Comment(2)
Thanks for this answer. I also want to add that I use node --loader ts-node/esm src/server.ts instead of ts-nodeBugle
No need to use ts-node/esm in command if using "esm": true, property inside tsconfig.json fileApthorp
P
1

Upgrading from [email protected] to [email protected] generated this error when running tests using mocha:

npx mocha -r ts-node/register --reporter list --recursive src/test/**.

Fix (currently) is to rollback to [email protected].

Prato answered 12/2 at 0:17 Comment(0)
E
0

July 2022, with the use of ts-node

Node 16.14.2, ts-node 10.8.2

First install ts-node and base configuration

npm install ts-node --save-dev
npm install @tsconfig/node16 --save-dev

tsconfig.json:

{
    "extends": "@tsconfig/node16/tsconfig.json",
    "compilerOptions": {
        "resolveJsonModule": true
    },
    "include": [
        "main.ts"
        // here you can include another directories with sources
    ],
    "exclude": [
        "node_modules"
    ]
}

You can remove everything related to modules/compilation from package.json.

And then you can run your program as

ts-node ./main.ts
Experimental answered 7/7, 2022 at 16:32 Comment(0)
F
0

For me (node version 14), for some reason, the problem was that I install the serialize-error package and when I tried to import it to threw that error. To solve it I downgraded the version of the package from 11.0.0 to 8.0.0.

Frasch answered 25/8, 2022 at 7:38 Comment(0)
H
0

If you use PowerShell on VS Code on Windows 11 try to use this command:

ts-node-esm.cmd .\my_script.ts

after this solution: https://mcmap.net/q/79880/-can-39-t-run-my-node-js-typescript-project-typeerror-err_unknown_file_extension-unknown-file-extension-quot-ts-quot-for-app-src-app-ts

Helman answered 7/10, 2022 at 12:41 Comment(1)
Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.Scarper
C
0

For anyone who is running into this issue while trying run an script in an NX project.

# For apps
ts-node --project tsconfig.app.json $yourFilePath

# For libraries
ts-node --project tsconfig.lib.json $yourFilePath

# For tests
ts-node --project tsconfig.spec.json $yourFilePath
Chessa answered 7/12, 2022 at 22:12 Comment(0)
C
0

@vadimk7 wasn't far off, my solution was to change my file extension to .mts and then use ts-node-esm myfile.mts

Clearheaded answered 31/1, 2023 at 15:12 Comment(1)
This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From ReviewHeilbronn
A
0

After trying all the solutions here, it still didn't work. Then I changed my run script from npx ts-node --esm index.ts to ts-node --project tsconfig.json index.ts and it worked!

Audsley answered 15/6, 2023 at 16:36 Comment(0)
V
0

Try a different version of node. It works okay for version 19 on my machine, but not on 21.


There is an incompatibility between es modules and some versions of node. See the related Github issue

Vacillation answered 19/1 at 15:4 Comment(0)
F
-3

before this:

node --loader ts-node/esm ./my-script.ts

I had to update ssri

npm update ssri --depth 5

Fennie answered 6/5, 2021 at 3:2 Comment(0)
W
-3

Not sure if this will help anyone but I fixed it by putting this at the start:

#!/usr/bin/env node
Writ answered 18/8, 2021 at 9:3 Comment(0)
G
-3

Add this to tsconfig.json

{
  /* ... your props ... */

  "ts-node": {
    "compilerOptions": {
      "module": "CommonJS"
    }
  }
}
Gymnastic answered 23/12, 2021 at 16:7 Comment(0)
T
-4

I wanted to use ES modules instead of commonjs in my project. In addition to making some changes covered in other answers, the last need step for me was to add this to my compilerOptions in tsconfig.json:

"sourceMap": true,
Thromboplastin answered 1/1, 2023 at 23:58 Comment(0)
S
-6

changing my

"moduleResolution": "node", 

to

"moduleResolution": "Node",

in package.json solved this for me

Southernmost answered 15/3, 2022 at 13:30 Comment(1)
do you have an explanation, its not working for me. ThanksCumulostratus
S
-7

In your package.json {Module:commonJS}, and tsconfig.json {module:commonJS},to ts-node youname.ts

Sheaff answered 18/1, 2022 at 10:2 Comment(1)
As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.Scarper
C
-7

I changed my imports from:

import blah from './modules/blah'

to

import blah from './modules.blah.js'

Crelin answered 14/2, 2022 at 21:51 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.