All files / src/utils validation.util.ts

100% Statements 15/15
100% Branches 28/28
100% Functions 7/7
100% Lines 15/15

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151                          20x                                                                               14x                   13x                             11x                   14x                             10x 3x           7x         7x   7x                             10x 3x           7x         7x   7x        
/**
 * 分页参数验证工具函数
 */
 
import { PAGINATION_DEFAULTS } from '../types';
 
/**
 * 检查值是否为对象类型
 *
 * @param value - 待检查的值
 * @returns 是否为对象类型
 */
function isObject(value: unknown): value is Record<string, unknown> {
  return typeof value === 'object' && value !== null;
}
 
/**
 * Page 风格分页参数
 */
export type PaginationValidationResult = {
  /**
   * 页码
   */
  page: number;
 
  /**
   * 每页数量
   */
  pageSize: number;
};
 
/**
 * Offset 风格分页参数
 */
export type OffsetPaginationValidationResult = {
  /**
   * 限制数量
   */
  limit: number;
 
  /**
   * 偏移量
   */
  offset: number;
};
 
/**
 * 验证页码是否有效
 *
 * @param page - 页码
 * @returns 是否有效
 */
export function isValidPage(page: unknown): page is number {
  return typeof page === 'number' && Number.isInteger(page) && page >= 1;
}
 
/**
 * 验证每页数量是否有效
 *
 * @param pageSize - 每页数量
 * @returns 是否有效
 */
export function isValidPageSize(pageSize: unknown): pageSize is number {
  return (
    typeof pageSize === 'number' &&
    Number.isInteger(pageSize) &&
    pageSize >= PAGINATION_DEFAULTS.minPageSize &&
    pageSize <= PAGINATION_DEFAULTS.maxPageSize
  );
}
 
/**
 * 验证偏移量是否有效
 *
 * @param offset - 偏移量
 * @returns 是否有效
 */
export function isValidOffset(offset: unknown): offset is number {
  return typeof offset === 'number' && Number.isInteger(offset) && offset >= 0;
}
 
/**
 * 验证 limit 是否有效
 *
 * @param limit - 限制数量
 * @returns 是否有效
 */
export function isValidLimit(limit: unknown): limit is number {
  return (
    typeof limit === 'number' &&
    Number.isInteger(limit) &&
    limit >= PAGINATION_DEFAULTS.minPageSize &&
    limit <= PAGINATION_DEFAULTS.maxPageSize
  );
}
 
/**
 * 验证分页参数是否有效
 *
 * @param params - 分页参数
 * @returns 是否有效
 */
export function isValidPagination(params: unknown): params is PaginationValidationResult {
  if (!isObject(params)) {
    return false;
  }
 
  /**
   * 提取的页码
   */
  const page = params.page;
 
  /**
   * 提取的每页数量
   */
  const pageSize = params.pageSize;
 
  return (
    (page === undefined || isValidPage(page)) &&
    (pageSize === undefined || isValidPageSize(pageSize))
  );
}
 
/**
 * 验证 offset 分页参数是否有效
 *
 * @param params - offset 分页参数
 * @returns 是否有效
 */
export function isValidOffsetPagination(
  params: unknown,
): params is OffsetPaginationValidationResult {
  if (!isObject(params)) {
    return false;
  }
 
  /**
   * 提取的限制数量
   */
  const limit = params.limit;
 
  /**
   * 提取的偏移量
   */
  const offset = params.offset;
 
  return (
    (limit === undefined || isValidLimit(limit)) && (offset === undefined || isValidOffset(offset))
  );
}