Skip to content

Commit e75f225

Browse files
author
Claudéric Demers
authored
Merge pull request #54 from clauderic/linting-tweaks
Linting tweaks
2 parents d599923 + 7898da2 commit e75f225

12 files changed

+1363
-830
lines changed

.eslintrc.json

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"extends": [
3+
"plugin:shopify/react",
4+
"plugin:shopify/typescript",
5+
"plugin:shopify/typescript-prettier",
6+
"plugin:shopify/jest"
7+
],
8+
"rules": {
9+
"no-undefined": "off",
10+
"no-param-reassign": "off",
11+
"react/no-unused-prop-types": "off",
12+
"react/jsx-filename-extension": [1, { "extensions": [".tsx"] }],
13+
"jest/consistent-test-it": [
14+
"error",
15+
{
16+
"fn": "it"
17+
}
18+
]
19+
}
20+
}

.travis.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
language: node_js
22

33
node_js:
4-
- "7"
4+
- "8"
55

66
script:
77
- yarn run test:ci

.vscode/settings.json

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"editor.formatOnSave": true,
3+
"prettier.eslintIntegration": true,
4+
"files.insertFinalNewline": true,
5+
"files.trimTrailingWhitespace": true,
6+
"eslint.validate": [
7+
"typescript",
8+
"typescriptreact"
9+
],
10+
"typescript.tsdk": "node_modules/typescript/lib"
11+
}

demo/src/index.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
import * as React from 'react';
22
import * as ReactDOM from 'react-dom';
33

4-
import VirtualList from '../../src/';
4+
import VirtualList, {ItemStyle} from '../../src';
55
import './demo.css';
66

