@catbee/utils 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/README.md +1 -4
  2. package/build/esm/config.d.ts +1 -5
  3. package/build/esm/config.js +6 -10
  4. package/build/esm/config.js.map +1 -1
  5. package/build/esm/index.d.ts +20 -19
  6. package/build/esm/index.js +20 -19
  7. package/build/esm/index.js.map +1 -1
  8. package/build/esm/types/api-response.d.ts +2 -2
  9. package/build/esm/types/api-response.js.map +1 -1
  10. package/build/esm/utils/array.utils.d.ts +1 -1
  11. package/build/esm/utils/array.utils.js +17 -27
  12. package/build/esm/utils/array.utils.js.map +1 -1
  13. package/build/esm/utils/async.utils.d.ts +1 -5
  14. package/build/esm/utils/async.utils.js +17 -20
  15. package/build/esm/utils/async.utils.js.map +1 -1
  16. package/build/esm/utils/cache.utils.js +2 -2
  17. package/build/esm/utils/cache.utils.js.map +1 -1
  18. package/build/esm/utils/context-store.utils.d.ts +1 -1
  19. package/build/esm/utils/context-store.utils.js +8 -8
  20. package/build/esm/utils/context-store.utils.js.map +1 -1
  21. package/build/esm/utils/crypto.utils.d.ts +2 -2
  22. package/build/esm/utils/crypto.utils.js +37 -45
  23. package/build/esm/utils/crypto.utils.js.map +1 -1
  24. package/build/esm/utils/decorators.utils.d.ts +2 -18
  25. package/build/esm/utils/decorators.utils.js +31 -31
  26. package/build/esm/utils/decorators.utils.js.map +1 -1
  27. package/build/esm/utils/dir.utils.d.ts +4 -4
  28. package/build/esm/utils/dir.utils.js +18 -20
  29. package/build/esm/utils/dir.utils.js.map +1 -1
  30. package/build/esm/utils/env.utils.js +22 -26
  31. package/build/esm/utils/env.utils.js.map +1 -1
  32. package/build/esm/utils/exception.utils.d.ts +1 -1
  33. package/build/esm/utils/exception.utils.js +26 -29
  34. package/build/esm/utils/exception.utils.js.map +1 -1
  35. package/build/esm/utils/fs.utils.d.ts +3 -3
  36. package/build/esm/utils/fs.utils.js +19 -23
  37. package/build/esm/utils/fs.utils.js.map +1 -1
  38. package/build/esm/utils/http-status-codes.js.map +1 -1
  39. package/build/esm/utils/id.utils.js +8 -8
  40. package/build/esm/utils/id.utils.js.map +1 -1
  41. package/build/esm/utils/logger.utils.d.ts +13 -4
  42. package/build/esm/utils/logger.utils.js +16 -18
  43. package/build/esm/utils/logger.utils.js.map +1 -1
  44. package/build/esm/utils/middleware.utils.d.ts +15 -26
  45. package/build/esm/utils/middleware.utils.js +80 -59
  46. package/build/esm/utils/middleware.utils.js.map +1 -1
  47. package/build/esm/utils/obj.utils.js +16 -27
  48. package/build/esm/utils/obj.utils.js.map +1 -1
  49. package/build/esm/utils/response.utils.d.ts +2 -2
  50. package/build/esm/utils/response.utils.js +11 -11
  51. package/build/esm/utils/response.utils.js.map +1 -1
  52. package/build/esm/utils/string.utils.js +17 -17
  53. package/build/esm/utils/string.utils.js.map +1 -1
  54. package/build/esm/utils/url.utils.js +20 -22
  55. package/build/esm/utils/url.utils.js.map +1 -1
  56. package/build/esm/utils/validate.utils.js +11 -15
  57. package/build/esm/utils/validate.utils.js.map +1 -1
  58. package/build/esnext/config.d.ts +1 -5
  59. package/build/esnext/config.js +6 -10
  60. package/build/esnext/config.js.map +1 -1
  61. package/build/esnext/index.d.ts +20 -19
  62. package/build/esnext/index.js +20 -19
  63. package/build/esnext/index.js.map +1 -1
  64. package/build/esnext/types/api-response.d.ts +2 -2
  65. package/build/esnext/types/api-response.js.map +1 -1
  66. package/build/esnext/utils/array.utils.d.ts +1 -1
  67. package/build/esnext/utils/array.utils.js +23 -31
  68. package/build/esnext/utils/array.utils.js.map +1 -1
  69. package/build/esnext/utils/async.utils.d.ts +1 -5
  70. package/build/esnext/utils/async.utils.js +22 -22
  71. package/build/esnext/utils/async.utils.js.map +1 -1
  72. package/build/esnext/utils/cache.utils.js +3 -3
  73. package/build/esnext/utils/cache.utils.js.map +1 -1
  74. package/build/esnext/utils/context-store.utils.d.ts +1 -1
  75. package/build/esnext/utils/context-store.utils.js +10 -10
  76. package/build/esnext/utils/context-store.utils.js.map +1 -1
  77. package/build/esnext/utils/crypto.utils.d.ts +2 -2
  78. package/build/esnext/utils/crypto.utils.js +37 -47
  79. package/build/esnext/utils/crypto.utils.js.map +1 -1
  80. package/build/esnext/utils/decorators.utils.d.ts +2 -18
  81. package/build/esnext/utils/decorators.utils.js +33 -33
  82. package/build/esnext/utils/decorators.utils.js.map +1 -1
  83. package/build/esnext/utils/dir.utils.d.ts +4 -4
  84. package/build/esnext/utils/dir.utils.js +22 -24
  85. package/build/esnext/utils/dir.utils.js.map +1 -1
  86. package/build/esnext/utils/env.utils.js +24 -26
  87. package/build/esnext/utils/env.utils.js.map +1 -1
  88. package/build/esnext/utils/exception.utils.d.ts +1 -1
  89. package/build/esnext/utils/exception.utils.js +26 -29
  90. package/build/esnext/utils/exception.utils.js.map +1 -1
  91. package/build/esnext/utils/fs.utils.d.ts +3 -3
  92. package/build/esnext/utils/fs.utils.js +21 -25
  93. package/build/esnext/utils/fs.utils.js.map +1 -1
  94. package/build/esnext/utils/http-status-codes.js.map +1 -1
  95. package/build/esnext/utils/id.utils.js +8 -8
  96. package/build/esnext/utils/id.utils.js.map +1 -1
  97. package/build/esnext/utils/logger.utils.d.ts +13 -4
  98. package/build/esnext/utils/logger.utils.js +16 -18
  99. package/build/esnext/utils/logger.utils.js.map +1 -1
  100. package/build/esnext/utils/middleware.utils.d.ts +15 -26
  101. package/build/esnext/utils/middleware.utils.js +78 -59
  102. package/build/esnext/utils/middleware.utils.js.map +1 -1
  103. package/build/esnext/utils/obj.utils.js +17 -26
  104. package/build/esnext/utils/obj.utils.js.map +1 -1
  105. package/build/esnext/utils/response.utils.d.ts +2 -2
  106. package/build/esnext/utils/response.utils.js +11 -11
  107. package/build/esnext/utils/response.utils.js.map +1 -1
  108. package/build/esnext/utils/string.utils.js +17 -17
  109. package/build/esnext/utils/string.utils.js.map +1 -1
  110. package/build/esnext/utils/url.utils.js +21 -23
  111. package/build/esnext/utils/url.utils.js.map +1 -1
  112. package/build/esnext/utils/validate.utils.js +14 -16
  113. package/build/esnext/utils/validate.utils.js.map +1 -1
  114. package/build/src/config.d.ts +1 -5
  115. package/build/src/config.js +5 -9
  116. package/build/src/config.js.map +1 -1
  117. package/build/src/index.d.ts +20 -19
  118. package/build/src/index.js +1 -0
  119. package/build/src/index.js.map +1 -1
  120. package/build/src/types/api-response.d.ts +2 -2
  121. package/build/src/types/api-response.js.map +1 -1
  122. package/build/src/utils/array.utils.d.ts +1 -1
  123. package/build/src/utils/array.utils.js +22 -30
  124. package/build/src/utils/array.utils.js.map +1 -1
  125. package/build/src/utils/async.utils.d.ts +1 -5
  126. package/build/src/utils/async.utils.js +22 -22
  127. package/build/src/utils/async.utils.js.map +1 -1
  128. package/build/src/utils/cache.utils.js +2 -2
  129. package/build/src/utils/cache.utils.js.map +1 -1
  130. package/build/src/utils/context-store.utils.d.ts +1 -1
  131. package/build/src/utils/context-store.utils.js +9 -9
  132. package/build/src/utils/context-store.utils.js.map +1 -1
  133. package/build/src/utils/crypto.utils.d.ts +2 -2
  134. package/build/src/utils/crypto.utils.js +35 -45
  135. package/build/src/utils/crypto.utils.js.map +1 -1
  136. package/build/src/utils/decorators.utils.d.ts +2 -18
  137. package/build/src/utils/decorators.utils.js +32 -32
  138. package/build/src/utils/decorators.utils.js.map +1 -1
  139. package/build/src/utils/dir.utils.d.ts +4 -4
  140. package/build/src/utils/dir.utils.js +16 -18
  141. package/build/src/utils/dir.utils.js.map +1 -1
  142. package/build/src/utils/env.utils.js +22 -24
  143. package/build/src/utils/env.utils.js.map +1 -1
  144. package/build/src/utils/exception.utils.d.ts +1 -1
  145. package/build/src/utils/exception.utils.js +23 -26
  146. package/build/src/utils/exception.utils.js.map +1 -1
  147. package/build/src/utils/fs.utils.d.ts +3 -3
  148. package/build/src/utils/fs.utils.js +15 -19
  149. package/build/src/utils/fs.utils.js.map +1 -1
  150. package/build/src/utils/http-status-codes.js.map +1 -1
  151. package/build/src/utils/id.utils.js +7 -7
  152. package/build/src/utils/id.utils.js.map +1 -1
  153. package/build/src/utils/logger.utils.d.ts +13 -4
  154. package/build/src/utils/logger.utils.js +13 -15
  155. package/build/src/utils/logger.utils.js.map +1 -1
  156. package/build/src/utils/middleware.utils.d.ts +15 -26
  157. package/build/src/utils/middleware.utils.js +72 -52
  158. package/build/src/utils/middleware.utils.js.map +1 -1
  159. package/build/src/utils/obj.utils.js +17 -26
  160. package/build/src/utils/obj.utils.js.map +1 -1
  161. package/build/src/utils/response.utils.d.ts +2 -2
  162. package/build/src/utils/response.utils.js +9 -9
  163. package/build/src/utils/response.utils.js.map +1 -1
  164. package/build/src/utils/string.utils.js +17 -17
  165. package/build/src/utils/string.utils.js.map +1 -1
  166. package/build/src/utils/url.utils.js +20 -22
  167. package/build/src/utils/url.utils.js.map +1 -1
  168. package/build/src/utils/validate.utils.js +14 -16
  169. package/build/src/utils/validate.utils.js.map +1 -1
  170. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"response.utils.js","sourceRoot":"","sources":["../../../src/utils/response.utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"crypto\";\nimport { ApiResponse } from \"../types/api-response\";\nimport { getRequestId } from \"./context-store.utils\";\n\n/**\n * Standard HTTP response wrapper for successful responses.\n * Implements the `ApiResponse<T>` interface and sets default values.\n *\n * @typeParam T - The shape of the data returned in the response.\n */\nexport class SuccessResponse<T> implements ApiResponse<T> {\n /** Message describing the result of the operation. */\n message: string = \"Success\";\n\n /** Whether the response is an error. Always false in success responses. */\n error: boolean = false;\n\n /** The payload returned from the API. */\n data: T | null = null;\n\n /** Timestamp when the response was generated, in ISO format. */\n timestamp: string = new Date().toISOString();\n\n /** Unique identifier for this response, useful for request tracing. */\n requestId: string = getRequestId() ?? randomUUID();\n\n /**\n * Constructs a new success response.\n *\n * @param {string} message - Optional message to override the default.\n * @param {T} [data] - Optional data payload.\n */\n constructor(message: string, data?: T) {\n if (message) this.message = message;\n this.data = data ?? null;\n }\n}\n\n/**\n * Wrapper for error responses that extends the native `Error` object.\n * Implements `ApiResponse` but omits the `data` field (which should not be present in errors).\n */\nexport class ErrorResponse\n extends Error\n implements Omit<ApiResponse<never>, \"data\">\n{\n /** HTTP status code associated with the error (e.g., 404, 500). */\n status: number;\n\n /** Indicates that this is an error. Always true. */\n error: boolean = true;\n\n /** Timestamp when the error occurred, in ISO format. */\n timestamp: string = new Date().toISOString();\n\n /** Unique identifier for this error instance. */\n requestId: string = getRequestId() ?? randomUUID();\n\n /**\n * Constructs a new error response.\n *\n * @param {string} message - The error message to display or log.\n * @param {number} [status=500] - Optional HTTP status code (defaults to 500).\n */\n constructor(message: string, status: number = 500) {\n super(message);\n this.status = status;\n this.name = this.constructor.name;\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\n/**\n * Response with paginated data extending the standard success response.\n * Useful for APIs that return large collections of data.\n *\n * @typeParam T - The shape of each item in the paginated collection.\n */\nexport class PaginatedResponse<T> extends SuccessResponse<T[]> {\n /** Total number of items across all pages */\n total: number;\n\n /** Current page number (1-based) */\n page: number;\n\n /** Number of items per page */\n pageSize: number;\n\n /** Total number of pages */\n totalPages: number;\n\n /** Whether there's a next page available */\n hasNext: boolean;\n\n /** Whether there's a previous page available */\n hasPrevious: boolean;\n\n /**\n * Constructs a new paginated response.\n *\n * @param {T[]} items - The current page of items.\n * @param {Object} pagination - Pagination information.\n * @param {number} pagination.total - Total number of items across all pages.\n * @param {number} pagination.page - Current page number (1-based).\n * @param {number} pagination.pageSize - Number of items per page.\n * @param {string} [message=\"Success\"] - Optional custom message.\n */\n constructor(\n items: T[],\n pagination: { total: number; page: number; pageSize: number },\n message: string = \"Success\",\n ) {\n super(message, items);\n\n this.total = pagination.total;\n this.page = pagination.page;\n this.pageSize = pagination.pageSize;\n\n this.totalPages = Math.ceil(this.total / this.pageSize);\n this.hasNext = this.page < this.totalPages;\n this.hasPrevious = this.page > 1;\n }\n}\n\n/**\n * Specialized response for operations that don't return data (HTTP 204).\n */\nexport class NoContentResponse extends SuccessResponse<null> {\n /**\n * Constructs a new no-content response.\n *\n * @param {string} [message=\"Operation completed successfully\"] - Optional custom message.\n */\n constructor(message: string = \"Operation completed successfully\") {\n super(message, null);\n }\n}\n\n/**\n * Specialized response for redirects.\n */\nexport class RedirectResponse {\n /** The URL to redirect to */\n redirectUrl: string;\n\n /** HTTP status code for the redirect (301, 302, 303, 307, 308) */\n statusCode: number;\n\n /** Whether the response is a redirect */\n isRedirect: boolean = true;\n\n /** Unique identifier for this response */\n requestId: string = getRequestId() ?? randomUUID();\n\n /**\n * Constructs a new redirect response.\n *\n * @param {string} url - The URL to redirect to.\n * @param {number} [statusCode=302] - HTTP status code for the redirect.\n */\n constructor(url: string, statusCode: number = 302) {\n this.redirectUrl = url;\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Creates a standard success response.\n *\n * @typeParam T - The shape of the data returned in the response.\n * @param {T} data - The data to include in the response.\n * @param {string} [message=\"Success\"] - Optional custom message.\n * @returns {SuccessResponse<T>} A properly formatted success response.\n */\nexport function createSuccessResponse<T>(\n data: T,\n message: string = \"Success\",\n): SuccessResponse<T> {\n return new SuccessResponse<T>(message, data);\n}\n\n/**\n * Creates a standard error response.\n *\n * @param {string} message - The error message.\n * @param {number} [statusCode=500] - HTTP status code for the error.\n * @returns {ErrorResponse} A properly formatted error response.\n */\nexport function createErrorResponse(\n message: string,\n statusCode: number = 500,\n): ErrorResponse {\n return new ErrorResponse(message, statusCode);\n}\n\n/**\n * Creates a paginated response from array data.\n *\n * @typeParam T - The shape of each item in the collection.\n * @param {T[]} allItems - The complete array of items to paginate.\n * @param {number} page - The requested page (1-based).\n * @param {number} pageSize - The number of items per page.\n * @param {string} [message=\"Success\"] - Optional custom message.\n * @returns {PaginatedResponse<T>} A properly formatted paginated response.\n */\nexport function createPaginatedResponse<T>(\n allItems: T[],\n page: number,\n pageSize: number,\n message: string = \"Success\",\n): PaginatedResponse<T> {\n // Ensure valid pagination parameters\n const validPage = Math.max(1, page);\n const validPageSize = Math.max(1, pageSize);\n\n // Calculate slice indices\n const startIndex = (validPage - 1) * validPageSize;\n const endIndex = startIndex + validPageSize;\n\n // Get current page items\n const pageItems = allItems.slice(startIndex, endIndex);\n\n return new PaginatedResponse<T>(\n pageItems,\n {\n total: allItems.length,\n page: validPage,\n pageSize: validPageSize,\n },\n message,\n );\n}\n\n/**\n * Adapter to convert API responses to Express.js response format.\n *\n * @param {any} res - Express response object.\n * @param {SuccessResponse<any> | ErrorResponse | RedirectResponse} apiResponse - API response instance.\n */\nexport function sendResponse(\n res: any,\n apiResponse: SuccessResponse<any> | ErrorResponse | RedirectResponse,\n): void {\n // Handle redirects\n if (\"redirectUrl\" in apiResponse) {\n res.redirect(apiResponse.statusCode, apiResponse.redirectUrl);\n return;\n }\n\n // Handle errors\n if (\"error\" in apiResponse && apiResponse.error) {\n const errorResponse = apiResponse as ErrorResponse;\n res.status(errorResponse.status).json({\n error: true,\n message: errorResponse.message,\n timestamp: errorResponse.timestamp,\n requestId: errorResponse.requestId,\n });\n return;\n }\n\n // Handle success responses\n const successResponse = apiResponse as SuccessResponse<any>;\n\n // No content (204) shouldn't return a body\n if (successResponse instanceof NoContentResponse) {\n res.status(204).end();\n return;\n }\n\n res.status(200).json(successResponse);\n}\n"]}
