2
1

misc.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. import 'multer'
  2. import validator from 'validator'
  3. import { sep } from 'path'
  4. function exists (value: any) {
  5. return value !== undefined && value !== null
  6. }
  7. function isSafePath (p: string) {
  8. return exists(p) &&
  9. (p + '').split(sep).every(part => {
  10. return [ '..' ].includes(part) === false
  11. })
  12. }
  13. function isArray (value: any) {
  14. return Array.isArray(value)
  15. }
  16. function isNotEmptyIntArray (value: any) {
  17. return Array.isArray(value) && value.every(v => validator.isInt('' + v)) && value.length !== 0
  18. }
  19. function isArrayOf (value: any, validator: (value: any) => boolean) {
  20. return isArray(value) && value.every(v => validator(v))
  21. }
  22. function isDateValid (value: string) {
  23. return exists(value) && validator.isISO8601(value)
  24. }
  25. function isIdValid (value: string) {
  26. return exists(value) && validator.isInt('' + value)
  27. }
  28. function isUUIDValid (value: string) {
  29. return exists(value) && validator.isUUID('' + value, 4)
  30. }
  31. function isIdOrUUIDValid (value: string) {
  32. return isIdValid(value) || isUUIDValid(value)
  33. }
  34. function isBooleanValid (value: any) {
  35. return typeof value === 'boolean' || (typeof value === 'string' && validator.isBoolean(value))
  36. }
  37. function isIntOrNull (value: any) {
  38. return value === null || validator.isInt('' + value)
  39. }
  40. function toIntOrNull (value: string) {
  41. const v = toValueOrNull(value)
  42. if (v === null || v === undefined) return v
  43. if (typeof v === 'number') return v
  44. return validator.toInt('' + v)
  45. }
  46. function toBooleanOrNull (value: any) {
  47. const v = toValueOrNull(value)
  48. if (v === null || v === undefined) return v
  49. if (typeof v === 'boolean') return v
  50. return validator.toBoolean('' + v)
  51. }
  52. function toValueOrNull (value: string) {
  53. if (value === 'null') return null
  54. return value
  55. }
  56. function toArray (value: any) {
  57. if (value && isArray(value) === false) return [ value ]
  58. return value
  59. }
  60. function toIntArray (value: any) {
  61. if (!value) return []
  62. if (isArray(value) === false) return [ validator.toInt(value) ]
  63. return value.map(v => validator.toInt(v))
  64. }
  65. function isFileFieldValid (
  66. files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[],
  67. field: string,
  68. optional = false
  69. ) {
  70. // Should have files
  71. if (!files) return optional
  72. if (isArray(files)) return optional
  73. // Should have a file
  74. const fileArray = files[field]
  75. if (!fileArray || fileArray.length === 0) {
  76. return optional
  77. }
  78. // The file should exist
  79. const file = fileArray[0]
  80. if (!file || !file.originalname) return false
  81. return file
  82. }
  83. function isFileMimeTypeValid (
  84. files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[],
  85. mimeTypeRegex: string,
  86. field: string,
  87. optional = false
  88. ) {
  89. // Should have files
  90. if (!files) return optional
  91. if (isArray(files)) return optional
  92. // Should have a file
  93. const fileArray = files[field]
  94. if (!fileArray || fileArray.length === 0) {
  95. return optional
  96. }
  97. // The file should exist
  98. const file = fileArray[0]
  99. if (!file || !file.originalname) return false
  100. return new RegExp(`^${mimeTypeRegex}$`, 'i').test(file.mimetype)
  101. }
  102. function isFileValid (
  103. files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[],
  104. mimeTypeRegex: string,
  105. field: string,
  106. maxSize: number | null,
  107. optional = false
  108. ) {
  109. // Should have files
  110. if (!files) return optional
  111. if (isArray(files)) return optional
  112. // Should have a file
  113. const fileArray = files[field]
  114. if (!fileArray || fileArray.length === 0) {
  115. return optional
  116. }
  117. // The file should exist
  118. const file = fileArray[0]
  119. if (!file || !file.originalname) return false
  120. // Check size
  121. if ((maxSize !== null) && file.size > maxSize) return false
  122. return new RegExp(`^${mimeTypeRegex}$`, 'i').test(file.mimetype)
  123. }
  124. // ---------------------------------------------------------------------------
  125. export {
  126. exists,
  127. isArrayOf,
  128. isNotEmptyIntArray,
  129. isArray,
  130. isIntOrNull,
  131. isIdValid,
  132. isSafePath,
  133. isUUIDValid,
  134. isIdOrUUIDValid,
  135. isDateValid,
  136. toValueOrNull,
  137. toBooleanOrNull,
  138. isBooleanValid,
  139. toIntOrNull,
  140. toArray,
  141. toIntArray,
  142. isFileFieldValid,
  143. isFileMimeTypeValid,
  144. isFileValid
  145. }