77
class Demo extends React.Component {
8-
renderItem = ({style, index}: {style: React.CSSProperties, index: number}) => {
8+
renderItem = ({style, index}: {style: ItemStyle; index: number}) => {
99
return (
1010
<div className="Row" style={style} key={index}>
1111
Row #{index}
1212
</div>
1313
);
14-
}
14+
};
1515

1616
render() {
1717
return (

package.json

+6-10
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
],
1313
"scripts": {
1414
"build": "babel-node --presets es2015 ./config/build.js",
15-
"lint": "tslint './src/**/*.{ts,tsx}' --project tsconfig.json",
15+
"lint": "eslint ./src --ext .ts,.tsx --max-warnings 0 --format codeframe",
1616
"start": "nwb serve-react-app demo/src/index.tsx --config ./config/nwb/config.js",
1717
"test": "jest --config ./config/jest/config.json --no-cache",
1818
"test:coverage": "npm run test -- --coverage",
@@ -38,12 +38,8 @@
3838
"babel-preset-react": "^6.23.0",
3939
"babel-preset-typescript": "^7.0.0-alpha.19",
4040
"codecov": "^1.0.1",
41-
"eslint": "3.8.1",
42-
"eslint-config-react-app": "^0.5.2",
43-
"eslint-plugin-flowtype": "2.21.0",
44-
"eslint-plugin-import": "2.0.1",
45-
"eslint-plugin-jsx-a11y": "2.2.3",
46-
"eslint-plugin-react": "6.4.1",
41+
"eslint": "^4.10.0",
42+
"eslint-plugin-shopify": "^22.1.0",
4743
"fs-extra": "^4.0.1",
4844
"jest": "^19.0.2",
4945
"nwb": "0.15.x",
@@ -57,9 +53,9 @@
5753
"rollup-plugin-commonjs": "^8.2.0",
5854
"rollup-plugin-node-resolve": "^3.0.0",
5955
"rollup-plugin-uglify": "^2.0.1",
60-
"tslint": "^5.7.0",
61-
"tslint-config-shopify": "^3.0.0",
62-
"typescript": "^2.4.2"
56+
"tslint": "^5.10.0",
57+
"tslint-config-shopify": "^3.0.2",
58+
"typescript": "2.8.3"
6359
},
6460
"author": {
6561
"name": "Clauderic Demers",

src/SizeAndPositionManager.ts

+47-25
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
/* Forked from react-virtualized 💖 */
2-
import {ALIGNMENT, ALIGN_START, ALIGN_END, ALIGN_CENTER} from './constants';
2+
import {ALIGNMENT} from './constants';
33

44
export type ItemSizeGetter = (index: number) => number;
55
export type ItemSize = number | number[] | ItemSizeGetter;
66

77
export interface SizeAndPosition {
8-
size: number,
9-
offset: number,
8+
size: number;
9+
offset: number;
1010
}
1111

1212
interface SizeAndPositionData {
13-
[id: number]: SizeAndPosition,
13+
[id: number]: SizeAndPosition;
1414
}
1515

1616
export interface Options {
17-
itemCount: number,
18-
itemSizeGetter: ItemSizeGetter,
19-
estimatedItemSize: number,
17+
itemCount: number;
18+
itemSizeGetter: ItemSizeGetter;
19+
estimatedItemSize: number;
2020
}
2121

2222
export default class SizeAndPositionManager {
@@ -26,11 +26,7 @@ export default class SizeAndPositionManager {
2626
private lastMeasuredIndex: number;
2727
private itemSizeAndPositionData: SizeAndPositionData;
2828

29-
constructor({
30-
itemCount,
31-
itemSizeGetter,
32-
estimatedItemSize,
33-
}: Options) {
29+
constructor({itemCount, itemSizeGetter, estimatedItemSize}: Options) {
3430
this.itemSizeGetter = itemSizeGetter;
3531
this.itemCount = itemCount;
3632
this.estimatedItemSize = estimatedItemSize;
@@ -45,7 +41,10 @@ export default class SizeAndPositionManager {
4541
updateConfig({
4642
itemCount,
4743
estimatedItemSize,
48-
}: {itemCount: number, estimatedItemSize: number}) {
44+
}: {
45+
itemCount: number;
46+
estimatedItemSize: number;
47+
}) {
4948
this.itemCount = itemCount;
5049
this.estimatedItemSize = estimatedItemSize;
5150
}
@@ -60,13 +59,15 @@ export default class SizeAndPositionManager {
6059
*/
6160
getSizeAndPositionForIndex(index: number) {
6261
if (index < 0 || index >= this.itemCount) {
63-
throw Error(`Requested index ${index} is outside of range 0..${this.itemCount}`);
62+
throw Error(
63+
`Requested index ${index} is outside of range 0..${this.itemCount}`,
64+
);
6465
}
6566

6667
if (index > this.lastMeasuredIndex) {
6768
const lastMeasuredSizeAndPosition = this.getSizeAndPositionOfLastMeasuredItem();
68-
let offset = lastMeasuredSizeAndPosition.offset +
69-
lastMeasuredSizeAndPosition.size;
69+
let offset =
70+
lastMeasuredSizeAndPosition.offset + lastMeasuredSizeAndPosition.size;
7071

7172
for (let i = this.lastMeasuredIndex + 1; i <= index; i++) {
7273
const size = this.itemSizeGetter(i);
@@ -103,7 +104,11 @@ export default class SizeAndPositionManager {
103104
getTotalSize(): number {
104105
const lastMeasuredSizeAndPosition = this.getSizeAndPositionOfLastMeasuredItem();
105106

106-
return lastMeasuredSizeAndPosition.offset + lastMeasuredSizeAndPosition.size + (this.itemCount - this.lastMeasuredIndex - 1) * this.estimatedItemSize;
107+
return (
108+
lastMeasuredSizeAndPosition.offset +
109+
lastMeasuredSizeAndPosition.size +
110+
(this.itemCount - this.lastMeasuredIndex - 1) * this.estimatedItemSize
111+
);
107112
}
108113

109114
/**
@@ -114,11 +119,16 @@ export default class SizeAndPositionManager {
114119
* @return Offset to use to ensure the specified item is visible
115120
*/
116121
getUpdatedOffsetForIndex({
117-
align = ALIGN_START,
122+
align = ALIGNMENT.START,
118123
containerSize,
119124
currentOffset,
120125
targetIndex,
121-
}: {align: ALIGNMENT | undefined, containerSize: number, currentOffset: number, targetIndex: number}): number {
126+
}: {
127+
align: ALIGNMENT | undefined;
128+
containerSize: number;
129+
currentOffset: number;
130+
targetIndex: number;
131+
}): number {
122132
if (containerSize <= 0) {
123133
return 0;
124134
}
@@ -130,13 +140,13 @@ export default class SizeAndPositionManager {
130140
let idealOffset;
131141

132142
switch (align) {
133-
case ALIGN_END:
143+
case ALIGNMENT.END:
134144
idealOffset = minOffset;
135145
break;
136-
case ALIGN_CENTER:
146+
case ALIGNMENT.CENTER:
137147
idealOffset = maxOffset - (containerSize - datum.size) / 2;
138148
break;
139-
case ALIGN_START:
149+
case ALIGNMENT.START:
140150
idealOffset = maxOffset;
141151
break;
142152
default:
@@ -152,7 +162,11 @@ export default class SizeAndPositionManager {
152162
containerSize,
153163
offset,
154164
overscanCount,
155-
}: {containerSize: number, offset: number, overscanCount: number}): {start?: number, stop?: number} {
165+
}: {
166+
containerSize: number;
167+
offset: number;
168+
overscanCount: number;
169+
}): {start?: number; stop?: number} {
156170
const totalSize = this.getTotalSize();
157171

158172
if (totalSize === 0) {
@@ -232,7 +246,15 @@ export default class SizeAndPositionManager {
232246
}
233247
}
234248

235-
private binarySearch({low, high, offset}: {low: number, high: number, offset: number}) {
249+
private binarySearch({
250+
low,
251+
high,
252+
offset,
253+
}: {
254+
low: number;
255+
high: number;
256+
offset: number;
257+
}) {
236258
let middle = 0;
237259
let currentOffset = 0;
238260

@@ -256,7 +278,7 @@ export default class SizeAndPositionManager {
256278
return 0;
257279
}
258280

259-
private exponentialSearch({index, offset}: {index: number, offset: number}) {
281+
private exponentialSearch({index, offset}: {index: number; offset: number}) {
260282
let interval = 1;
261283

262284
while (

src/constants.ts

+20-17
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,31 @@
1-
export type ALIGNMENT = 'auto' | 'center' | 'end' | 'start';
2-
export const ALIGN_AUTO: ALIGNMENT = 'auto';
3-
export const ALIGN_START: ALIGNMENT = 'start';
4-
export const ALIGN_CENTER: ALIGNMENT = 'center';
5-
export const ALIGN_END: ALIGNMENT = 'end';
1+
export enum ALIGNMENT {
2+
AUTO = 'auto',
3+
START = 'start',
4+
CENTER = 'center',
5+
END = 'end',
6+
}
67

7-
export type DIRECTION = 'horizontal' | 'vertical';
8-
export const DIRECTION_VERTICAL: DIRECTION = 'vertical';
9-
export const DIRECTION_HORIZONTAL: DIRECTION = 'horizontal';
8+
export enum DIRECTION {
9+
HORIZONTAL = 'horizontal',
10+
VERTICAL = 'vertical',
11+
}
1012

11-
export type SCROLL_CHANGE_REASON = 'observed' | 'requested';
12-
export const SCROLL_CHANGE_OBSERVED: SCROLL_CHANGE_REASON = 'observed';
13-
export const SCROLL_CHANGE_REQUESTED: SCROLL_CHANGE_REASON = 'requested';
13+
export enum SCROLL_CHANGE_REASON {
14+
OBSERVED = 'observed',
15+
REQUESTED = 'requested',
16+
}
1417

1518
export const scrollProp = {
16-
[DIRECTION_VERTICAL]: 'scrollTop',
17-
[DIRECTION_HORIZONTAL]: 'scrollLeft',
19+
[DIRECTION.VERTICAL]: 'scrollTop',
20+
[DIRECTION.HORIZONTAL]: 'scrollLeft',
1821
};
1922

2023
export const sizeProp = {
21-
[DIRECTION_VERTICAL]: 'height',
22-
[DIRECTION_HORIZONTAL]: 'width',
24+
[DIRECTION.VERTICAL]: 'height',
25+
[DIRECTION.HORIZONTAL]: 'width',
2326
};
2427

2528
export const positionProp = {
26-
[DIRECTION_VERTICAL]: 'top',
27-
[DIRECTION_HORIZONTAL]: 'left',
29+
[DIRECTION.VERTICAL]: 'top',
30+
[DIRECTION.HORIZONTAL]: 'left',
2831
};

0 commit comments

Comments
 (0)