/
githubmirror
/
nest
Обзор
Документация
Войти
/
githubmirror
/
nest
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
packages/common/pipes/parse-float.pipe.ts
83 строки
2 KB
Kamil Myśliwiec
feat(common): add parse date pipe, add tsdoc to other pipes
08 ноя 2024, 17:28
Не верифицирован
08 ноя 2024, 17:28
cd7079b
Код
Авторство
О чём код?
import { Injectable, Optional } from '../decorators/core'; import { ArgumentMetadata, HttpStatus } from '../index'; import { PipeTransform } from '../interfaces/features/pipe-transform.interface'; import { ErrorHttpStatusCode, HttpErrorByCode, } from '../utils/http-error-by-code.util'; import { isNil } from '../utils/shared.utils'; /** * @publicApi */ export interface ParseFloatPipeOptions { /** * The HTTP status code to be used in the response when the validation fails. */ errorHttpStatusCode?: ErrorHttpStatusCode; /** * A factory function that returns an exception object to be thrown * if validation fails. * @param error Error message * @returns The exception object */ exceptionFactory?: (error: string) => any; /** * If true, the pipe will return null or undefined if the value is not provided * @default false */ optional?: boolean; } /** * Defines the built-in ParseFloat Pipe * * @see [Built-in Pipes](https://docs.nestjs.com/pipes#built-in-pipes) * * @publicApi */ @Injectable() export class ParseFloatPipe implements PipeTransform<string> { protected exceptionFactory: (error: string) => any; constructor(@Optional() protected readonly options?: ParseFloatPipeOptions) { options = options || {}; const { exceptionFactory, errorHttpStatusCode = HttpStatus.BAD_REQUEST } = options; this.exceptionFactory = exceptionFactory || (error => new HttpErrorByCode[errorHttpStatusCode](error)); } /** * Method that accesses and performs optional transformation on argument for * in-flight requests. * * @param value currently processed route argument * @param metadata contains metadata about the currently processed route argument */ async transform(value: string, metadata: ArgumentMetadata): Promise<number> { if (isNil(value) && this.options?.optional) { return value; } if (!this.isNumeric(value)) { throw this.exceptionFactory( 'Validation failed (numeric string is expected)', ); } return parseFloat(value); } /** * @param value currently processed route argument * @returns `true` if `value` is a valid float number */ protected isNumeric(value: string): boolean { return ( ['string', 'number'].includes(typeof value) && !isNaN(parseFloat(value)) && isFinite(value as any) ); } }