Skip to content

Force strict comparison (eqeqeq eslint rule) #126

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Sep 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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