@wisemen/datewise 0.0.1

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 (377) hide show
  1. package/README.md +307 -0
  2. package/dist/common/constants.d.ts +9 -0
  3. package/dist/common/constants.js +10 -0
  4. package/dist/common/constants.js.map +1 -0
  5. package/dist/common/date-period.enum.d.ts +7 -0
  6. package/dist/common/date-period.enum.js +15 -0
  7. package/dist/common/date-period.enum.js.map +1 -0
  8. package/dist/common/exhaustive-check.helper.d.ts +1 -0
  9. package/dist/common/exhaustive-check.helper.js +4 -0
  10. package/dist/common/exhaustive-check.helper.js.map +1 -0
  11. package/dist/common/inclusivity.d.ts +8 -0
  12. package/dist/common/inclusivity.js +23 -0
  13. package/dist/common/inclusivity.js.map +1 -0
  14. package/dist/common/index.d.ts +4 -0
  15. package/dist/common/index.js +5 -0
  16. package/dist/common/index.js.map +1 -0
  17. package/dist/common/init-dayjs.d.ts +1 -0
  18. package/dist/common/init-dayjs.js +31 -0
  19. package/dist/common/init-dayjs.js.map +1 -0
  20. package/dist/common/month.d.ts +15 -0
  21. package/dist/common/month.js +21 -0
  22. package/dist/common/month.js.map +1 -0
  23. package/dist/common/timezone.d.ts +600 -0
  24. package/dist/common/timezone.js +614 -0
  25. package/dist/common/timezone.js.map +1 -0
  26. package/dist/common/typeorm/adjacent-to.d.ts +5 -0
  27. package/dist/common/typeorm/adjacent-to.js +7 -0
  28. package/dist/common/typeorm/adjacent-to.js.map +1 -0
  29. package/dist/common/typeorm/ends-before.d.ts +5 -0
  30. package/dist/common/typeorm/ends-before.js +7 -0
  31. package/dist/common/typeorm/ends-before.js.map +1 -0
  32. package/dist/common/typeorm/index.d.ts +10 -0
  33. package/dist/common/typeorm/index.js +11 -0
  34. package/dist/common/typeorm/index.js.map +1 -0
  35. package/dist/common/typeorm/is-preceded-by.d.ts +5 -0
  36. package/dist/common/typeorm/is-preceded-by.js +7 -0
  37. package/dist/common/typeorm/is-preceded-by.js.map +1 -0
  38. package/dist/common/typeorm/is-succeeded-by.d.ts +5 -0
  39. package/dist/common/typeorm/is-succeeded-by.js +7 -0
  40. package/dist/common/typeorm/is-succeeded-by.js.map +1 -0
  41. package/dist/common/typeorm/overlaps-with.d.ts +5 -0
  42. package/dist/common/typeorm/overlaps-with.js +7 -0
  43. package/dist/common/typeorm/overlaps-with.js.map +1 -0
  44. package/dist/common/typeorm/precedes.d.ts +5 -0
  45. package/dist/common/typeorm/precedes.js +7 -0
  46. package/dist/common/typeorm/precedes.js.map +1 -0
  47. package/dist/common/typeorm/starts-after.d.ts +5 -0
  48. package/dist/common/typeorm/starts-after.js +7 -0
  49. package/dist/common/typeorm/starts-after.js.map +1 -0
  50. package/dist/common/typeorm/strictly-left-of.d.ts +5 -0
  51. package/dist/common/typeorm/strictly-left-of.js +7 -0
  52. package/dist/common/typeorm/strictly-left-of.js.map +1 -0
  53. package/dist/common/typeorm/strictly-right-of.d.ts +5 -0
  54. package/dist/common/typeorm/strictly-right-of.js +7 -0
  55. package/dist/common/typeorm/strictly-right-of.js.map +1 -0
  56. package/dist/common/typeorm/succeeds.d.ts +5 -0
  57. package/dist/common/typeorm/succeeds.js +7 -0
  58. package/dist/common/typeorm/succeeds.js.map +1 -0
  59. package/dist/date-range/date-range-errors.d.ts +9 -0
  60. package/dist/date-range/date-range-errors.js +17 -0
  61. package/dist/date-range/date-range-errors.js.map +1 -0
  62. package/dist/date-range/date-range.d.ts +43 -0
  63. package/dist/date-range/date-range.dto-builder.d.ts +8 -0
  64. package/dist/date-range/date-range.dto-builder.js +21 -0
  65. package/dist/date-range/date-range.dto-builder.js.map +1 -0
  66. package/dist/date-range/date-range.dto.d.ts +7 -0
  67. package/dist/date-range/date-range.dto.js +31 -0
  68. package/dist/date-range/date-range.dto.js.map +1 -0
  69. package/dist/date-range/date-range.js +153 -0
  70. package/dist/date-range/date-range.js.map +1 -0
  71. package/dist/date-range/date-range.response.d.ts +6 -0
  72. package/dist/date-range/date-range.response.js +27 -0
  73. package/dist/date-range/date-range.response.js.map +1 -0
  74. package/dist/date-range/index.d.ts +7 -0
  75. package/dist/date-range/index.js +8 -0
  76. package/dist/date-range/index.js.map +1 -0
  77. package/dist/date-range/is-date-range.decorator.d.ts +19 -0
  78. package/dist/date-range/is-date-range.decorator.js +68 -0
  79. package/dist/date-range/is-date-range.decorator.js.map +1 -0
  80. package/dist/date-range/tests/date-range.unit.test.d.ts +1 -0
  81. package/dist/date-range/tests/date-range.unit.test.js +412 -0
  82. package/dist/date-range/tests/date-range.unit.test.js.map +1 -0
  83. package/dist/date-range/tests/is-date-range.decorator.unit.test.d.ts +1 -0
  84. package/dist/date-range/tests/is-date-range.decorator.unit.test.js +120 -0
  85. package/dist/date-range/tests/is-date-range.decorator.unit.test.js.map +1 -0
  86. package/dist/date-range/typeorm/contains-plain-date.d.ts +4 -0
  87. package/dist/date-range/typeorm/contains-plain-date.js +8 -0
  88. package/dist/date-range/typeorm/contains-plain-date.js.map +1 -0
  89. package/dist/date-range/typeorm/date-range-column.d.ts +11 -0
  90. package/dist/date-range/typeorm/date-range-column.js +32 -0
  91. package/dist/date-range/typeorm/date-range-column.js.map +1 -0
  92. package/dist/date-range/typeorm/index.d.ts +2 -0
  93. package/dist/date-range/typeorm/index.js +3 -0
  94. package/dist/date-range/typeorm/index.js.map +1 -0
  95. package/dist/date-time-range/date-time-range.command-builder.d.ts +8 -0
  96. package/dist/date-time-range/date-time-range.command-builder.js +21 -0
  97. package/dist/date-time-range/date-time-range.command-builder.js.map +1 -0
  98. package/dist/date-time-range/date-time-range.command.d.ts +7 -0
  99. package/dist/date-time-range/date-time-range.command.js +30 -0
  100. package/dist/date-time-range/date-time-range.command.js.map +1 -0
  101. package/dist/date-time-range/date-time-range.d.ts +93 -0
  102. package/dist/date-time-range/date-time-range.errors.d.ts +10 -0
  103. package/dist/date-time-range/date-time-range.errors.js +19 -0
  104. package/dist/date-time-range/date-time-range.errors.js.map +1 -0
  105. package/dist/date-time-range/date-time-range.js +205 -0
  106. package/dist/date-time-range/date-time-range.js.map +1 -0
  107. package/dist/date-time-range/date-time-range.response.d.ts +6 -0
  108. package/dist/date-time-range/date-time-range.response.js +27 -0
  109. package/dist/date-time-range/date-time-range.response.js.map +1 -0
  110. package/dist/date-time-range/index.d.ts +7 -0
  111. package/dist/date-time-range/index.js +8 -0
  112. package/dist/date-time-range/index.js.map +1 -0
  113. package/dist/date-time-range/is-date-time-range.decorator.d.ts +15 -0
  114. package/dist/date-time-range/is-date-time-range.decorator.js +58 -0
  115. package/dist/date-time-range/is-date-time-range.decorator.js.map +1 -0
  116. package/dist/date-time-range/tests/date-time-range.column.integration.test.d.ts +1 -0
  117. package/dist/date-time-range/tests/date-time-range.column.integration.test.js +442 -0
  118. package/dist/date-time-range/tests/date-time-range.column.integration.test.js.map +1 -0
  119. package/dist/date-time-range/tests/date-time-range.unit.test.d.ts +1 -0
  120. package/dist/date-time-range/tests/date-time-range.unit.test.js +775 -0
  121. package/dist/date-time-range/tests/date-time-range.unit.test.js.map +1 -0
  122. package/dist/date-time-range/tests/is-date-time-range.decorator.unit.test.d.ts +1 -0
  123. package/dist/date-time-range/tests/is-date-time-range.decorator.unit.test.js +74 -0
  124. package/dist/date-time-range/tests/is-date-time-range.decorator.unit.test.js.map +1 -0
  125. package/dist/date-time-range/tests/sql/datasource.d.ts +2 -0
  126. package/dist/date-time-range/tests/sql/datasource.js +16 -0
  127. package/dist/date-time-range/tests/sql/datasource.js.map +1 -0
  128. package/dist/date-time-range/tests/sql/date-time-range-test.entity.d.ts +5 -0
  129. package/dist/date-time-range/tests/sql/date-time-range-test.entity.js +29 -0
  130. package/dist/date-time-range/tests/sql/date-time-range-test.entity.js.map +1 -0
  131. package/dist/date-time-range/tests/sql/multi-date-time-range-test.entity.d.ts +5 -0
  132. package/dist/date-time-range/tests/sql/multi-date-time-range-test.entity.js +28 -0
  133. package/dist/date-time-range/tests/sql/multi-date-time-range-test.entity.js.map +1 -0
  134. package/dist/date-time-range/typeorm/contains-timestamp.d.ts +4 -0
  135. package/dist/date-time-range/typeorm/contains-timestamp.js +8 -0
  136. package/dist/date-time-range/typeorm/contains-timestamp.js.map +1 -0
  137. package/dist/date-time-range/typeorm/date-time-range-column.d.ts +11 -0
  138. package/dist/date-time-range/typeorm/date-time-range-column.js +32 -0
  139. package/dist/date-time-range/typeorm/date-time-range-column.js.map +1 -0
  140. package/dist/date-time-range/typeorm/index.d.ts +3 -0
  141. package/dist/date-time-range/typeorm/index.js +4 -0
  142. package/dist/date-time-range/typeorm/index.js.map +1 -0
  143. package/dist/date-time-range/typeorm/multi-date-time-range.column.d.ts +3 -0
  144. package/dist/date-time-range/typeorm/multi-date-time-range.column.js +47 -0
  145. package/dist/date-time-range/typeorm/multi-date-time-range.column.js.map +1 -0
  146. package/dist/index.d.ts +6 -0
  147. package/dist/index.js +9 -0
  148. package/dist/index.js.map +1 -0
  149. package/dist/multi-date-time-range/multi-date-time-range.d.ts +20 -0
  150. package/dist/multi-date-time-range/multi-date-time-range.js +51 -0
  151. package/dist/multi-date-time-range/multi-date-time-range.js.map +1 -0
  152. package/dist/multi-date-time-range/tests/multi-date-time-range.unit.test.d.ts +1 -0
  153. package/dist/multi-date-time-range/tests/multi-date-time-range.unit.test.js +129 -0
  154. package/dist/multi-date-time-range/tests/multi-date-time-range.unit.test.js.map +1 -0
  155. package/dist/plain-date/api-property/index.d.ts +1 -0
  156. package/dist/plain-date/api-property/index.js +2 -0
  157. package/dist/plain-date/api-property/index.js.map +1 -0
  158. package/dist/plain-date/api-property/plain-date.api-property.d.ts +2 -0
  159. package/dist/plain-date/api-property/plain-date.api-property.js +12 -0
  160. package/dist/plain-date/api-property/plain-date.api-property.js.map +1 -0
  161. package/dist/plain-date/dayjs-plain-date.d.ts +57 -0
  162. package/dist/plain-date/dayjs-plain-date.js +170 -0
  163. package/dist/plain-date/dayjs-plain-date.js.map +1 -0
  164. package/dist/plain-date/future-infinity-date.d.ts +38 -0
  165. package/dist/plain-date/future-infinity-date.js +100 -0
  166. package/dist/plain-date/future-infinity-date.js.map +1 -0
  167. package/dist/plain-date/index.d.ts +8 -0
  168. package/dist/plain-date/index.js +9 -0
  169. package/dist/plain-date/index.js.map +1 -0
  170. package/dist/plain-date/invalid-date.d.ts +5 -0
  171. package/dist/plain-date/invalid-date.js +8 -0
  172. package/dist/plain-date/invalid-date.js.map +1 -0
  173. package/dist/plain-date/max.d.ts +2 -0
  174. package/dist/plain-date/max.js +15 -0
  175. package/dist/plain-date/max.js.map +1 -0
  176. package/dist/plain-date/min.d.ts +2 -0
  177. package/dist/plain-date/min.js +16 -0
  178. package/dist/plain-date/min.js.map +1 -0
  179. package/dist/plain-date/past-infinity-date.d.ts +39 -0
  180. package/dist/plain-date/past-infinity-date.js +100 -0
  181. package/dist/plain-date/past-infinity-date.js.map +1 -0
  182. package/dist/plain-date/plain-date-object.d.ts +6 -0
  183. package/dist/plain-date/plain-date-object.js +2 -0
  184. package/dist/plain-date/plain-date-object.js.map +1 -0
  185. package/dist/plain-date/plain-date.d.ts +44 -0
  186. package/dist/plain-date/plain-date.factory.d.ts +16 -0
  187. package/dist/plain-date/plain-date.factory.js +41 -0
  188. package/dist/plain-date/plain-date.factory.js.map +1 -0
  189. package/dist/plain-date/plain-date.fn.d.ts +16 -0
  190. package/dist/plain-date/plain-date.fn.js +14 -0
  191. package/dist/plain-date/plain-date.fn.js.map +1 -0
  192. package/dist/plain-date/plain-date.js +2 -0
  193. package/dist/plain-date/plain-date.js.map +1 -0
  194. package/dist/plain-date/plain-date.units.d.ts +4 -0
  195. package/dist/plain-date/plain-date.units.js +2 -0
  196. package/dist/plain-date/plain-date.units.js.map +1 -0
  197. package/dist/plain-date/tests/plain-date.accessors.unit.test.d.ts +1 -0
  198. package/dist/plain-date/tests/plain-date.accessors.unit.test.js +22 -0
  199. package/dist/plain-date/tests/plain-date.accessors.unit.test.js.map +1 -0
  200. package/dist/plain-date/tests/plain-date.constructor.unit.test.d.ts +1 -0
  201. package/dist/plain-date/tests/plain-date.constructor.unit.test.js +40 -0
  202. package/dist/plain-date/tests/plain-date.constructor.unit.test.js.map +1 -0
  203. package/dist/plain-date/tests/plain-date.factory.unit.test.d.ts +1 -0
  204. package/dist/plain-date/tests/plain-date.factory.unit.test.js +136 -0
  205. package/dist/plain-date/tests/plain-date.factory.unit.test.js.map +1 -0
  206. package/dist/plain-date/tests/plain-date.manipulation.unit.test.d.ts +1 -0
  207. package/dist/plain-date/tests/plain-date.manipulation.unit.test.js +93 -0
  208. package/dist/plain-date/tests/plain-date.manipulation.unit.test.js.map +1 -0
  209. package/dist/plain-date/tests/wise-date.ordering.unit.test.d.ts +1 -0
  210. package/dist/plain-date/tests/wise-date.ordering.unit.test.js +174 -0
  211. package/dist/plain-date/tests/wise-date.ordering.unit.test.js.map +1 -0
  212. package/dist/plain-date/typeorm/index.d.ts +1 -0
  213. package/dist/plain-date/typeorm/index.js +2 -0
  214. package/dist/plain-date/typeorm/index.js.map +1 -0
  215. package/dist/plain-date/typeorm/plain-date.column.d.ts +3 -0
  216. package/dist/plain-date/typeorm/plain-date.column.js +24 -0
  217. package/dist/plain-date/typeorm/plain-date.column.js.map +1 -0
  218. package/dist/plain-date/validators/index.d.ts +1 -0
  219. package/dist/plain-date/validators/index.js +2 -0
  220. package/dist/plain-date/validators/index.js.map +1 -0
  221. package/dist/plain-date/validators/is-plain-date.validator.d.ts +7 -0
  222. package/dist/plain-date/validators/is-plain-date.validator.js +34 -0
  223. package/dist/plain-date/validators/is-plain-date.validator.js.map +1 -0
  224. package/dist/plain-time/api-property/index.d.ts +1 -0
  225. package/dist/plain-time/api-property/index.js +2 -0
  226. package/dist/plain-time/api-property/index.js.map +1 -0
  227. package/dist/plain-time/api-property/plain-time.api-property.d.ts +2 -0
  228. package/dist/plain-time/api-property/plain-time.api-property.js +5 -0
  229. package/dist/plain-time/api-property/plain-time.api-property.js.map +1 -0
  230. package/dist/plain-time/constants.d.ts +4 -0
  231. package/dist/plain-time/constants.js +5 -0
  232. package/dist/plain-time/constants.js.map +1 -0
  233. package/dist/plain-time/index.d.ts +8 -0
  234. package/dist/plain-time/index.js +8 -0
  235. package/dist/plain-time/index.js.map +1 -0
  236. package/dist/plain-time/is-valid-time-string.d.ts +2 -0
  237. package/dist/plain-time/is-valid-time-string.js +5 -0
  238. package/dist/plain-time/is-valid-time-string.js.map +1 -0
  239. package/dist/plain-time/max.d.ts +2 -0
  240. package/dist/plain-time/max.js +15 -0
  241. package/dist/plain-time/max.js.map +1 -0
  242. package/dist/plain-time/min.d.ts +2 -0
  243. package/dist/plain-time/min.js +15 -0
  244. package/dist/plain-time/min.js.map +1 -0
  245. package/dist/plain-time/plain-time-entry.d.ts +18 -0
  246. package/dist/plain-time/plain-time-entry.js +11 -0
  247. package/dist/plain-time/plain-time-entry.js.map +1 -0
  248. package/dist/plain-time/plain-time-error.d.ts +12 -0
  249. package/dist/plain-time/plain-time-error.js +19 -0
  250. package/dist/plain-time/plain-time-error.js.map +1 -0
  251. package/dist/plain-time/plain-time-object.type.d.ts +6 -0
  252. package/dist/plain-time/plain-time-object.type.js +2 -0
  253. package/dist/plain-time/plain-time-object.type.js.map +1 -0
  254. package/dist/plain-time/plain-time.d.ts +44 -0
  255. package/dist/plain-time/plain-time.factory.d.ts +12 -0
  256. package/dist/plain-time/plain-time.factory.js +10 -0
  257. package/dist/plain-time/plain-time.factory.js.map +1 -0
  258. package/dist/plain-time/plain-time.js +160 -0
  259. package/dist/plain-time/plain-time.js.map +1 -0
  260. package/dist/plain-time/seconds-in-unit.d.ts +11 -0
  261. package/dist/plain-time/seconds-in-unit.js +13 -0
  262. package/dist/plain-time/seconds-in-unit.js.map +1 -0
  263. package/dist/plain-time/tests/is-plain-time-after.validator.test.d.ts +1 -0
  264. package/dist/plain-time/tests/is-plain-time-after.validator.test.js +49 -0
  265. package/dist/plain-time/tests/is-plain-time-after.validator.test.js.map +1 -0
  266. package/dist/plain-time/tests/is-plain-time.validator.test.d.ts +1 -0
  267. package/dist/plain-time/tests/is-plain-time.validator.test.js +45 -0
  268. package/dist/plain-time/tests/is-plain-time.validator.test.js.map +1 -0
  269. package/dist/plain-time/tests/plain-time.unit.test.d.ts +1 -0
  270. package/dist/plain-time/tests/plain-time.unit.test.js +323 -0
  271. package/dist/plain-time/tests/plain-time.unit.test.js.map +1 -0
  272. package/dist/plain-time/time-unit.d.ts +1 -0
  273. package/dist/plain-time/time-unit.js +2 -0
  274. package/dist/plain-time/time-unit.js.map +1 -0
  275. package/dist/plain-time/typeorm/index.d.ts +1 -0
  276. package/dist/plain-time/typeorm/index.js +2 -0
  277. package/dist/plain-time/typeorm/index.js.map +1 -0
  278. package/dist/plain-time/typeorm/plain-time-column.d.ts +3 -0
  279. package/dist/plain-time/typeorm/plain-time-column.js +26 -0
  280. package/dist/plain-time/typeorm/plain-time-column.js.map +1 -0
  281. package/dist/plain-time/validators/index.d.ts +6 -0
  282. package/dist/plain-time/validators/index.js +7 -0
  283. package/dist/plain-time/validators/index.js.map +1 -0
  284. package/dist/plain-time/validators/is-plain-time-after.validator.d.ts +5 -0
  285. package/dist/plain-time/validators/is-plain-time-after.validator.js +47 -0
  286. package/dist/plain-time/validators/is-plain-time-after.validator.js.map +1 -0
  287. package/dist/plain-time/validators/is-plain-time-before.validator.d.ts +5 -0
  288. package/dist/plain-time/validators/is-plain-time-before.validator.js +47 -0
  289. package/dist/plain-time/validators/is-plain-time-before.validator.js.map +1 -0
  290. package/dist/plain-time/validators/is-plain-time-between.validator.d.ts +6 -0
  291. package/dist/plain-time/validators/is-plain-time-between.validator.js +52 -0
  292. package/dist/plain-time/validators/is-plain-time-between.validator.js.map +1 -0
  293. package/dist/plain-time/validators/is-plain-time-same-or-after.validator.d.ts +5 -0
  294. package/dist/plain-time/validators/is-plain-time-same-or-after.validator.js +47 -0
  295. package/dist/plain-time/validators/is-plain-time-same-or-after.validator.js.map +1 -0
  296. package/dist/plain-time/validators/is-plain-time-same-or-before.validator.d.ts +5 -0
  297. package/dist/plain-time/validators/is-plain-time-same-or-before.validator.js +47 -0
  298. package/dist/plain-time/validators/is-plain-time-same-or-before.validator.js.map +1 -0
  299. package/dist/plain-time/validators/is-plain-time.validator.d.ts +3 -0
  300. package/dist/plain-time/validators/is-plain-time.validator.js +7 -0
  301. package/dist/plain-time/validators/is-plain-time.validator.js.map +1 -0
  302. package/dist/rrule/frequency.d.ts +12 -0
  303. package/dist/rrule/frequency.js +25 -0
  304. package/dist/rrule/frequency.js.map +1 -0
  305. package/dist/rrule/index.d.ts +16 -0
  306. package/dist/rrule/index.js +7 -0
  307. package/dist/rrule/index.js.map +1 -0
  308. package/dist/rrule/rrule.d.ts +23 -0
  309. package/dist/rrule/rrule.factory.d.ts +20 -0
  310. package/dist/rrule/rrule.factory.js +8 -0
  311. package/dist/rrule/rrule.factory.js.map +1 -0
  312. package/dist/rrule/rrule.js +114 -0
  313. package/dist/rrule/rrule.js.map +1 -0
  314. package/dist/rrule/rrule.once.d.ts +14 -0
  315. package/dist/rrule/rrule.once.js +19 -0
  316. package/dist/rrule/rrule.once.js.map +1 -0
  317. package/dist/rrule/tests/rrule.once.unit.test.d.ts +1 -0
  318. package/dist/rrule/tests/rrule.once.unit.test.js +19 -0
  319. package/dist/rrule/tests/rrule.once.unit.test.js.map +1 -0
  320. package/dist/rrule/tests/rrule.unit.test.d.ts +1 -0
  321. package/dist/rrule/tests/rrule.unit.test.js +202 -0
  322. package/dist/rrule/tests/rrule.unit.test.js.map +1 -0
  323. package/dist/rrule/typeorm/index.d.ts +1 -0
  324. package/dist/rrule/typeorm/index.js +2 -0
  325. package/dist/rrule/typeorm/index.js.map +1 -0
  326. package/dist/rrule/typeorm/rrule-column.d.ts +2 -0
  327. package/dist/rrule/typeorm/rrule-column.js +6 -0
  328. package/dist/rrule/typeorm/rrule-column.js.map +1 -0
  329. package/dist/timestamp/api-property/index.d.ts +1 -0
  330. package/dist/timestamp/api-property/index.js +2 -0
  331. package/dist/timestamp/api-property/index.js.map +1 -0
  332. package/dist/timestamp/api-property/timestamp.api-property.d.ts +2 -0
  333. package/dist/timestamp/api-property/timestamp.api-property.js +12 -0
  334. package/dist/timestamp/api-property/timestamp.api-property.js.map +1 -0
  335. package/dist/timestamp/dayjs-timestamp.d.ts +59 -0
  336. package/dist/timestamp/dayjs-timestamp.js +205 -0
  337. package/dist/timestamp/dayjs-timestamp.js.map +1 -0
  338. package/dist/timestamp/future-infinity.d.ts +48 -0
  339. package/dist/timestamp/future-infinity.js +128 -0
  340. package/dist/timestamp/future-infinity.js.map +1 -0
  341. package/dist/timestamp/index.d.ts +30 -0
  342. package/dist/timestamp/index.js +15 -0
  343. package/dist/timestamp/index.js.map +1 -0
  344. package/dist/timestamp/max.d.ts +2 -0
  345. package/dist/timestamp/max.js +15 -0
  346. package/dist/timestamp/max.js.map +1 -0
  347. package/dist/timestamp/min.d.ts +2 -0
  348. package/dist/timestamp/min.js +15 -0
  349. package/dist/timestamp/min.js.map +1 -0
  350. package/dist/timestamp/past-infinity.d.ts +48 -0
  351. package/dist/timestamp/past-infinity.js +128 -0
  352. package/dist/timestamp/past-infinity.js.map +1 -0
  353. package/dist/timestamp/tests/dayjs-timestamp.unit.test.d.ts +1 -0
  354. package/dist/timestamp/tests/dayjs-timestamp.unit.test.js +18 -0
  355. package/dist/timestamp/tests/dayjs-timestamp.unit.test.js.map +1 -0
  356. package/dist/timestamp/tests/timestamp.factory.unit.test.d.ts +1 -0
  357. package/dist/timestamp/tests/timestamp.factory.unit.test.js +16 -0
  358. package/dist/timestamp/tests/timestamp.factory.unit.test.js.map +1 -0
  359. package/dist/timestamp/timestamp.d.ts +83 -0
  360. package/dist/timestamp/timestamp.factory.d.ts +18 -0
  361. package/dist/timestamp/timestamp.factory.js +36 -0
  362. package/dist/timestamp/timestamp.factory.js.map +1 -0
  363. package/dist/timestamp/timestamp.js +2 -0
  364. package/dist/timestamp/timestamp.js.map +1 -0
  365. package/dist/timestamp/typeorm/index.d.ts +1 -0
  366. package/dist/timestamp/typeorm/index.js +2 -0
  367. package/dist/timestamp/typeorm/index.js.map +1 -0
  368. package/dist/timestamp/typeorm/timestamp.column.d.ts +3 -0
  369. package/dist/timestamp/typeorm/timestamp.column.js +25 -0
  370. package/dist/timestamp/typeorm/timestamp.column.js.map +1 -0
  371. package/dist/timestamp/validators/index.d.ts +1 -0
  372. package/dist/timestamp/validators/index.js +2 -0
  373. package/dist/timestamp/validators/index.js.map +1 -0
  374. package/dist/timestamp/validators/is-timestamp.validator.d.ts +7 -0
  375. package/dist/timestamp/validators/is-timestamp.validator.js +34 -0
  376. package/dist/timestamp/validators/is-timestamp.validator.js.map +1 -0
  377. package/package.json +46 -0
@@ -0,0 +1,775 @@
1
+ import { before, describe, it } from 'node:test';
2
+ import { expect } from 'expect';
3
+ import { DateTimeRange } from '../date-time-range.js';
4
+ import { InvalidDateTimeRangeBounds } from '../date-time-range.errors.js';
5
+ import { initDayjs } from '../../common/init-dayjs.js';
6
+ import { Inclusivity } from '../../common/inclusivity.js';
7
+ import { FutureInfinity } from '../../timestamp/future-infinity.js';
8
+ import { timestamp } from '../../timestamp/index.js';
9
+ import { PastInfinity } from '../../timestamp/past-infinity.js';
10
+ describe('DateTimeRange unit tests', () => {
11
+ before(() => {
12
+ initDayjs();
13
+ });
14
+ describe('constructor', () => {
15
+ it('Throws an error when a range is created for (+infinity, -infinity)', () => {
16
+ expect(() => new DateTimeRange(new FutureInfinity(), new PastInfinity())).toThrow(InvalidDateTimeRangeBounds);
17
+ });
18
+ it('Throws for (+infinity, +infinity)', () => {
19
+ expect(() => new DateTimeRange(new FutureInfinity(), new FutureInfinity())).toThrow();
20
+ });
21
+ it('Throws for (-infinity, -infinity)', () => {
22
+ expect(() => new DateTimeRange(new PastInfinity(), new PastInfinity())).toThrow();
23
+ });
24
+ it('Creates a range for (-infinity, +infinity)', () => {
25
+ expect(() => new DateTimeRange(new PastInfinity(), new FutureInfinity())).not.toThrow();
26
+ });
27
+ it('Throws an error when a range is created for (today, yesterday)', () => {
28
+ expect(() => new DateTimeRange(timestamp(), timestamp().subtract(1, 'day'), '()')).toThrow(InvalidDateTimeRangeBounds);
29
+ });
30
+ it('Throws an error when a range is created for (now, now)', () => {
31
+ const now = timestamp();
32
+ expect(() => new DateTimeRange(now, now, '()')).toThrow(InvalidDateTimeRangeBounds);
33
+ });
34
+ it('Throws an error when a range is created for (now, now + 1ms)', () => {
35
+ const now = timestamp();
36
+ expect(() => new DateTimeRange(now, now.add(1, 'ms'), '()')).toThrow(InvalidDateTimeRangeBounds);
37
+ });
38
+ it('Throws an error when a range is created for [today, yesterday)', () => {
39
+ expect(() => new DateTimeRange(timestamp(), timestamp().subtract(1, 'day'), Inclusivity.INCLUSIVE, Inclusivity.EXCLUSIVE)).toThrow(InvalidDateTimeRangeBounds);
40
+ });
41
+ it('Throws an error when a range is created for [today, yesterday]', () => {
42
+ expect(() => new DateTimeRange(timestamp(), timestamp().subtract(1, 'day'), Inclusivity.INCLUSIVE, Inclusivity.INCLUSIVE)).toThrow(InvalidDateTimeRangeBounds);
43
+ });
44
+ it('Creates a range containing one timestamp [now, now]', () => {
45
+ const now = timestamp();
46
+ expect(() => new DateTimeRange(now, now, '[]')).not.toThrow();
47
+ });
48
+ it('Does not create a range of [now, now)', () => {
49
+ const now = timestamp();
50
+ expect(() => new DateTimeRange(now, now)).toThrow();
51
+ });
52
+ it('Creates a range of 1 ms [now, now +1ms)', () => {
53
+ const now = timestamp();
54
+ const dateRange = new DateTimeRange(now, now.add(1, 'ms'), Inclusivity.INCLUSIVE, Inclusivity.EXCLUSIVE);
55
+ expect(dateRange.from.isSame(now)).toBe(true);
56
+ expect(dateRange.until.isSame(now.add(1, 'ms'))).toBe(true);
57
+ });
58
+ it('Creates a range of 2 ms [now, now + 1ms]', () => {
59
+ const now = timestamp();
60
+ const dateRange = new DateTimeRange(now, now.add(1, 'ms'));
61
+ expect(dateRange.from.isSame(now)).toBe(true);
62
+ expect(dateRange.until.isSame(now.add(1, 'ms'))).toBe(true);
63
+ });
64
+ it('Creates a half open range (-infinity, today]', () => {
65
+ expect(() => new DateTimeRange(new PastInfinity(), timestamp())).not.toThrow();
66
+ });
67
+ it('Creates a half open range [today, +infinity)', () => {
68
+ expect(() => new DateTimeRange(timestamp(), new FutureInfinity())).not.toThrow();
69
+ });
70
+ it('Creates a date range from an inclusivity string', () => {
71
+ expect(() => new DateTimeRange(timestamp(), timestamp(), '[]')).not.toThrow();
72
+ expect(() => new DateTimeRange(timestamp(), timestamp().add(1, 'ms'), '[)')).not.toThrow();
73
+ expect(() => new DateTimeRange(timestamp().subtract(1, 'year'), timestamp().add(1, 'week'), '()')).not.toThrow();
74
+ expect(() => new DateTimeRange(timestamp().subtract(1, 'hour'), timestamp().add(1, 'minute'), '(]')).not.toThrow();
75
+ });
76
+ });
77
+ describe('years', () => {
78
+ it('returns 1 year for [today,today + 1 year)', () => {
79
+ const range = new DateTimeRange(timestamp(), timestamp().add(1, 'year'));
80
+ expect(range.years).toBe(1);
81
+ });
82
+ it('returns infinity for [today, +Infinity)', () => {
83
+ const range = new DateTimeRange(timestamp(), new FutureInfinity());
84
+ expect(range.years).toBe(Infinity);
85
+ });
86
+ });
87
+ describe('months', () => {
88
+ it('returns 1 months for [1st of january, 1st of february]', () => {
89
+ const range = new DateTimeRange(timestamp('2024-01-01'), timestamp('2024-02-01'));
90
+ expect(range.months).toBe(1);
91
+ });
92
+ it('returns 0 months for [1st of january, 31st of january]', () => {
93
+ const range = new DateTimeRange(timestamp('2024-01-01'), timestamp('2024-01-31'));
94
+ expect(range.months).toBe(0);
95
+ });
96
+ it('returns 0 months for (1st of january, 31st of january]', () => {
97
+ const range = new DateTimeRange(timestamp('2024-01-01'), timestamp('2024-01-31'), '(]');
98
+ expect(range.months).toBe(0);
99
+ });
100
+ it('returns 0 months for [1st of january, 31st of january)', () => {
101
+ const range = new DateTimeRange(timestamp('2024-01-01'), timestamp('2024-01-31'), '[)');
102
+ expect(range.months).toBe(0);
103
+ });
104
+ it('returns 1 month for [today,today + 1 month]', () => {
105
+ const range = new DateTimeRange(timestamp(), timestamp().add(1, 'month'));
106
+ expect(range.months).toBe(1);
107
+ });
108
+ it('returns infinity for [today, +Infinity)', () => {
109
+ const range = new DateTimeRange(timestamp(), new FutureInfinity());
110
+ expect(range.months).toBe(Infinity);
111
+ });
112
+ });
113
+ describe('weeks', () => {
114
+ it('returns 1 week for [today,today + 1 week]', () => {
115
+ const range = new DateTimeRange(timestamp(), timestamp().add(1, 'week'));
116
+ expect(range.weeks).toBe(1);
117
+ });
118
+ it('returns 0 weeks for [today,today + 6 days]', () => {
119
+ const range = new DateTimeRange(timestamp(), timestamp().add(6, 'days'));
120
+ expect(range.weeks).toBe(0);
121
+ });
122
+ it('returns 0 weeks for [today,today + 6 days)', () => {
123
+ const range = new DateTimeRange(timestamp(), timestamp().add(6, 'days'));
124
+ expect(range.weeks).toBe(0);
125
+ });
126
+ it('returns infinity for [today, +Infinity)', () => {
127
+ const range = new DateTimeRange(timestamp(), new FutureInfinity());
128
+ expect(range.weeks).toBe(Infinity);
129
+ });
130
+ });
131
+ describe('days', () => {
132
+ it('returns 0 days for [now,now]', () => {
133
+ const range = new DateTimeRange(timestamp(), timestamp(), '[]');
134
+ expect(range.days).toBe(0);
135
+ });
136
+ it('returns 1 day for [today, tomorrow]', () => {
137
+ const range = new DateTimeRange(timestamp(), timestamp().add(1, 'day'), '[]');
138
+ expect(range.days).toBe(1);
139
+ });
140
+ it('returns 1 day for [today, tomorrow)', () => {
141
+ const now = timestamp();
142
+ const range = new DateTimeRange(now, now.add(1, 'day'), Inclusivity.INCLUSIVE, Inclusivity.EXCLUSIVE);
143
+ expect(range.days).toBe(1);
144
+ });
145
+ it('returns infinity for [today, +Infinity)', () => {
146
+ const range = new DateTimeRange(timestamp(), new FutureInfinity());
147
+ expect(range.days).toBe(Infinity);
148
+ });
149
+ });
150
+ describe('hours', () => {
151
+ it('returns 0 hours for [now,now + 1 hour - 1ms)', () => {
152
+ const now = timestamp();
153
+ const range = new DateTimeRange(now, now.add(1, 'hour').subtract(1, 'ms'), '[)');
154
+ expect(range.hours).toBe(0);
155
+ });
156
+ it('returns 1 hour for [now, now + 1 hour]', () => {
157
+ const now = timestamp();
158
+ const range = new DateTimeRange(now, now.add(1, 'hour'), '[]');
159
+ expect(range.hours).toBe(1);
160
+ });
161
+ it('returns 1 hour for [now, now + 1hour)', () => {
162
+ const now = timestamp();
163
+ const range = new DateTimeRange(now, now.add(1, 'hour'), '[)');
164
+ expect(range.hours).toBe(1);
165
+ });
166
+ it('returns infinity for [now, +Infinity)', () => {
167
+ const range = new DateTimeRange(timestamp(), new FutureInfinity());
168
+ expect(range.hours).toBe(Infinity);
169
+ });
170
+ });
171
+ describe('contains', () => {
172
+ it('an (-infinity, +infinity) range contains all concrete days, but not infinity ', () => {
173
+ const range = new DateTimeRange(new PastInfinity(), new FutureInfinity());
174
+ expect(range.contains(new PastInfinity())).toBe(false);
175
+ expect(range.contains(timestamp())).toBe(true);
176
+ expect(range.contains(new FutureInfinity())).toBe(false);
177
+ });
178
+ it('[now, now] contains today', () => {
179
+ const now = timestamp();
180
+ const range = new DateTimeRange(now, now, '[]');
181
+ expect(range.contains(now)).toBe(true);
182
+ });
183
+ it('[now, now] does not contain now + 1ms nor +infinity', () => {
184
+ const now = timestamp();
185
+ const range = new DateTimeRange(now, now, '[]');
186
+ expect(range.contains(now.add(1, 'ms'))).toBe(false);
187
+ expect(range.contains(new FutureInfinity())).toBe(false);
188
+ });
189
+ it('[now, now] does not contain now - 1ms nor -infinity', () => {
190
+ const now = timestamp();
191
+ const range = new DateTimeRange(now, now, '[]');
192
+ expect(range.contains(now.subtract(1, 'ms'))).toBe(false);
193
+ expect(range.contains(new PastInfinity())).toBe(false);
194
+ });
195
+ it('(now, now +1ms] does not contain now', () => {
196
+ const now = timestamp();
197
+ const range = new DateTimeRange(now, now.add(1, 'ms'), '(]');
198
+ expect(range.contains(now)).toBe(false);
199
+ });
200
+ it('(now, now + 1ms] contains now + 1ms', () => {
201
+ const now = timestamp();
202
+ const range = new DateTimeRange(now, now.add(1, 'ms'), '(]');
203
+ expect(range.contains(now.add(1, 'ms'))).toBe(true);
204
+ });
205
+ it('[now, now + 1ms) contains today', () => {
206
+ const now = timestamp();
207
+ const range = new DateTimeRange(now, now.add(1, 'ms'), '[)');
208
+ expect(range.contains(now)).toBe(true);
209
+ });
210
+ it('[now, now +1ms) does not contain now + 1ms', () => {
211
+ const now = timestamp();
212
+ const range = new DateTimeRange(now, now.add(1, 'ms'), '[)');
213
+ expect(range.contains(now.add(1, 'ms'))).toBe(false);
214
+ });
215
+ });
216
+ describe('minutes', () => {
217
+ it('returns 0 minutes for [now,now + 1 minute - 1ms]', () => {
218
+ const now = timestamp();
219
+ const range = new DateTimeRange(now, now.add(1, 'minute').subtract(1, 'ms'));
220
+ expect(range.minutes).toBe(0);
221
+ });
222
+ it('returns 1 minute for [now, now + 1 minute]', () => {
223
+ const now = timestamp();
224
+ const range = new DateTimeRange(now, now.add(1, 'minute'));
225
+ expect(range.minutes).toBe(1);
226
+ });
227
+ it('returns 1 minute for [now, now + 1minute)', () => {
228
+ const now = timestamp();
229
+ const range = new DateTimeRange(now, now.add(1, 'minute'), '[)');
230
+ expect(range.minutes).toBe(1);
231
+ });
232
+ it('returns infinity for [now, +Infinity)', () => {
233
+ const range = new DateTimeRange(timestamp(), new FutureInfinity());
234
+ expect(range.minutes).toBe(Infinity);
235
+ });
236
+ });
237
+ describe('seconds', () => {
238
+ it('returns 0 seconds for [now,now + 1 second - 1ms]', () => {
239
+ const now = timestamp();
240
+ const range = new DateTimeRange(now, now.add(1, 'second').subtract(1, 'ms'));
241
+ expect(range.seconds).toBe(0);
242
+ });
243
+ it('returns 1 second for [now, now + 1 second]', () => {
244
+ const now = timestamp();
245
+ const range = new DateTimeRange(now, now.add(1, 'second'));
246
+ expect(range.seconds).toBe(1);
247
+ });
248
+ it('returns 1 second for [now, now + 1second)', () => {
249
+ const now = timestamp();
250
+ const range = new DateTimeRange(now, now.add(1, 'second'), '[)');
251
+ expect(range.seconds).toBe(1);
252
+ });
253
+ it('returns infinity for [now, +Infinity)', () => {
254
+ const range = new DateTimeRange(timestamp(), new FutureInfinity());
255
+ expect(range.seconds).toBe(Infinity);
256
+ });
257
+ });
258
+ describe('milliseconds', () => {
259
+ it('returns 1 milliseconds for [now,now]', () => {
260
+ const now = timestamp();
261
+ const range = new DateTimeRange(now, now, '[]');
262
+ expect(range.milliseconds).toBe(1);
263
+ });
264
+ it('returns 1 millisecond for [now, now + 1 millisecond]', () => {
265
+ const now = timestamp();
266
+ const range = new DateTimeRange(now, now.add(1, 'millisecond'));
267
+ expect(range.milliseconds).toBe(1);
268
+ });
269
+ it('returns 1 millisecond for [now, now + 1millisecond)', () => {
270
+ const now = timestamp();
271
+ const range = new DateTimeRange(now, now.add(1, 'millisecond'), '[)');
272
+ expect(range.milliseconds).toBe(1);
273
+ });
274
+ it('returns infinity for [now, +Infinity)', () => {
275
+ const range = new DateTimeRange(timestamp(), new FutureInfinity());
276
+ expect(range.milliseconds).toBe(Infinity);
277
+ });
278
+ });
279
+ describe('overlaps', () => {
280
+ it('two infinite ranges overlap', () => {
281
+ const first = new DateTimeRange(new PastInfinity(), new FutureInfinity());
282
+ const second = new DateTimeRange(new PastInfinity(), new FutureInfinity());
283
+ expect(first.overlaps(second)).toBe(true);
284
+ expect(second.overlaps(first)).toBe(true);
285
+ });
286
+ it('a date range overlaps with an infinite range', () => {
287
+ const first = new DateTimeRange(timestamp(), timestamp().add(1, 'day'));
288
+ const second = new DateTimeRange(new PastInfinity(), new FutureInfinity());
289
+ expect(first.overlaps(second)).toBe(true);
290
+ expect(second.overlaps(first)).toBe(true);
291
+ });
292
+ it('adjacent ranges do not overlap', () => {
293
+ const now = timestamp();
294
+ const first = new DateTimeRange(new PastInfinity(), now);
295
+ const second = new DateTimeRange(now.add(1, 'ms'), new FutureInfinity());
296
+ expect(first.overlaps(second)).toBe(false);
297
+ expect(second.overlaps(first)).toBe(false);
298
+ });
299
+ it('non overlapping ranges do not overlap', () => {
300
+ const now = timestamp();
301
+ const first = new DateTimeRange(now.subtract(1, 'week'), now);
302
+ const second = new DateTimeRange(now.add(1, 'year'), now.add(2, 'years'));
303
+ expect(first.overlaps(second)).toBe(false);
304
+ expect(second.overlaps(first)).toBe(false);
305
+ });
306
+ });
307
+ describe('overlap', () => {
308
+ it('overlap between (-infinity, +infinity) and (-infinity, +infinity) is (-infinity, +infinity)', () => {
309
+ const first = new DateTimeRange(new PastInfinity(), new FutureInfinity());
310
+ const second = new DateTimeRange(new PastInfinity(), new FutureInfinity());
311
+ const overlap = first.overlap(second);
312
+ expect(overlap.from.isPastInfinity()).toBe(true);
313
+ expect(overlap.until.isFutureInfinity()).toBe(true);
314
+ });
315
+ it('overlap between (-infinity, today] and (-infinity, +infinity) is (-infinity, today]', () => {
316
+ const now = timestamp();
317
+ const first = new DateTimeRange(new PastInfinity(), now);
318
+ const second = new DateTimeRange(new PastInfinity(), new FutureInfinity());
319
+ const overlap = first.overlap(second);
320
+ expect(overlap.from.isPastInfinity()).toBe(true);
321
+ expect(overlap.until.isSame(now)).toBe(true);
322
+ });
323
+ it('overlap between [today, +infinity) and (-infinity, +infinity) is [today, +infinity)', () => {
324
+ const now = timestamp();
325
+ const first = new DateTimeRange(now, new FutureInfinity());
326
+ const second = new DateTimeRange(new PastInfinity(), new FutureInfinity());
327
+ const overlap = first.overlap(second);
328
+ expect(overlap.from.isSame(now)).toBe(true);
329
+ expect(overlap.until.isFutureInfinity()).toBe(true);
330
+ });
331
+ it('overlap between [now, now] and [now, now] is [now, now]', () => {
332
+ const now = timestamp();
333
+ const first = new DateTimeRange(now, now, '[]');
334
+ const second = new DateTimeRange(now, now, '[]');
335
+ const overlap = first.overlap(second);
336
+ expect(overlap.isSame(new DateTimeRange(now, now, '[]'))).toBe(true);
337
+ });
338
+ it('overlap between [now, now] and [yesterday, tomorrow] is [now,now]', () => {
339
+ const now = timestamp();
340
+ const first = new DateTimeRange(now, now, '[]');
341
+ const second = new DateTimeRange(now.subtract(1, 'day'), now.add(1, 'day'));
342
+ const overlap = first.overlap(second);
343
+ expect(overlap.isSame(new DateTimeRange(now, now, '[]'))).toBe(true);
344
+ });
345
+ it('overlap between [now, now] and (now -1ms, now + 1ms) is [now,now]', () => {
346
+ const now = timestamp();
347
+ const first = new DateTimeRange(now, now, '[]');
348
+ const second = new DateTimeRange(now.subtract(1, 'ms'), now.add(1, 'ms'), '()');
349
+ const overlap = first.overlap(second);
350
+ expect(overlap.isSame(new DateTimeRange(now, now, '[]'))).toBe(true);
351
+ });
352
+ it('overlap between [now, now] and [now, now + 1ms) is [now, now]', () => {
353
+ const now = timestamp();
354
+ const first = new DateTimeRange(now, now, '[]');
355
+ const second = new DateTimeRange(now, now.add(1, 'ms'), '[)');
356
+ const overlap = first.overlap(second);
357
+ expect(overlap.isSame(new DateTimeRange(now, now, '[]'))).toBe(true);
358
+ });
359
+ it('overlap between [now, now] and (now -1ms, now] is [now,now]', () => {
360
+ const now = timestamp();
361
+ const first = new DateTimeRange(now, now, '[]');
362
+ const second = new DateTimeRange(now.subtract(1, 'ms'), now, '(]');
363
+ const overlap = first.overlap(second);
364
+ expect(overlap.isSame(new DateTimeRange(now, now, '[]'))).toBe(true);
365
+ });
366
+ it('overlap between [now, now +1ms] and [now -1ms, now +1ms] is [now,now +1ms]', () => {
367
+ const now = timestamp();
368
+ const first = new DateTimeRange(now, now.add(1, 'ms'));
369
+ const second = new DateTimeRange(now.subtract(1, 'ms'), now.add(1, 'ms'));
370
+ const overlap = first.overlap(second);
371
+ expect(overlap.from.isSame(now)).toBe(true);
372
+ expect(overlap.until.isSame(now.add(1, 'ms'))).toBe(true);
373
+ });
374
+ it('overlap between [now -1ms, now +1ms) and [now -1ms, now +1ms] is [now -1ms, now]', () => {
375
+ const now = timestamp();
376
+ const first = new DateTimeRange(now.subtract(1, 'ms'), now.add(1, 'ms'), '[)');
377
+ const second = new DateTimeRange(now.subtract(1, 'ms'), now.add(1, 'ms'), '[]');
378
+ const overlap = first.overlap(second);
379
+ expect(overlap.isSame(new DateTimeRange(now.subtract(1, 'ms'), now, '[]'))).toBe(true);
380
+ });
381
+ it('overlap between (now -1ms, now +1ms) and [now -1ms, now +1ms] is [now, now]', () => {
382
+ const now = timestamp();
383
+ const first = new DateTimeRange(now.subtract(1, 'ms'), now.add(1, 'ms'), '()');
384
+ const second = new DateTimeRange(now.subtract(1, 'ms'), now.add(1, 'ms'), '[]');
385
+ const overlap = first.overlap(second);
386
+ expect(overlap.isSame(new DateTimeRange(now, now, '[]'))).toBe(true);
387
+ });
388
+ });
389
+ describe('diff', () => {
390
+ it('diff between (-infinity, +infinity) and (-infinity, +infinity) is none', () => {
391
+ const first = new DateTimeRange(new PastInfinity(), new FutureInfinity());
392
+ const second = new DateTimeRange(new PastInfinity(), new FutureInfinity());
393
+ expect(first.diff(second)).toHaveLength(0);
394
+ });
395
+ it('diff between (-infinity, now] and (-infinity, +infinity) is none', () => {
396
+ const first = new DateTimeRange(new PastInfinity(), timestamp());
397
+ const second = new DateTimeRange(new PastInfinity(), new FutureInfinity());
398
+ expect(first.diff(second)).toHaveLength(0);
399
+ });
400
+ it('diff between [now, now] and (-infinity, +infinity) is none', () => {
401
+ const first = new DateTimeRange(timestamp(), timestamp(), '[]');
402
+ const second = new DateTimeRange(new PastInfinity(), new FutureInfinity());
403
+ expect(first.diff(second)).toHaveLength(0);
404
+ });
405
+ it('diff between (-infinity, +infinity) and (-infinity, now) is [now, +infinity)', () => {
406
+ const now = timestamp();
407
+ const first = new DateTimeRange(new PastInfinity(), new FutureInfinity());
408
+ const second = new DateTimeRange(new PastInfinity(), now);
409
+ const expectedRange = new DateTimeRange(now, new FutureInfinity());
410
+ const diff = first.diff(second);
411
+ expect(diff).toHaveLength(1);
412
+ expect(diff.ranges[0].isSame(expectedRange)).toBe(true);
413
+ });
414
+ it('diff between (-infinity, +infinity) and [now, +infinity) is (-infinity, now)', () => {
415
+ const now = timestamp();
416
+ const first = new DateTimeRange(new PastInfinity(), new FutureInfinity());
417
+ const second = new DateTimeRange(now, new FutureInfinity());
418
+ const expectedRange = new DateTimeRange(new PastInfinity(), now);
419
+ const diff = first.diff(second);
420
+ expect(diff).toHaveLength(1);
421
+ expect(diff.ranges[0].isSame(expectedRange)).toBe(true);
422
+ });
423
+ it('diff between (-infinity, +infinity) and [now, now+1ms) is (-infinity, now) and [now +1ms, +infinity)', () => {
424
+ const now = timestamp();
425
+ const first = new DateTimeRange(new PastInfinity(), new FutureInfinity());
426
+ const second = new DateTimeRange(now, now.add(1, 'ms'));
427
+ const diff = first.diff(second);
428
+ expect(diff).toHaveLength(2);
429
+ expect(diff.ranges[0].isSame(new DateTimeRange(new PastInfinity(), now))).toBe(true);
430
+ expect(diff.ranges[1].isSame(new DateTimeRange(now.add(1, 'ms'), new FutureInfinity())))
431
+ .toBe(true);
432
+ });
433
+ it('diff between [now -1min, now +1min) and [now, now+1 ms) is [now -1min, now) and [now +1ms, now +1min)', () => {
434
+ const now = timestamp();
435
+ const first = new DateTimeRange(now.subtract(1, 'minute'), now.add(1, 'minute'));
436
+ const second = new DateTimeRange(now, now.add(1, 'millisecond'));
437
+ const diff = first.diff(second);
438
+ expect(diff).toHaveLength(2);
439
+ expect(diff.ranges[0].isSame(new DateTimeRange(now.subtract(1, 'minute'), now))).toBe(true);
440
+ expect(diff.ranges[1].isSame(new DateTimeRange(now.add(1, 'ms'), now.add(1, 'minute')))).toBe(true);
441
+ });
442
+ it('diff between [yesterday, today] and [tomorrow, +infinity) is [yesterday, today]', () => {
443
+ const now = timestamp();
444
+ const first = new DateTimeRange(now.subtract(1, 'day'), now);
445
+ const second = new DateTimeRange(now.add(1, 'day'), new FutureInfinity());
446
+ const diff = first.diff(second);
447
+ expect(diff).toHaveLength(1);
448
+ expect(diff.ranges[0].isSame(first)).toBe(true);
449
+ });
450
+ });
451
+ describe('startsAfter', () => {
452
+ it('returns true if the date is before the start of the range', () => {
453
+ const now = timestamp();
454
+ const range = new DateTimeRange(now, now.add(1, 'hour'));
455
+ expect(range.startsAfter(now.subtract(1, 'second'))).toBe(true);
456
+ });
457
+ it('returns false if the date is equal to the start of the range', () => {
458
+ const now = timestamp();
459
+ const range = new DateTimeRange(now, now.add(1, 'hour'));
460
+ expect(range.startsAfter(now)).toBe(false);
461
+ });
462
+ it('returns false if the date is after the start of the range', () => {
463
+ const now = timestamp();
464
+ const range = new DateTimeRange(now, now.add(1, 'hour'));
465
+ expect(range.startsAfter(now.add(1, 'second'))).toBe(false);
466
+ });
467
+ it('accepts Date objects as argument', () => {
468
+ const now = timestamp();
469
+ const range = new DateTimeRange(now, now.add(1, 'ms'));
470
+ expect(range.startsAfter(now.subtract(1, 'second').toDate())).toBe(true);
471
+ });
472
+ });
473
+ describe('endsBefore', () => {
474
+ it('returns true if the date is after the end of the range', () => {
475
+ const now = timestamp();
476
+ const range = new DateTimeRange(now, now.add(1, 'ms'));
477
+ expect(range.endsBefore(now.add(2, 'ms'))).toBe(true);
478
+ });
479
+ it('returns true if the date is equal to the end of the range', () => {
480
+ const now = timestamp();
481
+ const range = new DateTimeRange(now, now.add(1, 'ms'));
482
+ expect(range.endsBefore(now.add(1, 'ms'))).toBe(true);
483
+ });
484
+ it('returns false if the date is before the end of the range', () => {
485
+ const now = timestamp();
486
+ const range = new DateTimeRange(now, now.add(2, 'ms'));
487
+ expect(range.endsBefore(now.add(1, 'ms'))).toBe(false);
488
+ });
489
+ it('accepts Date objects as argument', () => {
490
+ const now = timestamp();
491
+ const range = new DateTimeRange(now, now.add(1, 'ms'));
492
+ expect(range.endsBefore(now.add(2, 'ms').toDate())).toBe(true);
493
+ });
494
+ });
495
+ describe('toString', () => {
496
+ it('returns string with and inclusive lower and exclusive upper for finite ranges', () => {
497
+ const now = timestamp();
498
+ const later = now.add(1, 'hour');
499
+ const range = new DateTimeRange(now, later);
500
+ expect(range.toString()).toBe(`[${now.toISOString()},${later.toISOString()})`);
501
+ });
502
+ it('returns string with exclusive start if start is infinity', () => {
503
+ const start = new PastInfinity();
504
+ const now = timestamp();
505
+ const range = new DateTimeRange(start, now);
506
+ expect(range.toString()).toBe(`(${start.toISOString()},${now.toISOString()})`);
507
+ });
508
+ it('returns string with exclusive end if end is infinity', () => {
509
+ const now = timestamp();
510
+ const end = new FutureInfinity();
511
+ const range = new DateTimeRange(now, end);
512
+ expect(range.toString()).toBe(`[${now.toISOString()},${end.toISOString()})`);
513
+ });
514
+ it('returns string with exclusive brackets if both start and end are infinity', () => {
515
+ const start = new PastInfinity();
516
+ const end = new FutureInfinity();
517
+ const range = new DateTimeRange(start, end);
518
+ expect(range.toString()).toBe(`(${start.toISOString()},${end.toISOString()})`);
519
+ });
520
+ });
521
+ describe('setUntil', () => {
522
+ it('returns a new DateTimeRange with updated until', () => {
523
+ const now = timestamp();
524
+ const later = now.add(1, 'minute');
525
+ const range = new DateTimeRange(now, later);
526
+ const newUntil = now.add(2, 'minute');
527
+ const newRange = range.setUntil(newUntil);
528
+ expect(newRange.from.isSame(range.from)).toBe(true);
529
+ expect(newRange.until.isSame(newUntil)).toBe(true);
530
+ });
531
+ it('accepts Date objects as input', () => {
532
+ const now = timestamp();
533
+ const later = now.add(1, 'minute');
534
+ const range = new DateTimeRange(now, later);
535
+ const newUntil = now.add(2, 'minute').toDate();
536
+ const newRange = range.setUntil(newUntil);
537
+ expect(newRange.until.isSame(timestamp(newUntil))).toBe(true);
538
+ });
539
+ });
540
+ describe('setFrom', () => {
541
+ it('returns a new DateTimeRange with updated from', () => {
542
+ const now = timestamp();
543
+ const later = now.add(2, 'minute');
544
+ const range = new DateTimeRange(now, later);
545
+ const newFrom = now.subtract(1, 'minute');
546
+ const newRange = range.setFrom(newFrom);
547
+ expect(newRange.from.isSame(newFrom)).toBe(true);
548
+ expect(newRange.until.isSame(range.until)).toBe(true);
549
+ });
550
+ it('accepts Date objects as input', () => {
551
+ const now = timestamp();
552
+ const later = now.add(2, 'minute');
553
+ const range = new DateTimeRange(now, later);
554
+ const newFrom = now.subtract(1, 'minute').toDate();
555
+ const newRange = range.setFrom(newFrom);
556
+ expect(newRange.from.isSame(timestamp(newFrom))).toBe(true);
557
+ });
558
+ });
559
+ describe('precedes', () => {
560
+ it('returns true if this.until is same as other.from and this.until is not future infinity', () => {
561
+ const now = timestamp();
562
+ const range1 = new DateTimeRange(now, now.add(1, 'second'));
563
+ const range2 = new DateTimeRange(now.add(1, 'second'), now.add(2, 'second'));
564
+ expect(range1.precedes(range2)).toBe(true);
565
+ });
566
+ it('returns false if this.until is future infinity', () => {
567
+ const now = timestamp();
568
+ const range1 = new DateTimeRange(now, new FutureInfinity());
569
+ const range2 = new DateTimeRange(now.add(100, 'ms'), now.add(200, 'ms'));
570
+ expect(range1.precedes(range2)).toBe(false);
571
+ });
572
+ it('returns false if this.until + 1ms is not same as other.from', () => {
573
+ const now = timestamp();
574
+ const range1 = new DateTimeRange(now, now.add(1, 'second'));
575
+ const range2 = new DateTimeRange(now.add(2, 'second'), now.add(3, 'second'));
576
+ expect(range1.precedes(range2)).toBe(false);
577
+ });
578
+ });
579
+ describe('isPrecededBy', () => {
580
+ it('returns true if other.precedes(this) is true', () => {
581
+ const now = timestamp();
582
+ const range1 = new DateTimeRange(now, now.add(1, 'second'));
583
+ const range2 = new DateTimeRange(now.subtract(1, 'second'), now);
584
+ expect(range1.isPrecededBy(range2)).toBe(true);
585
+ });
586
+ it('returns false if other.precedes(this) is false', () => {
587
+ const now = timestamp();
588
+ const range1 = new DateTimeRange(now, now.add(1, 'second'));
589
+ const range2 = new DateTimeRange(now.subtract(1, 'second'), now);
590
+ expect(range1.isPrecededBy(range2)).toBe(true);
591
+ });
592
+ });
593
+ describe('succeeds', () => {
594
+ it('returns true if this.from - 1ms is same as other.until and this.from is not past infinity', () => {
595
+ const now = timestamp();
596
+ const range1 = new DateTimeRange(now, now.add(1, 'second'));
597
+ const range2 = new DateTimeRange(now.add(1, 'second'), new FutureInfinity());
598
+ expect(range2.succeeds(range1)).toBe(true);
599
+ });
600
+ it('returns false if the range does not succeed it', () => {
601
+ const now = timestamp();
602
+ const range1 = new DateTimeRange(new PastInfinity(), now.add(1, 'second'));
603
+ const range2 = new DateTimeRange(now.add(2, 'seconds'), new FutureInfinity());
604
+ expect(range2.succeeds(range1)).toBe(false);
605
+ });
606
+ });
607
+ describe('isSucceededBy', () => {
608
+ it('returns true if other.succeeds(this) is true', () => {
609
+ const now = timestamp();
610
+ const range1 = new DateTimeRange(now, now.add(1, 'second'));
611
+ const range2 = new DateTimeRange(now.add(1, 'second'), new FutureInfinity());
612
+ expect(range1.isSucceededBy(range2)).toBe(true);
613
+ });
614
+ it('a range does not succeed itself', () => {
615
+ const now = timestamp();
616
+ const range1 = new DateTimeRange(now, now.add(1, 'second'));
617
+ expect(range1.isSucceededBy(range1)).toBe(false);
618
+ });
619
+ it('returns false if the range is not succeeded', () => {
620
+ const now = timestamp();
621
+ const range1 = new DateTimeRange(new PastInfinity(), now.add(1, 'second'));
622
+ const range2 = new DateTimeRange(now.add(2, 'seconds'), new FutureInfinity());
623
+ expect(range1.isSucceededBy(range2)).toBe(false);
624
+ });
625
+ });
626
+ describe('isAdjacentTo', () => {
627
+ it('returns true if ranges are adjacent (precedes)', () => {
628
+ const now = timestamp();
629
+ const range1 = new DateTimeRange(now, now.add(1, 'second'));
630
+ const range2 = new DateTimeRange(now.add(1, 'second'), now.add(2, 'second'));
631
+ expect(range1.isAdjacentTo(range2)).toBe(true);
632
+ });
633
+ it('returns true if ranges are adjacent (succeeds)', () => {
634
+ const now = timestamp();
635
+ const range1 = new DateTimeRange(now, now.add(1, 'second'));
636
+ const range2 = new DateTimeRange(now.subtract(2, 'seconds'), now);
637
+ expect(range2.isAdjacentTo(range1)).toBe(true);
638
+ });
639
+ it('returns false if ranges are not adjacent', () => {
640
+ const now = timestamp();
641
+ const range1 = new DateTimeRange(now, now.add(1, 'second'));
642
+ const range2 = new DateTimeRange(now.add(3, 'second'), now.add(4, 'second'));
643
+ expect(range1.isAdjacentTo(range2)).toBe(false);
644
+ expect(range2.isAdjacentTo(range1)).toBe(false);
645
+ });
646
+ it('a range is not adjacent to itself', () => {
647
+ const now = timestamp();
648
+ const range1 = new DateTimeRange(now, now.add(1, 'second'));
649
+ expect(range1.isAdjacentTo(range1)).toBe(false);
650
+ });
651
+ });
652
+ describe('merge', () => {
653
+ it('a range merged with itself is itself', () => {
654
+ const now = timestamp();
655
+ const range = new DateTimeRange(now, now.add(1, 'day'));
656
+ const merged = range.merge(range);
657
+ expect(merged.isSame(range)).toBe(true);
658
+ });
659
+ it('merges two identical ranges', () => {
660
+ const now = timestamp();
661
+ const range = new DateTimeRange(now, now.add(1, 'day'));
662
+ const other = new DateTimeRange(now, now.add(1, 'day'));
663
+ const merged = range.merge(other);
664
+ expect(merged.isSame(other)).toBe(true);
665
+ expect(merged.isSame(range)).toBe(true);
666
+ });
667
+ it('merges two overlapping finite ranges', () => {
668
+ const now = timestamp();
669
+ const a = new DateTimeRange(now, now.add(2, 'days'));
670
+ const b = new DateTimeRange(now.add(1, 'day'), now.add(3, 'days'));
671
+ const merged = a.merge(b);
672
+ expect(merged.from.isSame(a.from)).toBe(true);
673
+ expect(merged.until.isSame(b.until)).toBe(true);
674
+ });
675
+ it('merges when one range is contained within the other', () => {
676
+ const now = timestamp();
677
+ const outer = new DateTimeRange(now, now.add(10, 'days'));
678
+ const inner = new DateTimeRange(now.add(2, 'days'), now.add(7, 'days'));
679
+ const merged = outer.merge(inner);
680
+ expect(merged.isSame(outer)).toBe(true);
681
+ });
682
+ it('merges when ranges are adjacent', () => {
683
+ const now = timestamp();
684
+ const a = new DateTimeRange(now, now.add(1, 'day'));
685
+ const b = new DateTimeRange(now.add(1, 'day'), now.add(2, 'day'));
686
+ const merged = a.merge(b);
687
+ expect(merged.from.isSame(a.from)).toBe(true);
688
+ expect(merged.until.isSame(b.until)).toBe(true);
689
+ });
690
+ it('throws if ranges do not overlap (disjoint)', () => {
691
+ const now = timestamp();
692
+ const a = new DateTimeRange(now, now.add(1, 'day'));
693
+ const b = new DateTimeRange(now.add(5, 'days'), now.add(6, 'days'));
694
+ expect(() => a.merge(b)).toThrow('Invalid argument: no overlap with given range');
695
+ });
696
+ it('merges infinite ranges overlapping with finite range', () => {
697
+ const finite = new DateTimeRange(timestamp(), timestamp().add(1, 'day'));
698
+ const infinite = new DateTimeRange(new PastInfinity(), new FutureInfinity());
699
+ const merged = infinite.merge(finite);
700
+ expect(merged.from.isPastInfinity()).toBe(true);
701
+ expect(merged.until.isFutureInfinity()).toBe(true);
702
+ });
703
+ });
704
+ describe('mergeAdjacent', () => {
705
+ it('merges when other range precedes this range (sets from)', () => {
706
+ const now = timestamp();
707
+ const range1 = new DateTimeRange(now.add(1, 'second'), now.add(2, 'second'));
708
+ const range2 = new DateTimeRange(now, now.add(1, 'second'));
709
+ const merged = range1.mergeAdjacent(range2);
710
+ expect(merged.from.isSame(range2.from)).toBe(true);
711
+ expect(merged.until.isSame(range1.until)).toBe(true);
712
+ });
713
+ it('merges when other range succeeds this range (sets until)', () => {
714
+ const now = timestamp();
715
+ const range1 = new DateTimeRange(now, now.add(1, 'second'));
716
+ const range2 = new DateTimeRange(now.add(1, 'second'), new FutureInfinity());
717
+ const merged = range1.mergeAdjacent(range2);
718
+ expect(merged.from.isSame(range1.from)).toBe(true);
719
+ expect(merged.until.isSame(range2.until)).toBe(true);
720
+ });
721
+ it('throws if ranges are not adjacent', () => {
722
+ const now = timestamp();
723
+ const range1 = new DateTimeRange(now, now.add(1, 'second'));
724
+ const range2 = new DateTimeRange(now.add(3, 'second'), now.add(4, 'second'));
725
+ expect(() => range1.mergeAdjacent(range2)).toThrow('cannot merge non adjacent date time ranges');
726
+ });
727
+ });
728
+ describe('containsRange', () => {
729
+ it('a range contains itself', () => {
730
+ const now = timestamp();
731
+ const range = new DateTimeRange(now, now.add(1, 'day'));
732
+ expect(range.containsRange(range)).toBe(true);
733
+ });
734
+ it('an infinite range contains itself', () => {
735
+ const range = new DateTimeRange(-Infinity, Infinity);
736
+ expect(range.containsRange(range)).toBe(true);
737
+ });
738
+ it('returns true if the inner range is fully within the outer range', () => {
739
+ const now = timestamp();
740
+ const outer = new DateTimeRange(now.subtract(1, 'day'), now.add(2, 'day'));
741
+ const inner = new DateTimeRange(now, now.add(1, 'day'));
742
+ expect(outer.containsRange(inner)).toBe(true);
743
+ });
744
+ it('returns false if the inner range starts before the outer range', () => {
745
+ const now = timestamp();
746
+ const outer = new DateTimeRange(now, now.add(1, 'day'));
747
+ const inner = new DateTimeRange(now.subtract(1, 'ms'), now.add(1, 'day'));
748
+ expect(outer.containsRange(inner)).toBe(false);
749
+ });
750
+ it('returns false if the inner range ends after the outer range', () => {
751
+ const now = timestamp();
752
+ const outer = new DateTimeRange(now, now.add(1, 'day'));
753
+ const inner = new DateTimeRange(now, now.add(2, 'day'));
754
+ expect(outer.containsRange(inner)).toBe(false);
755
+ });
756
+ it('returns true for infinite outer range containing any finite inner range', () => {
757
+ const inner = new DateTimeRange(timestamp(), timestamp().add(1, 'day'));
758
+ const outer = new DateTimeRange(timestamp.pastInfinity(), timestamp.futureInfinity());
759
+ expect(outer.containsRange(inner)).toBe(true);
760
+ });
761
+ it('returns true when inner range is a single point and outer contains that point', () => {
762
+ const now = timestamp();
763
+ const outer = new DateTimeRange(now.subtract(1, 'hour'), now.add(1, 'hour'));
764
+ const inner = new DateTimeRange(now, now.add(1, 'minute'));
765
+ expect(outer.containsRange(inner)).toBe(true);
766
+ });
767
+ it('returns false when ranges are adjacent but not overlapping', () => {
768
+ const now = timestamp();
769
+ const outer = new DateTimeRange(now, now.add(1, 'day'));
770
+ const inner = new DateTimeRange(now.add(1, 'day').add(1, 'ms'), now.add(2, 'day'));
771
+ expect(outer.containsRange(inner)).toBe(false);
772
+ });
773
+ });
774
+ });
775
+ //# sourceMappingURL=date-time-range.unit.test.js.map