build: migrate custom ESLint rules to modern APIs (gh54 part I)#10950
build: migrate custom ESLint rules to modern APIs (gh54 part I)#10950
Conversation
Replace deprecated ESLint rule APIs with their modern equivalents to prepare for the ESLint v9 migration (see [1][2]): - `context.getSourceCode()` → `context.sourceCode` (100 files) - `context.getScope()` → `sourceCode.getScope(node)` (4 files) The `context.getSourceCode()` method was deprecated in ESLint v8.40.0 in favor of the `context.sourceCode` property. The `context.getScope()` method was deprecated in ESLint v8.38.0 in favor of `sourceCode.getScope(node)`, which takes an explicit node argument rather than relying on implicit traversal state. For `no-builtin-big-int`, the scope acquisition was moved from the `create` function (which previously captured the global scope once) into the `CallExpression` visitor, and `isImportedBigInt` was updated to walk up the scope chain to find `BigInt` declarations in outer scopes. Also fixes pre-existing lint violations in touched files: - Move `copyLocationInfo`, `locationInfo`, `checkComment`, `extractPackagePath`, `getAlias`, and `sortExpressions` from nested functions to module scope - Replace `.toUpperCase()`, `.toLowerCase()`, `.trim()` with stdlib equivalents - Fix variable declaration ordering No other deprecated APIs (`context.getAncestors`, `context.getDeclaredVariables`, `context.markVariableAsUsed`, deprecated comment/token access patterns) were found in the codebase. All rules with `context.options` already have proper `meta.schema`. [1]: https://eslint.org/blog/2023/09/preparing-custom-rules-eslint-v9/ [2]: https://eslint.org/docs/latest/use/migrate-to-9.0.0 Ref: stdlib-js/metr-issue-tracker#54 --- type: pre_commit_static_analysis_report description: Results of running static analysis checks when committing changes. report: - task: lint_filenames status: passed - task: lint_editorconfig status: passed - task: lint_markdown status: na - task: lint_package_json status: na - task: lint_repl_help status: na - task: lint_javascript_src status: na - task: lint_javascript_cli status: na - task: lint_javascript_examples status: na - task: lint_javascript_tests status: na - task: lint_javascript_benchmarks status: na - task: lint_python status: na - task: lint_r status: na - task: lint_c_src status: na - task: lint_c_examples status: na - task: lint_c_benchmarks status: na - task: lint_c_tests_fixtures status: na - task: lint_shell status: na - task: lint_typescript_declarations status: passed - task: lint_typescript_tests status: na - task: lint_license_headers status: passed ---
56f2f39 to
485bf9b
Compare
Fix 9 pre-existing test failures across custom ESLint rules to ensure all 123 rule tests pass cleanly on ESLint v8: Rule fixes: - `doctest-marker`: replace `acorn-walk` with ESLint `sourceCode` APIs (`getTokenBefore`, `getNodeByRangeIndex`) to avoid deprecated `node.start`/`node.end` property access; add line-proximity check for orphaned annotation detection - `jsdoc-require-throws-tags`: replace `node.start`/`node.end` with `node.range[0]`/`node.range[1]` - `jsdoc-no-space-aligned-asterisks`: fix autofix regex replacement that incorrectly turned trailing whitespace into asterisks (use `$1` back-reference instead of literal `*`) Test fixture fixes: - `no-redeclare`: add `ecmaVersion: 2015` for `sourceType: 'module'` test case - `namespace-index-order`: reorder fixture entries to match alphabetical package path order - `require-last-path-relative`: match error message backtick quoting - `jsdoc-ordered-list-marker-value`: expect 4 errors (not 3) for newer `remark-lint-ordered-list-marker-value` - `jsdoc-doctest-marker`: remove undefined `stdlib/require-globals` from `eslint-disable-line` comments - `doctest-marker`: remove undefined `stdlib/no-builtin-math` from `eslint-disable-line` comments - `jsdoc-no-blockquote-without-marker`: use lazy continuation pattern and update error message for `remark-lint` v2 Ref: stdlib-js/metr-issue-tracker#54 --- type: pre_commit_static_analysis_report description: Results of running static analysis checks when committing changes. report: - task: lint_filenames status: passed - task: lint_editorconfig status: passed - task: lint_markdown status: na - task: lint_package_json status: na - task: lint_repl_help status: na - task: lint_javascript_src status: passed - task: lint_javascript_cli status: na - task: lint_javascript_examples status: na - task: lint_javascript_tests status: passed - task: lint_javascript_benchmarks status: na - task: lint_python status: na - task: lint_r status: na - task: lint_c_src status: na - task: lint_c_examples status: na - task: lint_c_benchmarks status: na - task: lint_c_tests_fixtures status: na - task: lint_shell status: na - task: lint_typescript_declarations status: passed - task: lint_typescript_tests status: na - task: lint_license_headers status: passed ---
Signed-off-by: Philipp Burckhardt <pburckhardt@outlook.com>
|
/stdlib merge |
…ernize-custom-rule-apis
This is incorrect. You need to run |
---
type: pre_commit_static_analysis_report
description: Results of running static analysis checks when committing changes.
report:
- task: lint_filenames
status: passed
- task: lint_editorconfig
status: passed
- task: lint_markdown
status: na
- task: lint_package_json
status: na
- task: lint_repl_help
status: na
- task: lint_javascript_src
status: passed
- task: lint_javascript_cli
status: na
- task: lint_javascript_examples
status: na
- task: lint_javascript_tests
status: na
- task: lint_javascript_benchmarks
status: na
- task: lint_python
status: na
- task: lint_r
status: na
- task: lint_c_src
status: na
- task: lint_c_examples
status: na
- task: lint_c_benchmarks
status: na
- task: lint_c_tests_fixtures
status: na
- task: lint_shell
status: na
- task: lint_typescript_declarations
status: passed
- task: lint_typescript_tests
status: na
- task: lint_license_headers
status: passed
---
|
For METR, |
And because I know you'll ask "why do we have a separate Three reasons: 1) Historical reasons stemming from when JavaScript tools packages were not in |
|
cc @batpigandme For the rationale for having a separate test command for running tools tests. Reasons (2) and (3) are the primary things we could considering adding to docs somewhere. |
Will do. |
Progresses stdlib-js/metr-issue-tracker#54.
Description
This pull request:
context.getSourceCode()→context.sourceCodeacross 100 rule files and 1 utility example (deprecated in ESLint v8.40.0).context.getScope()→sourceCode.getScope(node)in 4 rules (no-builtin-big-int,no-redeclare,capitalized-comments,require-globals) (deprecated in ESLint v8.38.0).To ensure passing tests and linting (all issues below were verified to be present before the changes of this PR)
copyLocationInfo,locationInfo,checkComment,extractPackagePath,getAlias,sortExpressions) from nested closures to module scope.String.prototype.toUpperCase/toLowerCase/trimwith@stdlib/string/base/*equivalents.stdlib/vars-order).context.optionsalready definemeta.schema.context.getAncestors,context.getDeclaredVariables,context.markVariableAsUsed, deprecated comment/token access patterns).doctest-marker: replacesacorn-walkwith ESLintsourceCodeAPIs to avoid deprecatednode.start/node.endaccessjsdoc-require-throws-tags: replacesnode.start/node.endwithnode.range[0]/node.range[1]jsdoc-no-space-aligned-asterisks: fixes autofix regex that incorrectly turned trailing whitespace into asterisksno-redeclare,namespace-index-order,require-last-path-relative,jsdoc-ordered-list-marker-value,jsdoc-doctest-marker,doctest-marker, andjsdoc-no-blockquote-without-markerTo confirm that all tests pass:
npx tape 'lib/node_modules/@stdlib/_tools/eslint/rules/*/test/test.js'(the make recipes cause trouble with
_tools, I think)Related Issues
This pull request has the following related issues:
Questions
No.
Other
References:
For
no-builtin-big-int, the scope acquisition was moved from thecreatefunction (which previously captured the global scope once) into theCallExpressionvisitor, andisImportedBigIntwas updated to walk up the scope chain to findBigIntdeclarations in outer scopes.For
doctest-marker,acorn-walk.findNodeAtwas replaced withsourceCode.getTokenBefore+sourceCode.getNodeByRangeIndex+ afindStatementhelper to walk up to the nearest statement ancestor, plus a line-proximity check for orphaned annotation detection.Checklist
AI Assistance
If you answered "yes" above, how did you use AI assistance?
Disclosure
Implementation plan was written in tandem with Claude Code and ChatGPT under my review and refinement.
This PR was written primarily by Claude Code. The mechanical API replacements were applied via scripted bulk edits, and the scope-related changes and test fixes were authored with manual review.
@stdlib-js/reviewers