chrono-node 2.9.0 → 2.9.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 (305) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/calculation/mergingCalculation.js +4 -1
  3. package/dist/cjs/calculation/mergingCalculation.js.map +1 -1
  4. package/dist/cjs/common/refiners/ForwardDateRefiner.js +8 -13
  5. package/dist/cjs/common/refiners/ForwardDateRefiner.js.map +1 -1
  6. package/dist/cjs/index.d.ts +3 -1
  7. package/dist/cjs/index.js +5 -1
  8. package/dist/cjs/index.js.map +1 -1
  9. package/dist/cjs/locales/de/parsers/DETimeUnitRelativeFormatParser.js +1 -1
  10. package/dist/cjs/locales/de/parsers/DETimeUnitRelativeFormatParser.js.map +1 -1
  11. package/dist/cjs/locales/en/constants.d.ts +1 -1
  12. package/dist/cjs/locales/en/constants.js +1 -1
  13. package/dist/cjs/locales/en/parsers/ENWeekdayParser.js +1 -1
  14. package/dist/cjs/locales/en/parsers/ENWeekdayParser.js.map +1 -1
  15. package/dist/cjs/locales/es/parsers/ESCasualTimeParser.js +5 -0
  16. package/dist/cjs/locales/es/parsers/ESCasualTimeParser.js.map +1 -1
  17. package/dist/cjs/locales/fi/constants.d.ts +24 -0
  18. package/dist/cjs/locales/fi/constants.js +197 -0
  19. package/dist/cjs/locales/fi/constants.js.map +1 -0
  20. package/dist/cjs/locales/fi/index.d.ts +11 -0
  21. package/dist/cjs/locales/fi/index.js +62 -0
  22. package/dist/cjs/locales/fi/index.js.map +1 -0
  23. package/dist/cjs/locales/fi/parsers/FICasualDateParser.d.ts +7 -0
  24. package/dist/cjs/locales/fi/parsers/FICasualDateParser.js +102 -0
  25. package/dist/cjs/locales/fi/parsers/FICasualDateParser.js.map +1 -0
  26. package/dist/cjs/locales/fi/parsers/FICasualTimeParser.d.ts +8 -0
  27. package/dist/cjs/locales/fi/parsers/FICasualTimeParser.js +70 -0
  28. package/dist/cjs/locales/fi/parsers/FICasualTimeParser.js.map +1 -0
  29. package/dist/cjs/locales/fi/parsers/FIMonthNameLittleEndianParser.d.ts +7 -0
  30. package/dist/cjs/locales/fi/parsers/FIMonthNameLittleEndianParser.js +48 -0
  31. package/dist/cjs/locales/fi/parsers/FIMonthNameLittleEndianParser.js.map +1 -0
  32. package/dist/cjs/locales/fi/parsers/FITimeExpressionParser.d.ts +8 -0
  33. package/dist/cjs/locales/fi/parsers/FITimeExpressionParser.js +19 -0
  34. package/dist/cjs/locales/fi/parsers/FITimeExpressionParser.js.map +1 -0
  35. package/dist/cjs/locales/fi/parsers/FITimeUnitAgoFormatParser.d.ts +7 -0
  36. package/dist/cjs/locales/fi/parsers/FITimeUnitAgoFormatParser.js +18 -0
  37. package/dist/cjs/locales/fi/parsers/FITimeUnitAgoFormatParser.js.map +1 -0
  38. package/dist/cjs/locales/fi/parsers/FITimeUnitCasualRelativeFormatParser.d.ts +9 -0
  39. package/dist/cjs/locales/fi/parsers/FITimeUnitCasualRelativeFormatParser.js +39 -0
  40. package/dist/cjs/locales/fi/parsers/FITimeUnitCasualRelativeFormatParser.js.map +1 -0
  41. package/dist/cjs/locales/fi/parsers/FITimeUnitWithinFormatParser.d.ts +7 -0
  42. package/dist/cjs/locales/fi/parsers/FITimeUnitWithinFormatParser.js +16 -0
  43. package/dist/cjs/locales/fi/parsers/FITimeUnitWithinFormatParser.js.map +1 -0
  44. package/dist/cjs/locales/fi/parsers/FIWeekdayParser.d.ts +7 -0
  45. package/dist/cjs/locales/fi/parsers/FIWeekdayParser.js +39 -0
  46. package/dist/cjs/locales/fi/parsers/FIWeekdayParser.js.map +1 -0
  47. package/dist/cjs/locales/fi/refiners/FIMergeDateRangeRefiner.d.ts +4 -0
  48. package/dist/cjs/locales/fi/refiners/FIMergeDateRangeRefiner.js +13 -0
  49. package/dist/cjs/locales/fi/refiners/FIMergeDateRangeRefiner.js.map +1 -0
  50. package/dist/cjs/locales/fi/refiners/FIMergeDateTimeRefiner.d.ts +4 -0
  51. package/dist/cjs/locales/fi/refiners/FIMergeDateTimeRefiner.js +13 -0
  52. package/dist/cjs/locales/fi/refiners/FIMergeDateTimeRefiner.js.map +1 -0
  53. package/dist/cjs/locales/it/parsers/ITTimeExpressionParser.js +1 -1
  54. package/dist/cjs/locales/it/parsers/ITTimeExpressionParser.js.map +1 -1
  55. package/dist/cjs/locales/nl/parsers/NLCasualTimeParser.js +5 -0
  56. package/dist/cjs/locales/nl/parsers/NLCasualTimeParser.js.map +1 -1
  57. package/dist/cjs/locales/pt/parsers/PTCasualTimeParser.js +5 -0
  58. package/dist/cjs/locales/pt/parsers/PTCasualTimeParser.js.map +1 -1
  59. package/dist/cjs/locales/vi/constants.d.ts +20 -0
  60. package/dist/cjs/locales/vi/constants.js +107 -0
  61. package/dist/cjs/locales/vi/constants.js.map +1 -0
  62. package/dist/cjs/locales/vi/index.d.ts +11 -0
  63. package/dist/cjs/locales/vi/index.js +73 -0
  64. package/dist/cjs/locales/vi/index.js.map +1 -0
  65. package/dist/cjs/locales/vi/parsers/VICasualDateParser.d.ts +7 -0
  66. package/dist/cjs/locales/vi/parsers/VICasualDateParser.js +63 -0
  67. package/dist/cjs/locales/vi/parsers/VICasualDateParser.js.map +1 -0
  68. package/dist/cjs/locales/vi/parsers/VICasualTimeParser.d.ts +8 -0
  69. package/dist/cjs/locales/vi/parsers/VICasualTimeParser.js +59 -0
  70. package/dist/cjs/locales/vi/parsers/VICasualTimeParser.js.map +1 -0
  71. package/dist/cjs/locales/vi/parsers/VIMonthYearParser.d.ts +7 -0
  72. package/dist/cjs/locales/vi/parsers/VIMonthYearParser.js +30 -0
  73. package/dist/cjs/locales/vi/parsers/VIMonthYearParser.js.map +1 -0
  74. package/dist/cjs/locales/vi/parsers/VIStandardParser.d.ts +7 -0
  75. package/dist/cjs/locales/vi/parsers/VIStandardParser.js +39 -0
  76. package/dist/cjs/locales/vi/parsers/VIStandardParser.js.map +1 -0
  77. package/dist/cjs/locales/vi/parsers/VITimeExpressionParser.d.ts +7 -0
  78. package/dist/cjs/locales/vi/parsers/VITimeExpressionParser.js +60 -0
  79. package/dist/cjs/locales/vi/parsers/VITimeExpressionParser.js.map +1 -0
  80. package/dist/cjs/locales/vi/parsers/VITimeUnitAgoFormatParser.d.ts +9 -0
  81. package/dist/cjs/locales/vi/parsers/VITimeUnitAgoFormatParser.js +24 -0
  82. package/dist/cjs/locales/vi/parsers/VITimeUnitAgoFormatParser.js.map +1 -0
  83. package/dist/cjs/locales/vi/parsers/VITimeUnitCasualRelativeFormatParser.d.ts +7 -0
  84. package/dist/cjs/locales/vi/parsers/VITimeUnitCasualRelativeFormatParser.js +37 -0
  85. package/dist/cjs/locales/vi/parsers/VITimeUnitCasualRelativeFormatParser.js.map +1 -0
  86. package/dist/cjs/locales/vi/parsers/VITimeUnitLaterFormatParser.d.ts +9 -0
  87. package/dist/cjs/locales/vi/parsers/VITimeUnitLaterFormatParser.js +23 -0
  88. package/dist/cjs/locales/vi/parsers/VITimeUnitLaterFormatParser.js.map +1 -0
  89. package/dist/cjs/locales/vi/parsers/VITimeUnitWithinFormatParser.d.ts +9 -0
  90. package/dist/cjs/locales/vi/parsers/VITimeUnitWithinFormatParser.js +23 -0
  91. package/dist/cjs/locales/vi/parsers/VITimeUnitWithinFormatParser.js.map +1 -0
  92. package/dist/cjs/locales/vi/parsers/VIWeekdayParser.d.ts +7 -0
  93. package/dist/cjs/locales/vi/parsers/VIWeekdayParser.js +36 -0
  94. package/dist/cjs/locales/vi/parsers/VIWeekdayParser.js.map +1 -0
  95. package/dist/cjs/locales/vi/parsers/VIYearParser.d.ts +7 -0
  96. package/dist/cjs/locales/vi/parsers/VIYearParser.js +29 -0
  97. package/dist/cjs/locales/vi/parsers/VIYearParser.js.map +1 -0
  98. package/dist/cjs/locales/vi/refiners/VIMergeDateRangeRefiner.d.ts +4 -0
  99. package/dist/cjs/locales/vi/refiners/VIMergeDateRangeRefiner.js +13 -0
  100. package/dist/cjs/locales/vi/refiners/VIMergeDateRangeRefiner.js.map +1 -0
  101. package/dist/cjs/locales/vi/refiners/VIMergeDateTimeRefiner.d.ts +4 -0
  102. package/dist/cjs/locales/vi/refiners/VIMergeDateTimeRefiner.js +13 -0
  103. package/dist/cjs/locales/vi/refiners/VIMergeDateTimeRefiner.js.map +1 -0
  104. package/dist/cjs/locales/vi/refiners/VIMergeWeekdayComponentRefiner.d.ts +3 -0
  105. package/dist/cjs/locales/vi/refiners/VIMergeWeekdayComponentRefiner.js +10 -0
  106. package/dist/cjs/locales/vi/refiners/VIMergeWeekdayComponentRefiner.js.map +1 -0
  107. package/dist/cjs/locales/zh/hans/parsers/ZHHansTimeExpressionParser.d.ts +1 -0
  108. package/dist/cjs/locales/zh/hans/parsers/ZHHansTimeExpressionParser.js +10 -4
  109. package/dist/cjs/locales/zh/hans/parsers/ZHHansTimeExpressionParser.js.map +1 -1
  110. package/dist/cjs/locales/zh/hant/parsers/ZHHantTimeExpressionParser.d.ts +1 -0
  111. package/dist/cjs/locales/zh/hant/parsers/ZHHantTimeExpressionParser.js +8 -2
  112. package/dist/cjs/locales/zh/hant/parsers/ZHHantTimeExpressionParser.js.map +1 -1
  113. package/dist/cjs/results.js +1 -1
  114. package/dist/cjs/results.js.map +1 -1
  115. package/dist/esm/calculation/mergingCalculation.js +4 -1
  116. package/dist/esm/calculation/mergingCalculation.js.map +1 -1
  117. package/dist/esm/common/refiners/ForwardDateRefiner.js +8 -13
  118. package/dist/esm/common/refiners/ForwardDateRefiner.js.map +1 -1
  119. package/dist/esm/index.d.ts +3 -1
  120. package/dist/esm/index.js +3 -1
  121. package/dist/esm/index.js.map +1 -1
  122. package/dist/esm/locales/de/parsers/DETimeUnitRelativeFormatParser.js +1 -1
  123. package/dist/esm/locales/de/parsers/DETimeUnitRelativeFormatParser.js.map +1 -1
  124. package/dist/esm/locales/en/constants.d.ts +1 -1
  125. package/dist/esm/locales/en/constants.js +1 -1
  126. package/dist/esm/locales/en/parsers/ENWeekdayParser.js +1 -1
  127. package/dist/esm/locales/en/parsers/ENWeekdayParser.js.map +1 -1
  128. package/dist/esm/locales/es/parsers/ESCasualTimeParser.js +5 -0
  129. package/dist/esm/locales/es/parsers/ESCasualTimeParser.js.map +1 -1
  130. package/dist/esm/locales/fi/constants.d.ts +24 -0
  131. package/dist/esm/locales/fi/constants.js +191 -0
  132. package/dist/esm/locales/fi/constants.js.map +1 -0
  133. package/dist/esm/locales/fi/index.d.ts +11 -0
  134. package/dist/esm/locales/fi/index.js +48 -0
  135. package/dist/esm/locales/fi/index.js.map +1 -0
  136. package/dist/esm/locales/fi/parsers/FICasualDateParser.d.ts +7 -0
  137. package/dist/esm/locales/fi/parsers/FICasualDateParser.js +63 -0
  138. package/dist/esm/locales/fi/parsers/FICasualDateParser.js.map +1 -0
  139. package/dist/esm/locales/fi/parsers/FICasualTimeParser.d.ts +8 -0
  140. package/dist/esm/locales/fi/parsers/FICasualTimeParser.js +67 -0
  141. package/dist/esm/locales/fi/parsers/FICasualTimeParser.js.map +1 -0
  142. package/dist/esm/locales/fi/parsers/FIMonthNameLittleEndianParser.d.ts +7 -0
  143. package/dist/esm/locales/fi/parsers/FIMonthNameLittleEndianParser.js +45 -0
  144. package/dist/esm/locales/fi/parsers/FIMonthNameLittleEndianParser.js.map +1 -0
  145. package/dist/esm/locales/fi/parsers/FITimeExpressionParser.d.ts +8 -0
  146. package/dist/esm/locales/fi/parsers/FITimeExpressionParser.js +16 -0
  147. package/dist/esm/locales/fi/parsers/FITimeExpressionParser.js.map +1 -0
  148. package/dist/esm/locales/fi/parsers/FITimeUnitAgoFormatParser.d.ts +7 -0
  149. package/dist/esm/locales/fi/parsers/FITimeUnitAgoFormatParser.js +15 -0
  150. package/dist/esm/locales/fi/parsers/FITimeUnitAgoFormatParser.js.map +1 -0
  151. package/dist/esm/locales/fi/parsers/FITimeUnitCasualRelativeFormatParser.d.ts +9 -0
  152. package/dist/esm/locales/fi/parsers/FITimeUnitCasualRelativeFormatParser.js +37 -0
  153. package/dist/esm/locales/fi/parsers/FITimeUnitCasualRelativeFormatParser.js.map +1 -0
  154. package/dist/esm/locales/fi/parsers/FITimeUnitWithinFormatParser.d.ts +7 -0
  155. package/dist/esm/locales/fi/parsers/FITimeUnitWithinFormatParser.js +13 -0
  156. package/dist/esm/locales/fi/parsers/FITimeUnitWithinFormatParser.js.map +1 -0
  157. package/dist/esm/locales/fi/parsers/FIWeekdayParser.d.ts +7 -0
  158. package/dist/esm/locales/fi/parsers/FIWeekdayParser.js +36 -0
  159. package/dist/esm/locales/fi/parsers/FIWeekdayParser.js.map +1 -0
  160. package/dist/esm/locales/fi/refiners/FIMergeDateRangeRefiner.d.ts +4 -0
  161. package/dist/esm/locales/fi/refiners/FIMergeDateRangeRefiner.js +7 -0
  162. package/dist/esm/locales/fi/refiners/FIMergeDateRangeRefiner.js.map +1 -0
  163. package/dist/esm/locales/fi/refiners/FIMergeDateTimeRefiner.d.ts +4 -0
  164. package/dist/esm/locales/fi/refiners/FIMergeDateTimeRefiner.js +7 -0
  165. package/dist/esm/locales/fi/refiners/FIMergeDateTimeRefiner.js.map +1 -0
  166. package/dist/esm/locales/it/parsers/ITTimeExpressionParser.js +1 -1
  167. package/dist/esm/locales/it/parsers/ITTimeExpressionParser.js.map +1 -1
  168. package/dist/esm/locales/nl/parsers/NLCasualTimeParser.js +5 -0
  169. package/dist/esm/locales/nl/parsers/NLCasualTimeParser.js.map +1 -1
  170. package/dist/esm/locales/pt/parsers/PTCasualTimeParser.js +5 -0
  171. package/dist/esm/locales/pt/parsers/PTCasualTimeParser.js.map +1 -1
  172. package/dist/esm/locales/vi/constants.d.ts +20 -0
  173. package/dist/esm/locales/vi/constants.js +101 -0
  174. package/dist/esm/locales/vi/constants.js.map +1 -0
  175. package/dist/esm/locales/vi/index.d.ts +11 -0
  176. package/dist/esm/locales/vi/index.js +59 -0
  177. package/dist/esm/locales/vi/index.js.map +1 -0
  178. package/dist/esm/locales/vi/parsers/VICasualDateParser.d.ts +7 -0
  179. package/dist/esm/locales/vi/parsers/VICasualDateParser.js +27 -0
  180. package/dist/esm/locales/vi/parsers/VICasualDateParser.js.map +1 -0
  181. package/dist/esm/locales/vi/parsers/VICasualTimeParser.d.ts +8 -0
  182. package/dist/esm/locales/vi/parsers/VICasualTimeParser.js +56 -0
  183. package/dist/esm/locales/vi/parsers/VICasualTimeParser.js.map +1 -0
  184. package/dist/esm/locales/vi/parsers/VIMonthYearParser.d.ts +7 -0
  185. package/dist/esm/locales/vi/parsers/VIMonthYearParser.js +27 -0
  186. package/dist/esm/locales/vi/parsers/VIMonthYearParser.js.map +1 -0
  187. package/dist/esm/locales/vi/parsers/VIStandardParser.d.ts +7 -0
  188. package/dist/esm/locales/vi/parsers/VIStandardParser.js +36 -0
  189. package/dist/esm/locales/vi/parsers/VIStandardParser.js.map +1 -0
  190. package/dist/esm/locales/vi/parsers/VITimeExpressionParser.d.ts +7 -0
  191. package/dist/esm/locales/vi/parsers/VITimeExpressionParser.js +56 -0
  192. package/dist/esm/locales/vi/parsers/VITimeExpressionParser.js.map +1 -0
  193. package/dist/esm/locales/vi/parsers/VITimeUnitAgoFormatParser.d.ts +9 -0
  194. package/dist/esm/locales/vi/parsers/VITimeUnitAgoFormatParser.js +22 -0
  195. package/dist/esm/locales/vi/parsers/VITimeUnitAgoFormatParser.js.map +1 -0
  196. package/dist/esm/locales/vi/parsers/VITimeUnitCasualRelativeFormatParser.d.ts +7 -0
  197. package/dist/esm/locales/vi/parsers/VITimeUnitCasualRelativeFormatParser.js +34 -0
  198. package/dist/esm/locales/vi/parsers/VITimeUnitCasualRelativeFormatParser.js.map +1 -0
  199. package/dist/esm/locales/vi/parsers/VITimeUnitLaterFormatParser.d.ts +9 -0
  200. package/dist/esm/locales/vi/parsers/VITimeUnitLaterFormatParser.js +21 -0
  201. package/dist/esm/locales/vi/parsers/VITimeUnitLaterFormatParser.js.map +1 -0
  202. package/dist/esm/locales/vi/parsers/VITimeUnitWithinFormatParser.d.ts +9 -0
  203. package/dist/esm/locales/vi/parsers/VITimeUnitWithinFormatParser.js +21 -0
  204. package/dist/esm/locales/vi/parsers/VITimeUnitWithinFormatParser.js.map +1 -0
  205. package/dist/esm/locales/vi/parsers/VIWeekdayParser.d.ts +7 -0
  206. package/dist/esm/locales/vi/parsers/VIWeekdayParser.js +33 -0
  207. package/dist/esm/locales/vi/parsers/VIWeekdayParser.js.map +1 -0
  208. package/dist/esm/locales/vi/parsers/VIYearParser.d.ts +7 -0
  209. package/dist/esm/locales/vi/parsers/VIYearParser.js +26 -0
  210. package/dist/esm/locales/vi/parsers/VIYearParser.js.map +1 -0
  211. package/dist/esm/locales/vi/refiners/VIMergeDateRangeRefiner.d.ts +4 -0
  212. package/dist/esm/locales/vi/refiners/VIMergeDateRangeRefiner.js +7 -0
  213. package/dist/esm/locales/vi/refiners/VIMergeDateRangeRefiner.js.map +1 -0
  214. package/dist/esm/locales/vi/refiners/VIMergeDateTimeRefiner.d.ts +4 -0
  215. package/dist/esm/locales/vi/refiners/VIMergeDateTimeRefiner.js +7 -0
  216. package/dist/esm/locales/vi/refiners/VIMergeDateTimeRefiner.js.map +1 -0
  217. package/dist/esm/locales/vi/refiners/VIMergeWeekdayComponentRefiner.d.ts +3 -0
  218. package/dist/esm/locales/vi/refiners/VIMergeWeekdayComponentRefiner.js +4 -0
  219. package/dist/esm/locales/vi/refiners/VIMergeWeekdayComponentRefiner.js.map +1 -0
  220. package/dist/esm/locales/zh/hans/parsers/ZHHansTimeExpressionParser.d.ts +1 -0
  221. package/dist/esm/locales/zh/hans/parsers/ZHHansTimeExpressionParser.js +10 -4
  222. package/dist/esm/locales/zh/hans/parsers/ZHHansTimeExpressionParser.js.map +1 -1
  223. package/dist/esm/locales/zh/hant/parsers/ZHHantTimeExpressionParser.d.ts +1 -0
  224. package/dist/esm/locales/zh/hant/parsers/ZHHantTimeExpressionParser.js +8 -2
  225. package/dist/esm/locales/zh/hant/parsers/ZHHantTimeExpressionParser.js.map +1 -1
  226. package/dist/esm/results.js +1 -1
  227. package/dist/esm/results.js.map +1 -1
  228. package/package.json +2 -2
  229. package/src/calculation/mergingCalculation.ts +7 -1
  230. package/src/common/refiners/ForwardDateRefiner.ts +8 -14
  231. package/src/index.ts +3 -1
  232. package/src/locales/de/parsers/DETimeUnitRelativeFormatParser.ts +1 -1
  233. package/src/locales/en/constants.ts +1 -1
  234. package/src/locales/en/parsers/ENWeekdayParser.ts +1 -1
  235. package/src/locales/es/parsers/ESCasualTimeParser.ts +5 -0
  236. package/src/locales/fi/constants.ts +209 -0
  237. package/src/locales/fi/index.ts +57 -0
  238. package/src/locales/fi/parsers/FICasualDateParser.ts +82 -0
  239. package/src/locales/fi/parsers/FICasualTimeParser.ts +78 -0
  240. package/src/locales/fi/parsers/FIMonthNameLittleEndianParser.ts +57 -0
  241. package/src/locales/fi/parsers/FITimeExpressionParser.ts +22 -0
  242. package/src/locales/fi/parsers/FITimeUnitAgoFormatParser.ts +18 -0
  243. package/src/locales/fi/parsers/FITimeUnitCasualRelativeFormatParser.ts +47 -0
  244. package/src/locales/fi/parsers/FITimeUnitWithinFormatParser.ts +15 -0
  245. package/src/locales/fi/parsers/FIWeekdayParser.ts +46 -0
  246. package/src/locales/fi/refiners/FIMergeDateRangeRefiner.ts +7 -0
  247. package/src/locales/fi/refiners/FIMergeDateTimeRefiner.ts +7 -0
  248. package/src/locales/it/parsers/ITTimeExpressionParser.ts +1 -1
  249. package/src/locales/nl/parsers/NLCasualTimeParser.ts +5 -0
  250. package/src/locales/pt/parsers/PTCasualTimeParser.ts +5 -0
  251. package/src/locales/vi/constants.ts +113 -0
  252. package/src/locales/vi/index.ts +73 -0
  253. package/src/locales/vi/parsers/VICasualDateParser.ts +31 -0
  254. package/src/locales/vi/parsers/VICasualTimeParser.ts +62 -0
  255. package/src/locales/vi/parsers/VIMonthYearParser.ts +35 -0
  256. package/src/locales/vi/parsers/VIStandardParser.ts +45 -0
  257. package/src/locales/vi/parsers/VITimeExpressionParser.ts +66 -0
  258. package/src/locales/vi/parsers/VITimeUnitAgoFormatParser.ts +23 -0
  259. package/src/locales/vi/parsers/VITimeUnitCasualRelativeFormatParser.ts +46 -0
  260. package/src/locales/vi/parsers/VITimeUnitLaterFormatParser.ts +25 -0
  261. package/src/locales/vi/parsers/VITimeUnitWithinFormatParser.ts +22 -0
  262. package/src/locales/vi/parsers/VIWeekdayParser.ts +41 -0
  263. package/src/locales/vi/parsers/VIYearParser.ts +31 -0
  264. package/src/locales/vi/refiners/VIMergeDateRangeRefiner.ts +7 -0
  265. package/src/locales/vi/refiners/VIMergeDateTimeRefiner.ts +7 -0
  266. package/src/locales/vi/refiners/VIMergeWeekdayComponentRefiner.ts +7 -0
  267. package/src/locales/zh/hans/parsers/ZHHansTimeExpressionParser.ts +15 -4
  268. package/src/locales/zh/hant/parsers/ZHHantTimeExpressionParser.ts +14 -2
  269. package/src/results.ts +1 -3
  270. package/test/de/de_time_units_casual_relative.test.ts +12 -0
  271. package/test/en/en_month_name_little_endian.test.ts +30 -0
  272. package/test/en/en_time_units_casual_relative.test.ts +11 -0
  273. package/test/en/en_weekday.test.ts +123 -0
  274. package/test/fi/fi_casual.test.ts +85 -0
  275. package/test/fi/fi_casual_time.test.ts +56 -0
  276. package/test/fi/fi_month_name_little_endian.test.ts +50 -0
  277. package/test/fi/fi_time_exp.test.ts +39 -0
  278. package/test/fi/fi_time_units_ago.test.ts +93 -0
  279. package/test/fi/fi_time_units_casual_relative.test.ts +117 -0
  280. package/test/fi/fi_time_units_within.test.ts +74 -0
  281. package/test/fi/fi_weekday.test.ts +90 -0
  282. package/test/it/it_month_name_middle_endian.test.ts +39 -0
  283. package/test/it/it_time_exp.test.ts +84 -0
  284. package/test/it/it_year_month_day.test.ts +41 -0
  285. package/test/result.test.ts +8 -0
  286. package/test/system.test.ts +4 -3
  287. package/test/system_timezone.test.ts +99 -0
  288. package/test/vi/vi_casual.test.ts +84 -0
  289. package/test/vi/vi_casual_time.test.ts +77 -0
  290. package/test/vi/vi_date_range.test.ts +61 -0
  291. package/test/vi/vi_forward_date.test.ts +45 -0
  292. package/test/vi/vi_month_year.test.ts +40 -0
  293. package/test/vi/vi_negative_cases.test.ts +60 -0
  294. package/test/vi/vi_slash.test.ts +36 -0
  295. package/test/vi/vi_standard.test.ts +86 -0
  296. package/test/vi/vi_strict.test.ts +67 -0
  297. package/test/vi/vi_time_exp.test.ts +99 -0
  298. package/test/vi/vi_time_units_ago.test.ts +56 -0
  299. package/test/vi/vi_time_units_casual_relative.test.ts +56 -0
  300. package/test/vi/vi_time_units_later.test.ts +43 -0
  301. package/test/vi/vi_time_units_within.test.ts +24 -0
  302. package/test/vi/vi_weekday.test.ts +77 -0
  303. package/test/vi/vi_year.test.ts +42 -0
  304. package/test/zh/hans/zh_hans_time_exp.test.ts +252 -6
  305. package/test/zh/hant/zh_hant_time_exp.test.ts +30 -0
