diff --git a/packages/core/index.ts b/packages/core/index.ts index 0d38808..99bd0ca 100644 --- a/packages/core/index.ts +++ b/packages/core/index.ts @@ -1,3 +1,4 @@ export * from "./src/monitor/index"; export * from "./src/indexdb/index"; export * from "./src/use-spliter/index"; +export * from "./src/utils/index"; diff --git a/packages/core/src/use-spliter/index.ts b/packages/core/src/use-spliter/index.ts index eed1a2b..b032926 100644 --- a/packages/core/src/use-spliter/index.ts +++ b/packages/core/src/use-spliter/index.ts @@ -1,6 +1,6 @@ import { isString, isFunction } from "lodash-es"; +import type { Unit } from "../utils"; -export type Unit = string | number; export type TransFormFn = (v: string, index: number, arr: string[]) => T; export default function useSpliter(spliter = ":") { diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts new file mode 100644 index 0000000..1e63a6e --- /dev/null +++ b/packages/core/src/utils/index.ts @@ -0,0 +1,122 @@ +import { merge } from "lodash-es"; + +export type UnionNull = T | null; +export type UnionUndefined = T | undefined; +export type UnionNone = UnionNull | UnionUndefined; +export type DeepPartial = { + [K in keyof T]?: DeepPartial; +}; +export interface ErrorTrait { + error: T; +} + +export type Key = keyof any; +export type Unit = T extends unknown ? string | number : string | number | T; + +export interface IOption { + key: string | number; + label: string; + value: T; + [k: string]: unknown; +} +export interface TreeNode { + key: string | number; + label: string; + value: T; + icon?: string; + count?: number; + children?: TreeNode[]; + [k: string]: unknown; +} +export interface NodeOptions extends IOption { + children?: NodeOptions[]; +} + +export const genOptionMap = (options: IOption[], _fieldNames: Partial = genFieldNames()) => { + const fieldNames = merge(genFieldNames(), _fieldNames); + + return options.reduce( + (target, item) => { + target[item[fieldNames.key] as string] = item; + return target; + }, + {} as Record, + ); +}; + +export interface HttpResponse { + status: number; + errMsg: string; + errCode: number; + data: T; +} +export interface ResponseWrap { + errCode: number; + errMsg: string; + data: T; +} + +export interface ListResults { + items: T[]; + total: number; + data: T[]; + count: number; +} + +export interface FieldNames { + label: string; + value: string; + key: string; + icon: string; + name: string; + children: string; +} +export type PartialFieldNames = Partial; +export const genFieldNames = (defaultValue?: Partial): FieldNames => ({ + key: "key", + label: "label", + value: "value", + icon: "icon", + name: "name", + children: "children", + ...(defaultValue || {}), +}); + +export const PrivateID = "__pid__"; +export type UnionPrivateID = T & { [PrivateID]: string }; +export type IterFn = (value: T, index: number, arr: T[]) => UnionPrivateID; +export const unionPrivateId = >(arr: T[], iter: IterFn): UnionPrivateID[] => { + return arr.map(iter); +}; + +export interface RangeFnOptions { + left: number; + right: number; + contains: [boolean, boolean]; // 左开右闭,左闭右开,左开右开,左闭右闭 +} +export const inRangeFn = ( + val: number, + opt: RangeFnOptions = { + left: 0, + right: 100, + contains: [true, false], + }, +) => { + if (Number.isNaN(val)) return false; + if (typeof val === "number") { + const { left, right, contains = [true, false] } = opt; + const leftRes = contains[0] ? val >= left : val > left; + const rightRes = contains[1] ? val <= right : val < right; + + return leftRes && rightRes; + } + return false; +}; + +/** + * 在 template 格式化中,`v as any` 可能影响 template 代码块的高亮,使用 `(v as any)` 时,prettier 会将其变为 `v as any`,导致高亮问题。 + * 当然,可以选择使用 `(v, v as any)` 方式避免自动格式化去掉括号 + * @param {any} value + * @returns {any} + */ +export const asAnyType = (value: any): any => value;