-
-
Notifications
You must be signed in to change notification settings - Fork 220
feat: add types to ESLint Scope #709
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
base: main
Are you sure you want to change the base?
Conversation
| /** | ||
| * @fileoverview This file contains the types for ESLint Scope. | ||
| * It was initially extracted from the DefinitelyTyped repository. | ||
| */ |
There was a problem hiding this comment.
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. |
There was a problem hiding this 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.
| /** | ||
| * The identifier node of the reference. | ||
| */ | ||
| identifier: ESTree.Identifier; |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
js/packages/eslint-scope/lib/index.d.cts
Line 568 in c6d38b2
| export class Reference implements eslint.Scope.Reference { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Now that the Reference type no longer extends ESLint'sScope.Reference, and the type test that checks Scope.reference is satisfied is temporarily disabled, I've updated identifier so it can be also JSXIdentifier now (ef22a28).
js/packages/eslint-scope/lib/index.d.cts
Line 617 in f5f0808
| export class Reference { |
js/packages/eslint-scope/tests/types/types.test.ts
Lines 492 to 493 in f5f0808
| // @ts-ignore -- needs update in ESLint types | |
| (reference: eslintScope.Reference) => reference satisfies eslint.Scope.Reference; |
It should be possible to re-enable the type test once the current changes in the ESLint repo are released.
|
Hi everyone, it looks like we lost track of this pull request. Please review and see what the next steps are. This pull request will auto-close in 7 days without an update. |
lumirlumir
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks like a good start!
I've left some comments throughout, especially regarding documentation updates.
|
Okay, I think I've addressed all the feedback now. |
01bd9aa to
9a1c587
Compare
lumirlumir
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for all the hard work on the reviews!
I think I've gone through almost every file so far. I've left some more comments throughout.
Co-authored-by: 루밀LuMir <[email protected]>
Co-authored-by: 루밀LuMir <[email protected]>
Co-authored-by: 루밀LuMir <[email protected]>
Co-authored-by: 루밀LuMir <[email protected]>
Co-authored-by: 루밀LuMir <[email protected]>
Co-authored-by: Michaël De Boey <[email protected]>
1488eb1 to
00640b0
Compare
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)
addGlobals()toScopeManagerglobalScopeinScopeManageras nullableimplicitfromScopetoGlobalScopeand addedimplicit.variablesScopesubclasses@deprecatedtag to deprecated members per https://github.com/eslint/eslint/blob/v10.0.0-alpha.0/docs/src/extend/scope-manager-interface.mdfunctionExpressionScopeset totrueorfalsedepending on whether theScopeisFunctionExpressionNameScopeisArgumentsMaterialized()andisThisMaterialized()returntrueforScopesubclasses exceptFunctionScoperesolve()inScope(the definition in@types/eslint-scopeis very different, possibly unrelated)PatternVisitorpackages/eslint-scope/libto verify they match the type declarationseslint-scopeandespree)Reference#isStatic()now always returns a boolean even whenresolvedis not setScopeManager#isImpliedStrict()now always returns a boolean even when theimpliedStrictoption is not setRelated Issues
fixes #708
Is there anything you'd like reviewers to focus on?