{"version":3,"sources":["../src/object/setByPath.ts"],"names":["setByPath","obj","path","value","options","delimiter","infer","onlyUpdateUndefined","keys","current","curPath","update","oldValue","newValue","i","key","index"],"mappings":";;;;AA0FO,SAASA,CAAAA,CAAgDC,EAAQC,CAASC,CAAAA,CAAAA,CAAUC,EAA+B,CAEtH,GAAM,CAAG,SAAA,CAAAC,CAAW,CAAA,KAAA,CAAAC,EAAO,mBAAAC,CAAAA,CAAsB,CAAI,CAAA,MAAA,CAAO,MAAO,CAAA,CAC/D,UAAU,GACV,CAAA,mBAAA,CAAoB,KACpB,CAAA,KAAA,CAAO,KAAK,GAChB,CAAGH,CAAAA,CAAQ,EAKX,GAHI,CAACH,GAAO,OAAOC,CAAAA,EAAS,QAGxB,EAAA,CAACA,CAAM,CAAA,OAAOD,EAElB,IAAMO,CAAAA,CAAON,CAAK,CAAA,KAAA,CAAMG,CAAS,CAAA,CAC7BI,EAAeR,CACbS,CAAAA,CAAAA,CAAmB,EAAC,CAEpBC,CAAS,CAAA,CAACC,EAAaC,CACtBN,GAAAA,CAAAA,CACQK,IAAW,MAAYC,CAAAA,CAAAA,CAAWD,EAElCC,CAIf,CAAA,IAAA,IAASC,CAAE,CAAA,CAAA,CAAEA,CAAEN,CAAAA,CAAAA,CAAK,OAAOM,CAAI,EAAA,CAAA,CAC3B,IAAMC,CAAAA,CAAMP,CAAKM,CAAAA,CAAC,EAElB,GADAJ,CAAAA,CAAQ,IAAKK,CAAAA,CAAG,CACbN,CAAAA,CAAAA,CACC,GAAG,KAAM,CAAA,OAAA,CAAQA,CAAO,CAAE,CAAA,CACtB,IAAMO,CAAQ,CAAA,QAAA,CAASD,CAAK,CAAA,EAAE,CAC9B,CAAA,GAAI,OAAO,KAAMA,CAAAA,CAAG,CAAKC,EAAAA,CAAAA,CAAM,CAAKA,EAAAA,CAAAA,EAAOP,EAAQ,MAC/C,CAAA,MAAM,IAAI,KAAA,CAAM,CAAkCC,+BAAAA,EAAAA,CAAAA,CAAQ,KAAK,GAAG,CAAC,EAAE,CAElEI,CAAAA,CAAAA,GAAIN,EAAK,MAAS,CAAA,CAAA,CACjBC,CAAQO,CAAAA,CAAK,CAAIL,CAAAA,CAAAA,CAAOF,EAAQO,CAAK,CAAA,CAAEb,CAAK,CAAA,CAE5CM,CAAUA,CAAAA,CAAAA,CAAQO,CAAK,EAGnC,CAAA,KAASP,CAAmB,YAAA,GAAA,EAAOA,CAAmB,YAAA,OAAA,CAC9CA,EAAQ,GAAIM,CAAAA,CAAU,EACtBN,CAAUA,CAAAA,CAAAA,CAAQ,IAAIM,CAAU,CAAA,CAEhCN,CAAQ,CAAA,GAAA,CAAIM,CAAYT,CAAAA,CAAAA,CAAMI,CAAO,CAAC,CAAA,CAEnC,OAAOD,CAAAA,EAAY,QAAYM,EAAAA,CAAAA,IAAON,EAC1CK,CAAIN,GAAAA,CAAAA,CAAK,MAAS,CAAA,CAAA,CACjBC,CAAQM,CAAAA,CAAG,EAAIJ,CAAOF,CAAAA,CAAAA,CAAQM,CAAG,CAAEZ,CAAAA,CAAK,EAExCM,CAAUA,CAAAA,CAAAA,CAAQM,CAAG,CAAA,EAGzBN,CAAQM,CAAAA,CAAG,EAAID,CAAIN,GAAAA,CAAAA,CAAK,MAAQ,CAAA,CAAA,CAAIG,CAAOF,CAAAA,CAAAA,CAAQM,CAAG,CAAEZ,CAAAA,CAAK,CAAIG,CAAAA,CAAAA,CAAMI,CAAO,CAAA,CAC9ED,EAAUA,CAAQM,CAAAA,CAAG,CAGzBN,CAAAA,CAAAA,KAAAA,CAAAA,CAAQM,CAAG,CAAA,CAAID,IAAIN,CAAK,CAAA,MAAA,CAAQ,CAAIG,CAAAA,CAAAA,CAAOF,CAAQM,CAAAA,CAAG,EAAEZ,CAAK,CAAA,CAAIG,CAAMI,CAAAA,CAAO,CAC9ED,CAAAA,CAAAA,CAAUA,EAAQM,CAAG,EAE7B,CACA,OAAOd,CAEX","file":"chunk-ZG7YDMZU.mjs","sourcesContent":[" \n\nexport interface SetByPathOptions { \n    delimiter?          : string; // 路径分隔符，默认为 '.'\n    onlyUpdateUndefined?: boolean; // 仅当目标值为undefined时才更新    \n    infer?              : (path:string[]) => any;  // 如果指定的路径不存在，则回调返回一个值目标路径的值\n}\n \n/**\n * \n * 更新对象指定路径的值\n * \n * 1. 如果路径不存在，自动创建，创建的类型是根据infer函数来推断\n *  const obj = {}\n *  默认infer=()=>({}),自动推断为一个对象\n *  setByPath(obj,\"a.b\"，1)  // { a: { b: 1 }}\n * \n *  setByPath(obj,\"a.0\",1,{\n *      infer: (path) => path.startsWith('a') ? [] : {}\n *  })  // { a: [1]}}\n * \n * \n * 2. 路径分隔符默认为 '.'，允许通过delimiter自定义\n * 3. 支持Map、Set、Array\n * 4. 更新数组时\n *  \n *  数组索引只以>=0与<=数组长度。\n * \n *  const obj = { \n *      a: \n *      { b: \n *          { c:  * 1 } \n *      },\n *      x:[1,2,3]\n *  }\n * \n *  setByPath(obj,\"x.1\",0)  // { a: { b: { c: 1 } }, x: [1, 0, 3] }\n *  setByPath(obj,\"x.2\",0)  // { a: { b: { c: 1 } }, x: [1, 0, 0] }\n *  setByPath(obj,\"x.3\",0)  // { a: { b: { c: 1 } }, x: [1, 0, 0，0] }\n *  setByPath(obj,\"x.13\",0)  // 无效，因为无法扩展数组\n * \n *  4. 其他的视为普通对象，自动创建\n * \n *  setByPath(obj,\"m.n.o\",100) // { a: { b: { c: 1 } }, x: [1, 0, 0，0]，m: { n: { o: 100 } } }\n \n * \n\n * \n * \n * @param obj \n * @param path \n * @param value \n * @param options \n */\n\n/**\n\n * 更新对象指定路径的值\n * \n * 1. 如果路径不存在，自动创建，创建的类型是根据infer函数来推断\n * \n * setByPath(obj,\"m.n.o\",100) // { a: { b: { c: 1 } }, x: [1, 0, 0, 0], m: { n: { o: 100 } } }\n * \n * 2. 路径分隔符默认为 '.'，允许通过delimiter自定义\n * 3. 支持Map、Set、Array\n * 4. 更新数组时\n *  \n *  数组索引只以>=0与<=数组长度。\n * \n *  const obj = { \n *      a: \n *      { b: \n *          { c: 1 } \n *      },\n *      x:[1,2,3]\n *  }\n * \n *  setByPath(obj,\"x.1\",0)  // { a: { b: { c: 1 } }, x: [1, 0, 3] }\n *  setByPath(obj,\"x.2\",0)  // { a: { b: { c: 1 } }, x: [1, 0, 0] }\n *  setByPath(obj,\"x.3\",0)  // { a: { b: { c: 1 } }, x: [1, 0, 0, 0] }\n *  setByPath(obj,\"x.13\",0)  // 无效，因为无法扩展数组\n \n *  \n * \n * @param obj \n * @param path \n * @param value \n * @param options \n */\n\nexport function setByPath<P extends string = string,T = object>(obj: T, path: P, value:any,options?: SetByPathOptions): T {\n\n    const {  delimiter, infer, onlyUpdateUndefined   } = Object.assign({\n        delimiter:\".\",\n        onlyUpdateUndefined:false,\n        infer: ()=>({})\n    }, options )\n\n    if (!obj || typeof path !== 'string') {\n        return obj as T;\n    }\n    if (!path) return obj as T;\n\n    const keys = path.split(delimiter);\n    let current: any = obj;\n    const curPath:string[] = []\n\n    const update = (oldValue:any,newValue:any)=>{\n        if(onlyUpdateUndefined){\n            return oldValue===undefined ? newValue : oldValue\n        }else{\n            return newValue\n        }\n    }\n    \n    for (let i=0;i<keys.length;i++){\n        const key = keys[i];\n        curPath.push(key);\n        if(current){\n            if(Array.isArray(current)){          \n                const index = parseInt(key, 10)\n                if( Number.isNaN(key) || index<0 || index>=current.length){\n                    throw new Error(`setByPath: invalid array index ${curPath.join('.')}`);\n                }else{\n                    if(i===keys.length - 1){\n                        current[index] = update(current[index],value)\n                    }else{\n                        current = current[index]\n                    }\n                }\n            }else if(current instanceof Map || current instanceof WeakMap) {\n                if (current.has(key as any)) {\n                    current = current.get(key as any);\n                }else{\n                    current.set(key as any, infer(curPath))\n                }                    \n            } else if (typeof current === 'object' && key in current) {\n                if(i===keys.length - 1){\n                    current[key] = update(current[key],value)\n                }else{\n                    current = current[key]\n                }                    \n            } else {\n                current[key] = i===keys.length -1 ? update(current[key],value) : infer(curPath)\n                current = current[key];\n            }\n        }else{ // 如果当前对象不存在，则创建 \n            current[key] = i===keys.length -1 ? update(current[key],value) : infer(curPath)\n            current = current[key];\n        }  \n    }\n    return obj as T;\n\n}"]}