Skip to content

Commit

Permalink
Force strict comparison (eqeqeq eslint rule) (#126)
Browse files Browse the repository at this point in the history
  • Loading branch information
dderg authored Sep 7, 2023
1 parent 8ffd452 commit 48a0a58
Show file tree
Hide file tree
Showing 38 changed files with 250 additions and 205 deletions.
1 change: 1 addition & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ module.exports = {
'import/no-cycle': 'error',
'no-unreachable': 'error',
'no-undef': 'error',
'eqeqeq': 'error',
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'error',
'react/jsx-uses-react': 'error',
Expand Down
6 changes: 5 additions & 1 deletion examples/benchmarking/src/listMemoFacet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export const Performance = () => {

const tick = () => {
setDataFacet((data) => {
if (data == NO_VALUE) return []
if (data === NO_VALUE) return []

data[0].health = data[0].health === 10 ? 5 : 10
return data
Expand Down Expand Up @@ -50,6 +50,7 @@ const ListItem = ({ item }: { item: Facet<Data> }) => {
useFacetEffect(
(health) => {
randomWork(health)
return undefined
},
[],
[health],
Expand All @@ -58,6 +59,7 @@ const ListItem = ({ item }: { item: Facet<Data> }) => {
useFacetEffect(
(name) => {
randomWork(name)
return undefined
},
[],
[name],
Expand All @@ -66,6 +68,7 @@ const ListItem = ({ item }: { item: Facet<Data> }) => {
useFacetEffect(
(name) => {
randomWork(name)
return undefined
},
[],
[name],
Expand All @@ -74,6 +77,7 @@ const ListItem = ({ item }: { item: Facet<Data> }) => {
useFacetEffect(
(name) => {
randomWork(name)
return undefined
},
[],
[name],
Expand Down
2 changes: 1 addition & 1 deletion packages/@react-facet/core/src/components/Map.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export const Map = <T,>({ array, children, equalityCheck }: MapProps<T>) => {
<>
{times(
(index) =>
equalityCheck != null ? (
equalityCheck !== undefined ? (
<MapChildMemo<T>
key={index}
arrayFacet={array}
Expand Down
2 changes: 1 addition & 1 deletion packages/@react-facet/core/src/components/With.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const hasData = <T,>(_: Facet<T | null | undefined>, shouldRender: boolean | NoV
}

export const With = <T,>({ data, children }: WithProps<T>) => {
const shouldRenderFacet = useFacetMap((data) => data != null, [], [data])
const shouldRenderFacet = useFacetMap((data) => data !== null && data !== undefined, [], [data])
const shouldRender = useFacetUnwrap(shouldRenderFacet)
return hasData(data, shouldRender) ? children(data) : null
}
8 changes: 4 additions & 4 deletions packages/@react-facet/core/src/createEqualityChecks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ export const createNullableEqualityCheck = <T>(comparator: EqualityCheck<T>) =>
let previous: T | null | undefined | NoValue = NO_VALUE

return (value: T | null | undefined) => {
if (value == null || previous == null) {
if (value != previous) {
if (value === undefined || value === null || previous === undefined || previous === null) {
if (value !== previous) {
previous = value
return false
} else {
Expand Down Expand Up @@ -90,7 +90,7 @@ export const createUniformArrayEqualityCheck =

let isEquals = true
for (let i = 0; i < longestLength; i++) {
if (previous[i] == null) {
if (previous[i] === undefined) {
previous[i] = comparator()
}
if (!previous[i](current[i])) {
Expand Down Expand Up @@ -158,7 +158,7 @@ export const createOptionalValueEqualityCheck =
let initializedComparator = comparator()

return (current: T | undefined | null) => {
if (current == null) {
if (current === undefined || current === null) {
if (previousWasNullish) {
return true
}
Expand Down
4 changes: 2 additions & 2 deletions packages/@react-facet/core/src/facet/createFacet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export function createFacet<V>({
const checker = equalityCheck?.()

const update = (newValue: V) => {
if (equalityCheck != null) {
if (equalityCheck !== undefined) {
// we optimize for the most common scenario of using the defaultEqualityCheck (by inline its implementation)
if (equalityCheck === defaultEqualityCheck) {
const typeofValue = typeof newValue
Expand All @@ -37,7 +37,7 @@ export function createFacet<V>({
return
}
} else {
if (checker != null && checker(newValue)) {
if (checker !== undefined && checker(newValue)) {
return
}
}
Expand Down
3 changes: 2 additions & 1 deletion packages/@react-facet/core/src/helpers/hasDefinedValue.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { NoValue, NO_VALUE, Value } from '../types'

export const hasDefinedValue = (value: Value | NoValue): value is Value => value != null && value !== NO_VALUE
export const hasDefinedValue = (value: Value | NoValue): value is Value =>
value !== undefined && value !== null && value !== NO_VALUE
6 changes: 3 additions & 3 deletions packages/@react-facet/core/src/helpers/multiObserve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ export function multiObserve<Y extends Facet<unknown>[], T extends [...Y]>(
for (let i = 0; i < facets.length; i++) {
unsubscribes[i] = facets[i].observe((value) => {
values[i] = value
hasAllDependencies = hasAllDependencies || values.every((value) => value != NO_VALUE)
hasAllDependencies = hasAllDependencies || values.every((value) => value !== NO_VALUE)

if (hasAllDependencies) {
if (cleanup != null) {
if (cleanup !== undefined) {
cleanup()
}

Expand All @@ -42,7 +42,7 @@ export function multiObserve<Y extends Facet<unknown>[], T extends [...Y]>(
for (let index = 0; index < unsubscribes.length; index++) {
unsubscribes[index]()
}
if (cleanup != null) {
if (cleanup !== undefined) {
cleanup()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ it('should work with uninitialized values', () => {
useFacetEffect(
() => {
handler()
return undefined
},
[handler],
[internalDemoFacet],
Expand Down
2 changes: 1 addition & 1 deletion packages/@react-facet/core/src/hooks/useFacetCallback.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ export function useFacetCallback<M, Y extends Facet<unknown>[], T extends [...Y]
const values = facets.map((facet) => facet.get())

for (const value of values) {
if (value === NO_VALUE) return defaultReturnValue != null ? defaultReturnValue : NO_VALUE
if (value === NO_VALUE) return defaultReturnValue !== undefined ? defaultReturnValue : NO_VALUE
}

return callbackMemoized(...(values as ExtractFacetValues<T>))(...(args as K))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ it('triggers the effect when a dependency changes', () => {
useFacetEffect(
(value) => {
callback(`${value} ${dependency}`)
return undefined
},
[dependency],
[demoFacet],
Expand Down
14 changes: 7 additions & 7 deletions packages/@react-facet/core/src/hooks/useFacetEffect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,19 @@ import { cancelScheduledTask, scheduleTask } from '../scheduler'

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

useHook(() => {
let cleanup: void | Cleanup
let cleanup: undefined | Cleanup

if (facets.length === 1) {
const unsubscribe = facets[0].observe((value) => {
if (cleanup != null) {
if (cleanup !== undefined) {
cleanup()
}

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

return () => {
unsubscribe()
if (cleanup != null) {
if (cleanup !== undefined) {
cleanup()
}
}
Expand All @@ -36,10 +36,10 @@ export const createUseFacetEffect = (useHook: typeof useEffect | typeof useLayou
const values: unknown[] = facets.map(() => NO_VALUE)

const task = () => {
hasAllDependencies = hasAllDependencies || values.every((value) => value != NO_VALUE)
hasAllDependencies = hasAllDependencies || values.every((value) => value !== NO_VALUE)

if (hasAllDependencies) {
if (cleanup != null) {
if (cleanup !== undefined) {
cleanup()
}

Expand All @@ -61,7 +61,7 @@ export const createUseFacetEffect = (useHook: typeof useEffect | typeof useLayou
return () => {
cancelScheduledTask(task)
unsubscribes.forEach((unsubscribe) => unsubscribe())
if (cleanup != null) {
if (cleanup !== undefined) {
cleanup()
}
}
Expand Down
8 changes: 8 additions & 0 deletions packages/@react-facet/core/src/hooks/useFacetMap.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ describe('multiple dependencies', () => {
useFacetEffect(
(value) => {
mock(value.name)
return undefined
},
[],
[adaptValue],
Expand Down Expand Up @@ -147,6 +148,7 @@ describe('multiple dependencies', () => {
useFacetEffect(
(value) => {
mock(value)
return undefined
},
[],
[adaptValue],
Expand Down Expand Up @@ -189,6 +191,7 @@ describe('multiple dependencies', () => {
useFacetEffect(
(value) => {
mock(value)
return undefined
},
[],
[adaptValue],
Expand Down Expand Up @@ -231,6 +234,7 @@ describe('multiple dependencies', () => {
useFacetEffect(
(value) => {
mock(value)
return undefined
},
[],
[adaptValue],
Expand Down Expand Up @@ -388,6 +392,7 @@ describe('single dependency', () => {
useFacetEffect(
(value) => {
mock(value.name)
return undefined
},
[],
[adaptValue],
Expand Down Expand Up @@ -429,6 +434,7 @@ describe('single dependency', () => {
useFacetEffect(
(value) => {
mock(value)
return undefined
},
[],
[adaptValue],
Expand Down Expand Up @@ -470,6 +476,7 @@ describe('single dependency', () => {
useFacetEffect(
(value) => {
mock(value)
return undefined
},
[],
[adaptValue],
Expand Down Expand Up @@ -511,6 +518,7 @@ describe('single dependency', () => {
useFacetEffect(
(value) => {
mock(value)
return undefined
},
[],
[adaptValue],
Expand Down
8 changes: 8 additions & 0 deletions packages/@react-facet/core/src/hooks/useFacetMemo.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ describe('multiple dependencies', () => {
useFacetEffect(
(value) => {
mock(value.name)
return undefined
},
[],
[adaptValue],
Expand Down Expand Up @@ -147,6 +148,7 @@ describe('multiple dependencies', () => {
useFacetEffect(
(value) => {
mock(value)
return undefined
},
[],
[adaptValue],
Expand Down Expand Up @@ -189,6 +191,7 @@ describe('multiple dependencies', () => {
useFacetEffect(
(value) => {
mock(value)
return undefined
},
[],
[adaptValue],
Expand Down Expand Up @@ -231,6 +234,7 @@ describe('multiple dependencies', () => {
useFacetEffect(
(value) => {
mock(value)
return undefined
},
[],
[adaptValue],
Expand Down Expand Up @@ -388,6 +392,7 @@ describe('single dependency', () => {
useFacetEffect(
(value) => {
mock(value.name)
return undefined
},
[],
[adaptValue],
Expand Down Expand Up @@ -429,6 +434,7 @@ describe('single dependency', () => {
useFacetEffect(
(value) => {
mock(value)
return undefined
},
[],
[adaptValue],
Expand Down Expand Up @@ -470,6 +476,7 @@ describe('single dependency', () => {
useFacetEffect(
(value) => {
mock(value)
return undefined
},
[],
[adaptValue],
Expand Down Expand Up @@ -511,6 +518,7 @@ describe('single dependency', () => {
useFacetEffect(
(value) => {
mock(value)
return undefined
},
[],
[adaptValue],
Expand Down
2 changes: 1 addition & 1 deletion packages/@react-facet/core/src/hooks/useFacetPropSetter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export function useFacetPropSetter<T extends Record<string, any>, Prop extends k
): PropSetter<T, Prop> {
return useMemo(
() => (value: T[Prop]) => {
facet.setWithCallback((prev) => ({ ...(prev != NO_VALUE ? prev : {}), [prop]: value } as unknown as T))
facet.setWithCallback((prev) => ({ ...(prev !== NO_VALUE ? prev : {}), [prop]: value } as unknown as T))
},
[facet, prop],
)
Expand Down
3 changes: 2 additions & 1 deletion packages/@react-facet/core/src/hooks/useFacetRef.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@ export function useFacetRef<T>(facet: Facet<T>): MutableRefObject<Option<T>>
export function useFacetRef<T>(facet: Facet<T>, defaultValue: T): MutableRefObject<T>
export function useFacetRef<T>(facet: Facet<T>, defaultValue?: T): MutableRefObject<T> {
let value = facet.get()
if (value === NO_VALUE && defaultValue != undefined) {
if (value === NO_VALUE && defaultValue !== undefined) {
value = defaultValue
}

const ref = useRef<Option<T>>(value)
useFacetEffect(
(value) => {
ref.current = value
return undefined
},
[],
[facet],
Expand Down
Loading

0 comments on commit 48a0a58

Please sign in to comment.