Skip to content

Commit 48a0a58

Browse files
authored
Force strict comparison (eqeqeq eslint rule) (#126)
1 parent 8ffd452 commit 48a0a58

38 files changed

+250
-205
lines changed

.eslintrc.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ module.exports = {
2828
'import/no-cycle': 'error',
2929
'no-unreachable': 'error',
3030
'no-undef': 'error',
31+
'eqeqeq': 'error',
3132
'react-hooks/rules-of-hooks': 'error',
3233
'react-hooks/exhaustive-deps': 'error',
3334
'react/jsx-uses-react': 'error',

examples/benchmarking/src/listMemoFacet.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export const Performance = () => {
1818

1919
const tick = () => {
2020
setDataFacet((data) => {
21-
if (data == NO_VALUE) return []
21+
if (data === NO_VALUE) return []
2222

2323
data[0].health = data[0].health === 10 ? 5 : 10
2424
return data
@@ -50,6 +50,7 @@ const ListItem = ({ item }: { item: Facet<Data> }) => {
5050
useFacetEffect(
5151
(health) => {
5252
randomWork(health)
53+
return undefined
5354
},
5455
[],
5556
[health],
@@ -58,6 +59,7 @@ const ListItem = ({ item }: { item: Facet<Data> }) => {
5859
useFacetEffect(
5960
(name) => {
6061
randomWork(name)
62+
return undefined
6163
},
6264
[],
6365
[name],
@@ -66,6 +68,7 @@ const ListItem = ({ item }: { item: Facet<Data> }) => {
6668
useFacetEffect(
6769
(name) => {
6870
randomWork(name)
71+
return undefined
6972
},
7073
[],
7174
[name],
@@ -74,6 +77,7 @@ const ListItem = ({ item }: { item: Facet<Data> }) => {
7477
useFacetEffect(
7578
(name) => {
7679
randomWork(name)
80+
return undefined
7781
},
7882
[],
7983
[name],

packages/@react-facet/core/src/components/Map.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export const Map = <T,>({ array, children, equalityCheck }: MapProps<T>) => {
1717
<>
1818
{times(
1919
(index) =>
20-
equalityCheck != null ? (
20+
equalityCheck !== undefined ? (
2121
<MapChildMemo<T>
2222
key={index}
2323
arrayFacet={array}

packages/@react-facet/core/src/components/With.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const hasData = <T,>(_: Facet<T | null | undefined>, shouldRender: boolean | NoV
1313
}
1414

1515
export const With = <T,>({ data, children }: WithProps<T>) => {
16-
const shouldRenderFacet = useFacetMap((data) => data != null, [], [data])
16+
const shouldRenderFacet = useFacetMap((data) => data !== null && data !== undefined, [], [data])
1717
const shouldRender = useFacetUnwrap(shouldRenderFacet)
1818
return hasData(data, shouldRender) ? children(data) : null
1919
}

packages/@react-facet/core/src/createEqualityChecks.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ export const createNullableEqualityCheck = <T>(comparator: EqualityCheck<T>) =>
1010
let previous: T | null | undefined | NoValue = NO_VALUE
1111

1212
return (value: T | null | undefined) => {
13-
if (value == null || previous == null) {
14-
if (value != previous) {
13+
if (value === undefined || value === null || previous === undefined || previous === null) {
14+
if (value !== previous) {
1515
previous = value
1616
return false
1717
} else {
@@ -90,7 +90,7 @@ export const createUniformArrayEqualityCheck =
9090

9191
let isEquals = true
9292
for (let i = 0; i < longestLength; i++) {
93-
if (previous[i] == null) {
93+
if (previous[i] === undefined) {
9494
previous[i] = comparator()
9595
}
9696
if (!previous[i](current[i])) {
@@ -158,7 +158,7 @@ export const createOptionalValueEqualityCheck =
158158
let initializedComparator = comparator()
159159

160160
return (current: T | undefined | null) => {
161-
if (current == null) {
161+
if (current === undefined || current === null) {
162162
if (previousWasNullish) {
163163
return true
164164
}

packages/@react-facet/core/src/facet/createFacet.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export function createFacet<V>({
2222
const checker = equalityCheck?.()
2323

2424
const update = (newValue: V) => {
25-
if (equalityCheck != null) {
25+
if (equalityCheck !== undefined) {
2626
// we optimize for the most common scenario of using the defaultEqualityCheck (by inline its implementation)
2727
if (equalityCheck === defaultEqualityCheck) {
2828
const typeofValue = typeof newValue
@@ -37,7 +37,7 @@ export function createFacet<V>({
3737
return
3838
}
3939
} else {
40-
if (checker != null && checker(newValue)) {
40+
if (checker !== undefined && checker(newValue)) {
4141
return
4242
}
4343
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
import { NoValue, NO_VALUE, Value } from '../types'
22

3-
export const hasDefinedValue = (value: Value | NoValue): value is Value => value != null && value !== NO_VALUE
3+
export const hasDefinedValue = (value: Value | NoValue): value is Value =>
4+
value !== undefined && value !== null && value !== NO_VALUE

packages/@react-facet/core/src/helpers/multiObserve.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ export function multiObserve<Y extends Facet<unknown>[], T extends [...Y]>(
2626
for (let i = 0; i < facets.length; i++) {
2727
unsubscribes[i] = facets[i].observe((value) => {
2828
values[i] = value
29-
hasAllDependencies = hasAllDependencies || values.every((value) => value != NO_VALUE)
29+
hasAllDependencies = hasAllDependencies || values.every((value) => value !== NO_VALUE)
3030

3131
if (hasAllDependencies) {
32-
if (cleanup != null) {
32+
if (cleanup !== undefined) {
3333
cleanup()
3434
}
3535

@@ -42,7 +42,7 @@ export function multiObserve<Y extends Facet<unknown>[], T extends [...Y]>(
4242
for (let index = 0; index < unsubscribes.length; index++) {
4343
unsubscribes[index]()
4444
}
45-
if (cleanup != null) {
45+
if (cleanup !== undefined) {
4646
cleanup()
4747
}
4848
}

packages/@react-facet/core/src/hooks/useFacetCallback.spec.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ it('should work with uninitialized values', () => {
104104
useFacetEffect(
105105
() => {
106106
handler()
107+
return undefined
107108
},
108109
[handler],
109110
[internalDemoFacet],

packages/@react-facet/core/src/hooks/useFacetCallback.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export function useFacetCallback<M, Y extends Facet<unknown>[], T extends [...Y]
7070
const values = facets.map((facet) => facet.get())
7171

7272
for (const value of values) {
73-
if (value === NO_VALUE) return defaultReturnValue != null ? defaultReturnValue : NO_VALUE
73+
if (value === NO_VALUE) return defaultReturnValue !== undefined ? defaultReturnValue : NO_VALUE
7474
}
7575

7676
return callbackMemoized(...(values as ExtractFacetValues<T>))(...(args as K))

packages/@react-facet/core/src/hooks/useFacetEffect.spec.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ it('triggers the effect when a dependency changes', () => {
4242
useFacetEffect(
4343
(value) => {
4444
callback(`${value} ${dependency}`)
45+
return undefined
4546
},
4647
[dependency],
4748
[demoFacet],

packages/@react-facet/core/src/hooks/useFacetEffect.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@ import { cancelScheduledTask, scheduleTask } from '../scheduler'
44

55
export const createUseFacetEffect = (useHook: typeof useEffect | typeof useLayoutEffect) => {
66
return function <Y extends Facet<unknown>[], T extends [...Y]>(
7-
effect: (...args: ExtractFacetValues<T>) => void | Cleanup,
7+
effect: (...args: ExtractFacetValues<T>) => undefined | Cleanup,
88
dependencies: unknown[],
99
facets: T,
1010
) {
1111
// eslint-disable-next-line react-hooks/exhaustive-deps
1212
const effectMemoized = useCallback(effect as (...args: unknown[]) => ReturnType<typeof effect>, dependencies)
1313

1414
useHook(() => {
15-
let cleanup: void | Cleanup
15+
let cleanup: undefined | Cleanup
1616

1717
if (facets.length === 1) {
1818
const unsubscribe = facets[0].observe((value) => {
19-
if (cleanup != null) {
19+
if (cleanup !== undefined) {
2020
cleanup()
2121
}
2222

@@ -25,7 +25,7 @@ export const createUseFacetEffect = (useHook: typeof useEffect | typeof useLayou
2525

2626
return () => {
2727
unsubscribe()
28-
if (cleanup != null) {
28+
if (cleanup !== undefined) {
2929
cleanup()
3030
}
3131
}
@@ -36,10 +36,10 @@ export const createUseFacetEffect = (useHook: typeof useEffect | typeof useLayou
3636
const values: unknown[] = facets.map(() => NO_VALUE)
3737

3838
const task = () => {
39-
hasAllDependencies = hasAllDependencies || values.every((value) => value != NO_VALUE)
39+
hasAllDependencies = hasAllDependencies || values.every((value) => value !== NO_VALUE)
4040

4141
if (hasAllDependencies) {
42-
if (cleanup != null) {
42+
if (cleanup !== undefined) {
4343
cleanup()
4444
}
4545

@@ -61,7 +61,7 @@ export const createUseFacetEffect = (useHook: typeof useEffect | typeof useLayou
6161
return () => {
6262
cancelScheduledTask(task)
6363
unsubscribes.forEach((unsubscribe) => unsubscribe())
64-
if (cleanup != null) {
64+
if (cleanup !== undefined) {
6565
cleanup()
6666
}
6767
}

packages/@react-facet/core/src/hooks/useFacetMap.spec.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ describe('multiple dependencies', () => {
105105
useFacetEffect(
106106
(value) => {
107107
mock(value.name)
108+
return undefined
108109
},
109110
[],
110111
[adaptValue],
@@ -147,6 +148,7 @@ describe('multiple dependencies', () => {
147148
useFacetEffect(
148149
(value) => {
149150
mock(value)
151+
return undefined
150152
},
151153
[],
152154
[adaptValue],
@@ -189,6 +191,7 @@ describe('multiple dependencies', () => {
189191
useFacetEffect(
190192
(value) => {
191193
mock(value)
194+
return undefined
192195
},
193196
[],
194197
[adaptValue],
@@ -231,6 +234,7 @@ describe('multiple dependencies', () => {
231234
useFacetEffect(
232235
(value) => {
233236
mock(value)
237+
return undefined
234238
},
235239
[],
236240
[adaptValue],
@@ -388,6 +392,7 @@ describe('single dependency', () => {
388392
useFacetEffect(
389393
(value) => {
390394
mock(value.name)
395+
return undefined
391396
},
392397
[],
393398
[adaptValue],
@@ -429,6 +434,7 @@ describe('single dependency', () => {
429434
useFacetEffect(
430435
(value) => {
431436
mock(value)
437+
return undefined
432438
},
433439
[],
434440
[adaptValue],
@@ -470,6 +476,7 @@ describe('single dependency', () => {
470476
useFacetEffect(
471477
(value) => {
472478
mock(value)
479+
return undefined
473480
},
474481
[],
475482
[adaptValue],
@@ -511,6 +518,7 @@ describe('single dependency', () => {
511518
useFacetEffect(
512519
(value) => {
513520
mock(value)
521+
return undefined
514522
},
515523
[],
516524
[adaptValue],

packages/@react-facet/core/src/hooks/useFacetMemo.spec.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ describe('multiple dependencies', () => {
105105
useFacetEffect(
106106
(value) => {
107107
mock(value.name)
108+
return undefined
108109
},
109110
[],
110111
[adaptValue],
@@ -147,6 +148,7 @@ describe('multiple dependencies', () => {
147148
useFacetEffect(
148149
(value) => {
149150
mock(value)
151+
return undefined
150152
},
151153
[],
152154
[adaptValue],
@@ -189,6 +191,7 @@ describe('multiple dependencies', () => {
189191
useFacetEffect(
190192
(value) => {
191193
mock(value)
194+
return undefined
192195
},
193196
[],
194197
[adaptValue],
@@ -231,6 +234,7 @@ describe('multiple dependencies', () => {
231234
useFacetEffect(
232235
(value) => {
233236
mock(value)
237+
return undefined
234238
},
235239
[],
236240
[adaptValue],
@@ -388,6 +392,7 @@ describe('single dependency', () => {
388392
useFacetEffect(
389393
(value) => {
390394
mock(value.name)
395+
return undefined
391396
},
392397
[],
393398
[adaptValue],
@@ -429,6 +434,7 @@ describe('single dependency', () => {
429434
useFacetEffect(
430435
(value) => {
431436
mock(value)
437+
return undefined
432438
},
433439
[],
434440
[adaptValue],
@@ -470,6 +476,7 @@ describe('single dependency', () => {
470476
useFacetEffect(
471477
(value) => {
472478
mock(value)
479+
return undefined
473480
},
474481
[],
475482
[adaptValue],
@@ -511,6 +518,7 @@ describe('single dependency', () => {
511518
useFacetEffect(
512519
(value) => {
513520
mock(value)
521+
return undefined
514522
},
515523
[],
516524
[adaptValue],

packages/@react-facet/core/src/hooks/useFacetPropSetter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export function useFacetPropSetter<T extends Record<string, any>, Prop extends k
2222
): PropSetter<T, Prop> {
2323
return useMemo(
2424
() => (value: T[Prop]) => {
25-
facet.setWithCallback((prev) => ({ ...(prev != NO_VALUE ? prev : {}), [prop]: value } as unknown as T))
25+
facet.setWithCallback((prev) => ({ ...(prev !== NO_VALUE ? prev : {}), [prop]: value } as unknown as T))
2626
},
2727
[facet, prop],
2828
)

packages/@react-facet/core/src/hooks/useFacetRef.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ export function useFacetRef<T>(facet: Facet<T>): MutableRefObject<Option<T>>
66
export function useFacetRef<T>(facet: Facet<T>, defaultValue: T): MutableRefObject<T>
77
export function useFacetRef<T>(facet: Facet<T>, defaultValue?: T): MutableRefObject<T> {
88
let value = facet.get()
9-
if (value === NO_VALUE && defaultValue != undefined) {
9+
if (value === NO_VALUE && defaultValue !== undefined) {
1010
value = defaultValue
1111
}
1212

1313
const ref = useRef<Option<T>>(value)
1414
useFacetEffect(
1515
(value) => {
1616
ref.current = value
17+
return undefined
1718
},
1819
[],
1920
[facet],

0 commit comments

Comments
 (0)