qidian-shared 1.0.65 → 1.0.66
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 +2 -1
- package/dist/utils/common.d.ts +8 -1
- package/dist/utils/common.mjs +21 -0
- package/dist/utils/common.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -9,7 +9,7 @@ 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, findEnum, hasOwn, isEmpty, noop, valueFillter } from "./utils/common.mjs";
|
|
12
|
+
import { checkSameObject, createEnum, createExposeProxy, easyCopy, extractSlotsWithPrefix, extractSlotsWithoutPrefix, filterSlots, findEnum, hasOwn, isEmpty, noop, valueFillter } from "./utils/common.mjs";
|
|
13
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";
|
|
@@ -35,6 +35,7 @@ export {
|
|
|
35
35
|
checkValue,
|
|
36
36
|
copy2Clipboard,
|
|
37
37
|
createEnum,
|
|
38
|
+
createExposeProxy,
|
|
38
39
|
cutFileSuffix,
|
|
39
40
|
cutFilename,
|
|
40
41
|
decrypt,
|
package/dist/utils/common.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SetupContext } from 'vue';
|
|
1
|
+
import type { Ref, SetupContext } from 'vue';
|
|
2
2
|
export declare function noop(): void;
|
|
3
3
|
export declare function isEmpty(val: unknown): val is null | undefined | '' | [] | Record<string, never>;
|
|
4
4
|
export declare function hasOwn<T extends object, K extends keyof T>(val: T, key: K): key is K;
|
|
@@ -42,3 +42,10 @@ export declare function filterSlots(slots: SetupContext['slots'], filterName: st
|
|
|
42
42
|
export declare function easyCopy<T>(data: T): T;
|
|
43
43
|
export declare function checkSameObject(newData: unknown, oldData: unknown): boolean;
|
|
44
44
|
export declare function valueFillter(val: string, keys: string, data: Record<string, string | number>): string;
|
|
45
|
+
type Simplify<T> = T extends any ? {
|
|
46
|
+
[K in keyof T]: T[K];
|
|
47
|
+
} : never;
|
|
48
|
+
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
49
|
+
type GetComponentType<T extends Readonly<Ref<object | null | undefined>[]>> = UnionToIntersection<T[number] extends Ref<infer V> ? NonNullable<V> : never>;
|
|
50
|
+
export declare function createExposeProxy<R extends {}, T extends Readonly<Ref<object | null | undefined>[]>>(expose: R, ...refs: T): Simplify<R & GetComponentType<T>>;
|
|
51
|
+
export {};
|
package/dist/utils/common.mjs
CHANGED
|
@@ -89,9 +89,30 @@ function valueFillter(val, keys, data) {
|
|
|
89
89
|
return `${result}`;
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
|
+
function createExposeProxy(expose, ...refs) {
|
|
93
|
+
const exposeProxy = new Proxy(expose, {
|
|
94
|
+
has(target, key) {
|
|
95
|
+
if (key in target) return true;
|
|
96
|
+
for (const item of refs) {
|
|
97
|
+
if (item.value && key in item.value) return true;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
},
|
|
101
|
+
get(target, key) {
|
|
102
|
+
if (key in target) return target[key];
|
|
103
|
+
for (const item of refs) {
|
|
104
|
+
if (item.value && key in item.value) {
|
|
105
|
+
return item.value[key];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
return exposeProxy;
|
|
111
|
+
}
|
|
92
112
|
export {
|
|
93
113
|
checkSameObject,
|
|
94
114
|
createEnum,
|
|
115
|
+
createExposeProxy,
|
|
95
116
|
easyCopy,
|
|
96
117
|
extractSlotsWithPrefix,
|
|
97
118
|
extractSlotsWithoutPrefix,
|
|
@@ -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 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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"}
|
|
1
|
+
{"version":3,"file":"common.mjs","sources":["../../src/utils/common.ts"],"sourcesContent":["import type { Ref, 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\ntype Simplify<T> = T extends any\n ? {\n [K in keyof T]: T[K]\n }\n : never\n\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void\n ? I\n : never\n\ntype GetComponentType<T extends Readonly<Ref<object | null | undefined>[]>> = UnionToIntersection<\n T[number] extends Ref<infer V> ? NonNullable<V> : never\n>\n\nexport function createExposeProxy<\n R extends {},\n T extends Readonly<Ref<object | null | undefined>[]>\n>(expose: R, ...refs: T) {\n const exposeProxy = new Proxy(expose, {\n has(target, key) {\n if (key in target) return true\n for (const item of refs) {\n if (item.value && key in item.value) return true\n }\n return false\n },\n get(target: any, key) {\n if (key in target) return target[key]\n for (const item of refs) {\n if (item.value && key in item.value) {\n return (item.value as any)[key]\n }\n }\n }\n })\n\n return exposeProxy as Simplify<R & GetComponentType<T>>\n}\n"],"names":[],"mappings":"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"}
|