diff --git a/lib/commons/record-util.d.ts b/lib/commons/record-util.d.ts index 5bf9914..bdb244b 100644 --- a/lib/commons/record-util.d.ts +++ b/lib/commons/record-util.d.ts @@ -30,4 +30,4 @@ export declare function assignRecords>(...arrays: * @param sources 来源对象参数 * @returns 目标对象 */ -export declare const extend: >(target: T, ...sources: (T | undefined)[]) => T; +export declare const extendRecord: >(target: T, ...sources: (T | undefined)[]) => T; diff --git a/lib/index.d.ts b/lib/index.d.ts index 10fe937..9e1c109 100644 --- a/lib/index.d.ts +++ b/lib/index.d.ts @@ -1,5 +1,5 @@ -import { withRecord, assignRecords, RecordClearMode } from "./commons/record-util"; +import { withRecord, assignRecords, RecordClearMode, extendRecord } from "./commons/record-util"; import { stringTokenizer, equalsIgnoreCase, includeIgnoreCase, strLength, strMonospacePad } from "./commons/str-utils"; import { getFileExt, getFileFullName, getFileNameWithoutExt, getFileInfo } from "./commons/file-util"; import { Optional } from "./commons/optional"; -export { Optional, RecordClearMode, assignRecords, equalsIgnoreCase, getFileExt, getFileFullName as getFileName, getFileInfo, getFileNameWithoutExt, includeIgnoreCase, strLength, strMonospacePad, stringTokenizer, withRecord, }; +export { Optional, RecordClearMode, assignRecords, equalsIgnoreCase, extendRecord, getFileExt, getFileFullName as getFileName, getFileInfo, getFileNameWithoutExt, includeIgnoreCase, strLength, strMonospacePad, stringTokenizer, withRecord, }; diff --git a/lib/index.es.js b/lib/index.es.js index 52b370d..3284103 100644 --- a/lib/index.es.js +++ b/lib/index.es.js @@ -1,5 +1,5 @@ var h = /* @__PURE__ */ ((e) => (e[e.delete = 2] = "delete", e[e.reset = 1] = "reset", e))(h || {}); -const m = (e) => ({ +const p = (e) => ({ clear: function(t = 2) { t === 1 ? Object.keys(e).forEach((n) => { e[n] = void 0; @@ -14,49 +14,56 @@ const m = (e) => ({ ), Object.assign(e, t); } }); -function p(...e) { +function m(...e) { let t = e ?? []; return { test: function(n) { if (t.length <= 1) return t.length === 1 ? t[0] : []; - let s = n ?? function(r, i) { - return r === i; + let r = n ?? function(s, i) { + return s === i; }; - return t.reduce((r, i) => (i && i.length > 0 && (r.length === 0 ? r.push(...i) : i.forEach((f) => { - r.some((u) => s(u, f)) || r.push(f); - })), r), []); + return t.reduce((s, i) => (i && i.length > 0 && (s.length === 0 ? s.push(...i) : i.forEach((f) => { + s.some((o) => r(o, f)) || s.push(f); + })), s), []); }, path: function(...n) { - return this.test((s, r) => n.every((i) => s[i] === r[i])); + return this.test((r, s) => n.every((i) => r[i] === s[i])); } }; } +const O = (e, ...t) => { + for (const n of t) + if (n !== void 0) + for (const r in n) + n.hasOwnProperty(r) && n[r] != null && (e[r] = n[r]); + return e; +}; function I(e, t, n) { - const s = t, r = n || t; + const r = t, s = n || t; return function(i) { - const f = [], l = i.matchAll(e); - let u = 0; - for (const o of l) { - const g = i.slice(u, o.index); - g && f.push(r(g, !1)), f.push(s(o[0], !0)), u = o.index + o[0].length; + const f = [], u = i.matchAll(e); + let o = 0; + for (const l of u) { + const g = i.slice(o, l.index); + g && f.push(s(g, !1)), f.push(r(l[0], !0)), o = l.index + l[0].length; } - return u < i.length && f.push(r(i.slice(u), !1)), f; + return o < i.length && f.push(s(i.slice(o), !1)), f; }; } function a(e, t) { return typeof e == "string" && typeof t == "string" ? e.toLowerCase() === t.toLowerCase() : e === void 0 && t === void 0; } -const O = (e, t) => { +const E = (e, t) => { for (let n = 0; n < e.length; n++) { - let s = e[n]; - if (a(s, t)) + let r = e[n]; + if (a(r, t)) return !0; } return !1; -}, d = (e) => e.replaceAll(/[\u4e00-\u9fa5]/g, "--").length, E = (e, t, n = " ") => { - const s = t - (d(e) - e.length); - return e.padEnd(s, n); +}, d = (e) => e.replaceAll(/[\u4e00-\u9fa5]/g, "--").length, y = (e, t, n = " ") => { + const r = t - (d(e) - e.length); + return e.padEnd(r, n); }; function b(e) { const t = e.lastIndexOf("."); @@ -66,22 +73,22 @@ function x(e) { let t = e.lastIndexOf("/"); return t === -1 && (t = e.lastIndexOf("\\"), t === -1) ? e : e.substring(t + 1); } -function y(e) { +function N(e) { const t = x(e), n = t.lastIndexOf("."); return n === -1 ? t : t.substring(0, n); } -function N(e, t = "win32") { +function w(e, t = "win32") { const n = t === "win32" ? "\\" : "/"; - let s, r, i, f; - const l = e.lastIndexOf(n); - l === -1 ? (s = "", r = e) : (s = e.substring(0, l + 1), r = e.substring(l + 1)); - const u = r.lastIndexOf("."); - return u === -1 ? (i = "", f = r) : (i = r.substring(u + 1), f = r.substring(0, u)), { - fileName: r, + let r, s, i, f; + const u = e.lastIndexOf(n); + u === -1 ? (r = "", s = e) : (r = e.substring(0, u + 1), s = e.substring(u + 1)); + const o = s.lastIndexOf("."); + return o === -1 ? (i = "", f = s) : (i = s.substring(o + 1), f = s.substring(0, o)), { + fileName: s, fileNameNoExt: f, fileExtName: i, fullPath: e, - pathOnly: s + pathOnly: r }; } const c = { @@ -100,8 +107,8 @@ const c = { orElse(n) { return t(e) ? n : e; }, - then(n, s) { - t(e) ? s && s() : n(e); + then(n, r) { + t(e) ? r && r() : n(e); }, ifPresent(n) { e != null && n(e); @@ -124,16 +131,17 @@ const c = { export { c as Optional, h as RecordClearMode, - p as assignRecords, + m as assignRecords, a as equalsIgnoreCase, + O as extendRecord, b as getFileExt, - N as getFileInfo, + w as getFileInfo, x as getFileName, - y as getFileNameWithoutExt, - O as includeIgnoreCase, + N as getFileNameWithoutExt, + E as includeIgnoreCase, d as strLength, - E as strMonospacePad, + y as strMonospacePad, I as stringTokenizer, - m as withRecord + p as withRecord }; //# sourceMappingURL=index.es.js.map diff --git a/lib/index.es.js.map b/lib/index.es.js.map index 186f4ac..6a0ba12 100644 --- a/lib/index.es.js.map +++ b/lib/index.es.js.map @@ -1 +1 @@ -{"version":3,"file":"index.es.js","sources":["../src/commons/record-util.ts","../src/commons/str-utils.ts","../src/commons/file-util.ts","../src/commons/optional.ts"],"sourcesContent":["import { UnwrapNestedRefs } from \"vue\";\r\nexport enum RecordClearMode {\r\n delete = 2,\r\n reset = 1,\r\n}\r\nexport const withRecord = (obj: UnwrapNestedRefs>) => {\r\n return {\r\n clear: function (mode: RecordClearMode = RecordClearMode.delete) {\r\n if (mode === RecordClearMode.reset) {\r\n Object.keys(obj).forEach((key) => {\r\n obj[key] = undefined;\r\n });\r\n } else if (mode === RecordClearMode.delete) {\r\n Object.keys(obj).forEach((key) => {\r\n delete obj[key];\r\n });\r\n }\r\n },\r\n replace: function (newVal: UnwrapNestedRefs>) {\r\n this.clear(RecordClearMode.delete);\r\n Object.assign(obj, newVal);\r\n },\r\n };\r\n};\r\n\r\n/**\r\n * 这是一个泛型函数,接受任意个数的数组作为参数,并返回一个对象。\r\n * 该对象包含两个方法:test 和 path。\r\n * test 方法用于测试所有数组的元素是否相等,\r\n * path 方法用于测试所有数组的指定路径的值是否相等。\r\n\r\n * @param arrays \r\n * @returns \r\n */\r\nexport function assignRecords>(...arrays: T[][]) {\r\n let _arrays = arrays ?? [];\r\n\r\n return {\r\n test: function (equal?: (l: T, r: T) => boolean) {\r\n if (_arrays.length <= 1) {\r\n return _arrays.length === 1 ? _arrays[0] : [];\r\n }\r\n\r\n let localEqual =\r\n equal ??\r\n function (ll: T, rr: T) {\r\n return ll === rr;\r\n };\r\n return _arrays.reduce((acc, crt) => {\r\n if (crt && crt.length > 0) {\r\n if (acc.length === 0) {\r\n acc.push(...crt);\r\n } else {\r\n crt.forEach((c) => {\r\n const some = acc.some((a) => localEqual(a, c));\r\n if (!some) {\r\n acc.push(c);\r\n }\r\n });\r\n }\r\n }\r\n return acc;\r\n }, []);\r\n },\r\n path: function (...paths: string[]) {\r\n return this.test((l, r) => {\r\n return paths.every((path) => {\r\n return l[path] === r[path];\r\n });\r\n });\r\n },\r\n };\r\n}\r\n\r\n/**\r\n *\r\n * 接受一个目标对象和多个源对象作为参数,并返回合并后的对象。\r\n * 它会将源对象的属性复制到目标对象中,\r\n * 如果多个源对象有同名属性,\r\n * 则最后的属性值将覆盖前面的属性值。\r\n * @param target 目标对象\r\n * @param sources 来源对象参数\r\n * @returns 目标对象\r\n */\r\nexport const extend = >(\r\n // 目标对象\r\n target: T,\r\n // 其他对象参数\r\n ...sources: (T | undefined)[]\r\n): T => {\r\n // 遍历其他对象参数\r\n for (const source of sources) {\r\n if (source !== undefined) {\r\n // 遍历参数对象的属性\r\n for (const key in source) {\r\n // 判断属性存在于参数对象中且值不为 null\r\n if (source.hasOwnProperty(key) && source[key] != null) {\r\n // 将属性赋值给目标对象\r\n target[key] = source[key];\r\n }\r\n }\r\n }\r\n }\r\n // 返回目标对象\r\n return target;\r\n};\r\n","/**\r\n * 生成给定函数体的函数注释。\r\n *\r\n * @param {RegExp} regExp - 用于匹配的正则表达式。\r\n * @param {(text: string, match: boolean) => T} matchHandler - 处理匹配到的文本的函数。\r\n * @param {(text: string, match: boolean) => T} [textHandler] - 处理未匹配到的文本的函数。\r\n * @return {(str: string) => T[]} - 分词器函数。\r\n */\r\nexport function stringTokenizer(\r\n regExp: RegExp,\r\n matchHandler: (text: string, match: boolean) => T,\r\n textHandler?: (text: string, match: boolean) => T\r\n): (str: string) => T[] {\r\n\r\n const ifMatch = matchHandler;\r\n const ifText = textHandler?textHandler: matchHandler;\r\n\r\n return function (str: string) {\r\n const result: T[] = [];\r\n const matches = str.matchAll(regExp);\r\n let index = 0;\r\n for (const match of matches) {\r\n const before = str.slice(index, match.index);\r\n if (before) {\r\n result.push(ifText(before, false));\r\n }\r\n result.push(ifMatch(match[0], true));\r\n index = match.index! + match[0].length;\r\n }\r\n if (index < str.length) {\r\n result.push(ifText(str.slice(index), false));\r\n }\r\n return result;\r\n };\r\n}\r\n\r\n/**\r\n * 该函数接受两个参数,判断它们是否相等,不区分大小写。\r\n * 如果参数都是字符串类型,则将它们转换为小写后比较。\r\n * 如果两个参数都是undefined,则返回true,\r\n * 否则返回false。\r\n * @param source\r\n * @param target\r\n * @returns\r\n */\r\nexport function equalsIgnoreCase(\r\n source: string | undefined,\r\n target: string | undefined\r\n) {\r\n if (typeof source === \"string\" && typeof target === \"string\") {\r\n return source.toLowerCase() === target.toLowerCase();\r\n } else if (source === undefined && target === undefined) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * 这个函数接受一个字符串数组和一个字符串作为参数,\r\n * 在数组中判断是否存在与搜索字符串相同或相似的字符串,忽略大小写。\r\n * 如果找到匹配项则返回true,否则返回false。\r\n * @param list 字符串数组\r\n * @param search 用来搜索的字符串\r\n * @returns 是否包含\r\n */\r\nexport const includeIgnoreCase = (list: string[], search: string) => {\r\n for (let i = 0; i < list.length; i++) {\r\n let item = list[i];\r\n if (equalsIgnoreCase(item, search)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\nexport const strLength = (str: string) => {\r\n return str.replaceAll(/[\\u4e00-\\u9fa5]/g, \"--\").length;\r\n};\r\n\r\nexport const strMonospacePad = (\r\n str: string,\r\n length: number,\r\n pad: string = \" \"\r\n) => {\r\n const visibleLength = length - (strLength(str) - str.length);\r\n return str.padEnd(visibleLength, pad);\r\n};\r\n","/**\r\n * 获取文件的后缀名\r\n * @param fileName 文件名\r\n * @returns 文件后缀名\r\n */\r\nexport function getFileExt(fileName: string): string {\r\n const index = fileName.lastIndexOf(\".\");\r\n if (index === -1) {\r\n return \"\";\r\n }\r\n return fileName.substring(index + 1);\r\n}\r\n\r\n/**\r\n * 获取文件全名(包含扩展名)\r\n * 该函数接收一个表示文件路径的字符串作为参数,返回该路径中文件名部分。\r\n * 首先查找路径中最后一个斜杠或反斜杠的索引,若未找到则直接返回路径;\r\n * 若找到,则使用substring方法提取最后一个斜杠或反斜杠后面的字符串作为文件名并返回。\r\n * @param path 文件路径\r\n * @returns 文件全名(包含扩展名)\r\n */\r\nexport function getFileFullName(path: string): string {\r\n let index = path.lastIndexOf(\"/\");\r\n if (index === -1) {\r\n index = path.lastIndexOf(\"\\\\\");\r\n if (index === -1) {\r\n return path;\r\n }\r\n }\r\n return path.substring(index + 1);\r\n}\r\n\r\n/**\r\n * 获取文件名不包含扩展名\r\n */\r\nexport function getFileNameWithoutExt(path: string): string {\r\n const fileName = getFileFullName(path);\r\n const index = fileName.lastIndexOf(\".\");\r\n if (index === -1) {\r\n return fileName;\r\n }\r\n return fileName.substring(0, index);\r\n}\r\n\r\n/**\r\n * 文件信息\r\n */\r\nexport interface IFileInfo {\r\n /** 文件名(包含扩展名) */\r\n fileName: string;\r\n /**\r\n * 文件名不带扩展名\r\n */\r\n fileNameNoExt: string;\r\n /** 文件扩展名 */\r\n fileExtName: string;\r\n /** 路径仅包含文件夹 */\r\n pathOnly: string;\r\n /** 完整路径 */\r\n fullPath: string;\r\n}\r\n\r\n/**\r\n * 获取文件信息\r\n * @param path 文件路径\r\n * @param platform 平台名称,默认为\"win32\"\r\n * @returns 包含文件名、文件名不带扩展名、文件扩展名、路径仅包含文件夹、完整路径的对象\r\n */\r\nexport function getFileInfo(\r\n path: string,\r\n platform: string = \"win32\"\r\n): IFileInfo {\r\n const pathSaprator = platform === \"win32\" ? \"\\\\\" : \"/\";\r\n\r\n let pathOnly: string;\r\n\r\n let fileName: string;\r\n let fileExtName: string;\r\n let fileNameNoExt: string;\r\n const pathIndex = path.lastIndexOf(pathSaprator);\r\n if (pathIndex === -1) {\r\n pathOnly = \"\";\r\n fileName = path;\r\n } else {\r\n pathOnly = path.substring(0, pathIndex + 1);\r\n fileName = path.substring(pathIndex + 1);\r\n }\r\n\r\n const extIndex = fileName.lastIndexOf(\".\");\r\n if (extIndex === -1) {\r\n fileExtName = \"\";\r\n fileNameNoExt = fileName;\r\n } else {\r\n fileExtName = fileName.substring(extIndex + 1);\r\n fileNameNoExt = fileName.substring(0, extIndex);\r\n }\r\n\r\n return {\r\n fileName,\r\n fileNameNoExt,\r\n fileExtName,\r\n fullPath: path,\r\n pathOnly,\r\n };\r\n}\r\n","/*\r\n * Copyright 2015,2016 DevCon5 GmbH, info@devcon5.io\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n *\r\n */\r\n\r\n/**\r\n * Optional monad for Javascript | Typescript.\r\n */\r\nexport const Optional = {\r\n /**\r\n * Creates an optional of the specified value. The value may be undefined or null.\r\n * @return OptionalInstance\r\n */\r\n of(value: T) {\r\n function notPresent(value: any): value is null {\r\n return value == null;\r\n }\r\n\r\n return {\r\n get() {\r\n return value;\r\n },\r\n orElse(elseValue: NonNullable): NonNullable {\r\n if (notPresent(value)) {\r\n return elseValue;\r\n }\r\n return value as NonNullable;\r\n },\r\n then(\r\n presentFunction: (value: T) => void,\r\n notPresentFunction?: () => void\r\n ) {\r\n if (!notPresent(value)) {\r\n presentFunction(value);\r\n } else if (notPresentFunction) {\r\n notPresentFunction();\r\n }\r\n },\r\n ifPresent(func: (val: NonNullable) => R) {\r\n if (value != null) {\r\n func(value);\r\n }\r\n },\r\n isPresent() {\r\n return !notPresent(value);\r\n },\r\n filter(filterFunction: (value: T) => boolean) {\r\n if (notPresent(value) || filterFunction(value)) {\r\n return this;\r\n } else {\r\n return Optional.of(undefined);\r\n }\r\n },\r\n map(mapperFunction: (value: NonNullable) => R) {\r\n if (value == null) {\r\n return Optional.of(undefined);\r\n } else {\r\n return Optional.of(mapperFunction(value));\r\n }\r\n },\r\n flatMap(mapperFunction: (value: T) => R) {\r\n return mapperFunction(value);\r\n },\r\n };\r\n },\r\n};\r\n\r\nexport default Optional;\r\n"],"names":["RecordClearMode","withRecord","obj","mode","key","newVal","assignRecords","arrays","_arrays","equal","localEqual","ll","rr","acc","crt","c","a","paths","l","path","stringTokenizer","regExp","matchHandler","textHandler","ifMatch","ifText","str","result","matches","index","match","before","equalsIgnoreCase","source","target","includeIgnoreCase","list","search","i","item","strLength","strMonospacePad","length","pad","visibleLength","getFileExt","fileName","getFileFullName","getFileNameWithoutExt","getFileInfo","platform","pathSaprator","pathOnly","fileExtName","fileNameNoExt","pathIndex","extIndex","Optional","value","notPresent","elseValue","presentFunction","notPresentFunction","func","filterFunction","mapperFunction"],"mappings":"AACY,IAAAA,sBAAAA,OACVA,EAAAA,EAAA,SAAS,CAAT,IAAA,UACAA,EAAAA,EAAA,QAAQ,CAAR,IAAA,SAFUA,IAAAA,KAAA,CAAA,CAAA;AAIC,MAAAC,IAAa,CAACC,OAClB;AAAA,EACL,OAAO,SAAUC,IAAwB,GAAwB;AAC/D,IAAIA,MAAS,IACX,OAAO,KAAKD,CAAG,EAAE,QAAQ,CAACE,MAAQ;AAChC,MAAAF,EAAIE,CAAG,IAAI;AAAA,IAAA,CACZ,IACQD,MAAS,KAClB,OAAO,KAAKD,CAAG,EAAE,QAAQ,CAACE,MAAQ;AAChC,aAAOF,EAAIE,CAAG;AAAA,IAAA,CACf;AAAA,EAEL;AAAA,EACA,SAAS,SAAUC,GAA+C;AAChE,SAAK;AAAA,MAAM;AAAA;AAAA,OACJ,OAAA,OAAOH,GAAKG,CAAM;AAAA,EAC3B;AAAA;AAaG,SAASC,KAAgDC,GAAe;AACzE,MAAAC,IAAUD,KAAU;AAEjB,SAAA;AAAA,IACL,MAAM,SAAUE,GAAiC;AAC3C,UAAAD,EAAQ,UAAU;AACpB,eAAOA,EAAQ,WAAW,IAAIA,EAAQ,CAAC,IAAI;AAG7C,UAAIE,IACFD,KACA,SAAUE,GAAOC,GAAO;AACtB,eAAOD,MAAOC;AAAA,MAAA;AAElB,aAAOJ,EAAQ,OAAO,CAACK,GAAKC,OACtBA,KAAOA,EAAI,SAAS,MAClBD,EAAI,WAAW,IACbA,EAAA,KAAK,GAAGC,CAAG,IAEXA,EAAA,QAAQ,CAACC,MAAM;AAEjB,QADaF,EAAI,KAAK,CAACG,MAAMN,EAAWM,GAAGD,CAAC,CAAC,KAE3CF,EAAI,KAAKE,CAAC;AAAA,MACZ,CACD,IAGEF,IACN,CAAE,CAAA;AAAA,IACP;AAAA,IACA,MAAM,YAAaI,GAAiB;AAClC,aAAO,KAAK,KAAK,CAACC,GAAG,MACZD,EAAM,MAAM,CAACE,MACXD,EAAEC,CAAI,MAAM,EAAEA,CAAI,CAC1B,CACF;AAAA,IACH;AAAA,EAAA;AAEJ;AChEgB,SAAAC,EACdC,GACAC,GACAC,GACsB;AAEtB,QAAMC,IAAUF,GACVG,IAASF,KAAyBD;AAExC,SAAO,SAAUI,GAAa;AAC5B,UAAMC,IAAc,CAAA,GACdC,IAAUF,EAAI,SAASL,CAAM;AACnC,QAAIQ,IAAQ;AACZ,eAAWC,KAASF,GAAS;AAC3B,YAAMG,IAASL,EAAI,MAAMG,GAAOC,EAAM,KAAK;AAC3C,MAAIC,KACFJ,EAAO,KAAKF,EAAOM,GAAQ,EAAK,CAAC,GAEnCJ,EAAO,KAAKH,EAAQM,EAAM,CAAC,GAAG,EAAI,CAAC,GACnCD,IAAQC,EAAM,QAASA,EAAM,CAAC,EAAE;AAAA,IAClC;AACI,WAAAD,IAAQH,EAAI,UACdC,EAAO,KAAKF,EAAOC,EAAI,MAAMG,CAAK,GAAG,EAAK,CAAC,GAEtCF;AAAA,EAAA;AAEX;AAWgB,SAAAK,EACdC,GACAC,GACA;AACA,SAAI,OAAOD,KAAW,YAAY,OAAOC,KAAW,WAC3CD,EAAO,YAAA,MAAkBC,EAAO,YAAY,IAC1CD,MAAW,UAAaC,MAAW;AAIhD;AAUa,MAAAC,IAAoB,CAACC,GAAgBC,MAAmB;AACnE,WAASC,IAAI,GAAGA,IAAIF,EAAK,QAAQE,KAAK;AAChC,QAAAC,IAAOH,EAAKE,CAAC;AACb,QAAAN,EAAiBO,GAAMF,CAAM;AACxB,aAAA;AAAA,EAEX;AACO,SAAA;AACT,GAEaG,IAAY,CAACd,MACjBA,EAAI,WAAW,oBAAoB,IAAI,EAAE,QAGrCe,IAAkB,CAC3Bf,GACAgB,GACAC,IAAc,QACb;AACH,QAAMC,IAAgBF,KAAUF,EAAUd,CAAG,IAAIA,EAAI;AAC9C,SAAAA,EAAI,OAAOkB,GAAeD,CAAG;AACtC;ACjFO,SAASE,EAAWC,GAA0B;AAC7C,QAAAjB,IAAQiB,EAAS,YAAY,GAAG;AACtC,SAAIjB,MAAU,KACL,KAEFiB,EAAS,UAAUjB,IAAQ,CAAC;AACrC;AAUO,SAASkB,EAAgB5B,GAAsB;AAChD,MAAAU,IAAQV,EAAK,YAAY,GAAG;AAChC,SAAIU,MAAU,OACJA,IAAAV,EAAK,YAAY,IAAI,GACzBU,MAAU,MACLV,IAGJA,EAAK,UAAUU,IAAQ,CAAC;AACjC;AAKO,SAASmB,EAAsB7B,GAAsB;AACpD,QAAA2B,IAAWC,EAAgB5B,CAAI,GAC/BU,IAAQiB,EAAS,YAAY,GAAG;AACtC,SAAIjB,MAAU,KACLiB,IAEFA,EAAS,UAAU,GAAGjB,CAAK;AACpC;AA0BgB,SAAAoB,EACd9B,GACA+B,IAAmB,SACR;AACL,QAAAC,IAAeD,MAAa,UAAU,OAAO;AAE/C,MAAAE,GAEAN,GACAO,GACAC;AACE,QAAAC,IAAYpC,EAAK,YAAYgC,CAAY;AAC/C,EAAII,MAAc,MACLH,IAAA,IACAN,IAAA3B,MAEXiC,IAAWjC,EAAK,UAAU,GAAGoC,IAAY,CAAC,GAC/BT,IAAA3B,EAAK,UAAUoC,IAAY,CAAC;AAGnC,QAAAC,IAAWV,EAAS,YAAY,GAAG;AACzC,SAAIU,MAAa,MACDH,IAAA,IACEC,IAAAR,MAEFO,IAAAP,EAAS,UAAUU,IAAW,CAAC,GAC7BF,IAAAR,EAAS,UAAU,GAAGU,CAAQ,IAGzC;AAAA,IACL,UAAAV;AAAA,IACA,eAAAQ;AAAA,IACA,aAAAD;AAAA,IACA,UAAUlC;AAAA,IACV,UAAAiC;AAAA,EAAA;AAEJ;ACpFO,MAAMK,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtB,GAAMC,GAAU;AACd,aAASC,EAAWD,GAA2B;AAC7C,aAAOA,KAAS;AAAA,IAClB;AAEO,WAAA;AAAA,MACL,MAAM;AACG,eAAAA;AAAA,MACT;AAAA,MACA,OAAOE,GAA2C;AAC5C,eAAAD,EAAWD,CAAK,IACXE,IAEFF;AAAA,MACT;AAAA,MACA,KACEG,GACAC,GACA;AACI,QAACH,EAAWD,CAAK,IAEVI,KACUA,MAFnBD,EAAgBH,CAAK;AAAA,MAIzB;AAAA,MACA,UAAaK,GAAkC;AAC7C,QAAIL,KAAS,QACXK,EAAKL,CAAK;AAAA,MAEd;AAAA,MACA,YAAY;AACH,eAAA,CAACC,EAAWD,CAAK;AAAA,MAC1B;AAAA,MACA,OAAOM,GAAuC;AAC5C,eAAIL,EAAWD,CAAK,KAAKM,EAAeN,CAAK,IACpC,OAEAD,EAAS,GAAG,MAAS;AAAA,MAEhC;AAAA,MACA,IAAOQ,GAA8C;AACnD,eAAIP,KAAS,OACJD,EAAS,GAAG,MAAS,IAErBA,EAAS,GAAGQ,EAAeP,CAAK,CAAC;AAAA,MAE5C;AAAA,MACA,QAAWO,GAAiC;AAC1C,eAAOA,EAAeP,CAAK;AAAA,MAC7B;AAAA,IAAA;AAAA,EAEJ;AACF;"} \ No newline at end of file +{"version":3,"file":"index.es.js","sources":["../src/commons/record-util.ts","../src/commons/str-utils.ts","../src/commons/file-util.ts","../src/commons/optional.ts"],"sourcesContent":["import { UnwrapNestedRefs } from \"vue\";\nexport enum RecordClearMode {\n delete = 2,\n reset = 1,\n}\nexport const withRecord = (obj: UnwrapNestedRefs>) => {\n return {\n clear: function (mode: RecordClearMode = RecordClearMode.delete) {\n if (mode === RecordClearMode.reset) {\n Object.keys(obj).forEach((key) => {\n obj[key] = undefined;\n });\n } else if (mode === RecordClearMode.delete) {\n Object.keys(obj).forEach((key) => {\n delete obj[key];\n });\n }\n },\n replace: function (newVal: UnwrapNestedRefs>) {\n this.clear(RecordClearMode.delete);\n Object.assign(obj, newVal);\n },\n };\n};\n\n/**\n * 这是一个泛型函数,接受任意个数的数组作为参数,并返回一个对象。\n * 该对象包含两个方法:test 和 path。\n * test 方法用于测试所有数组的元素是否相等,\n * path 方法用于测试所有数组的指定路径的值是否相等。\n\n * @param arrays\n * @returns\n */\nexport function assignRecords>(...arrays: T[][]) {\n let _arrays = arrays ?? [];\n\n return {\n test: function (equal?: (l: T, r: T) => boolean) {\n if (_arrays.length <= 1) {\n return _arrays.length === 1 ? _arrays[0] : [];\n }\n\n let localEqual =\n equal ??\n function (ll: T, rr: T) {\n return ll === rr;\n };\n return _arrays.reduce((acc, crt) => {\n if (crt && crt.length > 0) {\n if (acc.length === 0) {\n acc.push(...crt);\n } else {\n crt.forEach((c) => {\n const some = acc.some((a) => localEqual(a, c));\n if (!some) {\n acc.push(c);\n }\n });\n }\n }\n return acc;\n }, []);\n },\n path: function (...paths: string[]) {\n return this.test((l, r) => {\n return paths.every((path) => {\n return l[path] === r[path];\n });\n });\n },\n };\n}\n\n/**\n *\n * 接受一个目标对象和多个源对象作为参数,并返回合并后的对象。\n * 它会将源对象的属性复制到目标对象中,\n * 如果多个源对象有同名属性,\n * 则最后的属性值将覆盖前面的属性值。\n * @param target 目标对象\n * @param sources 来源对象参数\n * @returns 目标对象\n */\nexport const extendRecord = >(\n // 目标对象\n target: T,\n // 其他对象参数\n ...sources: (T | undefined)[]\n): T => {\n // 遍历其他对象参数\n for (const source of sources) {\n if (source !== undefined) {\n // 遍历参数对象的属性\n for (const key in source) {\n // 判断属性存在于参数对象中且值不为 null\n if (source.hasOwnProperty(key) && source[key] != null) {\n // 将属性赋值给目标对象\n target[key] = source[key];\n }\n }\n }\n }\n // 返回目标对象\n return target;\n};\n","/**\r\n * 生成给定函数体的函数注释。\r\n *\r\n * @param {RegExp} regExp - 用于匹配的正则表达式。\r\n * @param {(text: string, match: boolean) => T} matchHandler - 处理匹配到的文本的函数。\r\n * @param {(text: string, match: boolean) => T} [textHandler] - 处理未匹配到的文本的函数。\r\n * @return {(str: string) => T[]} - 分词器函数。\r\n */\r\nexport function stringTokenizer(\r\n regExp: RegExp,\r\n matchHandler: (text: string, match: boolean) => T,\r\n textHandler?: (text: string, match: boolean) => T\r\n): (str: string) => T[] {\r\n\r\n const ifMatch = matchHandler;\r\n const ifText = textHandler?textHandler: matchHandler;\r\n\r\n return function (str: string) {\r\n const result: T[] = [];\r\n const matches = str.matchAll(regExp);\r\n let index = 0;\r\n for (const match of matches) {\r\n const before = str.slice(index, match.index);\r\n if (before) {\r\n result.push(ifText(before, false));\r\n }\r\n result.push(ifMatch(match[0], true));\r\n index = match.index! + match[0].length;\r\n }\r\n if (index < str.length) {\r\n result.push(ifText(str.slice(index), false));\r\n }\r\n return result;\r\n };\r\n}\r\n\r\n/**\r\n * 该函数接受两个参数,判断它们是否相等,不区分大小写。\r\n * 如果参数都是字符串类型,则将它们转换为小写后比较。\r\n * 如果两个参数都是undefined,则返回true,\r\n * 否则返回false。\r\n * @param source\r\n * @param target\r\n * @returns\r\n */\r\nexport function equalsIgnoreCase(\r\n source: string | undefined,\r\n target: string | undefined\r\n) {\r\n if (typeof source === \"string\" && typeof target === \"string\") {\r\n return source.toLowerCase() === target.toLowerCase();\r\n } else if (source === undefined && target === undefined) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * 这个函数接受一个字符串数组和一个字符串作为参数,\r\n * 在数组中判断是否存在与搜索字符串相同或相似的字符串,忽略大小写。\r\n * 如果找到匹配项则返回true,否则返回false。\r\n * @param list 字符串数组\r\n * @param search 用来搜索的字符串\r\n * @returns 是否包含\r\n */\r\nexport const includeIgnoreCase = (list: string[], search: string) => {\r\n for (let i = 0; i < list.length; i++) {\r\n let item = list[i];\r\n if (equalsIgnoreCase(item, search)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\nexport const strLength = (str: string) => {\r\n return str.replaceAll(/[\\u4e00-\\u9fa5]/g, \"--\").length;\r\n};\r\n\r\nexport const strMonospacePad = (\r\n str: string,\r\n length: number,\r\n pad: string = \" \"\r\n) => {\r\n const visibleLength = length - (strLength(str) - str.length);\r\n return str.padEnd(visibleLength, pad);\r\n};\r\n","/**\r\n * 获取文件的后缀名\r\n * @param fileName 文件名\r\n * @returns 文件后缀名\r\n */\r\nexport function getFileExt(fileName: string): string {\r\n const index = fileName.lastIndexOf(\".\");\r\n if (index === -1) {\r\n return \"\";\r\n }\r\n return fileName.substring(index + 1);\r\n}\r\n\r\n/**\r\n * 获取文件全名(包含扩展名)\r\n * 该函数接收一个表示文件路径的字符串作为参数,返回该路径中文件名部分。\r\n * 首先查找路径中最后一个斜杠或反斜杠的索引,若未找到则直接返回路径;\r\n * 若找到,则使用substring方法提取最后一个斜杠或反斜杠后面的字符串作为文件名并返回。\r\n * @param path 文件路径\r\n * @returns 文件全名(包含扩展名)\r\n */\r\nexport function getFileFullName(path: string): string {\r\n let index = path.lastIndexOf(\"/\");\r\n if (index === -1) {\r\n index = path.lastIndexOf(\"\\\\\");\r\n if (index === -1) {\r\n return path;\r\n }\r\n }\r\n return path.substring(index + 1);\r\n}\r\n\r\n/**\r\n * 获取文件名不包含扩展名\r\n */\r\nexport function getFileNameWithoutExt(path: string): string {\r\n const fileName = getFileFullName(path);\r\n const index = fileName.lastIndexOf(\".\");\r\n if (index === -1) {\r\n return fileName;\r\n }\r\n return fileName.substring(0, index);\r\n}\r\n\r\n/**\r\n * 文件信息\r\n */\r\nexport interface IFileInfo {\r\n /** 文件名(包含扩展名) */\r\n fileName: string;\r\n /**\r\n * 文件名不带扩展名\r\n */\r\n fileNameNoExt: string;\r\n /** 文件扩展名 */\r\n fileExtName: string;\r\n /** 路径仅包含文件夹 */\r\n pathOnly: string;\r\n /** 完整路径 */\r\n fullPath: string;\r\n}\r\n\r\n/**\r\n * 获取文件信息\r\n * @param path 文件路径\r\n * @param platform 平台名称,默认为\"win32\"\r\n * @returns 包含文件名、文件名不带扩展名、文件扩展名、路径仅包含文件夹、完整路径的对象\r\n */\r\nexport function getFileInfo(\r\n path: string,\r\n platform: string = \"win32\"\r\n): IFileInfo {\r\n const pathSaprator = platform === \"win32\" ? \"\\\\\" : \"/\";\r\n\r\n let pathOnly: string;\r\n\r\n let fileName: string;\r\n let fileExtName: string;\r\n let fileNameNoExt: string;\r\n const pathIndex = path.lastIndexOf(pathSaprator);\r\n if (pathIndex === -1) {\r\n pathOnly = \"\";\r\n fileName = path;\r\n } else {\r\n pathOnly = path.substring(0, pathIndex + 1);\r\n fileName = path.substring(pathIndex + 1);\r\n }\r\n\r\n const extIndex = fileName.lastIndexOf(\".\");\r\n if (extIndex === -1) {\r\n fileExtName = \"\";\r\n fileNameNoExt = fileName;\r\n } else {\r\n fileExtName = fileName.substring(extIndex + 1);\r\n fileNameNoExt = fileName.substring(0, extIndex);\r\n }\r\n\r\n return {\r\n fileName,\r\n fileNameNoExt,\r\n fileExtName,\r\n fullPath: path,\r\n pathOnly,\r\n };\r\n}\r\n","/*\r\n * Copyright 2015,2016 DevCon5 GmbH, info@devcon5.io\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n *\r\n */\r\n\r\n/**\r\n * Optional monad for Javascript | Typescript.\r\n */\r\nexport const Optional = {\r\n /**\r\n * Creates an optional of the specified value. The value may be undefined or null.\r\n * @return OptionalInstance\r\n */\r\n of(value: T) {\r\n function notPresent(value: any): value is null {\r\n return value == null;\r\n }\r\n\r\n return {\r\n get() {\r\n return value;\r\n },\r\n orElse(elseValue: NonNullable): NonNullable {\r\n if (notPresent(value)) {\r\n return elseValue;\r\n }\r\n return value as NonNullable;\r\n },\r\n then(\r\n presentFunction: (value: T) => void,\r\n notPresentFunction?: () => void\r\n ) {\r\n if (!notPresent(value)) {\r\n presentFunction(value);\r\n } else if (notPresentFunction) {\r\n notPresentFunction();\r\n }\r\n },\r\n ifPresent(func: (val: NonNullable) => R) {\r\n if (value != null) {\r\n func(value);\r\n }\r\n },\r\n isPresent() {\r\n return !notPresent(value);\r\n },\r\n filter(filterFunction: (value: T) => boolean) {\r\n if (notPresent(value) || filterFunction(value)) {\r\n return this;\r\n } else {\r\n return Optional.of(undefined);\r\n }\r\n },\r\n map(mapperFunction: (value: NonNullable) => R) {\r\n if (value == null) {\r\n return Optional.of(undefined);\r\n } else {\r\n return Optional.of(mapperFunction(value));\r\n }\r\n },\r\n flatMap(mapperFunction: (value: T) => R) {\r\n return mapperFunction(value);\r\n },\r\n };\r\n },\r\n};\r\n\r\nexport default Optional;\r\n"],"names":["RecordClearMode","withRecord","obj","mode","key","newVal","assignRecords","arrays","_arrays","equal","localEqual","ll","rr","acc","crt","c","a","paths","l","r","path","extendRecord","target","sources","source","stringTokenizer","regExp","matchHandler","textHandler","ifMatch","ifText","str","result","matches","index","match","before","equalsIgnoreCase","includeIgnoreCase","list","search","i","item","strLength","strMonospacePad","length","pad","visibleLength","getFileExt","fileName","getFileFullName","getFileNameWithoutExt","getFileInfo","platform","pathSaprator","pathOnly","fileExtName","fileNameNoExt","pathIndex","extIndex","Optional","value","notPresent","elseValue","presentFunction","notPresentFunction","func","filterFunction","mapperFunction"],"mappings":"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"} \ No newline at end of file diff --git a/lib/index.umd.js b/lib/index.umd.js index d405a91..8a27c08 100644 --- a/lib/index.umd.js +++ b/lib/index.umd.js @@ -1,2 +1,2 @@ -(function(r,o){typeof exports=="object"&&typeof module<"u"?o(exports):typeof define=="function"&&define.amd?define(["exports"],o):(r=typeof globalThis<"u"?globalThis:r||self,o(r["ez-common-ts"]={}))})(this,function(r){"use strict";var o=(e=>(e[e.delete=2]="delete",e[e.reset=1]="reset",e))(o||{});const O=e=>({clear:function(n=2){n===1?Object.keys(e).forEach(t=>{e[t]=void 0}):n===2&&Object.keys(e).forEach(t=>{delete e[t]})},replace:function(n){this.clear(2),Object.assign(e,n)}});function E(...e){let n=e??[];return{test:function(t){if(n.length<=1)return n.length===1?n[0]:[];let f=t??function(i,s){return i===s};return n.reduce((i,s)=>(s&&s.length>0&&(i.length===0?i.push(...s):s.forEach(u=>{i.some(l=>f(l,u))||i.push(u)})),i),[])},path:function(...t){return this.test((f,i)=>t.every(s=>f[s]===i[s]))}}}function b(e,n,t){const f=n,i=t||n;return function(s){const u=[],c=s.matchAll(e);let l=0;for(const d of c){const I=s.slice(l,d.index);I&&u.push(i(I,!1)),u.push(f(d[0],!0)),l=d.index+d[0].length}return l{for(let t=0;te.replaceAll(/[\u4e00-\u9fa5]/g,"--").length,y=(e,n,t=" ")=>{const f=n-(h(e)-e.length);return e.padEnd(f,t)};function p(e){const n=e.lastIndexOf(".");return n===-1?"":e.substring(n+1)}function m(e){let n=e.lastIndexOf("/");return n===-1&&(n=e.lastIndexOf("\\"),n===-1)?e:e.substring(n+1)}function F(e){const n=m(e),t=n.lastIndexOf(".");return t===-1?n:n.substring(0,t)}function N(e,n="win32"){const t=n==="win32"?"\\":"/";let f,i,s,u;const c=e.lastIndexOf(t);c===-1?(f="",i=e):(f=e.substring(0,c+1),i=e.substring(c+1));const l=i.lastIndexOf(".");return l===-1?(s="",u=i):(s=i.substring(l+1),u=i.substring(0,l)),{fileName:i,fileNameNoExt:u,fileExtName:s,fullPath:e,pathOnly:f}}const g={of(e){function n(t){return t==null}return{get(){return e},orElse(t){return n(e)?t:e},then(t,f){n(e)?f&&f():t(e)},ifPresent(t){e!=null&&t(e)},isPresent(){return!n(e)},filter(t){return n(e)||t(e)?this:g.of(void 0)},map(t){return e==null?g.of(void 0):g.of(t(e))},flatMap(t){return t(e)}}}};r.Optional=g,r.RecordClearMode=o,r.assignRecords=E,r.equalsIgnoreCase=a,r.getFileExt=p,r.getFileInfo=N,r.getFileName=m,r.getFileNameWithoutExt=F,r.includeIgnoreCase=x,r.strLength=h,r.strMonospacePad=y,r.stringTokenizer=b,r.withRecord=O,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})}); +(function(s,l){typeof exports=="object"&&typeof module<"u"?l(exports):typeof define=="function"&&define.amd?define(["exports"],l):(s=typeof globalThis<"u"?globalThis:s||self,l(s["ez-common-ts"]={}))})(this,function(s){"use strict";var l=(e=>(e[e.delete=2]="delete",e[e.reset=1]="reset",e))(l||{});const O=e=>({clear:function(n=2){n===1?Object.keys(e).forEach(t=>{e[t]=void 0}):n===2&&Object.keys(e).forEach(t=>{delete e[t]})},replace:function(n){this.clear(2),Object.assign(e,n)}});function y(...e){let n=e??[];return{test:function(t){if(n.length<=1)return n.length===1?n[0]:[];let i=t??function(r,f){return r===f};return n.reduce((r,f)=>(f&&f.length>0&&(r.length===0?r.push(...f):f.forEach(o=>{r.some(u=>i(u,o))||r.push(o)})),r),[])},path:function(...t){return this.test((i,r)=>t.every(f=>i[f]===r[f]))}}}const x=(e,...n)=>{for(const t of n)if(t!==void 0)for(const i in t)t.hasOwnProperty(i)&&t[i]!=null&&(e[i]=t[i]);return e};function E(e,n,t){const i=n,r=t||n;return function(f){const o=[],c=f.matchAll(e);let u=0;for(const g of c){const I=f.slice(u,g.index);I&&o.push(r(I,!1)),o.push(i(g[0],!0)),u=g.index+g[0].length}return u{for(let t=0;te.replaceAll(/[\u4e00-\u9fa5]/g,"--").length,p=(e,n,t=" ")=>{const i=n-(h(e)-e.length);return e.padEnd(i,t)};function F(e){const n=e.lastIndexOf(".");return n===-1?"":e.substring(n+1)}function m(e){let n=e.lastIndexOf("/");return n===-1&&(n=e.lastIndexOf("\\"),n===-1)?e:e.substring(n+1)}function N(e){const n=m(e),t=n.lastIndexOf(".");return t===-1?n:n.substring(0,t)}function w(e,n="win32"){const t=n==="win32"?"\\":"/";let i,r,f,o;const c=e.lastIndexOf(t);c===-1?(i="",r=e):(i=e.substring(0,c+1),r=e.substring(c+1));const u=r.lastIndexOf(".");return u===-1?(f="",o=r):(f=r.substring(u+1),o=r.substring(0,u)),{fileName:r,fileNameNoExt:o,fileExtName:f,fullPath:e,pathOnly:i}}const d={of(e){function n(t){return t==null}return{get(){return e},orElse(t){return n(e)?t:e},then(t,i){n(e)?i&&i():t(e)},ifPresent(t){e!=null&&t(e)},isPresent(){return!n(e)},filter(t){return n(e)||t(e)?this:d.of(void 0)},map(t){return e==null?d.of(void 0):d.of(t(e))},flatMap(t){return t(e)}}}};s.Optional=d,s.RecordClearMode=l,s.assignRecords=y,s.equalsIgnoreCase=a,s.extendRecord=x,s.getFileExt=F,s.getFileInfo=w,s.getFileName=m,s.getFileNameWithoutExt=N,s.includeIgnoreCase=b,s.strLength=h,s.strMonospacePad=p,s.stringTokenizer=E,s.withRecord=O,Object.defineProperty(s,Symbol.toStringTag,{value:"Module"})}); //# sourceMappingURL=index.umd.js.map diff --git a/lib/index.umd.js.map b/lib/index.umd.js.map index 7bf183f..43f7283 100644 --- a/lib/index.umd.js.map +++ b/lib/index.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"index.umd.js","sources":["../src/commons/record-util.ts","../src/commons/str-utils.ts","../src/commons/file-util.ts","../src/commons/optional.ts"],"sourcesContent":["import { UnwrapNestedRefs } from \"vue\";\r\nexport enum RecordClearMode {\r\n delete = 2,\r\n reset = 1,\r\n}\r\nexport const withRecord = (obj: UnwrapNestedRefs>) => {\r\n return {\r\n clear: function (mode: RecordClearMode = RecordClearMode.delete) {\r\n if (mode === RecordClearMode.reset) {\r\n Object.keys(obj).forEach((key) => {\r\n obj[key] = undefined;\r\n });\r\n } else if (mode === RecordClearMode.delete) {\r\n Object.keys(obj).forEach((key) => {\r\n delete obj[key];\r\n });\r\n }\r\n },\r\n replace: function (newVal: UnwrapNestedRefs>) {\r\n this.clear(RecordClearMode.delete);\r\n Object.assign(obj, newVal);\r\n },\r\n };\r\n};\r\n\r\n/**\r\n * 这是一个泛型函数,接受任意个数的数组作为参数,并返回一个对象。\r\n * 该对象包含两个方法:test 和 path。\r\n * test 方法用于测试所有数组的元素是否相等,\r\n * path 方法用于测试所有数组的指定路径的值是否相等。\r\n\r\n * @param arrays \r\n * @returns \r\n */\r\nexport function assignRecords>(...arrays: T[][]) {\r\n let _arrays = arrays ?? [];\r\n\r\n return {\r\n test: function (equal?: (l: T, r: T) => boolean) {\r\n if (_arrays.length <= 1) {\r\n return _arrays.length === 1 ? _arrays[0] : [];\r\n }\r\n\r\n let localEqual =\r\n equal ??\r\n function (ll: T, rr: T) {\r\n return ll === rr;\r\n };\r\n return _arrays.reduce((acc, crt) => {\r\n if (crt && crt.length > 0) {\r\n if (acc.length === 0) {\r\n acc.push(...crt);\r\n } else {\r\n crt.forEach((c) => {\r\n const some = acc.some((a) => localEqual(a, c));\r\n if (!some) {\r\n acc.push(c);\r\n }\r\n });\r\n }\r\n }\r\n return acc;\r\n }, []);\r\n },\r\n path: function (...paths: string[]) {\r\n return this.test((l, r) => {\r\n return paths.every((path) => {\r\n return l[path] === r[path];\r\n });\r\n });\r\n },\r\n };\r\n}\r\n\r\n/**\r\n *\r\n * 接受一个目标对象和多个源对象作为参数,并返回合并后的对象。\r\n * 它会将源对象的属性复制到目标对象中,\r\n * 如果多个源对象有同名属性,\r\n * 则最后的属性值将覆盖前面的属性值。\r\n * @param target 目标对象\r\n * @param sources 来源对象参数\r\n * @returns 目标对象\r\n */\r\nexport const extend = >(\r\n // 目标对象\r\n target: T,\r\n // 其他对象参数\r\n ...sources: (T | undefined)[]\r\n): T => {\r\n // 遍历其他对象参数\r\n for (const source of sources) {\r\n if (source !== undefined) {\r\n // 遍历参数对象的属性\r\n for (const key in source) {\r\n // 判断属性存在于参数对象中且值不为 null\r\n if (source.hasOwnProperty(key) && source[key] != null) {\r\n // 将属性赋值给目标对象\r\n target[key] = source[key];\r\n }\r\n }\r\n }\r\n }\r\n // 返回目标对象\r\n return target;\r\n};\r\n","/**\r\n * 生成给定函数体的函数注释。\r\n *\r\n * @param {RegExp} regExp - 用于匹配的正则表达式。\r\n * @param {(text: string, match: boolean) => T} matchHandler - 处理匹配到的文本的函数。\r\n * @param {(text: string, match: boolean) => T} [textHandler] - 处理未匹配到的文本的函数。\r\n * @return {(str: string) => T[]} - 分词器函数。\r\n */\r\nexport function stringTokenizer(\r\n regExp: RegExp,\r\n matchHandler: (text: string, match: boolean) => T,\r\n textHandler?: (text: string, match: boolean) => T\r\n): (str: string) => T[] {\r\n\r\n const ifMatch = matchHandler;\r\n const ifText = textHandler?textHandler: matchHandler;\r\n\r\n return function (str: string) {\r\n const result: T[] = [];\r\n const matches = str.matchAll(regExp);\r\n let index = 0;\r\n for (const match of matches) {\r\n const before = str.slice(index, match.index);\r\n if (before) {\r\n result.push(ifText(before, false));\r\n }\r\n result.push(ifMatch(match[0], true));\r\n index = match.index! + match[0].length;\r\n }\r\n if (index < str.length) {\r\n result.push(ifText(str.slice(index), false));\r\n }\r\n return result;\r\n };\r\n}\r\n\r\n/**\r\n * 该函数接受两个参数,判断它们是否相等,不区分大小写。\r\n * 如果参数都是字符串类型,则将它们转换为小写后比较。\r\n * 如果两个参数都是undefined,则返回true,\r\n * 否则返回false。\r\n * @param source\r\n * @param target\r\n * @returns\r\n */\r\nexport function equalsIgnoreCase(\r\n source: string | undefined,\r\n target: string | undefined\r\n) {\r\n if (typeof source === \"string\" && typeof target === \"string\") {\r\n return source.toLowerCase() === target.toLowerCase();\r\n } else if (source === undefined && target === undefined) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * 这个函数接受一个字符串数组和一个字符串作为参数,\r\n * 在数组中判断是否存在与搜索字符串相同或相似的字符串,忽略大小写。\r\n * 如果找到匹配项则返回true,否则返回false。\r\n * @param list 字符串数组\r\n * @param search 用来搜索的字符串\r\n * @returns 是否包含\r\n */\r\nexport const includeIgnoreCase = (list: string[], search: string) => {\r\n for (let i = 0; i < list.length; i++) {\r\n let item = list[i];\r\n if (equalsIgnoreCase(item, search)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\nexport const strLength = (str: string) => {\r\n return str.replaceAll(/[\\u4e00-\\u9fa5]/g, \"--\").length;\r\n};\r\n\r\nexport const strMonospacePad = (\r\n str: string,\r\n length: number,\r\n pad: string = \" \"\r\n) => {\r\n const visibleLength = length - (strLength(str) - str.length);\r\n return str.padEnd(visibleLength, pad);\r\n};\r\n","/**\r\n * 获取文件的后缀名\r\n * @param fileName 文件名\r\n * @returns 文件后缀名\r\n */\r\nexport function getFileExt(fileName: string): string {\r\n const index = fileName.lastIndexOf(\".\");\r\n if (index === -1) {\r\n return \"\";\r\n }\r\n return fileName.substring(index + 1);\r\n}\r\n\r\n/**\r\n * 获取文件全名(包含扩展名)\r\n * 该函数接收一个表示文件路径的字符串作为参数,返回该路径中文件名部分。\r\n * 首先查找路径中最后一个斜杠或反斜杠的索引,若未找到则直接返回路径;\r\n * 若找到,则使用substring方法提取最后一个斜杠或反斜杠后面的字符串作为文件名并返回。\r\n * @param path 文件路径\r\n * @returns 文件全名(包含扩展名)\r\n */\r\nexport function getFileFullName(path: string): string {\r\n let index = path.lastIndexOf(\"/\");\r\n if (index === -1) {\r\n index = path.lastIndexOf(\"\\\\\");\r\n if (index === -1) {\r\n return path;\r\n }\r\n }\r\n return path.substring(index + 1);\r\n}\r\n\r\n/**\r\n * 获取文件名不包含扩展名\r\n */\r\nexport function getFileNameWithoutExt(path: string): string {\r\n const fileName = getFileFullName(path);\r\n const index = fileName.lastIndexOf(\".\");\r\n if (index === -1) {\r\n return fileName;\r\n }\r\n return fileName.substring(0, index);\r\n}\r\n\r\n/**\r\n * 文件信息\r\n */\r\nexport interface IFileInfo {\r\n /** 文件名(包含扩展名) */\r\n fileName: string;\r\n /**\r\n * 文件名不带扩展名\r\n */\r\n fileNameNoExt: string;\r\n /** 文件扩展名 */\r\n fileExtName: string;\r\n /** 路径仅包含文件夹 */\r\n pathOnly: string;\r\n /** 完整路径 */\r\n fullPath: string;\r\n}\r\n\r\n/**\r\n * 获取文件信息\r\n * @param path 文件路径\r\n * @param platform 平台名称,默认为\"win32\"\r\n * @returns 包含文件名、文件名不带扩展名、文件扩展名、路径仅包含文件夹、完整路径的对象\r\n */\r\nexport function getFileInfo(\r\n path: string,\r\n platform: string = \"win32\"\r\n): IFileInfo {\r\n const pathSaprator = platform === \"win32\" ? \"\\\\\" : \"/\";\r\n\r\n let pathOnly: string;\r\n\r\n let fileName: string;\r\n let fileExtName: string;\r\n let fileNameNoExt: string;\r\n const pathIndex = path.lastIndexOf(pathSaprator);\r\n if (pathIndex === -1) {\r\n pathOnly = \"\";\r\n fileName = path;\r\n } else {\r\n pathOnly = path.substring(0, pathIndex + 1);\r\n fileName = path.substring(pathIndex + 1);\r\n }\r\n\r\n const extIndex = fileName.lastIndexOf(\".\");\r\n if (extIndex === -1) {\r\n fileExtName = \"\";\r\n fileNameNoExt = fileName;\r\n } else {\r\n fileExtName = fileName.substring(extIndex + 1);\r\n fileNameNoExt = fileName.substring(0, extIndex);\r\n }\r\n\r\n return {\r\n fileName,\r\n fileNameNoExt,\r\n fileExtName,\r\n fullPath: path,\r\n pathOnly,\r\n };\r\n}\r\n","/*\r\n * Copyright 2015,2016 DevCon5 GmbH, info@devcon5.io\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n *\r\n */\r\n\r\n/**\r\n * Optional monad for Javascript | Typescript.\r\n */\r\nexport const Optional = {\r\n /**\r\n * Creates an optional of the specified value. The value may be undefined or null.\r\n * @return OptionalInstance\r\n */\r\n of(value: T) {\r\n function notPresent(value: any): value is null {\r\n return value == null;\r\n }\r\n\r\n return {\r\n get() {\r\n return value;\r\n },\r\n orElse(elseValue: NonNullable): NonNullable {\r\n if (notPresent(value)) {\r\n return elseValue;\r\n }\r\n return value as NonNullable;\r\n },\r\n then(\r\n presentFunction: (value: T) => void,\r\n notPresentFunction?: () => void\r\n ) {\r\n if (!notPresent(value)) {\r\n presentFunction(value);\r\n } else if (notPresentFunction) {\r\n notPresentFunction();\r\n }\r\n },\r\n ifPresent(func: (val: NonNullable) => R) {\r\n if (value != null) {\r\n func(value);\r\n }\r\n },\r\n isPresent() {\r\n return !notPresent(value);\r\n },\r\n filter(filterFunction: (value: T) => boolean) {\r\n if (notPresent(value) || filterFunction(value)) {\r\n return this;\r\n } else {\r\n return Optional.of(undefined);\r\n }\r\n },\r\n map(mapperFunction: (value: NonNullable) => R) {\r\n if (value == null) {\r\n return Optional.of(undefined);\r\n } else {\r\n return Optional.of(mapperFunction(value));\r\n }\r\n },\r\n flatMap(mapperFunction: (value: T) => R) {\r\n return mapperFunction(value);\r\n },\r\n };\r\n },\r\n};\r\n\r\nexport default Optional;\r\n"],"names":["RecordClearMode","withRecord","obj","mode","key","newVal","assignRecords","arrays","_arrays","equal","localEqual","ll","rr","acc","crt","c","a","paths","l","r","path","stringTokenizer","regExp","matchHandler","textHandler","ifMatch","ifText","str","result","matches","index","match","before","equalsIgnoreCase","source","target","includeIgnoreCase","list","search","i","item","strLength","strMonospacePad","length","pad","visibleLength","getFileExt","fileName","getFileFullName","getFileNameWithoutExt","getFileInfo","platform","pathSaprator","pathOnly","fileExtName","fileNameNoExt","pathIndex","extIndex","Optional","value","notPresent","elseValue","presentFunction","notPresentFunction","func","filterFunction","mapperFunction"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.umd.js","sources":["../src/commons/record-util.ts","../src/commons/str-utils.ts","../src/commons/file-util.ts","../src/commons/optional.ts"],"sourcesContent":["import { UnwrapNestedRefs } from \"vue\";\nexport enum RecordClearMode {\n delete = 2,\n reset = 1,\n}\nexport const withRecord = (obj: UnwrapNestedRefs>) => {\n return {\n clear: function (mode: RecordClearMode = RecordClearMode.delete) {\n if (mode === RecordClearMode.reset) {\n Object.keys(obj).forEach((key) => {\n obj[key] = undefined;\n });\n } else if (mode === RecordClearMode.delete) {\n Object.keys(obj).forEach((key) => {\n delete obj[key];\n });\n }\n },\n replace: function (newVal: UnwrapNestedRefs>) {\n this.clear(RecordClearMode.delete);\n Object.assign(obj, newVal);\n },\n };\n};\n\n/**\n * 这是一个泛型函数,接受任意个数的数组作为参数,并返回一个对象。\n * 该对象包含两个方法:test 和 path。\n * test 方法用于测试所有数组的元素是否相等,\n * path 方法用于测试所有数组的指定路径的值是否相等。\n\n * @param arrays\n * @returns\n */\nexport function assignRecords>(...arrays: T[][]) {\n let _arrays = arrays ?? [];\n\n return {\n test: function (equal?: (l: T, r: T) => boolean) {\n if (_arrays.length <= 1) {\n return _arrays.length === 1 ? _arrays[0] : [];\n }\n\n let localEqual =\n equal ??\n function (ll: T, rr: T) {\n return ll === rr;\n };\n return _arrays.reduce((acc, crt) => {\n if (crt && crt.length > 0) {\n if (acc.length === 0) {\n acc.push(...crt);\n } else {\n crt.forEach((c) => {\n const some = acc.some((a) => localEqual(a, c));\n if (!some) {\n acc.push(c);\n }\n });\n }\n }\n return acc;\n }, []);\n },\n path: function (...paths: string[]) {\n return this.test((l, r) => {\n return paths.every((path) => {\n return l[path] === r[path];\n });\n });\n },\n };\n}\n\n/**\n *\n * 接受一个目标对象和多个源对象作为参数,并返回合并后的对象。\n * 它会将源对象的属性复制到目标对象中,\n * 如果多个源对象有同名属性,\n * 则最后的属性值将覆盖前面的属性值。\n * @param target 目标对象\n * @param sources 来源对象参数\n * @returns 目标对象\n */\nexport const extendRecord = >(\n // 目标对象\n target: T,\n // 其他对象参数\n ...sources: (T | undefined)[]\n): T => {\n // 遍历其他对象参数\n for (const source of sources) {\n if (source !== undefined) {\n // 遍历参数对象的属性\n for (const key in source) {\n // 判断属性存在于参数对象中且值不为 null\n if (source.hasOwnProperty(key) && source[key] != null) {\n // 将属性赋值给目标对象\n target[key] = source[key];\n }\n }\n }\n }\n // 返回目标对象\n return target;\n};\n","/**\r\n * 生成给定函数体的函数注释。\r\n *\r\n * @param {RegExp} regExp - 用于匹配的正则表达式。\r\n * @param {(text: string, match: boolean) => T} matchHandler - 处理匹配到的文本的函数。\r\n * @param {(text: string, match: boolean) => T} [textHandler] - 处理未匹配到的文本的函数。\r\n * @return {(str: string) => T[]} - 分词器函数。\r\n */\r\nexport function stringTokenizer(\r\n regExp: RegExp,\r\n matchHandler: (text: string, match: boolean) => T,\r\n textHandler?: (text: string, match: boolean) => T\r\n): (str: string) => T[] {\r\n\r\n const ifMatch = matchHandler;\r\n const ifText = textHandler?textHandler: matchHandler;\r\n\r\n return function (str: string) {\r\n const result: T[] = [];\r\n const matches = str.matchAll(regExp);\r\n let index = 0;\r\n for (const match of matches) {\r\n const before = str.slice(index, match.index);\r\n if (before) {\r\n result.push(ifText(before, false));\r\n }\r\n result.push(ifMatch(match[0], true));\r\n index = match.index! + match[0].length;\r\n }\r\n if (index < str.length) {\r\n result.push(ifText(str.slice(index), false));\r\n }\r\n return result;\r\n };\r\n}\r\n\r\n/**\r\n * 该函数接受两个参数,判断它们是否相等,不区分大小写。\r\n * 如果参数都是字符串类型,则将它们转换为小写后比较。\r\n * 如果两个参数都是undefined,则返回true,\r\n * 否则返回false。\r\n * @param source\r\n * @param target\r\n * @returns\r\n */\r\nexport function equalsIgnoreCase(\r\n source: string | undefined,\r\n target: string | undefined\r\n) {\r\n if (typeof source === \"string\" && typeof target === \"string\") {\r\n return source.toLowerCase() === target.toLowerCase();\r\n } else if (source === undefined && target === undefined) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * 这个函数接受一个字符串数组和一个字符串作为参数,\r\n * 在数组中判断是否存在与搜索字符串相同或相似的字符串,忽略大小写。\r\n * 如果找到匹配项则返回true,否则返回false。\r\n * @param list 字符串数组\r\n * @param search 用来搜索的字符串\r\n * @returns 是否包含\r\n */\r\nexport const includeIgnoreCase = (list: string[], search: string) => {\r\n for (let i = 0; i < list.length; i++) {\r\n let item = list[i];\r\n if (equalsIgnoreCase(item, search)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\nexport const strLength = (str: string) => {\r\n return str.replaceAll(/[\\u4e00-\\u9fa5]/g, \"--\").length;\r\n};\r\n\r\nexport const strMonospacePad = (\r\n str: string,\r\n length: number,\r\n pad: string = \" \"\r\n) => {\r\n const visibleLength = length - (strLength(str) - str.length);\r\n return str.padEnd(visibleLength, pad);\r\n};\r\n","/**\r\n * 获取文件的后缀名\r\n * @param fileName 文件名\r\n * @returns 文件后缀名\r\n */\r\nexport function getFileExt(fileName: string): string {\r\n const index = fileName.lastIndexOf(\".\");\r\n if (index === -1) {\r\n return \"\";\r\n }\r\n return fileName.substring(index + 1);\r\n}\r\n\r\n/**\r\n * 获取文件全名(包含扩展名)\r\n * 该函数接收一个表示文件路径的字符串作为参数,返回该路径中文件名部分。\r\n * 首先查找路径中最后一个斜杠或反斜杠的索引,若未找到则直接返回路径;\r\n * 若找到,则使用substring方法提取最后一个斜杠或反斜杠后面的字符串作为文件名并返回。\r\n * @param path 文件路径\r\n * @returns 文件全名(包含扩展名)\r\n */\r\nexport function getFileFullName(path: string): string {\r\n let index = path.lastIndexOf(\"/\");\r\n if (index === -1) {\r\n index = path.lastIndexOf(\"\\\\\");\r\n if (index === -1) {\r\n return path;\r\n }\r\n }\r\n return path.substring(index + 1);\r\n}\r\n\r\n/**\r\n * 获取文件名不包含扩展名\r\n */\r\nexport function getFileNameWithoutExt(path: string): string {\r\n const fileName = getFileFullName(path);\r\n const index = fileName.lastIndexOf(\".\");\r\n if (index === -1) {\r\n return fileName;\r\n }\r\n return fileName.substring(0, index);\r\n}\r\n\r\n/**\r\n * 文件信息\r\n */\r\nexport interface IFileInfo {\r\n /** 文件名(包含扩展名) */\r\n fileName: string;\r\n /**\r\n * 文件名不带扩展名\r\n */\r\n fileNameNoExt: string;\r\n /** 文件扩展名 */\r\n fileExtName: string;\r\n /** 路径仅包含文件夹 */\r\n pathOnly: string;\r\n /** 完整路径 */\r\n fullPath: string;\r\n}\r\n\r\n/**\r\n * 获取文件信息\r\n * @param path 文件路径\r\n * @param platform 平台名称,默认为\"win32\"\r\n * @returns 包含文件名、文件名不带扩展名、文件扩展名、路径仅包含文件夹、完整路径的对象\r\n */\r\nexport function getFileInfo(\r\n path: string,\r\n platform: string = \"win32\"\r\n): IFileInfo {\r\n const pathSaprator = platform === \"win32\" ? \"\\\\\" : \"/\";\r\n\r\n let pathOnly: string;\r\n\r\n let fileName: string;\r\n let fileExtName: string;\r\n let fileNameNoExt: string;\r\n const pathIndex = path.lastIndexOf(pathSaprator);\r\n if (pathIndex === -1) {\r\n pathOnly = \"\";\r\n fileName = path;\r\n } else {\r\n pathOnly = path.substring(0, pathIndex + 1);\r\n fileName = path.substring(pathIndex + 1);\r\n }\r\n\r\n const extIndex = fileName.lastIndexOf(\".\");\r\n if (extIndex === -1) {\r\n fileExtName = \"\";\r\n fileNameNoExt = fileName;\r\n } else {\r\n fileExtName = fileName.substring(extIndex + 1);\r\n fileNameNoExt = fileName.substring(0, extIndex);\r\n }\r\n\r\n return {\r\n fileName,\r\n fileNameNoExt,\r\n fileExtName,\r\n fullPath: path,\r\n pathOnly,\r\n };\r\n}\r\n","/*\r\n * Copyright 2015,2016 DevCon5 GmbH, info@devcon5.io\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n *\r\n */\r\n\r\n/**\r\n * Optional monad for Javascript | Typescript.\r\n */\r\nexport const Optional = {\r\n /**\r\n * Creates an optional of the specified value. The value may be undefined or null.\r\n * @return OptionalInstance\r\n */\r\n of(value: T) {\r\n function notPresent(value: any): value is null {\r\n return value == null;\r\n }\r\n\r\n return {\r\n get() {\r\n return value;\r\n },\r\n orElse(elseValue: NonNullable): NonNullable {\r\n if (notPresent(value)) {\r\n return elseValue;\r\n }\r\n return value as NonNullable;\r\n },\r\n then(\r\n presentFunction: (value: T) => void,\r\n notPresentFunction?: () => void\r\n ) {\r\n if (!notPresent(value)) {\r\n presentFunction(value);\r\n } else if (notPresentFunction) {\r\n notPresentFunction();\r\n }\r\n },\r\n ifPresent(func: (val: NonNullable) => R) {\r\n if (value != null) {\r\n func(value);\r\n }\r\n },\r\n isPresent() {\r\n return !notPresent(value);\r\n },\r\n filter(filterFunction: (value: T) => boolean) {\r\n if (notPresent(value) || filterFunction(value)) {\r\n return this;\r\n } else {\r\n return Optional.of(undefined);\r\n }\r\n },\r\n map(mapperFunction: (value: NonNullable) => R) {\r\n if (value == null) {\r\n return Optional.of(undefined);\r\n } else {\r\n return Optional.of(mapperFunction(value));\r\n }\r\n },\r\n flatMap(mapperFunction: (value: T) => R) {\r\n return mapperFunction(value);\r\n },\r\n };\r\n },\r\n};\r\n\r\nexport default Optional;\r\n"],"names":["RecordClearMode","withRecord","obj","mode","key","newVal","assignRecords","arrays","_arrays","equal","localEqual","ll","rr","acc","crt","c","a","paths","l","path","extendRecord","target","sources","source","stringTokenizer","regExp","matchHandler","textHandler","ifMatch","ifText","str","result","matches","index","match","before","equalsIgnoreCase","includeIgnoreCase","list","search","i","item","strLength","strMonospacePad","length","pad","visibleLength","getFileExt","fileName","getFileFullName","getFileNameWithoutExt","getFileInfo","platform","pathSaprator","pathOnly","fileExtName","fileNameNoExt","pathIndex","extIndex","Optional","value","notPresent","elseValue","presentFunction","notPresentFunction","func","filterFunction","mapperFunction"],"mappings":"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"} \ No newline at end of file diff --git a/src/commons/record-util.ts b/src/commons/record-util.ts index 1b17613..a09042c 100644 --- a/src/commons/record-util.ts +++ b/src/commons/record-util.ts @@ -29,8 +29,8 @@ export const withRecord = (obj: UnwrapNestedRefs>) => { * test 方法用于测试所有数组的元素是否相等, * path 方法用于测试所有数组的指定路径的值是否相等。 - * @param arrays - * @returns + * @param arrays + * @returns */ export function assignRecords>(...arrays: T[][]) { let _arrays = arrays ?? []; @@ -82,7 +82,7 @@ export function assignRecords>(...arrays: T[][]) { * @param sources 来源对象参数 * @returns 目标对象 */ -export const extend = >( +export const extendRecord = >( // 目标对象 target: T, // 其他对象参数 diff --git a/src/index.ts b/src/index.ts index fe484ae..271f426 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,6 +2,7 @@ import { withRecord, assignRecords, RecordClearMode, + extendRecord, } from "./commons/record-util"; import { stringTokenizer, @@ -23,6 +24,7 @@ export { RecordClearMode, assignRecords, equalsIgnoreCase, + extendRecord, getFileExt, getFileFullName as getFileName, getFileInfo,