Skip to content

Commit 78d2d0b

Browse files
committed
feat: add utils
1 parent bfdf1a8 commit 78d2d0b

File tree

12 files changed

+217
-0
lines changed

12 files changed

+217
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { isFunction, isObject } from './index'
2+
3+
export default function cloneObject<T>(data: T): T {
4+
let copy: any
5+
const isArray = Array.isArray(data)
6+
7+
if (data instanceof Date) {
8+
copy = new Date(data)
9+
} else if (data instanceof Set) {
10+
copy = new Set(data)
11+
} else if (isArray || isObject(data)) {
12+
copy = isArray ? [] : {}
13+
for (const key in data) {
14+
if (isFunction(data[key])) {
15+
copy = data
16+
break
17+
}
18+
copy[key] = cloneObject(data[key])
19+
}
20+
} else {
21+
return data
22+
}
23+
24+
return copy
25+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const InvalidDate = new Date('foo')
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import type { FieldValues } from '../types/filed'
2+
import type { SubmitErrorHandler, SubmitHandler } from '../types/form'
3+
4+
export function createSubmitHandler<T extends FieldValues = FieldValues>(fn: SubmitHandler<T>) {
5+
return fn
6+
}
7+
8+
export function createErrorHandler<T extends FieldValues = FieldValues>(fn: SubmitErrorHandler<T>) {
9+
return fn
10+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { isDateObject, isObject, isPrimitive } from '.'
2+
3+
export function deepEqual(obj1: any, obj2: any) {
4+
if (isPrimitive(obj1) || isPrimitive(obj2)) {
5+
return obj1 === obj2
6+
}
7+
8+
if (isDateObject(obj1) && isDateObject(obj2)) {
9+
return obj1.getTime() === obj2.getTime()
10+
}
11+
12+
const keys1 = Object.keys(obj1)
13+
const keys2 = Object.keys(obj2)
14+
15+
if (keys1.length !== keys2.length) {
16+
return false
17+
}
18+
19+
for (const key of keys1) {
20+
if (!keys2.includes(key)) {
21+
return false
22+
}
23+
24+
// avoid comparing HTMLElement
25+
if (key !== 'ref') {
26+
const val1 = obj1[key]
27+
const val2 = obj2[key]
28+
29+
if (
30+
isObject(val1) ||
31+
isObject(val2) ||
32+
(isObject(val1) && isObject(val2)) ||
33+
(isDateObject(val1) && isDateObject(val2))
34+
? !deepEqual(val1, val2)
35+
: val1 !== val2
36+
) {
37+
return false
38+
}
39+
}
40+
}
41+
42+
return true
43+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import type { FieldElement } from '../types/filed'
2+
3+
export const isRadioInput = (el?: FieldElement): el is HTMLInputElement =>
4+
el?.type === 'radio'
5+
6+
export const isCheckBoxInput = (el?: FieldElement): el is HTMLInputElement =>
7+
el?.type === 'checkbox'
8+
9+
export const isRadioOrCheckboxInput = (
10+
el?: FieldElement
11+
): el is HTMLInputElement => isRadioInput(el) || isCheckBoxInput(el)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { unref } from 'vue'
2+
import type { MaybeRef } from '../types/utils'
3+
import type { FieldElement } from '../types/filed'
4+
import { isFieldElement } from './isFieldElement'
5+
import { isHTMLElement, isObject } from './index'
6+
7+
const getValidFormElement = (el: HTMLElement) => el.querySelectorAll('input, textarea, select')[0] as FieldElement
8+
9+
export function getFormEl(elRef: MaybeRef<any> | InputEvent): FieldElement | undefined {
10+
elRef = unref(elRef)
11+
12+
if (isFieldElement(elRef)) {
13+
return elRef
14+
} else if (isHTMLElement(elRef)) {
15+
return getValidFormElement(elRef)
16+
} else if (isObject(elRef)) {
17+
const keys = Reflect.ownKeys(elRef)
18+
for (const key of keys) {
19+
const val = unref(elRef[key])
20+
if (isFieldElement(val)) {
21+
return val
22+
} else if (isHTMLElement(val)) {
23+
return val.querySelectorAll('input, textarea, select')[0] as FieldElement
24+
}
25+
}
26+
}
27+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import type { RegisterOptions, ValidateResult } from '../types/validator'
2+
import type { FieldError } from '../types/errors'
3+
import { isBoolean, isString } from './index'
4+
5+
export function getValidatorError(
6+
result: ValidateResult,
7+
type = 'validate'
8+
): FieldError | undefined {
9+
if (isBoolean(result) && !result) {
10+
return {
11+
type: type as keyof RegisterOptions,
12+
message: isString(result) ? result : '',
13+
}
14+
} else if (isString(result)) {
15+
return {
16+
type: type as keyof RegisterOptions,
17+
message: result,
18+
}
19+
}
20+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
export const isFunction = (val: unknown): val is Function =>
2+
typeof val === 'function'
3+
4+
export const isNumber = (val: unknown): val is number =>
5+
typeof val === 'number' && !Number.isNaN(val)
6+
7+
export const isString = (val: unknown): val is string => typeof val === 'string'
8+
9+
export const isBoolean = (val: unknown): val is Boolean =>
10+
typeof val === 'boolean'
11+
12+
export const isObject = (val: unknown) =>
13+
val !== null && typeof val === 'object'
14+
15+
export const isArray = (val: unknown): val is Array<unknown> =>
16+
Array.isArray(val)
17+
18+
export const isEmptyObject = (val: unknown) =>
19+
isObject(val) && Object.keys(val as object).length === 0
20+
21+
export const isUndefined = (val: unknown): val is undefined =>
22+
typeof val === 'undefined'
23+
24+
export const isNull = (val: unknown): val is null => val === null
25+
26+
export const isNullOrUndefined = (val: unknown) =>
27+
isNull(val) || isUndefined(val)
28+
29+
export const isHTMLElement = (val: unknown): val is HTMLElement =>
30+
val instanceof HTMLElement
31+
32+
export const isEmpty = (val: unknown) =>
33+
val === '' || val === null || val === undefined
34+
35+
export const isRegex = (val: unknown): val is RegExp => val instanceof RegExp
36+
37+
export const isObjectType = (val: unknown) => typeof val === 'object'
38+
39+
export const isPrimitive = (val: unknown) =>
40+
isNullOrUndefined(val) || !isObjectType(val)
41+
42+
export const isDateObject = (val: unknown): val is Date => val instanceof Date
43+
44+
export * from './createHandler'
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export function isFieldElement(el: unknown): el is HTMLInputElement {
2+
return (el as HTMLInputElement) instanceof HTMLInputElement
3+
|| (el as HTMLInputElement) instanceof HTMLTextAreaElement
4+
|| (el as HTMLInputElement) instanceof HTMLSelectElement
5+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export function objectForeach<T extends object>(
2+
object: T,
3+
callback: ([key, val]: [key: keyof T, val: T[keyof T]], index: number, array: [string, any][]) => void,
4+
) {
5+
Object.entries(object).forEach(callback as (value: [string, any], index: number, array: [string, any][]) => void)
6+
}

0 commit comments

Comments
 (0)