Skip to content

Commit 83a3fc6

Browse files
authored
Merge pull request #44 from bmish/max-group-size
Ensure newlines aren't inserted into large group
2 parents 5de23d0 + b5056dd commit 83a3fc6

File tree

2 files changed

+31
-14
lines changed

2 files changed

+31
-14
lines changed

src/rules/order-imports.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const alphabetizeOptions: AlphabetizeOption[] = ['ignore', 'asc', 'desc'];
1616

1717
type Groups = (ValidImportType | ValidImportType[])[];
1818
const defaultGroups: Groups = ['absolute', 'module', 'parent', 'sibling', 'index'];
19+
const MAX_GROUP_SIZE = 100000; // Higher than the number of imports we would ever expect to see in a single file.
1920

2021
type RuleOptions = {
2122
groups?: Groups;
@@ -71,7 +72,7 @@ function getTokensOrCommentsBefore(sourceCode, node, count): NodeOrToken[] {
7172
}
7273

7374
function takeTokensAfterWhile(sourceCode, node, condition): NodeOrToken[] {
74-
const tokens: NodeOrToken[] = getTokensOrCommentsAfter(sourceCode, node, 100);
75+
const tokens: NodeOrToken[] = getTokensOrCommentsAfter(sourceCode, node, MAX_GROUP_SIZE);
7576
const result: NodeOrToken = [];
7677
for (let i = 0; i < tokens.length; i++) {
7778
if (condition(tokens[i])) {
@@ -84,7 +85,7 @@ function takeTokensAfterWhile(sourceCode, node, condition): NodeOrToken[] {
8485
}
8586

8687
function takeTokensBeforeWhile(sourceCode, node, condition): NodeOrToken[] {
87-
const tokens: NodeOrToken[] = getTokensOrCommentsBefore(sourceCode, node, 100);
88+
const tokens: NodeOrToken[] = getTokensOrCommentsBefore(sourceCode, node, MAX_GROUP_SIZE);
8889
const result: NodeOrToken[] = [];
8990
for (let i = tokens.length - 1; i >= 0; i--) {
9091
if (condition(tokens[i])) {
@@ -292,7 +293,7 @@ function mutateRanksToAlphabetize(imported, order, ignoreCase) {
292293
// add decimal ranking to sort within the group
293294
const alphabetizedRanks = groupRanks.sort().reduce(function(acc, groupRank) {
294295
groupedByRanks[groupRank].forEach(function(importedItemName, index) {
295-
acc[importedItemName] = +groupRank + index / 100;
296+
acc[importedItemName] = +groupRank + index / MAX_GROUP_SIZE;
296297
});
297298
return acc;
298299
}, {});
@@ -312,7 +313,7 @@ function getRegExpGroups(ranks: Ranks): RegExpGroups {
312313
// DETECTING
313314

314315
function computeRank(ranks: Ranks, regExpGroups, name: string, type: ImportType): number {
315-
return ranks[determineImportType(name, regExpGroups)] + (type === 'import' ? 0 : 100);
316+
return ranks[determineImportType(name, regExpGroups)] + (type === 'import' ? 0 : MAX_GROUP_SIZE);
316317
}
317318

318319
function registerNode(node: NodeOrToken, name: string, type: ImportType, ranks, regExpGroups, imported: Imported[]) {

test/rules/order-imports.js

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@ function withoutAutofixOutput(test) {
99
return Object.assign({}, test, { output: test.code });
1010
}
1111

12+
function generateImports(count) {
13+
const imports = [];
14+
for (let i = 0; i < count; i++) {
15+
imports.push(`import foo${i} from './foo${i}.js';`);
16+
}
17+
return imports.sort().join('\n');
18+
}
19+
1220
ruleTester.run('order', rule, {
1321
valid: [
1422
// Default order using require
@@ -226,7 +234,7 @@ ruleTester.run('order', rule, {
226234
test({
227235
code: `
228236
var fs = require('fs');
229-
237+
230238
var async = require('async');
231239
232240
var index = require('./');
@@ -267,7 +275,7 @@ ruleTester.run('order', rule, {
267275
import net
268276
from 'net';
269277
import external from 'external'
270-
278+
271279
import foo from './foo';
272280
`,
273281
options: [{ newlinesBetween: 'always' }],
@@ -367,21 +375,21 @@ ruleTester.run('order', rule, {
367375
var fs = require('fs');
368376
369377
var path = require('path');
370-
378+
371379
var util = require('util');
372380
373381
var async = require('async');
374382
375383
376384
377385
var relParent1 = require('../foo');
378-
386+
379387
var relParent2 = require('../');
380388
381389
var relParent3 = require('../bar');
382390
383391
var sibling = require('./foo');
384-
392+
385393
var sibling2 = require('./bar');
386394
387395
var sibling3 = require('./foobar');
@@ -395,7 +403,7 @@ ruleTester.run('order', rule, {
395403
// Option alphabetize: {order: 'ignore'}
396404
test({
397405
code: `
398-
import foo from 'foo';
406+
import foo from 'foo';
399407
import bar from 'bar';
400408
401409
import index from './';
@@ -471,6 +479,14 @@ ruleTester.run('order', rule, {
471479
},
472480
],
473481
}),
482+
// With large number of imports in the same group to ensure no newlines are inserted into group.
483+
test({
484+
code: generateImports(150),
485+
options: [{
486+
newlinesBetween: 'always',
487+
alphabetize: { order: 'asc',},
488+
}],
489+
}),
474490
],
475491
invalid: [
476492
// Option: newlinesBetween: 'always-and-inside-groups'
@@ -1024,13 +1040,13 @@ comment3 */", // the spacing here is really sensitive
10241040
code: `
10251041
var fs = require('fs'); /* multiline
10261042
comment */
1027-
1043+
10281044
var index = require('./');
10291045
`,
10301046
output: `
10311047
var fs = require('fs'); /* multiline
10321048
comment */
1033-
1049+
10341050
var index = require('./');
10351051
`,
10361052
options: [
@@ -1116,14 +1132,14 @@ comment3 */", // the spacing here is really sensitive
11161132
code: `
11171133
import path from 'path';
11181134
import 'loud-rejection';
1119-
1135+
11201136
import 'something-else';
11211137
import _ from 'lodash';
11221138
`,
11231139
output: `
11241140
import path from 'path';
11251141
import 'loud-rejection';
1126-
1142+
11271143
import 'something-else';
11281144
import _ from 'lodash';
11291145
`,

0 commit comments

Comments
 (0)