@nejs/basic-extensions 2.7.0 → 2.8.0

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 (270) hide show
  1. package/.vscode/settings.json +5 -0
  2. package/README.md +6129 -1574
  3. package/dist/@nejs/basic-extensions.bundle.2.7.0.js +19 -0
  4. package/dist/@nejs/basic-extensions.bundle.2.7.0.js.map +7 -0
  5. package/dist/cjs/array.extensions.d.ts +39 -0
  6. package/dist/cjs/array.extensions.js +303 -0
  7. package/dist/cjs/array.extensions.js.map +1 -0
  8. package/dist/cjs/big.int.extension.d.ts +31 -0
  9. package/dist/cjs/big.int.extension.js +164 -0
  10. package/dist/cjs/big.int.extension.js.map +1 -0
  11. package/dist/cjs/{newClasses → classes}/asyncIterable.js +32 -44
  12. package/dist/cjs/classes/asyncIterable.js.map +1 -0
  13. package/dist/cjs/{newClasses → classes}/deferred.js +66 -138
  14. package/dist/cjs/classes/deferred.js.map +1 -0
  15. package/dist/cjs/{newClasses → classes}/descriptor.js +56 -90
  16. package/dist/cjs/classes/descriptor.js.map +1 -0
  17. package/dist/cjs/classes/index.d.ts +13 -0
  18. package/dist/cjs/classes/index.js +57 -0
  19. package/dist/cjs/classes/index.js.map +1 -0
  20. package/dist/cjs/classes/introspector.d.ts +20 -0
  21. package/dist/cjs/classes/introspector.js +130 -0
  22. package/dist/cjs/classes/introspector.js.map +1 -0
  23. package/dist/cjs/{newClasses → classes}/iterable.js +42 -63
  24. package/dist/cjs/classes/iterable.js.map +1 -0
  25. package/dist/cjs/classes/param.parser.d.ts +227 -0
  26. package/dist/cjs/classes/param.parser.js +242 -0
  27. package/dist/cjs/classes/param.parser.js.map +1 -0
  28. package/dist/cjs/classes/pluggable.proxy.d.ts +152 -0
  29. package/dist/cjs/classes/pluggable.proxy.js +444 -0
  30. package/dist/cjs/classes/pluggable.proxy.js.map +1 -0
  31. package/dist/cjs/{newClasses → classes}/refmap.js +18 -30
  32. package/dist/cjs/classes/refmap.js.map +1 -0
  33. package/dist/cjs/{newClasses → classes}/refset.js +28 -47
  34. package/dist/cjs/classes/refset.js.map +1 -0
  35. package/dist/cjs/classes/symkeys.d.ts +292 -0
  36. package/dist/cjs/classes/symkeys.js +424 -0
  37. package/dist/cjs/classes/symkeys.js.map +1 -0
  38. package/dist/cjs/classes/type.d.ts +56 -0
  39. package/dist/cjs/classes/type.js +405 -0
  40. package/dist/cjs/classes/type.js.map +1 -0
  41. package/dist/cjs/function.extensions.js +757 -0
  42. package/dist/cjs/function.extensions.js.map +1 -0
  43. package/dist/cjs/global.this.js +261 -0
  44. package/dist/cjs/global.this.js.map +1 -0
  45. package/dist/cjs/index.d.ts +4 -3
  46. package/dist/cjs/index.js +62 -32
  47. package/dist/cjs/index.js.map +1 -1
  48. package/dist/cjs/json.extensions.d.ts +2 -0
  49. package/dist/cjs/json.extensions.js +107 -0
  50. package/dist/cjs/json.extensions.js.map +1 -0
  51. package/dist/{mjs/mapextensions.d.ts → cjs/map.extensions.d.ts} +1 -0
  52. package/dist/cjs/map.extensions.js +142 -0
  53. package/dist/cjs/map.extensions.js.map +1 -0
  54. package/dist/cjs/number.extension.d.ts +44 -0
  55. package/dist/cjs/number.extension.js +260 -0
  56. package/dist/cjs/number.extension.js.map +1 -0
  57. package/dist/cjs/object.extensions.d.ts +62 -0
  58. package/dist/cjs/object.extensions.js +1116 -0
  59. package/dist/cjs/object.extensions.js.map +1 -0
  60. package/dist/cjs/proxy.extensions.d.ts +2 -0
  61. package/dist/cjs/proxy.extensions.js +207 -0
  62. package/dist/cjs/proxy.extensions.js.map +1 -0
  63. package/dist/cjs/reflect.extensions.js +316 -0
  64. package/dist/cjs/reflect.extensions.js.map +1 -0
  65. package/dist/cjs/regular.expression.extensions.d.ts +2 -0
  66. package/dist/cjs/regular.expression.extensions.js +423 -0
  67. package/dist/cjs/regular.expression.extensions.js.map +1 -0
  68. package/dist/cjs/set.extensions.d.ts +40 -0
  69. package/dist/cjs/{setextensions.js → set.extensions.js} +150 -2
  70. package/dist/cjs/set.extensions.js.map +1 -0
  71. package/dist/cjs/string.extensions.js +471 -0
  72. package/dist/cjs/string.extensions.js.map +1 -0
  73. package/dist/{mjs/symbolextensions.d.ts → cjs/symbol.extensions.d.ts} +1 -0
  74. package/dist/cjs/symbol.extensions.js +259 -0
  75. package/dist/cjs/symbol.extensions.js.map +1 -0
  76. package/dist/cjs/{weakrefextensions.js → weakref.extensions.js} +1 -1
  77. package/dist/cjs/weakref.extensions.js.map +1 -0
  78. package/dist/mjs/array.extensions.d.ts +39 -0
  79. package/dist/mjs/array.extensions.js +300 -0
  80. package/dist/mjs/array.extensions.js.map +1 -0
  81. package/dist/mjs/big.int.extension.d.ts +31 -0
  82. package/dist/mjs/big.int.extension.js +161 -0
  83. package/dist/mjs/big.int.extension.js.map +1 -0
  84. package/dist/mjs/classes/asyncIterable.js.map +1 -0
  85. package/dist/mjs/classes/deferred.js.map +1 -0
  86. package/dist/mjs/{newClasses → classes}/descriptor.js +7 -4
  87. package/dist/mjs/classes/descriptor.js.map +1 -0
  88. package/dist/mjs/classes/index.d.ts +13 -0
  89. package/dist/mjs/classes/index.js +40 -0
  90. package/dist/mjs/classes/index.js.map +1 -0
  91. package/dist/mjs/classes/introspector.d.ts +20 -0
  92. package/dist/mjs/classes/introspector.js +126 -0
  93. package/dist/mjs/classes/introspector.js.map +1 -0
  94. package/dist/mjs/classes/iterable.js.map +1 -0
  95. package/dist/mjs/classes/param.parser.d.ts +227 -0
  96. package/dist/mjs/classes/param.parser.js +238 -0
  97. package/dist/mjs/classes/param.parser.js.map +1 -0
  98. package/dist/mjs/classes/pluggable.proxy.d.ts +152 -0
  99. package/dist/mjs/classes/pluggable.proxy.js +438 -0
  100. package/dist/mjs/classes/pluggable.proxy.js.map +1 -0
  101. package/dist/mjs/{newClasses → classes}/refmap.js +3 -3
  102. package/dist/mjs/classes/refmap.js.map +1 -0
  103. package/dist/mjs/classes/refset.js.map +1 -0
  104. package/dist/mjs/classes/symkeys.d.ts +292 -0
  105. package/dist/mjs/classes/symkeys.js +420 -0
  106. package/dist/mjs/classes/symkeys.js.map +1 -0
  107. package/dist/mjs/classes/type.d.ts +56 -0
  108. package/dist/mjs/classes/type.js +401 -0
  109. package/dist/mjs/classes/type.js.map +1 -0
  110. package/dist/mjs/function.extensions.js +754 -0
  111. package/dist/mjs/function.extensions.js.map +1 -0
  112. package/dist/mjs/global.this.js +258 -0
  113. package/dist/mjs/global.this.js.map +1 -0
  114. package/dist/mjs/index.d.ts +4 -3
  115. package/dist/mjs/index.js +49 -19
  116. package/dist/mjs/index.js.map +1 -1
  117. package/dist/mjs/json.extensions.d.ts +2 -0
  118. package/dist/mjs/json.extensions.js +104 -0
  119. package/dist/mjs/json.extensions.js.map +1 -0
  120. package/dist/{cjs/mapextensions.d.ts → mjs/map.extensions.d.ts} +1 -0
  121. package/dist/mjs/map.extensions.js +139 -0
  122. package/dist/mjs/map.extensions.js.map +1 -0
  123. package/dist/mjs/number.extension.d.ts +44 -0
  124. package/dist/mjs/number.extension.js +257 -0
  125. package/dist/mjs/number.extension.js.map +1 -0
  126. package/dist/mjs/object.extensions.d.ts +62 -0
  127. package/dist/mjs/object.extensions.js +1112 -0
  128. package/dist/mjs/object.extensions.js.map +1 -0
  129. package/dist/mjs/proxy.extensions.d.ts +2 -0
  130. package/dist/mjs/proxy.extensions.js +204 -0
  131. package/dist/mjs/proxy.extensions.js.map +1 -0
  132. package/dist/mjs/reflect.extensions.js +313 -0
  133. package/dist/mjs/reflect.extensions.js.map +1 -0
  134. package/dist/mjs/regular.expression.extensions.d.ts +2 -0
  135. package/dist/mjs/regular.expression.extensions.js +420 -0
  136. package/dist/mjs/regular.expression.extensions.js.map +1 -0
  137. package/dist/mjs/set.extensions.d.ts +40 -0
  138. package/dist/mjs/{setextensions.js → set.extensions.js} +149 -1
  139. package/dist/mjs/set.extensions.js.map +1 -0
  140. package/dist/mjs/string.extensions.js +468 -0
  141. package/dist/mjs/string.extensions.js.map +1 -0
  142. package/dist/{cjs/symbolextensions.d.ts → mjs/symbol.extensions.d.ts} +1 -0
  143. package/dist/mjs/symbol.extensions.js +256 -0
  144. package/dist/mjs/symbol.extensions.js.map +1 -0
  145. package/dist/mjs/{weakrefextensions.js → weakref.extensions.js} +1 -1
  146. package/dist/mjs/weakref.extensions.js.map +1 -0
  147. package/docs/index.html +24045 -5805
  148. package/package.json +6 -4
  149. package/src/array.extensions.js +322 -0
  150. package/src/big.int.extension.js +163 -0
  151. package/src/{newClasses → classes}/descriptor.js +16 -12
  152. package/src/classes/index.js +51 -0
  153. package/src/classes/introspector.js +167 -0
  154. package/src/classes/param.parser.js +253 -0
  155. package/src/classes/pluggable.proxy.js +485 -0
  156. package/src/{newClasses → classes}/refmap.js +5 -3
  157. package/src/classes/symkeys.js +464 -0
  158. package/src/classes/type.js +427 -0
  159. package/src/function.extensions.js +818 -0
  160. package/src/global.this.js +304 -0
  161. package/src/index.js +56 -23
  162. package/src/json.extensions.js +108 -0
  163. package/src/map.extensions.js +144 -0
  164. package/src/number.extension.js +273 -0
  165. package/src/object.extensions.js +1222 -0
  166. package/src/proxy.extensions.js +229 -0
  167. package/src/reflect.extensions.js +346 -0
  168. package/src/regular.expression.extensions.js +451 -0
  169. package/src/{setextensions.js → set.extensions.js} +151 -2
  170. package/src/string.extensions.js +515 -0
  171. package/src/symbol.extensions.js +268 -0
  172. package/tests/newClasses/refmap.test.js +3 -2
  173. package/tsconfig.base.json +5 -3
  174. package/tsconfig.cjs.json +2 -2
  175. package/tsconfig.esm.json +2 -2
  176. package/dist/@nejs/basic-extensions.bundle.2.6.0.js +0 -17
  177. package/dist/@nejs/basic-extensions.bundle.2.6.0.js.map +0 -7
  178. package/dist/cjs/arrayextensions.d.ts +0 -10
  179. package/dist/cjs/arrayextensions.js +0 -73
  180. package/dist/cjs/arrayextensions.js.map +0 -1
  181. package/dist/cjs/functionextensions.js +0 -202
  182. package/dist/cjs/functionextensions.js.map +0 -1
  183. package/dist/cjs/globals.js +0 -166
  184. package/dist/cjs/globals.js.map +0 -1
  185. package/dist/cjs/mapextensions.js +0 -32
  186. package/dist/cjs/mapextensions.js.map +0 -1
  187. package/dist/cjs/newClasses/asyncIterable.js.map +0 -1
  188. package/dist/cjs/newClasses/deferred.js.map +0 -1
  189. package/dist/cjs/newClasses/descriptor.js.map +0 -1
  190. package/dist/cjs/newClasses/iterable.js.map +0 -1
  191. package/dist/cjs/newClasses/refmap.js.map +0 -1
  192. package/dist/cjs/newClasses/refset.js.map +0 -1
  193. package/dist/cjs/objectextensions.d.ts +0 -11
  194. package/dist/cjs/objectextensions.js +0 -232
  195. package/dist/cjs/objectextensions.js.map +0 -1
  196. package/dist/cjs/reflectextensions.js +0 -111
  197. package/dist/cjs/reflectextensions.js.map +0 -1
  198. package/dist/cjs/setextensions.d.ts +0 -2
  199. package/dist/cjs/setextensions.js.map +0 -1
  200. package/dist/cjs/stringextensions.js +0 -158
  201. package/dist/cjs/stringextensions.js.map +0 -1
  202. package/dist/cjs/symbolextensions.js +0 -69
  203. package/dist/cjs/symbolextensions.js.map +0 -1
  204. package/dist/cjs/weakrefextensions.js.map +0 -1
  205. package/dist/mjs/arrayextensions.d.ts +0 -10
  206. package/dist/mjs/arrayextensions.js +0 -70
  207. package/dist/mjs/arrayextensions.js.map +0 -1
  208. package/dist/mjs/functionextensions.js +0 -199
  209. package/dist/mjs/functionextensions.js.map +0 -1
  210. package/dist/mjs/globals.js +0 -163
  211. package/dist/mjs/globals.js.map +0 -1
  212. package/dist/mjs/mapextensions.js +0 -29
  213. package/dist/mjs/mapextensions.js.map +0 -1
  214. package/dist/mjs/newClasses/asyncIterable.js.map +0 -1
  215. package/dist/mjs/newClasses/deferred.js.map +0 -1
  216. package/dist/mjs/newClasses/descriptor.js.map +0 -1
  217. package/dist/mjs/newClasses/iterable.js.map +0 -1
  218. package/dist/mjs/newClasses/refmap.js.map +0 -1
  219. package/dist/mjs/newClasses/refset.js.map +0 -1
  220. package/dist/mjs/objectextensions.d.ts +0 -11
  221. package/dist/mjs/objectextensions.js +0 -229
  222. package/dist/mjs/objectextensions.js.map +0 -1
  223. package/dist/mjs/reflectextensions.js +0 -108
  224. package/dist/mjs/reflectextensions.js.map +0 -1
  225. package/dist/mjs/setextensions.d.ts +0 -2
  226. package/dist/mjs/setextensions.js.map +0 -1
  227. package/dist/mjs/stringextensions.js +0 -155
  228. package/dist/mjs/stringextensions.js.map +0 -1
  229. package/dist/mjs/symbolextensions.js +0 -66
  230. package/dist/mjs/symbolextensions.js.map +0 -1
  231. package/dist/mjs/weakrefextensions.js.map +0 -1
  232. package/src/arrayextensions.js +0 -75
  233. package/src/functionextensions.js +0 -225
  234. package/src/globals.js +0 -196
  235. package/src/mapextensions.js +0 -32
  236. package/src/objectextensions.js +0 -256
  237. package/src/reflectextensions.js +0 -118
  238. package/src/stringextensions.js +0 -166
  239. package/src/symbolextensions.js +0 -69
  240. /package/dist/cjs/{newClasses → classes}/asyncIterable.d.ts +0 -0
  241. /package/dist/cjs/{newClasses → classes}/deferred.d.ts +0 -0
  242. /package/dist/cjs/{newClasses → classes}/descriptor.d.ts +0 -0
  243. /package/dist/cjs/{newClasses → classes}/iterable.d.ts +0 -0
  244. /package/dist/cjs/{newClasses → classes}/refmap.d.ts +0 -0
  245. /package/dist/cjs/{newClasses → classes}/refset.d.ts +0 -0
  246. /package/dist/cjs/{functionextensions.d.ts → function.extensions.d.ts} +0 -0
  247. /package/dist/cjs/{globals.d.ts → global.this.d.ts} +0 -0
  248. /package/dist/cjs/{reflectextensions.d.ts → reflect.extensions.d.ts} +0 -0
  249. /package/dist/cjs/{stringextensions.d.ts → string.extensions.d.ts} +0 -0
  250. /package/dist/cjs/{weakrefextensions.d.ts → weakref.extensions.d.ts} +0 -0
  251. /package/dist/mjs/{newClasses → classes}/asyncIterable.d.ts +0 -0
  252. /package/dist/mjs/{newClasses → classes}/asyncIterable.js +0 -0
  253. /package/dist/mjs/{newClasses → classes}/deferred.d.ts +0 -0
  254. /package/dist/mjs/{newClasses → classes}/deferred.js +0 -0
  255. /package/dist/mjs/{newClasses → classes}/descriptor.d.ts +0 -0
  256. /package/dist/mjs/{newClasses → classes}/iterable.d.ts +0 -0
  257. /package/dist/mjs/{newClasses → classes}/iterable.js +0 -0
  258. /package/dist/mjs/{newClasses → classes}/refmap.d.ts +0 -0
  259. /package/dist/mjs/{newClasses → classes}/refset.d.ts +0 -0
  260. /package/dist/mjs/{newClasses → classes}/refset.js +0 -0
  261. /package/dist/mjs/{functionextensions.d.ts → function.extensions.d.ts} +0 -0
  262. /package/dist/mjs/{globals.d.ts → global.this.d.ts} +0 -0
  263. /package/dist/mjs/{reflectextensions.d.ts → reflect.extensions.d.ts} +0 -0
  264. /package/dist/mjs/{stringextensions.d.ts → string.extensions.d.ts} +0 -0
  265. /package/dist/mjs/{weakrefextensions.d.ts → weakref.extensions.d.ts} +0 -0
  266. /package/src/{newClasses → classes}/asyncIterable.js +0 -0
  267. /package/src/{newClasses → classes}/deferred.js +0 -0
  268. /package/src/{newClasses → classes}/iterable.js +0 -0
  269. /package/src/{newClasses → classes}/refset.js +0 -0
  270. /package/src/{weakrefextensions.js → weakref.extensions.js} +0 -0