@@ -0,0 +1,84 @@
1
+ import * as chrono from "../../src/";
2
+ import { testSingleCase } from "../test_util";
3
+
4
+ test("Test - h\u00f4m nay (today)", () => {
5
+ testSingleCase(chrono.vi, "Cu\u1ed9c h\u1ecdn h\u00f4m nay.", new Date(2012, 7, 10, 12), (r) => {
6
+ expect(r.index).toBe(9);
7
+ expect(r.text).toBe("h\u00f4m nay");
8
+ expect(r.start.get("year")).toBe(2012);
9
+ expect(r.start.get("month")).toBe(8);
10
+ expect(r.start.get("day")).toBe(10);
11
+ expect(r.start).toBeDate(new Date(2012, 7, 10, 12));
12
+ });
13
+ });
14
+
15
+ test("Test - h\u00f4m qua (yesterday)", () => {
16
+ testSingleCase(chrono.vi, "H\u1ed9i ngh\u1ecb h\u00f4m qua.", new Date(2012, 7, 10, 12), (r) => {
17
+ expect(r.index).toBe(9);
18
+ expect(r.text).toBe("h\u00f4m qua");
19
+ expect(r.start.get("year")).toBe(2012);
20
+ expect(r.start.get("month")).toBe(8);
21
+ expect(r.start.get("day")).toBe(9);
22
+ expect(r.start).toBeDate(new Date(2012, 7, 9, 12));
23
+ });
24
+
25
+ testSingleCase(chrono.vi, "h\u00f4m qua", new Date(2012, 7, 1, 12), (r) => {
26
+ expect(r.start.get("month")).toBe(7); // July — crosses month boundary
27
+ expect(r.start.get("day")).toBe(31);
28
+ });
29
+ });
30
+
31
+ test("Test - ng\u00e0y mai (tomorrow)", () => {
32
+ testSingleCase(chrono.vi, "L\u1ecbch ng\u00e0y mai.", new Date(2012, 7, 10, 12), (r) => {
33
+ expect(r.index).toBe(5);
34
+ expect(r.text).toBe("ng\u00e0y mai");
35
+ expect(r.start.get("day")).toBe(11);
36
+ expect(r.start.get("month")).toBe(8);
37
+ expect(r.start).toBeDate(new Date(2012, 7, 11, 12));
38
+ });
39
+
40
+ testSingleCase(chrono.vi, "ng\u00e0y mai", new Date(2012, 7, 31, 12), (r) => {
41
+ expect(r.start.get("month")).toBe(9); // Sept — crosses month boundary
42
+ expect(r.start.get("day")).toBe(1);
43
+ });
44
+ });
45
+
46
+ test("Test - ng\u00e0y kia (day after tomorrow)", () => {
47
+ testSingleCase(chrono.vi, "ng\u00e0y kia", new Date(2012, 7, 10, 12), (r) => {
48
+ expect(r.text).toBe("ng\u00e0y kia");
49
+ expect(r.start.get("day")).toBe(12);
50
+ });
51
+ });
52
+
53
+ test("Test - b\u00e2y gi\u1edd / l\u00fac n\u00e0y (now)", () => {
54
+ testSingleCase(chrono.vi, "b\u00e2y gi\u1edd", new Date(2012, 7, 10, 8, 9, 10, 11), (r) => {
55
+ expect(r.start.get("year")).toBe(2012);
56
+ expect(r.start.get("month")).toBe(8);
57
+ expect(r.start.get("day")).toBe(10);
58
+ expect(r.start.get("hour")).toBe(8);
59
+ expect(r.start.get("minute")).toBe(9);
60
+ expect(r.start.get("second")).toBe(10);
61
+ expect(r.start).toBeDate(new Date(2012, 7, 10, 8, 9, 10, 11));
62
+ });
63
+
64
+ testSingleCase(chrono.vi, "l\u00fac n\u00e0y", new Date(2012, 7, 10, 8, 9, 10, 11), (r) => {
65
+ expect(r.start.get("hour")).toBe(8);
66
+ });
67
+ });
68
+
69
+ test("Test - hôm kia (day before yesterday, -2)", () => {
70
+ testSingleCase(chrono.vi, "hôm kia", new Date(2012, 7, 10, 12), (r) => {
71
+ expect(r.start.get("year")).toBe(2012);
72
+ expect(r.start.get("month")).toBe(8);
73
+ expect(r.start.get("day")).toBe(8); // 10 - 2
74
+ });
75
+ });
76
+
77
+ test("Test - isCertain: casual date sets day/month/year certain, hour not", () => {
78
+ testSingleCase(chrono.vi, "hôm nay", new Date(2012, 7, 10, 12), (r) => {
79
+ expect(r.start.isCertain("day")).toBe(true);
80
+ expect(r.start.isCertain("month")).toBe(true);
81
+ expect(r.start.isCertain("year")).toBe(true);
82
+ expect(r.start.isCertain("hour")).toBe(false);
83
+ });
84
+ });
@@ -0,0 +1,77 @@
1
+ import * as chrono from "../../src/";
2
+ import { testSingleCase } from "../test_util";
3
+
4
+ const REF = new Date(2012, 7, 10, 12); // 2012-08-10 noon
5
+
6
+ test("Test - sáng (morning, AM)", () => {
7
+ // "buổi sáng" is a time-of-day modifier; test it with an explicit time expression
8
+ testSingleCase(chrono.vi, "7 giờ sáng", REF, (r) => {
9
+ expect(r.start.get("hour")).toBe(7);
10
+ expect(r.start.get("meridiem")).toBe(0); // AM
11
+ });
12
+ // standalone "sáng" sets implied hour=9, AM
13
+ testSingleCase(chrono.vi, "hôm nay buổi sáng", new Date(2012, 7, 10, 6), (r) => {
14
+ expect(r.start.get("hour")).toBe(9);
15
+ expect(r.start.get("meridiem")).toBe(0); // AM
16
+ });
17
+ });
18
+
19
+ test("Test - trưa (noon, PM)", () => {
20
+ testSingleCase(chrono.vi, "buổi trưa", REF, (r) => {
21
+ expect(r.start.get("hour")).toBe(12);
22
+ expect(r.start.get("meridiem")).toBe(1); // PM — noon is 12:00 PM
23
+ });
24
+ });
25
+
26
+ test("Test - chiều (afternoon, PM)", () => {
27
+ testSingleCase(chrono.vi, "buổi chiều", REF, (r) => {
28
+ expect(r.start.get("hour")).toBe(15);
29
+ expect(r.start.get("meridiem")).toBe(1); // PM
30
+ });
31
+ });
32
+
33
+ test("Test - tối (evening, PM)", () => {
34
+ testSingleCase(chrono.vi, "buổi tối", REF, (r) => {
35
+ expect(r.start.get("hour")).toBe(19);
36
+ expect(r.start.get("meridiem")).toBe(1); // PM
37
+ });
38
+ });
39
+
40
+ test("Test - đêm (late night, PM)", () => {
41
+ testSingleCase(chrono.vi, "buổi đêm", REF, (r) => {
42
+ expect(r.start.get("hour")).toBe(22);
43
+ expect(r.start.get("meridiem")).toBe(1); // PM
44
+ });
45
+
46
+ // Standalone "đêm" without "buổi" prefix — works after removing \b from pattern
47
+ testSingleCase(chrono.vi, "đêm", REF, (r) => {
48
+ expect(r.start.get("hour")).toBe(22);
49
+ expect(r.start.get("meridiem")).toBe(1); // PM
50
+ });
51
+ });
52
+
53
+ test("Test - nửa đêm (midnight, AM)", () => {
54
+ testSingleCase(chrono.vi, "nửa đêm", REF, (r) => {
55
+ expect(r.start.get("hour")).toBe(0);
56
+ expect(r.start.get("meridiem")).toBe(0); // AM
57
+ });
58
+ });
59
+
60
+ test("Test - bình minh / sáng sớm (dawn)", () => {
61
+ testSingleCase(chrono.vi, "bình minh", REF, (r) => {
62
+ expect(r.start.get("hour")).toBe(6);
63
+ expect(r.start.get("meridiem")).toBe(0); // AM
64
+ });
65
+
66
+ testSingleCase(chrono.vi, "sáng sớm", REF, (r) => {
67
+ expect(r.start.get("hour")).toBe(6);
68
+ expect(r.start.get("meridiem")).toBe(0); // AM
69
+ });
70
+ });
71
+
72
+ test("Test - time keyword merges with date", () => {
73
+ testSingleCase(chrono.vi, "hôm nay buổi chiều", REF, (r) => {
74
+ expect(r.start.get("day")).toBe(10);
75
+ expect(r.start.get("hour")).toBe(15);
76
+ });
77
+ });
@@ -0,0 +1,61 @@
1
+ import * as chrono from "../../src/";
2
+ import { testSingleCase } from "../test_util";
3
+
4
+ const REF = new Date(2012, 7, 10, 12); // 2012-08-10 noon
5
+
6
+ test("Test - từ ngày X đến ngày Y (đến connector)", () => {
7
+ testSingleCase(chrono.vi, "từ ngày 5 tháng 8 đến ngày 10 tháng 8 năm 2012", REF, (r) => {
8
+ expect(r.start.get("day")).toBe(5);
9
+ expect(r.start.get("month")).toBe(8);
10
+ expect(r.start.get("year")).toBe(2012);
11
+
12
+ expect(r.end).not.toBeNull();
13
+ expect(r.end.get("day")).toBe(10);
14
+ expect(r.end.get("month")).toBe(8);
15
+ expect(r.end.get("year")).toBe(2012);
16
+ });
17
+ });
18
+
19
+ test("Test - em dash separator (–)", () => {
20
+ testSingleCase(chrono.vi, "ngày 1 tháng 4 – ngày 30 tháng 4 năm 2000", REF, (r) => {
21
+ expect(r.start.get("day")).toBe(1);
22
+ expect(r.start.get("month")).toBe(4);
23
+
24
+ expect(r.end).not.toBeNull();
25
+ expect(r.end.get("day")).toBe(30);
26
+ expect(r.end.get("month")).toBe(4);
27
+ expect(r.end.get("year")).toBe(2000);
28
+ });
29
+ });
30
+
31
+ test("Test - hyphen separator (-)", () => {
32
+ testSingleCase(chrono.vi, "ngày 3 tháng 9 - ngày 5 tháng 9 năm 1945", REF, (r) => {
33
+ expect(r.start.get("day")).toBe(3);
34
+ expect(r.start.get("month")).toBe(9);
35
+ expect(r.start.get("year")).toBe(1945);
36
+
37
+ expect(r.end).not.toBeNull();
38
+ expect(r.end.get("day")).toBe(5);
39
+ expect(r.end.get("month")).toBe(9);
40
+ expect(r.end.get("year")).toBe(1945);
41
+ });
42
+ });
43
+
44
+ test("Test - tới connector", () => {
45
+ testSingleCase(chrono.vi, "tháng 3 tới tháng 5 năm 1975", REF, (r) => {
46
+ expect(r.start.get("month")).toBe(3);
47
+
48
+ expect(r.end).not.toBeNull();
49
+ expect(r.end.get("month")).toBe(5);
50
+ expect(r.end.get("year")).toBe(1975);
51
+ });
52
+ });
53
+
54
+ test("Test - start is before end", () => {
55
+ testSingleCase(chrono.vi, "ngày 1 tháng 1 đến ngày 31 tháng 12 năm 2020", REF, (r) => {
56
+ expect(r.end).not.toBeNull();
57
+ const startDate = r.start.date();
58
+ const endDate = r.end.date();
59
+ expect(startDate.getTime()).toBeLessThan(endDate.getTime());
60
+ });
61
+ });
@@ -0,0 +1,45 @@
1
+ import * as chrono from "../../src/";
2
+ import { testSingleCase } from "../test_util";
3
+
4
+ test("Test - forwardDate: time-only rolls to next day when ref is past", () => {
5
+ // "7 gi\u1edd s\u00e1ng" = 7:00 AM; ref is 8:00 AM same day \u2192 next day
6
+ testSingleCase(chrono.vi, "7 gi\u1edd s\u00e1ng", new Date(2012, 7, 10, 8, 0), { forwardDate: true }, (r) => {
7
+ expect(r.start.get("day")).toBe(11);
8
+ expect(r.start.get("hour")).toBe(7);
9
+ });
10
+ });
11
+
12
+ test("Test - forwardDate: weekday rolls to next occurrence", () => {
13
+ // REF = Tuesday Aug 14, 2012; "th\u1ee9 hai" (Monday) last was Aug 13 \u2192 next Monday = Aug 20
14
+ testSingleCase(chrono.vi, "th\u1ee9 hai", new Date(2012, 7, 14, 12), { forwardDate: true }, (r) => {
15
+ expect(r.start.get("weekday")).toBe(1);
16
+ expect(r.start.get("day")).toBe(20);
17
+ expect(r.start.get("month")).toBe(8);
18
+ });
19
+ });
20
+
21
+ test("Test - forwardDate: slash date without year rolls to next year", () => {
22
+ // "15/3" = March 15; ref is Aug 10 (past March) \u2192 year 2013
23
+ testSingleCase(chrono.vi, "15/3", new Date(2012, 7, 10, 12), { forwardDate: true }, (r) => {
24
+ expect(r.start.get("day")).toBe(15);
25
+ expect(r.start.get("month")).toBe(3);
26
+ expect(r.start.get("year")).toBe(2013);
27
+ });
28
+ });
29
+
30
+ test("Test - forwardDate: same weekday as ref stays on same day", () => {
31
+ // REF = Thursday Aug 9, 2012; "thứ năm" (Thursday) = same day → stays on Aug 9 (not past)
32
+ testSingleCase(chrono.vi, "th\u1ee9 n\u0103m", new Date(2012, 7, 9, 12), { forwardDate: true }, (r) => {
33
+ expect(r.start.get("weekday")).toBe(4);
34
+ expect(r.start.get("day")).toBe(9);
35
+ expect(r.start.get("month")).toBe(8);
36
+ });
37
+ });
38
+
39
+ test("Test - forwardDate: month without year rolls to next year", () => {
40
+ // "th\u00e1ng 3" = March; ref is Aug 10 \u2192 next March = 2013
41
+ testSingleCase(chrono.vi, "th\u00e1ng 3", new Date(2012, 7, 10, 12), { forwardDate: true }, (r) => {
42
+ expect(r.start.get("month")).toBe(3);
43
+ expect(r.start.get("year")).toBe(2013);
44
+ });
45
+ });
@@ -0,0 +1,40 @@
1
+ import * as chrono from "../../src/";
2
+ import { testSingleCase, testUnexpectedResult } from "../test_util";
3
+
4
+ const REF = new Date(2012, 7, 10, 12); // 2012-08-10
5
+
6
+ test("Test - tháng M năm YYYY", () => {
7
+ testSingleCase(chrono.vi, "tháng 4 năm 1975", REF, (r) => {
8
+ expect(r.text).toBe("tháng 4 năm 1975");
9
+ expect(r.start.get("month")).toBe(4);
10
+ expect(r.start.get("year")).toBe(1975);
11
+ expect(r.start.isCertain("month")).toBe(true);
12
+ expect(r.start.isCertain("year")).toBe(true);
13
+ expect(r.start.isCertain("day")).toBe(false); // day is implied
14
+ });
15
+
16
+ testSingleCase(chrono.vi, "tháng 1 năm 1863", REF, (r) => {
17
+ expect(r.start.get("month")).toBe(1);
18
+ expect(r.start.get("year")).toBe(1863);
19
+ });
20
+ });
21
+
22
+ test("Test - tháng M/YYYY (slash separator)", () => {
23
+ testSingleCase(chrono.vi, "tháng 3/1975", REF, (r) => {
24
+ expect(r.start.get("month")).toBe(3);
25
+ expect(r.start.get("year")).toBe(1975);
26
+ });
27
+ });
28
+
29
+ test("Test - tháng M only (implies current year)", () => {
30
+ testSingleCase(chrono.vi, "tháng 3", REF, (r) => {
31
+ expect(r.start.get("month")).toBe(3);
32
+ expect(r.start.isCertain("year")).toBe(false); // year implied from reference
33
+ expect(r.start.get("year")).toBe(2012);
34
+ });
35
+ });
36
+
37
+ test("Test - negative: month > 12 rejected", () => {
38
+ testUnexpectedResult(chrono.vi, "tháng 13", REF);
39
+ testUnexpectedResult(chrono.vi, "tháng 0", REF);
40
+ });
@@ -0,0 +1,60 @@
1
+ import * as chrono from "../../src/";
2
+ import { testUnexpectedResult } from "../test_util";
3
+
4
+ const REF = new Date(2012, 7, 10, 12); // 2012-08-10
5
+
6
+ test("Test - invalid day rejected", () => {
7
+ testUnexpectedResult(chrono.vi, "ngày 0 tháng 4 năm 2000", REF);
8
+ // "ngày 32 tháng 4" — VIStandardParser skips "ngày 3" and sub-matches "2 tháng 4"
9
+ // (day bounds are not pre-validated in the regex). This is known parser behaviour.
10
+ });
11
+
12
+ test("Test - invalid month rejected", () => {
13
+ testUnexpectedResult(chrono.vi, "tháng 0", REF);
14
+ testUnexpectedResult(chrono.vi, "tháng 13", REF);
15
+ testUnexpectedResult(chrono.vi, "ngày 1 tháng 13", REF);
16
+ });
17
+
18
+ test("Test - invalid slash date rejected", () => {
19
+ testUnexpectedResult(chrono.vi, "32/13/2020", REF);
20
+ });
21
+
22
+ test("Test - bare 4-digit number without năm prefix is not a year", () => {
23
+ testUnexpectedResult(chrono.vi, "Có 1975 người tham gia.", REF);
24
+ });
25
+
26
+ test("Test - phone number not parsed as date", () => {
27
+ testUnexpectedResult(chrono.vi, "0912345678", REF);
28
+ });
29
+
30
+ test("Test - bare numbers not parsed as dates", () => {
31
+ testUnexpectedResult(chrono.vi, "3", REF);
32
+ testUnexpectedResult(chrono.vi, "11", REF);
33
+ testUnexpectedResult(chrono.vi, "0.5", REF);
34
+ testUnexpectedResult(chrono.vi, "35.49", REF);
35
+ testUnexpectedResult(chrono.vi, "12.53%", REF);
36
+ });
37
+
38
+ test("Test - currency and measurement not parsed as dates", () => {
39
+ testUnexpectedResult(chrono.vi, "$1,194.09", REF);
40
+ testUnexpectedResult(chrono.vi, "at 6.5 kilograms", REF);
41
+ });
42
+
43
+ test("Test - version numbers not parsed as dates", () => {
44
+ testUnexpectedResult(chrono.vi, "1.1.3", REF);
45
+ testUnexpectedResult(chrono.vi, "1.10.30", REF);
46
+ });
47
+
48
+ test("Test - hyphenated number ranges not parsed as dates", () => {
49
+ testUnexpectedResult(chrono.vi, "1-2", REF);
50
+ testUnexpectedResult(chrono.vi, "1-2-3", REF);
51
+ });
52
+
53
+ test("Test - URL-encoded strings not parsed as dates", () => {
54
+ testUnexpectedResult(chrono.vi, "%e7%b7%8a", REF);
55
+ });
56
+
57
+ test("Test - impossible minute rejected", () => {
58
+ testUnexpectedResult(chrono.vi, "7 giờ 61 phút", REF);
59
+ testUnexpectedResult(chrono.vi, "7 giờ 99 phút", REF);
60
+ });
@@ -0,0 +1,36 @@
1
+ import * as chrono from "../../src/";
2
+ import { testSingleCase } from "../test_util";
3
+
4
+ const REF = new Date(2012, 7, 10, 12);
5
+
6
+ test("Test - DD/MM/YYYY (little-endian)", () => {
7
+ testSingleCase(chrono.vi, "Ng\u00e0y 30/04/1975.", REF, (r) => {
8
+ expect(r.index).toBe(5);
9
+ expect(r.start.get("day")).toBe(30);
10
+ expect(r.start.get("month")).toBe(4);
11
+ expect(r.start.get("year")).toBe(1975);
12
+ });
13
+
14
+ testSingleCase(chrono.vi, "H\u1ed9i ngh\u1ecb 01/01/1954", REF, (r) => {
15
+ expect(r.index).toBe(9);
16
+ expect(r.start.get("day")).toBe(1);
17
+ expect(r.start.get("month")).toBe(1);
18
+ expect(r.start.get("year")).toBe(1954);
19
+ });
20
+ });
21
+
22
+ test("Test - D/M/YYYY (no zero padding)", () => {
23
+ testSingleCase(chrono.vi, "3/5/1968", REF, (r) => {
24
+ expect(r.start.get("day")).toBe(3);
25
+ expect(r.start.get("month")).toBe(5);
26
+ expect(r.start.get("year")).toBe(1968);
27
+ });
28
+ });
29
+
30
+ test("Test - ISO 2024-03-15 also parses", () => {
31
+ testSingleCase(chrono.vi, "Ng\u00e0y 2024-03-15 l\u00e0 quan tr\u1ecdng.", REF, (r) => {
32
+ expect(r.start.get("year")).toBe(2024);
33
+ expect(r.start.get("month")).toBe(3);
34
+ expect(r.start.get("day")).toBe(15);
35
+ });
36
+ });
@@ -0,0 +1,86 @@
1
+ import * as chrono from "../../src/";
2
+ import { testSingleCase, testUnexpectedResult } from "../test_util";
3
+
4
+ const REF = new Date(2012, 7, 10, 12, 0, 0); // 2012-08-10
5
+
6
+ test("Test - ng\u00e0y D th\u00e1ng M n\u0103m YYYY (full with ng\u00e0y prefix)", () => {
7
+ testSingleCase(
8
+ chrono.vi,
9
+ "Ng\u00e0y 30 th\u00e1ng 4 n\u0103m 1975 l\u00e0 ng\u00e0y gi\u1ea3i ph\u00f3ng.",
10
+ REF,
11
+ (r) => {
12
+ expect(r.start.get("year")).toBe(1975);
13
+ expect(r.start.get("month")).toBe(4);
14
+ expect(r.start.get("day")).toBe(30);
15
+ expect(r.start.isCertain("year")).toBe(true);
16
+ expect(r.start.isCertain("month")).toBe(true);
17
+ expect(r.start.isCertain("day")).toBe(true);
18
+ }
19
+ );
20
+
21
+ testSingleCase(
22
+ chrono.vi,
23
+ "Hi\u1ec7p \u0111\u1ecbnh \u0111\u01b0\u1ee3c k\u00fd ng\u00e0y 27 th\u00e1ng 1 n\u0103m 1973.",
24
+ REF,
25
+ (r) => {
26
+ expect(r.text).toBe("ng\u00e0y 27 th\u00e1ng 1 n\u0103m 1973");
27
+ expect(r.start.get("year")).toBe(1973);
28
+ expect(r.start.get("month")).toBe(1);
29
+ expect(r.start.get("day")).toBe(27);
30
+ }
31
+ );
32
+
33
+ testSingleCase(chrono.vi, "ng\u00e0y 2 th\u00e1ng 9 n\u0103m 1945", REF, (r) => {
34
+ expect(r.start.get("year")).toBe(1945);
35
+ expect(r.start.get("month")).toBe(9);
36
+ expect(r.start.get("day")).toBe(2);
37
+ });
38
+ });
39
+
40
+ test("Test - D th\u00e1ng M n\u0103m YYYY (no ng\u00e0y prefix)", () => {
41
+ testSingleCase(
42
+ chrono.vi,
43
+ "7 th\u00e1ng 5 n\u0103m 1954 l\u00e0 ng\u00e0y ch\u1ea5m d\u1ee9t tr\u1eadn \u0110i\u1ec7n Bi\u00ean Ph\u1ee7.",
44
+ REF,
45
+ (r) => {
46
+ expect(r.start.get("day")).toBe(7);
47
+ expect(r.start.get("month")).toBe(5);
48
+ expect(r.start.get("year")).toBe(1954);
49
+ }
50
+ );
51
+
52
+ testSingleCase(chrono.vi, "1 th\u00e1ng 1 n\u0103m 1863", REF, (r) => {
53
+ expect(r.start.get("day")).toBe(1);
54
+ expect(r.start.get("month")).toBe(1);
55
+ expect(r.start.get("year")).toBe(1863);
56
+ });
57
+ });
58
+
59
+ test("Test - Date without year implies closest year", () => {
60
+ testSingleCase(chrono.vi, "ng\u00e0y 15 th\u00e1ng 3", REF, (r) => {
61
+ expect(r.start.get("day")).toBe(15);
62
+ expect(r.start.get("month")).toBe(3);
63
+ expect(r.start.isCertain("year")).toBe(false);
64
+ expect(r.start.isCertain("day")).toBe(true);
65
+ expect(r.start.isCertain("month")).toBe(true);
66
+ });
67
+ });
68
+
69
+ test("Test - index position is correct", () => {
70
+ testSingleCase(
71
+ chrono.vi,
72
+ "S\u1ef1 ki\u1ec7n ng\u00e0y 30 th\u00e1ng 4 n\u0103m 1975 quan tr\u1ecdng.",
73
+ REF,
74
+ (r) => {
75
+ expect(r.index).toBe(8);
76
+ expect(r.text).toBe("ng\u00e0y 30 th\u00e1ng 4 n\u0103m 1975");
77
+ expect(r.start.get("year")).toBe(1975);
78
+ }
79
+ );
80
+ });
81
+
82
+ test("Test - negative: invalid month rejected", () => {
83
+ // tháng 13 is rejected; without a year, no other parser fires
84
+ testUnexpectedResult(chrono.vi, "ngày 1 tháng 13", REF);
85
+ // "ngày 32 tháng 4" partially matches as "2 tháng 4" — day bounds enforced by VIStandardParser (day > 31)
86
+ });
@@ -0,0 +1,67 @@
1
+ import * as chrono from "../../src/";
2
+ import { testSingleCase, testUnexpectedResult } from "../test_util";
3
+
4
+ const REF = new Date(2012, 7, 10, 12); // 2012-08-10
5
+
6
+ test("Test - Strict rejects casual date expressions", () => {
7
+ testUnexpectedResult(chrono.vi.strict, "h\u00f4m nay", REF);
8
+ testUnexpectedResult(chrono.vi.strict, "h\u00f4m qua", REF);
9
+ testUnexpectedResult(chrono.vi.strict, "ng\u00e0y mai", REF);
10
+ testUnexpectedResult(chrono.vi.strict, "ng\u00e0y kia", REF);
11
+ });
12
+
13
+ test("Test - Strict rejects casual time-of-day expressions", () => {
14
+ testUnexpectedResult(chrono.vi.strict, "bu\u1ed5i s\u00e1ng", REF);
15
+ testUnexpectedResult(chrono.vi.strict, "bu\u1ed5i tr\u01b0a", REF);
16
+ testUnexpectedResult(chrono.vi.strict, "bu\u1ed5i chi\u1ec1u", REF);
17
+ testUnexpectedResult(chrono.vi.strict, "bu\u1ed5i t\u1ed1i", REF);
18
+ });
19
+
20
+ test("Test - Strict rejects casual relative expressions", () => {
21
+ testUnexpectedResult(chrono.vi.strict, "tu\u1ea7n n\u00e0y", REF);
22
+ testUnexpectedResult(chrono.vi.strict, "th\u00e1ng tr\u01b0\u1edbc", REF);
23
+ testUnexpectedResult(chrono.vi.strict, "n\u0103m sau", REF);
24
+ });
25
+
26
+ test("Test - Strict rejects weekday-only expressions", () => {
27
+ testUnexpectedResult(chrono.vi.strict, "th\u1ee9 hai", REF);
28
+ testUnexpectedResult(chrono.vi.strict, "ch\u1ee7 nh\u1eadt", REF);
29
+ });
30
+
31
+ test("Test - Strict accepts standard full dates and times", () => {
32
+ testSingleCase(chrono.vi.strict, "ng\u00e0y 30 th\u00e1ng 4 n\u0103m 1975", REF, (r) => {
33
+ expect(r.start.get("year")).toBe(1975);
34
+ expect(r.start.get("month")).toBe(4);
35
+ expect(r.start.get("day")).toBe(30);
36
+ });
37
+
38
+ testSingleCase(chrono.vi.strict, "l\u00fac 7 gi\u1edd 30 ph\u00fat", REF, (r) => {
39
+ expect(r.start.get("hour")).toBe(7);
40
+ expect(r.start.get("minute")).toBe(30);
41
+ });
42
+ });
43
+
44
+ test("Test - Strict accepts slash dates", () => {
45
+ testSingleCase(chrono.vi.strict, "30/4/1975", REF, (r) => {
46
+ expect(r.start.get("day")).toBe(30);
47
+ expect(r.start.get("month")).toBe(4);
48
+ expect(r.start.get("year")).toBe(1975);
49
+ });
50
+
51
+ testSingleCase(chrono.vi.strict, "15/3", REF, (r) => {
52
+ expect(r.start.get("day")).toBe(15);
53
+ expect(r.start.get("month")).toBe(3);
54
+ });
55
+ });
56
+
57
+ test("Test - Strict accepts explicit time unit expressions", () => {
58
+ testSingleCase(chrono.vi.strict, "3 ng\u00e0y tr\u01b0\u1edbc", REF, (r) => {
59
+ expect(r.start.get("day")).toBe(7);
60
+ expect(r.start.get("month")).toBe(8);
61
+ });
62
+
63
+ testSingleCase(chrono.vi.strict, "2 tu\u1ea7n sau", REF, (r) => {
64
+ expect(r.start.get("day")).toBe(24);
65
+ expect(r.start.get("month")).toBe(8);
66
+ });
67
+ });
@@ -0,0 +1,99 @@
1
+ import * as chrono from "../../src/";
2
+ import { testSingleCase } from "../test_util";
3
+
4
+ const REF = new Date(2012, 7, 10, 12);
5
+
6
+ test("Test - X gi\u1edd", () => {
7
+ testSingleCase(chrono.vi, "Cu\u1ed9c h\u1ecdn l\u00fac 7 gi\u1edd.", REF, (r) => {
8
+ expect(r.index).toBe(9);
9
+ expect(r.text).toBe("l\u00fac 7 gi\u1edd");
10
+ expect(r.start.get("hour")).toBe(7);
11
+ expect(r.start.get("minute")).toBe(0);
12
+ });
13
+
14
+ testSingleCase(chrono.vi, "7 gi\u1edd s\u00e1ng", REF, (r) => {
15
+ expect(r.start.get("hour")).toBe(7);
16
+ expect(r.start.get("meridiem")).toBe(0); // AM
17
+ });
18
+
19
+ testSingleCase(chrono.vi, "7 gi\u1edd t\u1ed1i", REF, (r) => {
20
+ expect(r.start.get("hour")).toBe(19);
21
+ });
22
+ });
23
+
24
+ test("Test - X gi\u1edd Y ph\u00fat", () => {
25
+ testSingleCase(chrono.vi, "l\u00fac 7 gi\u1edd 30 ph\u00fat", REF, (r) => {
26
+ expect(r.start.get("hour")).toBe(7);
27
+ expect(r.start.get("minute")).toBe(30);
28
+ });
29
+
30
+ testSingleCase(chrono.vi, "v\u00e0o 15 gi\u1edd 45 ph\u00fat", REF, (r) => {
31
+ expect(r.start.get("hour")).toBe(15);
32
+ expect(r.start.get("minute")).toBe(45);
33
+ });
34
+ });
35
+
36
+ test("Test - colon format HH:MM", () => {
37
+ testSingleCase(chrono.vi, "H\u1ecdn l\u00fac 15:30.", REF, (r) => {
38
+ expect(r.start.get("hour")).toBe(15);
39
+ expect(r.start.get("minute")).toBe(30);
40
+ });
41
+ });
42
+
43
+ test("Test - date + time combined", () => {
44
+ testSingleCase(chrono.vi, "ng\u00e0y 30 th\u00e1ng 4 n\u0103m 1975 l\u00fac 11 gi\u1edd", REF, (r) => {
45
+ expect(r.start.get("day")).toBe(30);
46
+ expect(r.start.get("month")).toBe(4);
47
+ expect(r.start.get("year")).toBe(1975);
48
+ expect(r.start.get("hour")).toBe(11);
49
+ });
50
+ });
51
+
52
+ test("Test - meridiem: s\u00e1ng/chi\u1ec1u/t\u1ed1i/\u0111\u00eam", () => {
53
+ testSingleCase(chrono.vi, "9 gi\u1edd s\u00e1ng", REF, (r) => {
54
+ expect(r.start.get("hour")).toBe(9);
55
+ expect(r.start.get("meridiem")).toBe(0); // AM
56
+ });
57
+ testSingleCase(chrono.vi, "3 gi\u1edd chi\u1ec1u", REF, (r) => {
58
+ expect(r.start.get("hour")).toBe(15);
59
+ });
60
+ testSingleCase(chrono.vi, "10 gi\u1edd \u0111\u00eam", REF, (r) => {
61
+ expect(r.start.get("hour")).toBe(22);
62
+ });
63
+ });
64
+
65
+ test("Test - trưa meridiem: X giờ trưa → PM (hour + 12)", () => {
66
+ // trưa = noon/midday — times expressed with trưa are PM
67
+ testSingleCase(chrono.vi, "1 giờ trưa", REF, (r) => {
68
+ expect(r.start.get("hour")).toBe(13);
69
+ expect(r.start.get("meridiem")).toBe(1); // PM
70
+ });
71
+ testSingleCase(chrono.vi, "11 giờ trưa", REF, (r) => {
72
+ expect(r.start.get("hour")).toBe(11);
73
+ expect(r.start.get("meridiem")).toBe(0); // AM — 11 giờ trưa = approaching noon
74
+ });
75
+ // 12 giờ trưa = noon, no offset applied (12 < 12 is false)
76
+ testSingleCase(chrono.vi, "12 giờ trưa", REF, (r) => {
77
+ expect(r.start.get("hour")).toBe(12);
78
+ expect(r.start.get("meridiem")).toBe(1); // PM
79
+ });
80
+ });
81
+
82
+ test("Test - 12 giờ sáng = midnight (00:00)", () => {
83
+ testSingleCase(chrono.vi, "12 giờ sáng", REF, (r) => {
84
+ expect(r.start.get("hour")).toBe(0);
85
+ expect(r.start.get("meridiem")).toBe(0); // AM
86
+ });
87
+ });
88
+
89
+ test("Test - isCertain: hour and meridiem certainty", () => {
90
+ testSingleCase(chrono.vi, "lúc 7 giờ", REF, (r) => {
91
+ expect(r.start.isCertain("hour")).toBe(true);
92
+ expect(r.start.isCertain("meridiem")).toBe(false);
93
+ });
94
+
95
+ testSingleCase(chrono.vi, "7 giờ sáng", REF, (r) => {
96
+ expect(r.start.isCertain("hour")).toBe(true);
97
+ expect(r.start.isCertain("meridiem")).toBe(true);
98
+ });
99
+ });