1
+ {"version":3,"file":"response.utils.js","sourceRoot":"","sources":["../../../src/utils/response.utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from 'crypto';\nimport { ApiResponse } from '../types/api-response';\nimport { getRequestId } from './context-store.utils';\n\n/**\n * Standard HTTP response wrapper for successful responses.\n * Implements the `ApiResponse<T>` interface and sets default values.\n *\n * @typeParam T - The shape of the data returned in the response.\n */\nexport class SuccessResponse<T> implements ApiResponse<T> {\n /** Message describing the result of the operation. */\n message: string = 'Success';\n\n /** Whether the response is an error. Always false in success responses. */\n error: boolean = false;\n\n /** The payload returned from the API. */\n data: T | null = null;\n\n /** Timestamp when the response was generated, in ISO format. */\n timestamp: string = new Date().toISOString();\n\n /** Unique identifier for this response, useful for request tracing. */\n requestId: string = getRequestId() ?? randomUUID();\n\n /**\n * Constructs a new success response.\n *\n * @param {string} message - Optional message to override the default.\n * @param {T} [data] - Optional data payload.\n */\n constructor(message: string, data?: T) {\n if (message) this.message = message;\n this.data = data ?? null;\n }\n}\n\n/**\n * Wrapper for error responses that extends the native `Error` object.\n * Implements `ApiResponse` but omits the `data` field (which should not be present in errors).\n */\nexport class ErrorResponse extends Error implements Omit<ApiResponse<never>, 'data'> {\n /** HTTP status code associated with the error (e.g., 404, 500). */\n status: number;\n\n /** Indicates that this is an error. Always true. */\n error: boolean = true;\n\n /** Timestamp when the error occurred, in ISO format. */\n timestamp: string = new Date().toISOString();\n\n /** Unique identifier for this error instance. */\n requestId: string = getRequestId() ?? randomUUID();\n\n /**\n * Constructs a new error response.\n *\n * @param {string} message - The error message to display or log.\n * @param {number} [status=500] - Optional HTTP status code (defaults to 500).\n */\n constructor(message: string, status: number = 500) {\n super(message);\n this.status = status;\n this.name = this.constructor.name;\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\n/**\n * Response with paginated data extending the standard success response.\n * Useful for APIs that return large collections of data.\n *\n * @typeParam T - The shape of each item in the paginated collection.\n */\nexport class PaginatedResponse<T> extends SuccessResponse<T[]> {\n /** Total number of items across all pages */\n total: number;\n\n /** Current page number (1-based) */\n page: number;\n\n /** Number of items per page */\n pageSize: number;\n\n /** Total number of pages */\n totalPages: number;\n\n /** Whether there's a next page available */\n hasNext: boolean;\n\n /** Whether there's a previous page available */\n hasPrevious: boolean;\n\n /**\n * Constructs a new paginated response.\n *\n * @param {T[]} items - The current page of items.\n * @param {Object} pagination - Pagination information.\n * @param {number} pagination.total - Total number of items across all pages.\n * @param {number} pagination.page - Current page number (1-based).\n * @param {number} pagination.pageSize - Number of items per page.\n * @param {string} [message=\"Success\"] - Optional custom message.\n */\n constructor(items: T[], pagination: { total: number; page: number; pageSize: number }, message: string = 'Success') {\n super(message, items);\n\n this.total = pagination.total;\n this.page = pagination.page;\n this.pageSize = pagination.pageSize;\n\n this.totalPages = Math.ceil(this.total / this.pageSize);\n this.hasNext = this.page < this.totalPages;\n this.hasPrevious = this.page > 1;\n }\n}\n\n/**\n * Specialized response for operations that don't return data (HTTP 204).\n */\nexport class NoContentResponse extends SuccessResponse<null> {\n /**\n * Constructs a new no-content response.\n *\n * @param {string} [message=\"Operation completed successfully\"] - Optional custom message.\n */\n constructor(message: string = 'Operation completed successfully') {\n super(message, null);\n }\n}\n\n/**\n * Specialized response for redirects.\n */\nexport class RedirectResponse {\n /** The URL to redirect to */\n redirectUrl: string;\n\n /** HTTP status code for the redirect (301, 302, 303, 307, 308) */\n statusCode: number;\n\n /** Whether the response is a redirect */\n isRedirect: boolean = true;\n\n /** Unique identifier for this response */\n requestId: string = getRequestId() ?? randomUUID();\n\n /**\n * Constructs a new redirect response.\n *\n * @param {string} url - The URL to redirect to.\n * @param {number} [statusCode=302] - HTTP status code for the redirect.\n */\n constructor(url: string, statusCode: number = 302) {\n this.redirectUrl = url;\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Creates a standard success response.\n *\n * @typeParam T - The shape of the data returned in the response.\n * @param {T} data - The data to include in the response.\n * @param {string} [message=\"Success\"] - Optional custom message.\n * @returns {SuccessResponse<T>} A properly formatted success response.\n */\nexport function createSuccessResponse<T>(data: T, message: string = 'Success'): SuccessResponse<T> {\n return new SuccessResponse<T>(message, data);\n}\n\n/**\n * Creates a standard error response.\n *\n * @param {string} message - The error message.\n * @param {number} [statusCode=500] - HTTP status code for the error.\n * @returns {ErrorResponse} A properly formatted error response.\n */\nexport function createErrorResponse(message: string, statusCode: number = 500): ErrorResponse {\n return new ErrorResponse(message, statusCode);\n}\n\n/**\n * Creates a paginated response from array data.\n *\n * @typeParam T - The shape of each item in the collection.\n * @param {T[]} allItems - The complete array of items to paginate.\n * @param {number} page - The requested page (1-based).\n * @param {number} pageSize - The number of items per page.\n * @param {string} [message=\"Success\"] - Optional custom message.\n * @returns {PaginatedResponse<T>} A properly formatted paginated response.\n */\nexport function createPaginatedResponse<T>(\n allItems: T[],\n page: number,\n pageSize: number,\n message: string = 'Success'\n): PaginatedResponse<T> {\n // Ensure valid pagination parameters\n const validPage = Math.max(1, page);\n const validPageSize = Math.max(1, pageSize);\n\n // Calculate slice indices\n const startIndex = (validPage - 1) * validPageSize;\n const endIndex = startIndex + validPageSize;\n\n // Get current page items\n const pageItems = allItems.slice(startIndex, endIndex);\n\n return new PaginatedResponse<T>(\n pageItems,\n {\n total: allItems.length,\n page: validPage,\n pageSize: validPageSize\n },\n message\n );\n}\n\n/**\n * Adapter to convert API responses to Express.js response format.\n *\n * @param {any} res - Express response object.\n * @param {SuccessResponse<any> | ErrorResponse | RedirectResponse} apiResponse - API response instance.\n */\nexport function sendResponse(res: any, apiResponse: SuccessResponse<any> | ErrorResponse | RedirectResponse): void {\n // Handle redirects\n if ('redirectUrl' in apiResponse) {\n res.redirect(apiResponse.statusCode, apiResponse.redirectUrl);\n return;\n }\n\n // Handle errors\n if ('error' in apiResponse && apiResponse.error) {\n const errorResponse = apiResponse as ErrorResponse;\n res.status(errorResponse.status).json({\n error: true,\n message: errorResponse.message,\n timestamp: errorResponse.timestamp,\n requestId: errorResponse.requestId\n });\n return;\n }\n\n // Handle success responses\n const successResponse = apiResponse as SuccessResponse<any>;\n\n // No content (204) shouldn't return a body\n if (successResponse instanceof NoContentResponse) {\n res.status(204).end();\n return;\n }\n\n res.status(200).json(successResponse);\n}\n"]}
@@ -19,7 +19,7 @@ exports.countOccurrences = countOccurrences;
19
19
  * @returns {string} The string with the first character in uppercase.
