qidian-shared 1.0.56 → 1.0.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -9,8 +9,8 @@ import { useServicePagination } from "./hooks/useService/pagination.mjs";
9
9
  import { useTimer } from "./hooks/useTimer.mjs";
10
10
  import { useTplRefsList } from "./hooks/useTplRefsList.mjs";
11
11
  import { padZero, toMoney, toMoneyTrimmed, toMoneyWithK, toPrecision } from "./utils/calc.mjs";
12
- import { checkSameObject, createEnum, easyCopy, extractSlotsWithPrefix, extractSlotsWithoutPrefix, filterSlots, hasOwn, isEmpty, noop, valueFillter } from "./utils/common.mjs";
13
- import { buildTree, toArr } from "./utils/conversion.mjs";
12
+ import { checkSameObject, createEnum, easyCopy, extractSlotsWithPrefix, extractSlotsWithoutPrefix, filterSlots, findEnum, hasOwn, isEmpty, noop, valueFillter } from "./utils/common.mjs";
13
+ import { buildTree, remapKeys, toArr } from "./utils/conversion.mjs";
14
14
  import { MD5, decryptBase64, encryptBase64, encryptWithAes, generateAesKey, generateRandomString } from "./utils/crypto.mjs";
15
15
  import { domOff, domOn, getHtmlTxt, getScrollEl } from "./utils/dom.mjs";
16
16
  import { easyDownload } from "./utils/download.mjs";
@@ -48,6 +48,7 @@ export {
48
48
  extractSlotsWithPrefix,
49
49
  extractSlotsWithoutPrefix,
50
50
  filterSlots,
51
+ findEnum,
51
52
  formatGlob,
52
53
  generateAesKey,
53
54
  generateRandomString,
@@ -70,6 +71,7 @@ export {
70
71
  objToStr,
71
72
  padZero,
72
73
  parseRelaxedJSON,
74
+ remapKeys,
73
75
  resize,
74
76
  resizeDirective,
75
77
  setUrlParam,
@@ -26,6 +26,13 @@ export declare function createEnum<const T extends Record<string | number, strin
26
26
  value: K_1;
27
27
  } & T[K_1]; }[keyof T][];
28
28
  };
29
+ export declare function findEnum<T extends {
30
+ value: any;
31
+ label: string;
32
+ }[]>(map?: T, value?: any, key?: keyof T[number]): {
33
+ value: any;
34
+ label: string;
35
+ } | undefined;
29
36
  export declare function extractSlotsWithPrefix(slots: SetupContext['slots'], prefix: string): {
30
37
  originalName: string;
31
38
  filterName: string;
@@ -38,6 +38,11 @@ function createEnum(obj) {
38
38
  });
39
39
  return { map, options };
40
40
  }
