diff --git a/lib/node_modules/@stdlib/_tools/eslint/rules/require-order/lib/main.js b/lib/node_modules/@stdlib/_tools/eslint/rules/require-order/lib/main.js index 9b20f8acc8f8..955b6ea95ba1 100644 --- a/lib/node_modules/@stdlib/_tools/eslint/rules/require-order/lib/main.js +++ b/lib/node_modules/@stdlib/_tools/eslint/rules/require-order/lib/main.js @@ -125,6 +125,76 @@ function main( context ) { } } + /** + * Sorts `require` statements based on their ranks. + * + * @private + * @param {Object} a - first require statement + * @param {Object} b - second require statement + * @returns {number} number indicating sort order + */ + function sortRequires( a, b ) { + if ( a.rank < b.rank ) { + return -1; + } + return 1; + } + + /** + * Fixes the lint error by reordering the require statements. + * + * @private + * @param {Function} fixer - ESLint fixer + * @returns {(Object|Null)} fix or null + */ + function fix( fixer ) { + var requireDeclarations; + var replacingText; + var startRange; + var endRange; + var source; + var elem; + var txt; + var i; + + replacingText = ''; + requireDeclarations = []; + source = context.getSourceCode(); + + // Get the text and rank for the require statements: + for ( i = 0; i < requires.length; i++ ) { + elem = requires[ i ].node.parent.parent; + txt = source.getText( elem ); + if ( i === 0 ) { + startRange = elem.range[ 0 ] - elem.loc.start.column; + } + endRange = elem.range[ 1 ]; + requireDeclarations.push({ + 'text': txt, + 'rank': requires[i].rank + }); + } + + // Sort the require statements: + requireDeclarations.sort( sortRequires ); + + // Build the replacement text: + for ( i = 0; i < requireDeclarations.length; i++ ) { + txt = requireDeclarations[ i ].text; + if ( !txt.startsWith( 'var' ) ) { + txt = 'var '+txt; + } + if ( !txt.endsWith( ';' ) ) { + txt += ';'; + } + replacingText += txt; + if ( i < requireDeclarations.length-1 ) { + replacingText += '\n'; + } + } + return fixer.replaceTextRange( [ startRange, endRange ], replacingText );// eslint-disable-line max-len + } + /** * Reports the error message. * @@ -141,7 +211,8 @@ function main( context ) { context.report({ 'node': null, 'message': msg, - 'loc': curr.node.loc + 'loc': curr.node.loc, + 'fix': fix }); } } @@ -196,9 +267,11 @@ function main( context ) { rule = { 'meta': { + 'type': 'layout', 'docs': { 'description': 'enforce that `require()` calls follow a specified order' }, + 'fixable': 'code', 'schema': [ { 'type': 'object', diff --git a/lib/node_modules/@stdlib/_tools/eslint/rules/require-order/test/fixtures/invalid.js b/lib/node_modules/@stdlib/_tools/eslint/rules/require-order/test/fixtures/invalid.js index 9b827306a5a2..f60da166cd8e 100644 --- a/lib/node_modules/@stdlib/_tools/eslint/rules/require-order/test/fixtures/invalid.js +++ b/lib/node_modules/@stdlib/_tools/eslint/rules/require-order/test/fixtures/invalid.js @@ -32,7 +32,13 @@ test = { { 'message': '`require( \'fs\' )` should come before `require( \'@stdlib/math/base/special/betainc\' )`' } - ] + ], + 'output': [ + '// MODULES //', + '', + 'var fs = require( \'fs\' );', + 'var betainc = require( \'@stdlib/math/base/special/betainc\' );' + ].join( '\n' ) }; invalid.push( test ); @@ -47,7 +53,13 @@ test = { { 'message': '`require( \'fs\' )` should come before `require( \'debug\' )`' } - ] + ], + 'output': [ + '// MODULES //', + '', + 'var fs = require( \'fs\' );', + 'var debug = require( \'debug\' );' + ].join( '\n' ) }; invalid.push( test ); @@ -62,7 +74,13 @@ test = { { 'message': '`require( \'debug\' )` should come before `require( \'./validate.js\' )`' } - ] + ], + 'output': [ + '// MODULES //', + '', + 'var debug = require( \'debug\' );', + 'var validate = require( \'./validate.js\' );' + ].join( '\n' ) }; invalid.push( test ); @@ -80,7 +98,13 @@ test = { { 'message': '`require( \'debug\' )` should come before `require( \'./validate.js\' )`' } - ] + ], + 'output': [ + '// MODULES //', + '', + 'var debug = require( \'debug\' );', + 'var validate = require( \'./validate.js\' );' + ].join( '\n' ) }; invalid.push( test ); @@ -100,7 +124,18 @@ test = { { 'message': '`require( \'path\' )` should come before `require( \'debug\' )`' } - ] + ], + 'output': [ + 'var resolve = require( \'path\' ).resolve;', + 'var debug = require( \'debug\' )( \'links:create:sync\' );', + 'var instanceOf = require( \'@stdlib/assert/instance-of\' );', + 'var readJSON = require( \'@stdlib/fs/read-json\' ).sync;', + 'var writeFile = require( \'@stdlib/fs/write-file\' ).sync;', + 'var cwd = require( \'@stdlib/process/cwd\' );', + 'var config = require( \'./defaults.js\' );', + 'var validate = require( \'./validate.js\' );', + 'var insert = require( \'./insert.js\' );' + ].join( '\n' ) }; invalid.push( test ); @@ -122,7 +157,14 @@ test = { { 'message': '`require( \'fs\' )` should come before `require( \'@stdlib/math\' )`' } - ] + ], + 'output': [ + '// MODULES //', + '', + 'var fs = require( \'fs\' );', + 'var debug = require( \'debug\' );', + 'var math = require( \'@stdlib/math\' );' + ].join( '\n' ) }; invalid.push( test ); @@ -141,7 +183,14 @@ test = { { 'message': '`require( \'tape\' )` should come before `require( \'@stdlib/math/base/special/abs\' )`' } - ] + ], + 'output': [ + '// MODULES //', + '', + 'var tape = require( \'tape\' );', + 'var abs = require( \'@stdlib/math/base/special/abs\' );', + 'var main = require( \'./../lib/index.js\' );' + ].join( '\n' ) }; invalid.push( test );