20
20
  */
21
21
  function capitalize(str) {
22
- return str.length === 0 ? "" : str.charAt(0).toUpperCase() + str.slice(1);
22
+ return str.length === 0 ? '' : str.charAt(0).toUpperCase() + str.slice(1);
23
23
  }
24
24
  /**
25
25
  * Converts a string to kebab-case (e.g., "FooBar test" → "foo-bar-test").
@@ -29,9 +29,9 @@ function capitalize(str) {
29
29
  */
30
30
  function toKebabCase(str) {
31
31
  return str
32
- .replace(/([a-z])([A-Z])/g, "$1-$2") // camelCase -> camel-Case
33
- .replace(/\s+/g, "-") // spaces to dash
34
- .replace(/_+/g, "-") // underscores to dash
32
+ .replace(/([a-z])([A-Z])/g, '$1-$2') // camelCase -> camel-Case
33
+ .replace(/\s+/g, '-') // spaces to dash
34
+ .replace(/_+/g, '-') // underscores to dash
35
35
  .toLowerCase();
36
36
  }
37
37
  /**
@@ -52,10 +52,10 @@ function toCamelCase(str) {
52
52
  function slugify(str) {
53
53
  return str
54
54
  .toLowerCase()
55
- .replace(/[^\w\s-]/g, "") // remove non-word
56
- .replace(/\s+/g, "-") // spaces to dash
57
- .replace(/-+/g, "-") // multiple dashes to one
58
- .replace(/^-+|-+$/g, ""); // trim leading/trailing dashes
55
+ .replace(/[^\w\s-]/g, '') // remove non-word
56
+ .replace(/\s+/g, '-') // spaces to dash
57
+ .replace(/-+/g, '-') // multiple dashes to one
58
+ .replace(/^-+|-+$/g, ''); // trim leading/trailing dashes
59
59
  }
60
60
  /**
61
61
  * Truncates a string to a specific length, appending '...' if truncated.
@@ -65,7 +65,7 @@ function slugify(str) {
65
65
  * @returns {string} The truncated string.
66
66
  */
67
67
  function truncate(str, len) {
68
- return str.length > len ? str.slice(0, len) + "..." : str;
68
+ return str.length > len ? str.slice(0, len) + '...' : str;
69
69
  }
70
70
  /**
71
71
  * Converts a string to PascalCase (e.g., "foo-bar" → "FooBar").
@@ -85,9 +85,9 @@ function toPascalCase(str) {
85
85
  function toSnakeCase(str) {
86
86
  return str
87
87
  .trim()
88
- .replace(/([a-z])([A-Z])/g, "$1_$2") // camelCase -> camel_Case
89
- .replace(/\s+/g, "_") // spaces to underscore
90
- .replace(/-+/g, "_") // dashes to underscore
88
+ .replace(/([a-z])([A-Z])/g, '$1_$2') // camelCase -> camel_Case
89
+ .replace(/\s+/g, '_') // spaces to underscore
90
+ .replace(/-+/g, '_') // dashes to underscore
91
91
  .toLowerCase();
92
92
  }
93
93
  /**
@@ -100,13 +100,13 @@ function toSnakeCase(str) {
100
100
  * @param {string} [maskChar="*"] - Character to use for masking.
101
101
  * @returns {string} The masked string.
102
102
  */