41
+ function findEnum(map, value, key) {
42
+ if (isEmpty(map)) return;
43
+ const find = map.find((item) => item[key || "value"] === value);
44
+ return find;
45
+ }
41
46
  function extractSlotsWithPrefix(slots, prefix) {
42
47
  const res = [];
43
48
  for (const key in slots) {
@@ -91,6 +96,7 @@ export {
91
96
  extractSlotsWithPrefix,
92
97
  extractSlotsWithoutPrefix,
93
98
  filterSlots,
99
+ findEnum,
94
100
  hasOwn,
95
101
  isEmpty,
96
102
  noop,
@@ -1 +1 @@
1
- {"version":3,"file":"common.mjs","sources":["../../src/utils/common.ts"],"sourcesContent":["import type { SetupContext } from 'vue'\n\nimport { identifyType } from './type'\n\n/**\n * 空方法\n */\nexport function noop(): void {}\n\n/**\n * 空判断 - undefined null NaN '' ' ' {} [] 为空\n * @param val 任何参数\n * @returns 是否为空\n */\nexport function isEmpty(val: unknown): val is null | undefined | '' | [] | Record<string, never> {\n // null or undefined\n if (val == null) return true\n\n if (typeof val === 'string' && val.trim() === '') return true\n\n if (typeof val === 'boolean') return false\n\n if (typeof val === 'number') return Number.isNaN(val)\n\n if (val instanceof Error) return val.message === ''\n\n switch (identifyType(val)) {\n // Array\n case 'array':\n return !(val as unknown[]).length\n\n // Plain Object\n case 'object': {\n return !Object.keys(val).length\n }\n\n // Map or Set or File\n case 'file':\n case 'map':\n case 'set': {\n return !(val as File | Map<unknown, unknown> | Set<unknown>).size\n }\n default:\n return !val\n }\n}\n\n/**\n * 判断对象、数组是否有某属性\n * @param val\n * @param key\n * @returns 是否含有\n */\nexport function hasOwn<T extends object, K extends keyof T>(val: T, key: K): key is K {\n return Object.prototype.hasOwnProperty.call(val, key)\n}\n\n/**\n * 生成枚举\n * @param obj 枚举对象\n * @returns 枚举对象、枚举数组\n */\nexport function createEnum<\n const T extends Record<string | number, string | ({ label: string } & Record<string, unknown>)>\n>(obj: T) {\n const map = {} as {\n [K in keyof T]: T[K] extends string\n ? { value: K; label: T[K] }\n : T[K] extends { value: infer V }\n ? { value: V } & Omit<T[K], 'value'>\n : { value: K } & T[K]\n }\n\n const options = Object.entries(obj).map(([key, raw]) => {\n const entry = typeof raw === 'string' ? { label: raw } : raw\n\n // 如果 entry 中有 value 属性,使用它;否则使用 key\n const value = 'value' in entry ? entry.value : key\n ;(map as Record<string, unknown>)[key] = { value, ...entry }\n\n return { value, ...entry }\n }) as unknown as {\n [K in keyof T]: T[K] extends string\n ? { value: K; label: T[K] }\n : T[K] extends { value: infer V }\n ? { value: V } & Omit<T[K], 'value'>\n : { value: K } & T[K]\n }[keyof T][]\n\n return { map, options }\n}\n\n/**\n * 提取带指定前缀的插槽\n * @param slots 插槽对象\n * @param prefix 前缀\n * @returns 返回包含原始名称和过滤前缀后名称的数组\n */\nexport function extractSlotsWithPrefix(slots: SetupContext['slots'], prefix: string) {\n const res: { originalName: string; filterName: string }[] = []\n for (const key in slots) {\n if (!key.startsWith(`${prefix}-`)) continue\n\n res.push({ originalName: key, filterName: key.slice(prefix.length + 1) })\n }\n\n return res\n}\n\n/**\n * 提取不带指定前缀的插槽\n * @param slots 插槽对象\n * @param prefix 前缀\n * @returns 返回不包含该前缀的插槽名称数组\n */\nexport function extractSlotsWithoutPrefix(slots: SetupContext['slots'], prefix: string) {\n const res: string[] = []\n for (const key in slots) {\n if (key.startsWith(`${prefix}-`)) continue\n res.push(key)\n }\n\n return res\n}\n\n/**\n * 过滤插槽\n * @param slots 插槽对象\n * @param prefix 前缀\n * @returns 返回过滤后的插槽\n */\nexport function filterSlots(slots: SetupContext['slots'], filterName: string[]) {\n const res: string[] = []\n for (const key in slots) {\n if (filterName.includes(key)) continue\n res.push(key)\n }\n\n return res\n}\n\n/**\n * 简单复制\n * @param data 要复制的数组、对象\n * @return 深度复制出的新对象\n */\nexport function easyCopy<T>(data: T): T {\n return JSON.parse(JSON.stringify(data))\n}\n\n/**\n * 简单比较两个对象数据是否一致\n * @param newData 新数据对象\n * @param oldData 旧数据对象\n * @return 返回比较结果\n */\nexport function checkSameObject(newData: unknown, oldData: unknown) {\n if ((newData && !oldData) || (!newData && oldData) || typeof newData !== typeof oldData) {\n return false\n }\n return JSON.stringify(newData) === JSON.stringify(oldData)\n}\n\n/**\n * 填充数据\n * 传入的${key} || $key修改为传入的数据data\n * @param val 需要过滤的原数据\n * @param keys 需要过滤的关键字(多个key用|隔开)\n * @param data 需要替换的数据对象,匹配到结构,将使用data[key]填充\n * @returns 返回替换填充后的数据\n */\nexport function valueFillter(val: string, keys: string, data: Record<string, string | number>) {\n if (!val) return val\n return val.replace(/(?:\\${([^}]*)})|(?:\\$([^&?\\b]*))/g, ($1, $2, $3) => {\n let result: string | number = ''\n const rule = new RegExp(keys)\n if (rule.test($2) || rule.test($3)) {\n result = data[$2 || $3] || ''\n } else {\n result = $1 // 如果没有匹配到,则原路返回\n }\n return `${result}`\n })\n}\n"],"names":[],"mappings":";AAOO,SAAS,OAAa;AAAC;AAOvB,SAAS,QAAQ,KAAyE;AAE/F,MAAI,OAAO,KAAM,QAAO;AAExB,MAAI,OAAO,QAAQ,YAAY,IAAI,KAAA,MAAW,GAAI,QAAO;AAEzD,MAAI,OAAO,QAAQ,UAAW,QAAO;AAErC,MAAI,OAAO,QAAQ,SAAU,QAAO,OAAO,MAAM,GAAG;AAEpD,MAAI,eAAe,MAAO,QAAO,IAAI,YAAY;AAEjD,UAAQ,aAAa,GAAG,GAAA;AAAA;AAAA,IAEtB,KAAK;AACH,aAAO,CAAE,IAAkB;AAAA;AAAA,IAG7B,KAAK,UAAU;AACb,aAAO,CAAC,OAAO,KAAK,GAAG,EAAE;AAAA,IAC3B;AAAA;AAAA,IAGA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,OAAO;AACV,aAAO,CAAE,IAAoD;AAAA,IAC/D;AAAA,IACA;AACE,aAAO,CAAC;AAAA,EAAA;AAEd;AAQO,SAAS,OAA4C,KAAQ,KAAkB;AACpF,SAAO,OAAO,UAAU,eAAe,KAAK,KAAK,GAAG;AACtD;AAOO,SAAS,WAEd,KAAQ;AACR,QAAM,MAAM,CAAA;AAQZ,QAAM,UAAU,OAAO,QAAQ,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM;AACtD,UAAM,QAAQ,OAAO,QAAQ,WAAW,EAAE,OAAO,QAAQ;AAGzD,UAAM,QAAQ,WAAW,QAAQ,MAAM,QAAQ;AAC7C,QAAgC,GAAG,IAAI,EAAE,OAAO,GAAG,MAAA;AAErD,WAAO,EAAE,OAAO,GAAG,MAAA;AAAA,EACrB,CAAC;AAQD,SAAO,EAAE,KAAK,QAAA;AAChB;AAQO,SAAS,uBAAuB,OAA8B,QAAgB;AACnF,QAAM,MAAsD,CAAA;AAC5D,aAAW,OAAO,OAAO;AACvB,QAAI,CAAC,IAAI,WAAW,GAAG,MAAM,GAAG,EAAG;AAEnC,QAAI,KAAK,EAAE,cAAc,KAAK,YAAY,IAAI,MAAM,OAAO,SAAS,CAAC,EAAA,CAAG;AAAA,EAC1E;AAEA,SAAO;AACT;AAQO,SAAS,0BAA0B,OAA8B,QAAgB;AACtF,QAAM,MAAgB,CAAA;AACtB,aAAW,OAAO,OAAO;AACvB,QAAI,IAAI,WAAW,GAAG,MAAM,GAAG,EAAG;AAClC,QAAI,KAAK,GAAG;AAAA,EACd;AAEA,SAAO;AACT;AAQO,SAAS,YAAY,OAA8B,YAAsB;AAC9E,QAAM,MAAgB,CAAA;AACtB,aAAW,OAAO,OAAO;AACvB,QAAI,WAAW,SAAS,GAAG,EAAG;AAC9B,QAAI,KAAK,GAAG;AAAA,EACd;AAEA,SAAO;AACT;AAOO,SAAS,SAAY,MAAY;AACtC,SAAO,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC;AACxC;AAQO,SAAS,gBAAgB,SAAkB,SAAkB;AAClE,MAAK,WAAW,CAAC,WAAa,CAAC,WAAW,WAAY,OAAO,YAAY,OAAO,SAAS;AACvF,WAAO;AAAA,EACT;AACA,SAAO,KAAK,UAAU,OAAO,MAAM,KAAK,UAAU,OAAO;AAC3D;AAUO,SAAS,aAAa,KAAa,MAAc,MAAuC;AAC7F,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,IAAI,QAAQ,qCAAqC,CAAC,IAAI,IAAI,OAAO;AACtE,QAAI,SAA0B;AAC9B,UAAM,OAAO,IAAI,OAAO,IAAI;AAC5B,QAAI,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE,GAAG;AAClC,eAAS,KAAK,MAAM,EAAE,KAAK;AAAA,IAC7B,OAAO;AACL,eAAS;AAAA,IACX;AACA,WAAO,GAAG,MAAM;AAAA,EAClB,CAAC;AACH;"}
1
+ {"version":3,"file":"common.mjs","sources":["../../src/utils/common.ts"],"sourcesContent":["import type { SetupContext } from 'vue'\n\nimport { identifyType } from './type'\n\n/**\n * 空方法\n */\nexport function noop(): void {}\n\n/**\n * 空判断 - undefined null NaN '' ' ' {} [] 为空\n * @param val 任何参数\n * @returns 是否为空\n */\nexport function isEmpty(val: unknown): val is null | undefined | '' | [] | Record<string, never> {\n // null or undefined\n if (val == null) return true\n\n if (typeof val === 'string' && val.trim() === '') return true\n\n if (typeof val === 'boolean') return false\n\n if (typeof val === 'number') return Number.isNaN(val)\n\n if (val instanceof Error) return val.message === ''\n\n switch (identifyType(val)) {\n // Array\n case 'array':\n return !(val as unknown[]).length\n\n // Plain Object\n case 'object': {\n return !Object.keys(val).length\n }\n\n // Map or Set or File\n case 'file':\n case 'map':\n case 'set': {\n return !(val as File | Map<unknown, unknown> | Set<unknown>).size\n }\n default:\n return !val\n }\n}\n\n/**\n * 判断对象、数组是否有某属性\n * @param val\n * @param key\n * @returns 是否含有\n */\nexport function hasOwn<T extends object, K extends keyof T>(val: T, key: K): key is K {\n return Object.prototype.hasOwnProperty.call(val, key)\n}\n\n/**\n * 生成枚举\n * @param obj 枚举对象\n * @returns 枚举对象、枚举数组\n */\nexport function createEnum<\n const T extends Record<string | number, string | ({ label: string } & Record<string, unknown>)>\n>(obj: T) {\n const map = {} as {\n [K in keyof T]: T[K] extends string\n ? { value: K; label: T[K] }\n : T[K] extends { value: infer V }\n ? { value: V } & Omit<T[K], 'value'>\n : { value: K } & T[K]\n }\n\n const options = Object.entries(obj).map(([key, raw]) => {\n const entry = typeof raw === 'string' ? { label: raw } : raw\n\n // 如果 entry 中有 value 属性,使用它;否则使用 key\n const value = 'value' in entry ? entry.value : key\n ;(map as Record<string, unknown>)[key] = { value, ...entry }\n\n return { value, ...entry }\n }) as unknown as {\n [K in keyof T]: T[K] extends string\n ? { value: K; label: T[K] }\n : T[K] extends { value: infer V }\n ? { value: V } & Omit<T[K], 'value'>\n : { value: K } & T[K]\n }[keyof T][]\n\n return { map, options }\n}\n\n/**\n * 根据指定键值从枚举数组中查找匹配项\n * @param map 枚举数组,每项需包含 value 和 label 属性\n * @param value 要匹配的值\n * @param key 匹配时使用的键名,默认为 'value'\n * @returns 匹配到的项,未找到则返回 undefined\n */\nexport function findEnum<T extends { value: any; label: string }[]>(\n map?: T,\n value?: any,\n key?: keyof T[number]\n) {\n if (isEmpty(map)) return\n\n const find = (map as T).find((item) => item[(key || 'value') as keyof typeof item] === value)\n return find\n}\n\n/**\n * 提取带指定前缀的插槽\n * @param slots 插槽对象\n * @param prefix 前缀\n * @returns 返回包含原始名称和过滤前缀后名称的数组\n */\nexport function extractSlotsWithPrefix(slots: SetupContext['slots'], prefix: string) {\n const res: { originalName: string; filterName: string }[] = []\n for (const key in slots) {\n if (!key.startsWith(`${prefix}-`)) continue\n\n res.push({ originalName: key, filterName: key.slice(prefix.length + 1) })\n }\n\n return res\n}\n\n/**\n * 提取不带指定前缀的插槽\n * @param slots 插槽对象\n * @param prefix 前缀\n * @returns 返回不包含该前缀的插槽名称数组\n */\nexport function extractSlotsWithoutPrefix(slots: SetupContext['slots'], prefix: string) {\n const res: string[] = []\n for (const key in slots) {\n if (key.startsWith(`${prefix}-`)) continue\n res.push(key)\n }\n\n return res\n}\n\n/**\n * 过滤插槽\n * @param slots 插槽对象\n * @param prefix 前缀\n * @returns 返回过滤后的插槽\n */\nexport function filterSlots(slots: SetupContext['slots'], filterName: string[]) {\n const res: string[] = []\n for (const key in slots) {\n if (filterName.includes(key)) continue\n res.push(key)\n }\n\n return res\n}\n\n/**\n * 简单复制\n * @param data 要复制的数组、对象\n * @return 深度复制出的新对象\n */\nexport function easyCopy<T>(data: T): T {\n return JSON.parse(JSON.stringify(data))\n}\n\n/**\n * 简单比较两个对象数据是否一致\n * @param newData 新数据对象\n * @param oldData 旧数据对象\n * @return 返回比较结果\n */\nexport function checkSameObject(newData: unknown, oldData: unknown) {\n if ((newData && !oldData) || (!newData && oldData) || typeof newData !== typeof oldData) {\n return false\n }\n return JSON.stringify(newData) === JSON.stringify(oldData)\n}\n\n/**\n * 填充数据\n * 传入的${key} || $key修改为传入的数据data\n * @param val 需要过滤的原数据\n * @param keys 需要过滤的关键字(多个key用|隔开)\n * @param data 需要替换的数据对象,匹配到结构,将使用data[key]填充\n * @returns 返回替换填充后的数据\n */\nexport function valueFillter(val: string, keys: string, data: Record<string, string | number>) {\n if (!val) return val\n return val.replace(/(?:\\${([^}]*)})|(?:\\$([^&?\\b]*))/g, ($1, $2, $3) => {\n let result: string | number = ''\n const rule = new RegExp(keys)\n if (rule.test($2) || rule.test($3)) {\n result = data[$2 || $3] || ''\n } else {\n result = $1 // 如果没有匹配到,则原路返回\n }\n return `${result}`\n })\n}\n"],"names":[],"mappings":"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"}
@@ -4,3 +4,9 @@ export declare function buildTree<T extends object>(data: T[], options?: {
4
4
  parentId?: keyof T;
5
5
  children?: keyof T;
6
6
  }): T[];
7
+ type KeyMapValue<T, K extends keyof T> = string | {
8
+ newKey: string;
9
+ handler?: (val: T[K]) => any;
10
+ };
11
+ export declare function remapKeys<T extends Record<string, any>, M extends Partial<Record<keyof T, KeyMapValue<T, keyof T>>>>(data: T, keyMap: M, strict?: boolean): Record<string, any>;
12
+ export {};
@@ -37,8 +37,23 @@ function buildTree(data, options = {}) {
37
37
  }
38
38
  return tree;
39
39
  }
40
+ function remapKeys(data, keyMap, strict = false) {
41
+ const result = {};
42
+ for (const key in data) {
43
+ const mapValue = keyMap[key];
44
+ if (mapValue) {
45
+ const newKey = typeof mapValue === "string" ? mapValue : mapValue.newKey;
46
+ const value = typeof mapValue === "object" && mapValue.handler ? mapValue.handler(data[key]) : data[key];
47
+ result[newKey] = value;
48
+ } else if (!strict) {
49
+ result[key] = data[key];
50
+ }
51
+ }
52
+ return result;
53
+ }
40
54
  export {
41
55
  buildTree,
56
+ remapKeys,
42
57
  toArr
43
58
  };
44
59
  //# sourceMappingURL=conversion.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversion.mjs","sources":["../../src/utils/conversion.ts"],"sourcesContent":["import { isEmpty } from './common'\n\n/**\n * 转数组\n * @param target\n * @return 转换后的数组\n */\nexport function toArr<T>(target: T | T[] | undefined): T[] {\n if (Array.isArray(target)) return target\n if (isEmpty(target)) return []\n return [target]\n}\n\n/**\n * 构造树型结构数据\n */\nexport function buildTree<T extends object>(\n data: T[],\n options: {\n id?: keyof T\n parentId?: keyof T\n children?: keyof T\n } = {}\n): T[] {\n const { id = 'id', parentId = 'parentId', children = 'children' } = options\n const childrenListMap: Record<string | number | symbol, T[]> = {}\n const nodeIds: Record<string | number | symbol, T> = {}\n const tree: T[] = []\n\n for (const d of data) {\n const pid = d[parentId as keyof typeof d] as string | number | symbol\n if (!childrenListMap[pid]) {\n childrenListMap[pid] = []\n }\n nodeIds[d[id as keyof typeof d] as string | number | symbol] = d\n childrenListMap[pid].push(d)\n }\n\n for (const d of data) {\n const pid = d[parentId as keyof typeof d] as string | number | symbol\n if (!nodeIds[pid]) {\n tree.push(d)\n }\n }\n\n for (const t of tree) {\n adaptToChildrenList(t)\n }\n\n function adaptToChildrenList(o: T): void {\n const childNodes = childrenListMap[o[id as keyof typeof o] as string | number | symbol]\n if (childNodes) {\n ;(o as Record<string, unknown>)[children as string] = childNodes\n for (const c of childNodes) {\n adaptToChildrenList(c)\n }\n }\n }\n return tree\n}\n"],"names":[],"mappings":";AAOO,SAAS,MAAS,QAAkC;AACzD,MAAI,MAAM,QAAQ,MAAM,EAAG,QAAO;AAClC,MAAI,QAAQ,MAAM,EAAG,QAAO,CAAA;AAC5B,SAAO,CAAC,MAAM;AAChB;AAKO,SAAS,UACd,MACA,UAII,IACC;AACL,QAAM,EAAE,KAAK,MAAM,WAAW,YAAY,WAAW,eAAe;AACpE,QAAM,kBAAyD,CAAA;AAC/D,QAAM,UAA+C,CAAA;AACrD,QAAM,OAAY,CAAA;AAElB,aAAW,KAAK,MAAM;AACpB,UAAM,MAAM,EAAE,QAA0B;AACxC,QAAI,CAAC,gBAAgB,GAAG,GAAG;AACzB,sBAAgB,GAAG,IAAI,CAAA;AAAA,IACzB;AACA,YAAQ,EAAE,EAAoB,CAA6B,IAAI;AAC/D,oBAAgB,GAAG,EAAE,KAAK,CAAC;AAAA,EAC7B;AAEA,aAAW,KAAK,MAAM;AACpB,UAAM,MAAM,EAAE,QAA0B;AACxC,QAAI,CAAC,QAAQ,GAAG,GAAG;AACjB,WAAK,KAAK,CAAC;AAAA,IACb;AAAA,EACF;AAEA,aAAW,KAAK,MAAM;AACpB,wBAAoB,CAAC;AAAA,EACvB;AAEA,WAAS,oBAAoB,GAAY;AACvC,UAAM,aAAa,gBAAgB,EAAE,EAAoB,CAA6B;AACtF,QAAI,YAAY;AACZ,QAA8B,QAAkB,IAAI;AACtD,iBAAW,KAAK,YAAY;AAC1B,4BAAoB,CAAC;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;"}
1
+ {"version":3,"file":"conversion.mjs","sources":["../../src/utils/conversion.ts"],"sourcesContent":["import { isEmpty } from './common'\n\n/**\n * 转数组\n * @param target\n * @return 转换后的数组\n */\nexport function toArr<T>(target: T | T[] | undefined): T[] {\n if (Array.isArray(target)) return target\n if (isEmpty(target)) return []\n return [target]\n}\n\n/**\n * 构造树型结构数据\n * @param data 扁平化的节点数组\n * @param options 配置项\n * @param options.id ID 字段名,默认 'id'\n * @param options.parentId 父节点 ID 字段名,默认 'parentId'\n * @param options.children 子节点字段名,默认 'children'\n * @returns 树型结构数组\n * @example\n * buildTree([\n * { id: 1, name: 'A' },\n * { id: 2, parentId: 1, name: 'B' },\n * { id: 3, parentId: 1, name: 'C' }\n * ]) // [{ id: 1, name: 'A', children: [{ id: 2, parentId: 1, name: 'B' }, { id: 3, parentId: 1, name: 'C' }] }]\n */\nexport function buildTree<T extends object>(\n data: T[],\n options: {\n id?: keyof T\n parentId?: keyof T\n children?: keyof T\n } = {}\n): T[] {\n const { id = 'id', parentId = 'parentId', children = 'children' } = options\n const childrenListMap: Record<string | number | symbol, T[]> = {}\n const nodeIds: Record<string | number | symbol, T> = {}\n const tree: T[] = []\n\n for (const d of data) {\n const pid = d[parentId as keyof typeof d] as string | number | symbol\n if (!childrenListMap[pid]) {\n childrenListMap[pid] = []\n }\n nodeIds[d[id as keyof typeof d] as string | number | symbol] = d\n childrenListMap[pid].push(d)\n }\n\n for (const d of data) {\n const pid = d[parentId as keyof typeof d] as string | number | symbol\n if (!nodeIds[pid]) {\n tree.push(d)\n }\n }\n\n for (const t of tree) {\n adaptToChildrenList(t)\n }\n\n function adaptToChildrenList(o: T): void {\n const childNodes = childrenListMap[o[id as keyof typeof o] as string | number | symbol]\n if (childNodes) {\n ;(o as Record<string, unknown>)[children as string] = childNodes\n for (const c of childNodes) {\n adaptToChildrenList(c)\n }\n }\n }\n return tree\n}\n\ntype KeyMapValue<T, K extends keyof T> = string | { newKey: string; handler?: (val: T[K]) => any }\n\n/**\n * 重命名对象键\n * @param data 源对象\n * @param keyMap 键映射,格式为 { 旧键: 新键 | { newKey, handler } }\n * @param strict 是否严格模式(只保留映射过的字段),默认 false\n * @returns 键被重命名后的新对象\n * @example\n * remapKeys({ name: 'foo', age: 18 }, { name: 'userName' }) // { userName: 'foo', age: 18 }\n * remapKeys({ name: 'foo', age: 18 }, { name: 'userName' }, true) // { userName: 'foo' }\n * remapKeys({ name: 'foo', age: 18 }, { name: { newKey: 'userName', handler: v => v.toUpperCase() } }) // { userName: 'FOO', age: 18 }\n */\nexport function remapKeys<\n T extends Record<string, any>,\n M extends Partial<Record<keyof T, KeyMapValue<T, keyof T>>>\n>(data: T, keyMap: M, strict = false): Record<string, any> {\n const result = {} as any\n\n for (const key in data) {\n const mapValue = keyMap[key]\n if (mapValue) {\n const newKey = typeof mapValue === 'string' ? mapValue : mapValue.newKey\n const value =\n typeof mapValue === 'object' && mapValue.handler ? mapValue.handler(data[key]) : data[key]\n result[newKey] = value\n } else if (!strict) {\n result[key] = data[key]\n }\n }\n\n return result\n}\n"],"names":[],"mappings":";AAOO,SAAS,MAAS,QAAkC;AACzD,MAAI,MAAM,QAAQ,MAAM,EAAG,QAAO;AAClC,MAAI,QAAQ,MAAM,EAAG,QAAO,CAAA;AAC5B,SAAO,CAAC,MAAM;AAChB;AAiBO,SAAS,UACd,MACA,UAII,IACC;AACL,QAAM,EAAE,KAAK,MAAM,WAAW,YAAY,WAAW,eAAe;AACpE,QAAM,kBAAyD,CAAA;AAC/D,QAAM,UAA+C,CAAA;AACrD,QAAM,OAAY,CAAA;AAElB,aAAW,KAAK,MAAM;AACpB,UAAM,MAAM,EAAE,QAA0B;AACxC,QAAI,CAAC,gBAAgB,GAAG,GAAG;AACzB,sBAAgB,GAAG,IAAI,CAAA;AAAA,IACzB;AACA,YAAQ,EAAE,EAAoB,CAA6B,IAAI;AAC/D,oBAAgB,GAAG,EAAE,KAAK,CAAC;AAAA,EAC7B;AAEA,aAAW,KAAK,MAAM;AACpB,UAAM,MAAM,EAAE,QAA0B;AACxC,QAAI,CAAC,QAAQ,GAAG,GAAG;AACjB,WAAK,KAAK,CAAC;AAAA,IACb;AAAA,EACF;AAEA,aAAW,KAAK,MAAM;AACpB,wBAAoB,CAAC;AAAA,EACvB;AAEA,WAAS,oBAAoB,GAAY;AACvC,UAAM,aAAa,gBAAgB,EAAE,EAAoB,CAA6B;AACtF,QAAI,YAAY;AACZ,QAA8B,QAAkB,IAAI;AACtD,iBAAW,KAAK,YAAY;AAC1B,4BAAoB,CAAC;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAeO,SAAS,UAGd,MAAS,QAAW,SAAS,OAA4B;AACzD,QAAM,SAAS,CAAA;AAEf,aAAW,OAAO,MAAM;AACtB,UAAM,WAAW,OAAO,GAAG;AAC3B,QAAI,UAAU;AACZ,YAAM,SAAS,OAAO,aAAa,WAAW,WAAW,SAAS;AAClE,YAAM,QACJ,OAAO,aAAa,YAAY,SAAS,UAAU,SAAS,QAAQ,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG;AAC3F,aAAO,MAAM,IAAI;AAAA,IACnB,WAAW,CAAC,QAAQ;AAClB,aAAO,GAAG,IAAI,KAAK,GAAG;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AACT;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qidian-shared",
3
- "version": "1.0.56",
3
+ "version": "1.0.58",
4
4
  "description": "QiDian 共享工具函数和钩子",
5
5
  "type": "module",
6
6
  "author": "qidian",