@@ -0,0 +1,273 @@
1
+ import { Patch } from '@nejs/extension'
2
+
3
+ /**
4
+ * A patch for the JavaScript built-in `Number` class that adds utility
5
+ * methods without modifying the global namespace directly
6
+ *
7
+ * This patch includes methods for checking if a value is a number and
8
+ * conditionally returning a value based on whether the supplied value is
9
+ * a number or not.
10
+ *
11
+ * @type {Patch}
12
+ * @property {Object} [Patch.kMutablyHidden] An object containing methods
13
+ * that are hidden from enumeration and mutation
14
+ *
15
+ * @example
16
+ * import { NumberExtensions } from 'number.extension.js'
17
+ *
18
+ * NumberExtensions.apply()
19
+ * // Now the `Number` class has additional methods available
20
+ */
21
+ export const NumberExtensions = new Patch(Number, {
22
+ [Patch.kMutablyHidden]: {
23
+ /**
24
+ * Determines if the supplied `value` is a `Number`. This check is
25
+ * performed by first converting the `value` to a `Number` using the
26
+ * `Number()` constructor and checking to see if the result is not
27
+ * `NaN`. If that check passes, `typeof` is used to ensure that the
28
+ * original `value` is of type "number".
29
+ *
30
+ * @param {*} value The value that needs to be checked to determine if it
31
+ * is a `Number` or not
32
+ * @returns {boolean} `true` if the supplied `value` is a `Number`,
33
+ * `false` otherwise
34
+ *
35
+ * @example
36
+ * const num = 42
37
+ * isNumber(num) // true
38
+ * isNumber('42') // false
39
+ * isNumber(NaN) // false
40
+ * isNumber(Infinity) // true
41
+ */
42
+ isNumber(value) {
43
+ return !isNaN(value) && typeof value === 'number'
44
+ },
45
+
46
+ /**
47
+ * Checks if all or some of the supplied values are numbers.
48
+ *
49
+ * This method uses the `Array.prototype.every` or `Array.prototype.some`
50
+ * method to check if all or some of the supplied values are numbers,
51
+ * respectively. The method to use is determined by the `which` parameter.
52
+ *
53
+ * @param {string} [which='every'] - Determines the method to use for the
54
+ * check. Can be either 'every' or 'some'. Defaults to 'every'.
55
+ * @param {...*} values - The values to check.
56
+ * @returns {boolean} - Returns `true` if all or some of the values are
57
+ * numbers (based on the `which` parameter), `false` otherwise.
58
+ *
59
+ * @example
60
+ * areNumbers('every', 1, 2, 3) // true
61
+ * areNumbers('some', 1, '2', 3) // true
62
+ * areNumbers('every', 1, '2', 3) // false
63
+ */
64
+ areNumbers(which = ['every','some'][0], ...values) {
65
+ if (which !== 'every' && which !== 'some') {
66
+ return false
67
+ }
68
+
69
+ return values[which](num => this.isNumber(num))
70
+ },
71
+
72
+ /**
73
+ * Conditionally returns a value based on whether the supplied `value` is
74
+ * a `Number` or not. If the `value` is a `Number`, the `thenValue` will
75
+ * be returned. If it is not a `Number`, the `elseValue` will be
76
+ * returned instead.
77
+ *
78
+ * @param {*} value The value to check to determine if it is a `Number`
79
+ * @param {*} thenValue The value to return if the supplied `value` is
80
+ * a `Number`
81
+ * @param {*} elseValue The value to return if the supplied `value` is
82
+ * not a `Number`
83
+ * @returns {*} Either the `thenValue` or `elseValue` depending on if the
84
+ * supplied `value` is a `Number`
85
+ *
86
+ * @example
87
+ * const num = 42
88
+ * const str = 'hello'
89
+ * ifNumber(num, 'is a number', 'not a number') // 'is a number'
90
+ * ifNumber(str, 'is a number', 'not a number') // 'not a number'
91
+ */
92
+ ifNumber(value, thenValue, elseValue) {
93
+ return isThenElse(this.isNumber(value), thenValue, elseValue)
94
+ },
95
+
96
+ /**
97
+ * Conditionally returns a value based on whether all or some of the
98
+ * supplied values are numbers.
99
+ *
100
+ * This method uses the `areNumbers` method to check if all or some of
101
+ * the supplied values are numbers, based on the `which` parameter.
102
+ * If the condition is met, the `thenValue` is returned, otherwise
103
+ * the `elseValue` is returned.
104
+ *
105
+ * @param {*} thenValue - The value to return if the condition is met.
106
+ * @param {*} elseValue - The value to return if the condition is not met.
107
+ * @param {string} [which='every'] - Determines the method to use for the
108
+ * check. Can be either 'every' or 'some'. Defaults to 'every'.
109
+ * @param {...*} numbers - The values to check.
110
+ * @returns {*} Either the `thenValue` or `elseValue` depending on if all
111
+ * or some of the supplied values are numbers.
112
+ *
113
+ * @example
114
+ * ifNumbers('All are numbers', 'Not all are numbers', 'every', 1, 2, 3)
115
+ * // returns 'All are numbers'
116
+ * ifNumbers('At least one is a number', 'None are numbers', 'some', 1, '2', 3)
117
+ * // returns 'At least one is a number'
118
+ * ifNumbers('All are numbers', 'Not all are numbers', 'every', 1, '2', 3)
119
+ * // returns 'Not all are numbers'
120
+ */
121
+ ifNumbers(
122
+ thenValue,
123
+ elseValue,
124
+ which = ['every','some'][0],
125
+ ...numbers
126
+ ) {
127
+ return isThenElse(
128
+ this.areNumbers(which, ...numbers),
129
+ thenValue,
130
+ elseValue
131
+ )
132
+ },
133
+
134
+ /**
135
+ * Clamps a value between a minimum and maximum value.
136
+ *
137
+ * This method checks if the provided value and the min and max bounds are
138
+ * numbers. If they are not, it returns the original value. If they are,
139
+ * it ensures that the value does not go below the minimum value or above
140
+ * the maximum value.
141
+ *
142
+ * @param {*} value - The value to clamp.
143
+ * @param {number} [minValue=-Infinity] - The minimum value. Defaults
144
+ * to -Infinity.
145
+ * @param {number} [maxValue=Infinity] - The maximum value. Defaults
146
+ * to Infinity.
147
+ * @returns {*} - Returns the clamped value if all parameters are numbers,
148
+ * otherwise returns the original value.
149
+ *
150
+ * @example
151
+ * clamp(10, 1, 5) // returns 5
152
+ * clamp(-10, 1, 5) // returns 1
153
+ * clamp(3, 1, 5) // returns 3
154
+ * clamp('10', 1, 5) // returns '10'
155
+ */
156
+ clamp(value, minValue = -Infinity, maxValue = Infinity) {
157
+ if (!this.areNumbers('every', value, minValue, maxValue)) {
158
+ return value
159
+ }
160
+
161
+ return Math.max(minValue, Math.min(maxValue, value))
162
+ },
163
+ }
164
+ })
165
+
166
+ const { isNumber: pIsNumber, ifNumber: pIfNumber } = NumberExtensions.patches
167
+
168
+ /**
169
+ * `NumberPrototypeExtensions` provides a set of utility methods that
170
+ * are added to the `Number` prototype. This allows all number instances
171
+ * to access new functionality directly, enhancing their capabilities
172
+ * beyond the standard `Number` class methods.
173
+ *
174
+ * These extensions are applied using the `Patch` class from
175
+ * '@nejs/extension', ensuring that they do not interfere with the
176
+ * global namespace or existing properties.
177
+ *
178
+ * The extensions include methods for checking if a value is a number,
179
+ * conditionally returning values based on whether a value is a number,
180
+ * and more, making number-related tasks more convenient and expressive.
181
+ *
182
+ * @example
183
+ * const num = 42
184
+ * console.log(num.isNumber) // Output: true
185
+ *
186
+ * const notNum = "123"
187
+ * console.log(notNum.isNumber) // Output: false
188
+ *
189
+ * @type {Patch}
190
+ */
191
+ export const NumberPrototypeExtensions = new Patch(Number.prototype, {
192
+ [Patch.kMutablyHidden]: {
193
+ /**
194
+ * Returns an object representation of the number instance.
195
+ *
196
+ * This getter method creates and returns an object that wraps the number
197
+ * instance, allowing it to be treated as an object. The returned object
198
+ * is created using the `Object()` constructor, which takes the number
199
+ * instance as its argument.
200
+ *
201
+ * @type {Object}
202
+ * @readonly
203
+ *
204
+ * @example
205
+ * const num = 42
206
+ * console.log(typeof num) // 'number'
207
+ * console.log(typeof num.instance) // 'object'
208
+ */
209
+ get instance() {
210
+ return Object(this)
211
+ },
212
+
213
+ /**
214
+ * Determines if the current object is a number
215
+ *
216
+ * This getter uses the `pIsNumber` function from the `NumberExtensions`
217
+ * patch to check if the current object (`this`) is a number.
218
+ *
219
+ * @type {boolean}
220
+ * @readonly
221
+ *
222
+ * @example
223
+ * const num = 42
224
+ * console.log(num.isNumber) // Output: true
225
+ *
226
+ * const notNum = "123"
227
+ * console.log(notNum.isNumber) // Output: false
228
+ */
229
+ get isNumber() {
230
+ return pIsNumber(this)
231
+ },
232
+
233
+ /**
234
+ * Checks if the current object is a number and returns the corresponding
235
+ * value based on the result.
236
+ *
237
+ * This method uses the `pIfNumber` function from the `NumberExtensions`
238
+ * patch to determine if the current object (`this`) is a number. If it is
239
+ * a number, the `thenValue` is returned. Otherwise, the `elseValue` is
240
+ * returned.
241
+ *
242
+ * @param {any} thenValue The value to return if the current object is
243
+ * a number
244
+ * @param {any} elseValue The value to return if the current object is not
245
+ * a number
246
+ * @returns {any} The `thenValue` if the current object is a number, or
247
+ * the `elseValue` if it is not a number
248
+ *
249
+ * @example
250
+ * const num = 42
251
+ * console.log(num.ifNumber('Is a number', 'Not a number'))
252
+ * // Output: 'Is a number'
253
+ *
254
+ * const notNum = '123'
255
+ * console.log(notNum.ifNumber('Is a number', 'Not a number'))
256
+ * // Output: 'Not a number'
257
+ */
258
+ ifNumber(thenValue, elseValue) {
259
+ return pIfNumber(this, thenValue, elseValue)
260
+ },
261
+ }
262
+ })
263
+
264
+ // NOTE to self; this is repeated here otherwise a circular reference from
265
+ // Object<->Function<->Global occurs. See original source in global.this.js
266
+ // {@see globalThis.isThenElse}
267
+ function isThenElse(bv, tv, ev) {
268
+ if (arguments.length > 1) {
269
+ var _then = isFunction(tv) ? tv(bv) : tv; if (arguments.length > 2) {
270
+ var _else = isFunction(ev) ? tv(bv) : ev; return bv ? _then : _else
271
+ } return bv || _then;
272
+ } return bv
273
+ }