103
- function mask(str, visibleStart = 0, visibleEnd = 0, maskChar = "*") {
103
+ function mask(str, visibleStart = 0, visibleEnd = 0, maskChar = '*') {
104
104
  if (!str || str.length === 0)
105
- return "";
105
+ return '';
106
106
  if (visibleStart >= str.length)
107
107
  return str;
108
108
  const start = str.slice(0, visibleStart);
109
- const end = visibleEnd > 0 ? str.slice(-visibleEnd) : "";
109
+ const end = visibleEnd > 0 ? str.slice(-visibleEnd) : '';
110
110
  const masked = maskChar.repeat(Math.max(0, str.length - visibleStart - visibleEnd));
111
111
  return start + masked + end;
112
112
  }
@@ -117,7 +117,7 @@ function mask(str, visibleStart = 0, visibleEnd = 0, maskChar = "*") {
117
117
  * @returns {string} The string with HTML tags removed.
118
118
  */
119
119
  function stripHtml(str) {
120
- return str.replace(/<[^>]*>/g, "");
120
+ return str.replace(/<[^>]*>/g, '');
121
121
  }
122
122
  /**
123
123
  * Performs case-insensitive string comparison.
@@ -136,7 +136,7 @@ function equalsIgnoreCase(a, b) {
136
136
  * @returns {string} The reversed string.
137
137
  */
138
138
  function reverse(str) {
139
- return str.split("").reverse().join("");
139
+ return str.split('').reverse().join('');
140
140
  }
141
141
  /**
142
142
  * Counts occurrences of a substring within a string.
@@ -1 +1 @@
1
- {"version":3,"file":"string.utils.js","sourceRoot":"","sources":["../../../src/utils/string.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Capitalizes the first character of a string.\n *\n * @param {string} str - The input string.\n * @returns {string} The string with the first character in uppercase.\n */\nexport function capitalize(str: string): string {\n return str.length === 0 ? \"\" : str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Converts a string to kebab-case (e.g., \"FooBar test\" → \"foo-bar-test\").\n *\n * @param {string} str - The input string.\n * @returns {string} The kebab-cased string.\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, \"$1-$2\") // camelCase -> camel-Case\n .replace(/\\s+/g, \"-\") // spaces to dash\n .replace(/_+/g, \"-\") // underscores to dash\n .toLowerCase();\n}\n\n/**\n * Converts a kebab-case or snake_case string to camelCase.\n *\n * @param {string} str - The input string.\n * @returns {string} The camelCased string.\n */\nexport function toCamelCase(str: string): string {\n return str.replace(/[-_](.)/g, (_, c: string) => c.toUpperCase());\n}\n\n/**\n * Converts a string to a URL-friendly slug (lowercase, dashes, alphanumeric).\n *\n * @param {string} str - The input string.\n * @returns {string} The slugified string.\n */\nexport function slugify(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, \"\") // remove non-word\n .replace(/\\s+/g, \"-\") // spaces to dash\n .replace(/-+/g, \"-\") // multiple dashes to one\n .replace(/^-+|-+$/g, \"\"); // trim leading/trailing dashes\n}\n\n/**\n * Truncates a string to a specific length, appending '...' if truncated.\n *\n * @param {string} str - The input string.\n * @param {number} len - The maximum length.\n * @returns {string} The truncated string.\n */\nexport function truncate(str: string, len: number): string {\n return str.length > len ? str.slice(0, len) + \"...\" : str;\n}\n\n/**\n * Converts a string to PascalCase (e.g., \"foo-bar\" → \"FooBar\").\n *\n * @param {string} str - The input string.\n * @returns {string} The PascalCased string.\n */\nexport function toPascalCase(str: string): string {\n return capitalize(toCamelCase(str));\n}\n\n/**\n * Converts a string to snake_case (e.g., \"FooBar test\" → \"foo_bar_test\").\n *\n * @param {string} str - The input string.\n * @returns {string} The snake_cased string.\n */\nexport function toSnakeCase(str: string): string {\n return str\n .trim()\n .replace(/([a-z])([A-Z])/g, \"$1_$2\") // camelCase -> camel_Case\n .replace(/\\s+/g, \"_\") // spaces to underscore\n .replace(/-+/g, \"_\") // dashes to underscore\n .toLowerCase();\n}\n\n/**\n * Masks a string by replacing characters with a mask character.\n * Useful for hiding sensitive information like credit cards or passwords.\n *\n * @param {string} str - The string to mask.\n * @param {number} [visibleStart=0] - Number of characters to show at start.\n * @param {number} [visibleEnd=0] - Number of characters to show at end.\n * @param {string} [maskChar=\"*\"] - Character to use for masking.\n * @returns {string} The masked string.\n */\nexport function mask(\n str: string,\n visibleStart: number = 0,\n visibleEnd: number = 0,\n maskChar: string = \"*\",\n): string {\n if (!str || str.length === 0) return \"\";\n if (visibleStart >= str.length) return str;\n\n const start = str.slice(0, visibleStart);\n const end = visibleEnd > 0 ? str.slice(-visibleEnd) : \"\";\n const masked = maskChar.repeat(\n Math.max(0, str.length - visibleStart - visibleEnd),\n );\n\n return start + masked + end;\n}\n\n/**\n * Removes all HTML tags from a string.\n *\n * @param {string} str - The HTML string to process.\n * @returns {string} The string with HTML tags removed.\n */\nexport function stripHtml(str: string): string {\n return str.replace(/<[^>]*>/g, \"\");\n}\n\n/**\n * Performs case-insensitive string comparison.\n *\n * @param {string} a - First string.\n * @param {string} b - Second string.\n * @returns {boolean} True if the strings are equal ignoring case.\n */\nexport function equalsIgnoreCase(a: string, b: string): boolean {\n return a.toLowerCase() === b.toLowerCase();\n}\n\n/**\n * Reverses a string.\n *\n * @param {string} str - The string to reverse.\n * @returns {string} The reversed string.\n */\nexport function reverse(str: string): string {\n return str.split(\"\").reverse().join(\"\");\n}\n\n/**\n * Counts occurrences of a substring within a string.\n *\n * @param {string} str - The source string.\n * @param {string} substring - The substring to count.\n * @param {boolean} [caseSensitive=true] - Whether to perform case-sensitive counting.\n * @returns {number} Number of occurrences.\n */\nexport function countOccurrences(\n str: string,\n substring: string,\n caseSensitive: boolean = true,\n): number {\n if (!caseSensitive) {\n str = str.toLowerCase();\n substring = substring.toLowerCase();\n }\n\n return str.split(substring).length - 1;\n}\n"]}
1
+ {"version":3,"file":"string.utils.js","sourceRoot":"","sources":["../../../src/utils/string.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Capitalizes the first character of a string.\n *\n * @param {string} str - The input string.\n * @returns {string} The string with the first character in uppercase.\n */\nexport function capitalize(str: string): string {\n return str.length === 0 ? '' : str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Converts a string to kebab-case (e.g., \"FooBar test\" → \"foo-bar-test\").\n *\n * @param {string} str - The input string.\n * @returns {string} The kebab-cased string.\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2') // camelCase -> camel-Case\n .replace(/\\s+/g, '-') // spaces to dash\n .replace(/_+/g, '-') // underscores to dash\n .toLowerCase();\n}\n\n/**\n * Converts a kebab-case or snake_case string to camelCase.\n *\n * @param {string} str - The input string.\n * @returns {string} The camelCased string.\n */\nexport function toCamelCase(str: string): string {\n return str.replace(/[-_](.)/g, (_, c: string) => c.toUpperCase());\n}\n\n/**\n * Converts a string to a URL-friendly slug (lowercase, dashes, alphanumeric).\n *\n * @param {string} str - The input string.\n * @returns {string} The slugified string.\n */\nexport function slugify(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, '') // remove non-word\n .replace(/\\s+/g, '-') // spaces to dash\n .replace(/-+/g, '-') // multiple dashes to one\n .replace(/^-+|-+$/g, ''); // trim leading/trailing dashes\n}\n\n/**\n * Truncates a string to a specific length, appending '...' if truncated.\n *\n * @param {string} str - The input string.\n * @param {number} len - The maximum length.\n * @returns {string} The truncated string.\n */\nexport function truncate(str: string, len: number): string {\n return str.length > len ? str.slice(0, len) + '...' : str;\n}\n\n/**\n * Converts a string to PascalCase (e.g., \"foo-bar\" → \"FooBar\").\n *\n * @param {string} str - The input string.\n * @returns {string} The PascalCased string.\n */\nexport function toPascalCase(str: string): string {\n return capitalize(toCamelCase(str));\n}\n\n/**\n * Converts a string to snake_case (e.g., \"FooBar test\" → \"foo_bar_test\").\n *\n * @param {string} str - The input string.\n * @returns {string} The snake_cased string.\n */\nexport function toSnakeCase(str: string): string {\n return str\n .trim()\n .replace(/([a-z])([A-Z])/g, '$1_$2') // camelCase -> camel_Case\n .replace(/\\s+/g, '_') // spaces to underscore\n .replace(/-+/g, '_') // dashes to underscore\n .toLowerCase();\n}\n\n/**\n * Masks a string by replacing characters with a mask character.\n * Useful for hiding sensitive information like credit cards or passwords.\n *\n * @param {string} str - The string to mask.\n * @param {number} [visibleStart=0] - Number of characters to show at start.\n * @param {number} [visibleEnd=0] - Number of characters to show at end.\n * @param {string} [maskChar=\"*\"] - Character to use for masking.\n * @returns {string} The masked string.\n */\nexport function mask(str: string, visibleStart: number = 0, visibleEnd: number = 0, maskChar: string = '*'): string {\n if (!str || str.length === 0) return '';\n if (visibleStart >= str.length) return str;\n\n const start = str.slice(0, visibleStart);\n const end = visibleEnd > 0 ? str.slice(-visibleEnd) : '';\n const masked = maskChar.repeat(Math.max(0, str.length - visibleStart - visibleEnd));\n\n return start + masked + end;\n}\n\n/**\n * Removes all HTML tags from a string.\n *\n * @param {string} str - The HTML string to process.\n * @returns {string} The string with HTML tags removed.\n */\nexport function stripHtml(str: string): string {\n return str.replace(/<[^>]*>/g, '');\n}\n\n/**\n * Performs case-insensitive string comparison.\n *\n * @param {string} a - First string.\n * @param {string} b - Second string.\n * @returns {boolean} True if the strings are equal ignoring case.\n */\nexport function equalsIgnoreCase(a: string, b: string): boolean {\n return a.toLowerCase() === b.toLowerCase();\n}\n\n/**\n * Reverses a string.\n *\n * @param {string} str - The string to reverse.\n * @returns {string} The reversed string.\n */\nexport function reverse(str: string): string {\n return str.split('').reverse().join('');\n}\n\n/**\n * Counts occurrences of a substring within a string.\n *\n * @param {string} str - The source string.\n * @param {string} substring - The substring to count.\n * @param {boolean} [caseSensitive=true] - Whether to perform case-sensitive counting.\n * @returns {number} Number of occurrences.\n */\nexport function countOccurrences(str: string, substring: string, caseSensitive: boolean = true): number {\n if (!caseSensitive) {\n str = str.toLowerCase();\n substring = substring.toLowerCase();\n }\n\n return str.split(substring).length - 1;\n}\n"]}
@@ -41,7 +41,7 @@ function appendQueryParams(url, params) {
41
41
  * // → { page: '1', limit: '10' }
42
42
  */
43
43
  function parseQueryString(query) {
44
- const cleanQuery = query.startsWith("?") ? query.slice(1) : query;
44
+ const cleanQuery = query.startsWith('?') ? query.slice(1) : query;
45
45
  // Object.fromEntries guarantees string values in result
46
46
  return Object.fromEntries(new url_1.URLSearchParams(cleanQuery));
47
47
  }
@@ -57,7 +57,7 @@ function isValidUrl(url, requireHttps = false) {
57
57
  const parsedUrl = new url_1.URL(url);
58
58
  if (!parsedUrl.protocol || !parsedUrl.hostname)
59
59
  return false;
60
- if (requireHttps && parsedUrl.protocol !== "https:")
60
+ if (requireHttps && parsedUrl.protocol !== 'https:')
61
61
  return false;
62
62
  return true;
63
63
  }
@@ -86,19 +86,19 @@ function getDomain(url, removeSubdomains = false) {
86
86
  return hostname;
87
87
  }
88
88
  // Extract root domain (remove subdomains)
89
- const parts = hostname.split(".");
89
+ const parts = hostname.split('.');
90
90
  if (parts.length <= 2)
91
91
  return hostname;
92
92
  // Handle special cases like co.in, com.au
93
- const secondLevelDomains = ["co", "com", "org", "net", "gov", "edu", "ac"];
93
+ const secondLevelDomains = ['co', 'com', 'org', 'net', 'gov', 'edu', 'ac'];
94
94
  const sld = parts[parts.length - 2];
95
95
  if (secondLevelDomains.includes(sld) && parts.length > 2) {
96
- return parts.slice(-3).join(".");
96
+ return parts.slice(-3).join('.');
97
97
  }
98
- return parts.slice(-2).join(".");
98
+ return parts.slice(-2).join('.');
99
99
  }
100
100
  catch (_a) {
101
- return "";
101
+ return '';
102
102
  }
103
103
  }
104
104
  /**
@@ -113,16 +113,16 @@ function getDomain(url, removeSubdomains = false) {
113
113
  */
114
114
  function joinPaths(...segments) {
115
115
  let result = segments
116
- .filter((s) => s !== undefined && s !== null)
116
+ .filter(s => s !== undefined && s !== null)
117
117
  .map((segment, index) => {
118
118
  if (index === 0)
119
- return segment.replace(/\/+$/, "");
120
- return segment.replace(/^\/+|\/+$/g, "");
119
+ return segment.replace(/\/+$/, '');
120
+ return segment.replace(/^\/+|\/+$/g, '');
121
121
  })
122
122
  .filter(Boolean)
123
- .join("/");
124
- if (segments[0] === "" && !result.startsWith("/"))
125
- result = "/" + result;
123
+ .join('/');
124
+ if (segments[0] === '' && !result.startsWith('/'))
125
+ result = '/' + result;
126
126
  return result;
127
127
  }
128
128
  /**
@@ -139,14 +139,14 @@ function joinPaths(...segments) {
139
139
  function normalizeUrl(url, base) {
140
140
  try {
141
141
  // Handle protocol-relative URLs
142
- if (url.startsWith("//")) {
142
+ if (url.startsWith('//')) {
143
143
  url = `https:${url}`;
144
144
  }
145
145
  // Resolve relative URLs against a base
146
146
  const parsedUrl = base ? new url_1.URL(url, base) : new url_1.URL(url);
147
147
  // Normalize
148
- parsedUrl.pathname = parsedUrl.pathname.replace(/\/+/g, "/"); // Collapse multiple slashes
149
- parsedUrl.pathname = parsedUrl.pathname.replace(/\/+$/, ""); // Remove trailing slash
148
+ parsedUrl.pathname = parsedUrl.pathname.replace(/\/+/g, '/'); // Collapse multiple slashes
149
+ parsedUrl.pathname = parsedUrl.pathname.replace(/\/+$/, ''); // Remove trailing slash
150
150
  parsedUrl.hostname = parsedUrl.hostname.toLowerCase();
151
151
  return parsedUrl.toString();
152
152
  }
@@ -176,9 +176,7 @@ function createUrlBuilder(baseUrl) {
176
176
  */
