ts-node: [Typescript 5.0] TypeError: value.replace is not a function

Search Terms

  • Typescript 5.0
  • tsconfig extends array

Expected Behavior

No error.

Actual Behavior

$ npm exec -- ts-node --esm --swc ./path/to/reproduce.mts
/path/to/node_modules/ts-node/dist/util.js:62
    return value.replace(backslashRegExp, directorySeparator);
                 ^

TypeError: value.replace is not a function
    at normalizeSlashes (/path/to/node_modules/ts-node/dist/util.js:62:18)
    at Object.getExtendsConfigPath (/path/to/node_modules/ts-node/dist/ts-internals.js:24:54)
    at readConfig (/path/to/node_modules/ts-node/dist/configuration.js:127:64)
    at findAndReadConfig (/path/to/node_modules/ts-node/dist/configuration.js:50:84)
    at phase3 (/path/to/node_modules/ts-node/dist/bin.js:254:67)
    at bootstrap (/path/to/node_modules/ts-node/dist/bin.js:47:30)
    at Object.<anonymous> (/path/to/node_modules/ts-node/dist/child/child-entrypoint.js:23:21)
    at Module._compile (node:internal/modules/cjs/loader:1254:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)
    at Module.load (node:internal/modules/cjs/loader:1117:32)

Node.js v18.15.0

Debug

function normalizeSlashes(value) {console.warn({value})
    return value.replace(backslashRegExp, directorySeparator);
}

errrlog

{
  value: [ '@tsconfig/strictest/tsconfig', '@tsconfig/node18/tsconfig' ]
}

Steps to reproduce the problem

Minimal reproduction

Specifications

  • ts-node version: latest
  • node version: v18.15.0
  • TypeScript version: latest
  • tsconfig.json, if you’re using one:
  "extends": [
    "@tsconfig/strictest/tsconfig",
    "@tsconfig/node18/tsconfig"
  ],
  • package.json:
{}
  • Operating system and version:
  • If Windows, are you using WSL or WSL2?:

Additional

https://www.npmjs.com/package/@tsconfig/node18-strictest-esm

This package has been deprecated Author message: TypeScript 5.0 supports combining TSConfigs using array syntax in extends

https://github.com/tsconfig/bases#what-about-combined-configs

Because of previous limitations in the config extension system of TypeScript, this repo used to provide combined configs from a few common bases (like Node + ESM, Node + Strictest and so on).

This issue is now moot since TypeScript v5.0.0, which provides the ability to extend from multiple configs at once. For instance, if you want to start from a Node 18 + Strictest base config, you can install both @tsconfig/node18 and @tsconfig/strictest packages and extend those configs like so:

// tsconfig.json
{
  "extends": ["@tsconfig/strictest/tsconfig", "@tsconfig/node18/tsconfig"]
}

https://devblogs.microsoft.com/typescript/announcing-typescript-5-0-rc/#supporting-multiple-configuration-files-in-extends

About this issue

  • Original URL
  • State: open
  • Created a year ago
  • Reactions: 79
  • Comments: 45

Commits related to this issue

Most upvoted comments

In my project , change tsconfig.json extends: ['...'] to extends: '...' can fix it.

Can we please get a 10.9.2 with just this fix? Is there any ETA? What is the benefit of waiting?

I would consider porting to an alternative like SWC if you require TypeScript v5 support. Maintainers of open-source repositories don’t owe their users answers to questions like this.

Workaround May have to install direct from git until the next release, see https://github.com/TypeStrong/ts-node/pull/1958

From https://github.com/TypeStrong/ts-node/discussions/1977#discussion-5014427

npm install -D TypeStrong/ts-node#main

Workaround

$ npm exec -- tsc --showConfig > tsconfig.tsnode.json
$ npm exec -- ts-node --project tsconfig.tsnode.json --esm --swc ./reproduce.mts

@ahollenbach What’s the reason why the maintainers haven’t issued a new release for more than one year?

@gspetrou the solution is to migrate to another library (like @swc/register).

This is a critical issue, in a critical library (in ts ecosystem) and there is still no solution (the issue was created on April 24)

There is nothing we can do to fix this issue, other than wait for the maintainers.

Does someone have a workaround about this issue ? It still blocking me while running end to end and unit tests 😞

And i’ve got the same issue when i try to get the next dev release

My workarround : leave only one element on the extends ("extends": "./node_modules/gts/tsconfig-google.json") and move others in the main tsconfig file

It would be awesome if ts-node could release a fix for this! A package that I use (Cypress) uses ts-node internally, and the old @tsconfigs in the projects that I work on are incompatible with TypeScript 5 because they have some options that are no longer supported. So until ts-node is fixed and Cypress uses that new version, the projects that I work on will have to stick with TypeScript 4 and the old @tsconfigs.

