dividab / tsconfig-paths

Load node modules according to tsconfig paths, in run-time or via API.
MIT License
1.8k stars 100 forks source link

Add support for relative paths from extended tsconfig #265

Open alSergey opened 6 months ago

alSergey commented 6 months ago

Hello, thanks for the cool library. I'm using nuxt and have encountered an issue where when using the library I'm getting incorrect relative paths returned from tsconfig.

Example

FIle System

tsconfig.json

{
  "extends": "./.nuxt/tsconfig.json"
}

.nuxt/tsconfig.json

{
  "compilerOptions": {
    "paths": {
      "~": [
        ".."
      ],
      "assets": [
        "../assets"
      ],
      "#app": [
        "../node_modules/nuxt/dist/app"
      ],
      "#imports": [
        "./imports"
      ],
    }
  },
}

Expected

{
  "paths": {
    "~": [
      "."
    ],
    "assets": [
      "assets"
    ],
    "#app": [
      "node_modules/nuxt/dist/app"
    ],
    "#imports": [
      ".nuxt/imports"
    ],
  }
}

Result

{
  "paths": {
    "~": [
      ".."
    ],
    "assets": [
      "../assets"
    ],
    "#app": [
      "../node_modules/nuxt/dist/app"
    ],
    "#imports": [
      "./imports"
    ],
  }
}

Suggestion

When searching for paths in tsconfig.json, consider the path to the tsconfig file in which the paths were found and the baseUrl field.

Example code

const filesBasePath = path.join(configRelativeDir, baseUrl || '.') // configRelativeDir = '.nuxt'

const relativePaths = Object.entries(paths).reduce((obj, [key, values]) => ({
      ...obj,
      [key]: values?.map((item) => path.join(filesBasePath, item)),
}), {})