177
177
  path(path, params) {
178
178
  const url = joinPaths(baseUrl, path);
179
- return params
180
- ? appendQueryParams(url, params)
181
- : url;
179
+ return params ? appendQueryParams(url, params) : url;
182
180
  },
183
181
  /**
184
182
  * Creates a full URL with query parameters but no additional path.
@@ -188,7 +186,7 @@ function createUrlBuilder(baseUrl) {
188
186
  */
189
187
  query(params) {
190
188
  return appendQueryParams(baseUrl, params);
191
- },
189
+ }
192
190
  };
193
191
  }
194
192
  /**
@@ -247,12 +245,12 @@ function getExtension(url) {
247
245
  try {
248
246
  const { pathname } = new url_1.URL(url);
249
247
  const match = pathname.match(/\.([^./\\?#]+)$/);
250
- return match ? match[1].toLowerCase() : "";
248
+ return match ? match[1].toLowerCase() : '';
251
249
  }
252
250
  catch (_a) {
253
251
  // If URL parsing fails, try a simpler approach
254
252
  const match = url.match(/\.([^./\\?#]+)$/);
255
- return match ? match[1].toLowerCase() : "";
253
+ return match ? match[1].toLowerCase() : '';
256
254
  }
257
255
  }
258
256
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"url.utils.js","sourceRoot":"","sources":["../../../src/utils/url.utils.ts"],"names":[],"mappings":";;AAaA,8CASC;AAYD,4CAOC;AASD,gCAYC;AAgBD,8BA2BC;AAYD,8BAWC;AAaD,oCAmBC;AAaD,4CA6BC;AASD,gDAmBC;AASD,8CAeC;AAYD,oCAUC;AAiBD,sDAwBC;AA7TD,6BAA2C;AAE3C;;;;;;;;;;GAUG;AACH,SAAgB,iBAAiB,CAC/B,GAAW,EACX,MAAuC;IAEvC,MAAM,MAAM,GAAG,IAAI,SAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,gBAAgB,CAAC,KAAa;IAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,wDAAwD;IACxD,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,qBAAe,CAAC,UAAU,CAAC,CAGxD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,UAAU,CACxB,GAAW,EACX,eAAwB,KAAK;IAE7B,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,SAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC7D,IAAI,YAAY,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAgB,SAAS,CACvB,GAAW,EACX,mBAA4B,KAAK;IAEjC,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,SAAG,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,0CAA0C;QAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,QAAQ,CAAC;QAEvC,0CAA0C;QAC1C,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3E,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEpC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,SAAS,CAAC,GAAG,QAAkB;IAC7C,IAAI,MAAM,GAAG,QAAQ;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC;SAC5C,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QACtB,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACpD,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC;IACzE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,YAAY,CAAC,GAAW,EAAE,IAAa;IACrD,IAAI,CAAC;QACH,gCAAgC;QAChC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,GAAG,GAAG,SAAS,GAAG,EAAE,CAAC;QACvB,CAAC;QAED,uCAAuC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,SAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,SAAG,CAAC,GAAG,CAAC,CAAC;QAE3D,YAAY;QACZ,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,4BAA4B;QAC1F,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,wBAAwB;QACrF,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAEtD,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,GAAG,CAAC,CAAC,6BAA6B;IAC3C,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,gBAAgB,CAAC,OAAe;IAC9C,OAAO;QACL;;;;;;WAMG;QACH,IAAI,CAAC,IAAY,EAAE,MAA4B;YAC7C,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,OAAO,MAAM;gBACX,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAyC,CAAC;gBACnE,CAAC,CAAC,GAAG,CAAC;QACV,CAAC;QAED;;;;;WAKG;QACH,KAAK,CAAC,MAA2B;YAC/B,OAAO,iBAAiB,CACtB,OAAO,EACP,MAAyC,CAC1C,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAChC,GAAW,EACX,UAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,SAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,MAAM,GAA2B,EAAE,CAAC;QAE1C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAC/B,GAAW,EACX,cAAwB;IAExB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,SAAG,CAAC,GAAG,CAAC,CAAC;QAE/B,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,YAAY,CAAC,GAAW;IACtC,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,SAAG,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,CAAC;IAAC,WAAM,CAAC;QACP,+CAA+C;QAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,qBAAqB,CACnC,GAAW,EACX,UAAkD;IAElD,IAAI,CAAC;QACH,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,SAAG,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,EAAgB,CAAC;QAEhC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YAClD,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;gBACpC,IAAI,CAAC;oBACH,MAAM,CAAC,GAAc,CAAC,GAAG,UAAU,CAAC,GAAc,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC7D,CAAC;gBAAC,WAAM,CAAC;oBACP,2BAA2B;gBAC7B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAc,CAAC,GAAG,KAAY,CAAC;YACxC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC","sourcesContent":["import { URL, URLSearchParams } from \"url\";\n\n/**\n * Appends query parameters to a given URL.\n *\n * @param {string} url - The base URL to which query parameters will be appended.\n * @param {Record<string, string | number>} params - Key-value pairs to add as query parameters.\n * @returns {string} The new URL string with query parameters appended.\n *\n * @example\n * appendQueryParams('https://example.com', { page: 1, limit: 10 });\n * // → 'https://example.com/?page=1&limit=10'\n */\nexport function appendQueryParams(\n url: string,\n params: Record<string, string | number>,\n): string {\n const urlObj = new URL(url);\n for (const [key, value] of Object.entries(params)) {\n urlObj.searchParams.set(key, value.toString());\n }\n return urlObj.toString();\n}\n\n/**\n * Parses a query string into a key-value object.\n *\n * @param {string} query - The query string (with or without leading '?').\n * @returns {Record<string, string>} Object representing parsed query parameters.\n *\n * @example\n * parseQueryString('?page=1&limit=10');\n * // → { page: '1', limit: '10' }\n */\nexport function parseQueryString(query: string): Record<string, string> {\n const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n // Object.fromEntries guarantees string values in result\n return Object.fromEntries(new URLSearchParams(cleanQuery)) as Record<\n string,\n string\n >;\n}\n\n/**\n * Validates if a string is a valid URL.\n *\n * @param {string} url - The URL string to validate.\n * @param {boolean} [requireHttps=false] - If true, requires the URL to use HTTPS.\n * @returns {boolean} True if the URL is valid, false otherwise.\n */\nexport function isValidUrl(\n url: string,\n requireHttps: boolean = false,\n): boolean {\n try {\n const parsedUrl = new URL(url);\n if (!parsedUrl.protocol || !parsedUrl.hostname) return false;\n if (requireHttps && parsedUrl.protocol !== \"https:\") return false;\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Extracts the domain name from a URL.\n *\n * @param {string} url - The URL to extract the domain from.\n * @param {boolean} [removeSubdomains=false] - If true, removes subdomains (returns root domain only).\n * @returns {string} The domain name.\n *\n * @example\n * getDomain('https://api.example.com/path');\n * // → 'api.example.com'\n *\n * getDomain('https://api.example.com/path', true);\n * // → 'example.com'\n */\nexport function getDomain(\n url: string,\n removeSubdomains: boolean = false,\n): string {\n try {\n const { hostname } = new URL(url);\n\n if (!removeSubdomains) {\n return hostname;\n }\n\n // Extract root domain (remove subdomains)\n const parts = hostname.split(\".\");\n if (parts.length <= 2) return hostname;\n\n // Handle special cases like co.in, com.au\n const secondLevelDomains = [\"co\", \"com\", \"org\", \"net\", \"gov\", \"edu\", \"ac\"];\n const sld = parts[parts.length - 2];\n\n if (secondLevelDomains.includes(sld) && parts.length > 2) {\n return parts.slice(-3).join(\".\");\n }\n\n return parts.slice(-2).join(\".\");\n } catch {\n return \"\";\n }\n}\n\n/**\n * Joins URL paths properly handling slashes.\n *\n * @param {...string[]} segments - URL path segments to join.\n * @returns {string} Joined URL path.\n *\n * @example\n * joinPaths('https://example.com/', '/api/', '/users');\n * // → 'https://example.com/api/users'\n */\nexport function joinPaths(...segments: string[]): string {\n let result = segments\n .filter((s) => s !== undefined && s !== null)\n .map((segment, index) => {\n if (index === 0) return segment.replace(/\\/+$/, \"\");\n return segment.replace(/^\\/+|\\/+$/g, \"\");\n })\n .filter(Boolean)\n .join(\"/\");\n if (segments[0] === \"\" && !result.startsWith(\"/\")) result = \"/\" + result;\n return result;\n}\n\n/**\n * Normalizes a URL by resolving relative paths, handling protocol-relative URLs, etc.\n *\n * @param {string} url - The URL to normalize.\n * @param {string} [base] - Optional base URL for resolving relative URLs.\n * @returns {string} Normalized URL.\n *\n * @example\n * normalizeUrl('HTTP://Example.COM/foo/../bar');\n * // → 'http://example.com/bar'\n */\nexport function normalizeUrl(url: string, base?: string): string {\n try {\n // Handle protocol-relative URLs\n if (url.startsWith(\"//\")) {\n url = `https:${url}`;\n }\n\n // Resolve relative URLs against a base\n const parsedUrl = base ? new URL(url, base) : new URL(url);\n\n // Normalize\n parsedUrl.pathname = parsedUrl.pathname.replace(/\\/+/g, \"/\"); // Collapse multiple slashes\n parsedUrl.pathname = parsedUrl.pathname.replace(/\\/+$/, \"\"); // Remove trailing slash\n parsedUrl.hostname = parsedUrl.hostname.toLowerCase();\n\n return parsedUrl.toString();\n } catch {\n return url; // Return original if invalid\n }\n}\n\n/**\n * Creates a URL builder for constructing URLs with a base URL.\n *\n * @param {string} baseUrl - The base URL to build upon.\n * @returns {Object} URL builder methods.\n *\n * @example\n * const api = createUrlBuilder('https://api.example.com');\n * api.path('/users', { active: true });\n * // → 'https://api.example.com/users?active=true'\n */\nexport function createUrlBuilder(baseUrl: string) {\n return {\n /**\n * Creates a full URL with the given path and query parameters.\n *\n * @param {string} path - The path to append to the base URL.\n * @param {Record<string, any>} [params] - Query parameters to add.\n * @returns {string} The complete URL.\n */\n path(path: string, params?: Record<string, any>): string {\n const url = joinPaths(baseUrl, path);\n return params\n ? appendQueryParams(url, params as Record<string, string | number>)\n : url;\n },\n\n /**\n * Creates a full URL with query parameters but no additional path.\n *\n * @param {Record<string, any>} params - Query parameters to add.\n * @returns {string} The complete URL with query parameters.\n */\n query(params: Record<string, any>): string {\n return appendQueryParams(\n baseUrl,\n params as Record<string, string | number>,\n );\n },\n };\n}\n\n/**\n * Extracts specific query parameters from a URL.\n *\n * @param {string} url - The URL to extract parameters from.\n * @param {string[]} paramNames - Names of parameters to extract.\n * @returns {Record<string, string>} Object containing the extracted parameters.\n */\nexport function extractQueryParams(\n url: string,\n paramNames: string[],\n): Record<string, string> {\n try {\n const parsedUrl = new URL(url);\n const result: Record<string, string> = {};\n\n for (const name of paramNames) {\n const value = parsedUrl.searchParams.get(name);\n if (value !== null) {\n result[name] = value;\n }\n }\n\n return result;\n } catch {\n return {};\n }\n}\n\n/**\n * Removes specified query parameters from a URL.\n *\n * @param {string} url - The URL to modify.\n * @param {string[]} paramsToRemove - Names of parameters to remove.\n * @returns {string} URL with parameters removed.\n */\nexport function removeQueryParams(\n url: string,\n paramsToRemove: string[],\n): string {\n try {\n const parsedUrl = new URL(url);\n\n for (const param of paramsToRemove) {\n parsedUrl.searchParams.delete(param);\n }\n\n return parsedUrl.toString();\n } catch {\n return url;\n }\n}\n\n/**\n * Gets the file extension from a URL path.\n *\n * @param {string} url - The URL to examine.\n * @returns {string} The file extension (without dot) or empty string if none found.\n *\n * @example\n * getExtension('https://example.com/document.pdf?v=1');\n * // → 'pdf'\n */\nexport function getExtension(url: string): string {\n try {\n const { pathname } = new URL(url);\n const match = pathname.match(/\\.([^./\\\\?#]+)$/);\n return match ? match[1].toLowerCase() : \"\";\n } catch {\n // If URL parsing fails, try a simpler approach\n const match = url.match(/\\.([^./\\\\?#]+)$/);\n return match ? match[1].toLowerCase() : \"\";\n }\n}\n\n/**\n * Parses URL query parameters into a strongly-typed object.\n *\n * @template T Expected type of the query parameters\n * @param {string} url - The URL to parse.\n * @param {Record<keyof T, (val: string) => any>} [converters] - Type converters for params.\n * @returns {Partial<T>} Typed query parameters.\n *\n * @example\n * parseTypedQueryParams<{page: number, q: string}>('https://example.com?page=2&q=test', {\n * page: Number,\n * q: String\n * });\n * // → { page: 2, q: 'test' }\n */\nexport function parseTypedQueryParams<T extends Record<string, any>>(\n url: string,\n converters?: Record<keyof T, (val: string) => any>,\n): Partial<T> {\n try {\n const { searchParams } = new URL(url);\n const result = {} as Partial<T>;\n\n for (const [key, value] of searchParams.entries()) {\n if (converters && key in converters) {\n try {\n result[key as keyof T] = converters[key as keyof T](value);\n } catch {\n // Skip on conversion error\n }\n } else {\n result[key as keyof T] = value as any;\n }\n }\n\n return result;\n } catch {\n return {};\n }\n}\n"]}
1
+ {"version":3,"file":"url.utils.js","sourceRoot":"","sources":["../../../src/utils/url.utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { URL, URLSearchParams } from 'url';\n\n/**\n * Appends query parameters to a given URL.\n *\n * @param {string} url - The base URL to which query parameters will be appended.\n * @param {Record<string, string | number>} params - Key-value pairs to add as query parameters.\n * @returns {string} The new URL string with query parameters appended.\n *\n * @example\n * appendQueryParams('https://example.com', { page: 1, limit: 10 });\n * // → 'https://example.com/?page=1&limit=10'\n */\nexport function appendQueryParams(url: string, params: Record<string, string | number>): string {\n const urlObj = new URL(url);\n for (const [key, value] of Object.entries(params)) {\n urlObj.searchParams.set(key, value.toString());\n }\n return urlObj.toString();\n}\n\n/**\n * Parses a query string into a key-value object.\n *\n * @param {string} query - The query string (with or without leading '?').\n * @returns {Record<string, string>} Object representing parsed query parameters.\n *\n * @example\n * parseQueryString('?page=1&limit=10');\n * // → { page: '1', limit: '10' }\n */\nexport function parseQueryString(query: string): Record<string, string> {\n const cleanQuery = query.startsWith('?') ? query.slice(1) : query;\n // Object.fromEntries guarantees string values in result\n return Object.fromEntries(new URLSearchParams(cleanQuery)) as Record<string, string>;\n}\n\n/**\n * Validates if a string is a valid URL.\n *\n * @param {string} url - The URL string to validate.\n * @param {boolean} [requireHttps=false] - If true, requires the URL to use HTTPS.\n * @returns {boolean} True if the URL is valid, false otherwise.\n */\nexport function isValidUrl(url: string, requireHttps: boolean = false): boolean {\n try {\n const parsedUrl = new URL(url);\n if (!parsedUrl.protocol || !parsedUrl.hostname) return false;\n if (requireHttps && parsedUrl.protocol !== 'https:') return false;\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Extracts the domain name from a URL.\n *\n * @param {string} url - The URL to extract the domain from.\n * @param {boolean} [removeSubdomains=false] - If true, removes subdomains (returns root domain only).\n * @returns {string} The domain name.\n *\n * @example\n * getDomain('https://api.example.com/path');\n * // → 'api.example.com'\n *\n * getDomain('https://api.example.com/path', true);\n * // → 'example.com'\n */\nexport function getDomain(url: string, removeSubdomains: boolean = false): string {\n try {\n const { hostname } = new URL(url);\n\n if (!removeSubdomains) {\n return hostname;\n }\n\n // Extract root domain (remove subdomains)\n const parts = hostname.split('.');\n if (parts.length <= 2) return hostname;\n\n // Handle special cases like co.in, com.au\n const secondLevelDomains = ['co', 'com', 'org', 'net', 'gov', 'edu', 'ac'];\n const sld = parts[parts.length - 2];\n\n if (secondLevelDomains.includes(sld) && parts.length > 2) {\n return parts.slice(-3).join('.');\n }\n\n return parts.slice(-2).join('.');\n } catch {\n return '';\n }\n}\n\n/**\n * Joins URL paths properly handling slashes.\n *\n * @param {...string[]} segments - URL path segments to join.\n * @returns {string} Joined URL path.\n *\n * @example\n * joinPaths('https://example.com/', '/api/', '/users');\n * // → 'https://example.com/api/users'\n */\nexport function joinPaths(...segments: string[]): string {\n let result = segments\n .filter(s => s !== undefined && s !== null)\n .map((segment, index) => {\n if (index === 0) return segment.replace(/\\/+$/, '');\n return segment.replace(/^\\/+|\\/+$/g, '');\n })\n .filter(Boolean)\n .join('/');\n if (segments[0] === '' && !result.startsWith('/')) result = '/' + result;\n return result;\n}\n\n/**\n * Normalizes a URL by resolving relative paths, handling protocol-relative URLs, etc.\n *\n * @param {string} url - The URL to normalize.\n * @param {string} [base] - Optional base URL for resolving relative URLs.\n * @returns {string} Normalized URL.\n *\n * @example\n * normalizeUrl('HTTP://Example.COM/foo/../bar');\n * // → 'http://example.com/bar'\n */\nexport function normalizeUrl(url: string, base?: string): string {\n try {\n // Handle protocol-relative URLs\n if (url.startsWith('//')) {\n url = `https:${url}`;\n }\n\n // Resolve relative URLs against a base\n const parsedUrl = base ? new URL(url, base) : new URL(url);\n\n // Normalize\n parsedUrl.pathname = parsedUrl.pathname.replace(/\\/+/g, '/'); // Collapse multiple slashes\n parsedUrl.pathname = parsedUrl.pathname.replace(/\\/+$/, ''); // Remove trailing slash\n parsedUrl.hostname = parsedUrl.hostname.toLowerCase();\n\n return parsedUrl.toString();\n } catch {\n return url; // Return original if invalid\n }\n}\n\n/**\n * Creates a URL builder for constructing URLs with a base URL.\n *\n * @param {string} baseUrl - The base URL to build upon.\n * @returns {Object} URL builder methods.\n *\n * @example\n * const api = createUrlBuilder('https://api.example.com');\n * api.path('/users', { active: true });\n * // → 'https://api.example.com/users?active=true'\n */\nexport function createUrlBuilder(baseUrl: string) {\n return {\n /**\n * Creates a full URL with the given path and query parameters.\n *\n * @param {string} path - The path to append to the base URL.\n * @param {Record<string, any>} [params] - Query parameters to add.\n * @returns {string} The complete URL.\n */\n path(path: string, params?: Record<string, any>): string {\n const url = joinPaths(baseUrl, path);\n return params ? appendQueryParams(url, params as Record<string, string | number>) : url;\n },\n\n /**\n * Creates a full URL with query parameters but no additional path.\n *\n * @param {Record<string, any>} params - Query parameters to add.\n * @returns {string} The complete URL with query parameters.\n */\n query(params: Record<string, any>): string {\n return appendQueryParams(baseUrl, params as Record<string, string | number>);\n }\n };\n}\n\n/**\n * Extracts specific query parameters from a URL.\n *\n * @param {string} url - The URL to extract parameters from.\n * @param {string[]} paramNames - Names of parameters to extract.\n * @returns {Record<string, string>} Object containing the extracted parameters.\n */\nexport function extractQueryParams(url: string, paramNames: string[]): Record<string, string> {\n try {\n const parsedUrl = new URL(url);\n const result: Record<string, string> = {};\n\n for (const name of paramNames) {\n const value = parsedUrl.searchParams.get(name);\n if (value !== null) {\n result[name] = value;\n }\n }\n\n return result;\n } catch {\n return {};\n }\n}\n\n/**\n * Removes specified query parameters from a URL.\n *\n * @param {string} url - The URL to modify.\n * @param {string[]} paramsToRemove - Names of parameters to remove.\n * @returns {string} URL with parameters removed.\n */\nexport function removeQueryParams(url: string, paramsToRemove: string[]): string {\n try {\n const parsedUrl = new URL(url);\n\n for (const param of paramsToRemove) {\n parsedUrl.searchParams.delete(param);\n }\n\n return parsedUrl.toString();\n } catch {\n return url;\n }\n}\n\n/**\n * Gets the file extension from a URL path.\n *\n * @param {string} url - The URL to examine.\n * @returns {string} The file extension (without dot) or empty string if none found.\n *\n * @example\n * getExtension('https://example.com/document.pdf?v=1');\n * // → 'pdf'\n */\nexport function getExtension(url: string): string {\n try {\n const { pathname } = new URL(url);\n const match = pathname.match(/\\.([^./\\\\?#]+)$/);\n return match ? match[1].toLowerCase() : '';\n } catch {\n // If URL parsing fails, try a simpler approach\n const match = url.match(/\\.([^./\\\\?#]+)$/);\n return match ? match[1].toLowerCase() : '';\n }\n}\n\n/**\n * Parses URL query parameters into a strongly-typed object.\n *\n * @template T Expected type of the query parameters\n * @param {string} url - The URL to parse.\n * @param {Record<keyof T, (val: string) => any>} [converters] - Type converters for params.\n * @returns {Partial<T>} Typed query parameters.\n *\n * @example\n * parseTypedQueryParams<{page: number, q: string}>('https://example.com?page=2&q=test', {\n * page: Number,\n * q: String\n * });\n * // → { page: 2, q: 'test' }\n */\nexport function parseTypedQueryParams<T extends Record<string, any>>(\n url: string,\n converters?: Record<keyof T, (val: string) => any>\n): Partial<T> {\n try {\n const { searchParams } = new URL(url);\n const result = {} as Partial<T>;\n\n for (const [key, value] of searchParams.entries()) {\n if (converters && key in converters) {\n try {\n result[key as keyof T] = converters[key as keyof T](value);\n } catch {\n // Skip on conversion error\n }\n } else {\n result[key as keyof T] = value as any;\n }\n }\n\n return result;\n } catch {\n return {};\n }\n}\n"]}
@@ -35,11 +35,11 @@ function isEmail(str) {
35
35
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(str))
36
36
  return false;
37
37
  // Additional checks
38
- const [local, domain] = str.split("@");
38
+ const [local, domain] = str.split('@');
39
39
  if (!local || !domain)
40
40
  return false;
41
41
  // Disallow consecutive dots in local or domain part
42
- if (local.includes("..") || domain.includes(".."))
42
+ if (local.includes('..') || domain.includes('..'))
43
43
  return false;
44
44
  return true;
45
45
  }
