Skip to content

Commit d99b2b1

Browse files
headlessNodekgryte
andauthored
feat: add a fixer function to eslint/rules/require-order
PR-URL: #3323 Co-authored-by: Athan Reines <[email protected]> Reviewed-by: Athan Reines <[email protected]>
1 parent 5399d4e commit d99b2b1

File tree

2 files changed

+130
-8
lines changed
  • lib/node_modules/@stdlib/_tools/eslint/rules/require-order

2 files changed

+130
-8
lines changed

lib/node_modules/@stdlib/_tools/eslint/rules/require-order/lib/main.js

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,76 @@ function main( context ) {
125125
}
126126
}
127127

128+
/**
129+
* Sorts `require` statements based on their ranks.
130+
*
131+
* @private
132+
* @param {Object} a - first require statement
133+
* @param {Object} b - second require statement
134+
* @returns {number} number indicating sort order
135+
*/
136+
function sortRequires( a, b ) {
137+
if ( a.rank < b.rank ) {
138+
return -1;
139+
}
140+
return 1;
141+
}
142+
143+
/**
144+
* Fixes the lint error by reordering the require statements.
145+
*
146+
* @private
147+
* @param {Function} fixer - ESLint fixer
148+
* @returns {(Object|Null)} fix or null
149+
*/
150+
function fix( fixer ) {
151+
var requireDeclarations;
152+
var replacingText;
153+
var startRange;
154+
var endRange;
155+
var source;
156+
var elem;
157+
var txt;
158+
var i;
159+
160+
replacingText = '';
161+
requireDeclarations = [];
162+
source = context.getSourceCode();
163+
164+
// Get the text and rank for the require statements:
165+
for ( i = 0; i < requires.length; i++ ) {
166+
elem = requires[ i ].node.parent.parent;
167+
txt = source.getText( elem );
168+
if ( i === 0 ) {
169+
startRange = elem.range[ 0 ] - elem.loc.start.column;
170+
}
171+
endRange = elem.range[ 1 ];
172+
requireDeclarations.push({
173+
'text': txt,
174+
'rank': requires[i].rank
175+
});
176+
}
177+
178+
// Sort the require statements:
179+
requireDeclarations.sort( sortRequires );
180+
181+
// Build the replacement text:
182+
for ( i = 0; i < requireDeclarations.length; i++ ) {
183+
txt = requireDeclarations[ i ].text;
184+
if ( !txt.startsWith( 'var' ) ) {
185+
txt = 'var '+txt;
186+
}
187+
if ( !txt.endsWith( ';' ) ) {
188+
txt += ';';
189+
}
190+
replacingText += txt;
191+
if ( i < requireDeclarations.length-1 ) {
192+
replacingText += '\n';
193+
}
194+
}
195+
return fixer.replaceTextRange( [ startRange, endRange ], replacingText );// eslint-disable-line max-len
196+
}
197+
128198
/**
129199
* Reports the error message.
130200
*
@@ -141,7 +211,8 @@ function main( context ) {
141211
context.report({
142212
'node': null,
143213
'message': msg,
144-
'loc': curr.node.loc
214+
'loc': curr.node.loc,
215+
'fix': fix
145216
});
146217
}
147218
}
@@ -196,9 +267,11 @@ function main( context ) {
196267

197268
rule = {
198269
'meta': {
270+
'type': 'layout',
199271
'docs': {
200272
'description': 'enforce that `require()` calls follow a specified order'
201273
},
274+
'fixable': 'code',
202275
'schema': [
203276
{
204277
'type': 'object',

lib/node_modules/@stdlib/_tools/eslint/rules/require-order/test/fixtures/invalid.js

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,13 @@ test = {
3232
{
3333
'message': '`require( \'fs\' )` should come before `require( \'@stdlib/math/base/special/betainc\' )`'
3434
}
35-
]
35+
],
36+
'output': [
37+
'// MODULES //',
38+
'',
39+
'var fs = require( \'fs\' );',
40+
'var betainc = require( \'@stdlib/math/base/special/betainc\' );'
41+
].join( '\n' )
3642
};
3743
invalid.push( test );
3844

@@ -47,7 +53,13 @@ test = {
4753
{
4854
'message': '`require( \'fs\' )` should come before `require( \'debug\' )`'
4955
}
50-
]
56+
],
57+
'output': [
58+
'// MODULES //',
59+
'',
60+
'var fs = require( \'fs\' );',
61+
'var debug = require( \'debug\' );'
62+
].join( '\n' )
5163
};
5264
invalid.push( test );
5365

@@ -62,7 +74,13 @@ test = {
6274
{
6375
'message': '`require( \'debug\' )` should come before `require( \'./validate.js\' )`'
6476
}
65-
]
77+
],
78+
'output': [
79+
'// MODULES //',
80+
'',
81+
'var debug = require( \'debug\' );',
82+
'var validate = require( \'./validate.js\' );'
83+
].join( '\n' )
6684
};
6785
invalid.push( test );
6886

@@ -80,7 +98,13 @@ test = {
8098
{
8199
'message': '`require( \'debug\' )` should come before `require( \'./validate.js\' )`'
82100
}
83-
]
101+
],
102+
'output': [
103+
'// MODULES //',
104+
'',
105+
'var debug = require( \'debug\' );',
106+
'var validate = require( \'./validate.js\' );'
107+
].join( '\n' )
84108
};
85109
invalid.push( test );
86110

@@ -100,7 +124,18 @@ test = {
100124
{
101125
'message': '`require( \'path\' )` should come before `require( \'debug\' )`'
102126
}
103-
]
127+
],
128+
'output': [
129+
'var resolve = require( \'path\' ).resolve;',
130+
'var debug = require( \'debug\' )( \'links:create:sync\' );',
131+
'var instanceOf = require( \'@stdlib/assert/instance-of\' );',
132+
'var readJSON = require( \'@stdlib/fs/read-json\' ).sync;',
133+
'var writeFile = require( \'@stdlib/fs/write-file\' ).sync;',
134+
'var cwd = require( \'@stdlib/process/cwd\' );',
135+
'var config = require( \'./defaults.js\' );',
136+
'var validate = require( \'./validate.js\' );',
137+
'var insert = require( \'./insert.js\' );'
138+
].join( '\n' )
104139
};
105140
invalid.push( test );
106141

@@ -122,7 +157,14 @@ test = {
122157
{
123158
'message': '`require( \'fs\' )` should come before `require( \'@stdlib/math\' )`'
124159
}
125-
]
160+
],
161+
'output': [
162+
'// MODULES //',
163+
'',
164+
'var fs = require( \'fs\' );',
165+
'var debug = require( \'debug\' );',
166+
'var math = require( \'@stdlib/math\' );'
167+
].join( '\n' )
126168
};
127169
invalid.push( test );
128170

@@ -141,7 +183,14 @@ test = {
141183
{
142184
'message': '`require( \'tape\' )` should come before `require( \'@stdlib/math/base/special/abs\' )`'
143185
}
144-
]
186+
],
187+
'output': [
188+
'// MODULES //',
189+
'',
190+
'var tape = require( \'tape\' );',
191+
'var abs = require( \'@stdlib/math/base/special/abs\' );',
192+
'var main = require( \'./../lib/index.js\' );'
193+
].join( '\n' )
145194
};
146195
invalid.push( test );
147196

0 commit comments

Comments
 (0)