{"version":3,"sources":["../../src/object/index.ts"],"sourcesContent":["type PlainObject = Record<string, unknown>;\n\nconst _isObj = (x: unknown): x is PlainObject =>\n    Object.prototype.toString.call(x) === \"[object Object]\";\n\nconst _isNumber = (x: unknown): x is number =>\n    Object.prototype.toString.call(x) === \"[object Number]\";\n\nexport const FromObject = {\n    /**\n     * Convert an object into a 2D array ([[key, value], ...]).\n     * @param inputObj Input object.\n     */\n    ObjectToArray(inputObj: Record<string | number, unknown>): [string, unknown][] {\n        return Object.keys(inputObj).map((key) => [key, inputObj[key]]);\n    },\n    /**\n     * Flatten a multi-level object into a single level.\n     * Duplicate keys are given a generated ID when overwriteKey is false.\n     * @param obj Object to flatten.\n     * @param overwriteKey Overwrite duplicate keys (default false).\n     */\n    flatten(obj: object, overwriteKey: boolean = false): Record<string, unknown> {\n        if (Object.keys(obj).length === 0) return {};\n        const rs: Record<string, unknown> = {};\n        const genId = (): string =>\n            (Date.now() / 1000 | 0).toString(16) +\n            \"xxxxxxxxxxxxxxxx\".replace(/x/g, () => (Math.random() * 16 | 0).toString(16));\n\n        const recurse = (o: object): void => {\n            for (const key in o) {\n                const val = (o as Record<string, unknown>)[key];\n                if (_isObj(val)) {\n                    recurse(val);\n                } else if (key in rs && !overwriteKey) {\n                    rs[genId()] = val;\n                } else {\n                    rs[key] = val;\n                }\n            }\n        };\n        recurse(obj);\n        return rs;\n    },\n    /**\n     * Find and return the deepest nested object.\n     * Returns the first deepest object found; or all if multi = true.\n     * @param obj Input object.\n     * @param multi Return all objects at the deepest level.\n     */\n    getDeepest(obj: object, multi: boolean = false): object | object[] {\n        if (Object.keys(obj).length === 0) return {};\n        let deepest = 0;\n        let rs: object = {};\n        const rsMulti: Record<number, object[]> = {};\n\n        const recurse = (o: object, depth: number = 0): void => {\n            depth++;\n            if (depth > deepest) {\n                deepest = depth;\n                rs = o;\n                if (multi) rsMulti[depth] = [o];\n            } else if (depth === deepest && multi) {\n                if (!rsMulti[depth]) rsMulti[depth] = [];\n                rsMulti[depth].push(o);\n            }\n            for (const key in o) {\n                const val = (o as Record<string, unknown>)[key];\n                if (_isObj(val)) recurse(val, depth);\n            }\n        };\n        recurse(obj);\n        return multi ? (rsMulti[deepest] ?? []) : rs;\n    },\n    /**\n     * Sum all numeric values in an object (supports single-level nesting via field).\n     * @param obj Input object.\n     * @param field Target field when values are nested objects.\n     */\n    sumAll(obj: object, field: string = \"\"): number {\n        let sum = 0;\n        for (const prop in obj) {\n            const raw = (obj as Record<string, unknown>)[prop];\n            const t = field !== \"\" ? (raw as Record<string, unknown>)[field] : raw;\n            if (!_isNumber(t)) throw new Error(`Value of property \"${prop}\" is not a number.`);\n            sum += t;\n        }\n        return sum;\n    },\n    /**\n     * Find the maximum numeric value in an object.\n     * @param obj Input object.\n     * @param field Target field when values are nested objects.\n     */\n    max(obj: object, field: string = \"\"): number {\n        let max = -Infinity;\n        for (const prop in obj) {\n            const raw = (obj as Record<string, unknown>)[prop];\n            const t = field !== \"\" ? (raw as Record<string, unknown>)[field] : raw;\n            if (!_isNumber(t)) throw new Error(`Value of property \"${prop}\" is not a number.`);\n            if (t > max) max = t;\n        }\n        return max;\n    },\n    /**\n     * Find the minimum numeric value in an object.\n     * @param obj Input object.\n     * @param field Target field when values are nested objects.\n     */\n    min(obj: object, field: string = \"\"): number | null {\n        let min: number | null = null;\n        for (const prop in obj) {\n            const raw = (obj as Record<string, unknown>)[prop];\n            const t = field !== \"\" ? (raw as Record<string, unknown>)[field] : raw;\n            if (!_isNumber(t)) throw new Error(`Value of property \"${prop}\" is not a number.`);\n            if (min === null || t < min) min = t;\n        }\n        return min;\n    },\n};\n"],"mappings":"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","names":[]}