diff --git a/packages/sanity/src/core/form/store/__tests__/formState.test.ts b/packages/sanity/src/core/form/store/__tests__/formState.test.ts index d50468172d2..b902457a10c 100644 --- a/packages/sanity/src/core/form/store/__tests__/formState.test.ts +++ b/packages/sanity/src/core/form/store/__tests__/formState.test.ts @@ -11,10 +11,6 @@ import { import {startsWith, toString} from '@sanity/util/paths' import {createSchema} from '../../../schema/createSchema' -import { - createCallbackResolver, - type RootCallbackResolver, -} from '../conditional-property/createCallbackResolver' import { createPrepareFormState, type PrepareFormState, @@ -35,8 +31,8 @@ import { import {type StateTree} from '../types/state' let prepareFormState!: PrepareFormState -let prepareHiddenState!: RootCallbackResolver<'hidden'> -let prepareReadOnlyState!: RootCallbackResolver<'readOnly'> + +type RemoveFirstChar = S extends `${infer _}${infer R}` ? R : S beforeEach(() => { prepareFormState = createPrepareFormState({ @@ -50,8 +46,6 @@ beforeEach(() => { preparePrimitiveInputState: jest.fn, }, }) - prepareHiddenState = createCallbackResolver({property: 'hidden'}) - prepareReadOnlyState = createCallbackResolver({property: 'readOnly'}) }) const schema = createSchema({ name: 'default', @@ -334,7 +328,10 @@ const rootFormNodeOptions: Partial<{ }, } -const paths: {path: Path; expectedCalls: {[K in keyof PrepareFormState]: number}}[] = [ +const paths: { + path: Path + expectedCalls: {[K in RemoveFirstChar]: number} +}[] = [ { path: ['title'], expectedCalls: { @@ -467,32 +464,35 @@ describe.each( expect(startsWith(differentNode.path, path)).toBe(true) } - expect(prepareFormState.prepareArrayOfObjectsInputState).toHaveBeenCalledTimes( + expect(prepareFormState._prepareArrayOfObjectsInputState).toHaveBeenCalledTimes( expectedCalls.prepareArrayOfObjectsInputState, ) - expect(prepareFormState.prepareArrayOfObjectsMember).toHaveBeenCalledTimes( + expect(prepareFormState._prepareArrayOfObjectsMember).toHaveBeenCalledTimes( expectedCalls.prepareArrayOfObjectsMember, ) - expect(prepareFormState.prepareArrayOfPrimitivesInputState).toHaveBeenCalledTimes( + expect(prepareFormState._prepareArrayOfPrimitivesInputState).toHaveBeenCalledTimes( expectedCalls.prepareArrayOfPrimitivesInputState, ) - expect(prepareFormState.prepareArrayOfPrimitivesMember).toHaveBeenCalledTimes( + expect(prepareFormState._prepareArrayOfPrimitivesMember).toHaveBeenCalledTimes( expectedCalls.prepareArrayOfPrimitivesMember, ) - expect(prepareFormState.prepareFieldMember).toHaveBeenCalledTimes( + expect(prepareFormState._prepareFieldMember).toHaveBeenCalledTimes( expectedCalls.prepareFieldMember, ) - expect(prepareFormState.prepareObjectInputState).toHaveBeenCalledTimes( + expect(prepareFormState._prepareObjectInputState).toHaveBeenCalledTimes( expectedCalls.prepareObjectInputState, ) - expect(prepareFormState.preparePrimitiveInputState).toHaveBeenCalledTimes( + expect(prepareFormState._preparePrimitiveInputState).toHaveBeenCalledTimes( expectedCalls.preparePrimitiveInputState, ) }) }) describe('hidden', () => { - const pathsToTest: {path: Path; expectedCalls: {[K in keyof PrepareFormState]: number}}[] = [ + const pathsToTest: { + path: Path + expectedCalls: {[K in RemoveFirstChar]: number} + }[] = [ { path: ['title'], expectedCalls: { @@ -565,32 +565,35 @@ describe('hidden', () => { } // Verify memoization: functions should be called only for affected nodes - expect(prepareFormState.prepareArrayOfObjectsInputState).toHaveBeenCalledTimes( + expect(prepareFormState._prepareArrayOfObjectsInputState).toHaveBeenCalledTimes( expectedCalls.prepareArrayOfObjectsInputState, ) - expect(prepareFormState.prepareArrayOfObjectsMember).toHaveBeenCalledTimes( + expect(prepareFormState._prepareArrayOfObjectsMember).toHaveBeenCalledTimes( expectedCalls.prepareArrayOfObjectsMember, ) - expect(prepareFormState.prepareArrayOfPrimitivesInputState).toHaveBeenCalledTimes( + expect(prepareFormState._prepareArrayOfPrimitivesInputState).toHaveBeenCalledTimes( expectedCalls.prepareArrayOfPrimitivesInputState, ) - expect(prepareFormState.prepareArrayOfPrimitivesMember).toHaveBeenCalledTimes( + expect(prepareFormState._prepareArrayOfPrimitivesMember).toHaveBeenCalledTimes( expectedCalls.prepareArrayOfPrimitivesMember, ) - expect(prepareFormState.prepareFieldMember).toHaveBeenCalledTimes( + expect(prepareFormState._prepareFieldMember).toHaveBeenCalledTimes( expectedCalls.prepareFieldMember, ) - expect(prepareFormState.prepareObjectInputState).toHaveBeenCalledTimes( + expect(prepareFormState._prepareObjectInputState).toHaveBeenCalledTimes( expectedCalls.prepareObjectInputState, ) - expect(prepareFormState.preparePrimitiveInputState).toHaveBeenCalledTimes( + expect(prepareFormState._preparePrimitiveInputState).toHaveBeenCalledTimes( expectedCalls.preparePrimitiveInputState, ) }) }) describe('collapsedPaths', () => { - const pathsToTest: {path: Path; expectedCalls: {[K in keyof PrepareFormState]: number}}[] = [ + const pathsToTest: { + path: Path + expectedCalls: {[K in RemoveFirstChar]: number} + }[] = [ { path: ['simpleObject'], expectedCalls: { @@ -657,25 +660,25 @@ describe('collapsedPaths', () => { expect(member && 'collapsed' in member && member.collapsed).toBe(true) // Verify memoization: functions should be called only for affected nodes - expect(prepareFormState.prepareArrayOfObjectsInputState).toHaveBeenCalledTimes( + expect(prepareFormState._prepareArrayOfObjectsInputState).toHaveBeenCalledTimes( expectedCalls.prepareArrayOfObjectsInputState, ) - expect(prepareFormState.prepareArrayOfObjectsMember).toHaveBeenCalledTimes( + expect(prepareFormState._prepareArrayOfObjectsMember).toHaveBeenCalledTimes( expectedCalls.prepareArrayOfObjectsMember, ) - expect(prepareFormState.prepareArrayOfPrimitivesInputState).toHaveBeenCalledTimes( + expect(prepareFormState._prepareArrayOfPrimitivesInputState).toHaveBeenCalledTimes( expectedCalls.prepareArrayOfPrimitivesInputState, ) - expect(prepareFormState.prepareArrayOfPrimitivesMember).toHaveBeenCalledTimes( + expect(prepareFormState._prepareArrayOfPrimitivesMember).toHaveBeenCalledTimes( expectedCalls.prepareArrayOfPrimitivesMember, ) - expect(prepareFormState.prepareFieldMember).toHaveBeenCalledTimes( + expect(prepareFormState._prepareFieldMember).toHaveBeenCalledTimes( expectedCalls.prepareFieldMember, ) - expect(prepareFormState.prepareObjectInputState).toHaveBeenCalledTimes( + expect(prepareFormState._prepareObjectInputState).toHaveBeenCalledTimes( expectedCalls.prepareObjectInputState, ) - expect(prepareFormState.preparePrimitiveInputState).toHaveBeenCalledTimes( + expect(prepareFormState._preparePrimitiveInputState).toHaveBeenCalledTimes( expectedCalls.preparePrimitiveInputState, ) }) @@ -711,13 +714,13 @@ describe('collapsedFieldSets', () => { expect(fieldset?.collapsed).toBe(true) // Verify memoization: functions should be called only for affected nodes - expect(prepareFormState.prepareArrayOfObjectsInputState).toHaveBeenCalledTimes(0) - expect(prepareFormState.prepareArrayOfObjectsMember).toHaveBeenCalledTimes(0) - expect(prepareFormState.prepareArrayOfPrimitivesInputState).toHaveBeenCalledTimes(0) - expect(prepareFormState.prepareArrayOfPrimitivesMember).toHaveBeenCalledTimes(0) - expect(prepareFormState.prepareFieldMember).toHaveBeenCalledTimes(8) - expect(prepareFormState.prepareObjectInputState).toHaveBeenCalledTimes(1) - expect(prepareFormState.preparePrimitiveInputState).toHaveBeenCalledTimes(0) + expect(prepareFormState._prepareArrayOfObjectsInputState).toHaveBeenCalledTimes(0) + expect(prepareFormState._prepareArrayOfObjectsMember).toHaveBeenCalledTimes(0) + expect(prepareFormState._prepareArrayOfPrimitivesInputState).toHaveBeenCalledTimes(0) + expect(prepareFormState._prepareArrayOfPrimitivesMember).toHaveBeenCalledTimes(0) + expect(prepareFormState._prepareFieldMember).toHaveBeenCalledTimes(8) + expect(prepareFormState._prepareObjectInputState).toHaveBeenCalledTimes(1) + expect(prepareFormState._preparePrimitiveInputState).toHaveBeenCalledTimes(0) }) }) @@ -747,12 +750,12 @@ describe('fieldGroupState', () => { ]) // Verify memoization: functions should be called only for affected nodes - expect(prepareFormState.prepareArrayOfObjectsInputState).toHaveBeenCalledTimes(1) - expect(prepareFormState.prepareArrayOfObjectsMember).toHaveBeenCalledTimes(0) - expect(prepareFormState.prepareArrayOfPrimitivesInputState).toHaveBeenCalledTimes(1) - expect(prepareFormState.prepareArrayOfPrimitivesMember).toHaveBeenCalledTimes(0) - expect(prepareFormState.prepareFieldMember).toHaveBeenCalledTimes(8) - expect(prepareFormState.prepareObjectInputState).toHaveBeenCalledTimes(3) - expect(prepareFormState.preparePrimitiveInputState).toHaveBeenCalledTimes(4) + expect(prepareFormState._prepareArrayOfObjectsInputState).toHaveBeenCalledTimes(1) + expect(prepareFormState._prepareArrayOfObjectsMember).toHaveBeenCalledTimes(0) + expect(prepareFormState._prepareArrayOfPrimitivesInputState).toHaveBeenCalledTimes(1) + expect(prepareFormState._prepareArrayOfPrimitivesMember).toHaveBeenCalledTimes(0) + expect(prepareFormState._prepareFieldMember).toHaveBeenCalledTimes(8) + expect(prepareFormState._prepareObjectInputState).toHaveBeenCalledTimes(3) + expect(prepareFormState._preparePrimitiveInputState).toHaveBeenCalledTimes(4) }) }) diff --git a/packages/sanity/src/core/form/store/formState.ts b/packages/sanity/src/core/form/store/formState.ts index 2bad9c1dc92..0968ab4db91 100644 --- a/packages/sanity/src/core/form/store/formState.ts +++ b/packages/sanity/src/core/form/store/formState.ts @@ -222,13 +222,21 @@ export interface RootFormStateOptions { export interface PrepareFormState { (options: RootFormStateOptions): ObjectFormNode | null - prepareFieldMember: PrepareFieldMember - prepareObjectInputState: PrepareObjectInputState - prepareArrayOfPrimitivesInputState: PrepareArrayOfPrimitivesInputState - prepareArrayOfObjectsInputState: PrepareArrayOfObjectsInputState - prepareArrayOfObjectsMember: PrepareArrayOfObjectsMember - prepareArrayOfPrimitivesMember: PrepareArrayOfPrimitivesMember - preparePrimitiveInputState: PreparePrimitiveInputState + + /** @internal */ + _prepareFieldMember: PrepareFieldMember + /** @internal */ + _prepareObjectInputState: PrepareObjectInputState + /** @internal */ + _prepareArrayOfPrimitivesInputState: PrepareArrayOfPrimitivesInputState + /** @internal */ + _prepareArrayOfObjectsInputState: PrepareArrayOfObjectsInputState + /** @internal */ + _prepareArrayOfObjectsMember: PrepareArrayOfObjectsMember + /** @internal */ + _prepareArrayOfPrimitivesMember: PrepareArrayOfPrimitivesMember + /** @internal */ + _preparePrimitiveInputState: PreparePrimitiveInputState } export function createPrepareFormState({ @@ -1247,50 +1255,50 @@ export function createPrepareFormState({ }, ) - return Object.assign( - function prepareFormState({ + function prepareFormState({ + collapsedFieldSets, + collapsedPaths, + comparisonValue, + currentUser, + documentValue, + fieldGroupState, + focusPath, + hidden, + openPath, + presence, + readOnly, + schemaType, + validation, + changesOpen, + }: RootFormStateOptions): ObjectFormNode | null { + return prepareObjectInputState({ collapsedFieldSets, collapsedPaths, comparisonValue, currentUser, - documentValue, + value: documentValue, fieldGroupState, focusPath, - hidden, + hidden: hidden === false ? EMPTY_OBJECT : hidden, openPath, presence, - readOnly, + readOnly: readOnly === false ? EMPTY_OBJECT : readOnly, schemaType, validation, changesOpen, - }: RootFormStateOptions): ObjectFormNode | null { - return prepareObjectInputState({ - collapsedFieldSets, - collapsedPaths, - comparisonValue, - currentUser, - value: documentValue, - fieldGroupState, - focusPath, - hidden: hidden === false ? EMPTY_OBJECT : hidden, - openPath, - presence, - readOnly: readOnly === false ? EMPTY_OBJECT : readOnly, - schemaType, - validation, - changesOpen, - level: 0, - path: [], - }) - }, - { - prepareFieldMember, - prepareObjectInputState, - prepareArrayOfPrimitivesInputState, - prepareArrayOfObjectsInputState, - prepareArrayOfObjectsMember, - prepareArrayOfPrimitivesMember, - preparePrimitiveInputState, - }, - ) + level: 0, + path: [], + }) + } + + prepareFormState._prepareFieldMember = prepareFieldMember + prepareFormState._prepareFieldMember = prepareFieldMember + prepareFormState._prepareObjectInputState = prepareObjectInputState + prepareFormState._prepareArrayOfPrimitivesInputState = prepareArrayOfPrimitivesInputState + prepareFormState._prepareArrayOfObjectsInputState = prepareArrayOfObjectsInputState + prepareFormState._prepareArrayOfObjectsMember = prepareArrayOfObjectsMember + prepareFormState._prepareArrayOfPrimitivesMember = prepareArrayOfPrimitivesMember + prepareFormState._preparePrimitiveInputState = preparePrimitiveInputState + + return prepareFormState }