fedisearch/application/src/lib/transform.ts

59 wiersze
1.4 KiB
TypeScript
Czysty Zwykły widok Historia

2022-01-01 19:37:33 +00:00
import { ZodSchema } from 'zod'
2022-11-03 18:38:01 +00:00
export function preserveUndefined<Source, Target> (cast: (value: Source) => Target) {
return (value: Source | undefined): Target | undefined => {
2022-01-01 19:37:33 +00:00
if (value === undefined) {
return undefined
}
return cast(value)
}
}
2022-11-03 18:38:01 +00:00
export function preserveNull<Source, Target> (cast: (value: Source) => Target) {
return (value: Source | null): Target | null => {
2022-01-01 19:37:33 +00:00
if (value === null) {
return null
}
return cast(value)
}
}
2022-11-03 18:38:01 +00:00
export function undefinedToDefault<Type> (defaultValue: Type): (value: Type | undefined) => Type {
return (value) => typeof value === 'undefined' ? defaultValue : value
}
2022-11-03 18:38:01 +00:00
export function stringTrimmed (value: string | undefined): string {
return (value ?? '').trim().replace(/^\++|\++$/g, '')
}
2022-01-01 19:37:33 +00:00
export function stringToInt (value: string): number {
return parseInt(value)
}
2022-11-03 18:38:01 +00:00
export function stringToBool (value: string): boolean {
2022-01-01 19:37:33 +00:00
switch (value) {
case 'true':
case '1':
case 'on':
case 'yes':
return true
default:
return false
}
}
2022-11-03 18:38:01 +00:00
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export function transform<Target> (originalSchema: ZodSchema<any>, cast: (value: unknown) => Target, newSchema: ZodSchema<any>) {
2022-01-01 19:37:33 +00:00
return originalSchema.refine(
value => {
try {
value = cast(value)
newSchema.parse(value)
} catch (err) {
return false
}
return true
}
).transform(cast)
}