From 3c07b1652b5cbad7bd320fef55c24982f5347d4f Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Fri, 28 Jul 2023 16:20:57 -0400 Subject: [PATCH 1/9] WIP: blog post on parserOptions.project = true --- .../2023-08-02-parser-options-project-true.md | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 packages/website/blog/2023-08-02-parser-options-project-true.md diff --git a/packages/website/blog/2023-08-02-parser-options-project-true.md b/packages/website/blog/2023-08-02-parser-options-project-true.md new file mode 100644 index 000000000000..26fd11403fe6 --- /dev/null +++ b/packages/website/blog/2023-08-02-parser-options-project-true.md @@ -0,0 +1,118 @@ +--- +authors: + - image_url: https://www.joshuakgoldberg.com/img/josh.jpg + name: Josh Goldberg + title: typescript-eslint Maintainer + url: https://github.com/JoshuaKGoldberg +description: Simplifying how many projects resolve their +slug: parser-options-project-true +tags: [parser, parser options, project, tsconfig] +title: Relative TSConfig Projects with `parserOptions.project = true` +--- + +["Typed linting"](/linting/typed-linting), or enabling ESLint rules to tap into the power of the TypeScript type checker, is one of the best parts of typescript-eslint. +But enabling the type checker in repositories with multiple `tsconfig.json` files can be annoying to set up. +Even worse, specifying the wrong include paths could result in incorrect rule reports and/or unexpectedly slow lint times. + +Improving the setup experience for typed lint rules has been a long-standing goal for typescript-eslint. +One long-standing feature request for that experience has been to support automatically detecting TSConfigs for developers. +We're happy to say that we now support that by setting `parserOptions.project` equal to `true` in ESLint configurations. + +This post will explain what life was like before, what's changed, and what's coming next. 🎉 + + + +## The Problem With Projects + +The `@typescript-eslint/parser` package is what enables ESLint to parse TypeScript source files. +It converts raw TypeScript code into an ["AST" format](./2022-12-05-asts-and-typescript-eslint.md). +When [`parserOptions.project`](https://typescript-eslint.io/packages/parser#project) is specified, it additionally sets up TypeScript programs that can be used by [typed rules](https://typescript-eslint.io/developers/custom-rules#typed-rules). + +Many projects today start with ESLint configs that look something like: + +```js +module.exports = { + // ... + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, + // ... +}; +``` + +In larger repos, `parserOptions.project` often ends up being one of the three traditionally allowed forms: + +- Path, such as `project: './tsconfig.json'` +- Glob pattern, such as `project: './packages/**/tsconfig.json'` +- Array of paths and/or glob patterns, such as `project: ['./packages/**/tsconfig.json', './separate-package/tsconfig.json']` + +Explicitly indicating which TSConfig files are used for typed linting can be useful. +Developers like being given explicit control over their tooling. +However, we've seen a few issues arise from this approach: + +- Particularly large repos can end up with so many TSConfig globs, they become confusing to developers or even cause [performance issues from overly permissive globs](https://typescript-eslint.io/linting/troubleshooting/performance-troubleshooting#wide-includes-in-your-eslint-options) +- Needing to change a template ESLint config every time it's used for a different repository structure is a pain +- Using different TSConfigs than what your editor users can result in different lint reports in the editor verses on the command-line + +Although developers may sometimes need exact control over their `parserOptions.project`, most of the time we don't want to configure this. +Most repositories we've seen just want to use the _nearest `tsconfig.json` to each linted file_. + +In other words, many developers want our [issue #101: Feature request: support looking up tsconfig.json relative to linted file](https://github.com/typescript-eslint/typescript-eslint/issues/101). + +## Introducing `true` + +As of typescript-eslint@5.52.0, we now support providing `true` as the value `parserOptions.project`: + +```js +module.exports = { + // ... + parserOptions: { + project: true, + tsconfigRootDir: __dirname, + }, + // ... +}; +``` + +Doing so indicates that each source file being linted should use type information based on the nearest `tsconfig.json` in its directory. +For each file, `@typescript-eslint/parser` will check that file's directory, then the parent directory, and so on - until a `tsconfig.json` file is found. + +:::tip +We recommend specifying [`tsconfigRootDir`](http://localhost:3000/packages/parser#tsconfigrootdir) in ESLint configs with a value set to the project's root directory (most commonly, `__dirname`). +That way, if you accidentally delete or rename the root `tsconfig.json` file, `@typescript-eslint/parser` won't search parent directories for higher `tsconfig.json` files. +::: + +We're hopeful that `parserOptions.project: true` is satisfactory for most projects to use typed linting. +We've seen it reduce lines of codes of ESLint configurations in many projects that have switched to it. +It's even occasionally even reduced time spent on typed linting by helping projects use a simpler set of TSConfigs. + +### Mix-and-Matching Projects + +TODO: need to confirm whether this works! + +### How It Works + +TODO: mention the caching just a bit + +See [feat(typescript-estree): allow specifying project: true](https://github.com/typescript-eslint/typescript-eslint/pull/6084) for more information. + +## What's Next + +### Custom TSConfig Names + +TODO: find or file an issue asking about allowing e.g. `tsconfig.eslint.json` + +### Project Services + +TODO: reference `EXPERIMENTAL_useProjectService` + +### A Complete Rewrite of ESLint + +TODO: reference the ESLint discussion, and phrase it as many-years-down-the-road. + +## Supporting typescript-eslint + +If you enjoyed this blog post and/or or use typescript-eslint, please consider [supporting us on Open Collective](https://opencollective.com/typescript-eslint). +We're a small volunteer team and could use your support to make the ESLint experience on TypeScript great. +Thanks! 💖 From b5d39409f71b2578da4a2591b6d8f2f5aaadff11 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Sun, 30 Jul 2023 17:19:55 -0400 Subject: [PATCH 2/9] Filled out the rest --- .../2023-08-02-parser-options-project-true.md | 59 +++++++++++++++---- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/packages/website/blog/2023-08-02-parser-options-project-true.md b/packages/website/blog/2023-08-02-parser-options-project-true.md index 26fd11403fe6..eebeb4019bd2 100644 --- a/packages/website/blog/2023-08-02-parser-options-project-true.md +++ b/packages/website/blog/2023-08-02-parser-options-project-true.md @@ -62,7 +62,7 @@ In other words, many developers want our [issue #101: Feature request: support l ## Introducing `true` -As of typescript-eslint@5.52.0, we now support providing `true` as the value `parserOptions.project`: +As of typescript-eslint@5.52.0, we now support providing `true` for `parserOptions.project`: ```js module.exports = { @@ -83,33 +83,68 @@ We recommend specifying [`tsconfigRootDir`](http://localhost:3000/packages/parse That way, if you accidentally delete or rename the root `tsconfig.json` file, `@typescript-eslint/parser` won't search parent directories for higher `tsconfig.json` files. ::: -We're hopeful that `parserOptions.project: true` is satisfactory for most projects to use typed linting. -We've seen it reduce lines of codes of ESLint configurations in many projects that have switched to it. -It's even occasionally even reduced time spent on typed linting by helping projects use a simpler set of TSConfigs. +### Why Try `true` -### Mix-and-Matching Projects +If your project uses typed linting and manually specifies `tsconfig.json` files, we'd highly recommend trying out `parserOptions.project: true`. +We've seen it reduce lines of codes of ESLint configurations in many projects that have switched to it. +It's even occasionally even reduced time spent on typed linting by helping projects use a simpler set of TSConfigs. 🚀 -TODO: need to confirm whether this works! +In the long term, we're hoping to further improve the configuration and performance for typed linting (see _[Project Services](#project-services)_ below). +Simplifying your configuration now will make it easier to onboard to our new options when they're available. ### How It Works -TODO: mention the caching just a bit +When `@typescript-eslint/parser` is configured to generate type information, it attaches a backing TypeScript "Program" for to file it parses. +Those Programs provide type checking APIs used by lint rules. +Each TSConfig file on disk is generally used to create exactly one Program, so files that refer to the same TSConfig file will reuse the same Program. + +Depending on how the ESLint config's `parserOptions.project` was specified, determining _which_ TSConfig file to use for each file can be different: -See [feat(typescript-estree): allow specifying project: true](https://github.com/typescript-eslint/typescript-eslint/pull/6084) for more information. +- For a single string (e.g. `"tsconfig.json"`), then only one Program will be created, and all linted files will reuse it. +- For globs and/or arrays (e.g. `"./packages/*/tsconfig.json"`), then each linted file will reuse a Program based on the _first_ matched TSConfig file. + +For `true`, each linted file will first try the `tsconfig.json` in its directory, then its parent directory, and so on until one is found on disk or the directory root (`parserOptions.tsconfigRootDir`) is reached. + +:::note +`@typescript-eslint/parser` caches those directory `tsconfig.json` file lookups for a duration corresponding to [`parserOptions.cacheLifetime`](/packages/parser#cachelifetime). +No potential TSConfig path should be checked more than once in a lint run. +::: + +See [feat(typescript-estree): allow specifying project: true](https://github.com/typescript-eslint/typescript-eslint/pull/6084) for the backing code changes. ## What's Next ### Custom TSConfig Names -TODO: find or file an issue asking about allowing e.g. `tsconfig.eslint.json` +Some projects use TSConfig files with names other than `tsconfig.json`: most commonly, `tsconfig.eslint.json`. +`parserOptions.project: true` does not support specifying different name(s) to search for. +We have two followup issues filed to investigate fleshing out that support: + +- [Enhancement: Allow altering the file names that project: true searches for](https://github.com/typescript-eslint/typescript-eslint/issues/7383) +- [Enhancement: Allow parserOptions.project to be (true | string)[]?](https://github.com/typescript-eslint/typescript-eslint/issues/7384) + +If either of those two issues would benefit you, please 👍 react to them. +And if your project has a use case not yet mentioned in their comments, please post that use case. +We want to know what's important for users! ### Project Services -TODO: reference `EXPERIMENTAL_useProjectService` +The downside of having users specify `parserOptions.project` at all is that `@typescript-eslint/parser` needs manual logic to create TypeScript Programs and associate them with linted files. +Manual Program creation logic comes with a few issues: + +- Complex project setups can be difficult to get right. + - For example, [typescript-eslint does not yet support Project References](https://github.com/typescript-eslint/typescript-eslint/issues/2094). +- The TypeScript compiler options used in the user's editor might differ from the compiler options in the TSConfigs they specified on disk. +- Files not included in created Programs can't be linted with type information, even though editors still typically surface type information when editing those files. + - Most commonly, `.eslintrc.(c)js` files can be tricky to lint, resulting in the dreaded [_TSConfig does not include this file_ error](/troubleshooting#i-get-errors-telling-me-eslint-was-configured-to-run--however-that-tsconfig-does-not--none-of-those-tsconfigs-include-this-file). + +We're working on an option to instead call the same TypeScript "Project Service" APIs that editors such as VS Code use to create Programs for us instead. +Project Services will automatically detect the TSConfig for each file (like `project: true`), and will also allow type information to be computed for JavaScript files without the `allowJs` compiler option (unlike `project: true`). -### A Complete Rewrite of ESLint +We're hopeful this option will eventually become the standard way to enable typed linting. +However, because it's so new and untested, we're keeping it under the `EXPERIMENTAL_` prefix for at least all of the `6.X` versions. -TODO: reference the ESLint discussion, and phrase it as many-years-down-the-road. +See [Packages > Parser > `EXPERIMENTAL_useProjectService`](/packages/parser#EXPERIMENTAL_useProjectService) for more information. ## Supporting typescript-eslint From 517fd202d89d1f4af8f76f2f7b4078c054744e56 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Sun, 30 Jul 2023 18:20:17 -0400 Subject: [PATCH 3/9] Rename heading to 'Investigating' --- packages/website/blog/2023-08-02-parser-options-project-true.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/website/blog/2023-08-02-parser-options-project-true.md b/packages/website/blog/2023-08-02-parser-options-project-true.md index eebeb4019bd2..c265f2914617 100644 --- a/packages/website/blog/2023-08-02-parser-options-project-true.md +++ b/packages/website/blog/2023-08-02-parser-options-project-true.md @@ -114,7 +114,7 @@ See [feat(typescript-estree): allow specifying project: true](https://github.com ## What's Next -### Custom TSConfig Names +### Investigating Custom TSConfig Names Some projects use TSConfig files with names other than `tsconfig.json`: most commonly, `tsconfig.eslint.json`. `parserOptions.project: true` does not support specifying different name(s) to search for. From fbcc8126240f540f6d21b65ccdd5255f61e5ce06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josh=20Goldberg=20=E2=9C=A8?= Date: Fri, 8 Sep 2023 13:58:08 +0200 Subject: [PATCH 4/9] Apply suggestions from code review Co-authored-by: Joshua Chen --- .../2023-08-02-parser-options-project-true.md | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/website/blog/2023-08-02-parser-options-project-true.md b/packages/website/blog/2023-08-02-parser-options-project-true.md index c265f2914617..6e700b3dde8e 100644 --- a/packages/website/blog/2023-08-02-parser-options-project-true.md +++ b/packages/website/blog/2023-08-02-parser-options-project-true.md @@ -53,10 +53,9 @@ However, we've seen a few issues arise from this approach: - Particularly large repos can end up with so many TSConfig globs, they become confusing to developers or even cause [performance issues from overly permissive globs](https://typescript-eslint.io/linting/troubleshooting/performance-troubleshooting#wide-includes-in-your-eslint-options) - Needing to change a template ESLint config every time it's used for a different repository structure is a pain -- Using different TSConfigs than what your editor users can result in different lint reports in the editor verses on the command-line +- Using a TSConfig that's different from what your editor uses can result in different lint reports between the editor and the command-line -Although developers may sometimes need exact control over their `parserOptions.project`, most of the time we don't want to configure this. -Most repositories we've seen just want to use the _nearest `tsconfig.json` to each linted file_. +Although developers may sometimes need exact control over their `parserOptions.project`, most of the time we just want to use the _nearest `tsconfig.json` to each linted file_, which is the TSConfig used by the editor by default. In other words, many developers want our [issue #101: Feature request: support looking up tsconfig.json relative to linted file](https://github.com/typescript-eslint/typescript-eslint/issues/101). @@ -79,29 +78,29 @@ Doing so indicates that each source file being linted should use type informatio For each file, `@typescript-eslint/parser` will check that file's directory, then the parent directory, and so on - until a `tsconfig.json` file is found. :::tip -We recommend specifying [`tsconfigRootDir`](http://localhost:3000/packages/parser#tsconfigrootdir) in ESLint configs with a value set to the project's root directory (most commonly, `__dirname`). +We recommend setting the [`tsconfigRootDir`](/packages/parser#tsconfigrootdir) ESLint config to the project's root directory (most commonly, `__dirname`). That way, if you accidentally delete or rename the root `tsconfig.json` file, `@typescript-eslint/parser` won't search parent directories for higher `tsconfig.json` files. ::: ### Why Try `true` If your project uses typed linting and manually specifies `tsconfig.json` files, we'd highly recommend trying out `parserOptions.project: true`. -We've seen it reduce lines of codes of ESLint configurations in many projects that have switched to it. -It's even occasionally even reduced time spent on typed linting by helping projects use a simpler set of TSConfigs. 🚀 +We've seen it reduce lines of code in ESLint configurations in many early adopters. +Sometimes, it even reduces time spent on typed linting by helping projects use a simpler set of TSConfigs. 🚀 In the long term, we're hoping to further improve the configuration and performance for typed linting (see _[Project Services](#project-services)_ below). Simplifying your configuration now will make it easier to onboard to our new options when they're available. ### How It Works -When `@typescript-eslint/parser` is configured to generate type information, it attaches a backing TypeScript "Program" for to file it parses. +When `@typescript-eslint/parser` is configured to generate type information, it attaches a backing TypeScript "Program" for each file it parses. Those Programs provide type checking APIs used by lint rules. -Each TSConfig file on disk is generally used to create exactly one Program, so files that refer to the same TSConfig file will reuse the same Program. +Each TSConfig file on disk is generally used to create exactly one Program, and files included by the same TSConfig file will reuse the same Program. Depending on how the ESLint config's `parserOptions.project` was specified, determining _which_ TSConfig file to use for each file can be different: -- For a single string (e.g. `"tsconfig.json"`), then only one Program will be created, and all linted files will reuse it. -- For globs and/or arrays (e.g. `"./packages/*/tsconfig.json"`), then each linted file will reuse a Program based on the _first_ matched TSConfig file. +- For a single path (e.g. `"tsconfig.json"`), only one Program will be created, and all linted files will reuse it. +- For globs and/or arrays (e.g. `"./packages/*/tsconfig.json"`), each linted file will use the Program created by the _first_ matched TSConfig file. For `true`, each linted file will first try the `tsconfig.json` in its directory, then its parent directory, and so on until one is found on disk or the directory root (`parserOptions.tsconfigRootDir`) is reached. @@ -141,13 +140,13 @@ Manual Program creation logic comes with a few issues: We're working on an option to instead call the same TypeScript "Project Service" APIs that editors such as VS Code use to create Programs for us instead. Project Services will automatically detect the TSConfig for each file (like `project: true`), and will also allow type information to be computed for JavaScript files without the `allowJs` compiler option (unlike `project: true`). -We're hopeful this option will eventually become the standard way to enable typed linting. +We hope this option will eventually become the standard way to enable typed linting. However, because it's so new and untested, we're keeping it under the `EXPERIMENTAL_` prefix for at least all of the `6.X` versions. See [Packages > Parser > `EXPERIMENTAL_useProjectService`](/packages/parser#EXPERIMENTAL_useProjectService) for more information. ## Supporting typescript-eslint -If you enjoyed this blog post and/or or use typescript-eslint, please consider [supporting us on Open Collective](https://opencollective.com/typescript-eslint). +If you enjoyed this blog post and/or use typescript-eslint, please consider [supporting us on Open Collective](https://opencollective.com/typescript-eslint). We're a small volunteer team and could use your support to make the ESLint experience on TypeScript great. Thanks! 💖 From 86a0598586e4eca6a2b51d131b3a8bb41c5f65b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josh=20Goldberg=20=E2=9C=A8?= Date: Mon, 11 Sep 2023 23:11:37 -0400 Subject: [PATCH 5/9] Apply suggestions from code review Co-authored-by: Joshua Chen --- .../website/blog/2023-08-02-parser-options-project-true.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/website/blog/2023-08-02-parser-options-project-true.md b/packages/website/blog/2023-08-02-parser-options-project-true.md index 6e700b3dde8e..aed72b50bb5e 100644 --- a/packages/website/blog/2023-08-02-parser-options-project-true.md +++ b/packages/website/blog/2023-08-02-parser-options-project-true.md @@ -51,7 +51,7 @@ Explicitly indicating which TSConfig files are used for typed linting can be use Developers like being given explicit control over their tooling. However, we've seen a few issues arise from this approach: -- Particularly large repos can end up with so many TSConfig globs, they become confusing to developers or even cause [performance issues from overly permissive globs](https://typescript-eslint.io/linting/troubleshooting/performance-troubleshooting#wide-includes-in-your-eslint-options) +- Particularly large repos can end up with so many TSConfig globs, they become confusing to developers or even cause [performance issues from overly permissive globs](/linting/troubleshooting/performance-troubleshooting#wide-includes-in-your-eslint-options) - Needing to change a template ESLint config every time it's used for a different repository structure is a pain - Using a TSConfig that's different from what your editor uses can result in different lint reports between the editor and the command-line @@ -135,7 +135,7 @@ Manual Program creation logic comes with a few issues: - For example, [typescript-eslint does not yet support Project References](https://github.com/typescript-eslint/typescript-eslint/issues/2094). - The TypeScript compiler options used in the user's editor might differ from the compiler options in the TSConfigs they specified on disk. - Files not included in created Programs can't be linted with type information, even though editors still typically surface type information when editing those files. - - Most commonly, `.eslintrc.(c)js` files can be tricky to lint, resulting in the dreaded [_TSConfig does not include this file_ error](/troubleshooting#i-get-errors-telling-me-eslint-was-configured-to-run--however-that-tsconfig-does-not--none-of-those-tsconfigs-include-this-file). + - Most commonly, `.eslintrc.(c)js` files can be tricky to lint, resulting in the dreaded [_TSConfig does not include this file_ error](/linting/troubleshooting#i-get-errors-telling-me-eslint-was-configured-to-run--however-that-tsconfig-does-not--none-of-those-tsconfigs-include-this-file). We're working on an option to instead call the same TypeScript "Project Service" APIs that editors such as VS Code use to create Programs for us instead. Project Services will automatically detect the TSConfig for each file (like `project: true`), and will also allow type information to be computed for JavaScript files without the `allowJs` compiler option (unlike `project: true`). From ad9f4d50b0049cfbcde3c6bacdb7ef7583907419 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Mon, 11 Sep 2023 23:36:07 -0400 Subject: [PATCH 6/9] Update date for this week --- ...-project-true.md => 2023-09-12-parser-options-project-true.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/website/blog/{2023-08-02-parser-options-project-true.md => 2023-09-12-parser-options-project-true.md} (100%) diff --git a/packages/website/blog/2023-08-02-parser-options-project-true.md b/packages/website/blog/2023-09-12-parser-options-project-true.md similarity index 100% rename from packages/website/blog/2023-08-02-parser-options-project-true.md rename to packages/website/blog/2023-09-12-parser-options-project-true.md From c17d28c503e1bb0861d8e85f8321fe698db1c7f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josh=20Goldberg=20=E2=9C=A8?= Date: Tue, 12 Sep 2023 14:49:48 -0400 Subject: [PATCH 7/9] Update packages/website/blog/2023-09-12-parser-options-project-true.md Co-authored-by: Armano --- packages/website/blog/2023-09-12-parser-options-project-true.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/website/blog/2023-09-12-parser-options-project-true.md b/packages/website/blog/2023-09-12-parser-options-project-true.md index aed72b50bb5e..6493d13ee350 100644 --- a/packages/website/blog/2023-09-12-parser-options-project-true.md +++ b/packages/website/blog/2023-09-12-parser-options-project-true.md @@ -26,7 +26,7 @@ This post will explain what life was like before, what's changed, and what's com The `@typescript-eslint/parser` package is what enables ESLint to parse TypeScript source files. It converts raw TypeScript code into an ["AST" format](./2022-12-05-asts-and-typescript-eslint.md). -When [`parserOptions.project`](https://typescript-eslint.io/packages/parser#project) is specified, it additionally sets up TypeScript programs that can be used by [typed rules](https://typescript-eslint.io/developers/custom-rules#typed-rules). +When [`parserOptions.project`](/packages/parser#project) is specified, it additionally sets up TypeScript programs that can be used by [typed rules](/developers/custom-rules#typed-rules). Many projects today start with ESLint configs that look something like: From 8bcead76714f3358cfa77e5abc8b64d11affbbc2 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Tue, 12 Sep 2023 14:50:27 -0400 Subject: [PATCH 8/9] Publish date: 18th --- ...-project-true.md => 2023-09-18-parser-options-project-true.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/website/blog/{2023-09-12-parser-options-project-true.md => 2023-09-18-parser-options-project-true.md} (100%) diff --git a/packages/website/blog/2023-09-12-parser-options-project-true.md b/packages/website/blog/2023-09-18-parser-options-project-true.md similarity index 100% rename from packages/website/blog/2023-09-12-parser-options-project-true.md rename to packages/website/blog/2023-09-18-parser-options-project-true.md From 0368db6bfbe99c3e63b06d5e8034522fea795da6 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Tue, 12 Sep 2023 14:51:11 -0400 Subject: [PATCH 9/9] formatting with the space for email --- packages/website/blog/2023-09-18-parser-options-project-true.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/website/blog/2023-09-18-parser-options-project-true.md b/packages/website/blog/2023-09-18-parser-options-project-true.md index 6493d13ee350..c3f7f3fb59d0 100644 --- a/packages/website/blog/2023-09-18-parser-options-project-true.md +++ b/packages/website/blog/2023-09-18-parser-options-project-true.md @@ -61,7 +61,7 @@ In other words, many developers want our [issue #101: Feature request: support l ## Introducing `true` -As of typescript-eslint@5.52.0, we now support providing `true` for `parserOptions.project`: +As of typescript-eslint 5.52.0, we now support providing `true` for `parserOptions.project`: ```js module.exports = {