@chenxxzhe, the reason for the thumbs down is that the whole point of this issue is that folks are hoping for support for extends: ['...'].

As a definitive solution, you can migrate to @swc/register.

Also, It can be easily used by jest, mocha, etc…

Or just fork it and publish it yourself since it’s open source and contains changes other people than just the maintainers committed to benefit everyone

https://www.npmjs.com/package/tsx was the best choices for me! I had a lot of pain with ts-node, and either vite-node which was better BTW

With ts-node@11.0.0-beta.1 and TS >5 I’m still getting the same errors with extends. My only way to fix it is to downgrade to TS 4.9.

@Bloodsucker I was too, with Jest, until I added overrides:

  "devDependencies": {
    "ts-node": "11.0.0-beta.1",
    "tsconfig-paths": "4.2.0",
    "typescript": "5.2.2"
  },
  "overrides": {
    "ts-node": "11.0.0-beta.1",
    "tsconfig-paths": "4.2.0"
  }

Just an FYI so you don’t need to duplicate the version, you can just do

  "devDependencies": {
    "ts-node": "11.0.0-beta.1",
    "tsconfig-paths": "4.2.0",
    "typescript": "5.2.2"
  },
  "overrides": {
    "ts-node": "$ts-node",
    "tsconfig-paths": "$tsconfig-paths"
  }

reference

Agreed. It seems absurd that a primary package in the TS ecosystem hasn’t released an update (that’s already merged) to support the current version of the TS language. Is this project no longer being actively maintained?

But the whole point is to be able to extend from multiple configs. That workaround is only good for those inheriting from just one config.

Are you saying swc-node errors when the extends field of tsconfig.json is an array? I don’t think that is true.


By the way, congrats on having this issue fixed for over a year now in main without releasing it in npm 👏🏼👏🏼👏🏼

https://www.npmjs.com/package/tsx was the best choices for me! I had a lot of pain with ts-node, and either vite-node which was better BTW

Thanks. This worked for me. They really need to fix this issue in this package, though.

Does someone have a workaround about this issue ? It still blocking me while running end to end and unit tests 😞

And i’ve got the same issue when i try to get the next dev release

My workarround : leave only one element on the extends ("extends": "./node_modules/gts/tsconfig-google.json") and move others in the main tsconfig file

@StevenDouillet did you try the workaround by @loynoir https://github.com/TypeStrong/ts-node/issues/2000#issuecomment-1519339593

It outputs a tsconfig.tsnode.json from your tsconfig.json that ts-node can understands.

If it helps I’ve used it in this repo unlike-ltd/cloudflare-pages-action

I have 2 cli scripts that use it.

    "tsc:ts-node-config": "tsc --showConfig > tsconfig.tsnode.json",
    "ts-node": "ts-node-esm --project tsconfig.tsnode.json",

Then for any other script I do

    "dev": "pnpm run ts-node --require dotenv/config src/index.ts",
    "codegen": "pnpm run ts-node -T bin/codegen/index.ts",
    "download": "pnpm run ts-node -T bin/download/index.ts"

@top-kat thank you - however nodemon uses ts-node. I don’t know how to configure it otherwise. All I want is to auto compile and restart my TS app on file change

No, I misquoted, see edit.

I switched to swc guys, its pretty simple:

node --loader @swc-node/register/esm src/index.ts

Besides, wanted to share, just saw node has a --watch flag now. so with one less dependency, my npm dev command is even more beautiful:

node -r dotenv/config --watch --watch-path src --loader @swc-node/register/esm src/index.ts

With ts-node@11.0.0-beta.1 and TS >5 I’m still getting the same errors with extends. My only way to fix it is to downgrade to TS 4.9.

FYI - the beta version of ts-node 11 is published: https://www.npmjs.com/package/ts-node/v/11.0.0-beta.1 so installing via git is no longer necessary.

It can be installed using npm install ts-node@11.0.0-beta.1 if using npm.

FYI - this fix has been made already (confirmed locally): https://github.com/TypeStrong/ts-node/pull/1958. However, the maintainers have not issued a new release in more than a year and are recommending installing via git branch in order to consume this change: https://github.com/TypeStrong/ts-node/discussions/1977

As a definitive solution, you can migrate to @swc/register.

Also, It can be easily used by jest, mocha, etc…

In what way is this a solution? It looks like this just binds SWC to be used when importing files with require. This is unrelated to the owner of ts-node refusing to release bug fixes for no reason

Same here. It is breaking everything.

Note that if you have a ts-node config section in your tsconfig file, that it won’t be ported into your tsc --showConfig output. You’ll need to manually copy that over after the hacked tsconfig file is created.