MCPcopy
hub / github.com/TanStack/form / evaluate

Function evaluate

packages/form-core/src/utils.ts:420–473  ·  view source on GitHub ↗
(objA: T, objB: T)

Source from the content-addressed store, hash-verified

418}
419
420export function evaluate<T>(objA: T, objB: T) {
421 if (Object.is(objA, objB)) {
422 return true
423 }
424
425 if (
426 typeof objA !== 'object' ||
427 objA === null ||
428 typeof objB !== 'object' ||
429 objB === null
430 ) {
431 return false
432 }
433
434 if (objA instanceof Date && objB instanceof Date) {
435 return objA.getTime() === objB.getTime()
436 }
437
438 if (objA instanceof Map && objB instanceof Map) {
439 if (objA.size !== objB.size) return false
440 for (const [k, v] of objA) {
441 if (!objB.has(k) || !Object.is(v, objB.get(k))) return false
442 }
443 return true
444 }
445
446 if (objA instanceof Set && objB instanceof Set) {
447 if (objA.size !== objB.size) return false
448 for (const v of objA) {
449 if (!objB.has(v)) return false
450 }
451 return true
452 }
453
454 const keysA = Object.keys(objA)
455 const keysB = Object.keys(objB)
456
457 if (keysA.length !== keysB.length) {
458 return false
459 }
460
461 for (const key of keysA) {
462 // performs recursive search down the object tree
463
464 if (
465 !keysB.includes(key) ||
466 !evaluate(objA[key as keyof T], objB[key as keyof T])
467 ) {
468 return false
469 }
470 }
471
472 return true
473}
474
475/**
476 * Determines the logic for determining the error source and value to set on the field meta within the form level sync/async validation.

Callers 3

constructorMethod · 0.90
FormApiClass · 0.90
utils.spec.tsFile · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected