@develia/commons 0.4.15 → 0.4.18

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 (216) hide show
  1. package/dist/cjs/array.js +38 -2
  2. package/dist/cjs/array.js.map +1 -1
  3. package/dist/cjs/async-pool-executor.js +26 -11
  4. package/dist/cjs/async-pool-executor.js.map +1 -1
  5. package/dist/cjs/browser/form-utilities.js +35 -34
  6. package/dist/cjs/browser/form-utilities.js.map +1 -1
  7. package/dist/cjs/browser/geo-location.js +1 -1
  8. package/dist/cjs/browser/geo-location.js.map +1 -1
  9. package/dist/cjs/browser/native-bridge.js +3 -1
  10. package/dist/cjs/browser/native-bridge.js.map +1 -1
  11. package/dist/cjs/cancellable-promise.js +34 -13
  12. package/dist/cjs/cancellable-promise.js.map +1 -1
  13. package/dist/cjs/clean-url-search-params.js +26 -3
  14. package/dist/cjs/clean-url-search-params.js.map +1 -1
  15. package/dist/cjs/collections/cache-dictionary.js +3 -3
  16. package/dist/cjs/collections/cache-dictionary.js.map +1 -1
  17. package/dist/cjs/collections/default-map.js.map +1 -1
  18. package/dist/cjs/collections/default-weak-map.js.map +1 -1
  19. package/dist/cjs/collections/from.js +3 -3
  20. package/dist/cjs/collections/from.js.map +1 -1
  21. package/dist/cjs/collections/index.js.map +1 -1
  22. package/dist/cjs/draft.js +46 -11
  23. package/dist/cjs/draft.js.map +1 -1
  24. package/dist/cjs/event-bus.js +1 -1
  25. package/dist/cjs/event-bus.js.map +1 -1
  26. package/dist/cjs/functions.js +348 -0
  27. package/dist/cjs/functions.js.map +1 -0
  28. package/dist/cjs/index.js +4 -1
  29. package/dist/cjs/index.js.map +1 -1
  30. package/dist/cjs/key-value-pair.js.map +1 -1
  31. package/dist/cjs/lazy.js.map +1 -1
  32. package/dist/cjs/math.js +3 -0
  33. package/dist/cjs/math.js.map +1 -1
  34. package/dist/cjs/order.js.map +1 -1
  35. package/dist/cjs/parse.js +10 -1
  36. package/dist/cjs/parse.js.map +1 -1
  37. package/dist/cjs/patch.js.map +1 -1
  38. package/dist/cjs/range.js +154 -0
  39. package/dist/cjs/range.js.map +1 -0
  40. package/dist/cjs/stopwatch.js.map +1 -1
  41. package/dist/cjs/string.js +8 -5
  42. package/dist/cjs/string.js.map +1 -1
  43. package/dist/cjs/timer.js +1 -1
  44. package/dist/cjs/timer.js.map +1 -1
  45. package/dist/cjs/timespan.js +21 -8
  46. package/dist/cjs/timespan.js.map +1 -1
  47. package/dist/cjs/type-code.js.map +1 -1
  48. package/dist/cjs/type.js +20 -19
  49. package/dist/cjs/type.js.map +1 -1
  50. package/dist/cjs/types.js.map +1 -1
  51. package/dist/cjs/utilities.js +175 -39
  52. package/dist/cjs/utilities.js.map +1 -1
  53. package/dist/esm/array.js +36 -2
  54. package/dist/esm/array.js.map +1 -1
  55. package/dist/esm/async-pool-executor.js +26 -11
  56. package/dist/esm/async-pool-executor.js.map +1 -1
  57. package/dist/esm/browser/form-utilities.js +35 -34
  58. package/dist/esm/browser/form-utilities.js.map +1 -1
  59. package/dist/esm/browser/geo-location.js +1 -1
  60. package/dist/esm/browser/geo-location.js.map +1 -1
  61. package/dist/esm/browser/native-bridge.js +3 -1
  62. package/dist/esm/browser/native-bridge.js.map +1 -1
  63. package/dist/esm/cancellable-promise.js +34 -13
  64. package/dist/esm/cancellable-promise.js.map +1 -1
  65. package/dist/esm/clean-url-search-params.js +26 -3
  66. package/dist/esm/clean-url-search-params.js.map +1 -1
  67. package/dist/esm/collections/cache-dictionary.js +3 -3
  68. package/dist/esm/collections/cache-dictionary.js.map +1 -1
  69. package/dist/esm/collections/default-map.js.map +1 -1
  70. package/dist/esm/collections/default-weak-map.js.map +1 -1
  71. package/dist/esm/collections/from.js +3 -3
  72. package/dist/esm/collections/from.js.map +1 -1
  73. package/dist/esm/collections/index.js.map +1 -1
  74. package/dist/esm/draft.js +46 -11
  75. package/dist/esm/draft.js.map +1 -1
  76. package/dist/esm/event-bus.js +1 -1
  77. package/dist/esm/event-bus.js.map +1 -1
  78. package/dist/esm/functions.js +336 -0
  79. package/dist/esm/functions.js.map +1 -0
  80. package/dist/esm/index.js +2 -0
  81. package/dist/esm/index.js.map +1 -1
  82. package/dist/esm/key-value-pair.js.map +1 -1
  83. package/dist/esm/lazy.js.map +1 -1
  84. package/dist/esm/math.js +3 -0
  85. package/dist/esm/math.js.map +1 -1
  86. package/dist/esm/order.js.map +1 -1
  87. package/dist/esm/parse.js +10 -1
  88. package/dist/esm/parse.js.map +1 -1
  89. package/dist/esm/patch.js.map +1 -1
  90. package/dist/esm/range.js +151 -0
  91. package/dist/esm/range.js.map +1 -0
  92. package/dist/esm/stopwatch.js.map +1 -1
  93. package/dist/esm/string.js +8 -5
  94. package/dist/esm/string.js.map +1 -1
  95. package/dist/esm/timer.js +1 -1
  96. package/dist/esm/timer.js.map +1 -1
  97. package/dist/esm/timespan.js +21 -8
  98. package/dist/esm/timespan.js.map +1 -1
  99. package/dist/esm/type-code.js.map +1 -1
  100. package/dist/esm/type.js +20 -19
  101. package/dist/esm/type.js.map +1 -1
  102. package/dist/esm/types.js.map +1 -1
  103. package/dist/esm/utilities.js +174 -39
  104. package/dist/esm/utilities.js.map +1 -1
  105. package/dist/types/array.d.ts +29 -0
  106. package/dist/types/array.d.ts.map +1 -1
  107. package/dist/types/async-pool-executor.d.ts +2 -2
  108. package/dist/types/async-pool-executor.d.ts.map +1 -1
  109. package/dist/types/browser/form-utilities.d.ts.map +1 -1
  110. package/dist/types/browser/native-bridge.d.ts.map +1 -1
  111. package/dist/types/cancellable-promise.d.ts.map +1 -1
  112. package/dist/types/clean-url-search-params.d.ts +3 -1
  113. package/dist/types/clean-url-search-params.d.ts.map +1 -1
  114. package/dist/types/collections/from.d.ts +1 -1
  115. package/dist/types/draft.d.ts.map +1 -1
  116. package/dist/types/functions.d.ts +231 -0
  117. package/dist/types/functions.d.ts.map +1 -0
  118. package/dist/types/index.d.ts +2 -0
  119. package/dist/types/index.d.ts.map +1 -1
  120. package/dist/types/math.d.ts.map +1 -1
  121. package/dist/types/parse.d.ts.map +1 -1
  122. package/dist/types/range.d.ts +72 -0
  123. package/dist/types/range.d.ts.map +1 -0
  124. package/dist/types/string.d.ts.map +1 -1
  125. package/dist/types/timer.d.ts +1 -1
  126. package/dist/types/timespan.d.ts.map +1 -1
  127. package/dist/types/type.d.ts +2 -0
  128. package/dist/types/type.d.ts.map +1 -1
  129. package/dist/types/types.d.ts +1 -1
  130. package/dist/types/types.d.ts.map +1 -1
  131. package/dist/types/utilities.d.ts +21 -3
  132. package/dist/types/utilities.d.ts.map +1 -1
  133. package/dist/web/array.js +36 -2
  134. package/dist/web/array.js.map +1 -1
  135. package/dist/web/async-pool-executor.js +26 -11
  136. package/dist/web/async-pool-executor.js.map +1 -1
  137. package/dist/web/browser/form-utilities.js +35 -34
  138. package/dist/web/browser/form-utilities.js.map +1 -1
  139. package/dist/web/browser/geo-location.js +1 -1
  140. package/dist/web/browser/geo-location.js.map +1 -1
  141. package/dist/web/browser/native-bridge.js +3 -1
  142. package/dist/web/browser/native-bridge.js.map +1 -1
  143. package/dist/web/cancellable-promise.js +34 -13
  144. package/dist/web/cancellable-promise.js.map +1 -1
  145. package/dist/web/clean-url-search-params.js +26 -3
  146. package/dist/web/clean-url-search-params.js.map +1 -1
  147. package/dist/web/collections/cache-dictionary.js +3 -3
  148. package/dist/web/collections/cache-dictionary.js.map +1 -1
  149. package/dist/web/collections/default-map.js.map +1 -1
  150. package/dist/web/collections/default-weak-map.js.map +1 -1
  151. package/dist/web/collections/from.js +3 -3
  152. package/dist/web/collections/from.js.map +1 -1
  153. package/dist/web/collections/index.js.map +1 -1
  154. package/dist/web/draft.js +46 -11
  155. package/dist/web/draft.js.map +1 -1
  156. package/dist/web/event-bus.js +1 -1
  157. package/dist/web/event-bus.js.map +1 -1
  158. package/dist/web/functions.js +336 -0
  159. package/dist/web/functions.js.map +1 -0
  160. package/dist/web/index.js +2 -0
  161. package/dist/web/index.js.map +1 -1
  162. package/dist/web/key-value-pair.js.map +1 -1
  163. package/dist/web/lazy.js.map +1 -1
  164. package/dist/web/math.js +3 -0
  165. package/dist/web/math.js.map +1 -1
  166. package/dist/web/order.js.map +1 -1
  167. package/dist/web/parse.js +10 -1
  168. package/dist/web/parse.js.map +1 -1
  169. package/dist/web/patch.js.map +1 -1
  170. package/dist/web/range.js +151 -0
  171. package/dist/web/range.js.map +1 -0
  172. package/dist/web/stopwatch.js.map +1 -1
  173. package/dist/web/string.js +8 -5
  174. package/dist/web/string.js.map +1 -1
  175. package/dist/web/timer.js +1 -1
  176. package/dist/web/timer.js.map +1 -1
  177. package/dist/web/timespan.js +21 -8
  178. package/dist/web/timespan.js.map +1 -1
  179. package/dist/web/type-code.js.map +1 -1
  180. package/dist/web/type.js +20 -19
  181. package/dist/web/type.js.map +1 -1
  182. package/dist/web/types.js.map +1 -1
  183. package/dist/web/utilities.js +174 -39
  184. package/dist/web/utilities.js.map +1 -1
  185. package/package.json +66 -60
  186. package/src/array.ts +116 -68
  187. package/src/async-pool-executor.ts +107 -85
  188. package/src/browser/form-utilities.ts +32 -31
  189. package/src/browser/geo-location.ts +113 -113
  190. package/src/browser/native-bridge.ts +118 -116
  191. package/src/cancellable-promise.ts +102 -76
  192. package/src/clean-url-search-params.ts +36 -11
  193. package/src/collections/cache-dictionary.ts +115 -115
  194. package/src/collections/default-map.ts +48 -48
  195. package/src/collections/default-weak-map.ts +51 -51
  196. package/src/collections/from.ts +859 -859
  197. package/src/collections/index.ts +3 -3
  198. package/src/draft.ts +55 -16
  199. package/src/event-bus.ts +83 -83
  200. package/src/functions.ts +496 -0
  201. package/src/index.ts +44 -42
  202. package/src/key-value-pair.ts +24 -24
  203. package/src/lazy.ts +32 -32
  204. package/src/math.ts +33 -30
  205. package/src/order.ts +5 -5
  206. package/src/parse.ts +251 -240
  207. package/src/patch.ts +79 -79
  208. package/src/range.ts +165 -0
  209. package/src/stopwatch.ts +43 -43
  210. package/src/string.ts +8 -5
  211. package/src/timer.ts +67 -67
  212. package/src/timespan.ts +412 -398
  213. package/src/type-code.ts +15 -15
  214. package/src/type.ts +372 -371
  215. package/src/types.ts +30 -30
  216. package/src/utilities.ts +653 -480
