Skip to content

Commit 82f8035

Browse files
committed
feat: compare state objects reference
1 parent 1427acb commit 82f8035

File tree

3 files changed

+12
-47
lines changed

3 files changed

+12
-47
lines changed

src/routers/createRouter.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Signal, createSignal, onCleanup } from "solid-js";
22
import type { LocationChange, RouterContext, RouterUtils } from "../types.ts";
33
import { createRouterComponent } from "./components.jsx";
4-
import { equalObjects } from "../utils.js";
54

65
function intercept<T>(
76
[value, setValue]: [() => T, (v: T) => void],
@@ -34,7 +33,7 @@ export function createRouter(config: {
3433
const wrap = (value: string | LocationChange) => (typeof value === "string" ? { value } : value);
3534
const signal = intercept<LocationChange>(
3635
createSignal(wrap(config.get()), {
37-
equals: (a, b) => a.value === b.value && equalObjects(a.state, b.state)
36+
equals: (a, b) => a.value === b.value && a.state === b.state
3837
}),
3938
undefined,
4039
next => {

src/routing.ts

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@ import {
4444
joinPaths,
4545
scoreRoute,
4646
mergeSearchString,
47-
expandOptionals,
48-
equalObjects
47+
expandOptionals
4948
} from "./utils.js";
5049

5150
const MAX_REDIRECTS = 100;
@@ -328,20 +327,18 @@ export function createRouterContext(
328327
};
329328

330329
createRenderEffect(() => {
331-
const { value, state: nextState } = source();
330+
const { value, state } = source();
332331
// Untrack this whole block so `start` doesn't cause Solid's Listener to be preserved
333332
untrack(() => {
334-
if (value !== reference() || !equalObjects(nextState, state())) {
335-
start(() => {
336-
intent = "native";
337-
setReference(value);
338-
setState(nextState);
339-
resetErrorBoundaries();
340-
submissions[1]([]);
341-
}).then(() => {
342-
intent = undefined;
343-
});
344-
}
333+
start(() => {
334+
intent = "native";
335+
if (value !== reference()) setReference(value);
336+
setState(state);
337+
resetErrorBoundaries();
338+
submissions[1]([]);
339+
}).then(() => {
340+
intent = undefined;
341+
});
345342
});
346343
});
347344

src/utils.ts

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -186,34 +186,3 @@ export function expandOptionals(pattern: string): string[] {
186186
[]
187187
);
188188
}
189-
190-
// Modified from fast-deep-equal for objects only (MIT)
191-
// https://github.com/epoberezkin/fast-deep-equal
192-
export function equalObjects(a: any, b: any) {
193-
if (a === b) return true;
194-
195-
if (a && b && typeof a == "object" && typeof b == "object") {
196-
if (a.constructor !== b.constructor) return false;
197-
if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
198-
if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();
199-
200-
var length, i, keys;
201-
keys = Object.keys(a);
202-
length = keys.length;
203-
204-
if (length !== Object.keys(b).length) return false;
205-
206-
for (i = length; i-- !== 0; ) {
207-
if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;
208-
}
209-
210-
for (i = length; i-- !== 0; ) {
211-
var key = keys[i];
212-
if (!equalObjects(a[key], b[key])) return false;
213-
}
214-
215-
return true;
216-
}
217-
218-
return false;
219-
}

0 commit comments

Comments
 (0)