From b88c746ccea9058343c73912704f2561cf03e594 Mon Sep 17 00:00:00 2001 From: Philipp Burckhardt Date: Wed, 26 Aug 2026 13:14:28 -0500 Subject: [PATCH 1/6] build: migrate Markdown code-block linting to ESLint flat config Ref: https://github.com/stdlib-js/metr-issue-tracker/issues/1223 --- etc/eslint/eslint.flat.config.markdown.js | 108 ++++++++++++++++++ etc/remark/plugins/eslint/index.js | 5 +- .../plugins/remark-lint-eslint/README.md | 10 +- .../remark-lint-eslint/examples/index.js | 2 +- .../plugins/remark-lint-eslint/lib/factory.js | 11 +- 5 files changed, 124 insertions(+), 12 deletions(-) create mode 100644 etc/eslint/eslint.flat.config.markdown.js diff --git a/etc/eslint/eslint.flat.config.markdown.js b/etc/eslint/eslint.flat.config.markdown.js new file mode 100644 index 000000000000..db7db4d42430 --- /dev/null +++ b/etc/eslint/eslint.flat.config.markdown.js @@ -0,0 +1,108 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2026 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +'use strict'; + +// MODULES // + +var defaults = require( './../../eslint.flat.config.js' ); + + +// MAIN // + +/** +* ESLint flat configuration for linting Markdown code blocks. +*/ +var config = []; + +// Include the default configuration: +config = config.concat( defaults ); + +// Append configuration specific to Markdown code blocks: +config.push({ + 'rules': { + // Allow variables to be declared as needed: + 'vars-on-top': 'off', + + // Allow using synchronous methods: + 'n/no-sync': 'off', + + // Allow using `console`: + 'no-console': 'off', + + // Do not require `use strict` pragma: + 'strict': 'off', + + // Do not require an end-of-line character in code blocks: + 'eol-last': 'off', + + // Require `4` space indentation: + 'indent': [ 'error', 4, { + 'SwitchCase': 0, + 'VariableDeclarator': 1, + 'outerIIFEBody': 1, + 'MemberExpression': 1, + 'FunctionDeclaration': { + 'body': 1, + 'parameters': 'off' + }, + 'FunctionExpression': { + 'body': 1, + 'parameters': 'off' + }, + 'CallExpression': { + 'arguments': 'off' + }, + 'ArrayExpression': 1, + 'ObjectExpression': 1, + 'flatTernaryExpressions': true + }], + + // Never allow tabs: + 'no-tabs': 'error', + + // Do not require JSDoc comments: + 'jsdoc/require-jsdoc': 'off', + + // Do not require `@private` annotations: + 'stdlib/jsdoc-private-annotation': 'off', + + // Do not lint return annotation values in JSDoc comments (FIXME: remove this once we can reliably lint Markdown code blocks): + 'stdlib/jsdoc-return-annotations-values': 'off', + + // Do not enforce disallowing empty lines between module-level require statements: + 'stdlib/no-empty-lines-between-requires': 'off', + + // Allow requiring the package as a whole even though only a single property is used: + 'stdlib/no-single-property-require': 'off', + + // Allow use of undeclared variables, as variables may be defined in previous code blocks or be implied: + 'no-undef': 'off', + + // Allow unused variables, as variables may be illustrative or used in subsequent code blocks: + 'no-unused-vars': 'off', + + // Allow unpublished packages to be required in example code: + 'n/no-unpublished-require': 'off' + } +}); + + +// EXPORTS // + +module.exports = config; diff --git a/etc/remark/plugins/eslint/index.js b/etc/remark/plugins/eslint/index.js index 0f3e2d5e75b9..6eb638028270 100644 --- a/etc/remark/plugins/eslint/index.js +++ b/etc/remark/plugins/eslint/index.js @@ -27,15 +27,14 @@ var join = require( 'path' ).join; // VARIABLES // var etc = resolve( __dirname, '..', '..', '..' ); -var config = join( etc, 'eslint', '.eslintrc.markdown.js' ); +var config = join( etc, 'eslint', 'eslint.flat.config.markdown.js' ); var eslint = resolve( etc, '..', 'lib', 'node_modules', '@stdlib', '_tools', 'remark', 'plugins', 'remark-lint-eslint' ); var opts = { 'config': config, 'rules': { 'stdlib/doctest': 'error' // enable otherwise disabled lint rule }, - 'ignore': false, - 'useEslintrc': false + 'ignore': false }; diff --git a/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/README.md b/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/README.md index c686835933dc..3480d1a4e20e 100644 --- a/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/README.md +++ b/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/README.md @@ -60,7 +60,7 @@ var vfile = linter( '```javascript\nvar beep = \'boop\';\n```' ); The function recognizes the following `options`: -- **config**: path to an [ESLint][eslint] configuration file. A configuration path is resolved relative to the current working directory of the calling process. +- **config**: path to an [ESLint][eslint] "flat" configuration file. A configuration path is resolved relative to the current working directory of the calling process. To specify configuration `options`, set the respective properties. @@ -71,7 +71,7 @@ var remark = require( 'remark' ); // Define options: var opts = { - 'config': '/path/to/.eslintrc' + 'config': '/path/to/eslint.config.js' }; // Create a plugin: @@ -208,7 +208,7 @@ var readFileSync = require( '@stdlib/fs/read-file' ).sync; var factory = require( '@stdlib/_tools/remark/plugins/remark-lint-eslint' ).factory; // Define path to an ESLint config file: -var config = resolve( __dirname, '..', '..', '..', '..', '..', '..', '..', 'etc', 'eslint', '.eslintrc.markdown.js' ); +var config = resolve( __dirname, '..', '..', '..', '..', '..', '..', '..', 'etc', 'eslint', 'eslint.flat.config.markdown.js' ); // Load a Markdown file: var fpath = join( __dirname, 'examples', 'fixtures', 'file.md' ); @@ -220,10 +220,10 @@ var opts = { }; // Create a plugin: -var plugin = factory( opts ); +var lint = factory( opts ); // Lint code blocks: -var out = remark().use( plugin ).processSync( file.toString() ); +var out = remark().use( lint ).processSync( file.toString() ); console.log( out ); ``` diff --git a/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/examples/index.js b/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/examples/index.js index 64e696806cd8..9f0025858148 100644 --- a/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/examples/index.js +++ b/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/examples/index.js @@ -25,7 +25,7 @@ var readFileSync = require( '@stdlib/fs/read-file' ).sync; var factory = require( './../lib' ).factory; // Define path to an ESLint config file: -var config = resolve( __dirname, '..', '..', '..', '..', '..', '..', '..', '..', 'etc', 'eslint', '.eslintrc.markdown.js' ); +var config = resolve( __dirname, '..', '..', '..', '..', '..', '..', '..', '..', 'etc', 'eslint', 'eslint.flat.config.markdown.js' ); // Load a Markdown file: var fpath = join( __dirname, 'fixtures', 'file.md' ); diff --git a/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/lib/factory.js b/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/lib/factory.js index f5d3fa2b6b4b..2395cd969697 100644 --- a/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/lib/factory.js +++ b/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/lib/factory.js @@ -33,6 +33,14 @@ var format = require( '@stdlib/string/format' ); var transformHTML = require( './transform_html.js' ); +// VARIABLES // + +// Resolve an ESLint class supporting "flat" configuration (note: in ESLint v9+, the default `ESLint` class supports "flat" configuration; in ESLint v8, a separate class must be explicitly loaded): +if ( parseInt( ESLint.version, 10 ) < 9 ) { + ESLint = require( 'eslint/use-at-your-own-risk' ).FlatESLint; // eslint-disable-line stdlib/require-file-extensions, stdlib/require-order +} + + // MAIN // /** @@ -70,9 +78,6 @@ function factory( options ) { if ( hasOwnProp( options, 'ignore' ) ) { opts.ignore = options.ignore; } - if ( hasOwnProp( options, 'useEslintrc' ) ) { - opts.useEslintrc = options.useEslintrc; - } // TODO: add support for other ESLint options } eslint = new ESLint( opts ); From aabd3786a3c1adc03a5f815be7754ac0f06d638e Mon Sep 17 00:00:00 2001 From: Philipp Burckhardt Date: Wed, 26 Aug 2026 13:46:14 -0500 Subject: [PATCH 2/6] build: lint Markdown code blocks in the context of the containing file Ref: https://github.com/stdlib-js/metr-issue-tracker/issues/1223 --- 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_pkg_readmes status: na - task: lint_markdown_docs status: na - 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 --- --- etc/eslint/eslint.flat.config.markdown.js | 32 ++++++++++++++++--- etc/remark/plugins/eslint/index.js | 3 +- .../plugins/remark-lint-eslint/lib/factory.js | 16 +++++++++- 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/etc/eslint/eslint.flat.config.markdown.js b/etc/eslint/eslint.flat.config.markdown.js index db7db4d42430..00989dcd5d65 100644 --- a/etc/eslint/eslint.flat.config.markdown.js +++ b/etc/eslint/eslint.flat.config.markdown.js @@ -20,21 +20,45 @@ // MODULES // +var assign = require( './../../lib/node_modules/@stdlib/object/assign' ); var defaults = require( './../../eslint.flat.config.js' ); +// VARIABLES // + +var config; +var entry; +var i; + + // MAIN // /** * ESLint flat configuration for linting Markdown code blocks. */ -var config = []; - -// Include the default configuration: -config = config.concat( defaults ); +config = [ + // Allow linting code blocks belonging to files residing under `node_modules` directories (e.g., package files residing under `lib/node_modules`), which ESLint unconditionally ignores by default: + { + 'ignores': [ '!**/node_modules/' ] + } +]; + +// Include the default configuration, ensuring that Markdown files are matched, as code blocks are linted using the path of the containing Markdown file: +for ( i = 0; i < defaults.length; i++ ) { + entry = defaults[ i ]; + if ( entry.files && entry.files.indexOf( '**/*.js' ) !== -1 ) { + entry = assign( {}, entry ); + entry.files = entry.files.concat( [ '**/*.md' ] ); + } + config.push( entry ); +} // Append configuration specific to Markdown code blocks: config.push({ + 'linterOptions': { + // Do not flag unused disable directives, as the remark plugin unconditionally injects a `stdlib/require-order` disable directive when prepending the main `require` statement to subsequent code blocks: + 'reportUnusedDisableDirectives': 'off' + }, 'rules': { // Allow variables to be declared as needed: 'vars-on-top': 'off', diff --git a/etc/remark/plugins/eslint/index.js b/etc/remark/plugins/eslint/index.js index 6eb638028270..eede4d548f3b 100644 --- a/etc/remark/plugins/eslint/index.js +++ b/etc/remark/plugins/eslint/index.js @@ -33,8 +33,7 @@ var opts = { 'config': config, 'rules': { 'stdlib/doctest': 'error' // enable otherwise disabled lint rule - }, - 'ignore': false + } }; diff --git a/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/lib/factory.js b/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/lib/factory.js index 2395cd969697..bc58d7ae577d 100644 --- a/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/lib/factory.js +++ b/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/lib/factory.js @@ -94,6 +94,14 @@ function factory( options ) { */ function lint( tree, file ) { var FIRST; + var fpath; + + // Resolve the path of the file being linted, which allows linting code blocks in the context of the containing file (e.g., resolving relative require paths and providing meaningful `__filename` and `__dirname` values when evaluating doctests): + if ( file.path ) { + fpath = resolve( cwd(), file.path ); + } else { + fpath = null; + } visit( tree, 'code', onNode ); /** @@ -157,7 +165,13 @@ function factory( options ) { code = comments.join( '\n' ); // Lint the code block... - awaitSync( eslint.lintText( code ).then( onLint ) ); + if ( fpath ) { + awaitSync( eslint.lintText( code, { + 'filePath': fpath + }).then( onLint ) ); + } else { + awaitSync( eslint.lintText( code ).then( onLint ) ); + } } /** From 9cf54ffbef3c806186396e3e6bae08c123cb2a98 Mon Sep 17 00:00:00 2001 From: Philipp Burckhardt Date: Wed, 26 Aug 2026 14:16:02 -0500 Subject: [PATCH 3/6] build: skip linting and running self-referential README example Executing the example would run the linter within the linter and deadlock, which caused the "Run changed examples" CI job to time out. Ref: https://github.com/stdlib-js/metr-issue-tracker/issues/1223 --- 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_pkg_readmes status: passed - task: lint_markdown_docs status: na - 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 --- --- .../_tools/remark/plugins/remark-lint-eslint/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/README.md b/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/README.md index 3480d1a4e20e..360fb7a92082 100644 --- a/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/README.md +++ b/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/README.md @@ -196,9 +196,11 @@ var vfile = linter( '```javascript\nvar beep = \'boop\';\n```' ); ## Examples - + - + + + ```javascript var join = require( 'path' ).join; From 7ae955537bf6a5dfc2baf3d8ebf9f105d221b469 Mon Sep 17 00:00:00 2001 From: Philipp Burckhardt Date: Wed, 26 Aug 2026 14:48:11 -0500 Subject: [PATCH 4/6] build: disable doctest rule for self-referential example Executing the example via the `stdlib/doctest` rule would run the linter within the linter and deadlock, which caused the "Lint Changed Files" CI job to time out. Ref: https://github.com/stdlib-js/metr-issue-tracker/issues/1223 --- 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_pkg_readmes status: na - task: lint_markdown_docs status: na - 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: passed - 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 --- --- .../remark/plugins/remark-lint-eslint/examples/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/examples/index.js b/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/examples/index.js index 9f0025858148..88a4c565dec9 100644 --- a/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/examples/index.js +++ b/lib/node_modules/@stdlib/_tools/remark/plugins/remark-lint-eslint/examples/index.js @@ -16,6 +16,10 @@ * limitations under the License. */ +/* eslint stdlib/doctest: "off" */ + +// Note: executing this example via the `stdlib/doctest` rule would run the linter within the linter and deadlock; hence, the rule is disabled for this file. + 'use strict'; var join = require( 'path' ).join; From 759dfa322fa11cc7d41ea0755671095a3e082534 Mon Sep 17 00:00:00 2001 From: Philipp Burckhardt Date: Wed, 26 Aug 2026 15:00:55 -0500 Subject: [PATCH 5/6] build: support Markdown file paths in doctest and lint rules Now that Markdown code blocks are linted using the path of the containing file, rules which special-cased anonymous (``) input to tolerate not-yet-implemented packages (readme-driven development) must apply the same leniency to Markdown file paths. Also share the host realm's error constructors with the doctest sandbox so that `instanceof` checks on host-created errors succeed. Ref: https://github.com/stdlib-js/metr-issue-tracker/issues/1223 Co-authored-by: Athan Reines --- 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_pkg_readmes status: na - task: lint_markdown_docs status: na - 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 --- --- .../@stdlib/_tools/eslint/rules/doctest/lib/main.js | 12 +++++++++++- .../eslint/rules/doctest/lib/scope_defaults.json | 7 +++++++ .../eslint/rules/require-file-extensions/lib/main.js | 3 ++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/node_modules/@stdlib/_tools/eslint/rules/doctest/lib/main.js b/lib/node_modules/@stdlib/_tools/eslint/rules/doctest/lib/main.js index 8fab198588a2..ed4ff9a3e9b1 100644 --- a/lib/node_modules/@stdlib/_tools/eslint/rules/doctest/lib/main.js +++ b/lib/node_modules/@stdlib/_tools/eslint/rules/doctest/lib/main.js @@ -25,6 +25,7 @@ var proc = require( 'process' ); var join = require( 'path' ).join; var format = require( 'util' ).format; var dirname = require( 'path' ).dirname; +var extname = require( 'path' ).extname; var logger = require( 'debug' ); var rootDir = require( '@stdlib/_tools/utils/root-dir' ); var Buffer = require( '@stdlib/buffer/ctor' ); @@ -162,6 +163,15 @@ function main( context ) { 'clearInterval': clearInterval, 'window': windowShim, 'Buffer': Buffer, + + // Share the host realm's error constructors, as required modules are loaded in the host realm, meaning that, without sharing, `instanceof` checks on host-created errors would always fail within the sandbox: + 'Error': Error, + 'EvalError': EvalError, + 'RangeError': RangeError, + 'ReferenceError': ReferenceError, + 'SyntaxError': SyntaxError, + 'TypeError': TypeError, + 'URIError': URIError, '__dirname': dir, '__filename': filename, 'console': { @@ -327,7 +337,7 @@ function main( context ) { }; // Do not report errors in `Markdown` fenced code blocks due to modules failing to load as implementations may not be available yet (readme-driven development): - if ( filename === '' && contains( err.message, 'Cannot find module' ) ) { + if ( ( filename === '' || extname( filename ) === '.md' ) && contains( err.message, 'Cannot find module' ) ) { return; } report( loc, 'Encountered an error while running code: '+err.message ); diff --git a/lib/node_modules/@stdlib/_tools/eslint/rules/doctest/lib/scope_defaults.json b/lib/node_modules/@stdlib/_tools/eslint/rules/doctest/lib/scope_defaults.json index fab6c5ea05dc..0a0ba4ec3f5f 100644 --- a/lib/node_modules/@stdlib/_tools/eslint/rules/doctest/lib/scope_defaults.json +++ b/lib/node_modules/@stdlib/_tools/eslint/rules/doctest/lib/scope_defaults.json @@ -9,6 +9,13 @@ "clearInterval", "window", "Buffer", + "Error", + "EvalError", + "RangeError", + "ReferenceError", + "SyntaxError", + "TypeError", + "URIError", "__dirname", "__filename", "console" diff --git a/lib/node_modules/@stdlib/_tools/eslint/rules/require-file-extensions/lib/main.js b/lib/node_modules/@stdlib/_tools/eslint/rules/require-file-extensions/lib/main.js index e7af4d6eb31a..90914ca7f2cf 100644 --- a/lib/node_modules/@stdlib/_tools/eslint/rules/require-file-extensions/lib/main.js +++ b/lib/node_modules/@stdlib/_tools/eslint/rules/require-file-extensions/lib/main.js @@ -27,6 +27,7 @@ var hasOwnProp = require( '@stdlib/assert/has-own-property' ); var isString = require( '@stdlib/assert/is-string' ); var contains = require( '@stdlib/assert/contains' ); var dirname = require( '@stdlib/utils/dirname' ); +var extname = require( '@stdlib/utils/extname' ); var DELIMITER = require( '@stdlib/constants/path/delimiter' ); var ENV = require( '@stdlib/process/env' ); @@ -139,7 +140,7 @@ function main( context ) { return; } // Ignore error for internal requires in fenced code blocks of Markdown files as the package's implementation may not yet be available... - if ( filename === '' && startsWith( requirePath, '@stdlib' ) ) { + if ( ( filename === '' || extname( filename ) === '.md' ) && startsWith( requirePath, '@stdlib' ) ) { return; } return report( node, 'cannot resolve module: "'+requirePath+'"' ); From 06b50906761a7eeef2710ab4b3339063ac920cf2 Mon Sep 17 00:00:00 2001 From: Athan Date: Tue, 22 Sep 2026 17:32:56 -0700 Subject: [PATCH 6/6] refactor: use stdlib util Signed-off-by: Athan --- .../@stdlib/_tools/eslint/rules/doctest/lib/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/node_modules/@stdlib/_tools/eslint/rules/doctest/lib/main.js b/lib/node_modules/@stdlib/_tools/eslint/rules/doctest/lib/main.js index ed4ff9a3e9b1..1877ed87a3ef 100644 --- a/lib/node_modules/@stdlib/_tools/eslint/rules/doctest/lib/main.js +++ b/lib/node_modules/@stdlib/_tools/eslint/rules/doctest/lib/main.js @@ -25,8 +25,8 @@ var proc = require( 'process' ); var join = require( 'path' ).join; var format = require( 'util' ).format; var dirname = require( 'path' ).dirname; -var extname = require( 'path' ).extname; var logger = require( 'debug' ); +var extname = require( '@stdlib/utils/extname' ); var rootDir = require( '@stdlib/_tools/utils/root-dir' ); var Buffer = require( '@stdlib/buffer/ctor' ); var isNull = require( '@stdlib/assert/is-null' );