@@ -0,0 +1,151 @@
1
+ export default class Range {
2
+ /**
3
+ * Range constructor.
4
+ * @param start
5
+ * @param end
6
+ */
7
+ constructor(start, end) {
8
+ this.start = start;
9
+ this.end = end;
10
+ }
11
+ /**
12
+ * Finds the intersection between two ranges.
13
+ *
14
+ * @param other The Range object to intersect with.
15
+ * @returns The intersected Range object, or null if there is no intersection.
16
+ */
17
+ intersect(other) {
18
+ const start = (this.start > other.start) ? this.start : other.start;
19
+ const end = (this.end < other.end) ? this.end : other.end;
20
+ if (start < end) {
21
+ return new Range(start, end);
22
+ }
23
+ else {
24
+ return null;
25
+ }
26
+ }
27
+ /**
28
+ * Subtract the given range from this range.
29
+ *
30
+ * @param other The range to subtract from this range.
31
+ * @returns An array of Range objects representing the result of the subtraction.
32
+ */
33
+ subtract(other) {
34
+ const result = [];
35
+ if (this.start >= other.end || this.end <= other.start) {
36
+ result.push(new Range(this.start, this.end));
37
+ }
38
+ else if (other.start <= this.start && other.end >= this.end) {
39
+ return result;
40
+ }
41
+ else {
42
+ if (this.start < other.start) {
43
+ result.push(new Range(this.start, other.start));
44
+ }
45
+ if (this.end > other.end) {
46
+ result.push(new Range(other.end, this.end));
47
+ }
48
+ }
49
+ return result;
50
+ }
51
+ /**
52
+ * Determines if the given range overlaps with the current range.
53
+ *
54
+ * @param other The range to be checked for overlap.
55
+ * @returns Returns true if there is an overlap between the ranges, false otherwise.
56
+ */
57
+ overlaps(other) {
58
+ const s1 = this.start;
59
+ const e1 = this.end;
60
+ const s2 = other.start;
61
+ const e2 = other.end;
62
+ return (s2 > s1 && s2 < e1 || e2 > s1 && e2 < e1) ||
63
+ (s1 > s2 && s1 < e2 || e1 > s2 && e1 < e2) ||
64
+ (s1 === s2 && e1 === e2);
65
+ }
66
+ /**
67
+ * Determines whether the specified value is within the range defined by the start and end values.
68
+ *
69
+ * @param obj The value to check if it is within the range.
70
+ * @param inclusive Optional. If set to true, the range boundaries are considered inclusive.
71
+ * @returns Returns true if the specified value is within the range, false otherwise.
72
+ */
73
+ contains(obj, inclusive = true) {
74
+ return inclusive ?
75
+ (this.start <= obj && this.end >= obj) :
76
+ (this.start < obj && this.end > obj);
77
+ }
78
+ /**
79
+ * @returns T
80
+ */
81
+ getStart() {
82
+ return this.start;
83
+ }
84
+ /**
85
+ * @returns T
86
+ */
87
+ getEnd() {
88
+ return this.end;
89
+ }
90
+ /**
91
+ * Finds the intersection between two sets of ranges.
92
+ *
93
+ * @param ranges1
94
+ * @param ranges2
95
+ * @returns
96
+ */
97
+ static intersectRanges(ranges1, ranges2) {
98
+ const result = [];
99
+ for (const r1 of ranges1) {
100
+ for (const r2 of ranges2) {
101
+ const intersection = r1.intersect(r2);
102
+ if (intersection !== null) {
103
+ result.push(intersection);
104
+ }
105
+ }
106
+ }
107
+ return result;
108
+ }
109
+ /**
110
+ * Determines if any range in the first set overlaps with any range in the second set.
111
+ *
112
+ * @param ranges1
113
+ * @param ranges2
114
+ * @returns
115
+ */
116
+ static overlapsAny(ranges1, ranges2) {
117
+ for (const r1 of ranges1) {
118
+ for (const r2 of ranges2) {
119
+ if (r1.overlaps(r2)) {
120
+ return true;
121
+ }
122
+ }
123
+ }
124
+ return false;
125
+ }
126
+ /**
127
+ * Subtracts the second set of ranges from the first set of ranges.
128
+ *
129
+ * @param ranges1
130
+ * @param ranges2
131
+ * @returns
132
+ */
133
+ static subtractRanges(ranges1, ranges2) {
134
+ let currentRanges = ranges1;
135
+ for (const r2 of ranges2) {
136
+ const nextRanges = [];
137
+ for (const r1 of currentRanges) {
138
+ const subtracted = r1.subtract(r2);
139
+ for (const s of subtracted) {
140
+ nextRanges.push(s);
141
+ }
142
+ }
143
+ currentRanges = nextRanges;
144
+ if (currentRanges.length === 0) {
145
+ break;
146
+ }
147
+ }
148
+ return currentRanges;
149
+ }
150
+ }
151
+ //# sourceMappingURL=range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range.js","sourceRoot":"","sources":["../../src/range.ts"],"names":[],"mappings":"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","sourcesContent":["export default class Range<T> {\n\n private readonly start: T;\n private readonly end: T;\n\n /**\n * Range constructor.\n * @param start\n * @param end\n */\n constructor(start: T, end: T) {\n this.start = start;\n this.end = end;\n }\n\n /**\n * Finds the intersection between two ranges.\n *\n * @param other The Range object to intersect with.\n * @returns The intersected Range object, or null if there is no intersection.\n */\n public intersect(other: Range<T>): Range<T> | null {\n const start = (this.start > other.start) ? this.start : other.start;\n const end = (this.end < other.end) ? this.end : other.end;\n\n if (start < end) {\n return new Range(start, end);\n } else {\n return null;\n }\n }\n\n /**\n * Subtract the given range from this range.\n *\n * @param other The range to subtract from this range.\n * @returns An array of Range objects representing the result of the subtraction.\n */\n public subtract(other: Range<T>): Range<T>[] {\n const result: Range<T>[] = [];\n\n if (this.start >= other.end || this.end <= other.start) {\n result.push(new Range(this.start, this.end));\n } else if (other.start <= this.start && other.end >= this.end) {\n return result;\n } else {\n if (this.start < other.start) {\n result.push(new Range(this.start, other.start));\n }\n\n if (this.end > other.end) {\n result.push(new Range(other.end, this.end));\n }\n }\n\n return result;\n }\n\n /**\n * Determines if the given range overlaps with the current range.\n *\n * @param other The range to be checked for overlap.\n * @returns Returns true if there is an overlap between the ranges, false otherwise.\n */\n public overlaps(other: Range<T>): boolean {\n const s1 = this.start;\n const e1 = this.end;\n const s2 = other.start;\n const e2 = other.end;\n\n return (s2 > s1 && s2 < e1 || e2 > s1 && e2 < e1) ||\n (s1 > s2 && s1 < e2 || e1 > s2 && e1 < e2) ||\n (s1 === s2 && e1 === e2);\n }\n\n /**\n * Determines whether the specified value is within the range defined by the start and end values.\n *\n * @param obj The value to check if it is within the range.\n * @param inclusive Optional. If set to true, the range boundaries are considered inclusive.\n * @returns Returns true if the specified value is within the range, false otherwise.\n */\n public contains(obj: T, inclusive: boolean = true): boolean {\n return inclusive ?\n (this.start <= obj && this.end >= obj) :\n (this.start < obj && this.end > obj);\n }\n\n /**\n * @returns T\n */\n public getStart(): T {\n return this.start;\n }\n\n /**\n * @returns T\n */\n public getEnd(): T {\n return this.end;\n }\n\n /**\n * Finds the intersection between two sets of ranges.\n *\n * @param ranges1\n * @param ranges2\n * @returns\n */\n public static intersectRanges<T>(ranges1: Range<T>[], ranges2: Range<T>[]): Range<T>[] {\n const result: Range<T>[] = [];\n for (const r1 of ranges1) {\n for (const r2 of ranges2) {\n const intersection = r1.intersect(r2);\n if (intersection !== null) {\n result.push(intersection);\n }\n }\n }\n return result;\n }\n\n /**\n * Determines if any range in the first set overlaps with any range in the second set.\n *\n * @param ranges1\n * @param ranges2\n * @returns\n */\n public static overlapsAny<T>(ranges1: Range<T>[], ranges2: Range<T>[]): boolean {\n for (const r1 of ranges1) {\n for (const r2 of ranges2) {\n if (r1.overlaps(r2)) {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Subtracts the second set of ranges from the first set of ranges.\n *\n * @param ranges1\n * @param ranges2\n * @returns\n */\n public static subtractRanges<T>(ranges1: Range<T>[], ranges2: Range<T>[]): Range<T>[] {\n let currentRanges = ranges1;\n for (const r2 of ranges2) {\n const nextRanges: Range<T>[] = [];\n for (const r1 of currentRanges) {\n const subtracted = r1.subtract(r2);\n for (const s of subtracted) {\n nextRanges.push(s);\n }\n }\n currentRanges = nextRanges;\n if (currentRanges.length === 0) {\n break;\n }\n }\n return currentRanges;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"stopwatch.js","sourceRoot":"","sources":["../../src/stopwatch.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AAErC,MAAM,CAAC,OAAO,OAAO,SAAS;IAA9B;QACY,cAAS,GAAkB,IAAI,CAAC;QAChC,gBAAW,GAAkB,IAAI,CAAC;IAsC9C,CAAC;IApCG;;;;;;;;;OASG;IAEH,KAAK;QACD,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,IAAI;QACA,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;YACtD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAC1B,CAAC;IACL,CAAC;IAED,MAAM;QACF,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;YACtD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,cAAc;QACV,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC;IAC9D,CAAC;CACJ","sourcesContent":["import TimeSpan from \"./timespan.js\";\r\n\r\nexport default class Stopwatch {\r\n private startTime: number | null = null;\r\n private elapsedTime: number | null = null;\r\n\r\n /*static measure<T>(callback: () => T, measure: { value: TimeSpan | null }): T {\r\n const stopwatch = new Stopwatch();\r\n stopwatch.start();\r\n try {\r\n return callback();\r\n } finally {\r\n stopwatch.stop();\r\n measure.value = stopwatch.getElapsedTime();\r\n }\r\n }*/\r\n\r\n start(): void {\r\n this.startTime = performance.now();\r\n this.elapsedTime = null;\r\n }\r\n\r\n stop(): void {\r\n if (this.startTime !== null) {\r\n this.elapsedTime = performance.now() - this.startTime;\r\n this.startTime = null;\r\n }\r\n }\r\n\r\n resume(): void {\r\n if (this.elapsedTime !== null) {\r\n this.startTime = performance.now() - this.elapsedTime;\r\n this.elapsedTime = null;\r\n }\r\n }\r\n\r\n getElapsedTime(): TimeSpan {\r\n if (this.startTime !== null) {\r\n return TimeSpan.fromMilliseconds(performance.now() - this.startTime);\r\n }\r\n return TimeSpan.fromMilliseconds(this.elapsedTime ?? 0.0);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"stopwatch.js","sourceRoot":"","sources":["../../src/stopwatch.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AAErC,MAAM,CAAC,OAAO,OAAO,SAAS;IAA9B;QACY,cAAS,GAAkB,IAAI,CAAC;QAChC,gBAAW,GAAkB,IAAI,CAAC;IAsC9C,CAAC;IApCG;;;;;;;;;OASG;IAEH,KAAK;QACD,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,IAAI;QACA,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;YACtD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAC1B,CAAC;IACL,CAAC;IAED,MAAM;QACF,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;YACtD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,cAAc;QACV,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC;IAC9D,CAAC;CACJ","sourcesContent":["import TimeSpan from \"./timespan.js\";\n\nexport default class Stopwatch {\n private startTime: number | null = null;\n private elapsedTime: number | null = null;\n\n /*static measure<T>(callback: () => T, measure: { value: TimeSpan | null }): T {\n const stopwatch = new Stopwatch();\n stopwatch.start();\n try {\n return callback();\n } finally {\n stopwatch.stop();\n measure.value = stopwatch.getElapsedTime();\n }\n }*/\n\n start(): void {\n this.startTime = performance.now();\n this.elapsedTime = null;\n }\n\n stop(): void {\n if (this.startTime !== null) {\n this.elapsedTime = performance.now() - this.startTime;\n this.startTime = null;\n }\n }\n\n resume(): void {\n if (this.elapsedTime !== null) {\n this.startTime = performance.now() - this.elapsedTime;\n this.elapsedTime = null;\n }\n }\n\n getElapsedTime(): TimeSpan {\n if (this.startTime !== null) {\n return TimeSpan.fromMilliseconds(performance.now() - this.startTime);\n }\n return TimeSpan.fromMilliseconds(this.elapsedTime ?? 0.0);\n }\n}\n"]}
@@ -31,7 +31,8 @@ export function ensureSuffix(str, suffix) {
31
31
  */
32
32
  export function format(template, ...args) {
33
33
  let regex;
34
- if (args.length === 1 && typeof args[0] === 'object') {
34
+ const hasNamedPlaceholders = /{(?!\d+})[^{}]+}/.test(template);
35
+ if (args.length === 1 && args[0] !== null && typeof args[0] === 'object' && hasNamedPlaceholders) {
35
36
  args = args[0];
36
37
  regex = /{(.+?)}/g;
37
38
  }
@@ -39,7 +40,9 @@ export function format(template, ...args) {
39
40
  regex = /{(\d+?)}/g;
40
41
  }
41
42
  return template.replace(regex, (match, key) => {
42
- return typeof args[key] !== 'undefined' ? args[key] : "";
43
+ return Object.prototype.hasOwnProperty.call(args, key) && typeof args[key] !== 'undefined'
44
+ ? args[key]
45
+ : "";
43
46
  });
44
47
  }
45
48
  /**
@@ -55,11 +58,11 @@ function toWords(str) {
55
58
  return [];
56
59
  return str
57
60
  // Insert a space between a lowercase/digit and an uppercase letter (camelCase -> camel Case)
58
- .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
61
+ .replace(/([\p{Ll}\p{N}])(\p{Lu})/gu, '$1 $2')
59
62
  // Insert a space between consecutive uppercase letters followed by a lowercase letter (XMLParser -> XML Parser)
60
- .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
63
+ .replace(/(\p{Lu}+)(\p{Lu}\p{Ll})/gu, '$1 $2')
61
64
  // Replace any non-alphanumeric character with a space
62
- .replace(/[^a-zA-Z0-9]+/g, ' ')
65
+ .replace(/[^\p{L}\p{N}]+/gu, ' ')
63
66
  .trim()
64
67
  .toLowerCase()
65
68
  .split(/\s+/)
@@ -1 +1 @@
1
- {"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/string.ts"],"names":[],"mappings":"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","sourcesContent":["\n/**\n * Ensures that a given string has a specific prefix.\n *\n * @param {string} str - The string to ensure the prefix on.\n * @param {string} prefix - The prefix to ensure on the string.\n * @return {string} - The resulting string with the ensured prefix.\n */\nexport function ensurePrefix(str: string, prefix: string): string {\n if (!str.startsWith(prefix))\n return prefix + str\n return str\n}\n\n\n/**\n * Ensures that a string ends with a specified suffix.\n *\n * @param {string} str - The original string.\n * @param {string} suffix - The suffix to ensure.\n * @return {string} - The modified string with the suffix added if it was not already present.\n */\nexport function ensureSuffix(str: string, suffix: string): string {\n if (!str.endsWith(suffix))\n return str + suffix\n return str\n}\n\n/**\n * Formats a string using a template and provided arguments.\n *\n * @param {string} template - The template string containing placeholders.\n * @param {any[]} args - Optional arguments to replace the placeholders in the template.\n * @return {string} The formatted string.\n */\nexport function format(template: string, ...args: any[]): string {\n\n let regex: RegExp;\n if (args.length === 1 && typeof args[0] === 'object') {\n args = args[0];\n regex = /{(.+?)}/g;\n } else {\n regex = /{(\\d+?)}/g;\n }\n\n return template.replace(regex, (match, key) => {\n return typeof args[key] !== 'undefined' ? args[key] : \"\";\n });\n}\n\n/**\n * Splits a string into its constituent words, regardless of the original case\n * style (camelCase, PascalCase, snake_case, kebab-case, CONSTANT_CASE,\n * space-separated, etc.).\n *\n * @param {string} str - The string to split into words.\n * @return {string[]} - The list of lowercase words extracted from the input.\n */\nfunction toWords(str: string): string[] {\n if (!str) return [];\n\n return str\n // Insert a space between a lowercase/digit and an uppercase letter (camelCase -> camel Case)\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n // Insert a space between consecutive uppercase letters followed by a lowercase letter (XMLParser -> XML Parser)\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n // Replace any non-alphanumeric character with a space\n .replace(/[^a-zA-Z0-9]+/g, ' ')\n .trim()\n .toLowerCase()\n .split(/\\s+/)\n .filter(Boolean);\n}\n\n/**\n * Converts a string to snake_case.\n *\n * @param {string} str - The string to convert.\n * @return {string} - The string converted to snake_case.\n */\nexport function toSnakeCase(str: string): string {\n return toWords(str).join('_');\n}\n\n/**\n * Converts a string to kebab-case.\n *\n * @param {string} str - The string to convert.\n * @return {string} - The string converted to kebab-case.\n */\nexport function toKebabCase(str: string): string {\n return toWords(str).join('-');\n}\n\n/**\n * Converts a string to camelCase.\n *\n * @param {string} str - The string to convert.\n * @return {string} - The string converted to camelCase.\n */\nexport function toCamelCase(str: string): string {\n const words = toWords(str);\n if (words.length === 0) return '';\n return words\n .map((word, i) => i === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1))\n .join('');\n}\n\n/**\n * Converts a string to PascalCase.\n *\n * @param {string} str - The string to convert.\n * @return {string} - The string converted to PascalCase.\n */\nexport function toPascalCase(str: string): string {\n return toWords(str)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join('');\n}\n\n/**\n * Converts a string to CONSTANT_CASE (a.k.a. SCREAMING_SNAKE_CASE).\n *\n * @param {string} str - The string to convert.\n * @return {string} - The string converted to CONSTANT_CASE.\n */\nexport function toConstantCase(str: string): string {\n return toWords(str).join('_').toUpperCase();\n}"]}
1
+ {"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/string.ts"],"names":[],"mappings":"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","sourcesContent":["\n/**\n * Ensures that a given string has a specific prefix.\n *\n * @param {string} str - The string to ensure the prefix on.\n * @param {string} prefix - The prefix to ensure on the string.\n * @return {string} - The resulting string with the ensured prefix.\n */\nexport function ensurePrefix(str: string, prefix: string): string {\n if (!str.startsWith(prefix))\n return prefix + str\n return str\n}\n\n\n/**\n * Ensures that a string ends with a specified suffix.\n *\n * @param {string} str - The original string.\n * @param {string} suffix - The suffix to ensure.\n * @return {string} - The modified string with the suffix added if it was not already present.\n */\nexport function ensureSuffix(str: string, suffix: string): string {\n if (!str.endsWith(suffix))\n return str + suffix\n return str\n}\n\n/**\n * Formats a string using a template and provided arguments.\n *\n * @param {string} template - The template string containing placeholders.\n * @param {any[]} args - Optional arguments to replace the placeholders in the template.\n * @return {string} The formatted string.\n */\nexport function format(template: string, ...args: any[]): string {\n\n let regex: RegExp;\n const hasNamedPlaceholders = /{(?!\\d+})[^{}]+}/.test(template);\n if (args.length === 1 && args[0] !== null && typeof args[0] === 'object' && hasNamedPlaceholders) {\n args = args[0];\n regex = /{(.+?)}/g;\n } else {\n regex = /{(\\d+?)}/g;\n }\n\n return template.replace(regex, (match, key) => {\n return Object.prototype.hasOwnProperty.call(args, key) && typeof args[key] !== 'undefined'\n ? args[key]\n : \"\";\n });\n}\n\n/**\n * Splits a string into its constituent words, regardless of the original case\n * style (camelCase, PascalCase, snake_case, kebab-case, CONSTANT_CASE,\n * space-separated, etc.).\n *\n * @param {string} str - The string to split into words.\n * @return {string[]} - The list of lowercase words extracted from the input.\n */\nfunction toWords(str: string): string[] {\n if (!str) return [];\n\n return str\n // Insert a space between a lowercase/digit and an uppercase letter (camelCase -> camel Case)\n .replace(/([\\p{Ll}\\p{N}])(\\p{Lu})/gu, '$1 $2')\n // Insert a space between consecutive uppercase letters followed by a lowercase letter (XMLParser -> XML Parser)\n .replace(/(\\p{Lu}+)(\\p{Lu}\\p{Ll})/gu, '$1 $2')\n // Replace any non-alphanumeric character with a space\n .replace(/[^\\p{L}\\p{N}]+/gu, ' ')\n .trim()\n .toLowerCase()\n .split(/\\s+/)\n .filter(Boolean);\n}\n\n/**\n * Converts a string to snake_case.\n *\n * @param {string} str - The string to convert.\n * @return {string} - The string converted to snake_case.\n */\nexport function toSnakeCase(str: string): string {\n return toWords(str).join('_');\n}\n\n/**\n * Converts a string to kebab-case.\n *\n * @param {string} str - The string to convert.\n * @return {string} - The string converted to kebab-case.\n */\nexport function toKebabCase(str: string): string {\n return toWords(str).join('-');\n}\n\n/**\n * Converts a string to camelCase.\n *\n * @param {string} str - The string to convert.\n * @return {string} - The string converted to camelCase.\n */\nexport function toCamelCase(str: string): string {\n const words = toWords(str);\n if (words.length === 0) return '';\n return words\n .map((word, i) => i === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1))\n .join('');\n}\n\n/**\n * Converts a string to PascalCase.\n *\n * @param {string} str - The string to convert.\n * @return {string} - The string converted to PascalCase.\n */\nexport function toPascalCase(str: string): string {\n return toWords(str)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join('');\n}\n\n/**\n * Converts a string to CONSTANT_CASE (a.k.a. SCREAMING_SNAKE_CASE).\n *\n * @param {string} str - The string to convert.\n * @return {string} - The string converted to CONSTANT_CASE.\n */\nexport function toConstantCase(str: string): string {\n return toWords(str).join('_').toUpperCase();\n}"]}
package/dist/esm/timer.js CHANGED
@@ -4,7 +4,7 @@
4
4
  export default class Timer {
5
5
  /**
6
6
  * @param callback Callback
7
- * @param interval Seconds between calls
7
+ * @param interval Milliseconds between calls
8
8
  */
9
9
  constructor(callback, interval) {
10
10
  this._callback = callback;
@@ -1 +1 @@
1
- {"version":3,"file":"timer.js","sourceRoot":"","sources":["../../src/timer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,KAAK;IAMtB;;;OAGG;IACH,YAAY,QAAoB,EAAE,QAAgB;QAC9C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC5B,CAAC;IAGD,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC;IACvE,CAAC;IAED,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAI,QAAQ,CAAC,KAAa;QACtB,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,IAAI,CAAC,OAAO;gBACZ,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;IACL,CAAC;IAED,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAI,QAAQ,CAAC,KAAiB;QAC1B,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAC3B,CAAC;IACL,CAAC;IAGD,KAAK;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;gBAChC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;oBACtB,IAAI,CAAC,SAAS,EAAE,CAAC;YACzB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;IACL,CAAC;IAED,IAAI;QACA,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YAC5B,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAChC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,OAAO;QACH,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;CACJ","sourcesContent":["/**\r\n * A class representing a timer that executes a callback function at a specified interval.\r\n */\r\nexport default class Timer {\r\n\r\n private _callback: () => void;\r\n private _interval: number;\r\n private _intervalId: any | null;\r\n\r\n /**\r\n * @param callback Callback\r\n * @param interval Seconds between calls\r\n */\r\n constructor(callback: () => void, interval: number) {\r\n this._callback = callback;\r\n this._interval = interval;\r\n this._intervalId = null;\r\n }\r\n\r\n \r\n get running(): boolean {\r\n return this._intervalId !== null && this._intervalId !== undefined;\r\n }\r\n\r\n get interval(): number {\r\n return this._interval;\r\n }\r\n\r\n set interval(value: number) {\r\n if (value != this._interval) {\r\n this._interval = value;\r\n if (this.running)\r\n this.restart();\r\n }\r\n }\r\n\r\n get callback(): () => void {\r\n return this._callback;\r\n }\r\n\r\n set callback(value: () => void) {\r\n if (value != this._callback) {\r\n this._callback = value;\r\n }\r\n }\r\n\r\n\r\n start(): void {\r\n if (this._intervalId === null) {\r\n this._intervalId = setInterval(() => {\r\n if (this._callback != null)\r\n this._callback();\r\n }, this._interval);\r\n }\r\n }\r\n\r\n stop(): void {\r\n if (this._intervalId !== null) {\r\n clearInterval(this._intervalId);\r\n this._intervalId = null;\r\n }\r\n }\r\n\r\n restart(): void {\r\n this.stop();\r\n this.start();\r\n }\r\n}"]}
1
+ {"version":3,"file":"timer.js","sourceRoot":"","sources":["../../src/timer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,KAAK;IAMtB;;;OAGG;IACH,YAAY,QAAoB,EAAE,QAAgB;QAC9C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC5B,CAAC;IAGD,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC;IACvE,CAAC;IAED,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAI,QAAQ,CAAC,KAAa;QACtB,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,IAAI,CAAC,OAAO;gBACZ,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;IACL,CAAC;IAED,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAI,QAAQ,CAAC,KAAiB;QAC1B,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAC3B,CAAC;IACL,CAAC;IAGD,KAAK;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;gBAChC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;oBACtB,IAAI,CAAC,SAAS,EAAE,CAAC;YACzB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;IACL,CAAC;IAED,IAAI;QACA,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YAC5B,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAChC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,OAAO;QACH,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;CACJ","sourcesContent":["/**\n * A class representing a timer that executes a callback function at a specified interval.\n */\nexport default class Timer {\n\n private _callback: () => void;\n private _interval: number;\n private _intervalId: any | null;\n\n /**\n * @param callback Callback\n * @param interval Milliseconds between calls\n */\n constructor(callback: () => void, interval: number) {\n this._callback = callback;\n this._interval = interval;\n this._intervalId = null;\n }\n\n \n get running(): boolean {\n return this._intervalId !== null && this._intervalId !== undefined;\n }\n\n get interval(): number {\n return this._interval;\n }\n\n set interval(value: number) {\n if (value != this._interval) {\n this._interval = value;\n if (this.running)\n this.restart();\n }\n }\n\n get callback(): () => void {\n return this._callback;\n }\n\n set callback(value: () => void) {\n if (value != this._callback) {\n this._callback = value;\n }\n }\n\n\n start(): void {\n if (this._intervalId === null) {\n this._intervalId = setInterval(() => {\n if (this._callback != null)\n this._callback();\n }, this._interval);\n }\n }\n\n stop(): void {\n if (this._intervalId !== null) {\n clearInterval(this._intervalId);\n this._intervalId = null;\n }\n }\n\n restart(): void {\n this.stop();\n this.start();\n }\n}"]}
@@ -235,7 +235,8 @@ class TimeSpan {
235
235
  const formatLower = format.toLowerCase();
236
236
  const hasHours = formatLower.includes("h");
237
237
  const hasMinutes = formatLower.includes("m");
238
- let hours = 0, minutes = 0, seconds = Math.floor(this.milliseconds / 1000);
238
+ const sign = this.milliseconds < 0 ? "-" : "";
239
+ let hours = 0, minutes = 0, seconds = Math.floor(Math.abs(this.milliseconds) / 1000);
239
240
  if (hasHours) {
240
241
  hours = Math.floor(seconds / 3600);
241
242
  seconds -= hours * 3600;
@@ -247,13 +248,25 @@ class TimeSpan {
247
248
  const hoursPadded = String(hours).padStart(2, '0');
248
249
  const minutesPadded = String(minutes).padStart(2, '0');
249
250
  const secondsPadded = String(seconds).padStart(2, '0');
250
- return formatLower
251
- .replace('hh', hoursPadded)
252
- .replace('h', hours.toString())
253
- .replace('mm', minutesPadded)
254
- .replace('m', minutes.toString())
255
- .replace('ss', secondsPadded)
256
- .replace('s', seconds.toString());
251
+ const formatted = formatLower.replace(/hh|h|mm|m|ss|s/g, token => {
252
+ switch (token) {
253
+ case 'hh':
254
+ return hoursPadded;
255
+ case 'h':
256
+ return hours.toString();
257
+ case 'mm':
258
+ return minutesPadded;
259
+ case 'm':
260
+ return minutes.toString();
261
+ case 'ss':
262
+ return secondsPadded;
263
+ case 's':
264
+ return seconds.toString();
265
+ default:
266
+ return token;
267
+ }
268
+ });
269
+ return sign + formatted;
257
270
  }
258
271
  /**
259
272
  * Checks if this TimeSpan is equal to another.
@@ -1 +1 @@
1
- {"version":3,"file":"timespan.js","sourceRoot":"","sources":["../../src/timespan.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Represents a duration of time in milliseconds.\r\n */\r\nexport default class TimeSpan {\r\n public milliseconds: number;\r\n\r\n private constructor(milliseconds: number) {\r\n this.milliseconds = milliseconds;\r\n }\r\n\r\n\r\n /**\r\n * Gets the time interval in seconds.\r\n * @returns {number} The duration in seconds.\r\n */\r\n seconds(): number {\r\n return this.milliseconds / 1000;\r\n }\r\n\r\n /**\r\n * Gets the time interval in minutes.\r\n * @returns {number} The duration in minutes.\r\n */\r\n minutes(): number {\r\n return this.milliseconds / (1000 * 60);\r\n }\r\n\r\n /**\r\n * Gets the time interval in hours.\r\n * @returns {number} The duration in hours.\r\n */\r\n hours(): number {\r\n return this.milliseconds / (1000 * 60 * 60);\r\n }\r\n\r\n /**\r\n * Gets the time interval in days.\r\n * @returns {number} The duration in days.\r\n */\r\n days(): number {\r\n return this.milliseconds / (1000 * 60 * 60 * 24);\r\n }\r\n\r\n /**\r\n * Gets the time interval in weeks.\r\n * @returns {number} The duration in weeks.\r\n */\r\n weeks(): number {\r\n return this.milliseconds / (1000 * 60 * 60 * 24 * 7);\r\n }\r\n\r\n /**\r\n * Creates a TimeSpan from a specified number of milliseconds.\r\n * @param {number} milliseconds - The number of milliseconds.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n static fromMilliseconds(milliseconds: number): TimeSpan {\r\n return new TimeSpan(milliseconds);\r\n }\r\n\r\n /**\r\n * Creates a TimeSpan from a specified number of seconds.\r\n * @param {number} seconds - The number of seconds.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n static fromSeconds(seconds: number): TimeSpan {\r\n return new TimeSpan(seconds * 1000);\r\n }\r\n\r\n /**\r\n * Creates a TimeSpan from a specified number of minutes.\r\n * @param {number} minutes - The number of minutes.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n static fromMinutes(minutes: number): TimeSpan {\r\n return new TimeSpan(minutes * 1000 * 60);\r\n }\r\n\r\n /**\r\n * Creates a TimeSpan from a specified number of hours.\r\n * @param {number} hours - The number of hours.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n static fromHours(hours: number): TimeSpan {\r\n return new TimeSpan(hours * 1000 * 60 * 60);\r\n }\r\n\r\n /**\r\n * Creates a TimeSpan from a specified number of days.\r\n * @param {number} days - The number of days.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n static fromDays(days: number): TimeSpan {\r\n return new TimeSpan(days * 1000 * 60 * 60 * 24);\r\n }\r\n\r\n /**\r\n * Creates a TimeSpan from a specified number of weeks.\r\n * @param {number} weeks - The number of weeks.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n static fromWeeks(weeks: number): TimeSpan {\r\n return new TimeSpan(weeks * 1000 * 60 * 60 * 24 * 7);\r\n }\r\n\r\n /**\r\n * Returns a new TimeSpan that adds the specified number of milliseconds to this instance.\r\n * @param {number} milliseconds - The milliseconds to add.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n addMilliseconds(milliseconds: number): TimeSpan {\r\n return new TimeSpan(this.milliseconds + milliseconds);\r\n }\r\n\r\n /**\r\n * Returns a new TimeSpan that adds the specified number of seconds to this instance.\r\n * @param {number} seconds - The seconds to add.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n addSeconds(seconds: number): TimeSpan {\r\n return this.addMilliseconds(seconds * 1000);\r\n }\r\n\r\n /**\r\n * Returns a new TimeSpan that adds the specified number of minutes to this instance.\r\n * @param {number} minutes - The minutes to add.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n addMinutes(minutes: number): TimeSpan {\r\n return this.addMilliseconds(minutes * 1000 * 60);\r\n }\r\n\r\n /**\r\n * Returns a new TimeSpan that adds the specified number of hours to this instance.\r\n * @param {number} hours - The hours to add.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n addHours(hours: number): TimeSpan {\r\n return this.addMilliseconds(hours * 1000 * 60 * 60);\r\n }\r\n\r\n /**\r\n * Returns a new TimeSpan that adds the specified number of days to this instance.\r\n * @param {number} days - The days to add.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n addDays(days: number): TimeSpan {\r\n return this.addMilliseconds(days * 1000 * 60 * 60 * 24);\r\n }\r\n\r\n /**\r\n * Returns a new TimeSpan that adds the specified number of weeks to this instance.\r\n * @param {number} weeks - The weeks to add.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n addWeeks(weeks: number): TimeSpan {\r\n return this.addMilliseconds(weeks * 1000 * 60 * 60 * 24 * 7);\r\n }\r\n\r\n /**\r\n * Returns a new TimeSpan that subtracts the specified number of milliseconds from this instance.\r\n * @param {number} milliseconds - The milliseconds to subtract.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n subtractMilliseconds(milliseconds: number): TimeSpan {\r\n return new TimeSpan(this.milliseconds - milliseconds);\r\n }\r\n\r\n /**\r\n * Returns a new TimeSpan that subtracts the specified number of seconds from this instance.\r\n * @param {number} seconds - The seconds to subtract.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n subtractSeconds(seconds: number): TimeSpan {\r\n return this.subtractMilliseconds(seconds * 1000);\r\n }\r\n\r\n /**\r\n * Returns a new TimeSpan that subtracts the specified number of minutes from this instance.\r\n * @param {number} minutes - The minutes to subtract.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n subtractMinutes(minutes: number): TimeSpan {\r\n return this.subtractMilliseconds(minutes * 1000 * 60);\r\n }\r\n\r\n /**\r\n * Returns a new TimeSpan that subtracts the specified number of hours from this instance.\r\n * @param {number} hours - The hours to subtract.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n subtractHours(hours: number): TimeSpan {\r\n return this.subtractMilliseconds(hours * 1000 * 60 * 60);\r\n }\r\n\r\n /**\r\n * Returns a new TimeSpan that subtracts the specified number of days from this instance.\r\n * @param {number} days - The days to subtract.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n subtractDays(days: number): TimeSpan {\r\n return this.subtractMilliseconds(days * 1000 * 60 * 60 * 24);\r\n }\r\n\r\n /**\r\n * Returns a new TimeSpan that subtracts the specified number of weeks from this instance.\r\n * @param {number} weeks - The weeks to subtract.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n subtractWeeks(weeks: number): TimeSpan {\r\n return this.subtractMilliseconds(weeks * 1000 * 60 * 60 * 24 * 7);\r\n }\r\n\r\n /**\r\n * Returns a new TimeSpan that adds the specified TimeSpan to this instance.\r\n * @param {TimeSpan} other - The TimeSpan to add.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n add(other: TimeSpan): TimeSpan {\r\n return new TimeSpan(this.milliseconds + other.milliseconds);\r\n }\r\n\r\n /**\r\n * Returns a new TimeSpan that subtracts the specified TimeSpan from this instance.\r\n * @param {TimeSpan} other - The TimeSpan to subtract.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n subtract(other: TimeSpan): TimeSpan {\r\n return new TimeSpan(this.milliseconds - other.milliseconds);\r\n }\r\n\r\n /**\r\n * Adds this TimeSpan to a specified Date.\r\n * @param {Date} date - The date to add to.\r\n * @returns {Date} A new Date instance.\r\n */\r\n addTo(date: Date): Date {\r\n return new Date(date.getTime() + this.milliseconds);\r\n }\r\n\r\n /**\r\n * Subtracts this TimeSpan from a specified Date.\r\n * @param {Date} date - The date to subtract from.\r\n * @returns {Date} A new Date instance.\r\n */\r\n subtractFrom(date: Date): Date {\r\n return new Date(date.getTime() - this.milliseconds);\r\n }\r\n\r\n /**\r\n * Creates a TimeSpan from the difference between two dates.\r\n * @param {Date} earlierDate - The earlier date.\r\n * @param {Date} laterDate - The later date.\r\n * @returns {TimeSpan} A new TimeSpan instance representing the difference.\r\n */\r\n static fromDifference(earlierDate: Date, laterDate: Date): TimeSpan {\r\n return new TimeSpan(laterDate.getTime() - earlierDate.getTime());\r\n }\r\n\r\n /**\r\n * Formats the TimeSpan as a string.\r\n * Supported tokens: hh, h, mm, m, ss, s.\r\n * @param {string} format - The format string (default: 'hh:mm:ss').\r\n * @returns {string} The formatted string.\r\n */\r\n format(format: string = 'hh:mm:ss'): string {\r\n const formatLower = format.toLowerCase();\r\n const hasHours = formatLower.includes(\"h\");\r\n const hasMinutes = formatLower.includes(\"m\");\r\n\r\n let hours = 0, minutes = 0, seconds = Math.floor(this.milliseconds / 1000);\r\n\r\n if (hasHours) {\r\n hours = Math.floor(seconds / 3600);\r\n seconds -= hours * 3600;\r\n }\r\n if (hasMinutes) {\r\n minutes = Math.floor(seconds / 60);\r\n seconds -= minutes * 60;\r\n }\r\n\r\n const hoursPadded = String(hours).padStart(2, '0');\r\n const minutesPadded = String(minutes).padStart(2, '0');\r\n const secondsPadded = String(seconds).padStart(2, '0');\r\n\r\n return formatLower\r\n .replace('hh', hoursPadded)\r\n .replace('h', hours.toString())\r\n .replace('mm', minutesPadded)\r\n .replace('m', minutes.toString())\r\n .replace('ss', secondsPadded)\r\n .replace('s', seconds.toString());\r\n }\r\n\r\n /**\r\n * Checks if this TimeSpan is equal to another.\r\n * @param {TimeSpan} other - The other TimeSpan.\r\n * @returns {boolean} True if equal.\r\n */\r\n eq(other: TimeSpan): boolean {\r\n return this.milliseconds === other.milliseconds;\r\n }\r\n\r\n /**\r\n * Checks if this TimeSpan is less than or equal to another.\r\n * @param {TimeSpan} other - The other TimeSpan.\r\n * @returns {boolean} True if less than or equal.\r\n */\r\n le(other: TimeSpan): boolean {\r\n return this.milliseconds <= other.milliseconds;\r\n }\r\n\r\n /**\r\n * Checks if this TimeSpan is less than another.\r\n * @param {TimeSpan} other - The other TimeSpan.\r\n * @returns {boolean} True if less than.\r\n */\r\n lt(other: TimeSpan): boolean {\r\n return this.milliseconds < other.milliseconds;\r\n }\r\n\r\n /**\r\n * Checks if this TimeSpan is greater than or equal to another.\r\n * @param {TimeSpan} other - The other TimeSpan.\r\n * @returns {boolean} True if greater than or equal.\r\n */\r\n ge(other: TimeSpan): boolean {\r\n return this.milliseconds >= other.milliseconds;\r\n }\r\n\r\n /**\r\n * Checks if this TimeSpan is greater than another.\r\n * @param {TimeSpan} other - The other TimeSpan.\r\n * @returns {boolean} True if greater than.\r\n */\r\n gt(other: TimeSpan): boolean {\r\n return this.milliseconds > other.milliseconds;\r\n }\r\n\r\n /**\r\n * Multiplies the TimeSpan by a number.\r\n * @param {number} number - The multiplier.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n multiply(number: number): TimeSpan {\r\n return new TimeSpan(this.milliseconds * number);\r\n }\r\n\r\n /**\r\n * Divides the TimeSpan by a number.\r\n * @param {number} number - The divisor.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n divide(number: number): TimeSpan {\r\n return new TimeSpan(this.milliseconds / number);\r\n }\r\n\r\n /**\r\n * Returns the absolute value of the TimeSpan.\r\n * @returns {TimeSpan} A new TimeSpan instance.\r\n */\r\n abs(): TimeSpan {\r\n return new TimeSpan(Math.abs(this.milliseconds));\r\n }\r\n\r\n /**\r\n * Infinite duration.\r\n */\r\n static readonly INFINITE = new TimeSpan(Number.POSITIVE_INFINITY);\r\n\r\n /**\r\n * Negative infinite duration.\r\n */\r\n static readonly NEGATIVE_INFINITE = new TimeSpan(Number.NEGATIVE_INFINITY);\r\n\r\n /**\r\n * Checks if the TimeSpan is infinite.\r\n * @returns {boolean} True if infinite.\r\n */\r\n isInfinite() {\r\n return this.milliseconds === Number.POSITIVE_INFINITY || this.milliseconds === Number.NEGATIVE_INFINITY\r\n }\r\n\r\n /**\r\n * Checks if the TimeSpan is positive infinite.\r\n * @returns {boolean} True if positive infinite.\r\n */\r\n isPositiveInfinite(): boolean {\r\n return this.milliseconds === Number.POSITIVE_INFINITY;\r\n }\r\n\r\n /**\r\n * Checks if the TimeSpan is negative infinite.\r\n * @returns {boolean} True if negative infinite.\r\n */\r\n isNegativeInfinite(): boolean {\r\n return this.milliseconds === Number.NEGATIVE_INFINITY;\r\n }\r\n}"]}
1
+ {"version":3,"file":"timespan.js","sourceRoot":"","sources":["../../src/timespan.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Represents a duration of time in milliseconds.\n */\nexport default class TimeSpan {\n public milliseconds: number;\n\n private constructor(milliseconds: number) {\n this.milliseconds = milliseconds;\n }\n\n\n /**\n * Gets the time interval in seconds.\n * @returns {number} The duration in seconds.\n */\n seconds(): number {\n return this.milliseconds / 1000;\n }\n\n /**\n * Gets the time interval in minutes.\n * @returns {number} The duration in minutes.\n */\n minutes(): number {\n return this.milliseconds / (1000 * 60);\n }\n\n /**\n * Gets the time interval in hours.\n * @returns {number} The duration in hours.\n */\n hours(): number {\n return this.milliseconds / (1000 * 60 * 60);\n }\n\n /**\n * Gets the time interval in days.\n * @returns {number} The duration in days.\n */\n days(): number {\n return this.milliseconds / (1000 * 60 * 60 * 24);\n }\n\n /**\n * Gets the time interval in weeks.\n * @returns {number} The duration in weeks.\n */\n weeks(): number {\n return this.milliseconds / (1000 * 60 * 60 * 24 * 7);\n }\n\n /**\n * Creates a TimeSpan from a specified number of milliseconds.\n * @param {number} milliseconds - The number of milliseconds.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n static fromMilliseconds(milliseconds: number): TimeSpan {\n return new TimeSpan(milliseconds);\n }\n\n /**\n * Creates a TimeSpan from a specified number of seconds.\n * @param {number} seconds - The number of seconds.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n static fromSeconds(seconds: number): TimeSpan {\n return new TimeSpan(seconds * 1000);\n }\n\n /**\n * Creates a TimeSpan from a specified number of minutes.\n * @param {number} minutes - The number of minutes.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n static fromMinutes(minutes: number): TimeSpan {\n return new TimeSpan(minutes * 1000 * 60);\n }\n\n /**\n * Creates a TimeSpan from a specified number of hours.\n * @param {number} hours - The number of hours.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n static fromHours(hours: number): TimeSpan {\n return new TimeSpan(hours * 1000 * 60 * 60);\n }\n\n /**\n * Creates a TimeSpan from a specified number of days.\n * @param {number} days - The number of days.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n static fromDays(days: number): TimeSpan {\n return new TimeSpan(days * 1000 * 60 * 60 * 24);\n }\n\n /**\n * Creates a TimeSpan from a specified number of weeks.\n * @param {number} weeks - The number of weeks.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n static fromWeeks(weeks: number): TimeSpan {\n return new TimeSpan(weeks * 1000 * 60 * 60 * 24 * 7);\n }\n\n /**\n * Returns a new TimeSpan that adds the specified number of milliseconds to this instance.\n * @param {number} milliseconds - The milliseconds to add.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n addMilliseconds(milliseconds: number): TimeSpan {\n return new TimeSpan(this.milliseconds + milliseconds);\n }\n\n /**\n * Returns a new TimeSpan that adds the specified number of seconds to this instance.\n * @param {number} seconds - The seconds to add.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n addSeconds(seconds: number): TimeSpan {\n return this.addMilliseconds(seconds * 1000);\n }\n\n /**\n * Returns a new TimeSpan that adds the specified number of minutes to this instance.\n * @param {number} minutes - The minutes to add.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n addMinutes(minutes: number): TimeSpan {\n return this.addMilliseconds(minutes * 1000 * 60);\n }\n\n /**\n * Returns a new TimeSpan that adds the specified number of hours to this instance.\n * @param {number} hours - The hours to add.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n addHours(hours: number): TimeSpan {\n return this.addMilliseconds(hours * 1000 * 60 * 60);\n }\n\n /**\n * Returns a new TimeSpan that adds the specified number of days to this instance.\n * @param {number} days - The days to add.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n addDays(days: number): TimeSpan {\n return this.addMilliseconds(days * 1000 * 60 * 60 * 24);\n }\n\n /**\n * Returns a new TimeSpan that adds the specified number of weeks to this instance.\n * @param {number} weeks - The weeks to add.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n addWeeks(weeks: number): TimeSpan {\n return this.addMilliseconds(weeks * 1000 * 60 * 60 * 24 * 7);\n }\n\n /**\n * Returns a new TimeSpan that subtracts the specified number of milliseconds from this instance.\n * @param {number} milliseconds - The milliseconds to subtract.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n subtractMilliseconds(milliseconds: number): TimeSpan {\n return new TimeSpan(this.milliseconds - milliseconds);\n }\n\n /**\n * Returns a new TimeSpan that subtracts the specified number of seconds from this instance.\n * @param {number} seconds - The seconds to subtract.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n subtractSeconds(seconds: number): TimeSpan {\n return this.subtractMilliseconds(seconds * 1000);\n }\n\n /**\n * Returns a new TimeSpan that subtracts the specified number of minutes from this instance.\n * @param {number} minutes - The minutes to subtract.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n subtractMinutes(minutes: number): TimeSpan {\n return this.subtractMilliseconds(minutes * 1000 * 60);\n }\n\n /**\n * Returns a new TimeSpan that subtracts the specified number of hours from this instance.\n * @param {number} hours - The hours to subtract.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n subtractHours(hours: number): TimeSpan {\n return this.subtractMilliseconds(hours * 1000 * 60 * 60);\n }\n\n /**\n * Returns a new TimeSpan that subtracts the specified number of days from this instance.\n * @param {number} days - The days to subtract.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n subtractDays(days: number): TimeSpan {\n return this.subtractMilliseconds(days * 1000 * 60 * 60 * 24);\n }\n\n /**\n * Returns a new TimeSpan that subtracts the specified number of weeks from this instance.\n * @param {number} weeks - The weeks to subtract.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n subtractWeeks(weeks: number): TimeSpan {\n return this.subtractMilliseconds(weeks * 1000 * 60 * 60 * 24 * 7);\n }\n\n /**\n * Returns a new TimeSpan that adds the specified TimeSpan to this instance.\n * @param {TimeSpan} other - The TimeSpan to add.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n add(other: TimeSpan): TimeSpan {\n return new TimeSpan(this.milliseconds + other.milliseconds);\n }\n\n /**\n * Returns a new TimeSpan that subtracts the specified TimeSpan from this instance.\n * @param {TimeSpan} other - The TimeSpan to subtract.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n subtract(other: TimeSpan): TimeSpan {\n return new TimeSpan(this.milliseconds - other.milliseconds);\n }\n\n /**\n * Adds this TimeSpan to a specified Date.\n * @param {Date} date - The date to add to.\n * @returns {Date} A new Date instance.\n */\n addTo(date: Date): Date {\n return new Date(date.getTime() + this.milliseconds);\n }\n\n /**\n * Subtracts this TimeSpan from a specified Date.\n * @param {Date} date - The date to subtract from.\n * @returns {Date} A new Date instance.\n */\n subtractFrom(date: Date): Date {\n return new Date(date.getTime() - this.milliseconds);\n }\n\n /**\n * Creates a TimeSpan from the difference between two dates.\n * @param {Date} earlierDate - The earlier date.\n * @param {Date} laterDate - The later date.\n * @returns {TimeSpan} A new TimeSpan instance representing the difference.\n */\n static fromDifference(earlierDate: Date, laterDate: Date): TimeSpan {\n return new TimeSpan(laterDate.getTime() - earlierDate.getTime());\n }\n\n /**\n * Formats the TimeSpan as a string.\n * Supported tokens: hh, h, mm, m, ss, s.\n * @param {string} format - The format string (default: 'hh:mm:ss').\n * @returns {string} The formatted string.\n */\n format(format: string = 'hh:mm:ss'): string {\n const formatLower = format.toLowerCase();\n const hasHours = formatLower.includes(\"h\");\n const hasMinutes = formatLower.includes(\"m\");\n\n const sign = this.milliseconds < 0 ? \"-\" : \"\";\n let hours = 0, minutes = 0, seconds = Math.floor(Math.abs(this.milliseconds) / 1000);\n\n if (hasHours) {\n hours = Math.floor(seconds / 3600);\n seconds -= hours * 3600;\n }\n if (hasMinutes) {\n minutes = Math.floor(seconds / 60);\n seconds -= minutes * 60;\n }\n\n const hoursPadded = String(hours).padStart(2, '0');\n const minutesPadded = String(minutes).padStart(2, '0');\n const secondsPadded = String(seconds).padStart(2, '0');\n\n const formatted = formatLower.replace(/hh|h|mm|m|ss|s/g, token => {\n switch (token) {\n case 'hh':\n return hoursPadded;\n case 'h':\n return hours.toString();\n case 'mm':\n return minutesPadded;\n case 'm':\n return minutes.toString();\n case 'ss':\n return secondsPadded;\n case 's':\n return seconds.toString();\n default:\n return token;\n }\n });\n\n return sign + formatted;\n }\n\n /**\n * Checks if this TimeSpan is equal to another.\n * @param {TimeSpan} other - The other TimeSpan.\n * @returns {boolean} True if equal.\n */\n eq(other: TimeSpan): boolean {\n return this.milliseconds === other.milliseconds;\n }\n\n /**\n * Checks if this TimeSpan is less than or equal to another.\n * @param {TimeSpan} other - The other TimeSpan.\n * @returns {boolean} True if less than or equal.\n */\n le(other: TimeSpan): boolean {\n return this.milliseconds <= other.milliseconds;\n }\n\n /**\n * Checks if this TimeSpan is less than another.\n * @param {TimeSpan} other - The other TimeSpan.\n * @returns {boolean} True if less than.\n */\n lt(other: TimeSpan): boolean {\n return this.milliseconds < other.milliseconds;\n }\n\n /**\n * Checks if this TimeSpan is greater than or equal to another.\n * @param {TimeSpan} other - The other TimeSpan.\n * @returns {boolean} True if greater than or equal.\n */\n ge(other: TimeSpan): boolean {\n return this.milliseconds >= other.milliseconds;\n }\n\n /**\n * Checks if this TimeSpan is greater than another.\n * @param {TimeSpan} other - The other TimeSpan.\n * @returns {boolean} True if greater than.\n */\n gt(other: TimeSpan): boolean {\n return this.milliseconds > other.milliseconds;\n }\n\n /**\n * Multiplies the TimeSpan by a number.\n * @param {number} number - The multiplier.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n multiply(number: number): TimeSpan {\n return new TimeSpan(this.milliseconds * number);\n }\n\n /**\n * Divides the TimeSpan by a number.\n * @param {number} number - The divisor.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n divide(number: number): TimeSpan {\n return new TimeSpan(this.milliseconds / number);\n }\n\n /**\n * Returns the absolute value of the TimeSpan.\n * @returns {TimeSpan} A new TimeSpan instance.\n */\n abs(): TimeSpan {\n return new TimeSpan(Math.abs(this.milliseconds));\n }\n\n /**\n * Infinite duration.\n */\n static readonly INFINITE = new TimeSpan(Number.POSITIVE_INFINITY);\n\n /**\n * Negative infinite duration.\n */\n static readonly NEGATIVE_INFINITE = new TimeSpan(Number.NEGATIVE_INFINITY);\n\n /**\n * Checks if the TimeSpan is infinite.\n * @returns {boolean} True if infinite.\n */\n isInfinite() {\n return this.milliseconds === Number.POSITIVE_INFINITY || this.milliseconds === Number.NEGATIVE_INFINITY\n }\n\n /**\n * Checks if the TimeSpan is positive infinite.\n * @returns {boolean} True if positive infinite.\n */\n isPositiveInfinite(): boolean {\n return this.milliseconds === Number.POSITIVE_INFINITY;\n }\n\n /**\n * Checks if the TimeSpan is negative infinite.\n * @returns {boolean} True if negative infinite.\n */\n isNegativeInfinite(): boolean {\n return this.milliseconds === Number.NEGATIVE_INFINITY;\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"type-code.js","sourceRoot":"","sources":["../../src/type-code.ts"],"names":[],"mappings":"AAAA,IAAK,QAYJ;AAZD,WAAK,QAAQ;IACT,6BAAoB,CAAA;IACpB,6BAAoB,CAAA;IACpB,+BAAqB,CAAA;IACrB,6BAAoB,CAAA;IACpB,6BAAoB,CAAA;IACpB,yBAAkB,CAAA;IAClB,mCAAuB,CAAA;IACvB,6BAAoB,CAAA;IACpB,iCAAsB,CAAA;IACtB,2BAAmB,CAAA;IACnB,+BAAqB,CAAA;AACzB,CAAC,EAZI,QAAQ,KAAR,QAAQ,QAYZ;AAGD,eAAe,QAAQ,CAAC","sourcesContent":["enum TypeCode {\r\n String = 'string',\r\n Number = 'number',\r\n Boolean = 'boolean',\r\n Symbol = 'symbol',\r\n BigInt = 'bigint',\r\n Null = 'null',\r\n Undefined = 'undefined',\r\n Object = 'object',\r\n Function = 'function',\r\n Array = 'array',\r\n Unknown = 'unknown',\r\n}\r\n\r\n\r\nexport default TypeCode;"]}
1
+ {"version":3,"file":"type-code.js","sourceRoot":"","sources":["../../src/type-code.ts"],"names":[],"mappings":"AAAA,IAAK,QAYJ;AAZD,WAAK,QAAQ;IACT,6BAAoB,CAAA;IACpB,6BAAoB,CAAA;IACpB,+BAAqB,CAAA;IACrB,6BAAoB,CAAA;IACpB,6BAAoB,CAAA;IACpB,yBAAkB,CAAA;IAClB,mCAAuB,CAAA;IACvB,6BAAoB,CAAA;IACpB,iCAAsB,CAAA;IACtB,2BAAmB,CAAA;IACnB,+BAAqB,CAAA;AACzB,CAAC,EAZI,QAAQ,KAAR,QAAQ,QAYZ;AAGD,eAAe,QAAQ,CAAC","sourcesContent":["enum TypeCode {\n String = 'string',\n Number = 'number',\n Boolean = 'boolean',\n Symbol = 'symbol',\n BigInt = 'bigint',\n Null = 'null',\n Undefined = 'undefined',\n Object = 'object',\n Function = 'function',\n Array = 'array',\n Unknown = 'unknown',\n}\n\n\nexport default TypeCode;"]}
package/dist/esm/type.js CHANGED
@@ -200,34 +200,35 @@ class Type {
200
200
  // REFLEXIÓN
201
201
  // ══════════════════════════════════════════════
202
202
  getMethodNames() {
203
- if (!this.constructorRef?.prototype)
204
- return Object.freeze([]);
205
- return Object.freeze(Object.getOwnPropertyNames(this.constructorRef.prototype)
206
- .filter(n => n !== 'constructor' &&
207
- typeof Object.getOwnPropertyDescriptor(this.constructorRef.prototype, n)?.value === 'function'));
203
+ return Object.freeze(this._getPrototypeMemberNames((_, descriptor) => typeof descriptor.value === 'function'));
208
204
  }
209
205
  getPropertyNames() {
210
- if (!this.constructorRef?.prototype)
211
- return Object.freeze([]);
212
- return Object.freeze(Object.getOwnPropertyNames(this.constructorRef.prototype)
213
- .filter(n => n !== 'constructor' &&
214
- typeof Object.getOwnPropertyDescriptor(this.constructorRef.prototype, n)?.value !== 'function'));
206
+ return Object.freeze(this._getPrototypeMemberNames((_, descriptor) => typeof descriptor.value !== 'function'));
215
207
  }
216
208
  getMemberNames() {
217
- if (!this.constructorRef?.prototype)
218
- return Object.freeze([]);
219
- return Object.freeze(Object.getOwnPropertyNames(this.constructorRef.prototype)
220
- .filter(n => n !== 'constructor'));
209
+ return Object.freeze(this._getPrototypeMemberNames());
221
210
  }
222
211
  hasMethod(name) {
223
- if (!this.constructorRef?.prototype)
224
- return false;
225
- return typeof this.constructorRef.prototype[name] === 'function';
212
+ const descriptor = this._getOwnPrototypeDescriptor(name);
213
+ return typeof descriptor?.value === 'function';
226
214
  }
227
215
  hasProperty(name) {
216
+ const descriptor = this._getOwnPrototypeDescriptor(name);
217
+ return !!descriptor && typeof descriptor.value !== 'function';
218
+ }
219
+ _getPrototypeMemberNames(predicate = () => true) {
228
220
  if (!this.constructorRef?.prototype)
229
- return false;
230
- return name in this.constructorRef.prototype && !this.hasMethod(name);
221
+ return [];
222
+ return Object.getOwnPropertyNames(this.constructorRef.prototype)
223
+ .filter(name => {
224
+ const descriptor = this._getOwnPrototypeDescriptor(name);
225
+ return !!descriptor && predicate(name, descriptor);
226
+ });
227
+ }
228
+ _getOwnPrototypeDescriptor(name) {
229
+ if (name === 'constructor' || !this.constructorRef?.prototype)
230
+ return undefined;
231
+ return Object.getOwnPropertyDescriptor(this.constructorRef.prototype, name);
231
232
  }
232
233
  getStaticMemberNames() {
233
234
  if (!this.constructorRef)
@@ -1 +1 @@
1
- {"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/type.ts"],"names":[],"mappings":"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","sourcesContent":["import TypeCode from \"./type-code.js\";\r\nimport {type Constructor} from \"./types.js\";\r\n\r\nexport default class Type<T = unknown> {\r\n\r\n // ──────────────────────────────────────────────\r\n // Caché (Flyweight)\r\n // ──────────────────────────────────────────────\r\n\r\n private static readonly _cache = new Map<unknown, Type>();\r\n\r\n // ──────────────────────────────────────────────\r\n // Tipos predefinidos\r\n // ──────────────────────────────────────────────\r\n\r\n public static readonly String = Type._getOrCreate<string>('string', undefined, TypeCode.String, 'string');\r\n public static readonly Number = Type._getOrCreate<number>('number', undefined, TypeCode.Number, 'number');\r\n public static readonly Boolean = Type._getOrCreate<boolean>('boolean', undefined, TypeCode.Boolean, 'boolean');\r\n public static readonly Symbol = Type._getOrCreate<symbol>('symbol', undefined, TypeCode.Symbol, 'symbol');\r\n public static readonly BigInt = Type._getOrCreate<bigint>('bigint', undefined, TypeCode.BigInt, 'bigint');\r\n public static readonly Null = Type._getOrCreate<null>('null', undefined, TypeCode.Null, 'null');\r\n public static readonly Undefined = Type._getOrCreate<undefined>('undefined', undefined, TypeCode.Undefined, 'undefined');\r\n public static readonly Object = Type._getOrCreate<object>(Object, Object, TypeCode.Object, 'Object');\r\n public static readonly Function = Type._getOrCreate<Function>(Function, Function, TypeCode.Function, 'Function');\r\n public static readonly Array = Type._getOrCreate<unknown[]>(Array, Array, TypeCode.Array, 'Array');\r\n\r\n // ──────────────────────────────────────────────\r\n // Propiedades inmutables\r\n // ──────────────────────────────────────────────\r\n\r\n public readonly name: string;\r\n public readonly constructorRef:\r\n Constructor<T> | undefined;\r\n public readonly typeCode: TypeCode;\r\n\r\n private constructor(\r\n name: string,\r\n constructorRef: Constructor<T> | undefined,\r\n typeCode: TypeCode,\r\n ) {\r\n this.name = name;\r\n this.constructorRef = constructorRef;\r\n this.typeCode = typeCode;\r\n }\r\n\r\n // ══════════════════════════════════════════════\r\n // ÚNICO PUNTO DE ENTRADA\r\n // ══════════════════════════════════════════════\r\n\r\n /**\r\n * Obtiene el `Type` de cualquier valor, constructor o primitivo.\r\n *\r\n * Unifica `typeof()` y `.GetType()` de C# en un solo método.\r\n *\r\n * **Reglas de resolución:**\r\n * 1. `null` / `undefined` → tipo nullish correspondiente\r\n * 2. Primitivo (`number`, `string`, etc.) → tipo primitivo\r\n * 3. Array → `Type.Array`\r\n * 4. Función/Constructor → tipo del constructor (no \"Function\")\r\n * 5. Objeto → tipo basado en su constructor\r\n *\r\n * @example\r\n * ```ts\r\n * Type.of(42) // Type<number> — primitivo\r\n * Type.of('hello') // Type<string> — primitivo\r\n * Type.of(new Date()) // Type<Date> — desde instancia\r\n * Type.of(Date) // Type<Date> — desde constructor\r\n * Type.of(null) // Type<null>\r\n * Type.of([1, 2, 3]) // Type<Array>\r\n * ```\r\n */\r\n public static of<U>(target: U | Constructor<U>): Type<U> {\r\n // ── Nullish ──\r\n if (target === null) return Type.Null as Type<U>;\r\n if (target === undefined) return Type.Undefined as Type<U>;\r\n\r\n const jsType = typeof target;\r\n\r\n // ── Primitivos ──\r\n if (jsType !== 'object' && jsType !== 'function') {\r\n return this._getOrCreate<U>(jsType, undefined, jsType as TypeCode);\r\n }\r\n\r\n // ── Funciones y Constructores ──\r\n if (jsType === 'function') {\r\n return this._resolveFunction<U>(target as Function & Constructor<U>);\r\n }\r\n\r\n // ── Arrays ──\r\n if (Array.isArray(target)) {\r\n return Type.Array as Type<U>;\r\n }\r\n\r\n // ── Objetos ──\r\n return this._resolveObject<U>(target as object);\r\n }\r\n\r\n // ──────────────────────────────────────────────\r\n // Resolvers privados (separan la lógica compleja)\r\n // ──────────────────────────────────────────────\r\n\r\n /**\r\n * Resuelve funciones y constructores.\r\n *\r\n * Decisión clave: si la función tiene un `prototype` con\r\n * miembros propios o empieza con `class`, es un constructor\r\n * y devolvemos el tipo que construye. Si no, es una función.\r\n */\r\n private static _resolveFunction<U>(fn: Function & Constructor<U>): Type<U> {\r\n const isConstructor = this._isConstructorLike(fn);\r\n\r\n if (isConstructor) {\r\n // Constructor → devuelve el tipo que construye\r\n return this._getOrCreate<U>(\r\n fn, // cacheamos por referencia al constructor\r\n fn as Constructor<U>,\r\n TypeCode.Object,\r\n fn.name || 'AnonymousClass',\r\n );\r\n }\r\n\r\n // Función pura → devuelve Type<Function>\r\n return Type.Function as Type<U>;\r\n }\r\n\r\n /**\r\n * Resuelve objetos por su cadena de prototipos.\r\n */\r\n private static _resolveObject<U>(obj: object): Type<U> {\r\n const proto = Object.getPrototypeOf(obj) as { constructor?: Constructor<U> } | null;\r\n const ctor = proto?.constructor as Constructor<U> | undefined;\r\n const name = ctor?.name || 'Object';\r\n\r\n if (!ctor || ctor === (Object as unknown)) {\r\n return Type.Object as Type<U>;\r\n }\r\n\r\n return this._getOrCreate<U>(ctor, ctor, TypeCode.Object, name);\r\n }\r\n\r\n /**\r\n * Heurística para distinguir constructores de funciones planas.\r\n *\r\n * Un \"constructor\" cumple al menos una de:\r\n * - Su `toString()` empieza con \"class \"\r\n * - Tiene propiedades propias en su prototype (más allá de constructor)\r\n * - Es un built-in conocido (Date, Map, Set, etc.)\r\n */\r\n private static _isConstructorLike(fn: Function): boolean {\r\n // 1. Clase ES6 explícita\r\n try {\r\n if (fn.toString().startsWith('class ')) return true;\r\n } catch {\r\n // toString puede fallar en Proxy, etc.\r\n }\r\n\r\n // 2. Built-ins conocidos con prototype significativo\r\n if (fn === Object || fn === Function || fn === Array) return true;\r\n\r\n const proto = fn.prototype;\r\n if (!proto || typeof proto !== 'object') return false;\r\n\r\n // 3. Prototype con miembros propios (señal de constructor)\r\n const ownKeys = Object.getOwnPropertyNames(proto);\r\n return ownKeys.length > 1 || (ownKeys.length === 1 && ownKeys[0] !== 'constructor');\r\n }\r\n\r\n // ══════════════════════════════════════════════\r\n // PROPIEDADES COMPUTADAS\r\n // ══════════════════════════════════════════════\r\n\r\n public get isPrimitive(): boolean {\r\n return (\r\n this.typeCode === TypeCode.String ||\r\n this.typeCode === TypeCode.Number ||\r\n this.typeCode === TypeCode.Boolean ||\r\n this.typeCode === TypeCode.Symbol ||\r\n this.typeCode === TypeCode.BigInt\r\n );\r\n }\r\n\r\n public get isNullish(): boolean {\r\n return this.typeCode === TypeCode.Null || this.typeCode === TypeCode.Undefined;\r\n }\r\n\r\n public get isReferenceType(): boolean {\r\n return !this.isPrimitive && !this.isNullish;\r\n }\r\n\r\n public get isArray(): boolean {\r\n return this.typeCode === TypeCode.Array ||\r\n this.constructorRef === (Array as unknown as Constructor<T>);\r\n }\r\n\r\n public get isFunction(): boolean {\r\n return this.typeCode === TypeCode.Function;\r\n }\r\n\r\n public get isValueType(): boolean {\r\n return this.isPrimitive;\r\n }\r\n\r\n public get isClass(): boolean {\r\n if (!this.constructorRef) return false;\r\n try {\r\n return this.constructorRef.toString().startsWith('class ');\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n public get fullName(): string {\r\n if (this.isPrimitive || this.isNullish) {\r\n return `System.${this.name.charAt(0).toUpperCase()}${this.name.slice(1)}`;\r\n }\r\n return this.name;\r\n }\r\n\r\n // ══════════════════════════════════════════════\r\n // JERARQUÍA\r\n // ══════════════════════════════════════════════\r\n\r\n public get baseType(): Type | undefined {\r\n if (!this.constructorRef) return undefined;\r\n\r\n const parentProto = Object.getPrototypeOf(this.constructorRef.prototype);\r\n if (!parentProto || parentProto === Object.prototype) {\r\n return this === Type.Object ? undefined : Type.Object;\r\n }\r\n\r\n const parentCtor = parentProto.constructor as Constructor;\r\n return Type.of(parentCtor);\r\n }\r\n\r\n public getInheritanceChain(): ReadonlyArray<Type> {\r\n const chain: Type[] = [this];\r\n let current: Type | undefined = this.baseType;\r\n\r\n while (current && !chain.includes(current)) {\r\n chain.push(current);\r\n current = current.baseType;\r\n }\r\n\r\n return Object.freeze(chain);\r\n }\r\n\r\n public isAssignableTo(target: Type): boolean {\r\n if (this === target) return true;\r\n if (!this.constructorRef || !target.constructorRef) return false;\r\n\r\n let proto: object | null = this.constructorRef.prototype;\r\n while (proto) {\r\n if (proto.constructor === target.constructorRef) return true;\r\n proto = Object.getPrototypeOf(proto) as object | null;\r\n }\r\n return false;\r\n }\r\n\r\n public isAssignableFrom(source: Type): boolean {\r\n return source.isAssignableTo(this);\r\n }\r\n\r\n public isSubclassOf(parent: Type): boolean {\r\n if (this === parent) return false;\r\n return this.isAssignableTo(parent);\r\n }\r\n\r\n\r\n // ══════════════════════════════════════════════\r\n // REFLEXIÓN\r\n // ══════════════════════════════════════════════\r\n\r\n public getMethodNames(): ReadonlyArray<string> {\r\n if (!this.constructorRef?.prototype) return Object.freeze([]);\r\n return Object.freeze(\r\n Object.getOwnPropertyNames(this.constructorRef.prototype)\r\n .filter(n => n !== 'constructor' &&\r\n typeof Object.getOwnPropertyDescriptor(\r\n this.constructorRef!.prototype, n\r\n )?.value === 'function'\r\n )\r\n );\r\n }\r\n\r\n public getPropertyNames(): ReadonlyArray<string> {\r\n if (!this.constructorRef?.prototype) return Object.freeze([]);\r\n return Object.freeze(\r\n Object.getOwnPropertyNames(this.constructorRef.prototype)\r\n .filter(n => n !== 'constructor' &&\r\n typeof Object.getOwnPropertyDescriptor(\r\n this.constructorRef!.prototype, n\r\n )?.value !== 'function'\r\n )\r\n );\r\n }\r\n\r\n public getMemberNames(): ReadonlyArray<string> {\r\n if (!this.constructorRef?.prototype) return Object.freeze([]);\r\n return Object.freeze(\r\n Object.getOwnPropertyNames(this.constructorRef.prototype)\r\n .filter(n => n !== 'constructor')\r\n );\r\n }\r\n\r\n public hasMethod(name: string): boolean {\r\n if (!this.constructorRef?.prototype) return false;\r\n return typeof this.constructorRef.prototype[name] === 'function';\r\n }\r\n\r\n public hasProperty(name: string): boolean {\r\n if (!this.constructorRef?.prototype) return false;\r\n return name in this.constructorRef.prototype && !this.hasMethod(name);\r\n }\r\n\r\n public getStaticMemberNames(): ReadonlyArray<string> {\r\n if (!this.constructorRef) return Object.freeze([]);\r\n const skip = new Set(['prototype', 'length', 'name', 'caller', 'arguments']);\r\n return Object.freeze(\r\n Object.getOwnPropertyNames(this.constructorRef)\r\n .filter(n => !skip.has(n))\r\n );\r\n }\r\n\r\n\r\n // ══════════════════════════════════════════════\r\n // SERIALIZACIÓN\r\n // ══════════════════════════════════════════════\r\n\r\n public toString(): string {\r\n return `Type [${this.name}]`;\r\n }\r\n\r\n\r\n public [Symbol.toPrimitive](hint: string): string | number {\r\n\r\n let hash = 0;\r\n for (let i = 0; i < this.name.length; i++) {\r\n hash = ((hash << 5) - hash + this.name.charCodeAt(i)) | 0;\r\n }\r\n\r\n return hint === 'number' ? hash : this.toString();\r\n }\r\n\r\n public get [Symbol.toStringTag](): string {\r\n return `Type<${this.name}>`;\r\n }\r\n\r\n // ──────────────────────────────────────────────\r\n // FACTORY INTERNA\r\n // ──────────────────────────────────────────────\r\n\r\n private static _getOrCreate<V>(\r\n key: unknown,\r\n constructorRef: Constructor<V> | unknown,\r\n typeCode: TypeCode,\r\n customName?: string,\r\n ): Type<V> {\r\n const cached = this._cache.get(key);\r\n if (cached) return cached as Type<V>;\r\n\r\n const name = customName\r\n ?? (typeof key === 'string' ? key : 'unknown');\r\n\r\n const ref = typeof constructorRef === 'function'\r\n ? constructorRef as Constructor<V>\r\n : undefined;\r\n\r\n const instance = new Type<V>(name, ref, typeCode);\r\n this._cache.set(key, instance as Type);\r\n return instance;\r\n }\r\n}"]}
1
+ {"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/type.ts"],"names":[],"mappings":"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","sourcesContent":["import TypeCode from \"./type-code.js\";\nimport {type Constructor} from \"./types.js\";\n\nexport default class Type<T = unknown> {\n\n // ──────────────────────────────────────────────\n // Caché (Flyweight)\n // ──────────────────────────────────────────────\n\n private static readonly _cache = new Map<unknown, Type>();\n\n // ──────────────────────────────────────────────\n // Tipos predefinidos\n // ──────────────────────────────────────────────\n\n public static readonly String = Type._getOrCreate<string>('string', undefined, TypeCode.String, 'string');\n public static readonly Number = Type._getOrCreate<number>('number', undefined, TypeCode.Number, 'number');\n public static readonly Boolean = Type._getOrCreate<boolean>('boolean', undefined, TypeCode.Boolean, 'boolean');\n public static readonly Symbol = Type._getOrCreate<symbol>('symbol', undefined, TypeCode.Symbol, 'symbol');\n public static readonly BigInt = Type._getOrCreate<bigint>('bigint', undefined, TypeCode.BigInt, 'bigint');\n public static readonly Null = Type._getOrCreate<null>('null', undefined, TypeCode.Null, 'null');\n public static readonly Undefined = Type._getOrCreate<undefined>('undefined', undefined, TypeCode.Undefined, 'undefined');\n public static readonly Object = Type._getOrCreate<object>(Object, Object, TypeCode.Object, 'Object');\n public static readonly Function = Type._getOrCreate<Function>(Function, Function, TypeCode.Function, 'Function');\n public static readonly Array = Type._getOrCreate<unknown[]>(Array, Array, TypeCode.Array, 'Array');\n\n // ──────────────────────────────────────────────\n // Propiedades inmutables\n // ──────────────────────────────────────────────\n\n public readonly name: string;\n public readonly constructorRef:\n Constructor<T> | undefined;\n public readonly typeCode: TypeCode;\n\n private constructor(\n name: string,\n constructorRef: Constructor<T> | undefined,\n typeCode: TypeCode,\n ) {\n this.name = name;\n this.constructorRef = constructorRef;\n this.typeCode = typeCode;\n }\n\n // ══════════════════════════════════════════════\n // ÚNICO PUNTO DE ENTRADA\n // ══════════════════════════════════════════════\n\n /**\n * Obtiene el `Type` de cualquier valor, constructor o primitivo.\n *\n * Unifica `typeof()` y `.GetType()` de C# en un solo método.\n *\n * **Reglas de resolución:**\n * 1. `null` / `undefined` → tipo nullish correspondiente\n * 2. Primitivo (`number`, `string`, etc.) → tipo primitivo\n * 3. Array → `Type.Array`\n * 4. Función/Constructor → tipo del constructor (no \"Function\")\n * 5. Objeto → tipo basado en su constructor\n *\n * @example\n * ```ts\n * Type.of(42) // Type<number> — primitivo\n * Type.of('hello') // Type<string> — primitivo\n * Type.of(new Date()) // Type<Date> — desde instancia\n * Type.of(Date) // Type<Date> — desde constructor\n * Type.of(null) // Type<null>\n * Type.of([1, 2, 3]) // Type<Array>\n * ```\n */\n public static of<U>(target: U | Constructor<U>): Type<U> {\n // ── Nullish ──\n if (target === null) return Type.Null as Type<U>;\n if (target === undefined) return Type.Undefined as Type<U>;\n\n const jsType = typeof target;\n\n // ── Primitivos ──\n if (jsType !== 'object' && jsType !== 'function') {\n return this._getOrCreate<U>(jsType, undefined, jsType as TypeCode);\n }\n\n // ── Funciones y Constructores ──\n if (jsType === 'function') {\n return this._resolveFunction<U>(target as Function & Constructor<U>);\n }\n\n // ── Arrays ──\n if (Array.isArray(target)) {\n return Type.Array as Type<U>;\n }\n\n // ── Objetos ──\n return this._resolveObject<U>(target as object);\n }\n\n // ──────────────────────────────────────────────\n // Resolvers privados (separan la lógica compleja)\n // ──────────────────────────────────────────────\n\n /**\n * Resuelve funciones y constructores.\n *\n * Decisión clave: si la función tiene un `prototype` con\n * miembros propios o empieza con `class`, es un constructor\n * y devolvemos el tipo que construye. Si no, es una función.\n */\n private static _resolveFunction<U>(fn: Function & Constructor<U>): Type<U> {\n const isConstructor = this._isConstructorLike(fn);\n\n if (isConstructor) {\n // Constructor → devuelve el tipo que construye\n return this._getOrCreate<U>(\n fn, // cacheamos por referencia al constructor\n fn as Constructor<U>,\n TypeCode.Object,\n fn.name || 'AnonymousClass',\n );\n }\n\n // Función pura → devuelve Type<Function>\n return Type.Function as Type<U>;\n }\n\n /**\n * Resuelve objetos por su cadena de prototipos.\n */\n private static _resolveObject<U>(obj: object): Type<U> {\n const proto = Object.getPrototypeOf(obj) as { constructor?: Constructor<U> } | null;\n const ctor = proto?.constructor as Constructor<U> | undefined;\n const name = ctor?.name || 'Object';\n\n if (!ctor || ctor === (Object as unknown)) {\n return Type.Object as Type<U>;\n }\n\n return this._getOrCreate<U>(ctor, ctor, TypeCode.Object, name);\n }\n\n /**\n * Heurística para distinguir constructores de funciones planas.\n *\n * Un \"constructor\" cumple al menos una de:\n * - Su `toString()` empieza con \"class \"\n * - Tiene propiedades propias en su prototype (más allá de constructor)\n * - Es un built-in conocido (Date, Map, Set, etc.)\n */\n private static _isConstructorLike(fn: Function): boolean {\n // 1. Clase ES6 explícita\n try {\n if (fn.toString().startsWith('class ')) return true;\n } catch {\n // toString puede fallar en Proxy, etc.\n }\n\n // 2. Built-ins conocidos con prototype significativo\n if (fn === Object || fn === Function || fn === Array) return true;\n\n const proto = fn.prototype;\n if (!proto || typeof proto !== 'object') return false;\n\n // 3. Prototype con miembros propios (señal de constructor)\n const ownKeys = Object.getOwnPropertyNames(proto);\n return ownKeys.length > 1 || (ownKeys.length === 1 && ownKeys[0] !== 'constructor');\n }\n\n // ══════════════════════════════════════════════\n // PROPIEDADES COMPUTADAS\n // ══════════════════════════════════════════════\n\n public get isPrimitive(): boolean {\n return (\n this.typeCode === TypeCode.String ||\n this.typeCode === TypeCode.Number ||\n this.typeCode === TypeCode.Boolean ||\n this.typeCode === TypeCode.Symbol ||\n this.typeCode === TypeCode.BigInt\n );\n }\n\n public get isNullish(): boolean {\n return this.typeCode === TypeCode.Null || this.typeCode === TypeCode.Undefined;\n }\n\n public get isReferenceType(): boolean {\n return !this.isPrimitive && !this.isNullish;\n }\n\n public get isArray(): boolean {\n return this.typeCode === TypeCode.Array ||\n this.constructorRef === (Array as unknown as Constructor<T>);\n }\n\n public get isFunction(): boolean {\n return this.typeCode === TypeCode.Function;\n }\n\n public get isValueType(): boolean {\n return this.isPrimitive;\n }\n\n public get isClass(): boolean {\n if (!this.constructorRef) return false;\n try {\n return this.constructorRef.toString().startsWith('class ');\n } catch {\n return false;\n }\n }\n\n public get fullName(): string {\n if (this.isPrimitive || this.isNullish) {\n return `System.${this.name.charAt(0).toUpperCase()}${this.name.slice(1)}`;\n }\n return this.name;\n }\n\n // ══════════════════════════════════════════════\n // JERARQUÍA\n // ══════════════════════════════════════════════\n\n public get baseType(): Type | undefined {\n if (!this.constructorRef) return undefined;\n\n const parentProto = Object.getPrototypeOf(this.constructorRef.prototype);\n if (!parentProto || parentProto === Object.prototype) {\n return this === Type.Object ? undefined : Type.Object;\n }\n\n const parentCtor = parentProto.constructor as Constructor;\n return Type.of(parentCtor);\n }\n\n public getInheritanceChain(): ReadonlyArray<Type> {\n const chain: Type[] = [this];\n let current: Type | undefined = this.baseType;\n\n while (current && !chain.includes(current)) {\n chain.push(current);\n current = current.baseType;\n }\n\n return Object.freeze(chain);\n }\n\n public isAssignableTo(target: Type): boolean {\n if (this === target) return true;\n if (!this.constructorRef || !target.constructorRef) return false;\n\n let proto: object | null = this.constructorRef.prototype;\n while (proto) {\n if (proto.constructor === target.constructorRef) return true;\n proto = Object.getPrototypeOf(proto) as object | null;\n }\n return false;\n }\n\n public isAssignableFrom(source: Type): boolean {\n return source.isAssignableTo(this);\n }\n\n public isSubclassOf(parent: Type): boolean {\n if (this === parent) return false;\n return this.isAssignableTo(parent);\n }\n\n\n // ══════════════════════════════════════════════\n // REFLEXIÓN\n // ══════════════════════════════════════════════\n\n public getMethodNames(): ReadonlyArray<string> {\n return Object.freeze(\n this._getPrototypeMemberNames((_, descriptor) => typeof descriptor.value === 'function')\n );\n }\n\n public getPropertyNames(): ReadonlyArray<string> {\n return Object.freeze(\n this._getPrototypeMemberNames((_, descriptor) => typeof descriptor.value !== 'function')\n );\n }\n\n public getMemberNames(): ReadonlyArray<string> {\n return Object.freeze(this._getPrototypeMemberNames());\n }\n\n public hasMethod(name: string): boolean {\n const descriptor = this._getOwnPrototypeDescriptor(name);\n return typeof descriptor?.value === 'function';\n }\n\n public hasProperty(name: string): boolean {\n const descriptor = this._getOwnPrototypeDescriptor(name);\n return !!descriptor && typeof descriptor.value !== 'function';\n }\n\n private _getPrototypeMemberNames(\n predicate: (name: string, descriptor: PropertyDescriptor) => boolean = () => true\n ): string[] {\n if (!this.constructorRef?.prototype) return [];\n\n return Object.getOwnPropertyNames(this.constructorRef.prototype)\n .filter(name => {\n const descriptor = this._getOwnPrototypeDescriptor(name);\n return !!descriptor && predicate(name, descriptor);\n });\n }\n\n private _getOwnPrototypeDescriptor(name: string): PropertyDescriptor | undefined {\n if (name === 'constructor' || !this.constructorRef?.prototype) return undefined;\n return Object.getOwnPropertyDescriptor(this.constructorRef.prototype, name);\n }\n\n public getStaticMemberNames(): ReadonlyArray<string> {\n if (!this.constructorRef) return Object.freeze([]);\n const skip = new Set(['prototype', 'length', 'name', 'caller', 'arguments']);\n return Object.freeze(\n Object.getOwnPropertyNames(this.constructorRef)\n .filter(n => !skip.has(n))\n );\n }\n\n\n // ══════════════════════════════════════════════\n // SERIALIZACIÓN\n // ══════════════════════════════════════════════\n\n public toString(): string {\n return `Type [${this.name}]`;\n }\n\n\n public [Symbol.toPrimitive](hint: string): string | number {\n\n let hash = 0;\n for (let i = 0; i < this.name.length; i++) {\n hash = ((hash << 5) - hash + this.name.charCodeAt(i)) | 0;\n }\n\n return hint === 'number' ? hash : this.toString();\n }\n\n public get [Symbol.toStringTag](): string {\n return `Type<${this.name}>`;\n }\n\n // ──────────────────────────────────────────────\n // FACTORY INTERNA\n // ──────────────────────────────────────────────\n\n private static _getOrCreate<V>(\n key: unknown,\n constructorRef: Constructor<V> | unknown,\n typeCode: TypeCode,\n customName?: string,\n ): Type<V> {\n const cached = this._cache.get(key);\n if (cached) return cached as Type<V>;\n\n const name = customName\n ?? (typeof key === 'string' ? key : 'unknown');\n\n const ref = typeof constructorRef === 'function'\n ? constructorRef as Constructor<V>\n : undefined;\n\n const instance = new Type<V>(name, ref, typeCode);\n this._cache.set(key, instance as Type);\n return instance;\n }\n}"]}