Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tsconfig.json: Specify <root> in "include" and "exclude" for extends configs #51213

Closed
5 tasks done
karlhorky opened this issue Oct 18, 2022 · 9 comments
Closed
5 tasks done
Labels
Awaiting More Feedback This means we'd like to hear from more people who would be helped by this feature Suggestion An idea for TypeScript

Comments

@karlhorky
Copy link
Contributor

karlhorky commented Oct 18, 2022

Suggestion

As always, thanks again for all of your hard work on the TypeScript tooling and ecosystem! 🙌

Extends configs (configs referenced from "extends") can specify "include" and "exclude", but they are relative to the tsconfig.json file (which could be deep in node_modules) instead of the root of the directory, per the include docs:

These filenames are resolved relative to the directory containing the tsconfig.json file.

This means that the following configuration would not work as expected:

tsconfig.json

{
  "extends": "@upleveled/eslint-config-upleveled/templates/tsconfig.json"
}

node_modules/@upleveled/eslint-config-upleveled/templates/tsconfig.json

  "include": [
    "**/.eslintrc.cjs",
    "next-env.d.ts",
    "**/*.ts",
    "**/*.tsx",
    "**/*.js",
    "**/*.jsx",
    "**/*.cjs",
    "**/*.mjs"
  ],

(this would resolve relative to the node_modules deep path, which would be useless)

Removal of such broken config can also be seen in the wild here: tsconfig/bases#41

Suggestion 1: <root> directory specifier

It would be great to get a <root> capability to add to include and exclude paths to refer to the directory with the package.json file, like Jest's <rootDir> option:

  "include": [
    "<root>/**/*.ts"
  ]

Suggestion 2: tsconfig.ts

Another idea for implementation would be to have a code-based config (ideally tsconfig.ts, as @weswigham mentions in #20110) - I'm guessing this would open up alternative ways to retrieve the root directory of the project.

Allowing TS / JS configs is a common pattern in developer tooling, and covers many use cases beyond this issue.

🔍 Search Terms

extends, extended, root directory, root folder, configs, tsconfig

✅ Viability Checklist

My suggestion meets these guidelines:

  • This wouldn't be a breaking change in existing TypeScript/JavaScript code
  • This wouldn't change the runtime behavior of existing JavaScript code
  • This could be implemented without emitting different JS based on the types of the expressions
  • This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
  • This feature would agree with the rest of TypeScript's Design Goals.

⭐ Suggestion

In the description above

📃 Motivating Example

In the description above

💻 Use Cases

Workaround

Specify the paths using relative paths:

  "include": [
    "../../../../**/.eslintrc.cjs",
    "../../../../next-env.d.ts",
    "../../../../**/*.ts",
    "../../../../**/*.tsx",
    "../../../../**/*.js",
    "../../../../**/*.jsx",
    "../../../../**/*.cjs",
    "../../../../**/*.mjs"
  ],

But here this encodes the directory structure of node_modules into the config as well, which is brittle.

@MartinJohns
Copy link
Contributor

Related: #37227

@fatcerberus
Copy link

Using include in an extends’d config seems useless in general (or at least highly situational) because according to the docs:

It’s worth noting that files, include and exclude from the inheriting config file overwrite those from the base config file

@MartinJohns
Copy link
Contributor

Related: #20110

@RyanCavanaugh RyanCavanaugh added Suggestion An idea for TypeScript Awaiting More Feedback This means we'd like to hear from more people who would be helped by this feature labels Oct 20, 2022
@karlhorky
Copy link
Contributor Author

karlhorky commented Jan 3, 2023

Using include in an extends’d config seems useless in general (or at least highly situational)

@fatcerberus Consider projects which do not need to update the config in the extends (eg. they just want to include all files of all extensions). These projects can be very common in situations where:

  1. Companies create multiple projects based on their "boilerplate", with no customizations needed for include or exclude
  2. Students create multiple projects based on a programming boilerplate, with no customizations needed for include or exclude (this is our use case)

I think there are other scenarios for this type of boilerplate as well.

@karlhorky
Copy link
Contributor Author

karlhorky commented Jan 3, 2023

Another idea for implementation would be to have a code-based config (ideally tsconfig.ts, as @weswigham mentions in #20110) - I'm guessing this would open up alternative ways to retrieve the root directory of the project.

Allowing TS / JS configs is a common pattern in developer tooling, and covers many use cases beyond this issue.

But I think @mhegazy is against a code-based config tsconfig.ts.

Asking whether this can be reconsidered here: #20110 (comment)

I will also add this to the issue description above.

ouuan added a commit to ouuan/tsconfig that referenced this issue Jan 28, 2023
The paths are relative to the tsconfig.json file, making them useless.

See microsoft/TypeScript#51213
alexey-koran added a commit to alexey-koran/tsconfig that referenced this issue Jan 29, 2023
@isqua
Copy link

isqua commented May 31, 2023

Using include in an extends’d config seems useless in general (or at least highly situational)

@fatcerberus It is useful in monorepositories where you share infrastructure configurations across multiple packages.

@AxeloLabs
Copy link

I am using a monorepo, there is no way to control the output of relative file, I mean inclue, exclude, outdir, all of them are relative to the base conf. What I need is to have a base conf, that have settings that applies relatively to the current project.
I do not have inheritence working for files's outputs with tsconfig.

@shellscape
Copy link

Considering the severe limitations and perf problems that typescript-eslint has with lots of tsconfig.json files in a repo, this is sorely needed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Awaiting More Feedback This means we'd like to hear from more people who would be helped by this feature Suggestion An idea for TypeScript
Projects
None yet
Development

No branches or pull requests

8 participants