{"version":3,"file":"index.mjs","names":[],"sources":["../src/constants.ts","../src/utils/check.ts","../src/utils/array.ts","../src/utils/clone.ts","../src/utils/object.ts","../src/utils/options.ts","../src/module.ts","../src/presets.ts"],"sourcesContent":["export enum PriorityName {\n    LEFT = 'left',\n    RIGHT = 'right',\n}\n","export function isObject(item: unknown) : item is Record<string, any> {\n    return (\n        !!item &&\n        typeof item === 'object' &&\n        !Array.isArray(item)\n    );\n}\n\nexport function isSafeKey(key: string) : boolean {\n    return key !== '__proto__' &&\n        key !== 'prototype' &&\n        key !== 'constructor';\n}\n\nexport function isEqual(x: any, y: any): boolean {\n    if (Object.is(x, y)) return true;\n\n    if (x instanceof Date && y instanceof Date) {\n        return x.getTime() === y.getTime();\n    }\n\n    if (x instanceof RegExp && y instanceof RegExp) {\n        return x.toString() === y.toString();\n    }\n\n    if (\n        isObject(x) &&\n        isObject(y)\n    ) {\n        const keysX = Reflect.ownKeys(x) as string[];\n        const keysY = Reflect.ownKeys(y) as string[];\n        if (keysX.length !== keysY.length) {\n            return false;\n        }\n\n        for (let i = 0; i < keysX.length; i++) {\n            const key = keysX[i];\n            if (!Reflect.has(y, key) || !isEqual(x[key], y[key])) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    if (\n        Array.isArray(x) &&\n        Array.isArray(y)\n    ) {\n        if (x.length !== y.length) {\n            return false;\n        }\n\n        for (let i = 0; i < x.length; i++) {\n            if (!isEqual(x[i], y[i])) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    return false;\n}\n","import { isEqual } from './check';\n\nexport function distinctArray<T = any>(arr: T[]) : T[] {\n    for (let i = 0; i < arr.length; i++) {\n        for (let j = arr.length - 1; j > i; j--) {\n            if (isEqual(arr[i], arr[j])) {\n                arr.splice(j, 1);\n            }\n        }\n    }\n\n    return arr;\n}\n","import { isObject } from './check';\n\n/* istanbul ignore next */\nconst gT = (() => {\n    if (typeof globalThis !== 'undefined') {\n        return globalThis;\n    }\n\n    if (typeof self !== 'undefined') {\n        return self;\n    }\n\n    if (typeof window !== 'undefined') {\n        return window;\n    }\n\n    if (typeof global !== 'undefined') {\n        return global;\n    }\n\n    throw new Error('unable to locate global object');\n})();\n\nexport function polyfillClone<T>(input: T) {\n    const map = new WeakMap();\n\n    const fn = <A>(value: A) : A => {\n        if (Array.isArray(value)) {\n            if (map.has(value)) {\n                return map.get(value);\n            }\n\n            const cloned = [] as A;\n            map.set(value, cloned);\n\n            value.map((el) => (cloned as any[]).push(fn(el)));\n\n            return cloned;\n        }\n\n        if (isObject(value)) {\n            if (map.has(value)) {\n                return map.get(value);\n            }\n\n            const output = {} as A;\n            const keys = Object.keys(value);\n\n            map.set(value, output);\n            for (let i = 0; i < keys.length; i++) {\n                output[keys[i] as keyof A] = fn(value[keys[i]]);\n            }\n\n            return output;\n        }\n\n        return value;\n    };\n\n    return fn(input);\n}\n\n/* istanbul ignore next */\nexport function clone<T>(value: T) : T {\n    if (gT.structuredClone) {\n        return gT.structuredClone(value);\n    }\n\n    /* istanbul ignore next */\n    return polyfillClone(value);\n}\n","export function hasOwnProperty<X extends {}, Y extends PropertyKey>(obj: X, prop: Y): obj is X & Record<Y, unknown> {\n    return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n","import { PriorityName } from '../constants';\nimport type { Options, OptionsInput } from '../type';\n\nexport function buildOptions(options: OptionsInput = {}) : Options {\n    options.array = options.array ?? true;\n    options.arrayDistinct = options.arrayDistinct ?? false;\n    options.clone = options.clone ?? false;\n    options.inPlace = options.inPlace ?? false;\n    options.priority = options.priority || PriorityName.LEFT;\n    options.arrayPriority = options.arrayPriority || options.priority;\n\n    return options as Options;\n}\n\nexport function togglePriority(priority: `${PriorityName}`) {\n    return priority === PriorityName.LEFT ?\n        `${PriorityName.RIGHT}` :\n        `${PriorityName.LEFT}`;\n}\n","import { PriorityName } from './constants';\nimport type {\n    Merger, \n    MergerContext,\n    MergerResult,\n    MergerSource,\n    MergerSourceUnwrap,\n    OptionsInput,\n} from './type';\n\nimport {\n    buildOptions,\n    clone,\n    distinctArray,\n    hasOwnProperty,\n    isObject,\n    isSafeKey, \n    togglePriority,\n} from './utils';\n\nfunction baseMerger<B extends MergerSource[]>(\n    context: MergerContext,\n    ...sources: B\n) : MergerResult<B> {\n    let target : MergerSourceUnwrap<B>;\n    let source : MergerSourceUnwrap<B> | undefined;\n\n    let { priority } = context.options;\n    if (sources.length >= 2) {\n        if (\n            Array.isArray(sources.at(0)) &&\n            Array.isArray(sources.at(-1))\n        ) {\n            priority = context.options.arrayPriority;\n        }\n    }\n\n    if (priority === PriorityName.RIGHT) {\n        target = sources.pop() as MergerSourceUnwrap<B>;\n        source = sources.pop() as MergerSourceUnwrap<B>;\n    } else {\n        target = sources.shift() as MergerSourceUnwrap<B>;\n        source = sources.shift() as MergerSourceUnwrap<B>;\n    }\n\n    if (!source) {\n        if (\n            Array.isArray(target) &&\n            context.options.arrayDistinct\n        ) {\n            return distinctArray(target) as MergerResult<B>;\n        }\n\n        return target as MergerResult<B>;\n    }\n\n    if (\n        Array.isArray(target) &&\n        Array.isArray(source)\n    ) {\n        target.push(...source as MergerSource[]);\n\n        if (context.options.arrayPriority === PriorityName.RIGHT) {\n            return baseMerger(\n                context,\n                ...sources,\n                target,\n            ) as MergerResult<B>;\n        }\n\n        return baseMerger(\n            context,\n            target,\n            ...sources,\n        ) as MergerResult<B>;\n    }\n\n    context.map.set(source, true);\n\n    if (\n        isObject(target) &&\n        isObject(source)\n    ) {\n        const keys = Object.keys(source);\n        for (let i = 0; i < keys.length; i++) {\n            const key = keys[i] as (keyof MergerSourceUnwrap<B>);\n\n            if (!isSafeKey(key as string)) {\n                continue;\n            }\n\n            if (hasOwnProperty(target, key)) {\n                if (context.options.strategy) {\n                    const applied = context.options.strategy(target, key as string, source[key]);\n                    if (typeof applied !== 'undefined') {\n                        continue;\n                    }\n                }\n\n                if (\n                    isObject(target[key]) &&\n                    isObject(source[key])\n                ) {\n                    if (context.map.has(source[key])) {\n                        const sourceKeys = Object.keys(source[key] as Record<string, any>);\n                        for (let j = 0; j < sourceKeys.length; j++) {\n                            if (\n                                isSafeKey(sourceKeys[j]) &&\n                                !hasOwnProperty(target[key] as Record<string, any>, sourceKeys[j])\n                            ) {\n                                (target[key] as Record<string, any>)[sourceKeys[j]] = (source[key] as Record<string, any>)[sourceKeys[j]];\n                            }\n                        }\n\n                        continue;\n                    }\n\n                    if (context.options.priority === PriorityName.RIGHT) {\n                        target[key] = baseMerger(\n                            context,\n                            source[key] as MergerSource,\n                            target[key] as MergerSource,\n                        ) as MergerSourceUnwrap<B>[keyof MergerSourceUnwrap<B>];\n                    } else {\n                        target[key] = baseMerger(\n                            context,\n                            target[key] as MergerSource,\n                            source[key] as MergerSource,\n                        ) as MergerSourceUnwrap<B>[keyof MergerSourceUnwrap<B>];\n                    }\n\n                    continue;\n                }\n\n                if (\n                    context.options.array &&\n                    Array.isArray(target[key]) &&\n                    Array.isArray(source[key])\n                ) {\n                    const arrayPriority = context.options.priority !== context.options.arrayPriority ?\n                        togglePriority(context.options.arrayPriority) :\n                        context.options.arrayPriority;\n\n                    switch (arrayPriority) {\n                        case PriorityName.LEFT:\n                            Object.assign(target, {\n                                [key]: baseMerger(context, target[key] as MergerSource, source[key] as MergerSource),\n                            });\n                            break;\n                        case PriorityName.RIGHT:\n                            Object.assign(target, {\n                                [key]: baseMerger(context, source[key] as MergerSource, target[key] as MergerSource),\n                            });\n                            break;\n                    }\n                }\n            } else {\n                Object.assign(target, {\n                    [key]: source[key],\n                });\n            }\n        }\n    }\n\n    context.map = new WeakMap();\n\n    if (context.options.priority === PriorityName.RIGHT) {\n        return baseMerger(context, ...sources, target) as MergerResult<B>;\n    }\n\n    return baseMerger(context, target, ...sources) as MergerResult<B>;\n}\n\nexport function createMerger(input?: OptionsInput) : Merger {\n    const options = buildOptions(input);\n\n    return <B extends MergerSource[]>(\n        ...sources: B\n    ) : MergerResult<B> => {\n        if (!sources.length) {\n            throw new SyntaxError('At least one input element is required.');\n        }\n\n        const ctx : MergerContext = {\n            options,\n            map: new WeakMap<any, any>(),\n        };\n\n        if (options.clone) {\n            return baseMerger(ctx, ...clone(sources));\n        }\n\n        if (!options.inPlace) {\n            if (\n                Array.isArray(sources.at(0)) &&\n                options.arrayPriority === PriorityName.LEFT\n            ) {\n                sources.unshift([]);\n                return baseMerger(ctx, ...sources);\n            }\n\n            if (\n                Array.isArray(sources.at(-1)) &&\n                options.arrayPriority === PriorityName.RIGHT\n            ) {\n                sources.push([]);\n                return baseMerger(ctx, ...sources);\n            }\n\n            if (options.priority === PriorityName.LEFT) {\n                sources.unshift({});\n            } else {\n                sources.push({});\n            }\n        }\n\n        return baseMerger(ctx, ...sources);\n    };\n}\n\nexport const merge = createMerger();\n","import { createMerger } from './module';\nimport type { MergerResult } from './type';\n\n/**\n * Assign source attributes to a target object.\n *\n * @param target\n * @param sources\n */\nexport function assign<A extends Record<string, any>, B extends Record<string, any>[]>(\n    target: A,\n    ...sources: B\n) : A & MergerResult<B> {\n    return createMerger({\n        inPlace: true,\n        priority: 'left',\n        array: false,\n    })(target, ...sources) as A & MergerResult<B>;\n}\n"],"mappings":"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"}