{"version":3,"file":"objects.cjs","names":[],"sources":["../../src/utils/objects.ts"],"sourcesContent":["/**\n * Determine whether a value is a plain object literal.\n *\n * Returns `false` for arrays, `null`, dates, maps, sets, and class instances.\n *\n * @internal\n */\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n    if (typeof value !== \"object\" || value === null) return false;\n    const proto = Object.getPrototypeOf(value);\n    return proto === Object.prototype || proto === null;\n}\n\n/**\n * Create a new object containing only the given `keys` from `obj`.\n *\n * Missing keys are skipped. The input is never mutated.\n *\n * @example\n * pick({ id: 1, name: \"Ana\", age: 30 }, [\"id\", \"name\"]);\n * // { id: 1, name: \"Ana\" }\n */\nexport function pick<T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {\n    const result = {} as Pick<T, K>;\n    for (const key of keys) {\n        if (Object.prototype.hasOwnProperty.call(obj, key)) {\n            result[key] = obj[key];\n        }\n    }\n    return result;\n}\n\n/**\n * Create a new object with the given `keys` removed from `obj`.\n *\n * The input is never mutated.\n *\n * @example\n * omit({ id: 1, name: \"Ana\", age: 30 }, [\"age\"]);\n * // { id: 1, name: \"Ana\" }\n */\nexport function omit<T extends object, K extends keyof T>(obj: T, keys: K[]): Omit<T, K> {\n    const exclude = new Set<PropertyKey>(keys);\n    const result = {} as Record<PropertyKey, unknown>;\n    for (const key of Object.keys(obj) as (keyof T)[]) {\n        if (!exclude.has(key)) {\n            result[key] = obj[key];\n        }\n    }\n    return result as Omit<T, K>;\n}\n\n/**\n * Recursively merge `source` into `target`, returning a new object.\n *\n * - Plain objects are merged key by key, recursing into nested plain objects.\n * - Arrays and non-plain values (dates, class instances, primitives) replace\n *   the target value entirely — they are not merged element by element.\n * - Neither `target` nor `source` is mutated.\n *\n * @example\n * deepMerge(\n *   { a: 1, nested: { x: 1, y: 2 } },\n *   { nested: { y: 20, z: 30 } },\n * );\n * // { a: 1, nested: { x: 1, y: 20, z: 30 } }\n *\n * @example\n * deepMerge({ tags: [\"a\", \"b\"] }, { tags: [\"c\"] });\n * // { tags: [\"c\"] } (arrays replaced, not merged)\n */\nexport function deepMerge<T>(target: T, source: Partial<T>): T {\n    if (!isPlainRecord(target) || !isPlainRecord(source)) {\n        return (source === undefined ? target : (source as unknown as T)) as T;\n    }\n    const result: Record<string, unknown> = { ...target };\n    for (const key of Object.keys(source)) {\n        const sourceValue = (source as Record<string, unknown>)[key];\n        const targetValue = result[key];\n        if (isPlainRecord(targetValue) && isPlainRecord(sourceValue)) {\n            result[key] = deepMerge(targetValue, sourceValue);\n        } else {\n            result[key] = sourceValue;\n        }\n    }\n    return result as T;\n}\n\n/**\n * Check whether a value is considered \"empty\".\n *\n * Returns `true` for `null`, `undefined`, empty strings, empty arrays, empty\n * plain objects, and empty `Map`/`Set` instances. Returns `false` for numbers\n * (including `0` and `NaN`), booleans, and dates, which are never empty.\n *\n * @example\n * isEmpty(null);       // true\n * isEmpty(\"\");         // true\n * isEmpty([]);         // true\n * isEmpty({});         // true\n * isEmpty(new Map());  // true\n * isEmpty(0);          // false\n * isEmpty(false);      // false\n * isEmpty(new Date()); // false\n */\nexport function isEmpty(value: unknown): boolean {\n    if (value === null || value === undefined) return true;\n    if (typeof value === \"string\") return value.length === 0;\n    if (Array.isArray(value)) return value.length === 0;\n    if (value instanceof Map || value instanceof Set) return value.size === 0;\n    if (isPlainRecord(value)) return Object.keys(value).length === 0;\n    return false;\n}\n"],"mappings":"AAOA,SAAS,EAAc,EAAkD,CACrE,GAAI,OAAO,GAAU,WAAY,EAAgB,MAAO,GACxD,IAAM,EAAQ,OAAO,eAAe,CAAK,EACzC,OAAO,IAAU,OAAO,WAAa,IAAU,IACnD,CAWA,SAAgB,EAA0C,EAAQ,EAAuB,CACrF,IAAM,EAAS,CAAC,EAChB,IAAK,IAAM,KAAO,EACV,OAAO,UAAU,eAAe,KAAK,EAAK,CAAG,IAC7C,EAAO,GAAO,EAAI,IAG1B,OAAO,CACX,CAWA,SAAgB,EAA0C,EAAQ,EAAuB,CACrF,IAAM,EAAU,IAAI,IAAiB,CAAI,EACnC,EAAS,CAAC,EAChB,IAAK,IAAM,KAAO,OAAO,KAAK,CAAG,EACxB,EAAQ,IAAI,CAAG,IAChB,EAAO,GAAO,EAAI,IAG1B,OAAO,CACX,CAqBA,SAAgB,EAAa,EAAW,EAAuB,CAC3D,GAAI,CAAC,EAAc,CAAM,GAAK,CAAC,EAAc,CAAM,EAC/C,OAAQ,IAAW,IAAA,GAAY,EAAU,EAE7C,IAAM,EAAkC,CAAE,GAAG,CAAO,EACpD,IAAK,IAAM,KAAO,OAAO,KAAK,CAAM,EAAG,CACnC,IAAM,EAAe,EAAmC,GAClD,EAAc,EAAO,GAC3B,AAGI,EAAO,GAHP,EAAc,CAAW,GAAK,EAAc,CAAW,EACzC,EAAU,EAAa,CAAW,EAElC,CAEtB,CACA,OAAO,CACX,CAmBA,SAAgB,EAAQ,EAAyB,CAM7C,OALI,GAAU,KAAoC,GAC9C,OAAO,GAAU,UACjB,MAAM,QAAQ,CAAK,EAAU,EAAM,SAAW,EAC9C,aAAiB,KAAO,aAAiB,IAAY,EAAM,OAAS,EACpE,EAAc,CAAK,EAAU,OAAO,KAAK,CAAK,CAAC,CAAC,SAAW,EACxD,EACX"}