{"version":3,"sources":["../src/classs/getClassStaticValue.ts"],"names":["getClassStaticValue","instanceOrClass","fieldName","options","opts","assignObject","proto","isClass","fieldValue","valueType","isPlainObject","defaultValue","valueList","mergedResults","result","item","value","index"],"mappings":";;;;AA0BO,SAASA,CAAAA,CACZC,EACAC,CACAC,CAAAA,CAAAA,CACC,CACD,IAAMC,GAAAA,CAAOC,CACT,CAAA,CAGI,KAAO,CAAA,aAAA,CACP,QAAS,IACb,CAAA,CACAF,CACJ,CAEIG,CAAAA,CAAAA,CAAQC,IAAQN,CAAe,CAAA,CAAIA,CAAkBA,CAAAA,CAAAA,CAAgB,WACnEO,CAAAA,CAAAA,CAAcF,EAAcJ,CAAS,CAAA,CAGrCO,EAAYC,GAAcN,CAAAA,GAAAA,CAAK,OAAO,CACtC,CAAA,CAAA,CACA,KAAM,CAAA,OAAA,CAAQA,GAAK,CAAA,OAAO,EACxB,CACAM,CAAAA,GAAAA,CAAcF,CAAU,CACtB,CAAA,CAAA,CACA,MAAM,OAAQA,CAAAA,CAAU,CACtB,CAAA,CAAA,CACA,CAEZ,CAAA,GAAIJ,IAAK,KAAU,GAAA,MAAA,EAAUK,IAAc,CACvC,CAAA,OAAOD,EAGX,IAAMG,CAAAA,CACFF,CAAc,GAAA,CAAA,CAAI,MAAO,CAAA,MAAA,CAAO,EAAIL,CAAAA,GAAAA,CAAK,SAAW,EAAE,EAAIA,GAAK,CAAA,OAAA,EAAW,EAAC,CAEzEQ,CAAYJ,CAAAA,CAAAA,GAAe,OAAY,CAACA,CAAU,EAAI,EAAC,CAG7D,KAAOF,CACHA,GAAAA,CAAAA,CAASA,CAAc,CAAA,SAAA,CAClBA,CAAcJ,CAAAA,CAAS,IACxBU,CAAU,CAAA,IAAA,CAAMN,CAAcJ,CAAAA,CAAS,CAAC,CAAA,CAMhD,IAAIW,CAAgBL,CAAAA,CAAAA,CACpB,OAAIC,CAAAA,GAAc,CAEdI,CAAAA,CAAAA,CAAgBD,EAAU,MAAO,CAAA,CAACE,EAAQC,CAClCL,GAAAA,GAAAA,CAAcK,CAAI,CAEXX,CAAAA,GAAAA,CAAK,KAAU,GAAA,OAAA,CAChB,MAAO,CAAA,MAAA,CAAO,EAAIO,CAAAA,CAAAA,CAAcI,EAAMD,CAAM,CAAA,CAC5C,OAAO,MAAO,CAAA,EAAIH,CAAAA,CAAAA,CAAcI,CAAMD,CAAAA,CAAM,EAE3CA,CAEZ,CAAA,EAAE,CACEL,CAAAA,CAAAA,GAAc,EAErBI,CAAgBD,CAAAA,CAAAA,CAAU,MAAO,CAAA,CAACE,CAAQC,CAAAA,CAAAA,IAClC,MAAM,OAAQA,CAAAA,CAAI,CAElBD,CAAAA,CAAAA,CAAO,OAAQ,CAAA,GAAGC,CAAI,CAEtBD,CAAAA,CAAAA,CAAO,OAAQC,CAAAA,CAAI,CAEhBD,CAAAA,CAAAA,CAAAA,CACR,EAAE,CAAA,CAELD,EAAgBD,CAAUA,CAAAA,CAAAA,CAAU,OAAS,CAAC,CAAA,EAAKT,CAAS,EAAA,OAAA,CAG5D,KAAM,CAAA,OAAA,CAAQU,CAAa,CAAKT,EAAAA,GAAAA,CAAK,QAAU,aAC/CS,GAAAA,CAAAA,CAAgB,MAAM,IAAK,CAAA,IAAI,GAAIA,CAAAA,CAAa,CAAC,CAAA,CAE7CH,IAAcC,CAAY,CAAA,EAC1BE,EAAc,OAAQ,CAAA,CAACG,EAAYC,CAAkB,GAAA,CAC7CP,GAAcM,CAAAA,CAAK,CACnBH,GAAAA,CAAAA,CAAcI,CAAK,CAAI,CAAA,MAAA,CAAO,MAAO,CAAA,EAAIN,CAAAA,CAAAA,CAAcK,CAAK,CAEpE,EAAA,CAAC,CAGFH,CAAAA,CAAAA,CAAAA,EAAkBF,CAC7B","file":"chunk-ZQIJH4W4.mjs","sourcesContent":["import { isClass } from '../typecheck/isClass'\nimport { isPlainObject } from '../typecheck/isPlainObject'\nimport { assignObject } from '../object/assignObject'\n\nexport interface GetClassStaticValueOptions {\n    merge?: 'none' | 'merge' | 'uniqueMerge' // 指定合并策略\n    default?: any // 当不存在时提供一个默认值\n}\n/**\n *\n * 获取继承链上指定字段的值\n * 获取类的静态变量值，会沿继承链向上查找，并能自动合并数组和{}值\n *\n * calss A{\n *     static settings={a:1}\n * }\n * calss A1 extends A{\n *     static settings={b:2}\n * }\n *\n * getStaticFieldValue(new A1(),\"settings\") ==== {a:1,b:2}\n *\n * @param instanceOrClass\n * @param fieldName\n * @param options\n */\nexport function getClassStaticValue<T = any>(\n    instanceOrClass: object,\n    fieldName: string,\n    options?: GetClassStaticValueOptions,\n): T {\n    const opts = assignObject(\n        {\n            // 是否进行合并,0-代表不合并，也就是不会从原型链中读取，1-使用Object.assign合并,2-使用mergeDeepRigth合并\n            // 对数组,0-不合并，1-合并数组,   2-合并且删除重复项\n            merge: 'uniqueMerge',\n            default: null, // 提供默认值，如果{}和[]，会使用上述的合并策略\n        },\n        options,\n    ) as Required<GetClassStaticValueOptions>\n\n    let proto = isClass(instanceOrClass) ? instanceOrClass : instanceOrClass.constructor\n    const fieldValue = (proto as any)[fieldName]\n\n    // 0-{}, 1-[], 2-其他类型\n    const valueType = isPlainObject(opts.default)\n        ? 0\n        : Array.isArray(opts.default)\n          ? 1\n          : isPlainObject(fieldValue)\n            ? 0\n            : Array.isArray(fieldValue)\n              ? 1\n              : 2\n    // 如果不是数组或者{}，则不需要在继承链上进行合并\n    if (opts.merge === 'none' || valueType === 2) {\n        return fieldValue\n    }\n\n    const defaultValue =\n        valueType === 0 ? Object.assign({}, opts.default || {}) : opts.default || []\n\n    const valueList = fieldValue !== undefined ? [fieldValue] : []\n\n    // 依次读取继承链上的所有同名的字段值\n    while (proto) {\n        proto = (proto as any).__proto__\n        if ((proto as any)[fieldName]) {\n            valueList.push((proto as any)[fieldName])\n        } else {\n            break\n        }\n    }\n    // 进行合并\n    let mergedResults = fieldValue\n    if (valueType === 0) {\n        // Object\n        mergedResults = valueList.reduce((result, item) => {\n            if (isPlainObject(item)) {\n                // 只能合并字典\n                return opts.merge === 'merge'\n                    ? Object.assign({}, defaultValue, item, result)\n                    : Object.assign({}, defaultValue, item, result)\n            } else {\n                return result\n            }\n        }, {})\n    } else if (valueType === 1) {\n        // 数组\n        mergedResults = valueList.reduce((result, item) => {\n            if (Array.isArray(item)) {\n                // 只能合并数组\n                result.unshift(...item)\n            } else {\n                result.unshift(item)\n            }\n            return result\n        }, [])\n    } else {\n        mergedResults = valueList[valueList.length - 1] || options?.default\n    }\n    // 删除数组中的重复项\n    if (Array.isArray(mergedResults) && opts.merge === 'uniqueMerge') {\n        mergedResults = Array.from(new Set(mergedResults))\n        // 如果提供defaultValue并且数组成员是一个{},则进行合并\n        if (isPlainObject(defaultValue)) {\n            mergedResults.forEach((value: any, index: number) => {\n                if (isPlainObject(value)) {\n                    mergedResults[index] = Object.assign({}, defaultValue, value)\n                }\n            })\n        }\n    }\n    return mergedResults || (defaultValue as T)\n}\n"]}