mirror of
https://github.com/Kuingsmile/PicList.git
synced 2026-05-10 17:42:45 +08:00
87 lines
2.3 KiB
TypeScript
87 lines
2.3 KiB
TypeScript
import { isProxy, isRef, toRaw, unref } from 'vue'
|
|
|
|
export const getRawData = (args: any): any => {
|
|
if (args === null || typeof args !== 'object') {
|
|
return args
|
|
}
|
|
const raw = isRef(args) ? unref(args) : isProxy(args) ? toRaw(args) : args
|
|
if (raw instanceof Date) return new Date(raw)
|
|
if (raw instanceof RegExp) return new RegExp(raw)
|
|
if (raw instanceof Map) {
|
|
const result = new Map()
|
|
raw.forEach((value, key) => {
|
|
result.set(getRawData(key), getRawData(value))
|
|
})
|
|
return result
|
|
}
|
|
if (raw instanceof Set) {
|
|
const result = new Set()
|
|
raw.forEach(value => {
|
|
result.add(getRawData(value))
|
|
})
|
|
return result
|
|
}
|
|
if (Array.isArray(raw)) {
|
|
return raw.map(item => getRawData(item))
|
|
}
|
|
if (typeof raw === 'object') {
|
|
const data: Record<string, any> = {}
|
|
for (const key in raw) {
|
|
if (Object.prototype.hasOwnProperty.call(raw, key)) {
|
|
data[key] = getRawData(raw[key])
|
|
}
|
|
}
|
|
return data
|
|
}
|
|
return raw
|
|
}
|
|
|
|
export const isUrl = (url: string): boolean => {
|
|
try {
|
|
return Boolean(new URL(url))
|
|
} catch {
|
|
return false
|
|
}
|
|
}
|
|
|
|
export const isUrlEncode = (url: string): boolean => {
|
|
url = url || ''
|
|
try {
|
|
return url !== decodeURI(url)
|
|
} catch {
|
|
return false
|
|
}
|
|
}
|
|
|
|
export const handleUrlEncode = (url: string): string => (isUrlEncode(url) ? url : encodeURI(url))
|
|
|
|
export const handleStreamlinePluginName = (name: string) => name.replace(/(@[^/]+\/)?picgo-plugin-/, '')
|
|
export const enforceNumber = (num: number | string) => (isNaN(+num) ? 0 : +num)
|
|
|
|
export function isNeedToShorten(alias: string, cutOff = 20) {
|
|
return [...alias].reduce((len, char) => len + (char.charCodeAt(0) > 255 ? 2 : 1), 0) > cutOff
|
|
}
|
|
|
|
export function safeSliceF(str: string, total: number) {
|
|
let result = ''
|
|
let totalLen = 0
|
|
for (const s of str) {
|
|
if (totalLen >= total) {
|
|
break
|
|
}
|
|
result += s
|
|
totalLen += s.charCodeAt(0) > 255 ? 2 : 1
|
|
}
|
|
return result
|
|
}
|
|
|
|
export const formatEndpoint = (endpoint: string, sslEnabled: boolean): string => {
|
|
const hasProtocol = /^https?:\/\//.test(endpoint)
|
|
if (!hasProtocol) {
|
|
return `${sslEnabled ? 'https' : 'http'}://${endpoint}`
|
|
}
|
|
return sslEnabled ? endpoint.replace(/^http:\/\//, 'https://') : endpoint.replace(/^https:\/\//, 'http://')
|
|
}
|
|
|
|
export const trimPath = (path: string) => path.replace(/^\/+|\/+$/g, '').replace(/\/+/g, '/')
|