{"version":3,"file":"applyProps.mjs","sources":["../../src/helpers/applyProps.ts"],"sourcesContent":["import {\n    Container,\n    Graphics,\n} from 'pixi.js';\nimport {\n    type FederatedPointerEvent,\n    type FederatedWheelEvent,\n} from 'pixi.js';\nimport {\n    PixiToReactEventPropNames,\n    ReactToPixiEventPropNames,\n} from '../constants/EventPropNames';\nimport { type DiffSet } from '../typedefs/DiffSet';\nimport { type HostConfig } from '../typedefs/HostConfig';\nimport { type InstanceState } from '../typedefs/InstanceState';\nimport {\n    isNull,\n    isUndefined,\n} from './compare';\nimport { diffProps } from './diffProps';\nimport { isDiffSet } from './isDiffSet';\nimport { isReadOnlyProperty } from './isReadOnlyProperty';\nimport { log } from './log';\n\nconst DEFAULT = '__default';\nconst DEFAULTS_CONTAINERS = new Map();\n\nconst PIXI_EVENT_PROP_NAME_ERROR_HAS_BEEN_SHOWN: Record<string, boolean> = {};\n\nexport type MaybeInstance = Partial<HostConfig['instance']>;\n\nfunction targetKeyReducer(accumulator: any, key: string)\n{\n    if (accumulator)\n    {\n        const value = accumulator[key];\n\n        if (!isUndefined(value) && !isNull(value))\n        {\n            return value;\n        }\n    }\n\n    return accumulator;\n}\n\n/** Apply properties to Pixi.js instance. */\nexport function applyProps(\n    instance: MaybeInstance,\n    data: HostConfig['props'] | DiffSet,\n)\n{\n    const {\n        __pixireact: instanceState = {} as InstanceState,\n        ...instanceProps\n    } = instance;\n\n    let typedData;\n\n    if (isDiffSet(data))\n    {\n        typedData = data as DiffSet;\n    }\n    else\n    {\n        typedData = diffProps(data, instanceProps as HostConfig['props']);\n    }\n\n    const { changes } = typedData;\n\n    let changeIndex = 0;\n\n    while (changeIndex < changes.length)\n    {\n        const change = changes[changeIndex];\n        let hasError = false;\n        let key = change[0] as keyof HostConfig['instance'];\n        let value = change[1];\n        const isEvent = change[2];\n\n        const keys = change[3];\n\n        let currentInstance = instance;\n        let targetProp = currentInstance[key];\n\n        if ((key as string === 'draw') && (typeof value === 'function'))\n        {\n            if (instance instanceof Graphics)\n            {\n                value(instance);\n            }\n            else\n            {\n                hasError = true;\n                log('warn', `The \\`draw\\` prop was used on a \\`${instanceState.type}\\` component, but it's only valid on \\`graphics\\` components.`);\n            }\n        }\n\n        if (key in PixiToReactEventPropNames)\n        {\n            const typedKey = key as keyof typeof PixiToReactEventPropNames;\n\n            hasError = true;\n\n            if (!PIXI_EVENT_PROP_NAME_ERROR_HAS_BEEN_SHOWN[key])\n            {\n                PIXI_EVENT_PROP_NAME_ERROR_HAS_BEEN_SHOWN[key] = true;\n\n                log('warn', `Event names must be pascal case; instead of \\`${key}\\`, you probably want \\`${PixiToReactEventPropNames[typedKey]}\\`.`);\n            }\n        }\n\n        if (!hasError)\n        {\n            // Resolve dashed props\n            if (keys.length)\n            {\n                targetProp = keys.reduce(targetKeyReducer, currentInstance);\n\n                // If the target is atomic, it forces us to switch the root\n                if (!(targetProp && (targetProp as unknown as Record<string, unknown>).set))\n                {\n                    const [name, ...reverseEntries] = keys.reverse();\n\n                    currentInstance = reverseEntries.reverse().reduce(targetKeyReducer, currentInstance);\n\n                    key = name as keyof MaybeInstance;\n                }\n            }\n\n            // https://github.com/mrdoob/three.js/issues/21209\n            // HMR/fast-refresh relies on the ability to cancel out props, but pixi.js\n            // has no means to do this. Hence we curate a small collection of value-classes\n            // with their respective constructor/set arguments\n            // For removed props, try to set default values, if possible\n            if (value === `${DEFAULT}remove`)\n            {\n                if (currentInstance instanceof Container)\n                {\n                    // create a blank slate of the instance and copy the particular parameter.\n                    let ctor = DEFAULTS_CONTAINERS.get(currentInstance.constructor);\n\n                    if (!ctor)\n                    {\n                        ctor = currentInstance.constructor;\n\n                        // eslint-disable-next-line new-cap\n                        ctor = new ctor();\n\n                        DEFAULTS_CONTAINERS.set(currentInstance.constructor, ctor);\n                    }\n\n                    value = ctor[key];\n                }\n                else\n                {\n                    // instance does not have constructor, just set it to 0\n                    value = 0;\n                }\n            }\n\n            // Deal with events ...\n            if (isEvent && instanceState)\n            {\n                const typedKey = key as keyof typeof ReactToPixiEventPropNames;\n                const pixiKey = ReactToPixiEventPropNames[typedKey];\n\n                if (value)\n                {\n                    currentInstance[pixiKey] = value as (event: FederatedPointerEvent | FederatedWheelEvent) => void;\n                }\n                else\n                {\n                    delete currentInstance[pixiKey];\n                }\n            }\n            else if (!isReadOnlyProperty(currentInstance as Record<string, unknown>, key))\n            {\n                // @ts-expect-error Typescript is grumpy because this could be setting a readonly key, but we're already handling that in the conditional above. 🤷🏻‍♂️\n                currentInstance[key] = value;\n            }\n        }\n\n        changeIndex += 1;\n    }\n\n    return instance;\n}\n"],"names":[],"mappings":"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"}