Allowed re-calling sheet.object() with shorthand props again

This commit is contained in:
Aria Minaei 2021-09-06 21:11:15 +02:00
parent b5e994f597
commit 713c6cacd7

View file

@ -13,6 +13,7 @@ import type {$IntentionalAny} from '@theatre/shared/utils/types'
import userReadableTypeOfValue from '@theatre/shared/utils/userReadableTypeOfValue' import userReadableTypeOfValue from '@theatre/shared/utils/userReadableTypeOfValue'
import deepEqual from 'fast-deep-equal' import deepEqual from 'fast-deep-equal'
import type {IShorthandCompoundProps} from '@theatre/core/propTypes/internals' import type {IShorthandCompoundProps} from '@theatre/core/propTypes/internals'
import type SheetObject from '@theatre/core/sheetObjects/SheetObject'
export type SheetObjectConfig< export type SheetObjectConfig<
Props extends PropTypeConfig_Compound<$IntentionalAny>, Props extends PropTypeConfig_Compound<$IntentionalAny>,
@ -31,7 +32,10 @@ export interface ISheet {
readonly sequence: ISequence readonly sequence: ISequence
} }
const weakMapOfUnsanitizedProps = new WeakMap() const weakMapOfUnsanitizedProps = new WeakMap<
SheetObject,
IShorthandCompoundProps
>()
export default class TheatreSheet implements ISheet { export default class TheatreSheet implements ISheet {
get type(): 'Theatre_Sheet_PublicAPI' { get type(): 'Theatre_Sheet_PublicAPI' {
@ -60,22 +64,29 @@ export default class TheatreSheet implements ISheet {
if (existingObject) { if (existingObject) {
if (process.env.NODE_ENV !== 'production') { if (process.env.NODE_ENV !== 'production') {
if (!deepEqual(config, existingObject.template.config)) { const prevConfig = weakMapOfUnsanitizedProps.get(existingObject)
throw new Error( if (prevConfig) {
`You seem to have called sheet.object("${key}", config) twice, with different values for \`config\`. ` + if (!deepEqual(config, prevConfig)) {
`This is disallowed because changing the config of an object on the fly would make it difficult to reason about.\n\n` + throw new Error(
`You can fix this by either re-using the existing object, or calling sheet.object("${key}", config) with the same config.`, `You seem to have called sheet.object("${key}", config) twice, with different values for \`config\`. ` +
) `This is disallowed because changing the config of an object on the fly would make it difficult to reason about.\n\n` +
`You can fix this by either re-using the existing object, or calling sheet.object("${key}", config) with the same config.`,
)
}
} }
} }
return existingObject.publicApi as $IntentionalAny return existingObject.publicApi as $IntentionalAny
} else { } else {
const sanitizedConfig = compound(config)
const object = internal.createObject( const object = internal.createObject(
sanitizedPath, sanitizedPath,
nativeObject, nativeObject,
compound(config), sanitizedConfig,
) )
if (process.env.NODE_ENV !== 'production') {
weakMapOfUnsanitizedProps.set(object, config)
}
return object.publicApi as $IntentionalAny return object.publicApi as $IntentionalAny
} }
} }