@@ -74,10 +74,10 @@ function isURL(str) {
74
74
  * @returns {boolean} True if looks like a phone number.
75
75
  */
76
76
  function isPhone(str) {
77
- if (typeof str !== "string")
77
+ if (typeof str !== 'string')
78
78
  return false;
79
79
  // Strip non-digit characters to count total digits
80
- const digitsOnly = str.replace(/\D/g, "");
80
+ const digitsOnly = str.replace(/\D/g, '');
81
81
  if (digitsOnly.length < 6 || digitsOnly.length > 15)
82
82
  return false;
83
83
  // Accept typical phone characters: +, digits, space, -, (, )
@@ -99,10 +99,10 @@ function isAlphanumeric(str) {
99
99
  * @returns {boolean} True if the value is numeric.
100
100
  */
101
101
  function isNumeric(value) {
102
- if (typeof value === "string" && value.trim() === "")
102
+ if (typeof value === 'string' && value.trim() === '')
103
103
  return false;
104
- const num = typeof value === "number" ? value : Number(value);
105
- return typeof num === "number" && isFinite(num);
104
+ const num = typeof value === 'number' ? value : Number(value);
105
+ return typeof num === 'number' && isFinite(num);
106
106
  }
107
107
  /**
108
108
  * Checks if a string is a valid hex color code (e.g. #FFF or #FFFFFF).
@@ -124,7 +124,7 @@ function isISODate(str) {
124
124
  if (!isoRegex.test(str))
125
125
  return false;
126
126
  const date = new Date(str);
127
- return (!isNaN(date.getTime()) && date.toISOString().startsWith(str.slice(0, 10)));
127
+ return !isNaN(date.getTime()) && date.toISOString().startsWith(str.slice(0, 10));
128
128
  }
129
129
  /**
130
130
  * Checks if a string matches a specified length range.
@@ -180,10 +180,10 @@ function isStrongPassword(str) {
180
180
  * @returns {boolean} True if valid IPv4 address.
181
181
  */
182
182
  function isIPv4(str) {
183
- const parts = str.split(".");
183
+ const parts = str.split('.');
184
184
  if (parts.length !== 4)
185
185
  return false;
186
- return parts.every((part) => {
186
+ return parts.every(part => {
187
187
  const num = parseInt(part, 10);
188
188
  return part === num.toString() && num >= 0 && num <= 255;
189
189
  });
@@ -206,7 +206,7 @@ function isIPv6(str) {
206
206
  */
207
207
  function isCreditCard(str) {
208
208
  // Remove non-digit characters
209
- const cardNumber = str.replace(/\D/g, "");
209
+ const cardNumber = str.replace(/\D/g, '');
210
210
  if (cardNumber.length < 13 || cardNumber.length > 19)
211
211
  return false;
212
212
  // Luhn algorithm implementation
@@ -250,7 +250,7 @@ function isValidJSON(str) {
250
250
  function isArray(value, itemGuard) {
251
251
  if (!Array.isArray(value))
252
252
  return false;
253
- return !itemGuard || value.every((item) => itemGuard(item));
253
+ return !itemGuard || value.every(item => itemGuard(item));
254
254
  }
255
255
  /**
256
256
  * Checks if a string is a valid base64 encoded string.
@@ -269,9 +269,7 @@ function isBase64(str) {
269
269
  * @returns {boolean} True if all required properties exist.
270
270
  */
271
271
  function hasRequiredProps(obj, requiredProps) {
272
- return requiredProps.every((prop) => Object.prototype.hasOwnProperty.call(obj, prop) &&
273
- obj[prop] !== undefined &&
274
- obj[prop] !== null);
272
+ return requiredProps.every(prop => Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined && obj[prop] !== null);
275
273
  }
276
274
  /**
277
275
  * Validates a date is within a specified range.
@@ -308,6 +306,6 @@ function matchesPattern(str, pattern) {
308
306
  * @returns {boolean} True if value passes all validations.
309
307
  */
310
308
  function validateAll(value, validators) {
311
- return validators.every((validator) => validator(value));
309
+ return validators.every(validator => validator(value));
312
310
  }
313
311
  //# sourceMappingURL=validate.utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.utils.js","sourceRoot":"","sources":["../../../src/utils/validate.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Collection of common validation helpers for strings, numbers, email, UUID, etc.\n */\n\n/**\n * Checks if a string is a valid email address.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid email, else false.\n */\nexport function isEmail(str: string): boolean {\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(str)) return false;\n\n // Additional checks\n const [local, domain] = str.split(\"@\");\n if (!local || !domain) return false;\n\n // Disallow consecutive dots in local or domain part\n if (local.includes(\"..\") || domain.includes(\"..\")) return false;\n\n return true;\n}\n\n/**\n * Checks if a string is a valid UUID (versions 1-5).\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid UUID, else false.\n */\nexport function isUUID(str: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n str,\n );\n}\n\n/**\n * Checks if a string is a valid URL.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid URL, else false.\n */\nexport function isURL(str: string): boolean {\n try {\n new URL(str);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Checks if a string is a valid international phone number (E.164 or common patterns).\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if looks like a phone number.\n */\nexport function isPhone(str: string): boolean {\n if (typeof str !== \"string\") return false;\n\n // Strip non-digit characters to count total digits\n const digitsOnly = str.replace(/\\D/g, \"\");\n if (digitsOnly.length < 6 || digitsOnly.length > 15) return false;\n\n // Accept typical phone characters: +, digits, space, -, (, )\n return /^[+]?[\\d\\s().-]+$/.test(str);\n}\n\n/**\n * Checks if a string is strictly alphanumeric (letters/numbers only).\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if alphanumeric.\n */\nexport function isAlphanumeric(str: string): boolean {\n return /^[a-z0-9]+$/i.test(str);\n}\n\n/**\n * Checks if a string or number can be safely parsed to a number.\n *\n * @param {string | number} value - The value to check.\n * @returns {boolean} True if the value is numeric.\n */\nexport function isNumeric(value: string | number): boolean {\n if (typeof value === \"string\" && value.trim() === \"\") return false;\n const num = typeof value === \"number\" ? value : Number(value);\n return typeof num === \"number\" && isFinite(num);\n}\n\n/**\n * Checks if a string is a valid hex color code (e.g. #FFF or #FFFFFF).\n *\n * @param {string} str - Input string.\n * @returns {boolean}\n */\nexport function isHexColor(str: string): boolean {\n return /^#([a-f0-9]{6}|[a-f0-9]{3})$/i.test(str);\n}\n\n/**\n * Checks if a string is a valid date string.\n *\n * @param {string} str - Input string.\n * @returns {boolean}\n */\nexport function isISODate(str: string): boolean {\n const isoRegex =\n /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?)?$/;\n\n if (!isoRegex.test(str)) return false;\n\n const date = new Date(str);\n return (\n !isNaN(date.getTime()) && date.toISOString().startsWith(str.slice(0, 10))\n );\n}\n\n/**\n * Checks if a string matches a specified length range.\n *\n * @param {string} str - The input string.\n * @param {number} min - Minimum length (inclusive).\n * @param {number} max - Maximum length (inclusive).\n * @returns {boolean} True if string length is within range.\n */\nexport function isLengthBetween(\n str: string,\n min: number,\n max: number,\n): boolean {\n return str.length >= min && str.length <= max;\n}\n\n/**\n * Validates that a number is between specified min and max values (inclusive).\n *\n * @param {number} value - The number to validate.\n * @param {number} min - Minimum value.\n * @param {number} max - Maximum value.\n * @returns {boolean} True if number is within range.\n */\nexport function isNumberBetween(\n value: number,\n min: number,\n max: number,\n): boolean {\n return value >= min && value <= max;\n}\n\n/**\n * Checks if a string contains only alphabetic characters.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if alphabetic only.\n */\nexport function isAlpha(str: string): boolean {\n return /^[a-zA-Z]+$/.test(str);\n}\n\n/**\n * Validates that a string contains at least one uppercase letter,\n * one lowercase letter, one number, and one special character.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if string meets password complexity requirements.\n */\nexport function isStrongPassword(str: string): boolean {\n if (str.length < 8) return false;\n const hasUpperCase = /[A-Z]/.test(str);\n const hasLowerCase = /[a-z]/.test(str);\n const hasNumbers = /[0-9]/.test(str);\n const hasSpecialChar = /[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>?]/.test(str);\n return hasUpperCase && hasLowerCase && hasNumbers && hasSpecialChar;\n}\n\n/**\n * Checks if a string is a valid IPv4 address.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid IPv4 address.\n */\nexport function isIPv4(str: string): boolean {\n const parts = str.split(\".\");\n if (parts.length !== 4) return false;\n\n return parts.every((part) => {\n const num = parseInt(part, 10);\n return part === num.toString() && num >= 0 && num <= 255;\n });\n}\n\n/**\n * Checks if a string is a valid IPv6 address.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid IPv6 address.\n */\nexport function isIPv6(str: string): boolean {\n // Simple but effective check for common IPv6 formats\n return /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))$/.test(\n str,\n );\n}\n\n/**\n * Validates a credit card number using the Luhn algorithm.\n *\n * @param {string} str - The credit card number string.\n * @returns {boolean} True if valid credit card number.\n */\nexport function isCreditCard(str: string): boolean {\n // Remove non-digit characters\n const cardNumber = str.replace(/\\D/g, \"\");\n if (cardNumber.length < 13 || cardNumber.length > 19) return false;\n\n // Luhn algorithm implementation\n let sum = 0;\n let shouldDouble = false;\n\n for (let i = cardNumber.length - 1; i >= 0; i--) {\n let digit = parseInt(cardNumber.charAt(i), 10);\n\n if (shouldDouble) {\n digit *= 2;\n if (digit > 9) digit -= 9;\n }\n\n sum += digit;\n shouldDouble = !shouldDouble;\n }\n\n return sum % 10 === 0;\n}\n\n/**\n * Checks if a string is a valid JSON.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid JSON.\n */\nexport function isValidJSON(str: string): boolean {\n try {\n JSON.parse(str);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Type guard that checks if a value is an array.\n *\n * @template T Optional expected element type\n * @param {unknown} value - The value to check.\n * @param {(item: unknown) => boolean} [itemGuard] - Optional function to validate each item.\n * @returns {boolean} True if value is an array (with optional item validation).\n */\nexport function isArray<T = unknown>(\n value: unknown,\n itemGuard?: (item: unknown) => item is T,\n): value is T[] {\n if (!Array.isArray(value)) return false;\n return !itemGuard || value.every((item) => itemGuard(item));\n}\n\n/**\n * Checks if a string is a valid base64 encoded string.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid base64.\n */\nexport function isBase64(str: string): boolean {\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n str,\n );\n}\n\n/**\n * Validates that an object has all required properties.\n *\n * @param {object} obj - The object to validate.\n * @param {string[]} requiredProps - Array of required property names.\n * @returns {boolean} True if all required properties exist.\n */\nexport function hasRequiredProps(\n obj: Record<string, unknown>,\n requiredProps: string[],\n): boolean {\n return requiredProps.every(\n (prop) =>\n Object.prototype.hasOwnProperty.call(obj, prop) &&\n obj[prop] !== undefined &&\n obj[prop] !== null,\n );\n}\n\n/**\n * Validates a date is within a specified range.\n *\n * @param {Date} date - The date to validate.\n * @param {Date} [minDate] - Optional minimum date (inclusive).\n * @param {Date} [maxDate] - Optional maximum date (inclusive).\n * @returns {boolean} True if date is within range.\n */\nexport function isDateInRange(\n date: Date,\n minDate?: Date,\n maxDate?: Date,\n): boolean {\n if (!(date instanceof Date) || isNaN(date.getTime())) return false;\n\n if (minDate && date < minDate) return false;\n if (maxDate && date > maxDate) return false;\n\n return true;\n}\n\n/**\n * Validates a string matches a specific regular expression pattern.\n *\n * @param {string} str - The input string.\n * @param {RegExp} pattern - Regular expression to test against.\n * @returns {boolean} True if string matches pattern.\n */\nexport function matchesPattern(str: string, pattern: RegExp): boolean {\n return pattern.test(str);\n}\n\n/**\n * Validates data against multiple constraints.\n *\n * @param {unknown} value - The value to validate.\n * @param {Array<(value: unknown) => boolean>} validators - Array of validation functions.\n * @returns {boolean} True if value passes all validations.\n */\nexport function validateAll(\n value: unknown,\n validators: Array<(value: unknown) => boolean>,\n): boolean {\n return validators.every((validator) => validator(value));\n}\n"]}
1
+ {"version":3,"file":"validate.utils.js","sourceRoot":"","sources":["../../../src/utils/validate.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Collection of common validation helpers for strings, numbers, email, UUID, etc.\n */\n\n/**\n * Checks if a string is a valid email address.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid email, else false.\n */\nexport function isEmail(str: string): boolean {\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(str)) return false;\n\n // Additional checks\n const [local, domain] = str.split('@');\n if (!local || !domain) return false;\n\n // Disallow consecutive dots in local or domain part\n if (local.includes('..') || domain.includes('..')) return false;\n\n return true;\n}\n\n/**\n * Checks if a string is a valid UUID (versions 1-5).\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid UUID, else false.\n */\nexport function isUUID(str: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(str);\n}\n\n/**\n * Checks if a string is a valid URL.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid URL, else false.\n */\nexport function isURL(str: string): boolean {\n try {\n new URL(str);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Checks if a string is a valid international phone number (E.164 or common patterns).\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if looks like a phone number.\n */\nexport function isPhone(str: string): boolean {\n if (typeof str !== 'string') return false;\n\n // Strip non-digit characters to count total digits\n const digitsOnly = str.replace(/\\D/g, '');\n if (digitsOnly.length < 6 || digitsOnly.length > 15) return false;\n\n // Accept typical phone characters: +, digits, space, -, (, )\n return /^[+]?[\\d\\s().-]+$/.test(str);\n}\n\n/**\n * Checks if a string is strictly alphanumeric (letters/numbers only).\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if alphanumeric.\n */\nexport function isAlphanumeric(str: string): boolean {\n return /^[a-z0-9]+$/i.test(str);\n}\n\n/**\n * Checks if a string or number can be safely parsed to a number.\n *\n * @param {string | number} value - The value to check.\n * @returns {boolean} True if the value is numeric.\n */\nexport function isNumeric(value: string | number): boolean {\n if (typeof value === 'string' && value.trim() === '') return false;\n const num = typeof value === 'number' ? value : Number(value);\n return typeof num === 'number' && isFinite(num);\n}\n\n/**\n * Checks if a string is a valid hex color code (e.g. #FFF or #FFFFFF).\n *\n * @param {string} str - Input string.\n * @returns {boolean}\n */\nexport function isHexColor(str: string): boolean {\n return /^#([a-f0-9]{6}|[a-f0-9]{3})$/i.test(str);\n}\n\n/**\n * Checks if a string is a valid date string.\n *\n * @param {string} str - Input string.\n * @returns {boolean}\n */\nexport function isISODate(str: string): boolean {\n const isoRegex = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?)?$/;\n\n if (!isoRegex.test(str)) return false;\n\n const date = new Date(str);\n return !isNaN(date.getTime()) && date.toISOString().startsWith(str.slice(0, 10));\n}\n\n/**\n * Checks if a string matches a specified length range.\n *\n * @param {string} str - The input string.\n * @param {number} min - Minimum length (inclusive).\n * @param {number} max - Maximum length (inclusive).\n * @returns {boolean} True if string length is within range.\n */\nexport function isLengthBetween(str: string, min: number, max: number): boolean {\n return str.length >= min && str.length <= max;\n}\n\n/**\n * Validates that a number is between specified min and max values (inclusive).\n *\n * @param {number} value - The number to validate.\n * @param {number} min - Minimum value.\n * @param {number} max - Maximum value.\n * @returns {boolean} True if number is within range.\n */\nexport function isNumberBetween(value: number, min: number, max: number): boolean {\n return value >= min && value <= max;\n}\n\n/**\n * Checks if a string contains only alphabetic characters.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if alphabetic only.\n */\nexport function isAlpha(str: string): boolean {\n return /^[a-zA-Z]+$/.test(str);\n}\n\n/**\n * Validates that a string contains at least one uppercase letter,\n * one lowercase letter, one number, and one special character.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if string meets password complexity requirements.\n */\nexport function isStrongPassword(str: string): boolean {\n if (str.length < 8) return false;\n const hasUpperCase = /[A-Z]/.test(str);\n const hasLowerCase = /[a-z]/.test(str);\n const hasNumbers = /[0-9]/.test(str);\n const hasSpecialChar = /[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>?]/.test(str);\n return hasUpperCase && hasLowerCase && hasNumbers && hasSpecialChar;\n}\n\n/**\n * Checks if a string is a valid IPv4 address.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid IPv4 address.\n */\nexport function isIPv4(str: string): boolean {\n const parts = str.split('.');\n if (parts.length !== 4) return false;\n\n return parts.every(part => {\n const num = parseInt(part, 10);\n return part === num.toString() && num >= 0 && num <= 255;\n });\n}\n\n/**\n * Checks if a string is a valid IPv6 address.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid IPv6 address.\n */\nexport function isIPv6(str: string): boolean {\n // Simple but effective check for common IPv6 formats\n return /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))$/.test(\n str\n );\n}\n\n/**\n * Validates a credit card number using the Luhn algorithm.\n *\n * @param {string} str - The credit card number string.\n * @returns {boolean} True if valid credit card number.\n */\nexport function isCreditCard(str: string): boolean {\n // Remove non-digit characters\n const cardNumber = str.replace(/\\D/g, '');\n if (cardNumber.length < 13 || cardNumber.length > 19) return false;\n\n // Luhn algorithm implementation\n let sum = 0;\n let shouldDouble = false;\n\n for (let i = cardNumber.length - 1; i >= 0; i--) {\n let digit = parseInt(cardNumber.charAt(i), 10);\n\n if (shouldDouble) {\n digit *= 2;\n if (digit > 9) digit -= 9;\n }\n\n sum += digit;\n shouldDouble = !shouldDouble;\n }\n\n return sum % 10 === 0;\n}\n\n/**\n * Checks if a string is a valid JSON.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid JSON.\n */\nexport function isValidJSON(str: string): boolean {\n try {\n JSON.parse(str);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Type guard that checks if a value is an array.\n *\n * @template T Optional expected element type\n * @param {unknown} value - The value to check.\n * @param {(item: unknown) => boolean} [itemGuard] - Optional function to validate each item.\n * @returns {boolean} True if value is an array (with optional item validation).\n */\nexport function isArray<T = unknown>(value: unknown, itemGuard?: (item: unknown) => item is T): value is T[] {\n if (!Array.isArray(value)) return false;\n return !itemGuard || value.every(item => itemGuard(item));\n}\n\n/**\n * Checks if a string is a valid base64 encoded string.\n *\n * @param {string} str - The input string.\n * @returns {boolean} True if valid base64.\n */\nexport function isBase64(str: string): boolean {\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(str);\n}\n\n/**\n * Validates that an object has all required properties.\n *\n * @param {object} obj - The object to validate.\n * @param {string[]} requiredProps - Array of required property names.\n * @returns {boolean} True if all required properties exist.\n */\nexport function hasRequiredProps(obj: Record<string, unknown>, requiredProps: string[]): boolean {\n return requiredProps.every(\n prop => Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined && obj[prop] !== null\n );\n}\n\n/**\n * Validates a date is within a specified range.\n *\n * @param {Date} date - The date to validate.\n * @param {Date} [minDate] - Optional minimum date (inclusive).\n * @param {Date} [maxDate] - Optional maximum date (inclusive).\n * @returns {boolean} True if date is within range.\n */\nexport function isDateInRange(date: Date, minDate?: Date, maxDate?: Date): boolean {\n if (!(date instanceof Date) || isNaN(date.getTime())) return false;\n\n if (minDate && date < minDate) return false;\n if (maxDate && date > maxDate) return false;\n\n return true;\n}\n\n/**\n * Validates a string matches a specific regular expression pattern.\n *\n * @param {string} str - The input string.\n * @param {RegExp} pattern - Regular expression to test against.\n * @returns {boolean} True if string matches pattern.\n */\nexport function matchesPattern(str: string, pattern: RegExp): boolean {\n return pattern.test(str);\n}\n\n/**\n * Validates data against multiple constraints.\n *\n * @param {unknown} value - The value to validate.\n * @param {Array<(value: unknown) => boolean>} validators - Array of validation functions.\n * @returns {boolean} True if value passes all validations.\n */\nexport function validateAll(value: unknown, validators: Array<(value: unknown) => boolean>): boolean {\n return validators.every(validator => validator(value));\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@catbee/utils",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "main": "build/src/index.js",
5
5
  "module": "build/esm/index.js",
6
6
  "esnext": "build/esnext/index.js",
@@ -22,8 +22,7 @@
22
22
  "pretest": "npm run compile",
23
23
  "dryrun": "npm pack --dry-run",
24
24
  "test": "cross-env LOGGER_LEVEL=silent jest",
25
- "test:coverage": "cross-env LOGGER_LEVEL=silent jest --coverage",
26
- "ver": "echo $npm_package_version"
25
+ "test:coverage": "cross-env LOGGER_LEVEL=silent jest --coverage"
27
26
  },
28
27
  "keywords": [
29
28
  "utils",
@@ -46,6 +45,7 @@
46
45
  "catbee"
47
46
  ],
48
47
  "dependencies": {
48
+ "@types/express": "^5.0.3",
49
49
  "abort-controller": "^3.0.0",
50
50
  "pino": "^9.7.0",
51
51
  "reflect-metadata": "^0.2.2"