Skip to content

Conversation

@fasttime
Copy link
Member

@fasttime fasttime commented Nov 20, 2025

Prerequisites checklist

What is the purpose of this pull request?

Add built-in types to ESLint Scope

What changes did you make? (Give an overview)

  • Copied and updated types and tests from DefinitelyTyped
    • Added addGlobals() to ScopeManager
    • Marked globalScope in ScopeManager as nullable
    • Moved implicit from Scope to GlobalScope and added implicit.variables
    • Added missing Scope subclasses
    • Added @deprecated tag to deprecated members per https://github.com/eslint/eslint/blob/v10.0.0-alpha.0/docs/src/extend/scope-manager-interface.md
    • Restricted functionExpressionScope to true or false depending on whether the Scope is FunctionExpressionNameScope
    • Fixed resolve() in Scope (the definition in @types/eslint-scope is very different, possibly unrelated)
    • Fixed several inconsistencies in PatternVisitor
  • Enabled type checking for source files in packages/eslint-scope/lib to verify they match the type declarations
  • Added npm scripts to test types
  • Added "Are the types wrong?" CI job
  • Linting *.ts and *.cts files
  • Minor fixes in the logic:
    • Reference#isStatic() now always returns a boolean even when resolved is not set
    • ScopeManager#isImpliedStrict() now always returns a boolean even when the impliedStrict option is not set

Related Issues

fixes #708

Is there anything you'd like reviewers to focus on?

@nzakas nzakas moved this from Needs Triage to Implementing in Triage Nov 21, 2025
Comment on lines +1 to +4
/**
* @fileoverview This file contains the types for ESLint Scope.
* It was initially extracted from the DefinitelyTyped repository.
*/
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adapting the DefinitelyTyped types should be fine in terms of licensing, although I think it doesn't quite align with this project's guidelines:

- You will only Submit Contributions where You have authored 100% of the content.

@fasttime fasttime requested a review from Copilot November 25, 2025 10:45
Copilot finished reviewing on behalf of fasttime November 25, 2025 10:48
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds built-in TypeScript type definitions to the ESLint Scope package, eliminating the need for separate @types/eslint-scope packages. The types were adapted from DefinitelyTyped with enhancements including nullable global scope, additional scope subclasses, deprecated member tags, and improved type safety through type checking of JavaScript source files.

Key changes:

  • Added TypeScript declaration files (index.d.ts, index.d.cts) with comprehensive type definitions
  • Enabled type checking for JavaScript source files using JSDoc annotations
  • Added type testing infrastructure with npm scripts and CI workflow

Reviewed changes

Copilot reviewed 17 out of 18 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
packages/eslint-scope/tsconfig.json TypeScript configuration for type-checking JavaScript source files
packages/eslint-scope/tests/types/tsconfig.json TypeScript configuration for type test files
packages/eslint-scope/tests/types/types.test.ts Comprehensive type tests covering all exported APIs
packages/eslint-scope/tests/types/cjs-import.test.cts CommonJS import type test
packages/eslint-scope/package.json Added type exports, dependencies, and scripts
packages/eslint-scope/lib/*.js Added JSDoc type annotations to source files
packages/eslint-scope/lib/index.d.ts ESM type declaration file (re-exports from .cts)
packages/eslint-scope/lib/index.d.cts Main CommonJS type declaration file
eslint.config.js Added TypeScript file linting configuration
package.json Added TypeScript parser and expect-type plugin
.github/workflows/ci.yml Added "Are the types wrong?" CI job

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

"noImplicitThis": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"types": [],
Copy link

Copilot AI Nov 25, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove the trailing comma on line 14. While trailing commas are allowed in JSON5, standard JSON does not permit trailing commas in objects, which can cause parsing errors in some tools.

Suggested change
"types": [],
"types": []

Copilot uses AI. Check for mistakes.
"extends": "../../tsconfig.json",
"compilerOptions": {
"checkJs": false,
"noImplicitAny": true,
Copy link

Copilot AI Nov 25, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove the trailing comma on line 5. While trailing commas are allowed in JSON5, standard JSON does not permit trailing commas in objects, which can cause parsing errors in some tools.

Suggested change
"noImplicitAny": true,
"noImplicitAny": true

Copilot uses AI. Check for mistakes.
Comment on lines 48 to +63
"devDependencies": {
"@arethetypeswrong/cli": "^0.18.2",
"@typescript-eslint/parser": "^8.7.0",
"chai": "^6.0.0",
"eslint": ">=10.0.0-alpha.0 <10.0.0 || ^10.0.0",
Copy link

Copilot AI Nov 25, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The type declaration file (lib/index.d.cts) imports types from 'eslint' (line 28), but 'eslint' is only listed as a devDependency. For users to properly consume the TypeScript types, 'eslint' should be moved to either 'dependencies' or 'peerDependencies'. Consider making it a peerDependency with an appropriate version range since eslint-scope is typically used alongside ESLint.

Suggested change
"devDependencies": {
"@arethetypeswrong/cli": "^0.18.2",
"@typescript-eslint/parser": "^8.7.0",
"chai": "^6.0.0",
"eslint": ">=10.0.0-alpha.0 <10.0.0 || ^10.0.0",
"peerDependencies": {
"eslint": ">=10.0.0-alpha.0 <10.0.0 || ^10.0.0"
},
"devDependencies": {
"@arethetypeswrong/cli": "^0.18.2",
"@typescript-eslint/parser": "^8.7.0",
"chai": "^6.0.0",

Copilot uses AI. Check for mistakes.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we should make eslint a peerDependency of eslint-scope, as eslint-scope can be used without eslint (for example, webpack uses eslint-scope).

@fasttime fasttime marked this pull request as ready for review November 25, 2025 11:06
/**
* The identifier node of the reference.
*/
identifier: ESTree.Identifier;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can also be JSXIdentifier.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's true, but we need to update the base interface Scope.Reference in ESLint first, because we can't broaden the type of the identifier member in the implementing class.

export class Reference implements eslint.Scope.Reference {

* SOFTWARE
*/

import * as eslint from "eslint";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As this would introduce a circular dependency, maybe we don't need to use types from eslint but just check in tests whether eslint-scope satisfies scope interfaces from eslint?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Implementing

Development

Successfully merging this pull request may close these issues.

Change Request: update eslint-scope types

3 participants