{"version":3,"sources":["../src/string/replaceVars.ts"],"names":["getInterpVar","value","empty","delimiter","finalValue","isNothing","v","isPlainObject","result","k","canIterable","VAR_MATCHER","replaceVars","text","vars","options","finalVars","opts","assignObject","pre","cur","i","prefix","name","suffix","varValue","isEmpty","isOverflow","isExists"],"mappings":";;;;AAMA,SAASA,CAAAA,CAAyBC,EAAU,CAAC,KAAA,CAAAC,EAAM,SAAAC,CAAAA,CAAAA,CAAU,GAAG,CAA4B,CAAA,CACxF,IAAIC,CAAcH,CAAAA,CAAAA,CAClB,GAAG,CAGC,OAFG,OAAOG,CAAa,EAAA,UAAA,GAAYA,EAAaA,CAAW,CAAA,IAAA,CAAK,KAAKA,CAAU,CAAA,CAAA,CAC5EC,IAAUD,CAAU,CAAA,GAAGA,EAAaF,CAAS,EAAA,EAAA,CAAA,CAC7C,MAAM,OAAQE,CAAAA,CAAU,EAChBA,CAAW,CAAA,GAAA,CAAIE,GAAG,MAAOA,CAAAA,CAAC,CAAC,CAAE,CAAA,IAAA,CAAKH,CAAS,CAC7CI,CAAAA,GAAAA,CAAcH,CAAU,CACtB,CAAA,MAAA,CAAO,QAAQA,CAAgC,CAAA,CAAE,OAAO,CAACI,CAAAA,CAAa,CAACC,CAAEH,CAAAA,CAAC,KAC7EE,CAAO,CAAA,IAAA,CAAK,GAAGC,CAAC,CAAA,CAAA,EAAI,OAAOH,CAAC,CAAC,EAAE,CACxBE,CAAAA,CAAAA,CAAAA,CACT,EAAG,CAAA,CAAE,KAAKL,CAAS,CAAA,CAChBO,IAAYN,CAAU,CAAA,EAAK,OAAOA,CAAe,EAAA,QAAA,CAC/C,CAAC,GAAGA,CAAU,EAAE,GAAIE,CAAAA,CAAAA,EAAG,OAAOA,CAAC,CAAC,EAAE,IAAKH,CAAAA,CAAS,EAClDC,CAAsB,YAAA,KAAA,CACpBA,EAAW,OAEX,CAAA,MAAA,CAAOA,CAAU,CAEhC,CAAA,KAAM,CACF,OAAO,MAAA,CAAOA,CAAU,CAC5B,CACJ,CAiBA,IAAMO,CAAAA,CAAc,4DAmBb,SAASC,CAAAA,CAAYC,IAAYC,CAASC,CAAAA,CAAAA,CAAoC,CACjF,IAAIC,CAAAA,CACEC,EAAMC,CAAa,CAAA,CACrB,MAAM,IACN,CAAA,SAAA,CAAU,IACV,OAAQ,CAAA,IACZ,EAAEH,CAAO,CAAA,CAEN,OAAOD,CAAO,EAAA,UAAA,GAAYA,EAAOA,CAAK,CAAA,IAAA,CAAKD,GAAI,CAG/C,CAAA,CAAA,KAAA,CAAM,QAAQC,CAAI,CAAA,EAAKA,EAAK,MAAQ,EAAA,CAAA,GAAMP,IAAcO,CAAK,CAAA,CAAC,CAAC,CAAK,EAAA,KAAA,CAAM,QAAQA,CAAK,CAAA,CAAC,CAAC,CACxFA,CAAAA,GAAAA,CAAAA,CAAOA,EAAK,CAAC,CAAA,CAAA,CAEd,CAAC,SAAU,CAAA,QAAA,CAAS,QAAQ,CAAE,CAAA,QAAA,CAAS,OAAOA,CAAK,CAAA,CAClDE,EAAW,CAACF,CAAI,EACXA,CAAgB,YAAA,GAAA,CACrBE,EAAY,CAAC,GAAGF,EAAK,OAAQ,EAAC,EAAE,MAAO,CAAA,CAACK,EAAuBC,CAAOD,IAAAA,CAAAA,CAAIC,EAAI,CAAC,CAAC,EAAEA,CAAI,CAAA,CAAC,EAASD,CAAK,CAAA,CAAA,EAAE,CAClG,CAAA,MAAA,CAAO,YAAYL,CACxBE,CAAAA,CAAAA,CAAY,CAAC,GAAGF,CAAI,EACfP,GAAcO,CAAAA,CAAI,EACvBE,CAAYF,CAAAA,CAAAA,CACPA,aAAgB,KACrBE,CAAAA,CAAAA,CAAY,CAAC,CAASF,MAAAA,EAAAA,CAAAA,CAAK,OAAO,CAAE,CAAA,CAAA,CAEpCE,EAAW,CAAEF,CAAK,EAEtB,IAAIO,CAAAA,CAAW,EACf,OAAQR,GAAAA,CAAa,WAAWF,CAAa,CAAA,UAAiB,CAC1D,IAAIW,CAAAA,CAAS,UAAU,CAAC,CAAA,EAAK,GACzBC,CAAO,CAAA,SAAA,CAAU,CAAC,CAAK,EAAA,EAAA,CACvBC,EAAS,SAAU,CAAA,CAAC,GAAK,EACzBC,CAAAA,CAAAA,CAAkB,GAAGC,CAAgB,CAAA,KAAA,CACzC,GAAG,KAAM,CAAA,OAAA,CAAQV,CAAS,CAAE,CAAA,CACxB,IAAMW,CAAaN,CAAAA,CAAAA,EAAML,EAAiB,MAC1CS,CAAAA,CAAAA,CAAWE,EAAa,EAAK3B,CAAAA,CAAAA,CAAa,KAAKa,GAAMG,CAAAA,CAAAA,CAAkBK,CAAC,CAAEJ,CAAAA,CAAI,EAC9ES,CAASrB,CAAAA,GAAAA,CAAUoB,CAAQ,CAAKE,EAAAA,CAAAA,CAChCN,IACJ,CAASd,KAAAA,GAAAA,GAAAA,CAAcS,CAAS,CAAE,CAAA,CAC9B,IAAMY,CAAWL,CAAAA,CAAAA,IAASP,EAC1BS,CAAUG,CAAAA,CAAAA,CAAW5B,EAAa,IAAKa,CAAAA,GAAAA,CAAMG,EAAkBO,CAAI,CAAA,CAAEN,CAAI,CAAI,CAAA,EAAA,CAC7ES,EAASrB,GAAUoB,CAAAA,CAAQ,GAAK,CAACG,EACrC,CAEA,GAAG,OAAOX,EAAK,OAAU,EAAA,UAAA,CAAW,CAChC,IAAM,CAAA,CAAIA,EAAK,OAAQM,CAAAA,CAAAA,CAAKE,EAASH,CAAOE,CAAAA,CAAM,EAC/C,CAAI,GAAA,MAAA,GACA,MAAM,OAAQ,CAAA,CAAC,GAAK,CAAE,CAAA,MAAA,EAAQ,GAC7BF,CAAO,CAAA,CAAA,CAAE,CAAC,CACVG,CAAAA,CAAAA,CAAW,EAAE,CAAC,CAAA,CACdD,EAAO,CAAE,CAAA,CAAC,GACJnB,GAAU,CAAA,CAAC,IACjBoB,CAAW,CAAA,MAAA,CAAO,CAAC,CAEvBC,CAAAA,CAAAA,CAAAA,CAASrB,IAAUoB,CAAQ,CAAA,EAEnC,CAEA,OAAGC,CAAAA,GACIT,EAAK,KAAO,EAAA,IAAA,EACXQ,EAAS,EAAGH,CAAAA,CAAAA,CAAO,GAAGE,CAAO,CAAA,EAAA,EAE7BC,EAAWR,CAAK,CAAA,KAAA,CAAA,CAGjB,GAAGK,CAAM,CAAA,EAAGG,CAAQ,CAAGD,EAAAA,CAAM,CACxC,CAAA,CAAC,CAGL","file":"chunk-AWHZT676.mjs","sourcesContent":["import { assignObject } from \"../object/assignObject\";\r\nimport { canIterable } from \"../typecheck\";\r\nimport { isNothing } from \"../typecheck/isNothing\";\r\nimport { isPlainObject } from \"../typecheck/isPlainObject\";   \r\nimport \"./replaceAll\"\r\n\r\nfunction getInterpVar(this:string,value:any,{empty,delimiter=\",\"}:ReplaceVarsOptions):string{\r\n    let finalValue  = value\r\n    try{\r\n        if(typeof(finalValue)==\"function\") finalValue = finalValue.call(this,finalValue)\r\n        if(isNothing(finalValue)) finalValue = empty || ''\r\n        if(Array.isArray(finalValue)){\r\n            return finalValue.map(v=>String(v)).join(delimiter)\r\n        }else if(isPlainObject(finalValue)){             \r\n            return Object.entries(finalValue as Record<string,any>).reduce((result:any[],[k,v]:[string,any]) =>{\r\n                result.push(`${k}=${String(v)}`)\r\n                return result\r\n            },[] ).join(delimiter)\r\n        }else if(canIterable(finalValue) && typeof(finalValue) != 'string'){\r\n            return [...finalValue].map(v=>String(v)).join(delimiter)\r\n        }else if(finalValue instanceof Error){\r\n            return finalValue.message\r\n        }else{\r\n            return String(finalValue)\r\n        }        \r\n    }catch{\r\n        return String(finalValue)\r\n    }\r\n}\r\n \r\n// const VAR_MATCHER = /\\{(?<prefix>[^a-zA-Z0-9_\\{\\}\\u4E00-\\u9FA5A]*)(?<name>[\\u4E00-\\u9FA5A\\w]*)(?<suffix>[^a-zA-Z0-9_\\{\\}\\u4E00-\\u9FA5A]*?)\\}/g\r\n\r\n// V1 const VAR_MATCHER=/\\{(?<prefix>[^a-zA-Z0-9_\\{\\}\\u4E00-\\u9FA5A]*[\\u4E00-\\u9FA5A\\w]*?[^a-zA-Z0-9_\\{\\}\\u4E00-\\u9FA5A]*)(?<name>[\\u4E00-\\u9FA5A\\w]*)(?<suffix>[^a-zA-Z0-9_\\{\\}\\u4E00-\\u9FA5A]*?[\\u4E00-\\u9FA5A\\w]*?[^a-zA-Z0-9_\\{\\}\\u4E00-\\u9FA5A]*)\\}/gm\r\n\r\n// V2 const VAR_MATCHER = /\\{(?<prefix>[^a-zA-Z0-9_\\{\\}\\u4E00-\\u9FA5A]*?[\\u4E00-\\u9FA5A\\w]*?[^a-zA-Z0-9_\\{\\}\\u4E00-\\u9FA5A]+)?(?<name>[\\u4E00-\\u9FA5A\\w]*?)(?<suffix>[^a-zA-Z0-9_\\{\\}\\u4E00-\\u9FA5A]+[\\u4E00-\\u9FA5A\\w]*?[^a-zA-Z0-9_\\{\\}\\u4E00-\\u9FA5A]*?)?\\}/gm\r\n\r\n// V3 使用<>包装前后缀，其中包含prefix,name,suffix三个命名捕获组\r\n//const VAR_MATCHER = /\\{(\\<(?<prefix>.*?)\\>)?\\s*(?<name>[\\u4E00-\\u9FA5A\\w]*)\\s*(\\<(?<suffix>.*?)\\>)?\\}/gm\r\n\r\n// V4 由于在react-native中不支持命名捕获组，会导致出错，所以移除命名捕获组\r\n//const VAR_MATCHER = /\\{(\\<(.*?)\\>)?\\s*([\\u4E00-\\u9FA5A\\w]*)\\s*(\\<(.*?)\\>)?\\}/gm\r\n// V4不支持{ a b }{ a/b/c } 这种形式\r\n\r\n\r\n// V5  变量名更加宽泛约束，支持除<,>,{,}外的字符\r\nconst VAR_MATCHER = /\\{(\\<(.*?)\\>)?\\s*([^\\{\\}\\>\\<]*)(?<!\\s)\\s*(\\<(.*?)\\>)?\\}/gm\r\n\r\nexport type VarReplacer = (name:string,prefix:string,suffix:string,matched:string) => string\r\n\r\n// forEach方法的返回值类型\r\nexport type ForEachReturnType = [string,string,string ] | string | void | null | undefined\r\n/**\r\n *   empty:  当插值变量为空(undefined|null)时的替代值，默认''，如果empty=null则整个变量均不显示包括前后缀字符\r\n *   delimiter: 当变量是数组或对象时使用delimiter进行连接\r\n *   forEach: 遍历所有插值变量\r\n */\r\nexport interface ReplaceVarsOptions{\r\n    empty?:string | null\r\n    default?:string                 // 如果变量不存在时的默认值\r\n    delimiter?:string\r\n    // 遍历所有插值变量的回调函数，必须返回[prefix,value,suffix]或value\r\n    forEach?:(name:string,value:string,prefix:string,suffix:string)=>ForEachReturnType\r\n}\r\n\r\nexport function replaceVars(text:string,vars:any,options?:ReplaceVarsOptions):string {\r\n    let finalVars:any[] | Map<string,any> | Record<string,any>\r\n    const opts =assignObject({\r\n        empty:null,\r\n        delimiter:\",\",               // 当变量是数组或对象是转换成字符串时的分割符号\r\n        forEach:null\r\n    },options)  as ReplaceVarsOptions\r\n    \r\n    if(typeof(vars)=='function') vars = vars.call(text)\r\n    // 如果vars是数组且长度为1且是对象或数组，则直接使用该对象或数组作为vars\r\n    // replaceVars(\"hello {name}\",[()=>{name:\"world\"}]) => replaceVars(\"hello {name}\",{name:\"world\"})\r\n    if(Array.isArray(vars) && vars.length==1 && (isPlainObject(vars[0]) || Array.isArray(vars[0]))) {\r\n        vars = vars[0]\r\n    }\r\n    if([\"boolean\",\"string\",\"number\"].includes(typeof(vars))){\r\n        finalVars= [vars]\r\n    }else if(vars instanceof Map){\r\n        finalVars = [...vars.entries()].reduce((pre:Record<string,any>,cur)=>{pre[cur[0]]=cur[1];return pre},{})\r\n    }else if(Symbol.iterator in vars){\r\n        finalVars = [...vars]\r\n    }else if(isPlainObject(vars)){\r\n        finalVars = vars\r\n    }else if(vars instanceof Error){\r\n        finalVars = [`Error:${vars.message}`]\r\n    }else{\r\n        finalVars =[ vars ]\r\n    } \r\n    let i:number = 0\r\n    return (text as any).replaceAll(VAR_MATCHER, function():string{\r\n        let prefix = arguments[2] || ''\r\n        let name = arguments[3] || ''\r\n        let suffix = arguments[5] || ''\r\n        let varValue:string = '',isEmpty:boolean=false\r\n        if(Array.isArray(finalVars)){           // 位置插值            \r\n            const isOverflow = i >= (finalVars as []).length\r\n            varValue = isOverflow ? '' : getInterpVar.call(text,(finalVars as any)[i],opts)  \r\n            isEmpty= isNothing(varValue) || isOverflow\r\n            i++\r\n        }else if(isPlainObject(finalVars)){         // 字典插值\r\n            const isExists = name in (finalVars as {})\r\n            varValue =isExists ? getInterpVar.call(text,(finalVars as any)[name],opts) : ''\r\n            isEmpty= isNothing(varValue) || !isExists\r\n        }\r\n        // 如果指定了forEach则调用，并且使用返回值作为插值变量的值\r\n        if(typeof(opts.forEach)=='function'){\r\n            const r = opts.forEach(name,varValue,prefix,suffix)        \r\n            if(r!==undefined){\r\n                if(Array.isArray(r) && r.length==3){                            \r\n                    prefix=r[0]\r\n                    varValue = r[1]\r\n                    suffix=r[2]\r\n                }else if(!isNothing(r)){\r\n                    varValue = String(r)\r\n                }\r\n                isEmpty= isNothing(varValue)\r\n            }    \r\n        }\r\n        // 为空时使用empty替换\r\n        if(isEmpty){\r\n            if(opts.empty==null){\r\n                varValue='';prefix='';suffix='';\r\n            }else{\r\n                varValue = opts.empty\r\n            }\r\n        }          \r\n        return `${prefix}${varValue}${suffix}`\r\n    }) \r\n\r\n\r\n}\r\n  \r\n\r\n\r\n// if(Array.isArray(finalVars)){           // 位置插值\r\n//     let i:number = 0\r\n//     const useVars = finalVars as any[]\r\n//     // replaceAll在低版本ES中不存在，上面已经加了shim，这需要加any类型才不会报错\r\n//     return (text as any).replaceAll(VAR_MATCHER, function():string{\r\n//         let prefix = arguments[2] || ''\r\n//         let name = arguments[3] || ''\r\n//         let suffix = arguments[5] || ''\r\n//         if(i<useVars.length){\r\n//             // 如果empty==null,且变量值为空，则不显示\r\n//             if(opts.empty==null && isNothing(useVars[i])){\r\n//                 return ''\r\n//             }else{\r\n//                 let value =  getInterpVar.call(text,useVars[i++],opts)\r\n//                 // 如果指定了forEach则调用\r\n//                 if(typeof(opts.forEach)=='function'){\r\n//                     const r = opts.forEach(name,value,prefix,suffix)\r\n//                     if(Array.isArray(r) && r.length==3){                            \r\n//                         prefix=r[0]\r\n//                         value = r[1]\r\n//                         suffix=r[2]\r\n//                     }\r\n//                 }\r\n//                 return `${prefix}${value}${suffix}`\r\n                \r\n//             }                \r\n//         }else{ // 没有对应的变量时使用空值替换\r\n//             return opts.empty==null ? '': `${prefix}${opts.empty}${suffix}`\r\n//         }            \r\n//     }) \r\n// }else if(isPlainObject(finalVars)){         // 字典插值\r\n//     const useVars = finalVars as Record<string,any>\r\n//     return (text as any).replaceAll(VAR_MATCHER, function():string{\r\n//         //let {prefix='',name='',suffix=''} = arguments[arguments.length-1] \r\n//         let prefix = arguments[2] || ''\r\n//         let name = arguments[3] || ''\r\n//         let suffix = arguments[5] || ''\r\n//         if(name in finalVars){\r\n//             let value =  getInterpVar.call(text,useVars[name],opts)\r\n//             if(opts.empty==null && isNothing(useVars[name])){\r\n//                 return ''\r\n//             }else{\r\n//                 // 如果指定了callback则调用\r\n//                 if(typeof(opts.forEach)=='function'){\r\n//                     const r = opts.forEach(name,value,prefix,suffix)\r\n//                     if(Array.isArray(r) && r.length==3){                            \r\n//                         prefix=r[0]\r\n//                         value = r[1]\r\n//                         suffix=r[2]\r\n//                     }\r\n//                 }\r\n//                 return `${prefix}${value}${suffix}`\r\n//             }                \r\n//         }else{\r\n//             return opts.empty==null ? '': `${prefix}${opts.empty}${suffix}`\r\n//         }\r\n//     }) \r\n// }else{\r\n//     return text\r\n// }    "]}